当前位置: 首页 > news >正文

Ascend Extension for PyTorch的源码解析

1 源码下载

Ascend对pytorch代码的适配,可从以下链接中获取。
Ascend/pytorch
执行如下命令即可。

git clone https://gitee.com/ascend/pytorch.git

2 目录结构解析

源码下载后,如果需要编译torch-npu,最好保持pytorch的源码版本匹配,以及其编译环境的gcc,g++等与torch-npu的版本匹配,否则会出现各种乱起八糟的问题。

执行编译命令:bash ci/build.sh --python=3.x

如:


csrc/aten/AutoCastOps.cpp:28:70: error: macro "KERNEL_PRIVATEUSEONE" passed 3 arguments, but takes just 2
KERNEL_PRIVATEUSEONE(_convolution, deprecated, lower_precision_fp)

在torch-npu编译成功之后,通过generate_code.sh会生成如下文件:

    torch_npu/csrc/aten/ADInplaceOrViewTypeEverything.cpptorch_npu/csrc/aten/ADInplaceOrViewType_0.cpptorch_npu/csrc/aten/ADInplaceOrViewType_1.cpptorch_npu/csrc/aten/CustomFunctions.cpptorch_npu/csrc/aten/CustomFunctions.htorch_npu/csrc/aten/CustomRedispatch.cpptorch_npu/csrc/aten/CustomRedispatch.htorch_npu/csrc/aten/CustomRegisterSchema.cpptorch_npu/csrc/aten/ForeachRegister.cpptorch_npu/csrc/aten/Functions.cpptorch_npu/csrc/aten/Functions.htorch_npu/csrc/aten/NPUOpApiNativeFunctions.htorch_npu/csrc/aten/QuantizedRegister.cpptorch_npu/csrc/aten/RegisterFunctionalizationEverything.cpptorch_npu/csrc/aten/RegisterFunctionalization_0.cpptorch_npu/csrc/aten/RegisterFunctionalization_1.cpptorch_npu/csrc/aten/RegisterSparseCsrNPU.cpptorch_npu/csrc/aten/RegisterSparseNPU.cpptorch_npu/csrc/aten/VariableType.htorch_npu/csrc/aten/VariableTypeEverything.cpptorch_npu/csrc/aten/VariableType_0.cpptorch_npu/csrc/aten/npu_native_functions_by_codegen.yamltorch_npu/csrc/aten/python_functions.htorch_npu/csrc/aten/python_functionsEverything.cpptorch_npu/csrc/aten/python_functions_0.cpptorch_npu/csrc/aten/python_functions_1.cpptorch_npu/csrc/aten/variable_factories.htorch_npu/testing/_npu_testing_utils.pytorch_npu/utils/custom_ops.pytorch_npu/utils/exposed_api.py

上述文件生成路径默认的是torch_npu/csrc/aten。算子编译信息的yaml文件:torch_npu/csrc/aten/npu_native_functions.yaml

打开上述的的文件中,从中分析可知大概有3种方式实现昇腾npu算子的调用。

3. 算子注册方式

本质上,ascend上对pytroch框架的适配代码,主要是将npu上的算子库对接起来。如何对接这些算子,是一套机制的问题,本身应该不复杂。

3.1 通过torch的regsiter方式

直接调用npu的算子。torch_npu/csrc/aten/RegisterSparseNPU.cpp

