【CANN训练营学习笔记】深入探索昇腾数据科学库AsNumpy的高性能奥秘

训练营简介

2025年昇腾CANN训练营第二季,基于CANN开源开放全场景,推出0基础入门系列、码力全开特辑、开发者案例等专题课程,助力不同阶段开发者快速提升算子开发技能。获得Ascend C算子中级认证,即可领取精美证书,完成社区任务更有机会赢取华为手机,平板、开发板等大奖

报名链接:https://www.hiascend.com/developer/activities/cann20252#cann-camp-2502-intro

📖 本文思维导图

mindmap
  root((AsNumpy))
    时代背景
      政策支持
        AI+行动
        开源生态
      技术趋势
        Python流行
        NumPy地位
        NPU需求
    设计理念
      三大目标
        高效计算
        接口兼容
        易于使用
      三层架构
        接口层
        封装层
        运行时层
    技术实现
      NPUArray
        数据结构
        自动内存管理
        数据类型扩展
      内存池设计
        虚拟内存管理
        2MB页映射
        批处理优化
      算子接口
        250个接口规划
        113个已开源
        模块划分
      OpenBolt算子库
        40个核心算子
        9个基础库
        三层架构
    性能表现
      测试结果
        小数据1倍
        中等数据12倍
        大数据100倍
      使用建议
      应用示例
    安装使用
      安装流程
      快速验证
      代码示例
    教育价值
      三层培养体系
        课程层面
        俱乐部层面
        项目层面
      人才培养
    社区贡献
      开源成果
      贡献机会
      版本规划

一、与AsNumpy的初次相遇

今天有幸听到了哈尔滨工业大学团队关于AsNumpy的分享,作为一个数据科学从业者,我对这个库充满了好奇。NumPy是Python数据科学的基石,几乎每个搞数据分析和机器学习的人都离不开它。而AsNumpy承诺在保持NumPy接口兼容的同时,利用昇腾NPU的强大算力实现显著的性能提升。这不就是我们梦寐以求的东西吗?

二、时代背景:国产AI基础软件的崛起

2.1 政策东风

老师在分享中首先提到了一个重要的政策背景:

2025年8月21日,国务院发布了《关于深入实施人工智能+行动的意见》

这是中国首部AI领域纲领性文件,提出了人工智能+六大行动,特别强调:

  • 强化基础支撑能力
  • 构建面向全球开放的开源技术体系
  • 建设开源社区生态

这让我感受到,国产AI基础软件迎来了历史性的发展机遇!

2.2 技术趋势

老师分享了几个有趣的数据:

编程语言流行度

  • Python占比26.14%,成为历史上最受欢迎的编程语言
  • NumPy作为Python基础数学库,地位无可替代

用户需求

  • NumPy社区调查:33%用户最关注性能问题
  • 用户期待对异构计算设备(GPU/NPU)的支持

现状痛点

  • 当前NPU上缺乏能够利用NPU强大计算能力的NumPy实现
  • 需要一个性能强大且兼容NumPy接口的库

这正是AsNumpy诞生的背景!

三、AsNumpy的设计理念与架构

3.1 三大核心目标

老师明确了AsNumpy的三大目标,我觉得非常清晰:

目标1:高效计算

  • 在昇腾NPU上实现高效的数学运算
  • 支持数据科学和科学计算
  • 充分发挥NPU的算力优势

目标2:接口兼容

  • 与NumPy接口高度兼容
  • 最小化用户学习曲线
  • 实现无缝迁移

目标3:易于使用

  • 简单的API调用
  • 无需深入了解底层硬件
  • 零门槛使用NPU

在这里插入图片描述

3.2 三层架构设计

老师展示了AsNumpy的架构设计,我把它整理成了一个清晰的层次结构:

第一层:接口层

  • 与NumPy接口高度兼容
  • 用户通过熟悉的NumPy API调用
  • 示例:asnp.array(), asnp.matmul(), asnp.sum()

第二层:封装层

  • 封装SNC(昇腾C语言)编写的算子
  • 封装数据结构(NPUArray)
  • 提供Python和底层的桥梁

第三层:运行时层

  • 直接调用NPU的运行时接口(ACL)
  • 管理设备内存
  • 执行算子调用

3.3 无缝迁移体验

老师给了一个对比示例,让我印象深刻:

使用NumPy

import numpy as np

# 创建数组
a = np.array([1, 2, 3, 4, 5])
b = np.array([2, 3, 4, 5, 6])

# 矩阵运算
c = np.matmul(a, b.T)

# 统计运算
mean_val = np.mean(a)

使用AsNumpy

import asnumpy as asnp

