原文链接(可以直接运行代码).

实验: 混合精度训练对比 (GTX 3090 VS TESLA V100-SXM2)

经常有小伙伴问我 TESLA V100 显存 16GB 比 GTX 3090 的 24GB 少了 8GB,价格还一样,为啥要用 V100 呢?

使用精度低于 32 位浮点数的数字格式有很多好处。首先,它们需要 更少的内存,从而能够训练和部署更大的神经网络。其次,它们需要 更少的内存带宽,从而加快数据传输操作。第三,数学运算在降低精度的情况下 运行得更快,尤其是在具有 Tensor Core 支持该精度的 GPU 上。混合精度训练实现了所有这些好处,同时确保与全精度训练相比不会丢失特定于任务的准确性。

使用混合精度训练需要以下两个步骤:

  • 移植模型以使用 FP16 数据类型。
  • 添加损失缩放以保留较小的梯度值。

下载数据集

!featurize dataset download 12d20991-7d1a-4722-bf42-b3933bf34689

以下两个包如果自己环境没有的同学请去掉注释运行

#!pip install nvidia-ml-py3 timm
import torch
import timm
import cv2
import os
import nvidia_smi
import randomimport pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as snsfrom datetime import datetimesns.set_theme(style="whitegrid")df = pd.read_csv('/home/featurize/data/FMY/train.csv')
df.head(2)

定义 PyTorch 的 Dataset

class Dataset(torch.utils.data.Dataset):def __init__(self, df: pd.DataFrame):self.df = dfdef __getitem__(self, index: int):row = self.df.iloc[index]fn = row.image# 读取数据image = cv2.imread(os.path.join(row.path, fn))image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 统一数据尺寸image = cv2.resize(image, (384, 512), interpolation=cv2.INTER_LINEAR)image = image.transpose(2, 0, 1)label = np.array([row.label])return torch.from_numpy(image).float(), torch.from_numpy(label).float()def __len__(self):return len(self.df)

创建 PyTorch 的 Dataloader

train_dataset = Dataset(df)
train_dataloader = torch.utils.data.DataLoader(train_dataset,batch_size=32,num_workers=8,shuffle=True,pin_memory=True
)

生成随机的样本看一看

image, label = train_dataset.__getitem__(random.randint(0, len(train_dataset)-1))
plt.imshow(image.int().permute(1, 2, 0));
print('Label:', label.int().item())

创建模型、优化器、损失函数

model = timm.create_model('tf_efficientnet_b0', num_classes=1).cuda()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3, momentum=0.9)
criterion = torch.nn.BCEWithLogitsLoss()

上面的这些都是为实验作准备,选择的都是较小的 b0 模型和基础的损失函数,接下来的 4 个 Cell 分别对比了

GTX 3090

  • 单精度
  • 混合精度

V100

  • 单精度
  • 混合精度

所占用的 GPU 显存以及计算速度。更重要的是让小伙伴了解如何使用 PyTorch 半精度进行训练

实验一 GTX 3090 VS V100 (单精度)

now = datetime.now()
start_time = now.strftime("%H:%M:%S")
print("Start Time =", start_time)for epoch in range(1):running_loss = 0.0for i, data in enumerate(train_dataloader):# get the inputs; data is a list of [inputs, labels]inputs, labels = datainputs, labels = inputs.cuda(), labels.cuda()optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()if i % 100 == 99:    # print every 100 mini-batchesprint(f'Epoch: {epoch + 1} Iterations: {i + 1} Loss: {running_loss}')running_loss = 0.0print('Finished Training')now = datetime.now()
finish_time = now.strftime("%H:%M:%S")
print("Finish Time =", finish_time)nvidia_smi.nvmlInit()
handle = nvidia_smi.nvmlDeviceGetHandleByIndex(0)
info = nvidia_smi.nvmlDeviceGetMemoryInfo(handle)print("Total memory:", info.total)
print("Free memory:", info.free)
print("Used memory:", info.used)
print("GPU: ", nvidia_smi.nvmlDeviceGetName(handle))nvidia_smi.nvmlShutdown()

