Khóa học
vLLM (Virtual Large Language Model) là một thư viện được thiết kế để lưu trữ các mô hình ngôn ngữ lớn (LLM). Thư viện này cung cấp môi trường tối ưu để xử lý các tác vụ ngôn ngữ ở quy mô lớn.
Có nhiều lý do để chúng ta tự lưu trữ LLM. Lưu trữ mô hình cục bộ hoặc trên nền tảng đám mây cho phép kiểm soát quyền riêng tư dữ liệu, khả năng tùy chỉnh mô hình phù hợp hơn với nhu cầu cụ thể, và tùy ứng dụng mà còn có thể tiết kiệm chi phí.
Ngoài ra, vLLM tương thích với OpenAI API. Nhờ vậy, nếu bạn có sẵn mã nguồn tích hợp với hạ tầng của OpenAI, bạn có thể thay thế bằng LLM tự lưu trữ qua vLLM mà không cần chỉnh sửa codebase hiện có.
Trong bài viết này, tôi sẽ hướng dẫn bạn các bước thiết lập vLLM. Chúng ta sẽ bắt đầu bằng cách chạy trên máy tính cá nhân bằng Docker, công cụ đóng gói phổ biến giúp chạy ứng dụng nhất quán trên nhiều môi trường. Sau đó, chúng ta sẽ học cách triển khai vLLM trên Google Cloud để có một giải pháp linh hoạt, sẵn sàng xử lý tác vụ lớn hoặc lưu lượng truy cập cao.
Cách thiết lập vLLM chạy cục bộ trên CPU với Docker
vLLM đơn giản hóa việc chạy LLM với một thiết lập hiệu quả tối ưu cho nền tảng CUDA, thường sử dụng GPU NVIDIA để tăng tốc. Tuy nhiên, nếu bạn muốn chạy mô hình trên CPU, có thể dùng Docker image mà vLLM cung cấp riêng cho CPU. Tính linh hoạt này cho phép lưu trữ mô hình ngay cả khi bạn không có môi trường hỗ trợ CUDA. Để lưu trữ vLLM trên nền tảng CUDA, hãy tham khảo hướng dẫn nhanh của họ.
Vì đa số chúng ta không có GPU cao cấp, bài viết sẽ tập trung vào thiết lập vLLM chạy trên CPU. Như vậy, bạn vẫn có thể thử nghiệm với LLM bằng chính tài nguyên sẵn có.
Để đơn giản hóa quy trình, chúng ta sẽ dùng Docker, công cụ cho phép đóng gói ứng dụng và phụ thuộc vào các container. Hãy hình dung container như một đơn vị gọn nhẹ, di động, chứa mọi thứ cần thiết để chạy phần mềm. Nhờ Docker, bạn không cần tự tay cài vLLM hay xử lý các vấn đề tương thích trên hệ thống.
vLLM cung cấp sẵn Docker image dành cho CPU. Image này chứa mọi thành phần cần thiết để chạy vLLM, giúp bạn tập trung vào việc sử dụng mô hình thay vì loay hoay thiết lập. Nhờ đó, bạn có thể nhanh chóng và hiệu quả khởi chạy LLM trên CPU.
Bước 1: Build Docker image
Trước tiên, chúng ta cần build một Docker image để chạy vLLM trên máy. Kho vLLM cung cấp các Dockerfile với đầy đủ hướng dẫn để build image chạy vLLM trên CPU.
Dockerfile.cpucho CPU thông thường.Dockerfile.armcho CPU ARM như trên các dòng Mac hiện đại.
Vì tôi dùng Mac với chip M2, tôi sẽ dùng file .arm. Để build image, trước hết hãy clone hoặc tải kho mã và chạy lệnh này trong thư mục của kho:
docker build -f Dockerfile.arm -t vllm-cpu --shm-size=4g .
Phân tích nhanh lệnh trên:
docker build: Tạo Docker image từ Dockerfile.-f Dockerfile.arm: Chỉ định Dockerfile sử dụng.-t vllm-cpu: Gắn thẻ image làvllm-cpuđể tiện tham chiếu (có thể đặt tên khác).--shm-size=4g: Cấp 4 GB bộ nhớ chia sẻ, giúp cải thiện hiệu năng.
Bước 2: Thiết lập Hugging Face
vLLM sử dụng Hugging Face, một nền tảng hỗ trợ quản lý mô hình, để đơn giản hóa việc lưu trữ mô hình. Cách bắt đầu như sau:
- Tạo tài khoản Hugging Face: Truy cập trang web Hugging Face và đăng ký nếu bạn chưa có tài khoản.
- Yêu cầu quyền truy cập mô hình: Sau khi đăng nhập, tìm mô hình bạn muốn dùng. Cho phần minh họa này, tôi gợi ý
meta-llama/Llama-3.2-1B-Instructvì đây là mô hình nhỏ, phù hợp cho thử nghiệm ban đầu. Trên trang mô hình có thể có tùy chọn yêu cầu quyền truy cập. Hãy làm theo hướng dẫn để được cấp quyền. - Tạo token: Truy cập trang API token của Hugging Face. Nhấn "Create New Token" để tạo token. Token này sẽ cần thiết để truy cập và tải mô hình.
Bước 3: Chạy Docker container
Khi đã build xong Docker image và có token Hugging Face, bạn có thể chạy mô hình vLLM bằng lệnh sau:
docker run -it --rm -p 8000:8000 \
--env "HUGGING_FACE_HUB_TOKEN=<replace_with_hf_token>" \
vllm-cpu --model meta-llama/Llama-3.2-1B-Instruct \
--dtype float16
Giải thích lệnh:
docker run: Chạy một container từ image đã chỉ định.-it: Chạy tương tác với quyền truy cập terminal.--rm: Tự động xóa container khi dừng.-p 8000:8000: Ánh xạ cổng8000của container ra cổng8000trên máy, giúp truy cập dịch vụ cục bộ.--env "HUGGING_FACE_HUB_TOKEN=<replace_with_hf_token>": Thiết lập token Hugging Face như biến môi trường, cho phép vLLM kết nối API của Hugging Face. Thay <replace_with_hf_token> bằng token bạn đã tạo.vllm-cpu: Tên Docker image đã build trước đó.--model meta-llama/Llama-3.2-1B-Instruct: Chỉ định mô hình sẽ chạy.--dtype float16: Dùng kiểu dữ liệufloat16vì mô hình yêu cầu khi chạy trên CPU.
Khi chạy lệnh này, máy chủ sẽ mất một lúc để sẵn sàng do cần tải LLM. Máy chủ sẵn sàng khi bạn thấy thông báo tương tự sau trong terminal:
INFO: Started server process [1]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
Tương tác với LLM
Một điểm mạnh của vLLM là khả năng tương thích với OpenAI API. Nghĩa là nếu bạn có sẵn mã tương tác với hạ tầng của OpenAI, bạn có thể dùng nguyên mã đó để giao tiếp với mô hình lưu trữ qua vLLM.
Tính tương thích này giúp chuyển đổi mượt mà mà không cần chỉnh sửa codebase hiện có. Khi thiết lập vLLM, bạn có thể tiếp tục dùng các công cụ và lệnh quen thuộc để tương tác với LLM, giúp quá trình tích hợp hiệu quả và thân thiện.
Ví dụ cách gửi tin nhắn đến máy chủ cục bộ đang chạy trên Docker:
from openai import OpenAI
openai_api_key = "EMPTY"
openai_api_base = "http://localhost:8000/v1"
client = OpenAI(
api_key=openai_api_key,
base_url=openai_api_base,
)
models = client.models.list()
model = models.data[0].id
completion = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello"},
]
)
print(completion.choices[0].message.content)
Lưu ý chúng ta dùng API key "EMPTY" ở trên. Đây là key mặc định. Bạn có thể yêu cầu cung cấp key để truy cập mô hình bằng tham số --api-key. Ví dụ:
docker run -it --rm -p 8000:8000 \
--env "HUGGING_FACE_HUB_TOKEN=<replace_with_hf_token>" \
vllm-cpu --model meta-llama/Llama-3.2-1B-Instruct \
--dtype float16 --api-key supersecretkey
Sau đó, trong trường hợp này, hãy thay key ở đầu đoạn mã:
openai_api_key = "supersecretkey"
Cách lưu trữ vLLM CPU trên Google Cloud
Lưu trữ LLM trên Google Cloud bằng vLLM mang lại một giải pháp triển khai hiệu quả. Hãy cùng phân tách các bước và làm rõ hơn.
Bước 1: Truy cập Google Cloud Console
Trước hết, truy cập Google Cloud Console bằng cách mở Google Cloud Console trên trình duyệt. Nếu chưa có tài khoản Google, bạn cần tạo tài khoản để dùng dịch vụ Google Cloud.
Bước 2: Tạo dự án
Trong Google Cloud Console, tìm menu xổ xuống dự án ở đầu màn hình và chọn "New Project."

