已关闭
[Feature]: TORCH_NPU_USE_COMPATIBLE_IMPL SoC 自动检测 #2091
wuyouqi1创建于 5月25日关闭于 5月26日
5月25日 添加了label:feature
5月25日 修改了issue 的描述
5月25日 将 wuyouqi1 设为负责人
5月25日 修改标题为 “[Feature]: TORCH_DEVICE_BACKEND_AUTOLOAD SoC 自动检测”,原标题为“[Feature]: ”
5月25日 修改了issue 的描述
5月25日 修改标题为 “[Feature]: TORCH_NPU_USE_COMPATIBLE_IMPL SoC 自动检测”,原标题为“[Feature]: TORCH_DEVICE_BACKEND_AUTOLOAD SoC 自动检测”
5月25日 修改标题为 “[Feature]: TORCH_NPU_USE_COMPATIBLE_IMPL SoC 自动检测”,原标题为“[Feature]: TORCH_DEVICE_BACKEND_AUTOLOAD SoC 自动检测”
5月26日 关闭了 issue
5月26日 添加了label:resolved
💻 需求背景、当前现状、期望实现的功能内容、具体的设计方案、以及测试方案
需求背景
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__.pyimport 早期阶段,通过 Python ctypes 调用 CANN 库libascendcl.so的aclrtGetSocName()接口检测 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 个测试用例测试方案
"1""0""0",不抛异常自动化测试:
python3 -m pytest test/test_compatible_impl_soc_detect.py -v替代方案
曾考虑修改 C++ 侧
EnvVariables.cpp在CheckCompatibleImpl()内部判断 SoC 版本,不采用原因:需要额外引入NpuVariables.h依赖,且REGISTER_OPTION_BOOL_FUNCTION宏框架不适合加运行时逻辑。Python 侧设置环境变量更简洁,C++ 侧无需改动。补充说明
HPC/autoload_soc_detect.mdfeat/autoload-soc-detect,目标分支v2.7.1