张芷铭的个人博客

这两个都是昇腾(Ascend)NPU环境变量,核心作用都是指定进程可见的NPU设备,但生效层级、作用范围、优先级完全不同,是昇腾生态区分Runtime层驱动层设备可见性的关键配置。


一、核心定义

环境变量生效层级作用范围优先级
ASCEND_VISIBLE_DEVICES驱动层(Driver)全局生效,所有基于昇腾驱动的应用/框架
ASCEND_RT_VISIBLE_DEVICESRuntime层(ACL/CANN)仅当前CANN/ACL进程生效,不影响驱动层

二、详细区别

1. 生效层级(最核心区别)

  • ASCEND_VISIBLE_DEVICES 作用于昇腾硬件驱动,是系统级的设备屏蔽。 一旦设置,整个系统/容器内的所有程序(包括npu-smi、驱动工具、所有框架)都只能看到指定的NPU。 ✅ 用途:多卡服务器上物理级隔离NPU,防止其他进程抢占设备。

  • ASCEND_RT_VISIBLE_DEVICES 作用于CANN Runtime(ACL),是进程级的设备屏蔽。 仅对当前运行的Python/推理/训练进程生效,不影响驱动层(npu-smi依然能看到所有卡)。 ✅ 用途:单进程内灵活指定NPU,多进程并行时互不干扰。

2. 优先级(关键规则)

ASCEND_RT_VISIBLE_DEVICES 优先级 > ASCEND_VISIBLE_DEVICES

  • 如果两个环境变量同时设置:Runtime层会覆盖驱动层配置,最终以 _RT_ 为准;
  • 如果只设置一个:以设置的那个为准;
  • 如果都不设置:默认可见所有NPU设备

3. 适用场景

✅ ASCEND_VISIBLE_DEVICES 适用场景

  1. 容器化部署(Docker/K8s):固定容器只能使用指定NPU;
  2. 系统级隔离:禁止其他用户/程序使用指定NPU;
  3. 驱动层工具限制:让 npu-smi info 只显示指定卡。

✅ ASCEND_RT_VISIBLE_DEVICES 适用场景

  1. 单服务器多进程并行:每个进程单独指定卡(最常用);
  2. PyTorch/TensorFlow/MindSpore 框架内指定NPU;
  3. 推理服务:不修改系统配置,仅当前进程指定设备。

三、使用示例

示例1:仅Runtime层指定(推荐日常开发)

1
2
3
4
5
6
7
# 仅当前进程可见 0号NPU
export ASCEND_RT_VISIBLE_DEVICES=0
python train.py

# 仅当前进程可见 1、2号NPU
export ASCEND_RT_VISIBLE_DEVICES=1,2
python inference.py

示例2:驱动层指定(系统/容器级)

1
2
3
4
# 整个系统/容器仅可见 0号NPU
export ASCEND_VISIBLE_DEVICES=0
# npu-smi 也只会显示0号卡
npu-smi info

示例3:同时设置(最终以_RT_为准)

1
2
3
4
export ASCEND_VISIBLE_DEVICES=0,1
export ASCEND_RT_VISIBLE_DEVICES=2
# 最终进程只能用2号NPU
python test.py

四、快速判断用哪个

你的需求选择哪个环境变量
我只想让当前这个程序用指定NPUASCEND_RT_VISIBLE_DEVICES
我要让整个容器/系统只能用指定NPUASCEND_VISIBLE_DEVICES
框架训练/推理指定卡(PyTorch/MindSpore)ASCEND_RT_VISIBLE_DEVICES
限制npu-smi显示的设备ASCEND_VISIBLE_DEVICES

总结

  1. ASCEND_VISIBLE_DEVICES驱动层、全局、低优先级,管整个系统/容器;
  2. ASCEND_RT_VISIBLE_DEVICESRuntime层、进程级、高优先级,管当前程序;
  3. 日常开发优先用 _RT_,灵活且不影响系统其他程序。

Comments