已关闭
[Feature]: TORCH_NPU_USE_COMPATIBLE_IMPL SoC 自动检测 #2091
wuyouqi1创建于  5月25日关闭于  5月26日
wuyouqi1
wuyouqi1成员
5月25日 创建

💻 需求背景、当前现状、期望实现的功能内容、具体的设计方案、以及测试方案

需求背景

A5(Ascend950)机器上 TORCH_NPU_USE_COMPATIBLE_IMPL 需默认为 "1"(启用 ACL API 路径,与 GPU 行为对齐),其他型号默认为 "0"(保持缓存路径)。

当前现状

C++ 侧 CheckCompatibleImpl() 通过 REGISTER_OPTION_BOOL_FUNCTION 注册,默认值硬编码为 "0"

// EnvVariables.cpp:173
REGISTER_OPTION_BOOL_FUNCTION(CheckCompatibleImpl, TORCH_NPU_USE_COMPATIBLE_IMPL, "0", "1")

无论什么机型,未设置环境变量时 CheckCompatibleImpl() 均返回 false

设计方案

torch_npu/__init__.py import 早期阶段,通过 Python ctypes 调用 CANN 库 libascendcl.soaclrtGetSocName() 接口检测 SoC 型号:

def _is_ascend950():
    try:
        import ctypes
        lib = ctypes.CDLL("libascendcl.so")
        lib.aclrtGetSocName.restype = ctypes.c_char_p
        soc_name = lib.aclrtGetSocName()
        if soc_name and soc_name.decode().startswith("Ascend950"):
            return True
    except Exception:
        pass
    return False

仅在环境变量 未设置 时根据 SoC 版本决定默认值:

if "TORCH_NPU_USE_COMPATIBLE_IMPL" not in os.environ:
    os.environ["TORCH_NPU_USE_COMPATIBLE_IMPL"] = "1" if _is_ascend950() else "0"

环境变量在 C++ 扩展加载前设置,CheckCompatibleImpl() 读取时已是正确值,无需修改 C++ 代码。

修改文件:

  • torch_npu/__init__.py — SoC 检测 + 环境变量默认值
  • test/test_compatible_impl_soc_detect.py(新增)— 4 个测试用例

测试方案

场景 环境变量 预期
Ascend950 未设置 默认 "1"
非 Ascend950 未设置 默认 "0"
任意机器 显式设置 保持用户值
无 CANN 未设置 降级为 "0",不抛异常

自动化测试:python3 -m pytest test/test_compatible_impl_soc_detect.py -v

替代方案

曾考虑修改 C++ 侧 EnvVariables.cppCheckCompatibleImpl() 内部判断 SoC 版本,不采用原因:需要额外引入 NpuVariables.h 依赖,且 REGISTER_OPTION_BOOL_FUNCTION 宏框架不适合加运行时逻辑。Python 侧设置环境变量更简洁,C++ 侧无需改动。

补充说明

likedislike
wuyouqi1wuyouqi1成员
5月25日 添加了label:feature
wuyouqi1wuyouqi1成员
5月25日 修改了issue 的描述
wuyouqi1wuyouqi1成员
5月25日 将 wuyouqi1 设为负责人
wuyouqi1wuyouqi1成员
5月25日 修改标题为 “[Feature]: TORCH_DEVICE_BACKEND_AUTOLOAD SoC 自动检测”,原标题为“[Feature]: ”
wuyouqi1wuyouqi1成员
5月25日 修改了issue 的描述
wuyouqi1wuyouqi1成员
5月25日 修改标题为 “[Feature]: TORCH_NPU_USE_COMPATIBLE_IMPL SoC 自动检测”,原标题为“[Feature]: TORCH_DEVICE_BACKEND_AUTOLOAD SoC 自动检测”
ascend-robotascend-robot成员
5月26日 关闭了 issue
ascend-robotascend-robot成员
5月26日 添加了label:resolved