【CANN训练营0基础赢满分秘籍】昇腾AI入门课(PyTorch)

news2024/10/6 0:28:30

1 昇腾AI全栈架构

昇腾计算产业是基于昇腾系列处理器和基础软件构睫的全栈Al计算基础设施.行业应用及服务,包括昇腾系列处理器、Atlas系列硬件、CANN (Compute Architecture for Neural Networks,异构计算架构》、Al计算框架、应用使能、全流程开发工具链.管理运排工具、行业应用及服务等全产业链。

2 Altas系列硬件

Atlas系列硬件基于昇腾系列AI处理器,(其中Ascend 310用于推理场景,Ascend 910用于训练场景),通过模块标卡、小站、服务器.集群等丰富的产品形态。打造面向“端、边、云”的全场景A基础设施方窝。

3 NPU

昇腾Al处理器的计算核心主要由Al Core构成,其基本结构如下图所示,包括了三种基础计算资源:矩阵计算单元.向量计算单元和标最计筒单元

  • Cube,负责执行矩阵运算,每次可以执行完成一个fpl6的1616与1616的矩阵乘。相关操作包括matmul, conv2d, linca等。
  • Veetor。负责执行向量运算,算力低于Cube ,但灵活度高。Vectot覆盖各种基本的计算类型和许多定制的计算类型,主要包括fp16,fp32,int32,int8等。
  • Scalar。负责各类型的标量运算和程序的流程控制。功能上可以看做一个小CPU.

4 PyTorch适配昇腾AI处理器方案

PyTorch框架实现的对接适配昇腾Al处理器的方案为在线对接方案。当前选择在线对接适配方案的主要原因有以下几点:

  • 最大限度的继承PyTorch框架动态图的特性
  • 最大限度的继承GPU在PyTorch上的使用方式,可以使用户在将模型移植到昇腾AI处理器设备进行训练时,在开发方式和代码重用方面做到最小的改动。
  • 最大限度的继承PyTorch原生的体系结构,保留框架本身出色的特性,比如自动微分、动态分发、Debug、Profiling.Storage共享机制以及设备侧的动态内存管理等。
  • 扩展性好。在打通流程的通路之上,对于新增的网络类型或结构,只需涉及相关计算类算子的开发和实现。框架类算子。反向图建立和实现机制等结构可保持复用。
  • 与GPU的使用方式和风格保持一致。用户在使用在线对接方案时,只需在Python侧和device相关操作中,指定device为昇腾AI处理器,即可完成用昇腾Al处理器在PyTorch对网络的开发、训练以及调试。用户无需进一步关注昇腾Al处理器具体的底层细节。

5 PyTorch模型迁移介绍

将基于PyTorch的训练脚本迁移到昇腾Al处理器上进行训练,目前有以下3种方式:自动迁移(推荐)、工具迁移、手工迁移,且迁移前要保证该脚本能在GPU、CPU上运行。

5.1 自动迁移

训练时,在训练脚本中导入脚本转换库,导入后执行训练。训练脚本在运行的同时,会自动将脚本中的CUDA接口替换为昇腾Al处理器支持的NPU接口。整体过程为:边训练边转换。

5.2工具迁移

训练前,通过脚本迁移工具,自动将训练脚本中的CUDA接口替换为昇腾AI处理器支持的NPU接口,并生成迁移报告(脚本转换日志、不支持算子的列表、脚本修改记录)。训练时,运行转换后的脚本。整体过程为:先转换脚本,再进行训练。

5.2.1 功能介绍

·脚本转换工具根据适配规则,对用户脚本给出修改意见并提供转换功能,提高了脚本迁移速度,降低了开发者的工作量,·原脚本需要在GPU环境下且基于Python 3.7及以上能够跑通,脚本转换后的执行逻辑与转换前保持一致。
·此脚本转换工具当前支持PyTorch1.5.0和1.8.1版本的训练脚本转换。

5.2.2 执行转换

  • 进入脚本转换工具所在路径
    cd Ascend-cann-toolkit安装目录/ascend-toolkit/latest/tools/ms_fmk_transplt/
  • 执行脚本转换
    /pytorch_gpu2npu.sh -i原始脚本路径-o脚本迁移结果输出路径-v原始脚本框架版本.完成脚本转换
  • 完成脚本转换

5.3 手工迁移

算法工程师通过对模型的分析、GPU与NPU代码的对比进而对训练脚本进行修改,以支持在昇腾Al处理器上执行训练。迁移要点如下:
定义NPU为训练设备,或将适配GPU的接口切换至适配NPU的接口。多卡迁移需修改芯片间通信方式为hccl。

5.3.1 手工迁移——Step1迁移前的准备

  • 关于分布式
    由于NPU上的一些限制,PyTorch需要使用DistributedDataParallel(DDP),若原始代码使用的DataParalle(DP)则需要修改为DDP,DP相应的一些实现例如torch.cuda.common,则可以替换为torch.distributed相关操作。###
  • 关于混合精度
    由于NPU天然的混合精度属性,我们需要使用apex对原始代码进行修改
#导入混合精度模块
from apex import amp
model = model.cuda()
optimizer = torch.optim.SGDmodel.parametcrs(),Ir=0.1)
#在模型和优化器定义后初始化APEX模块〔新增}
model, optimizer = amp.initialize(model, optimizer,opt_level="O2",loss_scale=128.0)
#梯度反向传播loss.backward()(修改)
with amp.scalc_loss(loss,optimizcry as scaled_loss:
scaled_loss.back ward 

5.3.2 手工迁移-Step2单卡模型迁移

单卡迁移的主要修改点:定义NPU为训练设备,并将适配GPU的接口切换至适配NPU的接口。

  • GPU原生代码
导入Py Torch
import torch

#指定GPU作为训练设备
CALCULATE_DEVICE - "cuda:O"
torch.euda.set_device(CALCULATE_DEVICE

#将模型放到device的两种方法
model = model.cuda0#写法一
model = model.to(CALCULATE_DEVICE)#写法二

#将输入也从host放到device上
images = images.to(CALCULATE_DEVICE)
target = target.to(CALCULATE_DEVICE)
  • NPU迁移代码
导入NPU相关库①
import torch
import torch_npu

#指定NPU作为训练设备②
CALCULATE_DEVICE= " npu:o"
torch_npu.npu.set_device(CALCULATE_DEVICE)

#将模型放到device的两种方法③
model= model.npu()#写法—
model= model.to(CALCULATE_DEVICE)写法二

#将输入t也从host放到device上
imagcs = images.to(CALCULATE_DEVICE)target = target.toiCALCULATE_DEVICE)

5.3.3 手工迁移——Step3多卡模型迁移

多卡代码迁移的主要修改点:除单卡迁移包含的3个修改要点外,在分布式场景下,还需要切换通信方式

  • GPU原生代码
GPU原生代码
#**为端口号,根据实际选择一个闲置端口填写dist.init process_group( backend='nccl,
init_mcthod = "tep/;127.0.0.1:".word_size=args.world.size,
rank = args.rank)

  • NPU迁移代码
