【昇腾推理】使用 vLLM 运行大语言模型
距离上次认真写点什么已经近两个月了,咕咕真是抱歉呐……下次还敢!
回看此前的文章,实在不甚满意。未来的博文将会更注重 实用性 和 简洁明了,不再事无巨细地描述每一个细节。希望能给未来翻阅的自己留下些真正有用的宝藏,当然也希望能给你带来更好的阅读体验。
前言
这是昇腾推理系列文章的第一篇,在这个系列中我将会依次记录三个目前主流的大语言模型推理实现方式在昇腾环境下的部署过程,依次是 vLLM(针对非 GGUF 模型)
、Llama Box(GPUStack,针对 GGUF 模型)
以及华为昇腾生态中的 MindIE
框架。
本文主要针对在 昇腾 910B2
NPU + 鲲鹏 920
Arm CPU 的环境下,进行 vLLM 后端的大语言模型推理部署。选用的设备和环境、主要软件如下:
- 硬件环境:AutoDL 910B2 + 鲲鹏 920 实例
- 系统环境:Ubuntu 22.04 镜像
- CANN:8.0.0
- 选用模型:Qwen 3 32B
- vLLM:0.8.4
- vLLM-Ascend:0.8.4rc2
事先剧透一下,最终运行的速度堪忧,四卡和双卡跑起来都是 8 tps,CANN 发展任重道远啊(个人认为不是你 MindIE 去发展,就不用去优化现有主流框架了的)
相关信息
看到 AutoDL,有经验的读者大概就意识到了一件事,我们的部署环境是没有容器可用的。AutoDL 提供的实例是一个 Docker 容器,Docker in Docker 是很复杂有时甚至不可能的事。 因此我们的全部部署都是基于本机部署的。
我们会按照如下顺序进行:
部署流程
基础环境
我们需要对环境进行一些基础配置,请按需检查以下检查单:
提示
如果使用 AutoDL 基础镜像,镜像中是已经安装好所有 CANN 相关和 Conda 的,只需要初始化一下建个环境就行了。甚至可以不建环境,但这并不是最佳实践。
昇腾环境驱动和固件
# 使用 npu-smi 检查昇腾驱动
# 应当输出类似 nvidia-smi 的 NPU 硬件信息
npu-smi info
若未安装,参阅安装NPU驱动和固件。
CANN 工具包和 Kernel
# 检查 CANN 工具包版本(默认安装位置)
cat /usr/local/Ascend/ascend-toolkit/latest/version.cfg
cat /usr/local/Ascend/ascend-toolkit/latest/version.cfg | grep opp
请参阅安装CANN(物理机场景)。
Conda
对于实践来说,我当然是建议使用一个虚拟环境管理器的,你可以选用 Conda、uv、venv 等等。这里我们使用 Conda 来管理环境。
安装 Anaconda 或 Miniconda,参见Anaconda。AutoDL 实例的基础镜像是已包含 Miniconda 的。
# 安装后,初始化 Conda
conda init
# 创建一个环境
# 注意,vllm-Ascend 需要 python >= 3.9 且 < 3.12,推荐使用 3.10
conda create -n vllm python=3.10
# 激活环境
# conda activate vllm
下载模型
本章不过多赘述,简单过一下魔搭下载所需模型(AutoDL 昇腾实例尚不支持学术加速)。
已下载模型请前往下一部分。
# conda activate vllm
# 安装魔搭
pip install modelscope
# 下载到数据盘
modelscope download --model Qwen/Qwen-3-32B --include "*.*" --local-dir /root/autodl-tmp/
构建和安装 vLLM
依赖
# 若使用 AutoDL,注意不要随意修改 AutoDL 实例的 apt 源,改了可能用不了
apt-get update
apt install -y gcc g++ cmake libnuma-dev wget git
vLLM
# 使用 0.8.4 版本的 vLLM,从源码构建
git clone --depth 1 --branch v0.8.4 https://github.com/vllm-project/vllm
cd vllm
VLLM_TARGET_DEVICE=empty pip install -v -e .
安装 vLLM-Ascend
pip install vllm-ascend==0.8.4rc2
运行
通常来说,到这一步都没有错的话就可以直接用了。实际使用是无感的,当成 Cuda 环境用就行(注意 Ascend 设备是没有 bf16 支持的)。
Ascend 插件官方建议跑一个简单的测试:
from vllm import LLM, SamplingParams
prompts = [
"Hello, my name is",
"The president of the United States is",
"The capital of France is",
"The future of AI is",
]
# Create a sampling params object.
sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
# Create an LLM.
llm = LLM(model="Qwen/Qwen2.5-0.5B-Instruct")
# Generate texts from the prompts.
outputs = llm.generate(prompts, sampling_params)
for output in outputs:
prompt = output.prompt
generated_text = output.outputs[0].text
print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
如果模型下载缓慢,可以在运行之前设置 VLLM_USE_MODELSCOPE=true 来使用魔搭作为下载源(如果使用魔搭报错,将魔搭包版本降到 1.22.0
)。
运行 Qwen 3 32B,使用 YaRN 扩展上下文,双卡并行:
vllm serve /root/autodl-tmp/Qwen3-32B \
--host 0.0.0.0 \
--port 8000 \
--rope-scaling '{"rope_type":"yarn","factor":2.0,"original_max_position_embeddings":32768}' \
--max-model-len 65536 \
--tensor-parallel-size 2
可能出现的问题
vllm serve
有可能会报 serve
不存在,将源码中的 benchmark
目录复制到 vllm bin 文件所在目录就行(which vllm
找一下)。