本次实测的宿主机环境为:
| OS | openEuler release 24.03 (LTS-SP4) |
| 内核 | 6.6.0 |
| Docker | 18.09.0 |
| NPU 驱动 | 26.0.rc1 |
| NPU 固件 | 7.7.0.10.220 |
| CANN | 9.0.1 |
🖥️ 宿主机执行:
运行 cat /etc/yum.repos.d/openEuler.repo 检查,如果文件不存在或者使用的源不是 openEuler 国内镜像,可以按如下修改,提升 yum install 下载速度。
以下是 openEuler 24.03 LTS SP4 镜像源配置:
[OS] name=OS baseurl=https://mirrors.huaweicloud.com/openeuler/openEuler-24.03-LTS-SP4/OS/$basearch/ enabled=1 gpgcheck=1 gpgkey=http://repo.openeuler.org/openEuler-24.03-LTS-SP4/OS/$basearch/RPM-GPG-KEY-openEuler ...(完整配置见原文)
🖥️ 宿主机执行:
sudo dnf install -y docker
sudo systemctl enable --now docker
docker --version
🖥️ 宿主机执行:
sudo usermod -aG docker $USER
newgrp docker
🖥️ 宿主机执行:
docker pull swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:9.0.0-910b-openeuler24.03-py3.11-devel
🖥️ 宿主机执行:
ls /dev/davinci* 预期 /dev/davinci0 ...
npu-smi info 确认 NPU 状态正常。

🖥️ 宿主机执行:
以 Qwen3-0.6B 为例 ls /home/models/Qwen3-0.6B/ 包含 config.json, tokenizer.json, model*.safetensors。
在容器内操作前,先规划好镜像配置。

SGLang 的 NPU 支持由官方源码内置,需要通过源码安装。与 vLLM 相比,额外需要:sgl-kernel-npu(不在 PyPI,需从 GitHub Releases 下载预编译 zip),constraints 文件锁版本,仅支持 Python 3.11。
| Python | 3.11 |
| PyTorch | 2.10.0 (CPU) |
| torch_npu | 2.10.0 |
| triton-ascend | 3.2.1.dev20260530 |
| sgl-kernel-npu | 2026.05.01.post3 |
| SGLang | v0.5.16 |
🖥️ 宿主机执行:
docker run -d --name sglang-ascend-910b --privileged --ipc=host ... (完整命令见原文)
进入容器:
docker exec -it sglang-ascend-910b bash -l
📦 容器内执行:
python3.11 -m venv --upgrade /workspace/home/venv311
source /workspace/home/venv311/bin/activate
pip install -U pip -i https://mirrors.huaweicloud.com/repository/pypi/simple

3.1 替换 openEuler yum 源
sed -i -e 's|https://repo.openeuler.org/|https://mirrors.huaweicloud.com/openeuler/|' -e '/^metalink=/s/^/#/' /etc/yum.repos.d/openEuler.repo
3.2 创建 constraints 文件
printf 'torch==2.10.0+cpu\ntorch_npu==2.10.0\nnumpy==1.26.4\n' > /tmp/sglang_constraints.txt
CONSTRAINTS='-c /tmp/sglang_constraints.txt'
3.3 安装基础依赖
pip install 'setuptools<80' -i $PIP_INDEX
pip install torch==2.10.0 --index-url https://download.pytorch.org/whl/cpu
pip install torch_npu==2.10.0 -i $PIP_INDEX
3.4 安装 triton-ascend
pip install triton-ascend==3.2.1.dev20260530 --extra-index-url https://mirrors.huaweicloud.com/ascend/repos/pypi/nightly --trusted-host mirrors.huaweicloud.com -i $PIP_INDEX
3.5 安装 sgl-kernel-npu
下载 zip 并解压安装四个 wheel,验证 python -c 'import sgl_kernel_npu; print("OK")'

3.6 源码安装 SGLang
git clone --branch v0.5.16 --depth 1 https://ghfast.top/https://github.com/sgl-project/sglang.git /workspace/home/sglang
cp -f python/pyproject_npu.toml python/pyproject.toml
pip install $CONSTRAINTS -e 'python[all_npu]' -i $PIP_INDEX
3.7 替换 opencv-python 为 headless 版
避免 libGL 缺失。
3.8 预下载 benchmark 数据集
curl -fL --retry 3 -o /workspace/home/sglang_bench_data/ShareGPT_V3_unfiltered_cleaned_split.json https://hf-mirror.com/...
3.9 验证版本信息
python -c 'import torch, torch_npu, sglang, sgl_kernel_npu; print("torch:", torch.__version__); ...'

