Tại sao lỗi này xảy ravLLM được thiết kế để đạt thông lượng (throughput) cao, và nó thực hiện điều này bằng cách chiếm dụng bộ nhớ GPU rất lớn. Khi engine khởi tạo, nó cố gắng dự trữ một phần lớn VRAM dành riêng cho KV (Key-Value) cache. Việc cấp phát trước này là bí mật đằng sau tốc độ của nó, nhưng cũng là nguyên nhân phổ biến nhất gây ra lỗi khi khởi động. Nếu tổng trọng số của mô hình (model weights), tài nguyên hệ thống và kích thước bộ nhớ cache yêu cầu vượt quá dung lượng VRAM hiện có, server sẽ bị lỗi ngay lập tức.
Lỗi này thường xảy ra khi mô hình quá lớn so với phần cứng hoặc khi các tiến trình chạy nền đang chiếm dụng GPU. Ngay cả một lượng nhỏ bộ nhớ bị chiếm dụng ẩn cũng có thể khiến vLLM bị quá tải.
Thông báo lỗi```
ValueError: No available memory for the cache blocks. Try increasing gpu_memory_utilization when initializing the engine.
## Quy trình gỡ lỗiBắt đầu bằng cách kiểm tra trạng thái hiện tại của phần cứng. Chạy lệnh `nvidia-smi` để xác định bất kỳ tiến trình rác (zombie processes) hoặc ứng dụng giao diện đồ họa (GUI) nào đang chiếm dụng VRAM. Trên một máy tính Ubuntu tiêu chuẩn, hệ thống cửa sổ X11 hoặc GNOME có thể dễ dàng chiếm từ 500MB đến 1GB bộ nhớ.
Tiếp theo, hãy làm phép tính cho trọng số mô hình của bạn. Một mô hình 7 tỷ tham số (7B) được tải ở định dạng FP16 (16-bit) yêu cầu khoảng 14GB VRAM (7 tỷ * 2 byte). Nếu bạn đang sử dụng RTX 3090 với 24GB VRAM, bạn còn khoảng 10GB trống. Tuy nhiên, cài đặt mặc định của vLLM sẽ cố gắng chiếm 90% tổng số 24GB (tương đương 21.6GB), điều này là không thể vì trọng số mô hình đã chiếm 14GB. 14GB + 21.6GB vượt quá giới hạn 24GB của bạn, khiến engine bị treo.
## Các giải pháp### 1. Điều chỉnh mức sử dụng bộ nhớ GPUTheo mặc định, vLLM nhắm tới việc sử dụng 90% (0.9) tổng lượng VRAM của bạn. Nếu bạn có các ứng dụng khác đang chạy, bạn phải giảm giá trị này xuống. Ngược lại, trên một server chuyên dụng không có giao diện đồ họa, đôi khi bạn có thể đẩy con số này lên 0.95 để phù hợp với các mô hình lớn hơn.
Đối với người dùng CLI, hãy thử giảm mức sử dụng xuống 80%:
python -m vllm.entrypoints.openai.api_server
--model mistralai/Mistral-7B-v0.1
--gpu-memory-utilization 0.8
Nếu bạn đang sử dụng Python API, hãy cấu hình đối tượng LLM như sau:
from vllm import LLM llm = LLM(model="mistralai/Mistral-7B-v0.1", gpu_memory_utilization=0.8)
### 2. Giới hạn độ dài tối đa của mô hìnhTham số `max_model_len` (cửa sổ ngữ cảnh) quyết định trực tiếp lượng VRAM mà mỗi khối KV cache tiêu thụ. Nếu bạn không cần cửa sổ ngữ cảnh khổng lồ lên tới 32k token, việc giảm xuống còn 4096 hoặc 8192 có thể giải phóng vài gigabyte. Đây thường là cách dễ nhất để chạy server mà không làm giảm chất lượng mô hình.
python -m vllm.entrypoints.openai.api_server
--model mistralai/Mistral-7B-v0.1
--max-model-len 4096
--gpu-memory-utilization 0.9
### 3. Sử dụng định lượng (Quantization)Khi bản thân trọng số mô hình quá nặng so với card đồ họa của bạn, bạn cần một định dạng hiệu quả hơn như AWQ hoặc GPTQ. Chuyển từ FP16 sang định lượng 4-bit giúp giảm dung lượng bộ nhớ của trọng số xuống gần 70%. Ví dụ, một mô hình Llama-3-70B thường cần hai card A100 có thể chạy vừa trên một card duy nhất khi được định lượng.
python -m vllm.entrypoints.openai.api_server
--model TheBloke/Llama-2-7B-Chat-AWQ
--quantization awq
### 4. Vô hiệu hóa CUDA Graph CapturingvLLM sử dụng CUDA graphs để giảm thiểu chi phí CPU và tăng tốc xử lý các batch nhỏ. Tính năng này rất nhanh, nhưng nó yêu cầu một khoản "thuế" VRAM trả trước khoảng 1-2GB trong quá trình khởi tạo. Nếu bạn chỉ thiếu một chút bộ nhớ, việc vô hiệu hóa tính năng này bằng chế độ eager có thể tiết kiệm đủ không gian để ngăn chặn sự cố.
python -m vllm.entrypoints.openai.api_server
--model mistralai/Mistral-7B-v0.1
--enforce-eager
## Cách kiểm tra kết quảTheo dõi kỹ nhật ký (logs) terminal của bạn trong quá trình khởi động. Bạn cần thấy engine tính toán cấp phát khối (block allocation) thành công. Hãy tìm dòng INFO cụ thể này:
INFO 05-22 10:00:00 llm_engine.py:150] # GPU blocks: 1240, # CPU blocks: 512
Nếu nhật ký hiển thị `Uvicorn running on http://0.0.0.0:8000`, cài đặt bộ nhớ của bạn đã ổn định. Chạy `nvidia-smi` khi server đang ở trạng thái nghỉ để xem mức chiếm dụng bộ nhớ cuối cùng; nó sẽ trông gần như đầy, đây là hành vi bình thường của vLLM.
## Những lưu ý quan trọng- **Trọng số mô hình là nền tảng:** vLLM tải trọng số mô hình trước. Bất kỳ lượng VRAM nào còn lại sau đó sẽ được chia nhỏ cho KV cache dựa trên tham số `gpu_memory_utilization` của bạn.- **Quy tắc 90% chỉ là hướng dẫn:** Trên các dòng card phổ thông (RTX 3090/4090), các tác vụ nền của hệ điều hành thường chiếm 1-2GB. Việc thiết lập mức sử dụng 0.9 trên card 24GB giả định rằng có 21.6GB đang trống, điều này hiếm khi đúng nếu bạn đang cắm màn hình vào card đó.- **Ngữ cảnh chiếm dụng VRAM rất lớn:** Mỗi token tăng thêm trong cửa sổ ngữ cảnh sẽ làm giảm số lượng yêu cầu song song mà server có thể xử lý.

