模型详情

发布者(Publisher):Huawei

应用领域(Application Domain):Object Detection

版本(Version):1.1

修改时间(Modified) :2022.8.16

大小(Size):190616KB

框架(Framework):PyTorch 1.5

模型格式(Model Format):ckpt

精度(Precision):Mixed

处理器(Processor):昇腾910

应用级别(Categories):Official

描述(Description):基于PyTorch框架的图像超分辨率训练代码

概述

简述

我们提出了一种用于单幅图像超分辨率(SR)的深度学习方法。我们的方法直接学习低/高分辨率图像之间的端到端映射。该映射表示为一个深度卷积神经网络 (CNN),它将低分辨率图像作为输入并输出高分辨率图像。我们进一步表明,传统的基于稀疏编码的 SR 方法也可以被视为深度卷积网络。但与单独处理每个组件的传统方法不同,我们的方法联合优化了所有层。我们的深度 CNN 结构轻巧,但展示了最先进的恢复质量,并实现了实际在线使用的快速速度。我们探索不同的网络结构和参数设置,以实现性能和速度之间的权衡.

默认配置

  • 训练超参(单卡):
    • batch_size 32
    • data_url
    • train_url
    • num-epochs
    • lr 1e-4
    • num-workers 8
    • seed 123

支持特性

特性列表 是否支持
分布式训练
混合精度
数据并行

混合精度训练

昇腾910 AI处理器提供自动混合精度功能,可以针对全网中float32数据类型的算子,按照内置的优化策略,自动将部分float32的算子降低精度到float16,从而在精度损失很小的情况下提升系统性能并减少内存使用。

开启混合精度

基于NPU芯片的架构特性,会涉及到混合精度训练,即混合使用float16和float32数据类型的应用场景。使用float16代替float32有如下好处:

  • 对于中间变量的内存占用更少,节省内存的使用。
  • 因内存使用会减少,所以数据传出的时间也会相应减少。
  • float16的计算单元可以提供更快的计算性能。

但是,混合精度训练受限于float16表达的精度范围,单纯将float32转换成float16会影响训练收敛情况,为了保证部分计算使用float16来进行加速的同时能保证训练收敛,这里采用混合精度模块Apex来达到以上效果。混合精度模块Apex是一个集优化性能、精度收敛于一身的综合优化库。

适配昇腾AI处理器的混合精度模块Apex除了上述优点外,还能提升运算性能。具体如下:

  • Apex在混合精度运算过程中,会对模型的grad进行运算。开启combine_grad开关,可以加速这些运算。具体为将amp.initialize()接口参数combine_grad设置为True;
  • 适配后的Apex针对adadelta/adam/sgd/lamb做了昇腾AI处理器亲和性优化,得到的NPU融合优化器与原生算法保持一致,但运算速度更快。使用时只需将原有优化器替换为apex.optimizers.*(“*”为优化器名称,例如NpuFusedSGD)。
  • 适配后的Apex针对数据并行场景做了昇腾AI处理器亲和性优化,支持利用融合grad进行加速,同时保持计算逻辑一致性。通过开启combine_ddp开关,也就是将amp.initialize()接口参数combine_ddp设置为True并关闭DistributedDataParallel,即可开启该功能。

特性支持

混合精度模块功能和优化描述如表1所示。

表 1 混合精度模块功能

功能

描述

O1配置模式

Conv,Matmul等使用float16计算,其他如Softmax、BN使用float32。

O2配置模式

除了BN使用float32外,其他绝大部分使用float16。

静态Loss Scale功能

静态设置参数确保混合精度训练收敛。

动态Loss Scale功能

动态计算loss Scale值并判断是否溢出。

说明:

  • 当前版本的实现方式主要为python实现,不支持AscendCL或者CUDA优化。
  • 当前昇腾AI设备暂不支持原始Apex的FusedLayerNorm接口模块,如果模型原始脚本文件使用了FusedLayerNorm接口模块,需要在模型迁移过程中将脚本头文件“from apex.normalization import FusedLayerNorm“替换为“from torch.nn import LayerNorm“。

