在 CANN 生态的技术栈里,我们已经陆续介绍了从 底层指令(pto-isa)、算子基础(opbase)、数学运算(ops-math)、跨语言交互(hixl)、图编译(GE)、高性能模板库(catlass)、自定义算子开发(asc-devkit)、Transformer 加速(ops-transformer)、元数据管理(metadef)、推理部署(cann-recipes-infer)到 算子基础设施(opbase)等众多工具。它们共同构成了从模型到硬件的完整闭环。

但有经验的开发者会发现,很多底层工具(尤其是 C++ 主导的)虽然性能强劲,却对 Python 用户不够友好:想快速验证一个硬件特性、写一个轻量测试脚本、或在 Jupyter Notebook 里交互式调试算子,往往需要写 C++ 代码、编译、再调用,流程冗长且割裂。

华为 CANN 生态中的 pyasc 库(全称 Python Ascend Control & Abstraction,Python 昇腾控制与抽象库),正是为了解决这一痛点而生。它是一套 面向 Python 开发者的 CANN 硬件与运行时控制库,将 CANN 的常用底层能力(设备管理、内存操作、流控制、算子执行、性能监控等)封装为 Pythonic API,让开发者能在 Python 环境中直接操控 CANN 硬件资源,实现 交互式调试、轻量测试、动态算子调用​ 等场景,真正做到“用 Python 掌控 CANN”。

如果说 pypto​ 让 Python 能调用 AI Core 指令,那么 pyasc​ 就是让 Python 能直接管理 CANN 设备、内存、流和运行时,是 Python 与 CANN 硬件之间的“万能遥控器”。

一、pyasc 是什么?为什么需要它?

pyasc​ 是 CANN 中专为 Python 开发者设计的硬件与运行时控制库,核心定位是:提供 Python 接口访问 CANN 设备资源与运行时功能,降低交互式开发与轻量验证的门槛

核心痛点与解决方案

传统 CANN 底层开发(C++/ACL)虽能发挥硬件极限性能,但在以下场景存在明显短板:

  • 交互式探索:在 Notebook 里想快速测试某个算子在不同输入下的性能,用 C++ 需反复编译;

  • 轻量脚本:运维或测试人员想写简单脚本监控 NPU 利用率、检查内存状态,用 C++ 太重;

  • 动态控制:实验中需要根据运行时数据动态调整 batch size 或切换算子,用 C++ 难以实时响应;

  • 教学演示:教学中希望现场演示硬件指令执行过程,用 C++ 编译运行会打断思路。

pyasc 的解决方案是 “Python 封装 + 零编译调用 + 动态控制”

  • Pythonic API:设备管理、内存分配、流同步、算子执行等操作像 NumPy 一样易用;

  • 即时调用:无需编译,直接 import pyasc即可调用底层功能;

  • 动态参数:支持运行时传入不同 shape、dtype、硬件 ID,方便做参数扫描与性能测试;

  • 监控集成:内置 NPU 利用率、温度、功耗等监控接口,方便运维与调试。

二、pyasc 的核心架构与功能模块

pyasc 的架构围绕 “设备管理层 → 内存管理层 → 流与执行层 → 监控与调试层”​ 构建,核心模块可分为四层(如图 1 所示),覆盖从硬件控制到运行时交互的全链路。

(一)设备管理层(Device Management)

目标:提供 Python 接口枚举、初始化、切换 CANN 设备(如不同 NPU 卡)。

核心接口:

import pyasc

# 枚举所有可用设备
devices = pyasc.device.enumerate()  
# 输出示例:[{'id': 0, 'name': 'ai_core_910b', 'status': 'online'}, ...]

# 初始化指定设备
dev = pyasc.device.init(device_id=0)  

# 获取当前设备信息
info = dev.get_info()  
print(info['memory_total'])  # 总内存,如 32 GB

特性

  • 支持多设备并发管理(如同时控制 0 号与 1 号卡);

  • 自动检测设备状态(在线/离线/异常),避免无效调用。

(二)内存管理层(Memory Management)

目标:在 Python 中直接分配、拷贝、释放 CANN 设备内存,支持 Host↔Device 零拷贝视图。

核心接口:

# 分配设备内存(FP16,1MB)
dev_mem = dev.alloc(size=1024 * 1024, dtype='float16')  

# 从 Host 拷贝数据到 Device
host_data = np.random.randn(1024).astype(np.float16)
dev_mem.copy_from(host_data)  

# 从 Device 拷贝回 Host(零拷贝视图,可选)
host_view = dev_mem.copy_to()  

# 释放内存
dev_mem.free()

特性

  • 支持 NumPy 数组与设备内存的直接互转;

  • 内存池复用,减少频繁分配开销;

  • 自动对齐到硬件要求的地址边界。

(三)流与执行层(Stream & Execution Control)

目标:管理 CANN 的执行流(类似 CUDA Stream),实现计算与数据搬运的异步并行。

核心接口:

# 创建执行流
stream = dev.create_stream()  

