Chào mừng bạn đến với hướng dẫn toàn diện về vLLM! Nếu bạn tham gia vào thế giới của các Mô hình Ngôn ngữ Lớn (LLMs), rất có thể bạn đã gặp phải những thách thức về tốc độ suy luận và hiệu suất. Việc phục vụ những mô hình khổng lồ này một cách hiệu quả có thể tạo ra nút thắt cổ chai. Đây chính là lúc vLLM xuất hiện như một giải pháp thay đổi cuộc chơi. Hướng dẫn này sẽ dẫn dắt bạn qua mọi điều bạn cần biết như một người mới bắt đầu: vLLM là gì, tại sao nó lại quan trọng, cách cài đặt và cách sử dụng nó cho cả xử lý theo lô ngoại tuyến và phục vụ trực tuyến.
Vậy vLLM chính xác là gì?
Về bản chất, vLLM là một thư viện có hiệu suất cao và tiết kiệm bộ nhớ, được thiết kế riêng cho việc suy luận và phục vụ các Mô hình Ngôn ngữ Lớn (LLM). Được phát triển bởi các nhà nghiên cứu và kỹ sư nhằm vượt qua những hạn chế về hiệu năng của các hệ thống phục vụ hiện có, vLLM làm tăng đáng kể tốc độ của quá trình nhận dự đoán (suy luận) từ các LLM.
Các phương pháp truyền thống cho suy luận LLM thường gặp khó khăn trong việc quản lý lượng bộ nhớ lớn do cơ chế chú ý của mô hình (cụ thể là bộ nhớ KV) và đóng gói các yêu cầu đến một cách hiệu quả. vLLM giới thiệu các kỹ thuật mới, đặc biệt là PagedAttention, để giải quyết những thách thức này một cách trực tiếp. Nó cho phép hiệu suất xử lý cao hơn (nhiều yêu cầu được xử lý mỗi giây) và có thể phục vụ các mô hình nhanh hơn và với chi phí hợp lý hơn so với nhiều triển khai tiêu chuẩn của Hugging Face Transformers hoặc các khung phục vụ khác khi xử lý các yêu cầu đồng thời.
Hãy nghĩ về vLLM như một động cơ tối ưu hóa cao cho việc chạy các LLM đã được huấn luyện trước. Bạn cung cấp mô hình và các prompt, và vLLM đảm nhận nhiệm vụ phức tạp của việc tạo văn bản một cách nhanh chóng và hiệu quả, bất kể đó là một lô lớn các prompt hay nhiều người dùng đồng thời tương tác với một mô hình đã được triển khai.
Tại sao chọn vLLM cho suy luận LLM?
Có một số lý do thuyết phục khiến vLLM trở thành sự lựa chọn ưu tiên cho các nhà phát triển và tổ chức làm việc với LLM:
- Hiệu suất Tối ưu: vLLM cung cấp hiệu suất xử lý cao hơn đáng kể so với nhiều triển khai cơ bản. Điều này có nghĩa là bạn có thể xử lý nhiều yêu cầu người dùng cùng một lúc hoặc xử lý các tập dữ liệu lớn nhanh hơn với phần cứng tương tự.
- Quản lý Bộ nhớ Hiệu quả: Sáng tạo cốt lõi, PagedAttention, giảm thiểu đáng kể lãng phí bộ nhớ bằng cách quản lý bộ nhớ KV một cách hiệu quả hơn. Điều này cho phép bạn cài đặt các mô hình lớn hơn trên các GPU của mình hoặc phục vụ các mô hình hiện có mà không tốn nhiều bộ nhớ hơn, có khả năng giảm chi phí phần cứng.
- Đóng gói Liên tục: Khác với việc đóng gói tĩnh (nơi máy chủ chờ cho đến khi có một lô đầy yêu cầu trước khi xử lý), vLLM sử dụng đóng gói liên tục. Nó xử lý các yêu cầu một cách động khi chúng đến, cải thiện đáng kể việc sử dụng GPU và giảm độ trễ cho từng yêu cầu.
- Máy chủ Tương thích với OpenAI: vLLM bao gồm một máy chủ tích hợp mô phỏng API OpenAI. Điều này giúp việc sử dụng vLLM trở nên cực kỳ dễ dàng như một sự thay thế không gây gián đoạn cho các ứng dụng đã được xây dựng bằng cách sử dụng client Python OpenAI hoặc các công cụ tương thích. Bạn có thể chỉ cần thay đổi URL điểm cuối và khóa API, và mã hiện tại của bạn sẽ hoạt động với phiên bản vLLM tự lưu trữ của bạn.
- Dễ sử dụng: Mặc dù có những thành phần nội bộ phức tạp, vLLM cung cấp một API tương đối đơn giản cho cả suy luận ngoại tuyến (
LLM
class) và phục vụ trực tuyến (vllm serve
command). - Khả năng Tương thích Mô hình Rộng rãi: vLLM hỗ trợ nhiều loại LLM phổ biến mã nguồn mở có sẵn trên Hugging Face Hub (và có thể là ModelScope).
- Phát triển và Cộng đồng Năng động: vLLM là một dự án mã nguồn mở được duy trì tích cực với một cộng đồng đang phát triển, đảm bảo sự cải tiến liên tục, sửa lỗi và hỗ trợ các mô hình và tính năng mới.
- Các Kernel Tối ưu hóa: vLLM sử dụng các kernel CUDA được tối ưu hóa cao cho nhiều hoạt động khác nhau, nâng cao thêm hiệu suất trên các GPU NVIDIA.
Nếu tốc độ, hiệu quả và khả năng mở rộng là rất quan trọng đối với ứng dụng LLM của bạn, vLLM là công nghệ bạn nên cân nhắc nghiêm túc.
vLLM hỗ trợ những mô hình nào?
vLLM hỗ trợ một loạt các mô hình dựa trên transformer phổ biến được lưu trữ trên Hugging Face Hub. Điều này bao gồm nhiều biến thể của:
- Llama (Llama, Llama 2, Llama 3)
- Mistral & Mixtral
- Qwen & Qwen2
- GPT-2, GPT-J, GPT-NeoX
- OPT
- Bloom
- Falcon
- MPT
- Và nhiều cái khác, bao gồm cả các mô hình đa phương thức.
Danh sách này đang không ngừng phát triển. Để có danh sách các mô hình chính thức hỗ trợ, hãy luôn tham khảo tài liệu chính thức của vLLM:
Danh sách Các Mô hình Hỗ trợ của vLLM
Nếu một mô hình không được liệt kê rõ ràng, nó có thể vẫn hoạt động nếu kiến trúc của nó tương tự như một mô hình được hỗ trợ, nhưng không được đảm bảo tương thích mà không có hỗ trợ hoặc thử nghiệm chính thức. Việc thêm các kiến trúc mô hình mới thường yêu cầu đóng góp mã cho dự án vLLM.
Một số thuật ngữ chính của vLLM:
Mặc dù vLLM dễ sử dụng về bề ngoài, việc hiểu một vài khái niệm cốt lõi của nó giúp bạn nhận ra tại sao nó lại hiệu quả đến vậy:
- PagedAttention: Đây là tính năng nổi bật của vLLM. Trong các cơ chế chú ý truyền thống, bộ nhớ Key-Value (KV) (lưu trữ các kết quả trung gian để tạo ra văn bản) yêu cầu các khối bộ nhớ liên tục. Điều này dẫn đến phân mảnh và lãng phí bộ nhớ (nội bộ và bên ngoài). PagedAttention hoạt động giống như bộ nhớ ảo trong hệ điều hành. Nó chia bộ nhớ KV thành các khối không liên tục (trang), cho phép quản lý bộ nhớ linh hoạt và hiệu quả hơn. Điều này làm giảm đáng kể chi phí bộ nhớ (lên đến 90% trong một số trường hợp do các nhà phát triển báo cáo) và cho phép các tính năng như tiền tố chia sẻ mà không cần sao chép bộ nhớ.
- Đóng gói Liên tục: Không giống như việc chờ cho một số lượng yêu cầu cố định đến trước khi bắt đầu tính toán (đóng gói tĩnh), đóng gói liên tục cho phép động cơ vLLM bắt đầu xử lý các chuỗi mới ngay khi các chuỗi cũ hoàn thành việc tạo ra các token trong một lô. Điều này giữ cho GPU luôn bận rộn, tối đa hóa tỷ lệ xử lý và giảm thời gian chờ trung bình cho các yêu cầu.
Hai kỹ thuật này hoạt động cùng nhau theo cách cộng hưởng để cung cấp các đặc điểm hiệu suất ấn tượng của vLLM.
Trước khi bắt đầu với vLLM, bạn cần kiểm tra:
Trước khi bạn có thể cài đặt và chạy vLLM, hãy đảm bảo rằng hệ thống của bạn đáp ứng các yêu cầu sau:
- Hệ điều hành: Linux là hệ điều hành chính được hỗ trợ. Mặc dù có thể có những nỗ lực cộng đồng cho các hệ điều hành khác (như WSL2 trên Windows hoặc macOS), Linux cung cấp trải nghiệm dễ dàng và chính thức nhất.
- Phiên bản Python: vLLM yêu cầu Python 3.9, 3.10, 3.11, hoặc 3.12. Rất được khuyến nghị sử dụng môi trường ảo để quản lý các phụ thuộc Python của bạn.
- GPU NVIDIA với CUDA: Để có hiệu suất tối ưu và truy cập vào các tính năng cốt lõi, bạn cần một GPU NVIDIA với khả năng tính toán được hỗ trợ bởi PyTorch và bộ công cụ CUDA cần thiết được cài đặt. vLLM phụ thuộc nặng vào CUDA cho các kernel được tối ưu hóa của nó. Mặc dù có hỗ trợ suy luận chỉ với CPU và hỗ trợ cho các bộ tăng tốc khác (như GPU AMD hoặc AWS Inferentia/Trainium) có sẵn hoặc đang phát triển, con đường chính vẫn liên quan đến phần cứng NVIDIA. Kiểm tra trang web chính thức của PyTorch để biết tính tương thích CUDA với phiên bản trình điều khiển GPU cụ thể của bạn.
- PyTorch: vLLM được xây dựng trên PyTorch. Quy trình cài đặt thường xử lý việc cài đặt một phiên bản tương thích, nhưng hãy đảm bảo rằng bạn có một cài đặt PyTorch hoạt động mà tương thích với phiên bản CUDA của bạn nếu bạn gặp sự cố.
Hướng dẫn từng bước để cài đặt vLLM
Cách được khuyến nghị nhất để cài đặt vLLM là sử dụng trình quản lý gói trong môi trường ảo. Điều này ngăn chặn xung đột với các dự án Python khác. Dưới đây là các bước sử dụng các công cụ phổ biến:
Sử dụng pip với vLLM
pip
là trình cài đặt gói Python tiêu chuẩn.
Tạo và Kích hoạt Môi trường Ảo (Khuyến nghị):
python -m venv vllm-env
source vllm-env/bin/activate
# Trên Windows sử dụng: vllm-env\\\\Scripts\\\\activate
Cài đặt vLLM:
pip install vllm
Lệnh này sẽ tải xuống và cài đặt phiên bản ổn định mới nhất của vLLM và các phụ thuộc cốt lõi của nó, bao gồm một phiên bản tương thích của PyTorch cho cài đặt CUDA của bạn (nếu có thể).
Sử dụng Conda với vLLM
Conda là một trình quản lý môi trường và gói phổ biến khác, đặc biệt trong cộng đồng khoa học dữ liệu.
Tạo và Kích hoạt Môi trường Conda:
conda create -n vllm-env python=3.11 -y # Hoặc sử dụng 3.9, 3.10, 3.12
conda activate vllm-env
Cài đặt vLLM bằng pip trong Conda: Thông thường, nên sử dụng pip
để cài đặt vLLM ngay cả trong môi trường Conda để đảm bảo bạn nhận được bản builds tương thích mới nhất một cách dễ dàng.
pip install vllm
Bạn có thể cần cài đặt PyTorch riêng biệt qua Conda trước nếu bạn thích quản lý theo cách đó, đảm bảo tính tương thích: conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
(điều chỉnh phiên bản CUDA khi cần). Sau đó chạy pip install vllm
.
Sử dụng uv với vLLM
uv
là một trình cài đặt và giải quyết gói Python mới hơn, cực kỳ nhanh chóng.
Cài đặt uv (nếu bạn chưa cài đặt): Làm theo hướng dẫn trong tài liệu chính thức của uv
.
Tạo và Kích hoạt Một Môi trường sử dụng uv:
uv venv vllm-env --python 3.12 --seed # Hoặc sử dụng 3.9, 3.10, 3.11
source vllm-env/bin/activate
# Trên Windows sử dụng: vllm-env\\\\Scripts\\\\activate
Cài đặt vLLM bằng uv:
uv pip install vllm
Xác minh Cài đặt vLLM của Bạn
Sau khi cài đặt, bạn có thể nhanh chóng xác minh bằng cách cố gắng nhập vLLM trong một trình thông dịch Python hoặc chạy lệnh cơ bản:
# Kích hoạt môi trường ảo của bạn trước (ví dụ: source vllm-env/bin/activate)
python -c "import vllm; print(vllm.__version__)"
Điều này sẽ in ra phiên bản vLLM đã cài đặt mà không có lỗi.
Hoặc, thử lệnh trợ giúp cho máy chủ (yêu cầu cài đặt thành công):
vllm --help
Thực hiện Suy luận Theo lô Ngoại tuyến với vLLM
Suy luận theo lô ngoại tuyến đề cập đến việc tạo văn bản cho một danh sách các prompt đầu vào đã được định nghĩa trước tất cả cùng một lúc. Điều này hữu ích cho các nhiệm vụ như đánh giá một mô hình, tạo phản hồi cho một tập dữ liệu hoặc tính toán trước các kết quả. vLLM giúp việc này trở nên hiệu quả bằng cách sử dụng lớp LLM
của nó.
Hiểu lớp LLM
của vLLM
Lớp vllm.LLM
là điểm khởi đầu chính cho suy luận ngoại tuyến. Bạn khởi tạo nó bằng cách chỉ định mô hình mà bạn muốn sử dụng.
from vllm import LLM
# Khởi tạo động cơ LLM với một mô hình từ Hugging Face Hub
# Đảm bảo bạn có đủ bộ nhớ GPU cho mô hình đã chọn!
# Ví dụ: Sử dụng một mô hình nhỏ hơn như OPT-125m
llm = LLM(model="facebook/opt-125m")
# Ví dụ: Sử dụng một mô hình lớn hơn như Llama-3-8B-Instruct (đòi hỏi bộ nhớ GPU đáng kể)
# llm = LLM(model="meta-llama/Meta-Llama-3-8B-Instruct")
print("Dòng động cơ vLLM đã được khởi tạo.")
Mặc định, vLLM tải xuống các mô hình từ Hugging Face Hub. Nếu mô hình của bạn được lưu trữ trên ModelScope, bạn cần thiết lập biến môi trường VLLM_USE_MODELSCOPE=1
trước khi chạy kịch bản Python của bạn.
Cấu hình Các Tham số Lấy mẫu của vLLM
Để kiểm soát cách văn bản được tạo ra, bạn sử dụng lớp vllm.SamplingParams
. Điều này cho phép bạn đặt các tham số như:
temperature
: Điều chỉnh độ ngẫu nhiên. Các giá trị thấp (ví dụ: 0.2) làm cho đầu ra có tính quyết định và tập trung hơn; các giá trị cao hơn (ví dụ: 0.8) làm tăng độ ngẫu nhiên.top_p
(Lấy mẫu Nucleus): Chỉ xem xét các token có xác suất cao nhất mà xác suất tích lũy vượt quátop_p
. Một giá trị phổ biến là 0.95.top_k
: Chỉ xem xéttop_k
token có xác suất cao nhất tại mỗi bước.max_tokens
: Số lượng token tối đa để tạo cho mỗi prompt.stop
: Một danh sách chuỗi mà khi được tạo ra, sẽ dừng quá trình tạo văn bản cho prompt cụ thể đó.
from vllm import SamplingParams
# Định nghĩa các tham số lấy mẫu
# Nếu không được chỉ định, vLLM có thể sử dụng các giá trị mặc định từ model's generation_config.json
sampling_params = SamplingParams(
temperature=0.7,
top_p=0.9,
max_tokens=100, # Giới hạn độ dài của văn bản được tạo ra
stop=["\\\\n", " Người:", " Trợ lý:"] # Dừng tạo nếu các token này xuất hiện
)
print("Các tham số lấy mẫu đã được cấu hình.")
Lưu ý Quan trọng: Theo mặc định, vLLM cố gắng tải và sử dụng các cài đặt từ tệp generation_config.json
liên kết với mô hình trên Hugging Face Hub. Nếu bạn muốn bỏ qua điều này và sử dụng các tham số lấy mẫu mặc định của vLLM trừ khi bị ghi đè bởi đối tượng SamplingParams
của bạn, hãy khởi tạo lớp LLM
như sau: llm = LLM(model="...", generation_config="vllm")
. Nếu bạn có cung cấp một đối tượng SamplingParams
cho phương thức generate
, các tham số đó sẽ luôn được ưu tiên hơn cả cài đặt của mô hình và mặc định của vLLM.
Chạy Công việc Theo lô Đầu tiên của Bạn với vLLM
Bây giờ, hãy kết hợp đối tượng LLM
, SamplingParams
, và một danh sách các prompt để tạo ra văn bản.
from vllm import LLM, SamplingParams
# 1. Định nghĩa các prompt đầu vào của bạn
prompts = [
"Thủ đô của Pháp là",
"Giải thích lý thuyết tương đối bằng các thuật ngữ đơn giản:",
"Viết một bài thơ ngắn về một ngày mưa:",
"Dịch 'Hello, world!' sang tiếng Đức:",
]
# 2. Cấu hình các tham số lấy mẫu
sampling_params = SamplingParams(temperature=0.7, top_p=0.95, max_tokens=150)
# 3. Khởi tạo động cơ vLLM (sử dụng một mô hình phù hợp với phần cứng của bạn)
try:
# Sử dụng một mô hình tương đối nhỏ, có khả năng
llm = LLM(model="mistralai/Mistral-7B-Instruct-v0.1")
# Hoặc cho các GPU nhỏ hơn:
# llm = LLM(model="facebook/opt-1.3b")
# llm = LLM(model="facebook/opt-125m")
except Exception as e:
print(f"Có lỗi xảy ra khi khởi tạo LLM: {e}")
print("Vui lòng đảm bảo rằng bạn có đủ bộ nhớ GPU và CUDA đã được thiết lập đúng cách.")
exit()
# 4. Tạo văn bản cho các prompt
# Phương thức generate nhận danh sách các prompt và các tham số lấy mẫu
print("Đang tạo phản hồi...")
outputs = llm.generate(prompts, sampling_params)
print("Tạo hoàn tất.")
# 5. In ra kết quả
# Đầu ra là một danh sách các đối tượng RequestOutput
for output in outputs:
prompt = output.prompt
generated_text = output.outputs[0].text # Lấy văn bản từ chuỗi được tạo ra đầu tiên
print("-" * 20)
print(f"Prompt: {prompt!r}")
print(f"Generated Text: {generated_text!r}")
print("-" * 20)
Kịch bản này khởi tạo vLLM, định nghĩa các prompt và tham số, thực hiện quá trình tạo ra một cách hiệu quả trong một lô, và sau đó in ra đầu ra cho mỗi prompt. Lệnh llm.generate()
xử lý sự phức tạp về việc đóng gói và thực thi GPU bên trong.
Cài đặt Máy chủ Tương thích với OpenAI của vLLM
Một trong những tính năng mạnh mẽ nhất của vLLM là khả năng hoạt động như một máy chủ backend hiệu năng cao, giao tiếp bằng cùng một ngôn ngữ như API OpenAI. Điều này cho phép bạn dễ dàng lưu trữ các mô hình mã nguồn mở của riêng bạn và tích hợp chúng vào các ứng dụng được thiết kế cho OpenAI.
Khởi động Máy chủ vLLM
Khởi động máy chủ rất đơn giản bằng cách sử dụng lệnh vllm serve
trong terminal của bạn.
Kích hoạt môi trường ảo nơi vLLM được cài đặt.
source vllm-env/bin/activate
Chạy lệnh vllm serve
: Bạn cần chỉ định mô hình mà bạn muốn phục vụ.
# Ví dụ sử dụng Mistral-7B-Instruct
vllm serve mistralai/Mistral-7B-Instruct-v0.1
# Ví dụ sử dụng một mô hình nhỏ hơn như Qwen2-1.5B-Instruct
# vllm serve Qwen/Qwen2-1.5B-Instruct
Lệnh này sẽ:
- Tải xuống mô hình đã chỉ định (nếu chưa được lưu vào bộ nhớ).
- Tải mô hình lên GPU của bạn.
- Bắt đầu một máy chủ web (sử dụng Uvicorn theo mặc định).
- Nghe các yêu cầu API đến, thường tại
http://localhost:8000
.
Các Tùy chọn Thông dụng:
-model <tên_hay_đường_dẫn_mô_hình>
: (Bắt buộc) Mô hình để phục vụ.-host <địa_chỉ_ip>
: Địa chỉ IP để gán cho máy chủ (ví dụ:0.0.0.0
để làm cho nó có thể truy cập trên mạng của bạn). Mặc định làlocalhost
.-port <số_port>
: Cổng lắng nghe. Mặc định là8000
.-tensor-parallel-size <N>
: Đối với phục vụ đa GPU, chia mô hình cho N GPU.-api-key <khóa_của_bạn>
: Nếu được thiết lập, máy chủ sẽ mong đợi khóa API này trong tiêu đềAuthorization: Bearer <khóa_của_bạn>
của các yêu cầu đến. Bạn cũng có thể thiết lập biến môi trườngVLLM_API_KEY
.-generation-config vllm
: Sử dụng các tham số lấy mẫu mặc định của vLLM thay vìgeneration_config.json
của mô hình.-chat-template <đường_dẫn_tới_tệp_mẫu>
: Sử dụng một tệp mẫu trò chuyện Jinja tùy chỉnh thay vì tệp được định nghĩa trong cấu hình tokenizer.
Máy chủ sẽ xuất ra log chỉ rõ nó đang chạy và sẵn sàng để nhận các yêu cầu.
Tương tác với Máy chủ vLLM: API Hoàn thành
Ngay khi máy chủ đang chạy, bạn có thể gửi các yêu cầu đến điểm cuối /v1/completions
của nó, tương tự như bạn làm với API hoàn thành cũ của OpenAI.
Chỉ sử dụng curl
:
curl <http://localhost:8000/v1/completions> \\\\
-H "Content-Type: application/json" \\\\
-d '{
"model": "mistralai/Mistral-7B-Instruct-v0.1",
"prompt": "San Francisco là một thành phố ở",
"max_tokens": 50,
"temperature": 0.7
}'
(Thay thế "mistralai/Mistral-7B-Instruct-v0.1"
bằng mô hình thực tế mà bạn đang phục vụ)
Sử dụng Thư viện Python openai
:
from openai import OpenAI
# Định hướng máy khách tới điểm cuối máy chủ vLLM của bạn
client = OpenAI(
api_key="TRỐNG", # Sử dụng "TRỐNG" hoặc khóa thực tế của bạn nếu bạn đã thiết lập với --api-key
base_url="<http://localhost:8000/v1>"
)
print("Đang gửi yêu cầu tới máy chủ vLLM (Hoàn thành)...")
try:
completion = client.completions.create(
model="mistralai/Mistral-7B-Instruct-v0.1", # Tên mô hình phải khớp với mô hình được phục vụ
prompt="Giải thích những lợi ích của việc sử dụng vLLM:",
max_tokens=150,
temperature=0.5
)
print("Phản hồi:")
print(completion.choices[0].text)
except Exception as e:
print(f"Có một lỗi xảy ra: {e}")
(Nhớ thay thế tên mô hình nếu bạn đang phục vụ một cái khác)
Tương tác với Máy chủ vLLM: API Hoàn thành trò chuyện
vLLM còn hỗ trợ điểm cuối hiện đại hơn /v1/chat/completions
, phù hợp cho các mô hình hội thoại và định dạng tin nhắn cấu trúc (vai trò hệ thống, người dùng, trợ lý).
Chỉ sử dụng curl
:
curl <http://localhost:8000/v1/chat/completions> \\\\
-H "Content-Type: application/json" \\\\
-d '{
"model": "mistralai/Mistral-7B-Instruct-v0.1",
"messages": [
{"role": "system", "content": "Bạn là một trợ lý hữu ích."},
{"role": "user", "content": "Lợi ích chính của PagedAttention trong vLLM là gì?"}
],
"max_tokens": 100,
"temperature": 0.7
}'
(Thay thế tên mô hình khi cần thiết)
Sử dụng Thư viện Python openai
:
from openai import OpenAI
# Định hướng máy khách tới điểm cuối máy chủ vLLM của bạn
client = OpenAI(
api_key="TRỐNG", # Sử dụng "TRỐNG" hoặc khóa thực tế của bạn
base_url="<http://localhost:8000/v1>"
)
print("Đang gửi yêu cầu tới máy chủ vLLM (Hoàn thành trò chuyện)...")
try:
chat_response = client.chat.completions.create(
model="mistralai/Mistral-7B-Instruct-v0.1", # Tên mô hình phải khớp với mô hình được phục vụ
messages=[
{"role": "system", "content": "Bạn là một trợ lý lập trình hữu ích."},
{"role": "user", "content": "Viết một hàm Python đơn giản để tính giai thừa."}
],
max_tokens=200,
temperature=0.5
)
print("Phản hồi:")
print(chat_response.choices[0].message.content)
except Exception as e:
print(f"Có một lỗi xảy ra: {e}")
(Nhớ thay thế tên mô hình nếu cần thiết)
Sử dụng máy chủ tương thích với OpenAI là một cách mạnh mẽ để triển khai các điểm cuối suy luận LLM hiệu suất cao với những thay đổi tối thiểu trong logic ứng dụng hiện có của bạn.
Hãy nói về Các Backend Chú ý của vLLM
vLLM sử dụng các "backend" chuyên biệt để tính toán cơ chế chú ý một cách hiệu quả. Những backend này là những triển khai tối ưu hóa, tận dụng các thư viện hoặc kỹ thuật khác nhau, chủ yếu nhắm tới các GPU NVIDIA. Việc chọn backend có thể ảnh hưởng đến hiệu suất và mức sử dụng bộ nhớ. Các backend chính bao gồm:
- FlashAttention: Sử dụng thư viện FlashAttention (phiên bản 1 và 2). FlashAttention là một thuật toán chú ý được tối ưu hóa cao, làm cho việc tính toán nhanh hơn và giảm mức sử dụng bộ nhớ bằng cách tránh việc phải làm sống các ma trận chú ý lớn trung gian trong Bộ nhớ Băng thông Cao (HBM) của GPU. Đây thường là tùy chọn nhanh nhất cho nhiều GPU hiện đại (như kiến trúc Ampere, Hopper) và chiều dài chuỗi. vLLM thường bao gồm các tệp wheel được xây dựng sẵn với hỗ trợ FlashAttention.
- Xformers: Tận dụng thư viện xFormers, được phát triển bởi Meta AI. xFormers cũng cung cấp các triển khai chú ý tiết kiệm bộ nhớ và tối ưu hóa (như
MemoryEfficientAttention
). Nó cung cấp sự tương thích rộng rãi trên nhiều kiến trúc GPU khác nhau và có thể là một lựa chọn thay thế hoặc dự phòng tốt nếu FlashAttention không có sẵn hoặc không tối ưu cho một tình huống cụ thể. Cài đặt tiêu chuẩn của vLLM thường bao gồm hỗ trợ cho xFormers. - FlashInfer: Một tùy chọn backend gần đây hơn sử dụng thư viện FlashInfer. FlashInfer cung cấp các kernel được tối ưu hóa cao, được thiết kế đặc biệt cho việc triển khai các LLM, tập trung vào nhiều kịch bản tiền phủ và giải mã, bao gồm các tính năng như giải mã suy đoán và xử lý hiệu quả các bộ nhớ KV đã phân trang. Thường không có các tệp wheel vLLM đã xây dựng sẵn chứa FlashInfer, có nghĩa là bạn phải cài đặt riêng trong môi trường của mình trước khi vLLM có thể sử dụng nó. Tham khảo tài liệu chính thức của FlashInfer hoặc các tệp Docker của vLLM để biết hướng dẫn cài đặt nếu bạn dự định sử dụng backend này.
Chọn Backend Tự động: Theo mặc định, vLLM tự động phát hiện backend chú ý phù hợp và hiệu suất nhất dựa trên phần cứng của bạn (kiến trúc GPU), các thư viện đã cài đặt (FlashAttention/xFormers/FlashInfer có sẵn không?), và mô hình cụ thể đang được sử dụng. Nó thực hiện các kiểm tra để đảm bảo tính tương thích và nhằm cung cấp hiệu suất tốt nhất ngay từ đầu mà không cần cấu hình thủ công.
Chọn Backend Thủ công: Trong một số trường hợp sử dụng nâng cao hoặc cho mục đích benchmarking, bạn có thể muốn buộc vLLM sử dụng một backend cụ thể. Bạn có thể thực hiện điều này bằng cách thiết lập biến môi trường VLLM_ATTENTION_BACKEND
trước khi khởi động quy trình vLLM của bạn (cả kịch bản ngoại tuyến hoặc máy chủ).
# Ví dụ: Buộc sử dụng FlashAttention (nếu đã cài đặt và tương thích)
export VLLM_ATTENTION_BACKEND=FLASH_ATTN
python your_offline_script.py
# hoặc
# export VLLM_ATTENTION_BACKEND=FLASH_ATTN
# vllm serve your_model ...
# Ví dụ: Buộc sử dụng xFormers
export VLLM_ATTENTION_BACKEND=XFORMERS
python your_offline_script.py
# Ví dụ: Buộc sử dụng FlashInfer (đòi hỏi phải cài đặt trước)
export VLLM_ATTENTION_BACKEND=FLASHINFER
python your_offline_script.py
Đối với hầu hết những người mới bắt đầu, việc dựa vào lựa chọn backend tự động của vLLM là khuyến nghị. Thiết lập thủ công backend thường chỉ dành cho việc thử nghiệm hoặc khắc phục các vấn đề hiệu suất cụ thể.
Khắc phục các Vấn đề Thông dụng khi Cài đặt và Sử dụng vLLM
Mặc dù vLLM hướng tới sự dễ dàng trong sử dụng, bạn có thể gặp phải một số trở ngại phổ biến, đặc biệt là trong quá trình thiết lập. Dưới đây là một số vấn đề thường gặp và các giải pháp tiềm năng:
- Lỗi Bộ nhớ CUDA Hết (OOM):
- Vấn đề: Bạn thấy lỗi như
torch.cuda.OutOfMemoryError: CUDA out of memory
. - Nguyên nhân: Mô hình LLM bạn đang cố gắng tải yêu cầu nhiều bộ nhớ GPU VRAM hơn so với phần cứng của bạn. Các mô hình lớn hơn (ví dụ: 7B tham số trở lên) tiêu tốn bộ nhớ đáng kể.
- Giải pháp:
- Sử dụng Mô hình Nhỏ hơn: Hãy thử tải một biến thể nhỏ hơn (ví dụ:
opt-1.3b
,Qwen/Qwen2-1.5B-Instruct
) trước để xác nhận rằng cài đặt của bạn hoạt động. - Giảm Kích thước Lô (Máy chủ): Mặc dù vLLM xử lý đóng gói một cách động, tính đồng thời quá cao vẫn có thể vượt quá bộ nhớ. Theo dõi mức sử dụng.
- Sử dụng Lượng Giảm Kích thước: Tải các phiên bản mô hình đã được lượng giảm kích thước (ví dụ: AWQ, GPTQ, GGUF - kiểm tra tài liệu của vLLM để biết các loại lượng giảm kích thước được hỗ trợ). Lượng giảm kích thước giúp giảm dung lượng bộ nhớ, thường với sự đánh đổi nhỏ về độ chính xác. Ví dụ:
llm = LLM(model="TheBloke/Mistral-7B-Instruct-v0.1-AWQ")
. Lưu ý rằng một số thư viện lượng giảm kích thước có thể cần được cài đặt. - Chia Nhân Tensors: Nếu bạn có nhiều GPU, hãy sử dụng tham số
-tensor-parallel-size N
khi khởi động máy chủ hoặctensor_parallel_size=N
khi khởi tạo lớpLLM
để phân phối mô hình trên N GPU. - Kiểm tra Các Quy trình Khác: Đảm bảo không có ứng dụng khác đang tiêu tốn bộ nhớ GPU đáng kể. Sử dụng
nvidia-smi
trong terminal để kiểm tra mức sử dụng bộ nhớ.
- Lỗi Cài đặt (Tính tương thích CUDA/PyTorch):
- Vấn đề:
pip install vllm
thất bại với các lỗi liên quan đến CUDA, PyTorch hoặc biên dịch các phần mở rộng. - Nguyên nhân: Khác biệt giữa phiên bản trình điều khiển NVIDIA bạn đã cài đặt, phiên bản bộ công cụ CUDA và phiên bản PyTorch mà vLLM đang cố gắng cài đặt hoặc sử dụng.
- Giải pháp:
- Kiểm tra Tính tương thích: Đảm bảo rằng phiên bản trình điều khiển NVIDIA của bạn hỗ trợ phiên bản bộ công cụ CUDA mà bản build PyTorch bạn dự định sử dụng yêu cầu. Tham khảo ma trận cài đặt trên trang web của PyTorch.
- Cài đặt PyTorch Thủ công: Thỉnh thoảng, việc cài đặt một phiên bản PyTorch tương thích trước khi cài đặt vLLM có thể giúp. Truy cập trang web chính thức của PyTorch, chọn hệ điều hành của bạn, trình quản lý gói (pip/conda), nền tảng tính toán (phiên bản CUDA), và chạy lệnh được cung cấp. Sau đó,
pip install vllm
. - Sử dụng Hình ảnh Docker Chính thức: Xem xét việc sử dụng hình ảnh Docker chính thức của vLLM. Chúng có cấu hình sẵn với các phiên bản tương thích của CUDA, PyTorch và vLLM, giúp tránh rắc rối trong việc cài đặt cục bộ. Kiểm tra Docker Hub cho
vllm/vllm-openai
. - Kiểm tra Công cụ Xây dựng: Đảm bảo bạn đã cài đặt các công cụ xây dựng cần thiết (
build-essential
trên Debian/Ubuntu, hoặc tương đương).
- Các Lỗi Tải Mô hình:
- Vấn đề: vLLM không thể tải mô hình đã chỉ định, có thể với lỗi "không tìm thấy" hoặc vấn đề cấu hình.
- Nguyên nhân: Tên/đường dẫn mô hình không chính xác, mô hình yêu cầu tin cậy mã từ xa, vấn đề định dạng mô hình, hoặc vấn đề kết nối mạng ngăn cản việc tải xuống.
- Giải pháp:
- Xác minh Tên Mô hình: Kiểm tra kỹ định danh của Hugging Face Hub (ví dụ:
mistralai/Mistral-7B-Instruct-v0.1
). - Tin cậy Mã Từ xa: Một số mô hình yêu cầu thực thi mã tùy chỉnh được định nghĩa trong kho lưu trữ của chúng. Đối với lớp
LLM
, sử dụngtrust_remote_code=True
. Đối với máy chủ, sử dụng cờ-trust-remote-code
:vllm serve my_model --trust-remote-code
. Chỉ làm điều này nếu bạn tin tưởng nguồn gốc của mô hình. - Sử dụng Đường dẫn Địa phương: Nếu bạn đã tải mô hình về cục bộ, hãy cung cấp đường dẫn đến thư mục chứa các tệp mô hình và cấu hình tokenizer:
llm = LLM(model="/path/to/local/model")
. - Kiểm tra Dung lượng Ổ đĩa: Đảm bảo bạn có đủ dung lượng ổ đĩa để tải xuống trọng số của mô hình (có thể lên tới hàng chục GB).
- Vấn đề Mạng: Kiểm tra kết nối Internet của bạn. Nếu bạn đang ẩn mình sau một proxy, hãy định cấu hình các biến môi trường
HTTP_PROXY
vàHTTPS_PROXY
.
- Hiệu suất Chậm:
- Vấn đề: Tốc độ suy luận thấp hơn nhiều so với mong đợi.
- Nguyên nhân: Backend chú ý không tối ưu được chọn, rơi vào CPU, tham số lấy mẫu không hiệu quả, các điểm nghẽn hệ thống.
- Giải pháp:
- Kiểm tra Sử dụng GPU: Sử dụng
nvidia-smi
hoặc