Muyun99's wiki Muyun99's wiki
首页
学术搬砖
学习笔记
生活杂谈
wiki搬运
资源收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Muyun99

努力成为一个善良的人
首页
学术搬砖
学习笔记
生活杂谈
wiki搬运
资源收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 代码实践-目标检测

  • 代码实践-图像分割

  • 代码实践-自监督学习

  • 竞赛笔记-视觉竞赛

  • 框架解析-mmlab系列

    • MMClassifiction 框架学习导言
    • mmcls 是如何能够通过config 就搭建好一个模型的?
    • 为自己的 inicls 框架加上 fp16 训练
      • 为自己的 inicls 框架集成 Horovod
      • 为自己的 inicls 框架集成 DALI
      • mmsegmentation框架解析(上)
      • mmsegmentation框架解析(中)
      • mmsegmentation框架解析(下)
      • mmcv 使用
      • mmcv使用(中)--Config
      • 什么是 Register
      • 什么是 ABCMeta
      • mmseg数据集
      • mmseg 推理单张图像并保存
      • 计算loss和计算metric
    • 讲座记录-有意思的文章集合

    • 体会感悟-产品沉思录观后有感

    • 体会感悟-摄影

    • 系列笔记-

    • 系列笔记-乐理和五线谱

    • 系列笔记-爬虫实践

    • 系列笔记-Django学习笔记

    • 系列笔记-Git 使用笔记

    • 系列笔记-网站搭建

    • 系列笔记-图卷积网络

    • 课程笔记-MIT-NULL

    • 系列笔记-OpenCV-Python

    • 系列笔记-使用 Beancount 记账

    • 系列笔记-Python设计模式

    • 系列笔记-MLOps

    • 系列笔记-Apollo自动驾驶

    • 系列笔记-PaddlePaddle

    • 系列笔记-视频操作

    • Vue+Django前后端分离开发

    • 深度学习及机器学习理论知识学习笔记

    • PyTorch Tricks

    • 学习笔记
    • 框架解析-mmlab系列
    Muyun99
    2021-07-13

    为自己的 inicls 框架加上 fp16 训练

    # 为自己的 inicls 框架加上 fp16 训练

    # 01、如何实现

    不得不说现在的库封装的都特别好,核心代码就加了几行

    from torch.cuda.amp import GradScaler, autocast
    
    
    for iteration in range(max_iteration):
        optimizer.zero_grad()
    
        if cfg.fp16 is True:
            with autocast():
                logits = model(images)
                loss = criterion(logits, labels).mean()
            scaler.scale(loss).backward()
            scaler.step(optimizer)
            scaler.update()
        else:
            logits = model(images)
            loss = criterion(logits, labels)
            loss.backward()
            optimizer.step()
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    if cfg.fp16:
    	with autocast():
    		logits = model(images)
    else:
    	logits = model(images)
    
    1
    2
    3
    4
    5

    # 02、效果比较

    # 2.1 脚本介绍

    实验的脚本非常简单,不得不说搭了这个框架之后做一些普通实验是真的很方便

    export CUDA_VISIBLE_DEVICES=0
    python train.py config/resnet/resnet18_b16x8_kaggle_leaves.py --tag resnet_fp16 --options "fp16=True" "data.train.ann_file=train_fold0.csv" "data.val.ann_file=valid_fold0.csv"
    
    python train.py config/resnet/resnet18_b16x8_kaggle_leaves.py --tag resnet_not_fp16 --options "data.train.ann_file=train_fold0.csv" "data.val.ann_file=valid_fold0.csv"
    
    1
    2
    3
    4

    # 2.2 速度、显存、性能对比

    实验名称 学习率 验证集上最优精度 训练时间 显存占用 备注
    resnet_fp16_lr_0.1 0.1 0.9553 13m27s 2300MiB 在 6k iteration 之后 loss 变为 nan
    resnet_fp16_lr_0.01 0.01 0.9455 12m59s 2300MiB 在 5k iteration 之后 loss 变为 nan
    resnet_fp16_lr_0.001 0.001 0.7126 13m31s 2300MiB 在 4k iteration 之后 loss 变为 nan
    resnet_nofp16_lr_0.1 0.1 0.9651 19m19s 未使用 fp16
    resnet_fp16_lr_0.1_v3 0.1 0.9635 12m10s 4360MiB batch_size 改为 256,并且 loss 并未变为 nan
    resnet_fp16_lr_0.1_v4 0.1 0.9624 50m29s 4360MiB batch_size 改为 256,并且将epoch 改为 200,在 8k iteration 之后 loss 变为 nan
    resnet_fp16_lr_0.1_v7_apex 0.1 0.933 16m2s 2300MiB 使用apex.amp,模式为01
    resnet_fp16_lr_0.1_v8 0.1 0.9654 13m28s 2300MiB 将 optimizer.step() 写到 else 语句里面

    # 03、loss 变为nan

    在我用默认配置跑的时候,发现在 7k 左右的 iteration ,loss 会突变为 nan,目前尚不知是什么原因,先尝试了把学习率给调低,并没有什么影响

    然后把 batch_size调高了发现不会出现nan了,

    下面尝试讲 batch_size 调高的同时加大epoch数

    破案了,发现是 optimizer 重复step了

    if cfg.fp16 is True:
        with autocast():
            logits = model(images)
            loss = criterion(logits, labels)
        scaler.scale(loss).backward()
        scaler.step(optimizer)
        scaler.update()
    else:
        logits = model(images)
        loss = criterion(logits, labels)
        loss.backward()
    optimizer.step()
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    将 optimizer.step() 写到里面即可

    # 04、mmcls 是如何实现 fp16 训练的呢

    参考资料:

    • PyTorch 源码解读之 torch.cuda.amp: 自动混合精度详解 (opens new window)
    • 浅谈混合精度训练 imagenet (opens new window)
    • torch.cuda.amp 官方文档 (opens new window)
    • torch.cuda.amp 官方示例 (opens new window)
    上次更新: 2021/08/02, 21:04:52
    mmcls 是如何能够通过config 就搭建好一个模型的?
    为自己的 inicls 框架集成 Horovod

    ← mmcls 是如何能够通过config 就搭建好一个模型的? 为自己的 inicls 框架集成 Horovod→

    最近更新
    01
    Structured Knowledge Distillation for Semantic Segmentation
    06-03
    02
    README 美化
    05-20
    03
    常见 Tricks 代码片段
    05-12
    更多文章>
    Theme by Vdoing | Copyright © 2021-2023 Muyun99 | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    ×