欢迎光临散文网 会员登陆 & 注册

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

2023-05-04 22:53 作者:白子不摆烂版  | 我要投稿

【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()

部分参数解释: 

-单卡模型迁移

因为我们模型主要是在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()

#####转换后的代码CALCULATE DEVICE = "npu:0"torch.npu.set_device(CALCULATE DEVICE) model = model.npu()

-多卡模型迁移

多卡迁移和单卡迁移的理念是一样的,都是从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)

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

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

yum install util-linux -y复制

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

语法格式: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

四、样例

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

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


【2023 · CANN训练营第一季】模型的迁移和调优学习笔记的评论 (共 条)

分享到微博请遵守国家法律