Nhập vllm-demo làm tên dự án để dễ nhận diện sau này.

Nếu bạn đã có tài khoản Google Cloud, tài khoản thanh toán dùng thử có thể không khả dụng. Khi đó, bạn cần tạo tài khoản thanh toán mới. Vào mục "Billing" và làm theo hướng dẫn để chọn tài khoản thanh toán hiện có hoặc tạo tài khoản mới.
Bước 3: Bật dịch vụ Artifact Registry
Artifact Registry là dịch vụ cho phép lưu trữ và quản lý container image. Chúng ta sẽ dùng nó để lưu Docker image chạy vLLM.
Trong Cloud Console, tìm "artifact" để mở Artifact Registry.

Sau đó bật dịch vụ cho dự án của bạn. Bước này cần thiết để lưu Docker image cho thiết lập vLLM.

Bước 4: Tạo kho artifact
Giờ hãy tạo một kho artifact để lưu container image. Điều hướng đến Artifact Registry và nhấp "Create Repository."

Đặt tên kho là vllm-cpu và chọn định dạng "Docker". Chỉ định vị trí là us-central1 để tối ưu hiệu năng theo nhu cầu triển khai. Các cấu hình còn lại có thể để mặc định.

Bước 5: Build và đẩy Docker image
Cũng như trên máy cục bộ, chúng ta sẽ build Docker image rồi tải (push) lên kho vllm-cpu trên Google Cloud. Thực hiện qua cloud shell ở góc trên bên phải.
.
Trong terminal đó, hãy clone kho GitHub của vLLM bằng lệnh sau để lấy các tệp cần thiết:
git clone https://github.com/vllm-project/vllm.git
Đi vào thư mục vLLM vừa clone bằng terminal.
cd vllm
Build Docker image bằng lệnh sau, sử dụng Dockerfile cấu hình cho CPU:
docker build \
-t us-central1-docker.pkg.dev/vllm-demo/vllm-cpu/vllm-openai:latest \
-f Dockerfile.cpu .
Sau khi build xong image, hãy push lên Artifact Repository để có thể dùng với các dịch vụ của Google Cloud sau này:
docker push us-central1-docker.pkg.dev/vllm-demo/vllm-cpu/vllm-openai:latest
Bước 6: Thiết lập dịch vụ trên Cloud Run
Google Cloud Run cho phép triển khai ứng dụng đóng gói trong container. Chúng ta sẽ dùng dịch vụ này để triển khai image vừa build.
Gõ "cloud run" trong ô tìm kiếm và mở dịch vụ “Cloud Run”.

