一、测试环境准备
1.1硬件信息
ECS 云主机配置: 32核心 128G内存 400G SSD硬盘
GPU加速卡:NVIDIA A30 * 8
半精度:165 TFLOPS
显存:24G
1.2 系统软件环境要求
要求:根据NVIDIA官方给出的驱动版本安装对应的CUDA及对应软件包环境。参考如下图1:
操作系统: Ubuntu-22.04
Kernel: 6.5.0-27
Python 3.11
gcc版本:12.3
NVIDIA驱动版本:NVIDIA-Linux-x86_64-550.54.15
CUDA 版本:cuda_12.4.0_550.54.15
Pytorch:2.4.0
图1:CUDA与NVIDIA驱动对应版本
图2: NVIDIA-Dirvier 550.54.15
图3: 驱动支持的NVIDIA GPU卡型号
图4:NVIDIA-550.54.15驱动支持的Linux操作系统版本
1.3 安装 NVIDIA 驱动、CUDA及Pytorch
驱动下载址:
CUDA软件平台架构安装包下载地址:
- Pytorch:
驱动安装命令:
chmod +x NVIDIA-Linux-x86_64-550.54.15.run
sudo ./NVIDIA-Linux-x86_64-550.54.15.run -no-x-check -no-nouveau-check -no-opengl-files
-no-x-check: 安装时关闭X服务;
-no-nouveau-check: 安装时禁用nouveau;
-no-opengl-files: 只安装驱动文件,不安装OpenGL文件。
CUDA安装命令:
wget https://developer.download.nvidia.com/compute/cuda/12.0.0/local_installers/cuda_12.4.0_550.54.15_linux.run
# sudo sh cuda_12.4.0_550.54.15_linux.run
# nvcc -V ##查看 CUDA版本
注意: pytorch 需要与 cuda python 版本对应,如下图6:
1.4 查看GPU摘要信息
二、大模型之-Qwen1.5-72B-chat部署
本次我们主要基于通义千问72B大模型进行性能基准测试,包括模型下载、环境设置、使用 vLLM框架进行推理的方法,以及本地部署参数及常见问题,特别是关于显存管理和API测试的详细说明。
2.1 Qwen介绍
(1) 模型细节
通义千问-72B(Qwen-72B)是阿里云研发的通义千问大模型系列的720亿参数规模的模型。Qwen-72B是基于Transformer的大语言模型, 在超大规模的预训练数据上进行训练得到。预训练数据类型多样,覆盖广泛,包括大量网络文本、专业书籍、代码等。同时,在Qwen-72B的基础上,我们使用对齐机制打造了基于大语言模型的AI助手Qwen-72B-Chat。本仓库为Qwen-72B-Chat的仓库。
(2)通义千问-72B(Qwen-72B)主要有以下特点:
- 大规模高质量训练语料:使用超过3万亿tokens的数据进行预训练,包含高质量中、英、多语言、代码、数学等数据,涵盖通用及专业领域的训练语料。通过大量对比实验对预训练语料分布进行了优化。
- 强大的性能:Qwen-72B在多个中英文下游评测任务上(涵盖常识推理、代码、数学、翻译等),效果显著超越现有的开源模型。具体评测结果请详见下文。
- 覆盖更全面的词表:相比目前以中英词表为主的开源模型,Qwen-72B使用了约15万大小的词表。该词表对多语言更加友好,方便用户在不扩展词表的情况下对部分语种进行能力增强和扩展。
- 更长的上下文支持:Qwen-72B支持32k的上下文长度。
系统指令跟随:Qwen-72B-Chat可以通过调整系统指令,实现角色扮演,语言风格迁移,任务设定,和行为设定等能力。
2.2 Qwen72B模型部署环境和硬件要求
(1)硬件环境要求:
- 运行BF16或FP16模型需要多卡至少144GB显存
- 运行Int4模型至少需要48GB显存
- 支持的显卡:
- Tesla A100 40GB/ 80GB
- Tesla A800 40GB/80GB
- Tesla H100 80GB
- Tesla H800 80GB
- Tesla L40 48GB
- Tesla A40 48GB
- Tesla A30 24GB
- Tesla A10 24G
- Tesla A16 64G
- RTX 6000 Ada 48G
- RTX A6000 48G
- RTX A5500 24G
- RTX A5000 24G
- RTX 8000 48G
(2)软件环境:
python 3.8及以上版本
pytorch 1.12及以上版本,推荐2.0及以上版本
建议使用CUDA 11.4及以上(GPU用户、flash-attention用户等需考虑此选项)
vLLM(Virtualized Language Learning Model)是一种用于自然语言处理(NLP)的模型架构或框架,旨在提高大规模语言模型(如GPT等)的性能和效率。vLLM安装版本0.6.2 。
2.3 下载大模型(魔塔)
qwen/Qwen1.5-72B-Chat为模型的ID,当前国内主要可以在魔搭社区和HuggingFace下载。
魔塔: https://modelscope.cn/models/qwen/Qwen-72B/summary
HuggingFace: https://huggingface.co/Qwen/Qwen1.5-72B-Chat
这里,我们通过魔塔工具命令进行模型下载:
# 安装 modeslcope命令
pip install modelscope
# 使用 modelscope下载整个模型
mkdir Qweb-download-cache
modelscope download --model 'Qwen/Qwen1.5-72B-Chat' --cache_dir './Qweb-download-cache' --local_dir './Qweb-download-cache'
## 参数选项###
--model 'Qwen/Qwen1.5-72B-Chat' ##指定下载的模型;
--cache_dir './Qweb-download-cache' ##指定下载的cache_dir,模型文件将被下载到cache_dir/Qwen/Qwen1.5-72B-Chat;
--local_dir '/data/llm-test' ##指定下载的模型存放目录,模型文件将被下载到./local_dir/下;
#下载模型
modelscope download --model 'Qwen/Qwen1.5-72B-Chat' --local_dir '/data/llm-test/Qwen-download'
模型总大小 135GB
2.5 使用 vLLM 本地部署 Qwen1.5-72B-Chat
(1)官方部署方式
python -m vllm.entrypoints.openai.api_server --model Qwen/Qwen1.5-7B-Chat
(2)本地化部署命令 (踩坑测试)
#备注:8卡A30 ,cuda12.4
python -m vllm.entrypoints.openai.api_server --host 0.0.0.0 --port 8000 --gpu-memory-utilization 0.9 --max-model-len 29856 --model Qwen1.5-72B-Chat --tensor-parallel-size 8
参数说明:
- --host 0.0.0.0 # 模型运行监听IP地址
- --port 18000 # 监听端口
- --gpu-memory-utilization 0.9 # 占用GPU 内存比例;
- --max-model-len 29856 # 上下文长度
- --model Qwen1.5-72B-Chat # 指定文件位置
- --tensor-parallel-size 8 # 指定8张卡运行大模型
(3)常见问题:
在模型推理过程中,最容易出现 OOM内存溢出问题,可以尝试修改两个参数。第一个参数是--max-model-len,我们提供的默认最大位置嵌入 (max_position_embedding) 为 32768, 因此服务时的最大长度也是这个值;这样会导致更高的内存需要。
因此,将此值适当的减小,通常有助于解决 OOM 问题。 第二个参数是 --gpu-memory-utilization。 默认情况下,该值是0.9 ,我们可以将其调高以应对 OOM 问题。 这也是为什么 LLM (大语言模型)服务总是占用大量内存的原因。
问题例1:The model's max seq len (29856) is larger than the maximum number of tokens that can be stored in KV cache (3936). Try increasing gpu_memory_utilization
or decreasing max_model_len
when initializing the engine., Traceback (most recent call last):
原因分析:
出现该问题的原因主要是因为模型的最大序列长度(29856)超出了 KV 缓存所能支持的最大令牌数(3936)。在推理过程中,KV 缓存用于存储中间计算结果,以加速模型推理,但其容量有限。当输入的序列长度超过该限制时,就会导致报错。因此,确保模型的输入长度在 KV 缓存的范围内是关键。
解决方案:
- 设置合理的 --max-model-len:建议将其设置为 3936 或更低,以避免 KV 缓存错误。
- 调整 --gpu-memory-utilization:可以设置为较低值,例如 0.8,以确保在推理过程中有足够的显存余量。
- 使用合适的张量并行度:确保 --tensor-parallel-size 设置为 8,这样可以充分利用所有 GPU。
- 安装 vllm-flash-attn
优化后的推理部署命令:
python -m vllm.entrypoints.openai.api_server \
--host 0.0.0.0 \
--port 8000 \
--gpu-memory-utilization 0.9 \
--max-model-len 1024 \
--model Qwen1.5-72B-Chat \
--tensor-parallel-size 8
部署成功:
查看 GPU 运行显存、功耗、进程等概况信息:
三、大模型API测试
3.1 API提问测试
(1)API提问测试
curl --location --request POST 'http://127.0.0.1:8000/v1/chat/completions' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
--header 'Content-Type: application/json' \
--data-raw '{
"model": "Qwen1.5-72B-Chat",
"messages": [
{
"role": "user",
"content": "帮我写一个PPT大纲,要10个章节,每个章节有3个小标题,PPT的主题是《AI的应用与发展》"
}
]
}'
(2)测试结果:
服务端测试响应:
客户端回答结果:
(3)JSON格式化输出结果:
{
"id": "chat-622a4bd175154ba69d94af454db21144",
"object": "chat.completion",
"created": 1728452929,
"model": "Qwen1.5-72B-Chat",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "一、引言\n1.1 什么是AI(人工智能)\n1.2 AI的历史发展\n1.3 AI在现代生活中的重要性\n\n二、AI的基础技术\n2.1 机器学习\n2.1.1 监督学习\n2.1.2 无监督学习\n2.1.3 强化学习\n2.2 人工智能算法\n2.2.1 决策树\n2.2.2 神经网络\n2.2.3 支持向量机\n2.3 大数据与云计算在AI中的作用\n2.3.1 大数据的定义与应用\n2.3.2 云计算的原理与功能\n2.3.3 大数据与云计算的结合\n\n三、AI在工业领域的应用\n3.1 智能制造\n3.1.1 自动化生产线\n3.1.2 预测性维护\n3.1.3 质量控制\n3.2 工业机器人\n3.2.1 机器人在生产线上的角色\n3.2.2 服务机器人\n3.2.3 未来发展趋势\n\n四、AI在医疗领域的应用\n4.1 诊断辅助\n4.1.1 影像识别\n4.1.2 病理分析\n4.1.3 个性化医疗\n4.2 患者管理\n4.2.1 健康监测\n4.2.2 远程医疗\n4.2.3 患者咨询服务\n\n五、AI在教育领域的应用\n5.1 智能教学\n5.1.1 个性化学习路径\n5.1.2 人工智能教师\n5.1.3 在线评估系统\n5.2 教育管理\n5.2.1 学生行为分析\n5.2.2 资源推荐\n5.2.3 教学资源的智能化\n\n六、AI在交通领域的应用\n6.1 自动驾驶\n6.1.1 无人驾驶汽车\n6.1.2 无人机配送\n6.1.3 智能交通管理\n6.2 交通预测与规划\n6.2.1 交通流量预测\n6.2.2 交通路线优化\n6.2.3 共享出行服务\n\n七、AI在金融领域的应用\n7.1 风险评估\n7.1.1 信用评级\n7.1.2 诈骗检测\n7.1.3 投资策略\n7.2 金融服务\n7.2.1 个性化理财\n7.2.2 自动化交易\n7.2.3 无人银行\n\n八、AI在娱乐领域的应用\n8.1 个性化推荐\n8.1.1 视频推荐\n8.1.2 音乐推荐\n8.1.3 游戏AI\n8.2 虚拟现实与增强现实\n8.2.1 VR/AR技术\n8.2.2 内容创造\n8.2.3 互动体验\n\n九、AI的伦理与挑战\n9.1 隐私保护\n9.1.1 数据安全\n9.1.2 用户隐私\n9.2 工作岗位影响\n9.2.1 自动化失业\n9.2.2 职业转型\n9.3 AI决策的透明度与公平性\n\n十、AI的未来展望\n10.1 AI技术的持续创新\n10.1.1 量子计算\n10.1.2 量子人工智能\n10.2 AI的社会影响\n10.2.1 社会结构变化\n10.2.2 全球化趋势\n10.3 人与AI的共生\n10.3.1 人机合作\n10.3.2 AI伦理法规建设\n10.3.3 AI教育与培训的必要性",
"tool_calls": []
},
"logprobs": null,
"finish_reason": "stop",
"stop_reason": null
}
],
"usage": {
"prompt_tokens": 48,
"total_tokens": 917,
"completion_tokens": 869
},
"prompt_logprobs": null
}
API测试结果分析:
INFO 10-09 13:48:49 logger.py:36] Received request chat-622a4bd175154ba69d94af454db21144: prompt: '<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n<|im_start|>user\n帮我写一个PPT大纲,要10个章节,每个章节有3个小标题,PPT的主题是《AI的应用与发展》<|im_end|>\n<|im_start|>assistant\n', params: SamplingParams(n=1, best_of=1, presence_penalty=0.0, frequency_penalty=0.0, repetition_penalty=1.0, temperature=0.7, top_p=1.0, top_k=-1, min_p=0.0, seed=None, use_beam_search=False, length_penalty=1.0, early_stopping=False, stop=[], stop_token_ids=[], include_stop_str_in_output=False, ignore_eos=False, max_tokens=976, min_tokens=0, logprobs=None, prompt_logprobs=None, skip_special_tokens=True, spaces_between_special_tokens=True, truncate_prompt_tokens=None), prompt_token_ids: [151644, 8948, 198, 2610, 525, 264, 10950, 17847, 13, 151645, 198, 151644, 872, 198, 108965, 61443, 46944, 47, 2828, 116472, 3837, 30534, 16, 15, 18947, 113066, 3837, 103991, 113066, 18830, 18, 110026, 60396, 3837, 47, 2828, 109151, 20412, 26940, 15469, 106736, 111636, 25067, 151645, 198, 151644, 77091, 198], lora_request: None, prompt_adapter_request: None.
INFO 10-09 13:48:49 engine.py:288] Added request chat-622a4bd175154ba69d94af454db21144.
INFO 10-09 13:48:50 metrics.py:351] Avg prompt throughput: 9.6 tokens/s, Avg generation throughput: 2.2 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 0.8%, CPU KV cache usage: 0.0%.
INFO 10-09 13:48:55 metrics.py:351] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 27.3 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 2.5%, CPU KV cache usage: 0.0%.
INFO 10-09 13:49:00 metrics.py:351] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 27.3 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 4.1%, CPU KV cache usage: 0.0%.
INFO 10-09 13:49:05 metrics.py:351] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 27.3 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 5.8%, CPU KV cache usage: 0.0%.
INFO 10-09 13:49:10 metrics.py:351] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 27.3 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 7.4%, CPU KV cache usage: 0.0%.
INFO 10-09 13:49:15 metrics.py:351] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 27.3 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 9.1%, CPU KV cache usage: 0.0%.
INFO 10-09 13:49:20 metrics.py:351] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 27.3 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 10.9%, CPU KV cache usage: 0.0%.
根据上述Qwen-72B-chat大模型推理部署测试结果,可以从以下几个指标分析系统的性能和效率:
- Prompt吞吐量:Avg prompt throughput 9.6 tokens/s,表明在输入初期有一定的prompt处理速度;
- 生成吞吐量(Throughput):Avg generation throughput 27.3,表示系统生成响应的速度为每秒生成27.3个token;
- KV缓存使用率:在推理过程中,GPU KV缓存的使用率逐渐增加,从0.8%上升到10.9%。这表明随着推理过程的进行,模型需要在GPU中存储更多的中间状态数据,但增长率稳定且控制在低水平,说明缓存管理较为高效。
- 请求处理状态:
- Running requests: 只有1个请求在处理(Running: 1 reqs);
- Pending:没有带处理的状态(Pending: 0 reqs);
- Swapped requests:被交换出去的请求(Swapped: 0 reqs);
测试结果统计
(4)显存占用情况:
显存使用情况,可用通过nvidia-smi 工具搜集GPU加速卡概况信息中查看,情况见下图:
(1)测试前:8张GPU卡显存使用均为0MB;
(2)测试中:8张GPU卡平均显存使用为 21441.25MB;