一、前言

OpenAtom openEuler(简称:“openEuler”或“开源欧拉”), 作为面向全场景的新一代开源操作系统,正全面拥抱 AI 算力普惠时代。在 openEuler 24.03 及更高版本中,系统原生支持 vLLM 等主流 AI 推理框架。

虽然开源社区有基于 openEuler和vLLM的预构建容器镜像,可以直接拉取使用,不过本文还是从纯净的 openEuler和CANN 基础容器镜像出发,从零安装并配置各个推理框架。

整个配置过程并不复杂,最终使用随机数据集跑通 Benchmark,输出 TTFT、TPOT、Throughput 等关键性能指标。


二、环境准备

本次实测的宿主机环境为:

项目版本信息
OSopenEuler release 24.03 (LTS-SP3)
内核6.6.0-145.3.22.153.oe2403sp3.aarch64
Docker18.09.0
NPU 驱动26.0.rc1
NPU 固件7.7.0.10.220
CANN9.0.1
模型Qwen3.5-9B

2.1 确保宿主机使用 openEuler 国内加速 yum 源

🖥️ 宿主机执行

运行

cat /etc/yum.repos.d/openEuler.repo

检查,如果文件不存在或者使用的源不是 openEuler 国内镜像,可以按如下修改,提升

yum install

下载速度。

以下是 openEuler 24.03 LTS SP3 镜像源配置:

shell[OS]name=OSbaseurl=https://mirrors.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP3/OS/$basearch/#metalink=https://mirrors.openeuler.org/metalink?repo=$releasever/OS&arch=$basearchmetadata_expire=1henabled=1gpgcheck=1gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS-SP3/OS/$basearch/RPM-GPG-KEY-openEuler[everything]name=everythingbaseurl=https://mirrors.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP3/everything/$basearch/#metalink=https://mirrors.openeuler.org/metalink?repo=$releasever/everything&arch=$basearchmetadata_expire=1henabled=1gpgcheck=1gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS-SP3/everything/$basearch/RPM-GPG-KEY-openEuler[EPOL]name=EPOLbaseurl=https://mirrors.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP3/EPOL/main/$basearch/#metalink=https://mirrors.openeuler.org/metalink?repo=$releasever/EPOL/main&arch=$basearchmetadata_expire=1henabled=1gpgcheck=1gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS-SP3/OS/$basearch/RPM-GPG-KEY-openEuler[debuginfo]name=debuginfobaseurl=https://mirrors.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP3/debuginfo/$basearch/#metalink=https://mirrors.openeuler.org/metalink?repo=$releasever/debuginfo&arch=$basearchmetadata_expire=1henabled=1gpgcheck=1gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS-SP3/debuginfo/$basearch/RPM-GPG-KEY-openEuler[source]name=sourcebaseurl=https://mirrors.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP3/source/#metalink=https://mirrors.openeuler.org/metalink?repo=$releasever&arch=sourcemetadata_expire=1henabled=1gpgcheck=1gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS-SP3/source/RPM-GPG-KEY-openEuler[update]name=updatebaseurl=https://mirrors.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP3/update/$basearch/#metalink=https://mirrors.openeuler.org/metalink?repo=$releasever/update&arch=$basearchmetadata_expire=1henabled=1gpgcheck=1gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS-SP3/OS/$basearch/RPM-GPG-KEY-openEuler[update-source]name=update-sourcebaseurl=https://mirrors.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP3/update/source/#metalink=https://mirrors.openeuler.org/metalink?repo=$releasever&arch=sourcemetadata_expire=1henabled=1gpgcheck=1gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS-SP3/source/RPM-GPG-KEY-openEuler

2.2 安装 Docker

🖥️ 宿主机执行

openEuler 24.03 已经内置了 Docker 支持,只需通过包管理器即可一键安装并启动服务:

plain
# 安装 Dockersudo dnf install -y docker# 启动 Docker 并设置开机自启sudo systemctl enable --now docker# 验证安装是否成功docker --version

2.3 配置免 sudo 运行(可选)

🖥️ 宿主机执行

