Ascend-pytorch插件介绍及模型迁移

2023-09-20 16:12:19

Ascend-pytorch插件介绍及模型迁移

用于昇腾适配PyTorch框架,为使用PyTorch框架的开发者提供昇腾AI处理器的超强算力。

当前(2023.9.20)AscendPyTorch支持的pytorch版本如下:

AscendPyTorch版本CANN版本支持PyTorch版本代码分支名称
5.0.RC2CANN 6.3.RC22.0.1.rc1v2.0.1-5.0.rc2
5.0.RC2CANN 6.3.RC21.8.1.post2v1.8.1-5.0.rc2
5.0.RC2CANN 6.3.RC21.11.0.post1v1.11.0-5.0.rc2

基本介绍

PyTorch Adapter实现原理

pytorch仓的结构:

在这里插入图片描述

  • torch/ # 存放大家熟悉的python模块
    • csrc # 用C++实现的pytorch前端的功能,包括python和C++的binding,autograd和JIT
  • aten # "A Tensor Library"的缩写
    • src/ATen # 用C++实现的tensor基本操作
  • c10 # Caffe2和 A Tensor的双关语,包含pytorch的核心抽象,以及tensor和存储数据结构的实际实现
核心机制-dispatch

简单而言,就是根据API调用时,输入的数据类型来决定后端调用的API类型。比如CPU和GPU的API是不一样的,可以自动根据传入的tensor类型来自动选择API。

具体来看,对于每一个前端的算子,dispatcher会维护一个函数指针表,为每个dispatch key提供对应的视线。这个表中有针对不同后端(CPU,GPU,XLA)的dispatch条目,也有想autograd和tracing这样的高抽象层级概念的条目。dispatcher根据输入的tensor和其他东西计算出一个dispatch key,然后跳转到函数指针表所指向的函数。

所以,对于昇腾处理器而言,实现Adapter主要就是要讲用昇腾实现的算子注册到dispatcher上面,即可复用pytorch的dispatch机制完成算子分布。

