NPU上PyTorch模型调优问题案例

news2024/12/27 13:38:40

 在昇腾AI处理器上训练PyTorch框架模型时,可能由于算子在CPU上的下发速度、动态shape等问题,导致性能降低,那么本期就分享几个关于PyTorch模型调优的典型案例,给出调优思路及具体的调优方法:

1、NPU亲和优化器替换调优案例

2、动态shape(算子二进制)调优案例

01 NPU亲和优化器替换调优案例

问题背景

在PyTorch混合精度模式下,每次迭代执行一次参数更新时,在Loss乘/除以缩放系数的过程中都会包含连续多个小算子(如add、mul、sqrt等)下发,由于小算子在NPU上计算快,导致算子在CPU上的下发成为性能的主要瓶颈。本调优案例以MobileNetV1模型为例,进行梯度融合调优解决此性能问题。

总体思路

使用昇腾AI处理器亲和的融合优化器替换原始优化器,昇腾AI处理器亲和的融合优化器可以在梯度更新过程中将连续多个小算子融合后下发,提升模型计算性能,完整融合优化器替换表如下所示。

用户可在代码中搜索关键词optim以搜索当前模型的优化器函数名,对照下表查看是否有可替换的亲和优化器。本例中使用torch_npu.optim.NpuFusedSGD替换原始优化器torch.optim.SGD。

优化器名称

样例原代码

修改后代码

sgd

optimizer = torch.optim.SGD(model.parameters(), lr=args.lr)

optimizer = torch_npu.optim.NpuFusedSGD(model.parameters(), lr=args.lr)

adadelta

optimizer = torch.optim.Adadelta(model.parameters(), lr=args.lr)

optimizer = torch_npu.optim.NpuFusedAdadelta(model.parameters(), lr=args.lr)

lamb

optimizer = torch.optim.Lamb(model.parameters(), lr=args.lr)

optimizer = torch_npu.optim.NpuFusedLamb(model.parameters(), lr=args.lr)

adam

optimizer = torch.optim.Adam(model.parameters(), lr=args.lr)

optimizer = torch_npu.optim.NpuFusedAdam(model.parameters(), lr=args.lr)

adamw

optimizer = torch.optim.AdamW(model.parameters(), lr=args.lr)

optimizer = torch_npu.optim.NpuFusedAdamW(model.parameters(), lr=args.lr)

adamp

optimizer = torch.optim.AdamP(model.parameters(), lr=args.lr)

optimizer = torch_npu.optim.NpuFusedAdamP(model.parameters(), lr=args.lr)

bert_adam

optimizer = torch.optim.BertAdam(model.parameters(), lr=args.lr)

optimizer = torch_npu.optim.NpuFusedBertAdam(model.parameters(), lr=args.lr)

rmsprop

optimizer = torch.optim.RMSprop(model.parameters(), lr=args.lr)

optimizer = torch_npu.optim.NpuFusedRMSprop(model.parameters(), lr=args.lr)

rmsprop_tf

optimizer = torch.optim.RMSpropTF(model.parameters(), lr=args.lr)

optimizer = torch_npu.optim.NpuFusedRMSpropTF(model.parameters(), lr=args.lr)

环境准备

点击获取链接,获取MobileNetV1模型,并根据readme准备训练环境和数据集。

注意:从昇腾ModelZoo上获取的MobileNetV1模型脚本为已经进行了梯度融合优化的版本。若用户想使用该模型脚本体验本案例中的调优流程,可先将模型脚本main.py中的优化器定义代码改为原始优化器torch.optim.SGD,再执行以下流程。

瓶颈识别

  1. 修改训练脚本还原原生优化器函数,此操作在原生模型脚本中无需进行。
        model = model.to(device) 
     
        # define loss function (criterion) and optimizer 
        criterion = nn.CrossEntropyLoss().to(device) 
     
        optimizer = torch.optim.SGD(model.parameters(), args.lr, 
                                                    momentum=args.momentum, 
                                                weight_decay=args.weight_decay) 
     
        if args.apex: 
            model, optimizer = amp.initialize(model, optimizer, 
                                              opt_level=args.apex_opt_level, 
                                              loss_scale=args.loss_scale_value, 
                                              combine_grad=True)

    执行训练,记录耗时。

  2. bash ./test/train_full_1p.sh --data_path=/data/path/    # 请根据实际情况更改data_path

    耗时数据如下图所示。

    image.png