📦 容器内执行:
source /usr/local/Ascend/ascend-toolkit/set_env.sh
export ASCEND_RT_VISIBLE_DEVICES=0
sglang serve /models/Qwen3-0.6B --host 0.0.0.0 --port 8002 --attention-backend ascend --device npu --tp-size 1 --mem-fraction-static 0.9 --trust-remote-code > /workspace/logs/sglang_server.log 2>&1 &
等待日志出现 "The server is fired up and ready to roll!"。
5.1 等待就绪:
while ! curl -fsS http://127.0.0.1:8002/health; do sleep 10; done
5.2 curl 推理验证:
curl -sS http://127.0.0.1:8002/v1/chat/completions -H "Content-Type: application/json" -d '{"model":"/models/Qwen3-0.6B","messages":[{"role":"user","content":"请用一句话介绍华为昇腾。"}],"max_tokens":64,"temperature":0}'

📦 容器内执行:
python -m sglang.benchmark.serving --backend sglang --model /models/Qwen3.5-9B --dataset-name random --dataset-path /workspace/home/sglang_bench_data/ShareGPT_V3_unfiltered_cleaned_split.json --random-input-len 2048 --random-output-len 512 --num-prompts 200 --max-concurrency 64 --port 8002 --output-file /workspace/logs/sglang_benchmark.json
Benchmark 测试结果:

如果想做类似 vLLM 的随机 token Benchmark,用 random-ids 模式:
python -m sglang.benchmark.serving ... --dataset-name random-ids ...

📦 容器内 + 🖥️ 宿主机:
kill -SIGINT $(pgrep -f 'sglang')
exit
docker stop sglang-ascend-910b && docker rm sglang-ascend-910b

替换国内源。
手动下载 zip 安装四个 wheel。
使用 constraints 锁住 torch CPU 版本。

本次实测从环境构建到性能验证,以 openEuler 24.03 LTS SP4 为底座,完成 Docker 部署及 SGLang 安装配置,并利用随机数据集跑通 Benchmark,输出 TTFT、TPOT 及 Throughput 关键指标,验证了整套环境的可用性与稳定性。本次本地编译总时长约 1 分钟,后续 openEuler 社区将引入 SGLang 一键安装,敬请关注。
>>预告
下一篇文章将继续基于 openEuler24.03,实测安装 llama.cpp 并运行 benchmark 验证性能。
供稿 | 欧阳庆 编辑 | 丘云 校审 | 赵家麒、郑振宇、刘彦飞
本文系统性地完成了 openEuler 24.03 上 SGLang 推理框架的部署与性能验证,覆盖了从底层驱动、容器环境、依赖锁版本到源码编译、Benchmark 执行的全链路。重点解决了 NPU 环境下 SGLang 依赖链容易拉取 CUDA 包、sgl-kernel-npu 无 PyPI 源、随机数据集联网下载失败等核心痛点。通过 constraints 文件锁版本、手动下载预编译 wheel、预置 ShareGPT 数据集,实现了在无外网或弱网环境下的稳定部署。性能数据表明,在 910B NPU 上,并发 64、200 个 prompt 的场景下,TTFT 和 TPOT 均处于合理区间,吞吐量满足轻量级推理需求。与 vLLM 相比,SGLang 的 NPU 适配更依赖社区预编译包,但源码安装灵活度更高。文章还贴出了 benchmark 的 random 与 random-ids 两种模式差异,为开发者提供了明确的压测指南。整体来看,该方案为 openEuler + 昇腾 NPU 的 AI 推理落地提供了可复制的实践范本,也为后续社区将 SGLang 纳入系统包管理器奠定了基础。
问题:在 openEuler 24.03 + 昇腾 NPU 环境下,SGLang 源码安装时依赖链易拉取 CUDA 版本、sgl-kernel-npu 无 PyPI 源、benchmark 数据集需预下载。
解决方案:① 使用 constraints 文件锁定 torch==2.10.0+cpu 及 torch_npu 版本;② 从 GitHub Releases 手动下载 sgl-kernel-npu zip 包,解压安装四个 wheel;③ 预下载 ShareGPT 数据集到本地,并设置 HF_ENDPOINT 镜像;④ 通过 Docker 挂载 NPU 设备及模型目录,隔离环境。
执行方式:按照 Step 1~7 顺序执行,关键步骤包括:启动 CANN 容器、创建 Python 3.11 虚拟环境、安装 triton-ascend nightly、覆盖 pyproject_npu.toml、替换 opencv-headless。
验收模型:① 服务启动成功,日志输出 "ready to roll";② curl 推理返回正确内容;③ benchmark 运行完成,输出 TTFT (首token延迟)、TPOT (每token耗时)、Throughput (吞吐量) 三项指标,且无 CUDA 相关报错;④ sgl_kernel_npu 可正常导入。
💬 评论区