#*为端口号,根据实际选择一个闲置端口填写dist.init_process_group( backend=heel" ,
init_method = "tcpff:127.0.0.1:,word_size=args.world.size,
rank - args.rank)

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

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

相关文章

LeetCode_Day4 | 好有难度的一个环形链表啊(在最后)!

LeetCode_链表 24. 两两交换链表中的节点1.题目描述2.虚拟头节点法1.思路2.代码实现 3.递归法1.思路2.代码实现 19. 删除链表的倒数第n个节点1.题目描述2.思路:双指针法3.代码实现 面试题 02.07. 链表相交1.题目描述2.思路3.代码实现 142. 环形链表 II1. 题目描述2.…

【SNAT和DNAT的原理与应用】

目录 一、SNAT原理与应用1、SNAT概述2、SNAT的应用环境3、进行SNAT转换后的情况 二、SNAT实验三、DNAT1、DNAT策略概述2、DNAT 实验 一、SNAT原理与应用 1、SNAT概述 SNAT 应用环境:局域网主机共享单个公网IP地址接入Internet(私有不能早Internet中正常…

网络知识点之-静态路由

静态路由(英语:Static routing)是一种路由的方式,路由项(routing entry)由手动配置,而非动态决定。与动态路由不同,静态路由是固定的,不会改变,即使网络状况已…

进程控制(总)

目录 进程创建 fork函数初识: 写时拷贝: fork常规用法: fork调用失败的原因: 进程终止 进程退出场景: 进程常见退出方法: _exit函数 exit函数 return退出: 进程等待 进程等待的必…

UE5实现模型压平效果

文章目录 1.实现目标2.实现过程2.1 实现原理2.2 蓝图实现2.3 闪面问题与压平精度3.参考资料1.实现目标 模型压平功能是GIS系统中的一个常用功能,可以用于模型的替换,数据的对比等。本文在UE5中通过修改材质的方式实现,实现模型压平的功能,包括常规建模的StaticMesh,以及C…

2023年网络安全竞赛——Windows操作系统渗透测试Server2124

任务五:Windows操作系统渗透测试 任务环境说明: 服务器场景:Server2124(关闭链接)服务器场景操作系统:Windows(版本不详)通过本地PC中渗透测试平台Kali对服务器场景Server2124进行系统服务及版本扫描渗透测试,并将该操作显示结果中1433端口对应的服务版本信息作为Fla…

【C++ 学习 ⑥】- C++ 动态内存管理详解

目录 一、new 表达式和 delete 表达式的工作机理 二、operator new 和 operator delete 函数 2.1 - 标准库定义 2.2 - 重载 三、定位 new 表达式 四、常见面试题 4.1 - malloc/free 和 new/delete 的区别 4.2 - 内存泄漏 在 C 中,new 和 delete 既是关键字&…

Linux系统c语言socket实现TCP通信

socket通信用到的函数 int socket( int af, int type, int protocol); af:一个地址描述。仅支持AF_INET格式,也就是说ARPA Internet地址格式。 type:指定socket类型。新套接口的类型描述类型,如TCP(SOCK_STREAM&#…

IMX6ULL裸机篇之DDR3参数配置分析

一. DDR3L 初始化简介 上一篇博文进行了 DDR参数的初始化,通过一个 execl表进行配置,生成脚本文件。文章网址如下: IMX6ULL裸机篇之DDR3初始化_凌雪舞的博客-CSDN博客 本文对 DDR的参数配置进行详细的说明。即对 "Register Configur…

前端026_菜单模块_新增功能

菜单模块_新增功能 1、需求分析2、新增组件实现3、列表引用新增组件4、关闭弹出窗口5、校验表单数据6、提交表单数据6.1、Mock 添加新增模拟接口6.2、Api 调用接口6.3、测试新增功能1、需求分析 菜单管理中有两处有 新增 按钮: 条件区域的是新增一级菜单,传递的参数是0。列表…

java多线程同步技术基础

说明 当程序中出现多个进程对同一资源进行操作时,因为对数据的操作非常密集,可能会对资源过度操作,这时就需要用到线程的同步技术。 以一个抢红包程序为例,红包数量为3个,开启5个线程来模拟抢红包行为,红…

[MAUI]在.NET MAUI中复刻苹果Cover Flow

文章目录 原理3D旋转平行变换 创建3D变换控件绘制封面图片应用3D旋转应用平行变换绘制倒影创建绑定属性 创建绑定数据创建布局计算位置计算3D旋转 创建动效项目地址 Cover Flow是iTunes和Finder中的一个视图选项,允许用户使用水平滚动的图像查看他们的音乐库或文件。…

使用Qt Creator编写窗体程序并打包发布

1、设置编辑器显示语言为中文(个人习惯) 2、新建窗体应用程序 3、简单修改一下代码 3.1 双击ui文件进入设计模式 3.2 从左侧组件中直接将需要使用的组件拖拽到窗体中 3.3 添加槽函数 选中按钮,右键菜单中 点击 转到槽,头文件和.cpp文件会自动添加对…

中间件_RabbitMQ五种消息模型

文章目录 1.简单消息队列模型2.Work工作队列模型3.发布订阅模型3.1.Fanout广播3.2.Direct路由3.3.Topics通配符 RabbitMQ官方文档 RabbitMQ 提供了5种常用消息模型。但是其实3、4、5这三种都属于订阅模型,只不过进行路由的方式不同。 1.简单消息队列模型 简单消息队…

C语言入门篇——编译篇

目录 1、程序环境 1.1 ANSI C 标准 1.2程序的翻译环境和执行环境 1.3运行环境 2、预处理详解 2.1、预定义符号 2.2、#define 2.2.1#define定义表示符 2.2.2#define定义宏 2.2.3#define替换规则 2.4#和## 2.2.5带副作用的宏参数 2.2.6宏和函数对比 3、#undef 4、…

项目1:登录功能设计

需求 后端接口设计MySQL表常用功能模块 后端总和前端实现方案 home页面 需求 实现一个登录功能 实现的功能 注册(邮箱注册) 登录(邮箱密码) 重置密码 查看操作记录(登录, 注册, 重置密码, 登出. 都算操作) 登出 后端接口设计 1. 人机验证 只要下面出现 人机验证 的功能都需要使…

容器化:MySQL

1 缘起 开启容器化之路。 2 容器化MySQL 2.1 查看MySQL镜像 docker search mysql2.2 指定版本:5.7.30 通过官网查看:https://hub.docker.com/ docker pull mysql:5.7.302.3 路径挂载 容器路径挂载到宿主机。 新建宿主机路径 mkdir -p /home/xind…

ElasticSearch-索引和文档的创建修改删除

目录 一、创建索引 二、查看索引 三、索引是否存在 四、删除索引 五、创建文档 六、查看文档 七、更新文档 八、文档是否存在 九、删除文档 一、创建索引 # 创建一个默认的索引,默认是标准分词器的索引 PUT /es_db2# 创建一个默认为ik分词器的索引 PUT /e…

十万条数据,后端不分页咋办!(如何优化长列表渲染)

十万条数据,后端不分页咋办!(如何优化长列表渲染) 长列表是什么? 我们通常把一组数量级很大的数据叫做长列表,比如渲染一组上千条的数据,我们以数组的形式拿到这些信息,然后遍历渲…

Rust快速安装

Rust依赖C编译,Rust官方推荐的安装方式是利用VisualSudio安装C环境,VisualStuidio用过的都懂,庞大无比、卡顿、下载还贼慢(我当时装了一上午好像),因此我们通过其它方式配置C 安装C环境 下载MinGW 64 win32 seh Mingw官网&…