大模型推理指南:使用 vLLM 實現高效推理

探索云原生發表於2024-11-21

inference-by-vllm.png

本文主要分享如何使用 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 倍

vllm-performance.png

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 系列】持續更新中,搜尋公眾號【探索雲原生】訂閱,閱讀更多文章。


相關文章