性能调优

以下调优步骤基于已完成模型向NPU的迁移。

  1. 模型脚本开头添加库代码。
    import torch_npu 
    import torch_npu.optim

    找到模型脚本main.py中的优化器定义代码,将原始优化器替换为对应的NPU亲和融合优化器。样例代码如下。

  2. 原代码:

    optimizer = torch.optim.SGD(model.parameters(), args.lr, 
                                            momentum=args.momentum, 
                                            weight_decay=args.weight_decay)

    修改后代码:

    optimizer = torch_npu.optim.NpuFusedSGD(model.parameters(), args.lr, 
                                            momentum=args.momentum, 
                                            weight_decay=args.weight_decay)

    optimizer = apex.optimizers.NpuFusedSGD(model.parameters(), args.lr, 
                                            momentum=args.momentum, 
                                            weight_decay=args.weight_decay)

    注意:当前昇腾适配的MobileNetV1模型使用的是apex组件包中的NpuFusedSGD,此处修改为torch_npu.optim.NpuFusedSGD可能会导致精度异常。

  3. 拉起模型训练,进行profiling,生成json文件。以下命令以单卡训练为例。
    bash ./test/train_full_1p.sh --data_path=/data/path/    # 请根据实际情况更改data_path

    执行训练,对比未设置亲和优化器时的训练数据,每秒处理的图片数提升,性能有一定程度优化。

  4. 耗时数据如下图所示。

    image.png

02 动态shape(算子二进制)调优案例

问题背景

有些模型在模型计算的过程中会存在动态shape场景,即在模型计算过程中,模型的输入和输出存在多种shape。这种情况下,由于编译时无法已知全部shape信息,每次调用算子进行计算时都需要进行编译,会增加编译开销和内存使用,降低性能。

总体思路

使用PyTorch Analyse工具的动态shape模式对于模型脚本进行分析,判断是否存在动态shape算子。

  • 若不存在可进行其他内容调优。
  • 若存在,请安装算子二进制包。PyTorch框架可调用算子二进制包中算子编译信息,可设置模型编译时是否优先在线编译,以此解决动态shape问题、优化模型训练性能。

环境准备

  1. 点击获取链接,获取Yolov5模型,并根据readme准备训练环境和数据集。
  2. 参考CANN软件安装指南中“常用操作 > 安装、升级和卸载二进制算子包”章节,安装算子二进制包。

瓶颈识别

使用PyTorch Analyse工具的动态shape模式对于模型脚本进行分析,生成动态shape的分析报告msft_dynamic_shape_analysis_report.csv。

  1. 进入分析工具所在路径。
    cd Ascend-cann-toolkit安装目录/ascend-toolkit/latest/tools/ms_fmk_transplt/

    执行分析。

  2. ./pytorch_analyse.sh -i 待分析脚本路径 -o 分析结果输出路径 -v 待分析脚本框架版本 -m dynamic_shape

    命令中的参数说明如下表所示。

    参数

    参数说明

    取值示例

    -i

    --input

    1. 待分析脚本文件或三方库套件源码所在文件夹路径。
    2. 必选。

    /home/xxx/analysis

    -o

    --output

    1. 分析结果文件输出路径。
    2. 会在该路径下生成xxxx_analysis文件夹。
    3. 必选。

    /home/xxx/analysis_output

    -v

    --version

    1. 待分析脚本或三方库套件源码的PyTorch版本。目前支持1.8.1、1.11.0、2.0.1、2.1.0。
    2. 必选。
    1. 1.8.1
    2. 1.11.0
    3. 2.0.1
    4. 2.1.0

    -m

    --mode

    1. 分析的模式。目前支持torch_apis(算子支持情况分析)、third_party(三方库套件分析)、affinity_apis(亲和API分析)和dynamic_shape(动态shape分析)模式。
    2. 可选。
    1. torch_apis(默认)
    2. third_party
    3. affinity_apis
    4. dynamic_shape

    -env

    --env-path

    1. 分析时需要增加的PYTHONPATH环境变量路径,仅安装jedi后该参数才生效。
    2. 可选。

    /home/xxx/transformers/src /home/xxx/transformers/utils

    多个文件路径使用空格隔开。

    -api

    --api-files

    1. 三方库不支持API的分析结果文件。
    2. 可选。

    /home/xxx/mmcv_analysis/full_unsupported_results.csv /home/xxx/transformers_analysis/full_unsupported_results.csv

    多个文件路径使用空格隔开。

    -h

    --help

    显示帮助信息。

    -

  3. 完成分析后,在分析结果输出路径下会生成一个完整的模型脚本文件夹,其中模型脚本代码都做了自动修改。在分析结果输出路径下,修改训练脚本文件中读取训练数据集的for循环,手动开启动态shape检测,请参考下方示例进行修改。

    修改前:

    for i, (ings, targets, paths, _) in pbar:

    修改后:

    for i, (ings, targets, paths, _) in DETECTOR.start(pbar):

    在分析结果输出路径下,拉起修改过的训练脚本,运行一个epoch即可。完成后会在路径下生成动态shape的分析报告msft_dynamic_shape_analysis_report.csv。其中存储了函数名称、调用栈、所在文件、文件行号、输入和输出的shape范围,如下图样例所示。

  4.  样例动态shape分析报告如下:

