一、基础知识
1.1、人工智能发展趋势和挑战
目前人工智能在特定的领域已经超越了人类的能力。比如图像分类、语言识别、语义理解方面。但是目前还是面临很多挑战。主要是算法开发难度高、应用的开发也困难,最后是开发后的实际的业务部署也十分复杂。
1.2、昇腾AI全栈架构
昇腾计算产业是基于昇腾系列处理器和基础软件构建的全栈Al计算基础设施、行业应用及服务,包括昇腾系列处理器、Atlas系列硬件、CANN (Compute Architecture for Neural Networks,异构计算架构)、Al计算框架、应用使能、全流程开发工具链、管理运维工具、行业应用及服务等全产业链。
1.3、Atlas系列硬件
Atlas系列硬件基于昇腾系列Al处理器〈(其中Ascend 310用于推理场景,Ascend 910用于训练场景),通过模块、标卡、小站、服务器、集群等丰富的产品形态,打造面向“端、边、云”的全场景AI基础设施方案。
1.4、NPU介绍
昇腾Al处理器的计算核心主要由Al Core构成,其基本结构如下图所示,包括了三种基础计算资源:矩阵计算单元、向量计算单元和标量计算单元。
1.5、CANN AI异构计算架构
1.6、PyTorch适配昇腾AI处理器方案
PyTorch框架实现的对接适配昇腾Al处理器的方案为在线对接方案。当前选择在线对接适配方案的主要原因有以下几点:
1、最大限度的继承PyTorch框架动态图的特性。
2、最大限度的继承GPU在PyTorch上的使用方式,可以使用户在将模型移植到昇腾Al处理设备进行训练时,在开发方式和代码重用方面做到最小的改动。
3、最大限度的继承PyTorch原生的体系结构,保留框架本身出色的特性,比如自动微分、动态分发、Debug、Profiling.Storage共享机制以及设备侧的动态内存管理等。扩展性好。在打通流程的通路之上,对于新增的网络类型或结构,只需涉及相关计算类算子的开发和实现。框架类算子,反向图建立和实现机制等结构可保持复用。
4、与GPU的使用方式和风格保持一致。用户在使用在线对接方案时,只需在Python侧和device相关操作中,指定device为昇腾Al处理器,即可完成用昇腾Al处理器在PyTorch对网络的开发、训练以及调试,用户无需进一步关注昇腾Al处理器具体的底层细节。
1.7、PyTorch模型迁移
将基于PyTorch的训练脚本迁移到昇腾Al处理器上进行训练,目前有以下3种方式:自动迁移〈推荐)、工具迁移、手工迁移,且迁移前要保证该脚本能在GPU、CPU上运行。
1、自动迁移:训练时,在训练脚本中导入脚本转换库,导入后执行训练。训练脚本在运行的同时,会自动将脚本中的CUDA接口替换为昇腾Al处理器支持的NPU接口。整体过程为:边训练边转换。
2.工具迁移︰训练前,通过脚本迁移工具,自动将训练脚本中的CUDA接口替换为昇腾Al处理器支持的NPU接口,并生成迁移报告(脚本转换日志、不支持算子的列表、脚本修改记录)。训练时,运行转换后的脚本。整体过程为:先转换脚本,再进行训练。
3.手工迁移:算法工程师通过对模型的分析、GPU与NPU代码的对比进而对训练脚本进行修改,以支持在昇腾Al处理器上执行训练。迁移要点如下:定义NPU为训练设备,或将适配GPU的接口切换至适配NPU的接口。·多卡迁移需修改芯片间通信方式为hccl。
自动迁移——只需一行代码
仅PyTorch1.8.1版本及以上使用,自动迁移方式较简单,且修改内容最少,只需在训练脚本中添加引入库代码。
使用方法
import torchimport torch_npu……
#在训练脚本中添加引入库代码
from torch_npu.contrib import transfer_to_npu
1.8、工具迁移
二、AscendCL概念
2.1、AscendCL功能
2.2、Host&Device
Host:指与Device相连接的x86服务器、ARM服务器,会利用Device提供的NN(Neural-Network)计算能力,完成业务.Device:指安装了芯片的硬件设备,利用PCle接口与Host侧连接,为Host提供NN计算能力。若存在多个Device,多个Device之间的内存资源不能共享。
典型场景如在服务器上插Atlas300l设备:
将Atals 300l推理卡插入推理服务器(或个人PC)的主机中,此时程序的运行均在CPU侧进行控制,当需要进行专用计算(模型推理等)时,将CPU侧内存数据传输到NPU侧内存中,NPU侧完成专用计算后将数据回传至CPU侧。
CPU+内存所在这一侧,或者说,进程启动的这一侧,收集数据的这一侧,我们称之为“Host”侧;NPU+Device所在这一侧,或者说,进行专用计算的这一侧,使用数据的这一侧,我们称之为“Device”侧;
2.3、运行资源管理
2.4、同步和异步
在AscendCL中当提及“同步&异步”的时候,都是站在调用者、执行者的角度来看的。同步:当前线程发起一个方法调用,然后阻塞在调用点等待被调用方法执行完毕返回,再继续向下走。
异步:调用者向执行者下发一个任务之后,不等待任务执行完,而是立即返回往下走,暂且不管这个任务是否执行完毕。
三、编译运行推理样例及代码开发流程
3.1、开发流程
使用AscendCL接口开发应用的整体流程分为以下几个部分:准备环境:提前部署昇腾Al软件栈,以便后续编译、运行时使用;
创建代码目录:创建目录,存放代码文件、编译脚本、测试图片数据、模型文件等;
构建模型:模型推理场景下,必须要有适配昇腾AI处理器的离线模型(*.om文件);
开发应用:根据实际场景,开发用于图像/视频数据处理、推理、单算子调用等功能的应用;
编译及运行应用:编译代码生成可执行文件,运行可执行文件验证应用的功能;
3.2、开发应用
将AscendCL的应用高度抽象后,可以得到以下流程:
初步学习过程中,AscendCL初始化去初始化、运行管理资源的申请和释放这四步的调用一般是固定的,在开发应用的过程中可以固定使用。
AscendCL初始化:使用AscendCL接口开发应用时,必须先初始化
AscendCL,否则可能会导致后续系统内部资源初始化出错,进而导致其它业务异常,调用acllnit接口实现初始化AscendCL.
运行管理资源申请:应用程序中必须包含运行管理资源申请的代码逻辑,
需要按顺序依次申请如下运行管理资源:Device、Context、Stream,确保可以使用这些资源执行运算、管理任务。
运行管理资源释放:所有数据处理都结束后,需要依次释放运行管理资源:
Stream、Context、Device。
AscendCL去初始化:有初始化就有去初始化,在确定完成了AscendCL的
所有调用(包括运行管理资源释放完成)之后,或者进程退出之前。需调用AscendCL接口实现AscendCL去初始化,调用aclFinalize接口实现AscendCL去初始化。
开发关键功能这一步骤主要分为以下三点:
图像图形预处理
模型推理计算
单算子加速计算