# 异步拷贝(Host→Device)
stream.memcpy(dev_mem, host_data, async_mode=True)  

# 异步执行算子(假设已有 om 模型)
model = pyasc.runtime.load_model('my_op.om', device_id=0)  
stream.exec(model, inputs=[dev_mem], outputs=[dev_mem_out])  

# 同步等待流完成
stream.synchronize()

特性

  • 支持多流并发,充分利用硬件多计算单元;

  • 流间可设置依赖关系(如流 B 等待流 A 完成);

  • 与 pypto 结合,可在 Python 中直接发射 ISA 指令流。

(四)监控与调试层(Monitoring & Debugging)

目标:提供 Python 接口实时采集硬件状态与运行时日志,辅助性能分析与故障排查。

核心接口:

# 采集 NPU 利用率(百分比)
util = pyasc.monitor.get_utilization(device_id=0)  
print(f"NPU Util: {util['compute']}% compute, {util['memory']}% memory")  

# 采集温度与功耗
status = pyasc.monitor.get_status(device_id=0)  
print(f"Temp: {status['temp']}°C, Power: {status['power']}W")  

# 启动性能 Profiling(生成 json 报告)
with pyasc.profiler.profile(stream=stream, output='profile.json'):
    stream.exec(model, inputs=[dev_mem], outputs=[dev_mem_out])

特性

  • 监控数据可实时绘制曲线(结合 matplotlib);

  • Profiling 报告可定位算子级耗时与内存瓶颈;

  • 支持日志级别动态调整(DEBUG/INFO/WARNING)。

三、代码示例:用 pyasc 做交互式算子性能测试

下面展示一个用 pyasc 在 Jupyter Notebook 中快速测试矩阵乘算子性能的例子:

import pyasc
import numpy as np
import time

# 初始化设备与流
dev = pyasc.device.init(0)
stream = dev.create_stream()

# 加载 OM 模型(假设已用 atc 转换好 MatMul)
model = pyasc.runtime.load_model('matmul_fp16.om', device_id=0)

# 测试不同矩阵尺寸的性能
for m, k, n in [(128, 128, 128), (512, 512, 512), (1024, 1024, 1024)]:
    # 分配输入输出内存
    a = dev.alloc(m*k, dtype='float16')
    b = dev.alloc(k*n, dtype='float16')
    c = dev.alloc(m*n, dtype='float16')
    
    # 拷贝测试数据
    a.copy_from(np.random.randn(m*k).astype(np.float16))
    b.copy_from(np.random.randn(k*n).astype(np.float16))
    
    # 预热
    stream.exec(model, inputs=[a, b], outputs=[c])
    stream.synchronize()
    
    # 计时执行
    start = time.time()
    for _ in range(100):
        stream.exec(model, inputs=[a, b], outputs=[c])
    stream.synchronize()
    elapsed = time.time() - start
    
    print(f"MatMul {m}x{k}x{n} | Avg Latency: {elapsed/100 * 1000:.2f} ms")
    
    # 释放内存
    a.free(); b.free(); c.free()

效果:无需离开 Notebook,即可完成不同尺寸的性能扫描,并实时可视化结果。

四、pyasc 的使用流程图

pyasc 的核心交互流程可总结为“初始化设备→管理内存→创建流→执行与监控→分析结果”,具体流程如图 2 所示:

五、pyasc 的独特价值

维度

传统 C++/ACL 开发

pyasc Python 控制

交互性

需编译,打断思路

即时调用,Notebook 友好

轻量测试

需写完整程序

几行脚本完成参数扫描

动态控制

编译期固定参数

运行时灵活调整 shape/dtype

教学演示

环境配置复杂

开箱即用,现场演示方便

运维监控

需专用工具

Python 脚本集成监控告警

六、典型应用场景

  1. 交互式算子研发:在 Notebook 中快速验证新算子逻辑与性能,无需反复编译;

  2. 轻量运维脚本:定时采集 NPU 利用率、温度,异常时触发告警;

  3. 动态推理服务:根据请求负载实时调整 batch size 或切换模型;

  4. 教学与培训:现场演示硬件指令执行与内存管理过程,降低学习门槛;

  5. CI 测试:在 Python 测试框架中集成硬件功能验证(如内存泄漏检测)。

七、总结与展望

pyasc 库是 CANN 生态中 “Python 与硬件的桥梁”,它让 Python 开发者能以极低的开销直接操控 CANN 设备与运行时,实现交互式调试、轻量测试与动态控制。与 pypto​ 的指令级编程、opbase​ 的算子基础设施形成互补,pyasc 填补了 Python 在 CANN 底层控制领域的空白,让整个工具链从“C++ 主导”扩展到“Python 友好”。

未来,pyasc 将进一步强化与 Jupyter、VS Code 等交互式环境的集成,支持可视化调试(如内存热力图、指令流跟踪),并成为 CANN 生态中“Python 原生开发”的核心入口。

📌 仓库地址https://atomgit.com/cann/pyasc

📌  CANN组织地址https://atomgit.com/cann

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