1、问题说明

序号

基础软件

版本信息

1操作系统及版本redhat 8.8
2CPU架构x86
3GPU8*4090

本地化部署大模型满足AIChat使用,前期使用ollama方式部署的模型qwen72b在调用时一直返回为空白(AIChat需要大模型至少为 qwen2.5-72b-instrut),需要定位并给出解决方案。

2、Ollama方式部署大模型问题定位

一开始认为是部署的模型不是AIChat要求的,现场按要求通过ollama的方式部署了 qwen2.5-72b-instrut 但是结果依然是返回空白

经调研后发现ollama 下载的模型默认情况下都是经过量化的,比如我们通过如下命令下载qwen2.5-72b-instrut,但是其本质下载的是通过Q4方式量化后的模型,如果对模型精度要求不高则不会受太大影响,AIChat这类对模型要求比较高的则会出现类似的问题。

#ollama run qwen2.5:72b-instruct

经测试发现使下载了qwen2.5:72b-instruct-fp16(ollama中量化程度最大的) 模型也不满足AIChat需求,且ollama部署方式的大模型在并发上性能不好,决定使用vllm方式进行本地大模型的部署。

3、使用vllm方式部署本地大模型

使用vllm方式部署大模型,因为版本的原因遇到的坑还是比较多的,现把完整的部署文档整理如下:

环境名称版本信息
miniconda

python 3.9

pip 25

CUDA

12.4

PyTorch

2.6

flashinfer

0.2.5+cu124torch2.6
Flash Attention2.7.4.post1
vllm0.8.2

注:以下方式为服务器可以联通网络情况下直接安装的,如果是没有联通情况下的服务器,可以考虑找一台一样的可以联网的服务器创建一个python虚拟环境,把相关组件进行下载后拷贝到不能联网服务器进行安装。