now = datetime.now()
start_time = now.strftime("%H:%M:%S")
print("Start Time =", start_time)for epoch in range(1):running_loss = 0.0for i, data in enumerate(train_dataloader):# get the inputs; data is a list of [inputs, labels]inputs, labels = datainputs, labels = inputs.cuda(), labels.cuda()optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()if i % 100 == 99:    # print every 100 mini-batchesprint(f'Epoch: {epoch + 1} Iterations: {i + 1} Loss: {running_loss}')running_loss = 0.0print('Finished Training')now = datetime.now()
finish_time = now.strftime("%H:%M:%S")
print("Finish Time =", finish_time)nvidia_smi.nvmlInit()
handle = nvidia_smi.nvmlDeviceGetHandleByIndex(0)
info = nvidia_smi.nvmlDeviceGetMemoryInfo(handle)print("Total memory:", info.total)
print("Free memory:", info.free)
print("Used memory:", info.used)
print("GPU: ", nvidia_smi.nvmlDeviceGetName(handle))nvidia_smi.nvmlShutdown()

上面的训练可以看到

GTX 3090

  • 显存占用:14205845504
  • 计算耗时:114 秒

V100

  • 显存占用:13943701504
  • 计算耗时:122 秒

V100 单精度计算略慢于 GTX 3090

实验二 GTX 3090 VS V100 (半精度)

scaler = torch.cuda.amp.GradScaler()
autocast = torch.cuda.amp.autocastnow = datetime.now()
current_time = now.strftime("%H:%M:%S")
print("Start Time =", current_time)for epoch in range(1):running_loss = 0.0for i, data in enumerate(train_dataloader):inputs, labels = datainputs, labels = inputs.cuda(), labels.cuda()optimizer.zero_grad()with autocast():outputs = model(inputs)loss = criterion(outputs, labels)scaler.scale(loss).backward()scaler.step(optimizer)scaler.update()running_loss += loss.item()if i % 100 == 99:    # print every 100 mini-batchesprint(f'Epoch: {epoch + 1} Iterations: {i + 1} Loss: {running_loss}')running_loss = 0.0now = datetime.now()
current_time = now.strftime("%H:%M:%S")
print("Finish Time =", current_time)nvidia_smi.nvmlInit()
handle = nvidia_smi.nvmlDeviceGetHandleByIndex(0)
info = nvidia_smi.nvmlDeviceGetMemoryInfo(handle)print("Total memory:", info.total)
print("Free memory:", info.free)
print("Used memory:", info.used)
print("GPU: ", nvidia_smi.nvmlDeviceGetName(handle))nvidia_smi.nvmlShutdown()

scaler = torch.cuda.amp.GradScaler()
autocast = torch.cuda.amp.autocastnow = datetime.now()
current_time = now.strftime("%H:%M:%S")
print("Start Time =", current_time)for epoch in range(1):running_loss = 0.0for i, data in enumerate(train_dataloader):inputs, labels = datainputs, labels = inputs.cuda(), labels.cuda()optimizer.zero_grad()with autocast():outputs = model(inputs)loss = criterion(outputs, labels)scaler.scale(loss).backward()scaler.step(optimizer)scaler.update()running_loss += loss.item()if i % 100 == 99:    # print every 100 mini-batchesprint(f'Epoch: {epoch + 1} Iterations: {i + 1} Loss: {running_loss}')running_loss = 0.0now = datetime.now()
current_time = now.strftime("%H:%M:%S")
print("Finish Time =", current_time)nvidia_smi.nvmlInit()
handle = nvidia_smi.nvmlDeviceGetHandleByIndex(0)
info = nvidia_smi.nvmlDeviceGetMemoryInfo(handle)print("Total memory:", info.total)
print("Free memory:", info.free)
print("Used memory:", info.used)
print("GPU: ", nvidia_smi.nvmlDeviceGetName(handle))nvidia_smi.nvmlShutdown()

这次的训练可以看到

GTX 3090

  • 显存占用:9092988928
  • 计算耗时:144 秒

V100

  • 显存占用:8084258816
  • 计算耗时:90 秒

V100 半精度远高于 GTX 3090 的半精度计算

