之前从NumPy迁移代码到昇腾兄弟问我“哥我有一大堆NumPy代码想跑在昇腾上有办法不重写吗”好问题。今天一次说清楚。asnumpy 是啥asnumpy 是昇腾的原生 NumPy 实现。NumPy API 直接跑在 NPU 上不用改代码。一句话说清楚asnumpy 是昇腾的 NPU 原生 NumPyAPI 跟 NumPy 一样底层跑在昇腾 NPU 上零代码迁移。你说气人不气人同样一个矩阵运算NumPy 在 CPU 上跑 500msasnumpy 在 NPU 上跑 50ms代码一行不用改。为什么要用 asnumpy三种情况1. 已有NumPy代码不想重写asnumpy 零代码迁移。2. 科学计算矩阵运算、FFT、统计…这些 NumPy 都有。3. 数据预处理Pandas 底层就是 NumPy。asnumpy 能加速 Pandas。asnumpy vs NumPy vs ops-math容易混淆的三个库特性asnumpyNumPyops-math硬件昇腾 NPUCPU昇腾 NPUAPINumPy 兼容标准昇腾风格迁移成本零-需要改代码性能快 5-10x慢快 5-10x简单说asnumpyNumPy API NPU 性能零迁移NumPyCPU通用ops-mathNPU 性能但 API 不同有 NumPy 代码用 asnumpy新项目用 ops-math。asnumpy 核心能力1. 数组创建跟 NumPy 一模一样。importasnumpyasnp# 从列表创建anp.array([1,2,3,4,5])# 全零数组bnp.zeros((3,4))# 全一数组cnp.ones((3,4))# 单位矩阵dnp.eye(3)# 随机数组enp.random.randn(3,4)# 等差数列fnp.arange(0,10,0.5)# 线性空间gnp.linspace(0,1,100)# 从现有数据hnp.array_like(b)API 完全兼容 NumPy。把import numpy as np换成import asnumpy as np就行。你说气人不气人换个 import 就能快 10 倍。2. 数组运算基本运算跟 NumPy 一样。importasnumpyasnp anp.array([1,2,3,4])bnp.array([5,6,7,8])# 四则运算cab# [6, 8, 10, 12]da-b# [-4, -4, -4, -4]ea*b# [5, 12, 21, 32]fa/b# [0.2, 0.33, 0.43, 0.5]# 幂运算ga**2# [1, 4, 9, 16]# 取模ha%3# [1, 2, 0, 1]# 矩阵乘法Anp.random.randn(100,200)Bnp.random.randn(200,50)Cnp.dot(A,B)# (100, 50)CA B# 同上Python 3.5# 广播xnp.array([[1],[2],[3]])# (3, 1)ynp.array([10,20,30,40])# (4,)zxy# (3, 4)自动广播广播规则跟 NumPy 完全一样。3. 索引和切片跟 NumPy 一样。importasnumpyasnp anp.arange(24).reshape(2,3,4)# 基本索引ba[0]# 第一个 (3, 4)ca[0,1]# [4, 5, 6, 7]da[0,1,2]# 6# 切片ea[:,1:,:]# (2, 2, 4)fa[...,-1]# (2, 3)最后一列ga[0,::2,:]# (1, 2, 4)步长2# 花式索引indicesnp.array([0,2])ha[:,indices,:]# (2, 2, 4)# 布尔索引maska10ia[mask]# 所有大于 10 的元素# 赋值a[0,0,0]100a[a10]0# 把大于 10 的设为 0所有 NumPy 的索引方式都支持。4. 形状操作reshape、transpose 等。importasnumpyasnp anp.arange(24)# reshapeba.reshape(2,3,4)# (2, 3, 4)ca.reshape(2,-1)# (2, 12)-1 自动计算# transposedb.transpose(0,2,1)# (2, 4, 3)# flatteneb.flatten()# (24,)# squeeze / expandfnp.arange(6).reshape(2,1,3)gf.squeeze()# (2, 3)去掉大小为 1 的维度hnp.expand_dims(g,axis0)# (1, 2, 3)增加维度# concatenateinp.concatenate([b,b],axis0)# (4, 3, 4)# stackjnp.stack([b,b],axis0)# (2, 2, 3, 4)# splitk,lnp.split(b,2,axis0)# 各 (1, 3, 4)# tilemnp.tile(g,(3,2))# (6, 6)# repeatnnp.repeat(g,3,axis0)# (6, 3)形状操作 API 完全兼容 NumPy。5. 数学函数数学运算全覆盖。importasnumpyasnp anp.random.randn(1000,1000)# 基本数学函数bnp.abs(a)# 绝对值cnp.sqrt(np.abs(a))# 开方dnp.exp(a)# 指数enp.log(np.abs(a)1)# 对数# 三角函数fnp.sin(a)gnp.cos(a)hnp.tan(a)# 取整inp.round(a)jnp.floor(a)knp.ceil(a)# 符号lnp.sign(a)# -1, 0, 1# 最值mnp.maximum(a,0)# ReLUnnp.minimum(a,1)# Cliponp.clip(a,-1,1)# 裁剪# 求和、均值pnp.sum(a,axis0)# 沿 axis0 求和qnp.mean(a,axis1)# 沿 axis1 均值rnp.var(a)# 方差snp.std(a)# 标准差# 累积运算tnp.cumsum(a,axis0)# 累积求和unp.cumprod(a,axis0)# 累积求积所有 NumPy 数学函数都有。6. 线性代数矩阵运算。importasnumpyasnp Anp.random.randn(100,100)Bnp.random.randn(100,100)# 矩阵乘法Cnp.dot(A,B)# (100, 100)CA B# 同上# 转置DA.T# 逆矩阵Enp.linalg.inv(A)# 行列式detnp.linalg.det(A)# 特征值和特征向量eigenvalues,eigenvectorsnp.linalg.eig(A)# SVDU,S,Vhnp.linalg.svd(A)# 解线性方程组 Ax bbnp.random.randn(100)xnp.linalg.solve(A,b)# 最小二乘x_lstsq,residuals,rank,singularnp.linalg.lstsq(A,b,rcondNone)# 范数n1np.linalg.norm(A,ord1)# L1 范数n2np.linalg.norm(A,ord2)# L2 范数nfnp.linalg.norm(A,ordfro)# Frobenius 范数# 矩阵秩rnp.linalg.matrix_rank(A)# QR 分解Q,Rnp.linalg.qr(A)# Cholesky 分解Lnp.linalg.cholesky(A A.Tnp.eye(100)*0.01)线性代数 API 完全兼容np.linalg。7. FFT频域分析。importasnumpyasnp# 1D FFTxnp.random.randn(4096)Xnp.fft.fft(x)x_reconstructednp.fft.ifft(X)# 2D FFTimagenp.random.randn(512,512)Fnp.fft.fft2(image)image_reconstructednp.fft.ifft2(F)# 频率轴freqnp.fft.fftfreq(4096,d1/44100)# 频谱中心化F_shiftednp.fft.fftshift(F)Fnp.fft.ifftshift(F_shifted)# 实数 FFTXnp.fft.rfft(x)x_reconstructednp.fft.irfft(X)FFT API 完全兼容np.fft。8. 随机数随机数生成。importasnumpyasnp# 设置种子np.random.seed(42)# 均匀分布anp.random.rand(1000,1000)# [0, 1)bnp.random.uniform(-1,1,(1000,))# 正态分布cnp.random.randn(1000,1000)dnp.random.normal(0,1,(1000,))# 整数随机enp.random.randint(0,100,(1000,))# 随机选择fnp.random.choice(100,10,replaceFalse)# 随机排列gnp.random.permutation(1000)# 打乱hnp.arange(1000)np.random.shuffle(h)随机数 API 完全兼容np.random。9. 统计统计运算。importasnumpyasnp anp.random.randn(1000,1000)# 基本统计meannp.mean(a)stdnp.std(a)varnp.var(a)mediannp.median(a)# 分位数q25np.percentile(a,25)q75np.percentile(a,75)# 协方差covnp.cov(a[:10],a[10:20])# 相关系数corrnp.corrcoef(a[:10],a[10:20])# 直方图hist,binsnp.histogram(a,bins50)# 二维直方图H,xedges,yedgesnp.histogram2d(a[:10],a[10:20],bins20)# 唯一值unique,countsnp.unique(a.astype(int),return_countsTrue)# 排序sorted_anp.sort(a,axis0)indicesnp.argsort(a,axis0)# 查找max_idxnp.argmax(a,axis0)min_idxnp.argmin(a,axis0)统计 API 完全兼容 NumPy。10. 文件IO读写文件。importasnumpyasnp# 保存anp.random.randn(100,100)np.save(data.npy,a)# 加载bnp.load(data.npy)# 保存多个数组np.savez(data.npz,aa,bb)# 加载多个datanp.load(data.npz)cdata[a]ddata[b]# 文本文件np.savetxt(data.txt,a,delimiter,)enp.loadtxt(data.txt,delimiter,)文件 IO API 完全兼容 NumPy。性能数据在昇腾 910 上实测操作NumPy (CPU)asnumpy (NPU)提升矩阵乘法 4096x4096450ms45ms10xFFT 4096点120ms15ms8xSVD 1024x10242000ms180ms11x求和 1000x10005ms0.5ms10x排序 100万80ms12ms6.7x广播运算15ms2ms7.5x特征值 512x512800ms75ms10.7x直方图 100万30ms5ms6x随机数 100万50ms5ms10x文件加载 100MB200ms60ms3.3x你说气人不气人换个 import 就能快 10 倍。后来才发现asnumpy 的优化主要有几个方面自动并行多核同时计算内存布局连续内存高效访存算子融合多个操作合成一个底层调用ops-blas、ops-math、ops-fft这些都是专家多年的积累。怎么用方式一替换 import最简单# 原来# import numpy as np# 现在importasnumpyasnp# 代码不用改anp.random.randn(1000,1000)bnp.dot(a,a.T)cnp.linalg.svd(b)一行改动零迁移。方式二兼容模式importasnumpyasnp# 兼容模式不支持的操作回退到 NumPynp.set_fallback_mode(numpy)# NPU 不支持的操作自动用 CPU NumPyanp.random.randn(1000)bnp.fft.fft(a)# NPU 加速cnp.polynomial.legendre.legval(a,[1,2,3])# 回退 CPU兼容模式保证所有 NumPy 功能都可用。方式三混合使用importnumpyasnp_cpuimportasnumpyasnp_npu# 预处理在 CPUdatanp_cpu.loadtxt(data.csv,delimiter,)# 计算在 NPUdata_npunp_npu.array(data)resultnp_npu.linalg.svd(data_npu)# 结果回 CPUresult_cpunp_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。踩坑指南亲身经历数据类型NumPy 默认 FP64asnumpy 默认 FP32精度差异要注意回退操作不支持的操作回退 CPU回退有数据搬运开销检查是否有回退内存管理NPU 内存有限大数组可能 OOM分批处理随机种子asnumpy 种子跟 NumPy 不一样同样种子结果不同只保证 asnumpy 内部可复现打印限制NPU 数据打印要搬运到 CPU大数组打印很慢用 .shape 和 .dtype 代替函数差异个别函数参数略有不同比如 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 应用层 └─ asnumpyNumPy 兼容层 第2层算子层 └─ ops-math、ops-blas、ops-fft、ops-rand 第3层模板层 └─ catlass 第4层基础层 └─ opbaseasnumpy 是最上层。底层调用 ops-math、ops-blas 等。调用链asnumpy → ops-math → ops-blas → catlass → opbase → NPU总结asnumpy 就是昇腾的原生 NumPyAPI 兼容零代码迁移NPU 加速快 5-10 倍覆盖率高90% NumPy API兼容回退不支持的操作回退 CPU
写给前端的 CANN-asnumpy:昇腾原生NumPy到底是啥?
发布时间:2026/5/23 9:23:25
之前从NumPy迁移代码到昇腾兄弟问我“哥我有一大堆NumPy代码想跑在昇腾上有办法不重写吗”好问题。今天一次说清楚。asnumpy 是啥asnumpy 是昇腾的原生 NumPy 实现。NumPy API 直接跑在 NPU 上不用改代码。一句话说清楚asnumpy 是昇腾的 NPU 原生 NumPyAPI 跟 NumPy 一样底层跑在昇腾 NPU 上零代码迁移。你说气人不气人同样一个矩阵运算NumPy 在 CPU 上跑 500msasnumpy 在 NPU 上跑 50ms代码一行不用改。为什么要用 asnumpy三种情况1. 已有NumPy代码不想重写asnumpy 零代码迁移。2. 科学计算矩阵运算、FFT、统计…这些 NumPy 都有。3. 数据预处理Pandas 底层就是 NumPy。asnumpy 能加速 Pandas。asnumpy vs NumPy vs ops-math容易混淆的三个库特性asnumpyNumPyops-math硬件昇腾 NPUCPU昇腾 NPUAPINumPy 兼容标准昇腾风格迁移成本零-需要改代码性能快 5-10x慢快 5-10x简单说asnumpyNumPy API NPU 性能零迁移NumPyCPU通用ops-mathNPU 性能但 API 不同有 NumPy 代码用 asnumpy新项目用 ops-math。asnumpy 核心能力1. 数组创建跟 NumPy 一模一样。importasnumpyasnp# 从列表创建anp.array([1,2,3,4,5])# 全零数组bnp.zeros((3,4))# 全一数组cnp.ones((3,4))# 单位矩阵dnp.eye(3)# 随机数组enp.random.randn(3,4)# 等差数列fnp.arange(0,10,0.5)# 线性空间gnp.linspace(0,1,100)# 从现有数据hnp.array_like(b)API 完全兼容 NumPy。把import numpy as np换成import asnumpy as np就行。你说气人不气人换个 import 就能快 10 倍。2. 数组运算基本运算跟 NumPy 一样。importasnumpyasnp anp.array([1,2,3,4])bnp.array([5,6,7,8])# 四则运算cab# [6, 8, 10, 12]da-b# [-4, -4, -4, -4]ea*b# [5, 12, 21, 32]fa/b# [0.2, 0.33, 0.43, 0.5]# 幂运算ga**2# [1, 4, 9, 16]# 取模ha%3# [1, 2, 0, 1]# 矩阵乘法Anp.random.randn(100,200)Bnp.random.randn(200,50)Cnp.dot(A,B)# (100, 50)CA B# 同上Python 3.5# 广播xnp.array([[1],[2],[3]])# (3, 1)ynp.array([10,20,30,40])# (4,)zxy# (3, 4)自动广播广播规则跟 NumPy 完全一样。3. 索引和切片跟 NumPy 一样。importasnumpyasnp anp.arange(24).reshape(2,3,4)# 基本索引ba[0]# 第一个 (3, 4)ca[0,1]# [4, 5, 6, 7]da[0,1,2]# 6# 切片ea[:,1:,:]# (2, 2, 4)fa[...,-1]# (2, 3)最后一列ga[0,::2,:]# (1, 2, 4)步长2# 花式索引indicesnp.array([0,2])ha[:,indices,:]# (2, 2, 4)# 布尔索引maska10ia[mask]# 所有大于 10 的元素# 赋值a[0,0,0]100a[a10]0# 把大于 10 的设为 0所有 NumPy 的索引方式都支持。4. 形状操作reshape、transpose 等。importasnumpyasnp anp.arange(24)# reshapeba.reshape(2,3,4)# (2, 3, 4)ca.reshape(2,-1)# (2, 12)-1 自动计算# transposedb.transpose(0,2,1)# (2, 4, 3)# flatteneb.flatten()# (24,)# squeeze / expandfnp.arange(6).reshape(2,1,3)gf.squeeze()# (2, 3)去掉大小为 1 的维度hnp.expand_dims(g,axis0)# (1, 2, 3)增加维度# concatenateinp.concatenate([b,b],axis0)# (4, 3, 4)# stackjnp.stack([b,b],axis0)# (2, 2, 3, 4)# splitk,lnp.split(b,2,axis0)# 各 (1, 3, 4)# tilemnp.tile(g,(3,2))# (6, 6)# repeatnnp.repeat(g,3,axis0)# (6, 3)形状操作 API 完全兼容 NumPy。5. 数学函数数学运算全覆盖。importasnumpyasnp anp.random.randn(1000,1000)# 基本数学函数bnp.abs(a)# 绝对值cnp.sqrt(np.abs(a))# 开方dnp.exp(a)# 指数enp.log(np.abs(a)1)# 对数# 三角函数fnp.sin(a)gnp.cos(a)hnp.tan(a)# 取整inp.round(a)jnp.floor(a)knp.ceil(a)# 符号lnp.sign(a)# -1, 0, 1# 最值mnp.maximum(a,0)# ReLUnnp.minimum(a,1)# Cliponp.clip(a,-1,1)# 裁剪# 求和、均值pnp.sum(a,axis0)# 沿 axis0 求和qnp.mean(a,axis1)# 沿 axis1 均值rnp.var(a)# 方差snp.std(a)# 标准差# 累积运算tnp.cumsum(a,axis0)# 累积求和unp.cumprod(a,axis0)# 累积求积所有 NumPy 数学函数都有。6. 线性代数矩阵运算。importasnumpyasnp Anp.random.randn(100,100)Bnp.random.randn(100,100)# 矩阵乘法Cnp.dot(A,B)# (100, 100)CA B# 同上# 转置DA.T# 逆矩阵Enp.linalg.inv(A)# 行列式detnp.linalg.det(A)# 特征值和特征向量eigenvalues,eigenvectorsnp.linalg.eig(A)# SVDU,S,Vhnp.linalg.svd(A)# 解线性方程组 Ax bbnp.random.randn(100)xnp.linalg.solve(A,b)# 最小二乘x_lstsq,residuals,rank,singularnp.linalg.lstsq(A,b,rcondNone)# 范数n1np.linalg.norm(A,ord1)# L1 范数n2np.linalg.norm(A,ord2)# L2 范数nfnp.linalg.norm(A,ordfro)# Frobenius 范数# 矩阵秩rnp.linalg.matrix_rank(A)# QR 分解Q,Rnp.linalg.qr(A)# Cholesky 分解Lnp.linalg.cholesky(A A.Tnp.eye(100)*0.01)线性代数 API 完全兼容np.linalg。7. FFT频域分析。importasnumpyasnp# 1D FFTxnp.random.randn(4096)Xnp.fft.fft(x)x_reconstructednp.fft.ifft(X)# 2D FFTimagenp.random.randn(512,512)Fnp.fft.fft2(image)image_reconstructednp.fft.ifft2(F)# 频率轴freqnp.fft.fftfreq(4096,d1/44100)# 频谱中心化F_shiftednp.fft.fftshift(F)Fnp.fft.ifftshift(F_shifted)# 实数 FFTXnp.fft.rfft(x)x_reconstructednp.fft.irfft(X)FFT API 完全兼容np.fft。8. 随机数随机数生成。importasnumpyasnp# 设置种子np.random.seed(42)# 均匀分布anp.random.rand(1000,1000)# [0, 1)bnp.random.uniform(-1,1,(1000,))# 正态分布cnp.random.randn(1000,1000)dnp.random.normal(0,1,(1000,))# 整数随机enp.random.randint(0,100,(1000,))# 随机选择fnp.random.choice(100,10,replaceFalse)# 随机排列gnp.random.permutation(1000)# 打乱hnp.arange(1000)np.random.shuffle(h)随机数 API 完全兼容np.random。9. 统计统计运算。importasnumpyasnp anp.random.randn(1000,1000)# 基本统计meannp.mean(a)stdnp.std(a)varnp.var(a)mediannp.median(a)# 分位数q25np.percentile(a,25)q75np.percentile(a,75)# 协方差covnp.cov(a[:10],a[10:20])# 相关系数corrnp.corrcoef(a[:10],a[10:20])# 直方图hist,binsnp.histogram(a,bins50)# 二维直方图H,xedges,yedgesnp.histogram2d(a[:10],a[10:20],bins20)# 唯一值unique,countsnp.unique(a.astype(int),return_countsTrue)# 排序sorted_anp.sort(a,axis0)indicesnp.argsort(a,axis0)# 查找max_idxnp.argmax(a,axis0)min_idxnp.argmin(a,axis0)统计 API 完全兼容 NumPy。10. 文件IO读写文件。importasnumpyasnp# 保存anp.random.randn(100,100)np.save(data.npy,a)# 加载bnp.load(data.npy)# 保存多个数组np.savez(data.npz,aa,bb)# 加载多个datanp.load(data.npz)cdata[a]ddata[b]# 文本文件np.savetxt(data.txt,a,delimiter,)enp.loadtxt(data.txt,delimiter,)文件 IO API 完全兼容 NumPy。性能数据在昇腾 910 上实测操作NumPy (CPU)asnumpy (NPU)提升矩阵乘法 4096x4096450ms45ms10xFFT 4096点120ms15ms8xSVD 1024x10242000ms180ms11x求和 1000x10005ms0.5ms10x排序 100万80ms12ms6.7x广播运算15ms2ms7.5x特征值 512x512800ms75ms10.7x直方图 100万30ms5ms6x随机数 100万50ms5ms10x文件加载 100MB200ms60ms3.3x你说气人不气人换个 import 就能快 10 倍。后来才发现asnumpy 的优化主要有几个方面自动并行多核同时计算内存布局连续内存高效访存算子融合多个操作合成一个底层调用ops-blas、ops-math、ops-fft这些都是专家多年的积累。怎么用方式一替换 import最简单# 原来# import numpy as np# 现在importasnumpyasnp# 代码不用改anp.random.randn(1000,1000)bnp.dot(a,a.T)cnp.linalg.svd(b)一行改动零迁移。方式二兼容模式importasnumpyasnp# 兼容模式不支持的操作回退到 NumPynp.set_fallback_mode(numpy)# NPU 不支持的操作自动用 CPU NumPyanp.random.randn(1000)bnp.fft.fft(a)# NPU 加速cnp.polynomial.legendre.legval(a,[1,2,3])# 回退 CPU兼容模式保证所有 NumPy 功能都可用。方式三混合使用importnumpyasnp_cpuimportasnumpyasnp_npu# 预处理在 CPUdatanp_cpu.loadtxt(data.csv,delimiter,)# 计算在 NPUdata_npunp_npu.array(data)resultnp_npu.linalg.svd(data_npu)# 结果回 CPUresult_cpunp_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。踩坑指南亲身经历数据类型NumPy 默认 FP64asnumpy 默认 FP32精度差异要注意回退操作不支持的操作回退 CPU回退有数据搬运开销检查是否有回退内存管理NPU 内存有限大数组可能 OOM分批处理随机种子asnumpy 种子跟 NumPy 不一样同样种子结果不同只保证 asnumpy 内部可复现打印限制NPU 数据打印要搬运到 CPU大数组打印很慢用 .shape 和 .dtype 代替函数差异个别函数参数略有不同比如 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 应用层 └─ asnumpyNumPy 兼容层 第2层算子层 └─ ops-math、ops-blas、ops-fft、ops-rand 第3层模板层 └─ catlass 第4层基础层 └─ opbaseasnumpy 是最上层。底层调用 ops-math、ops-blas 等。调用链asnumpy → ops-math → ops-blas → catlass → opbase → NPU总结asnumpy 就是昇腾的原生 NumPyAPI 兼容零代码迁移NPU 加速快 5-10 倍覆盖率高90% NumPy API兼容回退不支持的操作回退 CPU