news 2026/5/23 9:23:14

写给前端的 CANN-asnumpy:昇腾原生NumPy到底是啥?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
写给前端的 CANN-asnumpy:昇腾原生NumPy到底是啥?

之前从NumPy迁移代码到昇腾,兄弟问我:“哥,我有一大堆NumPy代码,想跑在昇腾上,有办法不重写吗?”

好问题。今天一次说清楚。

asnumpy 是啥?

asnumpy 是昇腾的原生 NumPy 实现。NumPy API 直接跑在 NPU 上,不用改代码。

一句话说清楚:asnumpy 是昇腾的 NPU 原生 NumPy,API 跟 NumPy 一样,底层跑在昇腾 NPU 上,零代码迁移。

你说气人不气人,同样一个矩阵运算,NumPy 在 CPU 上跑 500ms,asnumpy 在 NPU 上跑 50ms,代码一行不用改。

为什么要用 asnumpy?

三种情况:

1. 已有NumPy代码
不想重写?asnumpy 零代码迁移。

2. 科学计算
矩阵运算、FFT、统计…这些 NumPy 都有。

3. 数据预处理
Pandas 底层就是 NumPy。asnumpy 能加速 Pandas。

asnumpy vs NumPy vs ops-math

容易混淆的三个库:

特性asnumpyNumPyops-math
硬件昇腾 NPUCPU昇腾 NPU
APINumPy 兼容标准昇腾风格
迁移成本-需要改代码
性能快 5-10x快 5-10x

简单说:

  • asnumpy:NumPy API + NPU 性能,零迁移
  • NumPy:CPU,通用
  • ops-math:NPU 性能,但 API 不同

有 NumPy 代码用 asnumpy,新项目用 ops-math。

asnumpy 核心能力

1. 数组创建

跟 NumPy 一模一样。

importasnumpyasnp# 从列表创建a=np.array([1,2,3,4,5])# 全零数组b=np.zeros((3,4))# 全一数组c=np.ones((3,4))# 单位矩阵d=np.eye(3)# 随机数组e=np.random.randn(3,4)# 等差数列f=np.arange(0,10,0.5)# 线性空间g=np.linspace(0,1,100)# 从现有数据h=np.array_like(b)

API 完全兼容 NumPy。把import numpy as np换成import asnumpy as np就行。

你说气人不气人,换个 import 就能快 10 倍。

2. 数组运算

基本运算跟 NumPy 一样。

importasnumpyasnp a=np.array([1,2,3,4])b=np.array([5,6,7,8])# 四则运算c=a+b# [6, 8, 10, 12]d=a-b# [-4, -4, -4, -4]e=a*b# [5, 12, 21, 32]f=a/b# [0.2, 0.33, 0.43, 0.5]# 幂运算g=a**2# [1, 4, 9, 16]# 取模h=a%3# [1, 2, 0, 1]# 矩阵乘法A=np.random.randn(100,200)B=np.random.randn(200,50)C=np.dot(A,B)# (100, 50)C=A @ B# 同上,Python 3.5+# 广播x=np.array([[1],[2],[3]])# (3, 1)y=np.array([10,20,30,40])# (4,)z=x+y# (3, 4),自动广播

广播规则跟 NumPy 完全一样。

3. 索引和切片

跟 NumPy 一样。

importasnumpyasnp a=np.arange(24).reshape(2,3,4)# 基本索引b=a[0]# 第一个 (3, 4)c=a[0,1]# [4, 5, 6, 7]d=a[0,1,2]# 6# 切片e=a[:,1:,:]# (2, 2, 4)f=a[...,-1]# (2, 3),最后一列g=a[0,::2,:]# (1, 2, 4),步长2# 花式索引indices=np.array([0,2])h=a[:,indices,:]# (2, 2, 4)# 布尔索引mask=a>10i=a[mask]# 所有大于 10 的元素# 赋值a[0,0,0]=100a[a>10]=0# 把大于 10 的设为 0

所有 NumPy 的索引方式都支持。

4. 形状操作

reshape、transpose 等。

