本文主要分享如何使用 vLLM 實現大模型推理服務。
1. 概述
大模型推理有多種方式比如
- 最基礎的 HuggingFace Transformers
- TGI
- vLLM
- Triton + TensorRT-LLM
- ...
其中,熱度最高的應該就是 vLLM,效能好的同時使用也非常簡單,本文就分享一下如何使用 vLLM 來啟動大模型推理服務。
根據 vLLM 官方部落格 vLLM: Easy, Fast, and Cheap LLM Serving with PagedAttention 所說:
進行了 NVIDIA A10 GPU 上推理 LLaMA-7 B 和 在 NVIDIA A100 GPU(40 GB)上推理 LLaMA-13 B 兩個實驗,在吞吐量上 vLLM 比最基礎的 HuggingFace Transformers 高 24 倍,比 TGI 高 3.5 倍。
2.安裝 vLLM
首先要準備一個 GPU 環境,可以參考這篇文章:GPU 環境搭建指南:如何在裸機、Docker、K8s 等環境中使用 GPU
需要保證宿主機上可以正常執行 nvidia-smi
命令,就像這樣:
root@test:~# nvidia-smi
Thu Jul 18 10:52:01 2024
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.147.05 Driver Version: 525.147.05 CUDA Version: 12.0 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA A40 Off | 00000000:00:07.0 Off | 0 |
| 0% 45C P0 88W / 300W | 40920MiB / 46068MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 1 NVIDIA A40 Off | 00000000:00:08.0 Off | 0 |
| 0% 47C P0 92W / 300W | 40916MiB / 46068MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 1847616 C tritonserver 480MiB |
| 0 N/A N/A 2553571 C python3 40426MiB |
| 1 N/A N/A 1847616 C tritonserver 476MiB |
| 1 N/A N/A 2109313 C python3 40426MiB |
+-----------------------------------------------------------------------------+
安裝 conda
為了避免干擾,這裡使用 conda 單獨建立一個 Python 虛擬環境安裝 vLLM。
使用下面的命令可以快速安裝最新的 miniconda,也可以去官方下載壓縮包,解壓並配置到 PATH 變數。
mkdir -p ~/miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm -rf ~/miniconda3/miniconda.sh
然後初始化
# 根據使用的不同 shell 選擇一個命令執行
~/miniconda3/bin/conda init bash
~/miniconda3/bin/conda init zsh
啟用
source ~/.bashrc
建立虛擬環境安裝 vLLM
建立虛擬環境並啟用
conda create -n vllm_py310 python=3.10
conda activate vllm_py310
# 配置 pip 源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/
pip config set install.trusted-host pypi.tuna.tsinghua.edu.cn
# 在虛擬環境中安裝 vllm 0.4.2 版本
pip install vllm==0.4.2
3. 準備模型
一般模型都會發布到 HuggingFace,不過國內網路情況,推薦到 ModelScope 下載。
主流的模型 vLLM 都是支援的,具體列表可以檢視官方文件:vllm-supported-models
這裡使用 Qwen1.5-1.8B-Chat 進行測試。
使用 git lfs 方式下載:
# 安裝並初始化 git-lfs
apt install git-lfs -y
git lfs install
# 下載模型
git lfs clone https://www.modelscope.cn/qwen/Qwen1.5-1.8B-Chat.git
完整內容如下:
root@j99cloudvm:~/lixd/models# ls -lhS Qwen1.5-1.8B-Chat/
total 3.5G
-rw-r--r-- 1 root root 3.5G Jul 18 11:20 model.safetensors
-rw-r--r-- 1 root root 6.8M Jul 18 11:08 tokenizer.json
-rw-r--r-- 1 root root 2.7M Jul 18 11:08 vocab.json
-rw-r--r-- 1 root root 1.6M Jul 18 11:08 merges.txt
-rw-r--r-- 1 root root 7.2K Jul 18 11:08 LICENSE
-rw-r--r-- 1 root root 4.2K Jul 18 11:08 README.md
-rw-r--r-- 1 root root 1.3K Jul 18 11:08 tokenizer_config.json
-rw-r--r-- 1 root root 662 Jul 18 11:08 config.json
-rw-r--r-- 1 root root 206 Jul 18 11:08 generation_config.json
-rw-r--r-- 1 root root 51 Jul 18 11:08 configuration.json
這個目錄包含了一個大模型的相關檔案。以下是每個檔案的作用簡要說明:
model.safetensors
:這是大模型的主要檔案,包含了模型的權重。tokenizer.json
:這個檔案包含了分詞器(Tokenizer)的配置和詞彙表。分詞器用於將輸入文字轉換為模型可以處理的格式,通常是數字 ID。tokenizer_config.json
:這個檔案包含了分詞器的配置選項,如分詞器的型別、引數設定等。config.json
:這個檔案包含了模型的配置引數,定義了模型的結構和訓練過程中的一些設定。它通常包括層數、隱藏單元數、啟用函式等引數。generation_config.json
:這個檔案包含了用於生成文字的配置引數,如生成長度、取樣策略等。configuration.json
:這個檔案通常是模型的額外配置檔案,可能包含與模型結構或訓練過程相關的配置資訊。vocab.json
:這個檔案包含了分詞器的詞彙表,通常是一個從詞彙到 ID 的對映表。分詞器使用這個檔案來將文字中的單詞轉換為模型可以處理的 ID。
一般只需要注意權重檔案和 tokenizer 即可。
4. 開始推理
啟動推理服務
vLLM 支援提供 OpenAI 格式的 API,啟動命令如下:
modelpath=/models/Qwen1.5-1.8B-Chat
# 單卡
python3 -m vllm.entrypoints.openai.api_server \
--model $modelpath \
--served-model-name qwen \
--trust-remote-code
輸出如下
INFO 07-18 06:42:31 llm_engine.py:100] Initializing an LLM engine (v0.4.2) with config: model='/models/Qwen1.5-1.8B-Chat', speculative_config=None, tokenizer='/models/Qwen1.5-1.8B-Chat', skip_tokenizer_init=False, tokenizer_mode=auto, revision=None, tokenizer_revision=None, trust_remote_code=True, dtype=torch.float16, max_seq_len=32768, download_dir=None, load_format=LoadFormat.AUTO, tensor_parallel_size=1, disable_custom_all_reduce=False, quantization=None, enforce_eager=False, kv_cache_dtype=auto, quantization_param_path=None, device_config=cuda, decoding_config=DecodingConfig(guided_decoding_backend='outlines'), seed=0, served_model_name=qwen)
INFO: Started server process [614]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
vLLM 預設監聽 8000 埠。
對於多卡則是增加引數 tensor-parallel-size
,將該引數設定為 GPU 數量即可,vLLM 會啟動 ray cluster 將模型切分到多個 GPU 上執行,對於大模型很有用。
python3 -m vllm.entrypoints.openai.api_server \
--model $modelpath \
--served-model-name qwen \
--tensor-parallel-size 8 \
--trust-remote-code
傳送測試請求
直接使用 OpenAI 格式請求
# model 就是前面啟動服務時的 served-model-name 引數
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "你是誰?"}
]
}'
輸出如下:
{"id":"cmpl-07f2f8c70bd44c10bba71d730e6e10a3","object":"chat.completion","created":1721284973,"model":"qwen","choices":[{"index":0,"message":{"role":"assistant","content":"我是來自阿里雲的大規模語言模型,我叫通義千問。我是阿里雲自主研發的超大規模語言模型,可以回答問題、創作文字,還能表達觀點、撰寫程式碼、撰寫故事,還能表達觀點、撰寫程式碼、撰寫故事。我被設計用來幫助使用者解答問題、創作文字、表達觀點、撰寫程式碼、撰寫故事,以及進行其他各種自然語言處理任務。如果您有任何問題或需要幫助,請隨時告訴我,我會盡力提供支援。"},"logprobs":null,"finish_reason":"stop","stop_reason":null}],"usage":{"prompt_tokens":22,"total_tokens":121,"completion_tokens":99}}
檢視 GPU 佔用情況,基本跑滿了
Thu Jul 18 06:45:32 2024
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.161.08 Driver Version: 535.161.08 CUDA Version: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 Tesla T4 On | 00000000:3B:00.0 Off | 0 |
| N/A 59C P0 69W / 70W | 12833MiB / 15360MiB | 84% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
| 1 Tesla T4 On | 00000000:86:00.0 Off | 0 |
| N/A 51C P0 30W / 70W | 4849MiB / 15360MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| 0 N/A N/A 3376627 C python3 12818MiB |
| 1 N/A N/A 1150487 C /usr/bin/python3 4846MiB |
+---------------------------------------------------------------------------------------+
5. 小結
本文主要分享如何使用 vLLM 來部署大模型推理服務, 安裝好環境後,vLLM 使用非常簡單,一條命令即可啟動。
modelpath=/models/Qwen1.5-1.8B-Chat
# 單卡
python3 -m vllm.entrypoints.openai.api_server \
--model $modelpath \
--served-model-name qwen \
--trust-remote-code
【Kubernetes 系列】持續更新中,搜尋公眾號【探索雲原生】訂閱,閱讀更多文章。