为了方便日常操作,建议将当前用户加入

docker

组,这样运行命令时无需每次都输入

sudo

plain
# 将当前用户加入 docker 组sudo usermod -aG docker $USER# 刷新组权限使配置立即生效newgrp docker

2.4 拉取 openEuler 24.03与CANN 基础镜像

🖥️ 宿主机执行

本文使用基于 openEuler 24.03 SP3和CANN9.0.0.0的容器镜像:

bash
dockerpullswr.cn-south-1.myhuaweicloud.com/ascendhub/cann:9.0.0-910b-openeuler24.03-py3.11-devel

2.5 硬件与驱动

🖥️ 宿主机执行

确保宿主机已正确安装昇腾驱动,NPU 设备可见:

bash
# 查看 NPU 设备ls/dev/davinci*# 预期输出:/dev/davinci0  /dev/davinci2  /dev/davinci_manager ...# 查看 NPU 状态npu-smiinfo

运行

npu-smi info

确认 NPU 设备状态正常:

2.6 模型权重准备

🖥️ 宿主机执行

将模型权重放到宿主机统一目录,后续容器挂载使用:

bash
# 以 Qwen3-0.6B 为例ls/home/models/Qwen3-0.6B/# 预期包含:config.json  tokenizer.json  model*.safetensors ...

2.7 国内镜像加速

在容器内操作前,先规划好镜像配置。以下镜像策略将在后续各框架步骤中逐一应用:

用途原始地址国内镜像
pip 主源pypi.orghttps://mirrors.huaweicloud.com/repository/pypi/simple
openEuler yumrepo.openeuler.orghttps://mirrors.huaweicloud.com/openeuler/
GitHubgithub.comhttps://ghfast.top/(代理前缀)
HuggingFacehuggingface.cohttps://hf-mirror.com

三、vLLM 推理环境搭建

本次 vLLM 安装配置环境是基于 openEuler 24.03 SP3 镜像容器,已内置昇腾驱动和 CANN,开箱即用。

本次实测版本配套表:

组件版本
torch2.9.0
torch_npu2.9.0
vllm0.18.0
vllm-ascend0.18.0
triton-ascend3.2.1

Step 1:启动容器

🖥️ 宿主机执行

启动容器并挂载 NPU 设备、模型目录、pip 缓存等:

bash
IMAGE="swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:9.0.0-910b-openeuler24.03-py3.11-devel"CONTAINER_NAME="vllm-ascend-910b"NPU_CARDS=("davinci2")TP_SIZE=1MODEL_HOST_DIR="/home/models"MODEL_CONTAINER_DIR="/models"MODEL_NAME="Qwen3.5-9B"HOST_PORT=8000CONTAINER_PORT=8000SCRIPT_DIR="$(cd"$(dirname"$0")" &&pwd)"LOG_HOST_DIR="${SCRIPT_DIR}/logs"LOG_CONTAINER_DIR="/workspace/logs"PIP_CACHE_HOST_DIR="${SCRIPT_DIR}/pip-cache"PIP_CACHE_CONTAINER_DIR="/root/.cache/pip"dockerrun-d\--name"${CONTAINER_NAME}"\"${device_args[@]}"\--device=/dev/davinci_manager\--device=/dev/devmm_svm\--device=/dev/hisi_hdc\-v/usr/local/dcmi:/usr/local/dcmi:ro\-v/usr/local/bin/npu-smi:/usr/local/bin/npu-smi:ro\-v/usr/local/Ascend/driver:/usr/local/Ascend/driver:ro\-v/etc/ascend_install.info:/etc/ascend_install.info:ro\-v"${MODEL_HOST_DIR}:${MODEL_CONTAINER_DIR}"\-v"${LOG_HOST_DIR}:${LOG_CONTAINER_DIR}"\-v"${PIP_CACHE_HOST_DIR}:${PIP_CACHE_CONTAINER_DIR}"\-v/usr/local/Ascend/firmware:/usr/local/Ascend/firmware\-w/workspace\-p"${HOST_PORT}:${CONTAINER_PORT}"\--shm-size=16g\--ulimitmemlock=-1\--ulimitstack=67108864\-eOMP_NUM_THREADS=8\"${IMAGE}"\sleepinfinity>/dev/nulllog"容器 ${CONTAINER_NAME} 已启动"

