当前位置:   article > 正文

【2023 · CANN训练营第一季】模型的迁移和调优方法学习笔记_模型迁移时需要使用apex对原始代码进行修改,在apex已初始化完成的前提下,请完善以

模型迁移时需要使用apex对原始代码进行修改,在apex已初始化完成的前提下,请完善以

【2023 · CANN训练营第一季】模型的迁移和调优学习笔记

一、在线对接适配方案的优点介绍

1.最大限度的继承PyTorch框架动态图的特性。

2.最大限度的继承原生PyTorch上的使用方式,能够使用户在移植时做到代码修改少等优点。

3.最大限度的继承PyTorch原生的体系结构,像pytorch的自动微分等功能都是保留了的。

4.扩展性好。对于新增的网络类型或结构,只需涉及相关计算类算子的开发和实现。框架类算子,反向图建立和实现机制等结构可保持复用。

二、达芬奇框架简介

1.Cube:
负责矩阵运算的单元,每次运算可以计算一个fp16(16位浮点数)的两个16*16矩阵乘。

2.Vector:
向量运算单元,可以运算多种计算类型,如fp32,int32等

3.Scalar:
Scalar,负责各类型的标量数据运算和程序的流程控制,功能上可以看做一个小CPU。

三、迁移方法

1.手工迁移

-分布式

原始代码中,如果使用了DP(DataParallel):使用一个进程来进行参数计算,把每个批处理的数据分发到每个GPU,然后每个GPU计算各自的梯度,然后汇总到GPU0中进行求平均,由GPU0进行反向传播更新参数,然后再把模型的参数由GPU0传播给其他的GPU,GPU利用率通常很低。如下图:

那么需要把DP改为DDP进行使用。DDP(DistributedDataParallel):数据并行的分布式,是同时使用多个进程,每个GPU上一个进程,数据也是被进程数等分,相当于每个GPU上都跑了一份代码,前向之后再经过allreduce的处理,再经过梯度反向传播,更新参数。如下图:

-混合精度

由于NPU天然的混合精度的属性,需要使用apex对代码进行修改
eg:

model = model.cuda()
optimizer = torch.optim.SGD(model.parameters(), Ir=0.1)
#新增部分
model, optimizer =amp.initialize(model, optimizer,opt level="O2",loss_scale=128.0)

#把loss.backward()修改为
with ampscale loss(loss, optimizer) as scaled loss:
    scaled loss.backward()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

部分参数解释:

-单卡模型迁移

因为我们模型主要是在GPU上运行的,也就是cuda,而昇腾310是在的npu上运行的。因此,我们需要将设备由cuda(gpu)切换到npu,torch.cuda->torch.npu
eg:

#####转换前的原生代码
CALCULATE DEVICE = "cuda:0"
torch.cuda.set_device(CALCULATE DEVICE)
model = model.cuda()
  • 1
  • 2
  • 3
  • 4
#####转换后的代码
CALCULATE DEVICE = "npu:0"
torch.npu.set_device(CALCULATE DEVICE)
model = model.npu()
  • 1
  • 2
  • 3
  • 4
-多卡模型迁移

多卡迁移和单卡迁移的理念是一样的,都是从GPU(英伟达显卡)->NPU(华为昇腾)
因此,多卡主要是将backend(使用的通信库)参数

nccl(英伟达集合通信库NVIDIA Collective Communication Library)
转换成
hccl(华为集合通信库Huawei Collective Communication Library)

eg:

#转换前
dist.init_process_group(backend='nccl',init_method=“tcp://127.0.0.1:29688",world_size=args.world_size, rank=args.rank)

#转换后
dist.init_process_group(backend='hccl',init_method=“tcp://127.0.0.1:29688",world_size=args.world_size, rank=args.rank)
  • 1
  • 2
  • 3
  • 4
  • 5

这里老师讲解了几个多卡启动的方式:

这里的高性能的启动模式用到了taskset命令
其用于在SMP场景下(一个计算机集成多个CPU)。
使用

yum install util-linux -y
  • 1

命令可以安装此功能,其用法为:

语法格式:taskset [options] -p [mask] pid

参数选项:

-a, --all-tasks 操作所有的任务线程

-p, --pid 操作已存在的pid

-c, --cpu-list 通过列表显示方式设置CPU(逗号相隔)

-V, --version 输出版本信息

-排查报错手段

1.使用流同步打点

print(torch.npu.synchronize(),“打点”)

2.使用hook(网络拓扑)
使用hook对每个model上的每个module进行hook注册,看运行断在哪里

3.查看Host日志

2.脚本转换工具迁移

note:

  • 原脚本需要在GPU上并且python3.7及以上可以跑通
  • 脚本转换前后逻辑一致
  • 当前此脚本工具只支持Pytorch1.5.0和1.8.1的训练脚本转换

转换方式:

3.自动迁移(推荐)

note:仅可以在pytorch1.8.1版本及以上使用。

只需要在训练脚本中引入代码库并且只需要增加一行:

import torch 
import torch_npu
......

from torch_npu.contrib import transfer_to_npu
  • 1
  • 2
  • 3
  • 4
  • 5

四、样例

在https://gitee.com/ascend/ModelZoo-PyTorch
网址下可以获得昇腾的许多样例进行学习

ps:该文仅是为了记录CANN训练营的学习过程所用,不参与任何商业用途

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/659734
推荐阅读
相关标签
  

闽ICP备14008679号