哈尔滨工业大学计算学部苏统华、王甜甜老师团队联合华为CANN团队开发的华为昇腾NPU原生Numpy仓库
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 4 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 3 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 9 个月前 | ||
| 1 个月前 | ||
| 3 天前 | ||
| 1 个月前 | ||
| 1 个月前 |
AsNumpy是一款面向昇腾NPU的轻量级科学计算Python库,与NumPy API完全兼容。
它通过pybind11绑定层封装华为CANN算子,并借助NPUArray数据结构(其设计与numpy.ndarray保持一致)对外提供接口。
本项目由哈尔滨工业大学AISS课题组与ISE课题组联合华为CANN团队共同开发。
import numpy as np
import asnumpy as ap
# Generate data on CPU
m1 = np.random.normal(0, 1, (3000, 3000)).astype(np.float32)
m2 = np.random.normal(0, 1, (3000, 3000)).astype(np.float32)
# Transfer to NPU
m1_npu = ap.ndarray.from_numpy(m1)
m2_npu = ap.ndarray.from_numpy(m2)
# Compute on NPU — same API as NumPy
result = ap.multiply(m1_npu, m2_npu)
# Transfer back to CPU
print(result.to_numpy())
注意:下方性能部分对
ap.mean()(归约操作)进行了基准测试, 这与上文演示的ap.multiply()(逐元素操作)有所不同。完整复现步骤请参见 benchmarks.md。
特性
- 兼容 NumPy API — 函数名称与签名均匹配 NumPy;现有代码可通过最小改动完成迁移
- 昇腾 910B 原生加速 — 算子通过 CANN ACLNN 直接在 NPU 上运行,无框架开销
- 自动资源管理 —
NPUArray析构函数自动释放设备内存(RAII 机制) - 双向数据传输 — 提供
from_numpy()和to_numpy()实现 CPU 与 NPU 间的无缝数据交换 - 广播支持 — 内置
GetBroadcastShape()遵循 NumPy 广播语义 - 算子可扩展性 — 缺失的 CANN 算子通过 OpenBOAT 进行补充
安装
环境要求:GCC >= 11.2,CMake >= 3.26,Python >= 3.9,CANN >= 8.2.RC1.alpha003,昇腾 910B NPU。
编译前需设置 CANN 环境变量:
export ASCEND_TOOLKIT_HOME=/usr/local/Ascend/ascend-toolkit/latest
使用 uv(推荐)
git clone --recursive https://gitcode.com/cann/asnumpy.git
cd asnumpy
uv sync
使用 pip
git clone --recursive https://gitcode.com/cann/asnumpy.git
cd asnumpy
# Upgrade pip, setuptools, and wheel to their latest versions
pip install --upgrade pip setuptools wheel
# Install the 'build' package, which provides a simple build front-end for Python packages
pip install build
# Build the current Python project (create source distribution and wheel)
python -m build
# Install all generated wheel (.whl) files from the dist/ directory
pip install dist/*.whl
验证安装
import asnumpy as ap
arr = ap.ones((1000, 1000), dtype=ap.float32)
print(arr.shape) # (1000, 1000)
快速入门
上文展示了一个极简示例。如需查看 NumPy 与 AsNumpy 代码的完整对比以及更多使用模式,请参阅快速入门指南。
可运行脚本位于 examples/ 目录下。
性能表现
在 3000×3000 float32 数据上,ap.mean() 在相同机器上的运行速度比 np.mean() 快 35.70 倍。随着数据规模的增大,NPU 的并行计算优势愈发显著。
ap.mean()是一种归约操作;顶部演示使用的是ap.multiply()(按元素操作)。
| 形状 | 数据量 | AsNumpy (毫秒) | NumPy (毫秒) | 加速比 |
|---|---|---|---|---|
| (500, 500) | 250,000 | 0.1446 | 0.1429 | 0.99 倍 |
| (1000, 1000) | 1,000,000 | 0.1510 | 0.4904 | 3.25 倍 |
| (2000, 2000) | 4,000,000 | 0.1636 | 1.9372 | 11.84 倍 |
| (3000, 3000) | 9,000,000 | 0.1857 | 6.6303 | 35.70 倍 |
完整测试环境、控制变量及复现说明:benchmarks.md。
路线图
| 版本号 | 季度 | 核心交付内容 |
|---|---|---|
| v0.3.0 | 26年Q1 | 文档网站(Docsify + GitCode Pages)、带硬件白名单的 CI/CD 流水线、代码质量全面优化(spdlog、clang-format)、PyPI 发布 |
| v0.4.0 | 26年Q2 | 数学函数 100% API 覆盖、Ascend 950 验证、triton-ascend 算子集成(10 个算子)、内存池(实验性) |
| v0.5.0 | 26年Q2 | 线性代数全面覆盖、triton-ascend 算子库扩展至 20 个算子、多 NPU 分布式计算研究 |
贡献指南
欢迎贡献代码。小的修复可直接提交拉取请求。对于较大功能,请先创建 issue 讨论设计方案。
有关构建说明、编码规范以及如何添加新算子,请参阅开发者指南。
资源链接
许可协议
Apache License, Version 2.0 — 详见 LICENSE。
AsNumpy 基于 NumPy 的 API 进行设计(详见 NumPy 许可协议)。
AsNumpy 由哈尔滨工业大学计算学部联合华为 CANN 团队共同开发与维护,并得到了社区贡献者的支持。
致谢
- 哈尔滨工业大学计算学部 AISS 课题组 — 苏统华教授团队
- 哈尔滨工业大学计算学部 ISE 课题组 — 王甜甜教授团队
- 华为 CANN 团队
如果 AsNumpy 对您有所帮助,请为我们点亮 star。