3.1 安装miniconda(必选

3.1.1. 下载minconda

现场使用的redhat8.8 内置的python版本比较低,可以通过安装miniconda把python等相关组件进行升级安装,如果是其他版本服务器python版本满足>3.9要求, 可以直接安装对应版本的miniconda。

https://repo.anaconda.com/miniconda/

文档中要是用的python版本为3.9,则需要找到对应python3.9的miniconda安装包

Miniconda3-py39_25.1.1-2-Linux-x86_64.sh

3.1.2 安装minconda

#mkdir /smartbi

#cd /smartbi

#wget https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-2-Linux-x86_64.sh

#bash Miniconda3-py39_25.1.1-2-Linux-x86_64.sh -p /smartbi/conda_base

3.1.3. 配置conda环境变量

#echo 'export PATH="/smartbi/conda_base/bin:$PATH"' >> ~/.bashrc

#source ~/.bashrc

#bash

3.1.4. 查看环境

#python --version

#pip --version

3.1.5. 添加清华pip源

#pip config list

#pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

3.2 安装CUDA(可选

如果系统已经安装了CUDA则不用再重复安装了,本章节针对没有安装CUDA环境进行的,判断是否安装了CUDA,可以运行以下命令进行判断。

#nvcc --version

3.2.1. 下载CUDA12.4

在如下网站中找到对应的操作系统版本的安装方式:

https://developer.nvidia.com/cuda-12-4-0-download-archive?target_os=Linux

比如测试环境使用的是Ubuntu 22.04操作系统,则需要进行如下选择:

3.2.2.安装CUDA12.4

根据操作系统进行安装后会生成对应的安装命令执行即可。

3.2.3. 配置环境变量

#echo 'export LD_LIBRARY_PATH="/usr/local/cuda/lib"' >> ~/.bashrc

#echo 'export PATH="$PATH:/usr/local/cuda/bin"' >> ~/.bashrc

#source ~/.bashrc

3.2.4. 查看环境

#nvcc --version

3.3 关闭ECC可选

"ECC" 全称为 Error Checking and Correcting,表示是否开启错误检查和纠错技术,"0" 代表关闭,"1" 代表开启。

ECC 开启后功能可以用于保护 GPU 硬件,帮助其免受硬件故障和问题的影响。因为它还可以检查内存模块中的错误,并帮助 GPU 从错误中恢复。

此外,ECC 还有助于降低电力消耗,因为它只需要较少的功耗就可以处理大量的内存纠错;

ECC好处很多,但是会占用部分显存,在某些情况下可以进行关闭以释放。

4090显卡,24g开启ECC,能使用最大显存关闭ECC,能使用最大显存
24576MB23028MB24564MB

3.3.1. 查看ECC开启状态

#nvidia-smi -q -d ECC|grep -a2 "ECC Mode"

3.3.2. 关闭/开启ECC

#nvidia-smi -e 0

3.3.3. 重启服务器

#reboot

3.3.4. 查看ECC开启状态

#nvidia-smi -q -d ECC|grep -a2 "ECC Mode"

3.4 安装vllm及相关组件必选

3.4.1. 创建python虚拟环境

#cd /smartbi

#python3 -m venv vllm_env

#source vllm_env/bin/activate

3.4.2. 安装pytorch

https://pytorch.org/ 根据操作系统、CUDA12.4版本等相关信息找到对应的版本的pytorch的安装命令

#pip3 install torch torchvision torchaudio

3.4.3. 安装 flashinfer

https://flashinfer.ai/whl/中根据cuda12.4版本和pytorch2.6版本找到flashinfer对应的版本

#pip install flashinfer-python -i https://flashinfer.ai/whl/cu124/torch2.6/

3.4.4. 安装 Flash Attention(可选

需要下方链接中根据python3.9、cuda12.4版本和pytorch2.6版本找到对应的安装包

https://github.com/Dao-AILab/flash-attention/releases

#cd /smartbi

#wget https://github.com/Dao-AILab/flash-attention/releases/download/v2.7.4.post1/flash_attn-2.7.4.post1+cu12torch2.6cxx11abiFALSE-cp39-cp39-linux_x86_64.whl

#pip install flash_attn-2.7.4.post1+cu12torch2.6cxx11abiFALSE-cp39-cp39-linux_x86_64.whl

3.4.5. 安装 vllm

#pip install vllm

4、部署大模型

4.1. 下载模型

在阿里云魔塔社区找到需要的大模型(下方以Qwen2.5-0.5B-Instruct为例,现场实际下载的为Qwen2.5-72B-Instruct)

https://modelscope.cn/models/

#pip install modelscope

#测试模型

#modelscope download --model Qwen/Qwen2.5-0.5B-Instruct

#现场实际下载模型

#modelscope download --model Qwen/Qwen2.5-72B-Instruct

默认会下载到 /root/.cache/modelscope/hub/models/

4.2. 配置VLLM环境变量

#echo 'export CUDA_VISIBLE_DEVICES=0' >> ~/.bashrc

#echo 'export VLLM_USE_V1=0' >> ~/.bashrc

#source ~/.bashrc

CUDA_VISIBLE_DEVICES 是一个环境变量,它用于控制哪些 GPU 设备对 CUDA 应用程序可见,通常需要把所有GPU都配置上,以上样例中只配置了1个做验证,比如有8个GPU配置成

CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7

VLLM_USE_V1 高版本vllm默认启用V1引擎,性能更好,但是对内存要求更高,如果需要运行高质量大模型需要配置VLLM_USE_V1=0,使用V0引擎,否则会导致无法启动模型。

4.3. 启动大模型

#python -m vllm.entrypoints.openai.api_server --model="/root/.cache/modelscope/hub/models/Qwen/Qwen2.5-0.5B-Instruct" --tensor-parallel-size 1 --gpu-memory-utilization 0.9 --max-model-len 30000

--model="/root/.cache/modelscope/hub/models/Qwen/Qwen2.5-0.5B-Instruct" :指定模型路径

--tensor-parallel-size 1 :张量并行副本的数量,需要配置和GPU数量一样,必须要配置和GPU数量一样

--gpu-memory-utilization 0.9:用于模型执行的GPU内存占用比例,默认0.9。

--max-model-len 30000 :--max-model-len 参数是配置模型上下文长度,减少-max-model-len可以提升处理请求的性能,但是如果-max-model-len配置过小,会导致AIChat请求时提升异常。

5、压测大模型

大模型部署完毕之后,相关参数如何调整才能确定为当前环境最优就需要使用压测手段进行测试验证,vllm自带压测脚本是目前比较通用的基准测试方案,下方为基于vllm自带测试脚本的压测方案。

5.1. 下载基准测试脚本

#cd /smartbi

#git clone https://github.com/vllm-project/vllm.git

5.2. 下载测试数据集

#cd /smartbi

# wget "https://modelscope.cn/datasets/gliang1001/ShareGPT_V3_unfiltered_cleaned_split/resolve/master/ShareGPT_V3_unfiltered_cleaned_split.json"

5.3. 基准测试

#pip install pandas

#pip install datasets

#pip install nvitop

5.3.1 GPU资源消耗监控

运行nvitop查看GPU资源消耗情况统计

5.3.2 基准测试

#python3 vllm/benchmarks/benchmark_serving.py --backend vllm --model="/root/.cache/modelscope/hub/models/Qwen/Qwen2.5-0.5B-Instruct" --dataset-name sharegpt --dataset-path /smartbi/ShareGPT_V3_unfiltered_cleaned_split.json --request-rate inf --num-prompts 10

--num-prompts 10 指的是10并发,压测后会生成对应的测试结果,可以进行横向对比。

--num-prompts 10并发时指标情况

--num-prompts 100并发时指标情况

测试指标参考如下说明:

TFFT (Time to First Token)
- 全称:Time to First Token
- 含义:生成第一个token所需的时间
- 单位:秒
- 特点:反映模型的初始响应速度,数值越小表示用户等待第一个响应的时间越短

TPOT (Time Per Output Token)
- 全称:Time Per Output Token
- 含义:生成每个输出token的平均时间
- 单位:秒/token
- 特点:反映模型持续生成文本的速度,数值越小表示生成速度越快

总吞吐 (Total Throughput)
- 含义:系统在单位时间内能够处理的token总数
- 单位:tokens/秒
- 特点:衡量系统整体处理能力,数值越大表示系统效率越高

TPS (Token Per Second)
- 全称: Token Per Second
- 含义:系统每秒能够处理的token数量
- 单位:token/秒
- 特点:反映系统并发处理能力,数值越大表示系统性能越好,这是TPOT的倒数