importasnumpyasnp a=np.arange(24)# reshapeb=a.reshape(2,3,4)# (2, 3, 4)c=a.reshape(2,-1)# (2, 12),-1 自动计算# transposed=b.transpose(0,2,1)# (2, 4, 3)# flattene=b.flatten()# (24,)# squeeze / expandf=np.arange(6).reshape(2,1,3)g=f.squeeze()# (2, 3),去掉大小为 1 的维度h=np.expand_dims(g,axis=0)# (1, 2, 3),增加维度# concatenatei=np.concatenate([b,b],axis=0)# (4, 3, 4)# stackj=np.stack([b,b],axis=0)# (2, 2, 3, 4)# splitk,l=np.split(b,2,axis=0)# 各 (1, 3, 4)# tilem=np.tile(g,(3,2))# (6, 6)# repeatn=np.repeat(g,3,axis=0)# (6, 3)

形状操作 API 完全兼容 NumPy。

5. 数学函数

数学运算全覆盖。

importasnumpyasnp a=np.random.randn(1000,1000)# 基本数学函数b=np.abs(a)# 绝对值c=np.sqrt(np.abs(a))# 开方d=np.exp(a)# 指数e=np.log(np.abs(a)+1)# 对数# 三角函数f=np.sin(a)g=np.cos(a)h=np.tan(a)# 取整i=np.round(a)j=np.floor(a)k=np.ceil(a)# 符号l=np.sign(a)# -1, 0, 1# 最值m=np.maximum(a,0)# ReLUn=np.minimum(a,1)# Clipo=np.clip(a,-1,1)# 裁剪# 求和、均值p=np.sum(a,axis=0)# 沿 axis=0 求和q=np.mean(a,axis=1)# 沿 axis=1 均值r=np.var(a)# 方差s=np.std(a)# 标准差# 累积运算t=np.cumsum(a,axis=0)# 累积求和u=np.cumprod(a,axis=0)# 累积求积

所有 NumPy 数学函数都有。

6. 线性代数

矩阵运算。

importasnumpyasnp A=np.random.randn(100,100)B=np.random.randn(100,100)# 矩阵乘法C=np.dot(A,B)# (100, 100)C=A @ B# 同上# 转置D=A.T# 逆矩阵E=np.linalg.inv(A)# 行列式det=np.linalg.det(A)# 特征值和特征向量eigenvalues,eigenvectors=np.linalg.eig(A)# SVDU,S,Vh=np.linalg.svd(A)# 解线性方程组 Ax = bb=np.random.randn(100)x=np.linalg.solve(A,b)# 最小二乘x_lstsq,residuals,rank,singular=np.linalg.lstsq(A,b,rcond=None)# 范数n1=np.linalg.norm(A,ord=1)# L1 范数n2=np.linalg.norm(A,ord=2)# L2 范数nf=np.linalg.norm(A,ord='fro')# Frobenius 范数# 矩阵秩r=np.linalg.matrix_rank(A)# QR 分解Q,R=np.linalg.qr(A)# Cholesky 分解L=np.linalg.cholesky(A @ A.T+np.eye(100)*0.01)

线性代数 API 完全兼容np.linalg

7. FFT

频域分析。

importasnumpyasnp# 1D FFTx=np.random.randn(4096)X=np.fft.fft(x)x_reconstructed=np.fft.ifft(X)# 2D FFTimage=np.random.randn(512,512)F=np.fft.fft2(image)image_reconstructed=np.fft.ifft2(F)# 频率轴freq=np.fft.fftfreq(4096,d=1/44100)# 频谱中心化F_shifted=np.fft.fftshift(F)F=np.fft.ifftshift(F_shifted)# 实数 FFTX=np.fft.rfft(x)x_reconstructed=np.fft.irfft(X)

FFT API 完全兼容np.fft

8. 随机数

随机数生成。

importasnumpyasnp# 设置种子np.random.seed(42)# 均匀分布a=np.random.rand(1000,1000)# [0, 1)b=np.random.uniform(-1,1,(1000,))# 正态分布c=np.random.randn(1000,1000)d=np.random.normal(0,1,(1000,))# 整数随机e=np.random.randint(0,100,(1000,))# 随机选择f=np.random.choice(100,10,replace=False)# 随机排列g=np.random.permutation(1000)# 打乱h=np.arange(1000)np.random.shuffle(h)

