CPU 绑定¶
从 vllm-ascend v0.18.0rc1 开始,CPU 绑定在基于 ARM 的 Ascend 服务器上默认启用。
通常您无需手动配置。 仅当您希望禁用它或显式声明默认配置时,才设置 enable_cpu_binding。
CPU 绑定的优势¶
CPU 绑定可改善配备 Ascend NPU 的多插槽 ARM 服务器的主机端调度。它旨在解决三个常见的主机端推理性能问题:
- 降低跨 NUMA 流量。 Worker 进程尽量靠近为其活跃 NPU 选择的 CPU 和内存资源,从而减少远程 NUMA 访问。
- 降低线程抢占带来的上下文切换开销。 关键运行时线程在稳定的 CPU 范围内运行,减少调度器移动和繁忙主机上的 CPU 争用。
- 更好的延迟稳定性和多 Worker 隔离。 独立的 Worker 避免共享相同的 CPU/NUMA 资源,有助于减少尾延迟抖动,使多 NPU 推理时的吞吐量更可预测。
此功能是主机端性能优化。它不会改变模型执行逻辑或数值输出。 当内存迁移支持不可用时,CPU 亲和性仍然有效,但内存局部性可能变差,延迟或吞吐量可能会下降。
使用方法¶
在线服务¶
默认行为:
禁用 CPU 绑定:
离线推理¶
默认行为:
禁用 CPU 绑定:
from vllm import LLM
llm = LLM(
model="Qwen/Qwen2.5-7B-Instruct",
additional_config={"enable_cpu_binding": False},
)
环境要求¶
官方 vllm-ascend 镜像在 v0.18.0rc1 及更早版本中已包含 util-linux 和 procps / procps-ng。从 v0.18.0rc1 开始,官方镜像还包含 numactl。
如果您未使用官方镜像,请手动安装主机工具:
# Ubuntu/Debian
sudo apt-get install -y util-linux numactl procps
# RHEL/CentOS/Alma/Rocky
sudo yum install -y util-linux numactl procps-ng
# openEuler
sudo dnf install -y util-linux numactl procps-ng
如果没有 numactl / migratepages,vLLM Ascend 仅跳过内存迁移。 Worker 进程和运行时线程仍会被绑定,但已放置在远程 NUMA 节点上的内存页不会被迁移,这可能会降低局部性并导致延迟或吞吐量下降。
为获得最佳局部性,请使用在 NUMA 节点之间均匀分布的 cpuset。不均衡的 cpuset 可能会降低 CPU 绑定的局部性收益。
在 950PR&950DT 产品上,CPU 绑定使用 npu-smi info -t topo 中的 NPU 到 CPU 亲和性来选择 Worker 的亲和 NUMA 节点。每个 Worker 主进程被绑定到该 NUMA 节点的一个 CPU 簇。簇大小由 lscpu 的 Thread(s) per core 得出:当为 1 时是 8 个 CPU,当为 2 时是 16 个 CPU。950PR&950DT 产品还会将主机的 uvb_poll_window_thread 线程绑定到 NUMA0(除 CPU0 外)的 CPU 上,并受当前 cpuset 约束。在 Docker 部署中,请在创建容器时添加 --pid=host,以便 vLLM Ascend 可以发现并绑定这些主机线程。950PR&950DT 产品在 migratepages 可用时仍可迁移内存页,但不会单独绑定 ACL/release 线程,也不会应用 IRQ 绑定。
对于 IRQ 绑定,进程还需要具备读取 /proc/interrupts 和写入 /proc/irq/*/smp_affinity 的权限。如果 irqbalance 正在运行,且进程可以使用 systemctl,vLLM Ascend 会在应用 IRQ 亲和性之前停止它。在无法使用 systemctl 的容器中,当 IRQ 亲和性很重要时,请在主机上停止 irqbalance。
950PR&950DT 产品不应用 IRQ 绑定。在 950PR&950DT 产品上运行时,日志中包含 [irq] IRQ binding skipped on Ascend 950.,此功能不会写入任何 /proc/irq/*/smp_affinity 文件。
950PR&950DT 产品的分配日志使用 worker=[...],而不是 acl=[...] 或 release=[...],因为在此设备类型上 ACL/release 线程不会被单独绑定。当发现并绑定 UVB 轮询线程时,日志还会报告其线程 ID 和 CPU 池:
在主机上,当您需要稳定的 IRQ 亲和性时,请在启动 vLLM 前停止 irqbalance:
在 vLLM 服务退出后,如果主机应恢复默认的 IRQ 均衡策略,请重新启动它:
故障排查¶
| 消息 | 含义 | 操作 |
|---|---|---|
CPU binding skipped: non-ARM CPU detected. |
CPU 绑定仅在 ARM 上运行。 | 在 x86_64 上无需操作。 |
Can not get running npu info. |
未找到正在运行的 NPU,或者 ASCEND_RT_VISIBLE_DEVICES 过滤掉了所有 NPU。 |
检查可见的 NPU ID 和 npu-smi info。 |
Insufficient CPUs for binding... |
可用 CPU 数少于角色分配所需。启用 IRQ 绑定的设备每个逻辑 NPU 至少需要 5 个 CPU。950PR&950DT 产品每个 Worker 需要一个完整的 CPU 簇。 | 扩大 cpuset 或减少可见的 NPU。 |
NPU topo affinity not found... |
拓扑亲和性不可用。 | 在 950PR&950DT 产品上,跳过 Worker CPU 绑定。在其他支持拓扑亲和性的设备上,vLLM Ascend 回退到 global_slice。当预期存在拓扑亲和性时,请检查 npu-smi info -t topo。 |
uvb_poll_window_thread not found... --pid=host |
950PR&950DT 产品无法看到主机的 UVB 轮询线程。 | 使用 --pid=host 重新创建 Docker 容器,然后重启 vLLM。 |
failed to bind uvb_poll_window_thread... --pid=host |
950PR&950DT 产品找到了 UVB 轮询线程,但绑定失败。 | 检查权限;如果在 Docker 中运行,请使用 --pid=host 重新创建 Docker 容器。 |
The 'migratepages' command is not available... |
将跳过内存迁移,但 CPU 线程绑定仍会继续。 | 如果 NUMA 局部性或性能受到影响,请安装 numactl。 |
| 消息 | 含义 | 操作 |
|---|---|---|
[irq] IRQ binding skipped on Ascend 950. |
950PR&950DT 产品不使用 IRQ 绑定步骤。 | 无需操作。Worker 主绑定和内存迁移仍会继续执行。 |
Bind cpus failed in rank... |
某个绑定步骤失败,该 rank 的 CPU 绑定被跳过。 | 检查 taskset、lscpu、npu-smi、cpuset 大小以及 /proc/irq 权限。 |
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 vl/vllm-ascend