TORCH_LIBRARY_IMPL(aten, SparsePrivateUse1, m) {
m.impl("abs", TORCH_FN(wrap_SparseNPU_abs_));
m.impl("abs_", TORCH_FN(wrap_SparseNPU_abs__));
m.impl("abs.out", TORCH_FN(wrap_SparseNPU_abs_out));
m.impl("sgn", TORCH_FN(wrap_SparseNPU_sgn_));
m.impl("sgn_", TORCH_FN(wrap_SparseNPU_sgn__));
m.impl("sgn.out", TORCH_FN(wrap_SparseNPU_sgn_out));

3.2 通过定义算子方式

参考文件:torch_npu/csrc/aten/CustomFunctions.cpp

#include <ATen/core/dispatch/Dispatcher.h>#include "torch_npu/csrc/aten/CustomFunctions.h"namespace at_npu {
namespace native {
namespace custom_ops {int64_t npu_change_data_ptr(const at::Tensor & dst, const at::Tensor & src, int64_t index) {static auto op = c10::Dispatcher::singleton().findSchemaOrThrow("npu::npu_change_data_ptr", "").typed<int64_t (const at::Tensor &, const at::Tensor &, int64_t)>();return op.call(dst, src, index);
}
int64_t get_npu_format(const at::Tensor & self) {static auto op = c10::Dispatcher::singleton().findSchemaOrThrow("npu::get_npu_format", "").typed<int64_t (const at::Tensor &)>();return op.call(self);
}
at::Tensor npu_format_cast(const at::Tensor & self, const at::Tensor & dst) {static auto op = c10::Dispatcher::singleton().findSchemaOrThrow("npu::npu_format_cast", "Tensor").typed<at::Tensor (const at::Tensor &, const at::Tensor &)>();return op.call(self, dst);
}
at::Tensor & npu_format_cast_(at::Tensor & self, int64_t acl_format) {static auto op = c10::Dispatcher::singleton().findSchemaOrThrow("npu::npu_format_cast_", "acl_format").typed<at::Tensor & (at::Tensor &, int64_t)>();return op.call(self, acl_format);at::Tensor & npu_format_cast_(at::Tensor & self, const at::Tensor & src) {static auto op = c10::Dispatcher::singleton().findSchemaOrThrow("npu::npu_format_cast_", "").typed<at::Tensor & (at::Tensor &, const at::Tensor &)>();return op.call(self, src);
}
at::Tensor empty_with_format(at::IntArrayRef size, ::std::optional<at::ScalarType> dtype, ::std::optional<at::Layout> layout, ::std::optional<at::Device> device, ::std::optional<bool> pin_memory, int64_t acl_format) {static auto op = c10::Dispatcher::singleton().findSchemaOrThrow("npu::empty_with_format", "").typed<at::Tensor (at::IntArrayRef, ::std::optional<at::ScalarType>, ::std::optional<at::Layout>, ::std::optional<at::Device>, ::std::optional<bool>, int64_t)>();return op.call(size, dtype, layout, device, pin_memory, acl_format);
}
at::Tensor unsafe_empty_with_format(at::IntArrayRef size, ::std::optional<at::ScalarType> dtype, ::std::optional<at::Layout> layout, ::std::optional<at::Device> device, ::std::optional<bool> pin_memory, int64_t acl_format, bool keep_format) {static auto op = c10::Dispatcher::singleton().findSchemaOrThrow("npu::unsafe_empty_with_format", "").typed<at::Tensor (at::IntArrayRef, ::std::optional<at::ScalarType>, ::std::optional<at::Layout>, ::std::optional<at::Device>, ::std::optional<bool>, int64_t, bool)>();return op.call(size, dtype, layout, device, pin_memory, acl_format, keep_format);
}~/pytorch-ascend/torch_npu/csrc/aten/CustomFunctions.cpp[1,RO]  ...}
}
}

3.3 通过API重定向映射的方式

参考文件:torch_npu/utils/custom_ops.py

torch_npu.npu_layer_norm_eval = torch.ops.npu.npu_layer_norm_eval
torch_npu.npu_fused_attention_score_grad = torch.ops.npu.npu_fused_attention_score_grad
torch_npu.npu_quant_conv2d = torch.ops.npu.npu_quant_conv2d
torch_npu.npu_view_copy = torch.ops.npu.npu_view_copy
torch_npu.npu_fast_gelu = torch.ops.npu.npu_fast_gelu
torch_npu.npu_fused_attention_layernorm_qkv_fwd = torch.ops.npu.npu_fused_attention_layernorm_qkv_fwd
torch_npu.npu_fast_gelu_backward = torch.ops.npu.npu_fast_gelu_backward
torch_npu.npu_bmm_v2_mat1_backward = torch.ops.npu.npu_bmm_v2_mat1_backward

以上属于个人理解,如有错误敬请指正。

相关文章:

Ascend Extension for PyTorch的源码解析

1 源码下载 Ascend对pytorch代码的适配&#xff0c;可从以下链接中获取。 Ascend/pytorch 执行如下命令即可。 git clone https://gitee.com/ascend/pytorch.git2 目录结构解析 源码下载后&#xff0c;如果需要编译torch-npu&#xff0c;最好保持pytorch的源码版本匹配&…...

鸿蒙HarmonyOS开发:给应用添加基础类型通知和进度条类型通知(API 12)

文章目录 一、通知介绍1、通知表现形式2、通知结构3、请求通知授权 二、创建通知1、发布基础类型通知2、发布进度类型通知3、更新通知4、移除通知 三、设置通知通道1、通知通道类型 四、创建通知组五、为通知添加行为意图1、导入模块。2、创建WantAgentInfo信息。4、创建WantAg…...

从零开始使用YOLOv11——Yolo检测detect数据集自建格式转换为模型训练格式:20w+图片1w+类别代码测试成功

在之前的文章中记录了YOLO环境的配置安装和基本命令的一些使用&#xff0c;上一篇博文的地址快速链接&#xff1a;从零开始使用YOLOv8——环境配置与极简指令&#xff08;CLI&#xff09;操作&#xff1a;1篇文章解决—直接使用&#xff1a;模型部署 and 自建数据集&#xff1a…...

自动化新时代:机器取代工作,我们该如何重塑自我?

内容概要 在自动化时代的浪潮中&#xff0c;技术的飞速发展对传统工作模式产生了深远影响。我们眼前浮现的是一个充满机遇与挑战的新世界。许多岗位面临被机器取代的威胁&#xff0c;然而&#xff0c;这一变化并不仅仅是消极的。在这个背景下&#xff0c;个体不仅需要重新审视…...

GEE 土地分类——利用Sentinel-2数据进行土地分类

目录 简介 函数 ee.Classifier.smileRandomForest(numberOfTrees, variablesPerSplit, minLeafPopulation, bagFraction, maxNodes, seed) Arguments: Returns: Classifier 代码 结果 简介 利用Sentinel-2数据进行土地分类的流程大致可分为以下几个步骤: 1. 数据获取…...

《C++ 游戏开发》

一、引言 在当今的数字娱乐时代&#xff0c;游戏开发已经成为一个充满活力和创新的领域。C 作为一种强大的编程语言&#xff0c;在游戏开发中占据着重要的地位。它具有高效的性能、丰富的功能和广泛的适用性&#xff0c;能够满足游戏开发中对性能和灵活性的高要求。本文将深入探…...

2024年11月10日系统架构设计师考试题目回顾

案例分析 试题一&#xff1a;质量属性 基于描述填空是什么质量属性&#xff0c;常规题。&#xff08;性能&#xff0c;功能&#xff0c;安全&#xff0c;可用等等&#xff09;可用性而言&#xff0c;王工建议采用 ping/echo 机制检测&#xff0c;不过从资源使用角度&#xff…...

测试实项中的偶必现难测bug--苹果支付丢单问题

问题描述: app支付后,由于某种原因(可能是网络、流量不稳定、或者用户快速频繁操作。。。)会造成一定概率性的回调苹果支付结果失败的情况出现,表现的直观现象就是客户反馈已经支付了,包括苹果支付也是有记录,但是我们的后台显示的是已取消状态的订单 验证难点:测试和…...

Elasticsearch的数据类型

Elasticsearch(简称 ES)支持多种数据类型,主要分为以下几类: 1. 基本数据类型 Text:用于全文搜索的文本字段。ES 会对其内容进行分词处理。Keyword:适用于精确匹配的字段,例如名称、标签等。ES 不会对其内容分词处理。Integer:整数类型,包括 byte、short、integer 和…...

SSL 证书申请以及配置流程

SSL 证书申请以及配置流程 手动申请免费 SSL 证书的简明指南 如果你希望手动为你的网站申请免费的 SSL 证书&#xff0c;Let’s Encrypt 提供了一个很棒的免费服务。而 Certbot 则是官方推荐的工具&#xff0c;可以帮助你完成证书的申请和配置。以下是如何一步步完成的详细说…...

[Docker#4] 镜像仓库 | 部分常用命令

目录 什么是 Docker Registry 镜像仓库生活案例 镜像仓库分类 镜像仓库工作机制 常用的镜像仓库 私有仓库 镜像仓库命令 镜像命令[部分] 容器命令[部分] 什么是 Docker Registry 定义&#xff1a;Docker Registry 负责存储、管理和分发镜像&#xff0c;并提供了登录认…...

工业通信协议对比:OPC-UA、Modbus、MQTT、HTTP

综合对比表 对比项OPC-UAModbusMQTTHTTP通信效率低&#xff0c;带宽消耗高高高&#xff0c;开销低&#xff0c;效率高低&#xff0c;带宽消耗大实时性一般&#xff0c;延迟较高高&#xff0c;延迟低高&#xff0c;低延迟低&#xff0c;延迟高性能消耗高&#xff0c;需要高性能…...

docker 常用方法

目录 docker参数解释 基础信息和环境变量设置 容器运行和管理相关参数 数据卷挂载 GPU 相关参数 镜像相关参数 查看现有的镜像 docker images 查看正在运行的docker docker ps 1、docker启动停止及查看状态 启动docker&#xff1a; systemctl start docker 停止docker…...

区块链技术入门:以太坊智能合约详解

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 区块链技术入门&#xff1a;以太坊智能合约详解 区块链技术入门&#xff1a;以太坊智能合约详解 区块链技术入门&#xff1a;以太…...

特定数据库的备份脚本

该脚本 mysql_backup.sh 是一个 MySQL 数据库的备份脚本&#xff0c;以下是它的工作原理和需要注意的细节&#xff1a; 脚本内容分析 1.设置时间变量 TIME : TIMEdate %F_%H-%M-%S该变量 TIME 存储当前日期和时间&#xff0c;格式为 YYYY-MM-DD_HH-MM-SS&#xff0c;用于生…...

uni-app打包后报错云服务空间未关联

使用uni-app打包到h5 项目里面用到了uni-app的云端一体城市选择组件&#xff0c;这个组件数据用到了uniCloud云服务空间&#xff0c;在本地运行没问题&#xff0c;打包之后测试环境报错&#xff1a; 一顿查&#xff0c;查到了官网是这样说的&#xff1a; cli publish --platfo…...

FPGA学习(10)-数码管

前3节视频目的是实现显示0~F的数码管仿真&#xff0c;后3节是用驱动芯片驱动数码管。 目录 1.数码管显示原理 2.代码过程 2.1仿真结果 3.串行移位寄存器原理 3.1原理 ​编辑 3.2 数据手册 3.3 先行设计思路 4.程序 4.1确定SRCLK的频率 4.2序列计数器 4.3 不同coun…...

C++(继承)

继承的语法 继承的好处&#xff1a;减少重复代码 语法&#xff1a; class 子类 &#xff1a; 继承方法 父类 子类 也称为 派生类 父类 也成为 基类 继承方式 公共继承 保护继承 私有继承 结论&#xff1a;父类中私有成员也是被子类继承下去了&#xff0c;只是由编译器给隐藏后…...

华为OD机试 - RSA加密算法(Java 2024 E卷 100分)

long n (long) Math.sqrt(num); 与long n (long) Math.floor(Math.sqrt(num)); 这两行代码的目的都是计算 num 的平方根&#xff0c;并将结果转换为 long 类型的整数。然而&#xff0c;它们在处理方式上有一些微小的差别。 long n (long) Math.sqrt(num);long n (long) M…...

分组校验在Spring中的应用详解

目录 前言1. 什么是分组校验2. 分组校验的基本原理3. 分组校验的实现步骤3.1 定义分组接口3.2 在校验项中指定分组3.3 校验时指定要校验的分组3.4 默认分组和分组的继承 4. 分组校验的优势和适用场景4.1 优势4.2 适用场景 5. 常见问题与解决方案5.1 校验未生效5.2 无法识别默认…...

ARM A53上跑通1080P实时EIS防抖?手把手教你优化特征点与透视变换(附代码思路)

ARM A53实战&#xff1a;1080P实时EIS防抖的7个关键优化策略 当行车记录仪的镜头在颠簸路面剧烈晃动&#xff0c;或是运动相机在冲浪时被海浪拍打&#xff0c;画面稳定性的价值就凸显出来。传统光学防抖受限于物理结构&#xff0c;而电子防抖(EIS)通过算法补偿成为嵌入式设备的…...

避坑指南:STM32F411CEU6板载LED不亮的5个常见原因及解决方法

STM32F411CEU6板载LED故障排查实战手册 1. 硬件连接与基础检查 拿到一块STM32F411CEU6开发板&#xff08;俗称Black Pill&#xff09;&#xff0c;第一件事往往就是测试板载LED。但当你满怀期待地烧录程序后&#xff0c;发现LED毫无反应时&#xff0c;别急着怀疑人生。让我们从…...

告别特征点!FAST-LIVO2的‘直接法’融合:如何用原始点云和图像块实现更快的SLAM?

FAST-LIVO2&#xff1a;直接法SLAM的革命性突破与工程实践指南 1. 直接法SLAM的技术演进与核心价值 当波士顿动力的Atlas机器人完成后空翻动作时&#xff0c;其核心定位系统正面临着与人类体操运动员相似的挑战——如何在高速运动中维持对环境的精确感知。这正是FAST-LIVO2这类…...

抖音无水印批量下载工具终极指南:免费开源工具助你高效管理内容

抖音无水印批量下载工具终极指南&#xff1a;免费开源工具助你高效管理内容 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 还在为逐个下载抖音视频而烦恼吗&#xff1f;面对喜欢的创作者主页&#xff0c;你…...

7.企业级开发

一.软件开发的流程二.系统开发环境三.分支设计规范Git Flow模型四.企业级项目管理https://gitee.com/enterprises1.创建项目2.创建项目对应的仓库3.添加成员还可以进行(项目/仓库)成员管理五.开发实战场景1.创建仓库时,一般选生产和开发模型,其他的分支自己创建2.创建新分支:3.…...

Z-Image i2L生成效果对比:不同参数下的图像质量分析

Z-Image i2L生成效果对比&#xff1a;不同参数下的图像质量分析 1. 引言 最近试用了Z-Image i2L这个模型&#xff0c;真的被它的效果惊艳到了。这个模型最厉害的地方在于&#xff0c;你只需要给它几张风格相似的图片&#xff0c;它就能直接生成一个LoRA模型&#xff0c;让你可…...

雷达式多参数水文监测站

雷达式多参数水文监测站用先进的非接触式测量技术&#xff0c;结合水库断面参数精准计算流量&#xff0c;全程无需接触水体&#xff0c;从根源上规避水体环境对监测设备的影响。不受风、环境温度、雾霾、水体泥沙、漂浮物等外界因素干扰&#xff0c;即便在汛期水流浑浊、漂浮物…...

语音端点检测VAD的深度学习进化:从传统方法到RNN的实战对比

语音端点检测VAD的深度学习进化&#xff1a;从传统方法到RNN的实战对比 在嘈杂的咖啡馆里&#xff0c;语音助手能否准确识别你的唤醒词&#xff1f;视频会议中&#xff0c;系统如何智能过滤键盘敲击声&#xff1f;这些场景的核心技术&#xff0c;都离不开语音端点检测&#xff…...

.NET eShop 开源项目教程

.NET eShop 开源项目教程 【免费下载链接】eShop A reference .NET application implementing an eCommerce site 项目地址: https://gitcode.com/GitHub_Trending/es/eShop 1. 项目介绍 .NET eShop 是一个基于 Microsoft 的 .NET 技术栈开发的开源电子商务平台。该项目…...

Qwen-Image-2512部署教程:阿里云/腾讯云轻量服务器512MB内存精简部署方案

Qwen-Image-2512部署教程&#xff1a;阿里云/腾讯云轻量服务器512MB内存精简部署方案 1. 前言&#xff1a;像素艺术生成新选择 你是否遇到过这样的困扰&#xff1a;想要创作独特的像素风格作品&#xff0c;却苦于没有专业的美术功底&#xff1f;或者需要为游戏开发快速生成大…...