参数说明:

  • --device:挂载 NPU 设备和驱动管理设备,容器内才能访问 NPU
  • -v .../driver:/...driver:ro:挂载宿主机驱动(只读),容器内共享宿主机 CANN 驱动
  • -v /home/models:/models:模型目录映射到容器内/models
  • -v $(pwd)/pip-cache:/root/.cache/pip:pip 缓存持久化到宿主机,二次安装时直接从缓存读取,无需重新下载
  • --shm-size=16g:多进程通信需要较大共享内存
  • -p 8000:8000:映射 API 端口

进入容器验证 NPU 可见性:

bash
dockerexec-itvllm-ascend-910bbashnpu-smiinfo

容器内运行

npu-smi info

确认 NPU 设备已正常挂载:

Step 2:安装依赖

以下命令均在容器内执行(

docker exec -it vllm-ascend-910b bash -l

进入容器后)。

📦 容器内执行

2.1 替换 openEuler 国内加速 yum 源

加速系统包安装,将默认源替换为华为云镜像:

bash
sed-i-e's|https://repo.openeuler.org/|https://mirrors.huaweicloud.com/openeuler/|'\-e'/^metalink=/s/^/#/'/etc/yum.repos.d/openEuler.repo

2.2 安装 torch / torch_npu

安装 PyTorch 及昇腾 NPU 适配插件:

bash
pipinstall-Upip-ihttps://mirrors.huaweicloud.com/repository/pypi/simplepipinstalltorch==2.9.0torch_npu==2.9.0\-ihttps://mirrors.huaweicloud.com/repository/pypi/simple

2.3 安装 vLLM和vllm-ascend

安装 vLLM 推理框架及昇腾适配层:

bash
pipinstallvllm==0.18.0\-ihttps://mirrors.huaweicloud.com/repository/pypi/simplepipinstallvllm-ascend==0.18.0\-ihttps://mirrors.huaweicloud.com/repository/pypi/simple

2.4 覆盖安装 triton-ascend 3.2.1

vllm-ascend 0.18.0 默认依赖的 triton-ascend 3.2.0 存在与 CANN 9.0.0 头文件不兼容的问题(编译

npu_utils.cpp

时报错)。官方修复版 3.2.1 仅发布在昇腾专属仓库:

bash
pipinstall--no-depstriton-ascend==3.2.1\-ihttps://mirrors.huaweicloud.com/repository/pypi/simple\--extra-index-urlhttps://mirrors.huaweicloud.com/ascend/repos/pypi

2.5 补丁 triton-ascend(兜底)

如果环境中仍是 3.2.0(或安装 3.2.1 后仍有残留问题),需要手动删除

npu_utils.cpp

中两个 CANN 9.0.0 不存在的枚举引用,继续执行以下命令(命令会自行判断是哪种情况):

bash
# 找到 npu_utils.cpp 路径NPU_UTILS_CPP=$(python-c"import triton.backends.ascend as m, os; print(os.path.join(os.path.dirname(m.__file__), 'npu_utils.cpp'))")# 检查并补丁ifgrep-q"RT_LIMIT_TYPE_SIMT_WARP_STACK_SIZE""$NPU_UTILS_CPP";thencp"$NPU_UTILS_CPP""$NPU_UTILS_CPP.orig"sed-i"/RT_LIMIT_TYPE_SIMT_WARP_STACK_SIZE/d; /RT_LIMIT_TYPE_SIMT_DVG_WARP_STACK_SIZE/d""$NPU_UTILS_CPP"echo"已补丁:$NPU_UTILS_CPP"elseecho"无需补丁"fi# 验证 triton NPU 驱动可正常初始化python-c"from triton.runtime import driver; print('triton npu driver OK:', driver.active.get_current_target())"

