序号 | 基础软件 | 版本信息 |
---|---|---|
1 | 操作系统及版本 | redhat 8.8 |
2 | CPU架构 | x86 |
3 | GPU | 8*4090 |
本地化部署大模型满足AIChat使用,前期使用ollama方式部署的模型qwen72b在调用时一直返回为空白(AIChat需要大模型至少为 qwen2.5-72b-instrut),需要定位并给出解决方案。
一开始认为是部署的模型不是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部署方式的大模型在并发上性能不好,项目中不推荐使用ollama的方式进行模型部署。
使用vllm方式部署大模型是目前业界比较通用的部署方案,但是因为版本的原因导致实际部署过程中遇到的坑还是比较多的,现把完整的部署文档整理如下,供项目参考:
环境名称 | 版本信息 |
---|---|
miniconda | python 3.9 pip 25 |
CUDA | 12.4 |
PyTorch | 2.6 |
flashinfer | 0.2.5+cu124torch2.6 |
Flash Attention | 2.7.4.post1 |
vllm | 0.8.2 |
注:以下方式为服务器可以联通网络情况下直接安装的,如果是没有联通情况下的服务器,可以考虑找一台一样的可以联网的服务器创建一个python虚拟环境,把相关组件进行下载后拷贝到不能联网服务器进行安装。
现场使用的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
#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 |
---|
#echo 'export PATH="/smartbi/conda_base/bin:$PATH"' >> ~/.bashrc #source ~/.bashrc #bash |
---|
#python --version #pip --version |
---|
#pip config list #pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple |
---|
如果系统已经安装了CUDA则不用再重复安装了,本章节针对没有安装CUDA环境进行的,判断是否安装了CUDA,可以运行以下命令进行判断。
#nvcc --version
在如下网站中找到对应的操作系统版本的安装方式:
https://developer.nvidia.com/cuda-12-4-0-download-archive?target_os=Linux
比如测试环境使用的是Ubuntu 22.04操作系统,则需要进行如下选择:
根据操作系统进行安装后会生成对应的安装命令执行即可。
#echo 'export LD_LIBRARY_PATH="/usr/local/cuda/lib"' >> ~/.bashrc #echo 'export PATH="$PATH:/usr/local/cuda/bin"' >> ~/.bashrc #source ~/.bashrc |
---|
#nvcc --version |
---|
"ECC" 全称为 Error Checking and Correcting,表示是否开启错误检查和纠错技术,"0" 代表关闭,"1" 代表开启。
ECC 开启后功能可以用于保护 GPU 硬件,帮助其免受硬件故障和问题的影响。因为它还可以检查内存模块中的错误,并帮助 GPU 从错误中恢复。
此外,ECC 还有助于降低电力消耗,因为它只需要较少的功耗就可以处理大量的内存纠错;
ECC好处很多,但是会占用部分显存,在某些情况下可以进行关闭以释放。
4090显卡,24g | 开启ECC,能使用最大显存 | 关闭ECC,能使用最大显存 |
---|---|---|
24576MB | 23028MB | 24564MB |
#nvidia-smi -q -d ECC|grep -a2 "ECC Mode" |
---|
#nvidia-smi -e 0 |
---|
#reboot |
---|
#nvidia-smi -q -d ECC|grep -a2 "ECC Mode" |
---|
#cd /smartbi #python3 -m venv vllm_env #source vllm_env/bin/activate |
---|
在https://pytorch.org/ 根据操作系统、CUDA12.4版本等相关信息找到对应的版本的pytorch的安装命令
#pip3 install torch torchvision torchaudio |
---|
在https://flashinfer.ai/whl/中根据cuda12.4版本和pytorch2.6版本找到flashinfer对应的版本
#pip install flashinfer-python -i https://flashinfer.ai/whl/cu124/torch2.6/ |
---|
需要下方链接中根据python3.9、cuda12.4版本和pytorch2.6版本找到对应的安装包
https://github.com/Dao-AILab/flash-attention/releases
#cd /smartbi #pip install flash_attn-2.7.4.post1+cu12torch2.6cxx11abiFALSE-cp39-cp39-linux_x86_64.whl |
---|
#pip install vllm |
---|
在阿里云魔塔社区找到需要的大模型(下方以Qwen2.5-0.5B-Instruct为例,现场实际下载的为Qwen2.5-72B-Instruct)
#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/
#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引擎,否则会导致无法启动模型。
#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请求时提升异常。
大模型部署完毕之后,相关参数如何调整才能确定为当前环境最优就需要使用压测手段进行测试验证,vllm自带压测脚本是目前比较通用的基准测试方案,下方为基于vllm自带测试脚本的压测方案。
#cd /smartbi #git clone https://github.com/vllm-project/vllm.git |
---|
#cd /smartbi |
---|
#pip install pandas #pip install datasets #pip install nvitop |
---|
运行nvitop查看GPU资源消耗情况统计
#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的倒数