这两个都是昇腾(Ascend)NPU环境变量,核心作用都是指定进程可见的NPU设备,但生效层级、作用范围、优先级完全不同,是昇腾生态区分Runtime层和驱动层设备可见性的关键配置。
一、核心定义
| 环境变量 | 生效层级 | 作用范围 | 优先级 |
|---|
ASCEND_VISIBLE_DEVICES | 驱动层(Driver) | 全局生效,所有基于昇腾驱动的应用/框架 | 低 |
ASCEND_RT_VISIBLE_DEVICES | Runtime层(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 适用场景
- 容器化部署(Docker/K8s):固定容器只能使用指定NPU;
- 系统级隔离:禁止其他用户/程序使用指定NPU;
- 驱动层工具限制:让
npu-smi info 只显示指定卡。
✅ ASCEND_RT_VISIBLE_DEVICES 适用场景
- 单服务器多进程并行:每个进程单独指定卡(最常用);
- PyTorch/TensorFlow/MindSpore 框架内指定NPU;
- 推理服务:不修改系统配置,仅当前进程指定设备。
三、使用示例
示例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
|
四、快速判断用哪个
| 你的需求 | 选择哪个环境变量 |
|---|
| 我只想让当前这个程序用指定NPU | ASCEND_RT_VISIBLE_DEVICES |
| 我要让整个容器/系统只能用指定NPU | ASCEND_VISIBLE_DEVICES |
| 框架训练/推理指定卡(PyTorch/MindSpore) | ASCEND_RT_VISIBLE_DEVICES |
| 限制npu-smi显示的设备 | ASCEND_VISIBLE_DEVICES |
总结
- ASCEND_VISIBLE_DEVICES:驱动层、全局、低优先级,管整个系统/容器;
- ASCEND_RT_VISIBLE_DEVICES:Runtime层、进程级、高优先级,管当前程序;
- 日常开发优先用
_RT_,灵活且不影响系统其他程序。
Comments