本次实验的视频链接如下:https://www.bilibili.com/video/BV1iA4y1f7o1/
本次实验在MindStudio上进行,请先按照教程配置环境,安装MindStudio。
MindStudio的是一套基于华为自研昇腾AI处理器开发的AI全栈开发工具平台,该IDE上功能很多,涵盖面广,可以进行包括网络模型训练、移植、应用开发、推理运行及自定义算子开发等多种任务。MindStudio除了具有工程管理、编译、调试、运行等一般普通功能外,还能进行性能分析,算子比对,可以有效提高工作人员的开发效率。除此之外,MIndStudio具有远端环境,运行任务在远端实现,对于近端的个人设备的要求不高,用户交互体验很好,可以让我们随时随地进行使用。
1、pytorch编译/安装介绍
- 1) 从gitee获取Pytorch源码。
git clone https://gitee.com/ascend/pytorch.git
如果clone命令失败,可以使用以下命令重新安装git。
apt update; apt install git
此外,也可以在Ascend仓库中查看Pytorch源码,链接为:https://gitee.com/ascend/pytorch
-
2) 根据需要切换分支并获取PyTorch源代码。
AscendPytorch版本 CANN版本 支持PyTorch版本 2.0.2 CANN 5.0.2 1.5.0 2.0.3 CANN 5.0.3 1.5.0/1.8.1(1.8.1仅支持resnet50模型) 2.0.4 CANN 5.0.4 1.5.0/1.8.1(1.8.1仅支持resnet50模型) 从上表来看,我们的CANN版本是5.0.4,安装的Pytorch版本为1.5.0。因此切换到2.0.4的分支,具体有哪些分支可在gitee源码查看。
分别执行以下命令:
cd pytorch git checkout -b 2.0.4.tr5 remotes/origin/2.0.4.tr5 git clone -b v1.5.0 --depth=1 https://github.com/pytorch/pytorch.git
- 3)获取Pytorch被动依赖代码
分别运行以下命令
cd pytorch
git submodule sync
git submodule update --init --recursive
获取代码时,因为代码是位于GitHub上,受网络影响,获取时间可能较长,并且在获取过程中可能报错,如:
出现这种情况时,我们需要删除该报错路径的文件,重新运行后面两条代码,直到执行git submodule update --init --recursive不再报错为止。如下图没有任何报错信息:
PS:重新运行时需要将报错信息的文件夹删除再重新运行,删除时要看清楚完整的文件夹路径,比如说报错的路径“/third_party/benchmark/”有完整路径可能是在“pytorch/third_party/onnx/third_party/benchmark/”,不要与“pytorch/third_party/benchmark/”搞混。
PS:如果一直有某个包克隆失败,我们可以手动添加。如third_party/QNNPACK/克隆失败,我们先在GitHub上搜索QNNPACK,然后再手动下载zip文件,再上传至服务器相关目录并解压。或者使用gitee将其导入,再从gitee中克隆。
-
4)编译生成适配昇腾AI处理器的PyTorch安装包
(1) 回退一级目录,进入pytorch/scrips文件夹下,执行转换脚本,生成适配昇腾AI处理器的全量代码。运行截图如下:
cd ../scripts
bash gen.sh
(2) 进入pytorch/pytorch目录下,安装依赖库
cd ../pytorch
pip3 install -r requirements.txt
(3) 运行build.sh,编译生成pytorch的二进制安装包
bash build.sh --python=3.7
编译成功如下图,并可以在路径./pytorch/pytorch/dist/下找到对应的whl文件。如果失败,请重新检查第3)步-获取Pytorch被动依赖代码的操作。
- 5)安装Pytorch
进入生成的whl包的目录dist下,使用pip命令进行安装
cd dist
pip3 install --upgrade torch-1.5.0+ascend.post3-cp37-cp37m-linux_aarch64.whl
PS:因为之前服务器环境存在pytorch,所以截图中先卸载后安装。
- 6)配置环境变量
安装完软件包后,需要配置环境变量才能正常使用昇腾PyTorch
进入pytorch/pytorch目录下,运行env.sh
cd ../
source env.sh
这样,我们的pytorch就安装完毕了。
2、 模型简介
本次实验我们的目标是在MindStudio上使用ResNet进行图像分类任务。ResNet曾在ILSVRC2015比赛中取得冠军,在图像分类上具有很大的潜力。 ResNet的主要思想是在网络中增加了直连通道,使得原始输入信息能够直接传输到后面的层中,ResNet的残差块的结构如下图所示。
ResNet会重复将残差块串联,形成多层网络。一般常见的ResNet根据层数的大小有ResNet-18,ResNet-34,ResNet-50,ResNet-101等等。后面的数字代表网络的层数。在本次实验中,我们选用的数据集是tiny-imagenet。该数据集是斯坦福大学提供的图像分类数据集,其中包含200个类别,每个类别包含500张训练图像,50张验证图像及50张测试图像。可以在此链接下载。因为数据集不是很大,这里我们选用的模型是较小的ResNet-18。
3、训练工程创建,工程功能以及相关菜单介绍
3.1 训练过程创建
-
打开MindStudio,点击New Project,进入新建工程界面。
-
选择Ascend Training。填入项目名。首次新建训练工程时,需要配置CANN的版本。点击install。
-
首先,点击 + 配置远程连接,然后根据选项填入自己服务器的ip地址、端口号、用户名和密码等。
-
配置Remote CANN location。该参数需要填入ascend-toolkit在服务器上的路径地址。在这里,我们toolkit的路径如下:/usr/local/Ascend/ascend-toolkit/5.0.4/。点击finishing进行配置。初次配置时时间稍长,请耐心等待。
-
点击Next,选择Pytorch Project。
-
点击Finish,完成工程创建,进入工程主界面。
-
配置Module SDK,便于编码。
右键点击项目名,选择Open Module Settings。
因为我们的模型任务都是基于Python编程的,本机环境也是Python3.7.5,因此我们选择Python 3.7
3.2 工程功能及相关菜单介绍
MindStudio是基于华为自研昇腾AI处理器开发的AI全栈开发工具平台,具有非常丰富的功能。在该IDE上可以进行包括网络模型训练、移植、应用开发、推理运行及自定义算子开发等多种任务。接下来我们简单介绍MindStudio中我们会用到的功能。
新建Pytorch工程后,我们可以进行普通Pytorch框架下的所有开发任务,如模型构建,模型训练等。还有很多便捷的功能。
如上图所示,MindStudio的菜单栏除了包含IDEA,Pycharm等IDE的File,Edit,View,Navigate,Code,Refactor,Run,Tools,VCS,Windows,Help等常规菜单按钮外。还多出了Ascend的特色菜单按钮。
在该菜单栏下,有很多便捷的功能。其相关选项,对应于上图中用红框表示的图标,可以快速点击使用。具体功能见下表所示。
名称 | 功能 |
---|---|
AutoML | AI初学者可以通过AutoML工具结合数据集,生成满足需求的模型 |
Framework Trans | 包含三种工具,X2MindSpore,Pytorch GPU2Ascend,TensorFlow GPU2Ascedn。其功能分别为:将PyTorch脚本文件、ONNX模型文件TensorFlow模型文件转换到MindSpore脚本;将基于GPU训练的Pytorch训练脚本转换到支持NPU训练的脚本;将基于GPU训练的TensorFlow训练脚本转换到支持NPU训练的脚本 |
Model Converter | 将训练好的模型转换为离线模型 |
Model Visualizer | 将转换的模型进行可视化 |
Dump | 精度比对功能 |
System Profiler | 性能采集和分析功能 |
4、模型迁移
因为MindStudio是在NPU上进行网络训练的,因此对于基于GPU训练的代码需要进行稍微的修改。
- 首先,将已经在GPU上正常训练的Pytorch训练代码拷贝至新建好的工程目录下。本次实验的代码文件及其实现功能可见下表。
文件名 | 功能 |
---|---|
config.py | 配置训练的相关参数,如学习率,数据集路径,模型存储路径等等 |
dataset.py | 数据集读入文件 |
main.py | 网络定义以及网络训练的主函数入口 |
train.py | 网络训练 |
test.py | 结果测试文件 |
util.py | 通用函数文件 |
pt2onnx.py | 将pt文件转为onnx模型 |
- 代码大致讲解
1)网络构建
ResNet在torchvision中自带有网络架构和预训练的网络参数。在这里我们使用其网络架构代码,并且修改其最后的全连接层(因为分类的物品只有200个类别),并使用预训练的参数来初始化网络,再根据数据集微调。
import torchvision
model = torchvision.models.resnet18(pretrained=True)
## torchvision默认的ResNet输出维度为1000,本次使用的数据集总共只有200个类别,对模型的最后一层进行修改
fc_inputs = model.fc.in_features
model.fc = nn.Sequential(nn.Linear(fc_inputs, 200))
PS:如果想要查看ResNet-18的网络构建源码,可以在Pytorch的官方文档中查看:torchvision.models.resnet — Torchvision 0.12 documentation (pytorch.org)
2)数据读入和预处理
我们下载tiny-imagenet后,解压文件后的目录架构如下:
tiny-imagenet-200
├── train
│ ├── class1
│ │ ├── images
│ │ │ ├── img1.JPEG
│ │ │ ├──