在昇腾NPU上写NumPy代码是种什么体验?asnumpy实战踩坑全记录

news2026/5/24 10:31:51
前言最近项目需要在昇腾NPU上跑一些数值计算不是训练模型就是纯算东西——矩阵分解、特征值、随机采样之类的。一开始我想NumPy代码直接跑不就行了不行。NumPy跑在CPU上数据要从NPU搬回CPU才能算算完再搬回去。一来一回瓶颈全在数据搬运上NPU在那干等。后来翻CANN开源社区发现一个叫 asnumpy 的仓库。官方介绍是NPU原生NumPy兼容接口意思是你可以用类似NumPy的API但计算直接在NPU上完成不用来回搬数据。抱着试一试的心态装上了踩了不少坑折腾了两天才把整套流程跑通。这篇文章把整个过程记录下来希望能帮到同样在昇腾NPU上做数值计算的同学。asnumpy是什么和NumPy什么关系先澄清一件事asnumpy不是NumPy的昇腾移植版。它是昇腾CANN生态里的一个加速库提供了和NumPy类似的API但底层计算走的是昇腾NPU的达芬奇架构。简单说# CPU上用NumPy import numpy as np a np.random.rand(10000, 10000) b np.dot(a, a) # CPU算慢 # NPU上用asnumpy from cann.asnumpy import np # 导入路径不是标准库 a np.random.rand(10000, 10000) b np.dot(a, a) # NPU算快API看起来几乎一样但计算位置完全不同。从CANN的五层架构来看asnumpy属于第2层昇腾计算服务层的加速库与模板仓库和catlass、ATB同级。它的下面依赖CANN第4层的Runtime来调度NPU硬件。但有个关键的认知要建立asnumpy不是NumPy的100%替代品。它覆盖了NumPy最常用的子集矩阵运算、随机数、线性代数、傅里叶变换等但不是所有NumPy函数都有。一些冷门的、偏门的东西可能还没有。用之前最好确认一下你要的API在不在。仓库地址在 https://atomgit.com/cann/asnumpy README里有完整的API支持列表。环境准备硬件要求昇腾NPU具体来说是Atlas 300I Pro推理卡开发够用Atlas 300T Pro训练卡Atlas 800 训练服务器我手边是一台 Atlas 300I Pro下面所有操作都基于这张卡。软件依赖# 1. CANN Toolkit必须这是底层驱动和运行时 # 去昇腾官网下载版本要和你的NPU固件匹配 # 我用的是 CANN 8.0 # 2. Python 3.10建议3.11有兼容性问题后面会讲 conda create -n asnumpy_test python3.10 -y conda activate asnumpy_test # 3. torch-npuPyTorch的昇腾后端asnumpy依赖它 pip install torch-npu # 具体版本看CANN版本和CUDA版本的对应关系⚠️第一个坑torch-npu的版本对应关系很变态。CANN 8.0 对应 torch-npu 2.1.0CANN 8.5 对应 torch-npu 2.3.0。装错了会报各种稀奇古怪的错。去昇腾官网的配套关系表里查一下别凭感觉装。安装asnumpygit clone https://atomgit.com/cann/asnumpy.git cd asnumpy pip install -e .这里用的是开发模式安装-e方便后面改代码调试。正式用的话直接pip install .就行。装完后验证一下python -c from cann.asnumpy import np; print(np.__version__)能输出版本号就说明装好了。报错的话99%是torch-npu版本不对。基本用法矩阵运算先来个最简单的例子感受一下asnumpy的速度。import time import numpy as cpu_np # 标准NumPyCPU from cann.asnumpy import np # asnumpyNPU size 8000 # CPU上跑 a_cpu cpu_np.random.rand(size, size).astype(cpu_np.float32) t0 time.time() c_cpu cpu_np.dot(a_cpu, a_cpu) t_cpu time.time() - t0 print(fCPU: {t_cpu:.3f}s) # NPU上跑 a_npu np.random.rand(size, size) # 默认float32 # 第一次跑有JIT编译开销多跑一次取第二次的时间 _ np.dot(a_npu, a_npu) t0 time.time() c_npu np.dot(a_npu, a_npu) t_npu time.time() - t0 print(fNPU: {t_npu:.3f}s) print(f加速比: {t_cpu/t_npu:.1f}x)我跑出来的结果CPU: 4.812s NPU: 0.637s 加速比: 7.6x8000×8000的矩阵乘法NPU比CPU快了7倍多。这个加速比不算夸张因为数据搬运的开销已经算进去了创建NPU数组时要从CPU搬数据过去。如果是纯计算数据已经在NPU上加速比会更高。⚠️第二个坑数据类型必须是float32或float16。asnumpy目前不支持float64double精度。如果你的NumPy代码里用了dtypenp.float64要改成float32# 这样会报错 a np.array([1.0, 2.0, 3.0], dtypenp.float64) # 改成这样 a np.array([1.0, 2.0, 3.0], dtypenp.float32)这个限制是昇腾达芬奇架构决定的Cube矩阵计算单元原生支持fp16和fp32fp64要走Vector单元模拟速度会慢很多所以asnumpy直接不支持了。实战用asnumpy做PCA降维光看矩阵乘法没什么意思来个实际一点的例子。用asnumpy实现一个PCA主成分分析这是数值计算里很常见的操作。import numpy as cpu_np from cann.asnumpy import np import time # 生成测试数据10000个样本每个256维 n_samples 10000 n_features 256 print(生成数据...) X_cpu cpu_np.random.randn(n_samples, n_features).astype(cpu_np.float32) # CPU版本标准NumPy print(\n--- CPU版PCA ---) # 1. 中心化 mean_cpu X_cpu.mean(axis0) X_centered_cpu X_cpu - mean_cpu # 2. 协方差矩阵 t0 time.time() cov_cpu X_centered_cpu.T X_centered_cpu / (n_samples - 1) print(f协方差矩阵: {time.time() - t0:.3f}s) # 3. 特征值分解 t0 time.time() eigenvalues_cpu, eigenvectors_cpu cpu_np.linalg.eigh(cov_cpu) print(f特征值分解: {time.time() - t0:.3f}s) # 4. 取前50个主成分 top_k 50 idx_cpu cpu_np.argsort(eigenvalues_cpu)[::-1][:top_k] W_cpu eigenvectors_cpu[:, idx_cpu] # 5. 投影 t0 time.time() X_pca_cpu X_centered_cpu W_cpu print(f投影: {time.time() - t0:.3f}s) # NPU版本asnumpy print(\n--- NPU版PCA ---) # 把数据搬到NPU X np.array(X_cpu) # 从CPU数组创建NPU数组 # 1. 中心化 mean X.mean(axis0) X_centered X - mean # 2. 协方差矩阵 t0 time.time() cov X_centered.T X_centered / (n_samples - 1) # 等NPU算完asnumpy会自动同步 _ cov.shape # 触发同步 print(f协方差矩阵: {time.time() - t0:.3f}s) # 3. 特征值分解 t0 time.time() eigenvalues, eigenvectors np.linalg.eigh(cov) _ eigenvalues.shape # 同步 print(f特征值分解: {time.time() - t0:.3f}s) # 4. 取前50个主成分 idx np.argsort(eigenvalues)[::-1][:top_k] W eigenvectors[:, idx] # 5. 投影 t0 time.time() X_pca X_centered W _ X_pca.shape # 同步 print(f投影: {time.time() - t0:.3f}s)⚠️第三个坑asnumpy是异步执行的。上面代码里那些_ xxx.shape不是无聊写的是强制同步操作。asnumpy的计算是异步的提交到NPU就返回了如果你不显式同步计时是不准的。几种同步方式# 方式1访问shape触发同步推荐 _ result.shape # 方式2转回CPU数组强制同步 result_cpu result.asnumpy() # 把NPU数组转回NumPy数组 # 方式3用device_synchronize底层API import torch_npu torch_npu.npu.synchronize()我通常用方式1够用了。更多API线性代数和随机数asnumpy支持的API不少常用的几类矩阵运算a np.array([[1.0, 2.0], [3.0, 4.0]]) b np.array([[5.0, 6.0], [7.0, 8.0]]) np.dot(a, b) # 矩阵乘法 np.matmul(a, b) # 同上 a b # 同上Python运算符 np.linalg.inv(a) # 矩阵求逆 np.linalg.det(a) # 行列式 np.linalg.solve(a, b) # 解线性方程组 Ax b np.linalg.norm(a) # 范数 np.linalg.eigh(a) # 对称矩阵特征值分解 np.linalg.svd(a) # 奇异值分解随机数np.random.rand(100, 100) # 均匀分布 [0, 1) np.random.randn(100, 100) # 标准正态分布 np.random.randint(0, 10, 50) # 随机整数 np.random.seed(42) # 设置随机种子 np.random.permutation(100) # 随机排列数组操作a np.zeros((100, 100)) # 全零 b np.ones((100, 100)) # 全一 c np.eye(100) # 单位矩阵 np.concatenate([a, b], axis0) # 拼接 np.reshape(a, (10000,)) # 变形 np.transpose(a) # 转置⚠️第四个坑np.random的随机数质量。asnumpy的随机数生成用的是NPU硬件随机源分布特性和NumPy不完全一致。做科学计算特别是蒙特卡洛模拟建议对比一下结果。我遇到过方差偏大的情况最后还是把随机数生成放回CPU用NumPy做了只把矩阵运算放NPU上。NPU数组和CPU数组互相转换实际项目里数据往往在CPU上从文件读的、网络请求来的要手动搬到NPU上import numpy as cpu_np from cann.asnumpy import np # CPU → NPU cpu_arr cpu_np.random.rand(100, 100).astype(cpu_np.float32) npu_arr np.array(cpu_arr) # 自动拷贝到NPU # NPU → CPU result_cpu npu_arr.asnumpy() # 拷贝回CPU返回标准NumPy数组 print(type(result_cpu)) # class numpy.ndarray⚠️第五个坑别频繁来回搬数据。每次np.array()和.asnumpy()都是一次HBM到CPU内存的拷贝很慢。如果你要做多步计算尽量把数据放在NPU上所有计算做完再搬回来。# 反面教材频繁搬数据 a np.array(cpu_arr) # 搬一次 b np.dot(a, a) # NPU算 b_cpu b.asnumpy() # 搬回来 c np.array(b_cpu 1) # 又搬过去 ← 没必要 d np.dot(c, c) # NPU算 # 正确做法全程NPU a np.array(cpu_arr) # 搬一次 b np.dot(a, a) # NPU算 c b 1 # NPU算不用搬回来 d np.dot(c, c) # NPU算 result d.asnumpy() # 最后搬回来一次踩坑汇总把上面遇到的坑整理一下坑现象解法torch-npu版本不匹配import报错或运行时segfault查昇腾官网配套关系表不支持float64TypeError: unsupported dtype改用float32异步执行导致计时不准计时结果偏小用.shape或.asnumpy()触发同步随机数质量不一致蒙特卡洛结果偏差随机数在CPU生成计算在NPU做频繁数据搬运性能比预期差很多全程NPU计算最后搬回一次Python 3.11不兼容pip install失败用Python 3.10还有一个没提到的asnumpy目前不支持复杂复数complex64/complex128。如果你要做FFT相关的计算实数没问题复数不行。我在做信号处理的时候就卡在这了最后只能用ops-fft仓库的低层API替代。和NumPy的兼容性对比到底哪些能用哪些不能我列了个表是我实际测试过的CANN 8.0 asnumpy最新版功能类别支持情况备注矩阵乘法dot/matmul/✅ 完全支持核心功能稳定求逆linalg.inv✅ 支持方阵非奇异特征值分解linalg.eigh✅ 支持对称矩阵SVDlinalg.svd✅ 支持线性方程组linalg.solve✅ 支持排序sort/argsort✅ 支持布尔索引✅ 支持广播机制✅ 支持和NumPy一致复数运算❌ 不支持real/imag也不行float64❌ 不支持只能用float32/float16字符串数组❌ 不支持没这个需求吧结构化数组❌ 不支持内存映射memmap❌ 不支持大文件加载要注意覆盖率大概在70-80%左右日常数值计算够用了。如果遇到不支持的API只能回退到NumPy在CPU上跑或者自己用Ascend C写算子成本高。什么时候该用asnumpy说实话asnumpy不是万能的。我总结了几种适合和不适合的场景适合用asnumpy大规模矩阵运算10000×10000以上线性代数密集型计算PCA、矩阵分解、最小二乘需要反复跑的数值实验蒙特卡洛、参数扫描已经有NPU硬件想充分利用不适合用asnumpy小规模数据100×100以下CPU更快因为省了数据搬运开销需要float64高精度计算需要复数运算一次性脚本装环境的时间比跑脚本还长一个实用的判断标准如果你的计算涉及的数据量超过1GB或者矩阵维度超过5000asnumpy大概率能帮上忙。否则老老实实用NumPy在CPU上跑别折腾。个人总结折腾了两天asnumpy说说我的感受。asnumpy解决了一个很实际的问题昇腾NPU上的数值计算。以前要在NPU上做矩阵运算要么用PyTorch的tensor API但那个是给深度学习设计的很多数值计算API没有要么自己用Ascend C写算子门槛太高。asnumpy给了一个中间选择用熟悉的NumPy风格API但跑在NPU上。但它也有明显的局限float64不支持、复数不支持、API覆盖率不是100%。如果你的需求恰好落在它的覆盖范围内那挺好用省很多事。如果不在就比较难受了要么绕道要么自己造轮子。我目前的用法是混合模式数据预处理和随机数生成在CPU上用标准NumPy做大规模矩阵运算搬到NPU上用asnumpy做结果再搬回CPU。这样既利用了NPU的算力又避开了asnumpy的坑。虽然来回搬数据有点蠢但实测下来整体还是比纯CPU快3-5倍。如果你在做昇腾相关的开发推荐把asnumpy当作一个工具箱里的工具来看待——不是锤子钉子但在合适的时候掏出来确实好用。仓库代码质量不错注释清晰遇到问题翻源码基本能找到答案。仓库地址https://atomgit.com/cann/asnumpy有问题可以去仓库提Issue社区回复还挺快的。或者去 cann-learning-hub 看看有没有相关的教程那边内容更新得更勤一些。写了这么多希望能帮到正在昇腾NPU上做数值计算的你。有什么问题欢迎评论区交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2635796.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…