# 创建数组(在NPU上)
a = asnp.array([1, 2, 3, 4, 5])
b = asnp.array([2, 3, 4, 5, 6])

# 矩阵运算(在NPU上执行)
c = asnp.matmul(a, b.T)

# 统计运算(在NPU上执行)
mean_val = asnp.mean(a)

对比发现

  • 接口调用完全一致!
  • 只需要将numpy改为asnumpy
  • 代码逻辑完全不变
  • 但性能可以提升数十倍甚至上百倍!

四、技术实现的精妙设计

4.1 NPUArray:核心数据结构

老师详细讲解了NPUArray的设计,我觉得这是AsNumpy的核心之一。

设计原则

  1. 完全兼容NumPy的NDArray API
  2. 内部封装DType、Shape等基本信息
  3. 封装ACL(昇腾计算语言)传输数据结构
  4. 自动化内存管理

自动内存管理的重要性

传统的NPU编程需要手动管理内存:

// 传统方式(容易出错)
void* devPtr;
aclrtMalloc(&devPtr, size);  // 分配
// ... 使用 ...
aclrtFree(devPtr);           // 释放(容易忘记)

AsNumpy的NPUArray自动管理:

# AsNumpy方式(自动管理)
arr = asnp.array([1, 2, 3])  # 自动分配
# ... 使用 ...
# 超出作用域自动释放,不会内存泄漏!

数据类型扩展

AsNumpy扩展了三大类数据类型:

  1. 整型类型:int8, int16, int32, int64, uint8, uint16, uint32, uint64
  2. 浮点型类型:float16, float32, float64, bfloat16
  3. 复数类型:complex64, complex128

通过CAPI注册,包装成Python可用的数据对象。

4.2 内存池设计:性能的关键

老师讲的内存池设计让我大开眼界,这是AsNumpy高性能的关键之一!

传统内存分配的问题

每次创建数组都需要:

申请内存 → 使用 → 释放
申请内存 → 使用 → 释放
...

频繁的申请和释放操作开销很大!

内存池的设计

基于昇腾NPU提供的虚拟内存管理器:

核心思想

  1. 预先分配大块连续的虚拟地址
  2. 按2MB页为最小单位进行映射和回收
  3. 虚拟地址不足时进行重新映射压缩
  4. 将小操作合并为大的批处理操作

优势

  • 减少内存分配次数
  • 提高内存利用率
  • 降低内存碎片
  • 提升整体性能

我画了一个简单的示意图来理解:

传统方式:
[申请] [使用] [释放] [申请] [使用] [释放] ...
 ↑开销    ↑开销    ↑开销

内存池方式:
[预分配大块内存]
    ↓
[分配] [回收] [分配] [回收] ...(都在内存池内,开销小)
    ↓
[统一释放]

4.3 算子接口的规划与实现

总体规划

  • 规划约250个接口
  • 已完成113个接口开源
  • 年底目标完成200个接口

模块划分

老师展示了AsNumpy的模块划分,我整理成了一个表格:

模块类型 具体模块 功能描述
基础模块 Debug 调试工具
基础模块 DType 数据类型管理
基础模块 Memory Pool 内存池
功能模块 Random 随机数生成
功能模块 I/O 输入输出
功能模块 Math 数学运算
功能模块 Linear Algebra 线性代数
功能模块 FFT 傅里叶变换

优先级策略

基于NumPy社区调查确定开发优先级:

  • Random模块:83%用户使用 → 优先级最高
  • 线性代数模块:70%用户使用 → 优先级高
  • 傅里叶变换等其他模块 → 逐步开发

这个策略很聪明——先做用户最需要的!

4.4 OpenBolt高性能算子库

老师特别介绍了OpenBolt算子库,这是AsNumpy高性能的基石。

设计理念

  • 聚焦40个核心算子进行极致优化
  • 构建9个基础算子库
  • 面向行业分层实现

三层架构

应用层:行业特定算子
    ↓
基础层:数学库、图像处理库
    ↓
核心层:40个核心算子(极致优化)

开发进展

老师分享了一些令人振奋的数据:

  • 从2025年5月开始投入开源开发
  • 团队规模:从4人扩展到35人(研究生为主)
  • 已完成113个算子
  • 年底目标完成200个算子

作为一个教育项目,能做到这个程度真的很了不起!

五、性能表现:数据说话

5.1 性能测试结果

老师展示的性能测试结果让我非常震撼:

测试场景:矩阵乘法

张量形状 AsNumpy执行时间 NumPy执行时间 加速比
100×100 约0.5ms 约0.5ms ≈1倍(无明显差异)
1000×1000 约5ms 约60ms 约12倍
10000×10000 约50ms 约5000ms 约100倍