将混合精度模块集成到PyTorch模型中

  1. 使用apex混合精度模块需要首先从apex库中导入amp,代码如下:

    from apex import amp
  2. 导入amp模块后,需要初始化amp,使其能对模型、优化器以及PyTorch内部函数进行必要的改动,初始化代码如下:

    model, optimizer = amp.initialize(model,optimizer,opt_level='O2',loss_scale=32.0,combine_grad=True)
  3. 标记反向传播.backward()发生的位置,这样Amp就可以进行Loss Scaling并清除每次迭代的状态,代码如下:

    原始代码:

    loss = criterion(…) 
    loss.backward() 
    optimizer.step()

    修改以支持loss scaling后的代码:

    loss = criterion(preds, labels)
    optimizer.zero_grad()
    # loss.backward()
    with amp.scale_loss(loss, optimizer) as scaled_loss:
          scaled_loss.backward()
    optimizer.step()
    

训练环境准备

pip3 install requirements.txt

说明:依赖配置文件requirements.txt文件位于模型的根目录

快速上手

数据集准备

1、用户自行准备好数据集,使用91图像数据集作为训练集,使用Set-5数据集作为验证集。

2、Super-Resolution_CNN训练的模型及数据集可以参考"简述 -> 参考实现"

模型训练

  • 单击“立即下载”,并选择合适的下载方式下载源码包。

  • 开始训练。

    • 启动训练之前,首先要配置程序运行相关环境变量。

      环境变量配置信息参见:

      Ascend 910训练平台环境变量设置

    • 单卡训练

      1. 配置训练参数。

        首先在脚本test/train_full_1p.sh中,配置batch_size、steps、epochs、data_path等参数,请用户根据实际路径配置data_path,或者在启动训练的命令行中以参数形式 下发。

        --data_url=${data_path} 
        --train_url=${output_path} 
        --num-epochs=500
      2. 启动训练。

        启动单卡训练 (脚本为Super-Resolution_CNN_ID3003_for_Pytorch / test / train_full_1p.sh)

        bash train_full_1p.sh --data_path='dataset'
      3. 精度指标。

       | 精度指标项 | 论文发布 | GPU实测 | NPU实测 |
       | ---------- | -------- | ------- | ------- |
       | PSNR   | 32.75    | 33.27   | 33.27   |

高级参考

脚本和示例代码

├── train.py                      //网络训练与测试代码
├── README.md                                 //代码说明文档
├── modelzoo_level.txt                               
├── datasets.py                         
├── model.py                         
├── prepare.py                                   
├── requirements.txt                          //训练python依赖列表
├── modelarts_entry_acc.py                    //单卡全量训练启动代码
├── modelarts_entry_perf.py                   //单卡训练验证性能启动代码
├── test
│    ├──train_performance_1p.sh               //单卡训练验证性能启动脚本
│    ├──train_full_1p.sh                      //单卡全量训练启动脚本

脚本参数

-- batch_size 32
-- data_url 
-- train_url 
-- num-epochs
-- lr 1e-4
-- num-workers 8
-- seed 123

训练过程

通过“模型训练”中的训练指令启动单卡或者多卡训练。单卡和多卡通过运行不同脚本,支持单卡,8卡网络训练。模型存储路径为<math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mrow><mi>c</mi><mi>u</mi><msub><mi>r</mi><mi>p</mi></msub><mi>a</mi><mi>t</mi><mi>h</mi></mrow><mi mathvariant="normal">/</mi><mi>o</mi><mi>u</mi><mi>t</mi><mi>p</mi><mi>u</mi><mi>t</mi><mi mathvariant="normal">/</mi></mrow><annotation encoding="application/x-tex">{cur_path}/output/</annotation></semantics></math>curpath/output/ASCEND_DEVICE_ID,包括训练的log以及checkpoints文件。以单卡训练为例,loss信息在文件<math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mrow><mi>c</mi><mi>u</mi><msub><mi>r</mi><mi>p</mi></msub><mi>a</mi><mi>t</mi><mi>h</mi></mrow><mi mathvariant="normal">/</mi><mi>o</mi><mi>u</mi><mi>t</mi><mi>p</mi><mi>u</mi><mi>t</mi><mi mathvariant="normal">/</mi></mrow><annotation encoding="application/x-tex">{cur_path}/output/</annotation></semantics></math>curpath/output/{ASCEND_DEVICE_ID}/train_${ASCEND_DEVICE_ID}.log中。

使用模型资源和服务前,请您仔细阅读并理解透彻《昇腾深度学习模型许可协议 3.0》
该页面对您有帮助吗?
我要评分