性能调优

 在代码中使能算子二进制即可完成性能调优。

1、打开训练脚本。

vi train.py

2、在主函数中添加使能算子二进制的代码。

if __name__ == '__main__': 
    torch_npu.npu.set_compile_mode(jit_compile=False) 
    main()

3、拉起训练。对比使能算子二进制前后的step训练耗时,发现性能数据获得提升即说明调优成功。如下图所示,未开启算子二进制时一个step训练总耗时(mTime)约为1.4s,开启后一个step训练总耗时(mTime)约为1.2s。

未开启算子二进制:

image.png

开启算子二进制:

image.png

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

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

相关文章

压力测试+接口测试

jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单。因 为jmeter是java开发的,所以运行的时候必须先要安装jdk才可以。jmeter是…

2023 年度,最受人欢迎的低代码开发平台大盘点

在介绍之前,先给大家讲解一下,当前低代码领域主要发展的2个方向 一、低代码开发平台 面向大中小型企业,写少了代码,提供一系列低代码引擎,表单设计器、流程设计器、大屏设计器,支持通过可视化组件少量代码…

配置OSPF包文分析和验证

.2.2实验2:配置OSPF包文分析和验证 [1] 实验目的 通过抓包分析OSPF的包文实现OSPF区域认证的配置 实验拓扑 实验拓扑图如图1-3所示。 图1-3 配置OSPF包文分析和验证 实验步骤 IP地址的配置、运行OSPF的步骤与实验1相同,此处略。[2] 在R1的g0/0/0抓包…

配电室远程运维平台:现代化的电力管理解决方案

随着科技进步和电力行业的发展,配电室正在逐渐实现远程运维,这一创新技术趋势带来的改变,无疑提升了电力配送的效率和精确性。 力安科技电易云配电室远程运维平台,通过在高低压配电柜、变压器、一级/二级配电柜、配电箱、电缆…

今天面试招了个18K的人,从字节出来的果然都有两把刷子···

公司前段时间缺人,也面了不少测试,前面一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在15-20k,面试的人很多,但平均水平很让人失望。看简历很多都是4年工作经验,但面试中,不…

[小林coding]4.1TCP三次握手四次挥手笔记_1012