示例-单算子调用流程
  1. 用户在前端调用算子,比如可调用nn.Module,nn.Funtional,Tensor对象上的函数;
  2. pybind11根据注册绑定的映射规则,调用后端C++方法;
  3. 后端C++接口根据输入参数来选取所需调用的算子类型(dispatch机制),比如是调用CPU实现的算子还是GPU实现的算子(注意:此处只要注册NPU实现的算子,便可调用昇腾处理器的计算能力;
  4. 调用相应算子,返回结果;

PyTorch Adapter的逻辑架构图

在这里插入图片描述

在线适配方案:模型执行,训练等主要功能流程有Pytorch框架提供,用户界面API保持不变,将Davinci设备和计算库作为扩展资源注册到PyTorch框架中。

  • 优点:
    • 继承PyTorch动态图特性
    • 继承原生PyTorch使用方式,移植的时候,在开发方式和代码复用方便做到最小的改动;
    • 继承Pytorch的原生体系结构,保留框架本身出色的特性,比如自动微分,动态分发,Debug,Profiling,Storage共享机制等;
    • 扩展性:对于新增网络类型或结构,只需增加涉及的算子开发和实现。框架类算子,反向图建立和实现机制等结构可保持复用;

模型迁移

模型迁移分为以下几步:

  1. 准备Ascend硬件环境
  2. 算子满足度分析
  3. 模型迁移
    1. 自动迁移
    2. 手动迁移
  4. 模型调优

昇腾上Ascend_Pytorch安装指南

Ascend_Pytorch安装指南

算子满足度分析

方式一:利用torch的profiler来提取模型所用到的算子,然后查看NPU对这些算子的支持情况;

方式二:直接调用CANN分析迁移工具

```bash
python ms_fmk_transplt.py -i model_file.py -o model_file_out.py
```

其中ms_fmk_transplt.py已经包含在CANN安装包中了,默认路径为:/usr/local/Ascend/ascend-toolkit/latest/tools/ms_fmk_transplt/ms_fmk_transplt.py。另外,该脚步还会输出迁移报告,里面有详细的不支持算子列表。

模型迁移

主要分:

  • 手工迁移:用户自行修改pytorch训练脚步
  • 自动迁移:
    • 训练前:通过迁移脚步转换工具,自动将脚本由GPU转换为NPU版本,同时也会生成迁移报告;
    • 训练时:在训练脚步中导入脚本转换库,运行训练时,自动将Pytorch训练脚本的cuda接口进行替换,操作简洁。
手工迁移

主要修改点:

  1. 导入NPU相关库
if torch.__version__ > 1.5:
  import torch_npu
  1. 指定device类型为npu

    device = torch.device("cuda:0")  => device = torch.device("npu:0")
    torch.cuda.set_device(device)    => torch.npu.set_device(device)
    tensor.to('cuda:0')              => tensor.to('npu:0')
    
  2. 将训练脚步中的cuda接口替换为npu接口

    torch.cuda.xxx()         =>  torch.npu.xxx()
    torch.cuda.set_device(0) => torch.npu.set_device(0)
    torch.cuda.synchronize() => torch.npu.synchronize()
    
  3. 分布式代码迁移:将nccl改为hccl

dist.init_process_group(backend='nccl', init_method='tcp://127.0.0.1:29688', world_size=8, rank=rank)
# 替换为:
dist.init_process_group(backend='hccl', init_method='tcp://127.0.0.1:29688', world_size=8, rank=rank)

注:Ascend pytorch只支持DDP,不支持DP。

自动迁移
  1. 使用转换脚本ms_fmk_transplt.py
python ms_fmk_transplt.py -i model_file.py -o model_file_out.py
  1. 导入脚步转换库(支持PT1.8以上版本,推荐这种方式)

    from torch_npu.contrib import transfer_to_npu
    
  2. 关于混合精度

  • pytorch默认是fp32精度,而昇腾芯片的加速单元主要是fp16的算力,所以需要采用混合精度训练的方式。当前Ascend-Torch支持torch.cuda.amp和apex.amp两种方式的混合精度训练。
# 方式一:torch.cuda.amp
use_amp = True
net = make_model(in_size, out_size, num_layers)
opt = torch.optim.SGD(net.parameters(), lr=0.001)
scaler = torch.cuda.amp.GradScaler(anabled_use_amp)

for epoch in range(epochs):
  for input, target in zip(data, targets):
    with torch.autocast(device_type='cuda', dtype=torch.float16, enabled=use_amp):
      output = net(input)
      loss = loss_fn(output, target)
    scaler.scale(loss).backward()
    scaler.step(opt)
    scaler.update()
    opt.zero_grad()

# 方式二:apex.amp
model = torch.nn.Linear(D_in, D_out).cuda()
optimzier = torch.optim.SGD(model.parameters(), lr=1e-3)

model, optimizer = amp.initialize(model, optimizer, opt_level='O1')
...
with amp.scale_loss(loss, optimizer) as scaled_loss:
  scaled_loss.backward()
...
更多推荐

基于微信小程序的自习室系统设计与实现,可作为毕业设计

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌文章目录1简介2技术栈3需求分析3.1用户需求分析3.1.1学生用户3.1.3管理员用户4数据库设计4.4.1ER图设计4.4.2数据库表设计**第五章

利用 Python PyPDF2库轻松提取PDF文本(及其他高级操作)

当需要从PDF文件中提取文本时,Python中的PyPDF2库是一个非常有用的工具。无论您是需要分析PDF文档中的内容还是需要在文档中搜索特定的信息,PyPDF2都可以帮助您轻松实现这些任务。在本文中,我们将探讨如何使用PyPDF2库提取PDF文件中的文本,并提供一些示例代码来帮助您入门。安装PyPDF2库首先,您需要

手摸手系列之前端Vue实现PDF预览及打印的终极解决方案

前言近期我正在开发一个前后端分离项目,使用了SpringBoot和Vue2,借助了国内优秀的框架jeecg,前端UI库则选择了ant-design-vue。在项目中,需要实现文件上传功能,同时还要能够在线预览和下载图片和PDF文件,甚至需要在页面上直接打印PDF文件。尽管框架自带了vue-print-nb-jeecg组

AI引擎助力,CamScanner智能高清滤镜开启扫描新纪元!

文章目录⭐写在前面⭐突破图像处理难点:扫描全能王的独特优势⭐耳听为虚,眼见为实⭐产品背后的主要核心:AI-Scan助力⭐深度学习助力智能文档处理的国际化进程⭐品味智能文档处理的轻松与精准⭐写在前面在数字化快速发展的今天,我们时常会遇到需要将纸质文件转变为电子文字的场景。无论是工作中的合同、报告,还是日常生活中的笔记、名

开源与人工智能:现状与展望

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

笔记:Android 应用启动流程

1.点击图标,启动app点击图标,实际是封装了一个Intent然后调用了startActivity方法ComponentNamecomponentName=newComponentName("包名","activity名称");Intentintent=newIntent(Intent.ACTION_MAIN);int

如何玩转CSDN AI工具集

前言人工智能生成内容(AIGC)是当下最具有前景的技术领域之一。AI能够以惊人的速度和准确度生成各种类型的内容,完成文章翻译、代码生成、AI对话、插图创作等工作,带来了许多令人兴奋的机遇。本文将介绍CSDNAI工具集的基本使用方法,现在您可以免费试用全部功能。一、AI工具集AI工具集是CSDN的一款综合AI赋能平台,集

Java 基于 SPringBoot 的幼儿园管理系统,附源码、数据库

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W+,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌文章目录一、效果演示二、前言介绍三、主要技术四、系统设计(部分)4.1、主要功能模块设计4.2、系统登录设计五、运行截图5.1、用户功能模块5.1.1、

[GIT]版本控制工具

[GIT]版本控制工具Git的命令Git的配置信息查看现有Git配置信息设置Git配置信息用户信息配置文本编辑器配置差异分析工具配置编辑Git配置文件Git仓库操作初始化Git仓库克隆Git仓库Git分支仓库创建Git远程仓库命令Git提交历史Git标签添加标签查看已有标签删除标签查看标签版本的修改内容其它操作Git是

自己实现 SpringMVC 底层机制 系列之-实现任务阶段 5- 完成 Spring 容器对象的自动装配 -@Autowried

😀前言自己实现SpringMVC底层机制系列之-实现任务阶段5-完成Spring容器对象的自动装配-@Autowried🏠个人主页:尘觉主页🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉在csdn获奖荣誉:🏆csdn城市之星2名⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣

自己实现 SpringMVC 底层机制 系列之--实现任务阶段 3- 从 web.xml动态获取 wyxspringmvc.xml

😀前言自己实现SpringMVC底层机制系列之–实现任务阶段3-从web.xml动态获取wyxspringmvc.xml🏠个人主页:尘觉主页🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉在csdn获奖荣誉:🏆csdn城市之星2名⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣

热文推荐