CPU 绑定#
从 vllm-ascend v0.18.0rc1 开始,CPU 绑定在基于 ARM 的昇腾服务器上默认启用。
通常您无需手动配置。 仅当您想禁用它或明确默认行为时,才设置 enable_cpu_binding。
CPU 绑定的优势#
CPU 绑定改进了配备昇腾 NPU 的多插槽 ARM 服务器的主机侧调度。它旨在解决三个常见的主机侧推理性能问题:
降低跨 NUMA 流量。 Worker 进程更靠近为其活跃 NPU 选择的 CPU 和内存资源,从而减少远程 NUMA 访问。
降低线程抢占导致的上下文切换开销。 关键运行时线程在稳定的 CPU 范围内运行,减少调度器移动和繁忙主机上的 CPU 争用。
更好的延迟稳定性和多 Worker 隔离。 独立的 Worker 避免共享相同的 CPU/NUMA 资源,这有助于减少尾延迟抖动,并使多 NPU 服务期间的吞吐量更可预测。
此功能是主机侧的性能优化。它不会改变模型执行逻辑或数值输出。 当内存迁移支持不可用时,CPU 亲和性仍然有效,但内存局部性可能会变差,延迟或吞吐量可能会下降。
使用方法#
在线服务#
默认行为:
vllm serve Qwen/Qwen2.5-7B-Instruct
禁用 CPU 绑定:
vllm serve Qwen/Qwen2.5-7B-Instruct \
--additional-config '{"enable_cpu_binding": false}'
离线推理#
默认行为:
from vllm import LLM
llm = LLM(model="Qwen/Qwen2.5-7B-Instruct")
禁用 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 绑定的局部性优势。
对于 IRQ 绑定,进程还需要读取 /proc/interrupts 和写入 /proc/irq/*/smp_affinity 的权限。如果 irqbalance 正在运行且进程可以使用 systemctl,vLLM Ascend 会在应用 IRQ 亲和性之前停止它。在无法使用 systemctl 的容器中,当 IRQ 亲和性很重要时,请在主机上停止 irqbalance。
在主机上,当您需要稳定的 IRQ 亲和性时,请在启动 vLLM 前停止 irqbalance:
sudo systemctl stop irqbalance
vLLM 服务退出后,如果主机应恢复默认的 IRQ 平衡策略,请重新启动它:
sudo systemctl start irqbalance
常见问题与故障排查#
消息 |
含义 |
操作 |
|---|---|---|
|
CPU 绑定仅在 ARM 上运行。 |
在 x86_64 上无需任何操作。 |
|
未找到正在运行的 NPU,或者 |
检查可见的 NPU ID 和 |
|
每个逻辑 NPU 可用的 CPU 少于 5 个。 |
扩大 cpuset 或减少可见的 NPU。 |
|
拓扑亲和性不可用。 |
vLLM Ascend 回退到 |
|
内存迁移被跳过,但 CPU 线程绑定仍会继续。 |
如果 NUMA 局部性或性能受到影响,请安装 |
|
某个绑定步骤失败,该 rank 的 CPU 绑定被跳过。 |
检查 |