1.tcp头部格式: 序列号:用来解决网络包收发的顺序问题 确认应答号:解决丢包问题(一般都是1) 2.建立一个 TCP 连接是需要客户端与服务端达成上述三个信息的共识 Socket:由 IP 地址和端口号组成(…

1000个已成功入职的软件测试工程师简历范文模板(含真实简历)

如果你想学习自动化测试,那么下面这套视频应该会帮到你很多 如何逼自己1个月学完自动化测试,学完即就业,小白也能信手拈来,拿走不谢,允许白嫖.... 最后我这里给你们分享一下我所积累和整理的一些文档和学习资料&#…

云原生Kubernetes:K8S集群版本升级

目录 一、理论 1.K8S集群升级 2.集群概况 3.升级集群 4.验证集群 二、实验 1.升级集群 2.验证集群 三、问题 1.给node1节点打污点报错 一、理论 1.K8S集群升级 (1)概念 搭建K8S集群的方式有很多种,比如二进制,kubeadm…

2023年【公路水运工程施工企业安全生产管理人员】考试总结及公路水运工程施工企业安全生产管理人员模拟考试题库

题库来源:安全生产模拟考试一点通公众号小程序 2023年【公路水运工程施工企业安全生产管理人员】考试总结及公路水运工程施工企业安全生产管理人员模拟考试题库,包含公路水运工程施工企业安全生产管理人员考试总结答案和解析及公路水运工程施工企业安全…

Kotlin-Java 互操作指南

官网地址 https://developer.android.google.cn/kotlin/interop?hlzh-cn 脑图

外汇天眼:6个常见网络投资诈骗迹象,如发现任何一个,务必小心!

在这个数字时代,随着外汇和加密货币市场的不断发展,网络投资已经成为一种广受欢迎的理财方式。然而,近年来,诈骗犯罪也在不断增加,给社会带来了巨大的财务损失。尽管投资诈骗的手法各式各样,但它们都可以追…

2023年全球及中国光伏硅片行业产量、市场竞争格局及趋势分析[图]

随着硅片企业建厂扩建,我国硅片产能逐步增长,光伏硅片产能逐渐向中国集中。2022年,我国光伏硅片产能约650.3GW,同比增长59.7%;2023年1-6月,我国光伏硅片产量超过253.4GW,同比增长65.8%&#xff…

一道桥牌明手题的思路与分析

题目 S先出,要求NS全大 分析 剩下6吨牌,可以确保大的有五吨(h2吨,d2吨,c1吨) 我们需要额外发展一顿出来,哪一顿呢? s、d和c都有机会,那么我们不妨先让WE陷入被挤的境地…

射频识别技术(RFID)在智能制造模具管理中的应用

背景介绍 模具是工业生产的核心装备,被誉为“工业之母”,广泛应用于机械、汽车、轻工、电子、化工、冶金、建材等各个行业,是制造加工企业的重要资产,然而,传统的人工纸质记录方式已无法满足模具管理的需求&#xff0…

在Android平板上使用code-server公网远程Ubuntu服务器编程

文章目录 1.ubuntu本地安装code-server2. 安装cpolar内网穿透3. 创建隧道映射本地端口4. 安卓平板测试访问5.固定域名公网地址6.结语 1.ubuntu本地安装code-server 准备一台虚拟机,Ubuntu或者centos都可以,这里以VMwhere ubuntu系统为例 下载code server服务,浏览器…

冲量在线中标浦发银行AI SaaS服务平台的可信安全技术能力提升项目!打造金融行业首个可信MaaS服务

近日,冲量在线中标浦发银行「围绕SaaS服务平台的可信安全技术能力提升项目」,基于冲量在线领先的隐私计算技术及AI模型可信训练和推理能力,联合海光打造了金融行业首个AI能力可信输出SaaS平台,赋能浦发银行AI能力安全对外输出和共…

怎样录制音频文件?让我一步步带你操作

“音频文件怎么录制呀?参加了学校组织的短视频大赛,现在画面已经拍好了,但是找不到合适的音频,想亲自去录制一个,可是不会操作,大家知道怎么录制音频文件吗?” 录制音频文件已经成为很多人日常…

一.镜头知识之焦点,焦距,有效焦距,前焦距,后焦距

一.镜头知识之焦点,焦距,有效焦距,前焦距,后焦距 文章目录 一.镜头知识之焦点,焦距,有效焦距,前焦距,后焦距1.焦点/焦距f1.1 第一种情况:单片的薄透镜1.2 第二种情况&…

PreScan与MATLAB联合仿真报错

一、 问题: Error:Matlab ||和&&运算符的操作数必须能够转换为逻辑标量值 二、解决办法 必须安装VS2013(我装的VS2017不行的),然后重启prescan和MATLAB,编译通过,界面如下: 三、VS…

【JavaEE】IO 操作

文章目录 前言什么是 IOReader 读操作1. 创建 Reader 类2. 理解 Reader 类中的不同 read 方法3. 使用 Reader 类当中的不同 read 方法3. 关闭文件操作 Writer 写操作1. 创建出 Writer 类2. 理解 Writer 类中的不同 write 方法3. 使用 Writer 类当中的 write 方法 OutputStream …