CANN pyasc 运行时配置指南:set_platform 与 Backend/Platform 枚举详解
【免费下载链接】pyasc本项目为Python用户提供算子编程接口,支持在昇腾AI处理器上加速计算,接口与Ascend C一一对应并遵守Python原生语法。项目地址: https://gitcode.com/cann/pyasc
本指南基于 CANN pyasc 开源仓库,围绕asc.runtime.config模块的运行时配置能力展开:通过set_platform接口一键设置后端执行模式(Model 仿真 / NPU 真实硬件)、SOC 版本与设备 ID。读完本文,你将掌握 pyasc 中"仿真优先、硬件验证"的经典开发流程,能够在 Model 后端完成算子功能调试、在 NPU 后端完成真实硬件验证,并学会处理平台不匹配、运行库缺失等常见异常场景。
一、asc.runtime.config模块定位
在 CANN pyasc 中,用户编写的@asc.jit算子代码本身与具体硬件解耦:同一个 Kernel 既可以运行在昇腾 AI 处理器的真实 NPU 上,也可以运行在 CPU 上的仿真/模型环境中。决定"代码跑在哪里"的开关,正是asc.runtime.config模块——它负责配置后端执行模式(Model/NPU)、SOC 版本(芯片型号)和设备 ID三类运行时信息。
该模块的完整文档位于 docs/python-api/lib/config.md,与 docs/python-api/lib/host.md 共同构成 docs/python-api/lib/index.md 所划分的 "Programming models" 两大编程入口。其接口列表非常精简,核心只有一个函数:
set_platform(backend[, soc_version, device_id, check]) | 设置运行时后端、SOC 版本和设备 ID。当 backend 为 Model 时,soc_version 默认为 Ascend910B1;当 backend 为 NPU 时,soc_version 自动从当前平台获取,且会校验与输入的 soc_version 是否一致。 |
|---|
二、枚举类型详解
asc.runtime.config定义了两组在调用set_platform时必须使用的枚举,它们均可在 python/asc/runtime/config.py 中找到对应实现,枚举值同时接受枚举对象或等值字符串两种写法。
2.1 Backend:后端执行模式
Backend枚举指定 Kernel 编译与执行的后端,共两个取值:
| 枚举值 | 说明 |
|---|---|
| Backend.Model | 使用 Model 后端执行,适用于仿真或模型运行场景 |
| Backend.NPU | 使用 NPU 后端执行,适用于真实 NPU 硬件场景 |
从源码看,Backend是一个标准Enum(config.py),其值分别为字符串"Model"与"NPU"。因此调用时既可以直接传Backend.Model,也可以传"Model"——set_platform内部通过Backend(backend)完成归一化。
2.2 Platform:SOC 版本
Platform枚举指定目标芯片型号,决定代码生成与优化的硬件特征。文档(config.md)列出的取值如下:
| 枚举值 | 说明 |
|---|---|
| Platform.Ascend910B1 | Ascend 910B1 |
| Platform.Ascend910B2 | Ascend 910B2 |
| Platform.Ascend910B2C | Ascend 910B2C |
| Platform.Ascend910B3 | Ascend 910B3 |
| Platform.Ascend910B4 | Ascend 910B4 |
| Platform.Ascend910B4_1 | Ascend 910B4-1 |
| Platform.Ascend910_9362 | Ascend 910 9362 |
| Platform.Ascend910_9372 | Ascend 910 9372 |
| Platform.Ascend910_9381 | Ascend 910 9381 |
| Platform.Ascend910_9382 | Ascend 910 9382 |
| Platform.Ascend910_9391 | Ascend 910 9391 |
| Platform.Ascend910_9392 | Ascend 910 9392 |
需要补充的是,当前仓库源码(config.py)中的Platform枚举还包含了文档表格未列出的Ascend 950PR 系列(Ascend950PR_950z、Ascend950PR_9579、Ascend950PR_957b、Ascend950PR_957c、Ascend950PR_957d、Ascend950PR_9589、Ascend950PR_958b、Ascend950PR_9599),使用时以源码为准。
三、set_platform函数全解析
3.1 函数签名与参数
def set_platform( backend: Union[Backend, str], soc_version: Optional[Union[Platform, str]] = None, device_id: Optional[int] = None, check=True, ) -> None各参数含义如下:
| 参数 | 类型 | 必选 | 说明 |
|---|---|---|---|
backend | Backend枚举或str | 是 | 执行后端类型,Backend.Model或Backend.NPU;字符串"Model"/"NPU"同样被接受 |
soc_version | Platform枚举或str | 否 | 目标 SOC 版本。Model 后端不传时默认Ascend910B1;NPU 后端不传时自动取当前硬件平台 |
device_id | int | 否 | 执行使用的设备 ID,不传默认使用 0 号设备 |
check | bool | 否 | 是否校验运行时库可用性,默认True;库不可用时抛异常 |
3.2 内部执行流程
set_platform的实现位于 python/asc/runtime/config.py,其核心逻辑分为四步:
- 参数归一化:
backend = Backend(backend)、soc_version = Platform(soc_version),将字符串统一转为枚举。 - 后端分支处理:
Model后端:若未指定soc_version,自动填充默认值Platform.Ascend910B1,然后调用rt.use_model()切换全局状态为仿真模式;NPU后端:调用rt.current_platform()从硬件层读取实际 SOC 版本(底层通过 ctypes 调用GetSocVersionWrapper,见 python/asc/lib/runtime/interface.py),若传入的soc_version与真实平台不一致,抛出ValueError;随后调用rt.use_npu()切换到硬件模式。
- 写入 SOC 版本:统一调用
rt.set_soc_version(soc_version)保存到全局状态(对应state.soc_verison,见 interface.py),该值会在后续编译阶段决定目标指令集。 - 设备设置与可用性检查:若指定了
device_id,调用rt.set_device(device_id);若check=True且运行库不可用(rt.is_available()返回False),抛出RuntimeError,并针对 Model 后端在错误信息中提示需要导出的仿真库路径。
3.3 异常行为
- 未知后端:抛出
ValueError(f"Unknown execution backend: ...")。 - NPU 平台不匹配:输入 SOC 与真实硬件不一致时,抛出
ValueError,提示 "Input soc version ... is different from actual ..."。 - 运行库不可用(
check=True):抛出RuntimeError。对 Model 后端,错误信息会指导你补齐LD_LIBRARY_PATH,形如:
Please export LD_LIBRARY_PATH=$ASCEND_HOME_PATH/tools/simulator/Ascend910B3/lib:$LD_LIBRARY_PATH这一错误消息中的 SOC 版本占位符会被真实值替换,相关行为在单元测试 python/test/unit/runtime/test_config.py 中有专门断言。
四、典型使用示例
4.1 最小调用形式
import asc.runtime.config as config from asc.runtime.config import Backend, Platform # 1) Model 后端 + 默认平台(Ascend910B1),仿真运行 config.set_platform(Backend.Model) # 2) Model 后端 + 显式指定平台 config.set_platform(Backend.Model, Platform.Ascend910B1) config.set_platform(Backend.Model, "Ascend910B3", check=False) # 3) NPU 后端 + 指定设备,平台自动从硬件获取并校验 config.set_platform("NPU", device_id=0)4.2 与算子运行结合的完整流程
仓库中的 examples/01_add/add.py 给出了一个完整的可运行范式:先用命令行参数指定后端与平台,再调用set_platform,随后根据后端类型把输入张量放到npu或cpu设备上执行:
def vadd_custom(backend: config.Backend, platform: config.Platform): config.set_platform(backend, platform) device = "npu" if config.Backend(backend) == config.Backend.NPU else "cpu" size = 8 * 2048 x = torch.rand(size, dtype=torch.float32, device=device) y = torch.rand(size, dtype=torch.float32, device=device) z = vadd_launch(x, y) assert torch.allclose(z, x + y)其命令行入口校验了Backend与Platform的合法取值,并支持如下运行方式(源码注释见 add.py):
# Model 仿真运行(默认平台) python add.py -r Model # Model 仿真运行,指定平台 python add.py -r Model -v Ascend910B3 # NPU 真实硬件运行 python add.py -r NPU05_matmul_leakyrelu/matmul_leakyrelu.py、07_swiglu/swiglu.py等其余 examples 示例均沿用同一模式,可作为参考。
4.3 在性能剖析场景中的使用
在 docs/op_debug_prof.md 的 PyTorch Profiler 采集示例中,set_platform被用来统一两个场景的设备选择逻辑——仿真时张量放cpu,硬件时放npu,从而让同一段剖析代码可在两种后端下切换运行。
五、底层原理与状态流转
set_platform的开关动作最终都落在asc.lib.runtime的全局状态上,理解这条链路有助于排查运行时问题:
- 模式切换:
use_model()/use_npu()仅修改全局标志state.model(见 python/asc/lib/runtime/interface.py),后续编译与启动流程通过is_model()查询当前模式。 - 平台写入:
set_soc_version()保存平台枚举,供编译期生成对应指令(interface.py)。 - 设备与流:
set_device()触发底层SetDeviceWrapper,并为该设备创建默认流current_stream()(interface.py)。 - 惰性初始化:真正加载运行库发生在首次调用时(
_lazy_init),因此"仿真优先"的开发模式下,Model 后端并不需要真实的 NPU 驱动与硬件即可完成算子功能验证,这正是 pyasc 推荐先 Model 后 NPU 的开发节奏(可参考 docs/quick_start.md 与 docs/pyasc_op_develop_guide.md)。
六、常见问题与注意事项
- NPU 后端平台必须一致:
soc_version与真实硬件不符会直接抛ValueError;不传该参数可自动适配当前硬件。 - Model 后端需要仿真库:若
check=True时报RuntimeError,请按错误提示导出LD_LIBRARY_PATH,或临时以check=False跳过校验(仅用于快速原型验证)。 - 多设备选择:
device_id不传默认使用 0 号设备;切换设备时旧设备的流会被自动释放(见 interface.py)。 - 枚举与字符串等价:
Backend/Platform的所有参数都可用等值字符串传入,便于从命令行或配置文件驱动。
七、参考资源
- 接口文档:docs/python-api/lib/config.md
- 源码实现:python/asc/runtime/config.py
- 运行时底层封装:python/asc/lib/runtime/interface.py
- 单元测试:python/test/unit/runtime/test_config.py
- 完整示例:examples/01_add/add.py
- 环境准备与算子开发指引:docs/quick_start.md、docs/pyasc_op_develop_guide.md
【免费下载链接】pyasc本项目为Python用户提供算子编程接口,支持在昇腾AI处理器上加速计算,接口与Ascend C一一对应并遵守Python原生语法。项目地址: https://gitcode.com/cann/pyasc
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考