如何使用 PyTorch 进行半精度训练相关推荐

  1. pytorch 中 混合精度训练(真香)

    一.什么是混合精度训练 在pytorch的tensor中,默认的类型是float32,神经网络训练过程中,网络权重以及其他参数,默认都是float32,即单精度,为了节省内存,部分操作使用float1 ...

  2. pytorch apex 混合精度训练和horovod分布式训练

    转载请注明出处: https://mp.csdn.net/postedit/103600124 如果你基于pytorch训练模型,然后,你想加快训练速度,增大batch_size,或者,你有一台配置多 ...

  3. 解决pytorch半精度amp训练nan问题

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者 | 可可哒@知乎(已授权) 来源 | https://zhua ...

  4. Pytorch混合精度训练

    还是搬运来给自己学习啊 多谢体谅拉~~ 这里分享混合精度训练的时候遇到的各种问题:1.forward期间nan,2.训练过程中loss scale一泻千里最终导致训练崩溃,以及如何debug. 简介 ...

  5. pytorch显卡内存随训练过程而增加_PyTorch重大更新:将支持自动混合精度训练!...

    AI编辑:我是小将 混合精度训练(mixed precision training)可以让模型训练在尽量不降低性能的情形下提升训练速度,而且也可以降低显卡使用内存.目前主流的深度学习框架都开始支持混合 ...

  6. MXNet半精度(FP16)

    MXNet半精度训练 1.先决条件 Volta range of Nvidia GPUs (e.g. AWS P3 instance) CUDA 9 or higher cuDNN v7 or hig ...

  7. 使用Apex进行混合精度训练

    使用Apex进行混合精度训练 转自:https://fyubang.com/2019/08/26/fp16/ 你想获得双倍训练速度的快感吗? 你想让你的显存空间瞬间翻倍吗? 如果我告诉你只需要三行代码 ...

  8. 收藏 | PyTorch深度学习模型训练加速指南2021

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者:LORENZ KUHN 编译:ronghuaiyang ...

  9. PyTorch:优化神经网络训练的17种方法

    点击上方"机器学习与生成对抗网络",关注星标 获取有趣.好玩的前沿干货! 选自efficientdl.com,作者:LORENZ KUHN 机器之心编译 本文介绍在使用 PyTor ...

最新文章

  1. Java语言概述及常用DOS命令
  2. ldflags android,Android 开发手记一 NDK编程实例
  3. 【微型计算机原理与接口技术】寻址方式
  4. 数据集 oracle,Analytics 数据集 - Oracle® ZFS Storage Appliance RESTful API 指南,发行版 OS8.6.0...
  5. SAE J1939 协议源代码分析(一)-程序结构框架
  6. R语言软件R Studio以及python下载函数包使用常见问题(持续更新中)
  7. jdbcTemplate测试报错:没有合适的驱动
  8. 学编程必备:3 大编程字体!让你在编程的时候原地起飞!
  9. HTML5期末大作业:抗疫主题网站设计(14页) HTML+CSS+JavaScript web课程设计网页规划与设计...
  10. 公众号如何涨粉,提高阅读量
  11. PgSQL · 乱入拜年 · 小鸡吉吉和小象Pi吉(PostgreSQL)的鸡年传奇
  12. Cocos2dx 3.1.1 之 加速传感器、监听物理按键
  13. 怎么下载和安装 eclipse?
  14. 【第十八篇】商城系统-订单中心设计解决方案
  15. and true和if都是python语言的保留字_python语言保留字有哪些
  16. ILSpy[.NET]反编译工具
  17. 四川水利职业技术学院计算机在哪里,四川水利职业技术学院地址在哪里
  18. 易语言启动线程传递多个类型的数据变量
  19. 我的2012--研究生的毕业季
  20. 【三年面试五年模拟】算法工程师的独孤九剑秘籍(前六式汇总篇)V1版

热门文章

  1. GPS导航测速点数据库与雷达探测器
  2. 微信内如何防止推广链接被封,微信内随机跳转落地页的实现原理
  3. 为何面试时都会问你的职业规划呢?该如何回答呢?
  4. react native 使用react-navigation
  5. 高中电子技术——蜂鸣器引脚上串联的耦合电容
  6. 移植三星的uboot(三)
  7. Public Round #1 题解
  8. 2018年春计算机教学计划,2018年教学计划
  9. 经典英文爱情句子10条
  10. P8813 [CSP-J 2022] 乘方