返回如下内容说明 triton-ascend 已经正常配置好了:

2.6 安装 benchmark 依赖

安装异步 HTTP 库,benchmark 工具运行时需要:

bash
pipinstallaiohttp-ihttps://mirrors.huaweicloud.com/repository/pypi/simple

2.7 验证版本信息

确认各组件版本正确:

bash
python-c'import torch, torch_npu, vllm; print("torch:", torch.__version__); print("torch_npu:", torch_npu.__version__); print("vllm:", vllm.__version__)'pipshowvllm-ascend|grep-E'^(Name|Version)'

版本验证输出如下:

Step 3:启动推理服务

📦 容器内执行

启动 vLLM 推理服务,后台运行并将日志写入文件:

bash
vllmserve/models/Qwen3.5-9B\--host0.0.0.0\--port8000\--tensor-parallel-size1\--max-model-len8192\--gpu-memory-utilization0.9\--trust-remote-code\>/workspace/logs/vllm_server.log2>&1&

参数说明:

  • --tensor-parallel-size 1:张量并行度,与使用的 NPU 卡数保持一致
  • --max-model-len 8192:最大上下文长度
  • --gpu-memory-utilization 0.9:显存利用率上限
  • --trust-remote-code:允许加载模型的自定义代码(如 Qwen 系列需要)

Step 4:验证服务

4.1 等待就绪

vLLM 模型加载需要一定时间(通常几十秒到几分钟),可以查看日志文件确认服务是否启动:

bash
tail-f/workspace/logs/vllm_server.log

也可以通过轮询

/v1/models

端点判断:

bash
# 循环检测,直到返回 200while!curl-fsShttp://127.0.0.1:8000/v1/models2>/dev/null;doecho"等待服务就绪..."sleep10doneecho"服务已就绪!"curl-shttp://127.0.0.1:8000/v1/models|python-mjson.tool

服务就绪后,返回的模型信息如下:

4.2 curl 推理验证

发送一条测试请求,验证推理服务是否正常响应:

bash
curl-sShttp://127.0.0.1:8000/v1/chat/completions\-H"Content-Type: application/json"\-d'{"model": "/models/Qwen3.5-9B","messages": [{"role": "user", "content": "请用一句话介绍华为昇腾。/no_think"}],"max_tokens": 2000,"temperature": 0,"chat_template_kwargs":{"enable_thinking":false}}'

think 模式

(模型输出思考过程):

no_think 模式

(直接输出结果,跳过思考过程):

Step 5:运行 Benchmark

📦 容器内执行

a. random 数据集

vLLM 自带 benchmark 工具,使用

vllm bench serve

命令运行随机数据集测试:

bash
# 可自行根据系统资源情况调整参数vllmbenchserve\--backendvllm\--model/models/Qwen3.5-9B\--endpoint/v1/completions\--host127.0.0.1\--port8000\--dataset-namerandom\--num-prompts200\--random-input-len4096\--random-output-len1024\--max-concurrency32\--ignore-eos\--save-result\--result-dir/workspace/logs\--result-filenamevllm_benchmark.json

参数说明:

  • --dataset-name random:使用随机生成的 token 序列作为输入
  • --random-input-len:每条请求输入长度 tokens
  • --random-output-len:每条请求生成长度 tokens
  • --num-prompts:总共发送多少条请求
  • --max-concurrency:最大并发数
  • --ignore-eos:忽略 EOS token,确保每条都生成完整的 128 tokens

运行完毕后会输出包含TTFT(首 Token 延迟)

TPOT(每 Token 耗时)ITL(Token 间延迟)

Throughput(吞吐量)

等关键指标的汇总表格。

random 数据集 Benchmark 结果:

b. ShareGPT 数据集

再跑一个自然语言类型的数据集,使用 ShareGPT 对话数据:

shell
vllmbenchserve\--backendvllm\--model/models/Qwen3.5-9B\--endpoint/v1/completions\--host127.0.0.1\--port8000\--dataset-namesharegpt\--dataset-path/datasets/gliang1001/ShareGPT_V3_unfiltered_cleaned_split/ShareGPT_V3_unfiltered_cleaned_split.json\--num-prompts200\--max-concurrency32\--save-result\--result-dir/workspace/logs\--result-filenamevllm_benchmark_sharegpt.json