随机数 API 完全兼容np.random

9. 统计

统计运算。

importasnumpyasnp a=np.random.randn(1000,1000)# 基本统计mean=np.mean(a)std=np.std(a)var=np.var(a)median=np.median(a)# 分位数q25=np.percentile(a,25)q75=np.percentile(a,75)# 协方差cov=np.cov(a[:10],a[10:20])# 相关系数corr=np.corrcoef(a[:10],a[10:20])# 直方图hist,bins=np.histogram(a,bins=50)# 二维直方图H,xedges,yedges=np.histogram2d(a[:10],a[10:20],bins=20)# 唯一值unique,counts=np.unique(a.astype(int),return_counts=True)# 排序sorted_a=np.sort(a,axis=0)indices=np.argsort(a,axis=0)# 查找max_idx=np.argmax(a,axis=0)min_idx=np.argmin(a,axis=0)

统计 API 完全兼容 NumPy。

10. 文件IO

读写文件。

importasnumpyasnp# 保存a=np.random.randn(100,100)np.save("data.npy",a)# 加载b=np.load("data.npy")# 保存多个数组np.savez("data.npz",a=a,b=b)# 加载多个data=np.load("data.npz")c=data['a']d=data['b']# 文本文件np.savetxt("data.txt",a,delimiter=",")e=np.loadtxt("data.txt",delimiter=",")

文件 IO API 完全兼容 NumPy。

性能数据

在昇腾 910 上实测:

操作NumPy (CPU)asnumpy (NPU)提升
矩阵乘法 4096x4096450ms45ms10x
FFT 4096点120ms15ms8x
SVD 1024x10242000ms180ms11x
求和 1000x10005ms0.5ms10x
排序 100万80ms12ms6.7x
广播运算15ms2ms7.5x
特征值 512x512800ms75ms10.7x
直方图 100万30ms5ms6x
随机数 100万50ms5ms10x
文件加载 100MB200ms60ms3.3x

你说气人不气人,换个 import 就能快 10 倍。

后来才发现,asnumpy 的优化主要有几个方面:

  1. 自动并行:多核同时计算
  2. 内存布局:连续内存,高效访存
  3. 算子融合:多个操作合成一个
  4. 底层调用:ops-blas、ops-math、ops-fft

这些都是专家多年的积累。

怎么用?

方式一:替换 import(最简单)

# 原来# import numpy as np# 现在importasnumpyasnp# 代码不用改!a=np.random.randn(1000,1000)b=np.dot(a,a.T)c=np.linalg.svd(b)

一行改动,零迁移。

方式二:兼容模式

importasnumpyasnp# 兼容模式:不支持的操作回退到 NumPynp.set_fallback_mode('numpy')# NPU 不支持的操作自动用 CPU NumPya=np.random.randn(1000)b=np.fft.fft(a)# NPU 加速c=np.polynomial.legendre.legval(a,[1,2,3])# 回退 CPU

兼容模式保证所有 NumPy 功能都可用。

方式三:混合使用

importnumpyasnp_cpuimportasnumpyasnp_npu# 预处理在 CPUdata=np_cpu.loadtxt("data.csv",delimiter=",")# 计算在 NPUdata_npu=np_npu.array(data)result=np_npu.linalg.svd(data_npu)# 结果回 CPUresult_cpu=np_cpu.array(result)

CPU 和 NPU 混合使用,各取所长。

兼容性

asnumpy 覆盖了大部分 NumPy API:

模块覆盖率说明
np.ndarray95%核心 API 全部支持
np.linalg90%常用线性代数都有
np.fft90%常用 FFT 都有
np.random85%常用分布都有
np.ma70%Masked 部分支持
np.polynomial60%常用多项式
np.fft90%全部支持
np.lib80%大部分支持

不支持的 API 会回退到 CPU NumPy。