结论

  • 小规模数据:性能差异不明显(主要是调用开销)
  • 中等规模数据:开始显现加速效果(12倍)
  • 大规模数据:可获得显著性能提升(100倍)

在这里插入图片描述

5.2 为什么小数据没有加速?

老师解释了一个很重要的概念:

开销组成

总时间 = 数据传输时间 + 计算时间

小数据场景

  • 数据传输时间占主导
  • 计算时间很短
  • NPU的优势体现不出来

大数据场景

  • 计算时间占主导
  • NPU的强大算力充分发挥
  • 加速效果显著

5.3 使用建议

基于性能测试结果,老师给出了使用建议:

小规模数据(<1000个元素)

  • 性能差异不明显
  • 可以继续使用NumPy
  • 或者用AsNumpy(为了代码统一)

中等规模数据(1000-100000个元素)

  • 开始显现加速效果
  • 建议使用AsNumpy

大规模数据(>100000个元素)

  • 强烈建议使用AsNumpy
  • 可获得显著性能提升

六、实际应用示例

6.1 矩阵乘法性能对比

老师给了一个完整的示例代码,我把它整理出来:

import numpy as np
import asnumpy as asnp
import time

# 定义数据尺寸
shape = (12000, 12000)

# 生成测试数据
np_data1 = np.random.rand(*shape)
np_data2 = np.random.rand(*shape)

# NumPy计算
print("NumPy计算中...")
start = time.time()
np_result = np.matmul(np_data1, np_data2)
np_time = time.time() - start
print(f"NumPy时间: {np_time:.3f}s")

# AsNumpy计算
print("AsNumpy计算中...")
ap_data1 = asnp.array(np_data1)
ap_data2 = asnp.array(np_data2)
start = time.time()
ap_result = asnp.matmul(ap_data1, ap_data2)
asnp.npu_synchronize()  # 同步等待计算完成
ap_time = time.time() - start
print(f"AsNumpy时间: {ap_time:.3f}s")

# 性能对比
print(f"加速比: {np_time/ap_time:.2f}x")

# 验证结果正确性
np_result_from_npu = asnp.to_numpy(ap_result)
max_diff = np.max(np.abs(np_result - np_result_from_npu))
print(f"最大误差: {max_diff}")

运行结果(老师展示的):

NumPy计算中...
NumPy时间: 8.523s
AsNumpy计算中...
AsNumpy时间: 0.086s
加速比: 99.10x
最大误差: 1.2e-5

接近100倍的加速,而且精度也得到了保证!

6.2 数据科学工作流示例

老师还展示了一个数据科学的完整工作流:

import asnumpy as asnp

# 1. 数据加载
data = asnp.load('large_dataset.npy')

# 2. 数据预处理
# 归一化
data_normalized = (data - asnp.mean(data)) / asnp.std(data)

# 3. 特征工程
# PCA降维
cov_matrix = asnp.cov(data_normalized.T)
eigenvalues, eigenvectors = asnp.linalg.eig(cov_matrix)

# 4. 统计分析
# 计算相关系数矩阵
corr_matrix = asnp.corrcoef(data_normalized.T)

# 5. 结果保存
asnp.save('processed_data.npy', data_normalized)

优势

  • 所有计算都在NPU上进行
  • 不需要频繁的CPU-NPU数据传输
  • 整体流程性能大幅提升

七、安装与快速上手

7.1 安装流程

老师演示了AsNumpy的安装过程,非常简单:

# 1. 克隆仓库
git clone https://gitee.com/ascend/asnumpy.git

# 2. 进入目录
cd asnumpy

# 3. 安装依赖
pip install -r requirements.txt

# 4. 安装AsNumpy
python setup.py install

注意事项

  • 需要先安装CANN开发套件
  • Python版本建议3.7+
  • 建议使用虚拟环境

7.2 快速验证

安装完成后,可以快速验证:

import asnumpy as asnp

# 创建数组
a = asnp.array([1, 2, 3, 4, 5])
print(a)

# 基本运算
b = a + 10
print(b)

# 数学函数
c = asnp.sqrt(a)
print(c)

如果能正常运行,说明安装成功!

八、教育价值与人才培养

8.1 开源背后的教育使命

老师特别强调了AsNumpy项目的教育价值,这让我非常感动。

哈工大的平台

  • 国家级产教融合创新平台
  • 计算机国家级实验示范中心
  • 教育部协同育人示范基地

三层培养体系

第一层:课程层面

  • 将开源项目融入培养方案
  • 在课程中教授开源开发
  • 学生在学习中贡献代码