参数说明:

  • --dataset-path:数据集文件的完整路径,可以从 HuggingFace 或 ModelScope 获取自己感兴趣的数据集

ShareGPT 数据集 Benchmark 结果:

Step 6:清理

📦 容器内 + 🖥️ 宿主机

测试完成后,停止服务并清理容器:

bash
# 停止推理服务pkill-f'vllm serve'# 退出容器后删除容器exitdockerstopvllm-ascend-910bdockerrmvllm-ascend-910b

四、关键指标解读

以下是 Benchmark 输出中各项指标的含义:

指标含义单位越小越好
TTFT(Time To First Token)从发送请求到收到第一个 token 的延迟ms
TPOT(Time Per Output Token)每个输出 token 的平均耗时ms
ITL(Inter-Token Latency)相邻 token 之间的延迟ms
Throughput每秒处理的 token 总数tokens/s

五、常见问题与踩坑

5.1 yum install 慢

现象:yum install xxx

软件包时,下载速度缓慢。

原因:

系统默认的 yum 源可能是

repo.openeuler.org

,速度较慢。

修复:

替换 openEuler 国内加速 yum 源:

shellsed-i-e's|https://repo.openeuler.org/|https://mirrors.huaweicloud.com/openeuler/|'\-e'/^metalink=/s/^/#/'/etc/yum.repos.d/openEuler.repo

5.2 triton-ascend 与 CANN 头文件不兼容(vLLM)

现象:vllm serve

启动即报编译错误,提到

RT_LIMIT_TYPE_SIMT_WARP_STACK_SIZE

不存在。

原因:

vllm-ascend 0.18.0 默认依赖的 triton-ascend 3.2.0 的

npu_utils.cpp

引用了 CANN 9.0.0 尚不支持的枚举。

修复:

安装 triton-ascend 3.2.1(昇腾专属仓库),或手动

sed

删除这两行(详见 vLLM Step 2.5)。

5.3 国内网络镜像配置汇总

场景解决方案
pip 安装慢-i https://mirrors.huaweicloud.com/repository/pypi/simple
yum/dnf 安装慢sed替换/etc/yum.repos.d/openEuler.repo中的repo.openeuler.org
git clone GitHub 失败使用https://ghfast.top/代理前缀
HuggingFace 下载失败export HF_ENDPOINT=https://hf-mirror.com
triton-ascend 找不到--extra-index-url https://mirrors.huaweicloud.com/ascend/repos/pypi


六、总结

6.1 回顾

本次实测从环境构建到性能验证的全过程,以 openEuler 24.03 SP3 为统一的操作系统底座,完成 Docker 安装、容器启动,及在容器内安装和配置 vLLM,并利用随机数据集跑通了 Benchmark 测试,输出了包括 TTFT(首字延迟)、TPOT(单字生成时间)及 Throughput(吞吐量)在内的关键性能指标。

6.2 后续动态

虽然本次安装以

pip install

为主,使用华为云国内加速源下载比较快,不过还是需要等 1、2 分钟,特别是第一次构建的时候会等更久。

为了更方便开发者使用,接下来,openEuler 社区将引入 vLLM 的较新版本。未来开发者无需再手动编译环境,直接通过

yum

dnf

即可一键安装配置,真正实现开箱即用,请持续关注 openEuler 社区动态。

预告

下一篇文章我们将继续基于 openEuler24.03,实测安装配置 SGLang,并用它对主流模型跑benchmark。


【版权声明】Copyright © 2026 openEuler Community。本文由openEuler社区首发,欢迎遵照

CC-BY-SA 4.0

协议规定转载。转载时敬请在正文注明并保留原文链接和作者信息。

【免责声明】本文仅代表作者本人观点,与本网站无关。本网站对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文仅供读者参考,由此产生的所有法律责任均由读者本人承担。