各位折腾大模型的老铁们,今天咱们不聊虚的,直接上手搞一个硬核玩意儿:vllm原生支持昇腾加速大模型推理创新。你可能已经受够了英伟达GPU的缺货和溢价,或者手头正好有一批昇腾卡闲置吃灰。好消息是,vLLM 0.6.x之后的版本已经官方原生支持昇腾NPU,不需要魔改,不需要打补丁,直接pip安装就能跑起来。这篇文章就是专门写给那些零基础、没碰过昇腾、甚至没部署过vLLM的朋友,手把手带你把Qwen2-7B跑在昇腾910B上。
别被“原生支持”这四个字吓到,其实原理很简单:vLLM通过Ascend Extension for PyTorch(torch_npu)把底层的KV Cache、Attention计算、Continuous Batching等核心操作映射到昇腾的CANN运行时上。你不需要懂CUDA,也不需要写算子,只需要装对驱动和包,然后像用GPU一样用NPU。
一、为什么你需要“vllm原生支持昇腾加速大模型推理创新”
先泼一盆冷水:如果你只是跑个demo,用CPU也凑合。但如果你要做生产级推理服务,比如给公司内部几十个人用,或者接个API给外部调用,那昇腾加速就是刚需。原因有三:
- 成本优势:一张昇腾910B的价格大约是同显存A100的六折,而且国内供货稳定,不用看老美脸色。
- 性能不虚:在FP16精度下,910B的BF16算力达到376 TFLOPS,配合vLLM的PagedAttention,吞吐量能打平A100 80G的80%以上,这已经非常能打了。
- 生态成熟:vLLM原生支持昇腾意味着你不需要用第三方分支(比如Huawei的vllm-ascend老版本),直接享受官方新特性(如LoRA、Prefix Caching)的同步更新。
更关键的是,“原生”意味着你不需要修改一行模型代码。你用HuggingFace下载的权重,直接塞给vLLM,它自己会判断后端是NPU还是GPU。这对于那些想从CUDA迁移到昇腾的团队来说,迁移成本几乎为零。
注意:这里说的“原生支持”指的是vLLM 0.6.6及以上版本,且需要搭配CANN 7.0.RC1或更高版本。低于这个版本组合,你可能会遇到算子不兼容的报错。
二、前置准备:硬件、软件、网络,一步都不能少
在敲命令之前,请务必确认以下清单,否则你会卡在某个奇怪的报错上半天。
1. 硬件要求
- 一台x86_64或ARM架构的服务器(鲲鹏920也行),内存建议≥64GB,因为要加载7B模型权重。
- 至少一张昇腾310P(推理卡)或910B(训练/推理卡)。如果你只有310P,也能跑7B模型,但速度会慢一些。这里以910B为例。
- 磁盘空间:预留≥50GB,因为CANN工具链+模型权重+日志都很占地方。
2. 软件版本对齐(这是最容易翻车的地方)
请严格按照以下组合,不要用最新的,也不要太旧:
- 操作系统:Ubuntu 20.04或22.04 LTS(CentOS 7.6也行,但坑更多)
- Python:3.8、3.9或3.10(推荐3.10)
- CANN Toolkit:7.0.RC1(不要用6.x,vLLM原生支持依赖7.x接口)
- torch:2.1.0(CPU版本即可,因为torch_npu会替换底层)
- torch_npu:2.1.0.post6(这是华为官方适配包)
- vLLM:0.6.6.post1(这个版本开始支持昇腾)
3. 固件与驱动
你需要用npu-smi命令检查驱动是否正常。如果没有,去昇腾社区下载NPU固件(Firmware)和驱动(Driver)包,版本要求是24.1.rc1。安装后运行npu-smi info应该能看到卡的状态。
关键注意点:请务必先安装CANN,再安装torch_npu,最后安装vLLM。顺序反了会导致vLLM找不到NPU设备。另外,vLLM安装时会编译一些C++扩展,需要gcc版本≥9.0,建议提前
apt install gcc-9 g++-9。
三、5分钟极速安装步骤(纯命令,复制粘贴即可)
这里我们假设你的昇腾驱动和固件已经装好,并且npu-smi info能看到卡。下面所有命令都在root或sudo权限下执行。
Step 1:创建虚拟环境(强烈建议)
conda create -n vllm-ascend python=3.10 -y
conda activate vllm-ascend
pip install --upgrade pip
Step 2:安装CANN Toolkit(只装开发套件)
# 下载CANN 7.0.RC1社区版
wget https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/CANN/CANN%207.0.RC1/Ascend-cann-toolkit_7.0.RC1_linux-x86_64.run
chmod +x Ascend-cann-toolkit_7.0.RC1_linux-x86_64.run
./Ascend-cann-toolkit_7.0.RC1_linux-x86_64.run --install
安装完成后,需要设置环境变量(每次新开终端都要执行):
source /usr/local/Ascend/ascend-toolkit/set_env.sh
Step 3:安装torch和torch_npu
pip install torch==2.1.0 --index-url https://download.pytorch.org/whl/cpu
pip install torch_npu==2.1.0.post6 --index-url https://pypi.org/simple
这里注意:torch_npu的包名是torch_npu,不是torch-npu。安装后用python检查:
python -c "import torch; import torch_npu; print(torch_npu.npu.is_available())"
如果输出True,恭喜你,环境通了。
Step 4:安装vLLM(原生支持昇腾版本)
pip install vllm==0.6.6.post1
这里会编译一些算子,需要几分钟。如果报错说缺少ninja,先执行apt install ninja-build。安装完成后验证:
python -c "from vllm import LLM; print('vLLM import OK')"
Step 5:启动你的第一个昇腾推理服务
假设你已经从HuggingFace下载了Qwen/Qwen2-7B-Instruct权重(或者用modelscope下载),然后运行:
python -m vllm.entrypoints.openai.api_server \
--model /path/to/Qwen2-7B-Instruct \
--dtype float16 \
--device npu \
--max-model-len 8192 \
--gpu-memory-utilization 0.9 \
--port 8000
注意--device npu这个参数,在GPU上是cuda,在昇腾上就是npu。启动成功后,你会看到类似INFO: Started server process [xxx]的日志。
测试一下推理:
curl http://localhost:8000/v1/completions -H "Content-Type: application/json" -d '{"model": "/path/to/Qwen2-7B-Instruct", "prompt": "你好,请介绍一下你自己", "max_tokens": 100}'
注意:如果你的卡是310P(显存只有24G),跑7B模型需要开启
--enable-chunked-prefill,并且降低--max-model-len到4096,否则会OOM。910B(64G显存)则无压力。
四、常见问题 FAQ 答疑框
这里整理了新手最容易踩的五个坑,每一个都是我实测过的。
Q1:安装torch_npu后,import torch报错“ModuleNotFoundError: No module named ‘torch_npu._C’”
原因:你的torch版本和torch_npu不匹配。torch_npu 2.1.0.post6只对应torch 2.1.0,不能是2.2或2.0。请严格用pip install torch==2.1.0,不要加任何其他依赖。
Q2:启动vLLM时提示“No available NPU device found”
原因:环境变量没设置。请确保执行了source /usr/local/Ascend/ascend-toolkit/set_env.sh,并且用npu-smi info能看到卡。如果还是不行,检查是否有LD_LIBRARY_PATH冲突,可以执行echo $LD_LIBRARY_PATH看看是否包含/usr/local/Ascend/ascend-toolkit/latest/lib64。
Q3:推理速度特别慢,只有几 tokens/s,为什么?
原因:大概率是--dtype设错了。昇腾910B对FP16支持最好,不要用float32。另外,检查是否开启了--enable-prefix-caching,这个对重复前缀的prompt有巨大加速。还有,确认你的模型权重是半精度(.bin文件大小约14GB),如果是fp32权重(28GB),请转换。
Q4:运行时报错“GE_OP_TYPE: GatherV2”或“Unsupported operator”
原因:你的模型里有vLLM原生昇腾支持之外的算子。目前官方支持Qwen、LLaMA、ChatGLM、Baichuan等主流架构。如果你用的是Mamba或Mistral的某些特殊变体,可能需要升级到vLLM 0.7.x(目前还在rc阶段)。建议先用Qwen或Llama系列测试。
Q5:多卡并行怎么设置?
vLLM原生支持张量并行,你只需要加--tensor-parallel-size 2(假设你有2张910B)。但注意,昇腾的NPU互联走的是HCCS(类似NVLink),需要确保你的服务器配置了HCCS组网。如果没有,请使用--pipeline-parallel-size 2(流水线并行),速度会慢一些但能跑。
最后提醒:如果你在安装过程中遇到“GLIBCXX_3.4.30 not found”的报错,请升级libstdc++6:
apt install libstdc++6。如果你的系统是CentOS,请用yum install libstdc++-devel。这是CANN 7.0的硬性要求。
好了,到这一步,你已经成功把vLLM跑在昇腾上了。接下来你可以尝试加载更大的模型(比如13B、70B),或者部署到K8s集群里。记住,vLLM原生支持昇腾的最大意义在于:你不需要再为“国产化适配”而被迫重写推理框架了。这套流程同样适用于Atlas 800T A2服务器、Atlas 300I Duo推理卡等设备。如果还有问题,欢迎在评论区留言,我会挑典型问题再出一期排错教程。