基于NVIDIA A30 加速卡推理部署通义千问-72B-Chat测试过程

本文涉及的产品
视觉智能开放平台,视频资源包5000点
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
简介: 本文介绍了基于阿里云通义千问72B大模型(Qwen-72B-Chat)的性能基准测试,包括测试环境准备、模型部署、API测试等内容。测试环境配置为32核128G内存的ECS云主机,配备8块NVIDIA A30 GPU加速卡。软件环境包括Ubuntu 22.04、CUDA 12.4.0、PyTorch 2.4.0等。详细介绍了模型下载、部署命令及常见问题解决方法,并展示了API测试结果和性能分析。

一、测试环境准备
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
image.png
图1:CUDA与NVIDIA驱动对应版本
image.png
图2: NVIDIA-Dirvier 550.54.15
image.png
图3: 驱动支持的NVIDIA GPU卡型号
image.png
图4:NVIDIA-550.54.15驱动支持的Linux操作系统版本
1.3 安装 NVIDIA 驱动、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文件。

image.png

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版本

image.png
image.png
image.png
注意: pytorch 需要与 cuda python 版本对应,如下图6:
image.png

1.4 查看GPU摘要信息
image.png

二、大模型之-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)主要有以下特点:

  1. 大规模高质量训练语料:使用超过3万亿tokens的数据进行预训练,包含高质量中、英、多语言、代码、数学等数据,涵盖通用及专业领域的训练语料。通过大量对比实验对预训练语料分布进行了优化。
  2. 强大的性能:Qwen-72B在多个中英文下游评测任务上(涵盖常识推理、代码、数学、翻译等),效果显著超越现有的开源模型。具体评测结果请详见下文。
  3. 覆盖更全面的词表:相比目前以中英词表为主的开源模型,Qwen-72B使用了约15万大小的词表。该词表对多语言更加友好,方便用户在不扩展词表的情况下对部分语种进行能力增强和扩展。
  4. 更长的上下文支持: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'

image.png
模型总大小 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

部署成功:
image.png
image.png

查看 GPU 运行显存、功耗、进程等概况信息:
image.png

三、大模型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)测试结果:
服务端测试响应:

image.png

客户端回答结果:

image.png

(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
}

image.png

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大模型推理部署测试结果,可以从以下几个指标分析系统的性能和效率:

  1. Prompt吞吐量:Avg prompt throughput 9.6 tokens/s,表明在输入初期有一定的prompt处理速度;
  2. 生成吞吐量(Throughput):Avg generation throughput 27.3,表示系统生成响应的速度为每秒生成27.3个token;
  3. KV缓存使用率:在推理过程中,GPU KV缓存的使用率逐渐增加,从0.8%上升到10.9%。这表明随着推理过程的进行,模型需要在GPU中存储更多的中间状态数据,但增长率稳定且控制在低水平,说明缓存管理较为高效。
  4. 请求处理状态:
    • Running requests: 只有1个请求在处理(Running: 1 reqs);
    • Pending:没有带处理的状态(Pending: 0 reqs);
    • Swapped requests:被交换出去的请求(Swapped: 0 reqs);

测试结果统计
image.png

(4)显存占用情况:
显存使用情况,可用通过nvidia-smi 工具搜集GPU加速卡概况信息中查看,情况见下图:
(1)测试前:8张GPU卡显存使用均为0MB;
(2)测试中:8张GPU卡平均显存使用为 21441.25MB;

image.png

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
相关文章
|
2月前
|
人工智能 自动驾驶 云栖大会
大模型赋能智能座舱,NVIDIA 深度适配通义千问大模型
9月20日杭州云栖大会上, NVIDIA DRIVE Orin系统级芯片实现了与阿里云通义千问多模态大模型Qwen2-VL的深度适配。阿里云、斑马智行联合NVIDIA英伟达推出舱驾融合大模型解决方案,基于通义大模型开发“能听会看”的智能座舱助理,让车内人员通过语音交流就能操作座舱内的各类应用,享受极致丰富的交互体验。
224 14
|
1月前
|
机器学习/深度学习 编解码 监控
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章详细介绍了如何使用YOLOv8进行目标检测任务,包括环境搭建、数据准备、模型训练、验证测试以及模型转换等完整流程。
1098 1
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
1月前
|
计算机视觉
目标检测笔记(二):测试YOLOv5各模块的推理速度
这篇文章是关于如何测试YOLOv5中不同模块(如SPP和SPPF)的推理速度,并通过代码示例展示了如何进行性能分析。
80 3
|
1月前
|
机器学习/深度学习 监控 计算机视觉
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
本文介绍了如何使用YOLOv7进行目标检测,包括环境搭建、数据集准备、模型训练、验证、测试以及常见错误的解决方法。YOLOv7以其高效性能和准确率在目标检测领域受到关注,适用于自动驾驶、安防监控等场景。文中提供了源码和论文链接,以及详细的步骤说明,适合深度学习实践者参考。
289 0
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
1月前
|
机器学习/深度学习 并行计算 数据可视化
目标分类笔记(二): 利用PaddleClas的框架来完成多标签分类任务(从数据准备到训练测试部署的完整流程)
这篇文章介绍了如何使用PaddleClas框架完成多标签分类任务,包括数据准备、环境搭建、模型训练、预测、评估等完整流程。
80 0
目标分类笔记(二): 利用PaddleClas的框架来完成多标签分类任务(从数据准备到训练测试部署的完整流程)
|
1月前
|
机器学习/深度学习 数据采集 算法
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
这篇博客文章介绍了如何使用包含多个网络和多种训练策略的框架来完成多目标分类任务,涵盖了从数据准备到训练、测试和部署的完整流程,并提供了相关代码和配置文件。
46 0
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
|
1月前
|
机器学习/深度学习 XML 并行计算
目标检测实战(七): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章介绍了如何使用YOLOX完成图像目标检测任务的完整流程,包括数据准备、模型训练、验证和测试。
150 0
目标检测实战(七): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
1月前
|
Ubuntu API Python
Chat-TTS chat-tts-ui 实机部署上手测试!Ubuntu服务器实机 2070Super*2 8GB部署全流程
Chat-TTS chat-tts-ui 实机部署上手测试!Ubuntu服务器实机 2070Super*2 8GB部署全流程
65 1
|
1月前
|
前端开发 JavaScript 应用服务中间件
linux安装nginx和前端部署vue项目(实际测试react项目也可以)
本文是一篇详细的教程,介绍了如何在Linux系统上安装和配置nginx,以及如何将打包好的前端项目(如Vue或React)上传和部署到服务器上,包括了常见的错误处理方法。
256 0
linux安装nginx和前端部署vue项目(实际测试react项目也可以)
|
2月前
|
Kubernetes Linux API
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇
该博客文章详细介绍了在CentOS 7.6操作系统上使用kubeadm工具部署kubernetes 1.17.2版本的测试集群的过程,包括主机环境准备、安装Docker、配置kubelet、初始化集群、添加节点、部署网络插件以及配置k8s node节点管理api server服务器。
116 0
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