第二层:俱乐部层面

  • 学生自主创新实体
  • 组织技术分享和项目实践
  • 培养团队协作能力

第三层:项目层面

  • 技术研发和科研成果
  • 直接贡献到开源社区
  • 产生实际影响力

8.2 培养目标

分阶段培养

  • 本科生:参与基础算子开发,学习基本技能
  • 研究生:承担核心算子优化,深入技术细节
  • 博士生:引领技术方向,产出创新成果

目标

  • 支撑全国高校和企业的人才培养
  • 反哺昇腾开源生态
  • 培养AI底层开发人才

这让我想起老师说的一句话:“我们不只是在做一个库,更是在培养能够做出这样的库的人才!”

九、社区与贡献

9.1 开源成果

老师分享了一些令人振奋的数据:

里程碑

  • 首个第三方在昇腾官方仓开源的库
  • 开源第二天获得Gitee开源项目奖(排名68)
  • 在华为全联接大会等技术会议分享

影响力

  • 持续增长的star数
  • 越来越多的贡献者
  • 多个高校和企业关注

9.2 如何贡献

老师欢迎大家参与贡献,贡献机会包括:

1. 接口扩展实现

  • 实现还未开发的NumPy接口
  • 参考NumPy官方文档
  • 提交PR到社区

2. 算法优化

  • 优化现有算子的性能
  • 减少内存使用
  • 提升计算效率

3. 新功能开发

  • 添加新的功能模块
  • 支持新的数据类型
  • 扩展应用场景

4. 文档完善

  • 编写使用教程
  • 添加示例代码
  • 翻译文档

9.3 版本规划

老师分享了AsNumpy的版本规划:

v0.2(当前版本)

  • 兼容NumPy前100个API
  • 基本功能可用
  • 性能初步优化

v1.0(近期目标)

  • 更好的兼容性
  • 支持主要算法迁移
  • 性能进一步优化

v2.0(长期目标)

  • 拓展更多SNC库
  • 支持算子扩展
  • 完善的生态系统

十、我的学习感悟

10.1 国产AI基础软件的希望

这次学习让我看到了国产AI基础软件的希望。AsNumpy不是简单地"重新发明轮子",而是在充分利用国产硬件优势的基础上,为用户提供更好的体验。

关键点

  • 接口兼容:降低迁移成本
  • 性能优越:充分利用NPU算力
  • 开源开放:构建生态系统

10.2 教育与科研的结合

哈工大团队的做法给了我很大启发:

  • 不只是做项目,更是培养人才
  • 学生在参与中学习
  • 成果在实践中产生

这是一种可持续的开源模式!

10.3 性能优化的重要性

AsNumpy的性能优化让我认识到:

  • 硬件特性的深入理解是关键
  • 内存管理对性能影响巨大
  • 算子优化需要精细调优

10.4 开源社区的力量

AsNumpy的快速发展证明了开源社区的力量:

  • 众人拾柴火焰高
  • 开放协作产生创新
  • 生态系统共同繁荣

十一、后续学习计划

基于这次学习,我制定了自己的学习计划:

第一阶段:熟悉使用(1周)

  1. 安装AsNumpy环境
  2. 运行官方示例
  3. 将一个小项目迁移到AsNumpy

第二阶段:深入理解(1个月)

  1. 阅读AsNumpy源码
  2. 理解内存池设计
  3. 学习算子优化技巧

第三阶段:贡献代码(持续)

  1. 实现一个简单的算子
  2. 优化现有算子性能
  3. 编写使用文档

第四阶段:推广应用(持续)

  1. 在实际项目中使用AsNumpy
  2. 分享使用经验
  3. 推广给团队成员

十二、总结

这次学习让我深入了解了AsNumpy——一个充分利用昇腾NPU算力的高性能数据科学库。从设计理念到技术实现,从性能表现到教育价值,AsNumpy展现了国产AI基础软件的创新与实力。

核心要点回顾

  1. 设计理念:高效计算、接口兼容、易于使用
  2. 技术架构:接口层、封装层、运行时层三层设计
  3. 核心技术:NPUArray数据结构、内存池优化、OpenBolt算子库
  4. 性能表现:大规模数据可实现100倍加速
  5. 教育价值:培养AI底层开发人才,反哺开源生态

使用建议

  • 小规模数据:可选
  • 中等规模数据:推荐
  • 大规模数据:强烈推荐

对于想要学习AsNumpy的同学,我的建议是:

  1. 从简单的数据处理开始
  2. 逐步迁移现有项目
  3. 深入学习源码和优化技巧
  4. 参与社区贡献
Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