Tại đây, nhấp nút "Create Service":

Sau đó thực hiện các bước sau:
- Chọn container image: Chọn image bạn đã push trước đó.
- Cấu hình cổng: Đổi cổng mặc định thành
8000, là cổng vLLM sử dụng. - Thêm token Hugging Face: Trong mục "Variables & Secrets", thêm biến mới tên
HUGGING_FACE_HUB_TOKENvà dán token của bạn. Token này cho phép vLLM truy cập mô hình từ Hugging Face. - Tham số cho container: Trong phần lệnh, thêm đối số
--model=meta-llama/Llama-3.2-1Bđể chỉ định mô hình mong muốn. - Cấp phát tài nguyên: Đặt bộ nhớ 16 GiB và 4 CPU để container có đủ tài nguyên xử lý hiệu quả.
- Thiết lập instance: Để giảm thời gian khởi động lạnh, luôn giữ ít nhất một instance hoạt động. Điều này có thể tăng chi phí nhưng cải thiện hiệu năng bằng cách giảm thời gian tải mô hình và khởi động.
Khi cấu hình xong (các tùy chọn khác để mặc định), nhấp “Create” ở cuối trang. Chờ dịch vụ sẵn sàng rồi mở trang dịch vụ. Tại đây, bạn sẽ thấy URL dịch vụ để giao tiếp với LLM.
URL sẽ có dạng như sau:
https://vllm-llama-577126904161.us-central1.run.app
Tương tác với LLM
Bạn có thể tương tác với LLM bằng Python giống như khi chạy cục bộ. Chỉ cần đổi URL trong script:
# Thay bằng URL dịch vụ của bạn
openai_api_base = "https://vllm-llama-577126904161.us-central1.run.app/v1"
Lưu ý quan trọng về chi phí
Cảnh báo: Nếu bạn làm theo các bước này, lưu ý rằng giữ Artifact Registry hoạt động sẽ tốn phí. Hãy nhớ hủy liên kết tài khoản thanh toán sau khi làm theo hướng dẫn này, nếu không bạn sẽ bị tính phí kể cả khi không ai sử dụng.
Thiết lập GPU trên Google Cloud
Tại thời điểm viết hướng dẫn này, hỗ trợ GPU cho Google Cloud Run được cung cấp theo yêu cầu. Nghĩa là bạn cần đề nghị để được cấp quyền. Khi có quyền, chạy vLLM bằng GPU sẽ tăng hiệu năng đáng kể so với CPU, đặc biệt hữu ích khi xử lý các mô hình ngôn ngữ lớn vì GPU tối ưu cho xử lý song song.
Nếu được cấp quyền GPU, bạn có thể đơn giản hóa quy trình. Khi đó, không cần tự build Docker image. Thay vào đó, có thể tạo dịch vụ trực tiếp với image sẵn có vllm/vllm-openai:latest. Image này được tối ưu cho GPU, giúp triển khai nhanh chóng và hiệu quả mà không cần các bước thiết lập thêm như trên CPU.
Khi đã được duyệt GPU và thiết lập dịch vụ bằng image cung cấp, triển khai vLLM của bạn có thể khai thác tối đa sức mạnh và tốc độ của GPU, phù hợp cho các ứng dụng thời gian thực và tác vụ xử lý ngôn ngữ cường độ cao.
RunPod: Giải pháp lưu trữ thay thế
Nếu cần phương án lưu trữ thay thế, các nền tảng như RunPod cung cấp dịch vụ tối giản để lưu trữ mô hình ngôn ngữ lớn. Chẳng hạn, RunPod có thiết lập serverless giúp đơn giản hóa quá trình triển khai.

Dù thân thiện và thiết lập nhanh, hãy lưu ý rằng sự tiện lợi thường đi kèm mức giá cao hơn. Nếu ngân sách hạn chế, bạn nên cân nhắc giữa sự dễ dùng và chi phí của các dịch vụ như vậy.
Kết luận
Trong hướng dẫn này, chúng ta đã tìm hiểu cách thiết lập và lưu trữ vLLM cả cục bộ và trên Google Cloud.
Chúng ta đã học cách build và chạy Docker image dành riêng cho CPU, đảm bảo khả năng tiếp cận ngay cả khi không có GPU cao cấp. Ngoài ra, chúng ta cũng xem xét việc triển khai vLLM trên Google Cloud để có giải pháp mở rộng, xử lý khối lượng công việc lớn.