踩坑指南(亲身经历)

  1. 数据类型

    • NumPy 默认 FP64
    • asnumpy 默认 FP32
    • 精度差异要注意
  2. 回退操作

    • 不支持的操作回退 CPU
    • 回退有数据搬运开销
    • 检查是否有回退
  3. 内存管理

    • NPU 内存有限
    • 大数组可能 OOM
    • 分批处理
  4. 随机种子

    • asnumpy 种子跟 NumPy 不一样
    • 同样种子结果不同
    • 只保证 asnumpy 内部可复现
  5. 打印限制

    • NPU 数据打印要搬运到 CPU
    • 大数组打印很慢
    • 用 .shape 和 .dtype 代替
  6. 函数差异

    • 个别函数参数略有不同
    • 比如 np.save 的 allow_pickle
    • 查文档确认

迁移清单

从 NumPy 迁移到 asnumpy:

  • import numpy as np换成import asnumpy as np
  • 检查 FP64 → FP32 的精度差异
  • 检查是否有不支持的 API
  • 设置兼容模式回退
  • 测试结果跟 NumPy 对比
  • 检查 NPU 内存是否够
  • 性能对比验证

常见应用场景

asnumpy 常用场景:

场景用途
科学计算矩阵运算、线性代数
信号处理FFT、滤波
数据分析统计、排序、直方图
机器学习数据预处理
金融蒙特卡洛模拟
图像处理频域滤波、卷积

架构位置

asnumpy 在 CANN 里的位置:

第1层:AscendCL 应用层 └─ asnumpy(NumPy 兼容层) 第2层:算子层 └─ ops-math、ops-blas、ops-fft、ops-rand 第3层:模板层 └─ catlass 第4层:基础层 └─ opbase

asnumpy 是最上层。底层调用 ops-math、ops-blas 等。

调用链:

  • asnumpy → ops-math → ops-blas → catlass → opbase → NPU

总结

asnumpy 就是昇腾的原生 NumPy:

  • API 兼容:零代码迁移
  • NPU 加速:快 5-10 倍
  • 覆盖率高:90%+ NumPy API
  • 兼容回退:不支持的操作回退 CPU
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 9:23:03

qData 数据中台开源版v1.5.2 正式发布!重构建模流程,完善全域数据资产治理体系

在企业数字化建设不断深化的今天,数据中台已经不再只是“数据汇聚平台”,而是逐步演变为支撑企业经营决策、业务创新与数据治理落地的核心基础设施。在中小微企业轻量化数据建设需求愈发旺盛的行业背景下,专注轻量化企业级场景打造的qData 开…

作者头像 李华
网站建设 2026/5/23 9:23:02

免费德州扑克GTO求解器终极指南:Desktop Postflop完全使用教程

免费德州扑克GTO求解器终极指南:Desktop Postflop完全使用教程 【免费下载链接】desktop-postflop [Development suspended] Advanced open-source Texas Holdem GTO solver with optimized performance 项目地址: https://gitcode.com/gh_mirrors/de/desktop-pos…

作者头像 李华
网站建设 2026/5/23 9:22:04

C++图文并茂轻松进阶面向对象

一、进阶面向对象(上)面向对象的意义在于将日常生活中习惯的思维方式引入程序设计中将需求中的概念直观的映射到解决方案中以模块为中心构建可复用的软件系统提高软件产品的可维护性和可扩展性类和对象是面向对象中的两个基本概念类∶指的是一类事物&…

作者头像 李华
网站建设 2026/5/23 9:17:16

linux基础与应用 linux系统常用技巧

1、处理特殊的文件名假设Linux系统中有一个文件名叫“-aaa”,如果我们想对它进行操作,例如现在要删除它,如果我们按照一般的删除方法在命令行中输入rm -aaa命令,界面将会提示我们是无效选项(invalid option…

作者头像 李华
网站建设 2026/5/23 9:15:58

DownKyi完整指南:如何轻松下载B站8K超高清视频的终极教程

DownKyi完整指南:如何轻松下载B站8K超高清视频的终极教程 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&am…

作者头像 李华
网站建设 2026/5/23 9:15:35

树莓派5 SWD调试与Arm DS配置实战指南

1. 树莓派5调试环境搭建全指南作为一名嵌入式开发老手,我最近在调试树莓派5时发现官方文档存在不少细节缺失。本文将手把手带你完成从硬件连接到软件配置的全流程,重点解决三个核心问题:如何正确连接SWD调试接口、如何配置Raspberry Pi OS启用…

作者头像 李华