当前位置: 首页 > news >正文

【深度学习计算性能】06:多GPU的简洁实现

在这里插入图片描述

【作者主页】Francek Chen
【专栏介绍】⌈⌈PyTorch深度学习⌋⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。
【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。

文章目录

    • 一、简单网络
    • 二、网络初始化
    • 三、训练
    • 小结


  每个新模型的并行计算都从零开始实现是无趣的。此外,优化同步工具以获得高性能也是有好处的。下面我们将展示如何使用深度学习框架的高级API来实现这一点。数学和算法与多GPU训练中的相同。本文的代码至少需要两个GPU来运行。

import torch
from torch import nn
from d2l import torch as d2l

一、简单网络

  让我们使用一个比多GPU训练的LeNet更有意义的网络,它依然能够容易地和快速地训练。我们选择的是ResNet-18。因为输入的图像很小,所以稍微修改了一下。与残差网络(ResNet)的区别在于,我们在开始时使用了更小的卷积核、步长和填充,而且删除了最大汇聚层。

#@save
def resnet18(num_classes, in_channels=1):"""稍加修改的ResNet-18模型"""def resnet_block(in_channels, out_channels, num_residuals, first_block=False):blk = []for i in range(num_residuals):if i == 0 and not first_block:blk.append(d2l.Residual(in_channels, out_channels, use_1x1conv=True, strides=2))else:blk.append(d2l.Residual(out_channels, out_channels))return nn.Sequential(*blk)# 该模型使用了更小的卷积核、步长和填充,而且删除了最大汇聚层net = nn.Sequential(nn.Conv2d(in_channels, 64, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(64),nn.ReLU())net.add_module("resnet_block1", resnet_block(64, 64, 2, first_block=True))net.add_module("resnet_block2", resnet_block(64, 128, 2))net.add_module("resnet_block3", resnet_block(128, 256, 2))net.add_module("resnet_block4", resnet_block(256, 512, 2))net.add_module("global_avg_pool", nn.AdaptiveAvgPool2d((1,1)))net.add_module("fc", nn.Sequential(nn.Flatten(), nn.Linear(512, num_classes)))return net

二、网络初始化

  我们将在训练回路中初始化网络。请参见数值稳定性和模型初始化复习初始化方法。

net = resnet18(10)
# 获取GPU列表
devices = d2l.try_all_gpus()
# 我们将在训练代码实现中初始化网络

三、训练

  如前所述,用于训练的代码需要执行几个基本功能才能实现高效并行:

  • 需要在所有设备上初始化网络参数;
  • 在数据集上迭代时,要将小批量数据分配到所有设备上;
  • 跨设备并行计算损失及其梯度;
  • 聚合梯度,并相应地更新参数。

  最后,并行地计算精确度和发布网络的最终性能。除了需要拆分和聚合数据外,训练代码与前几章的实现非常相似。

def train(net, num_gpus, batch_size, lr):train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)devices = [d2l.try_gpu(i) for i in range(num_gpus)]def init_weights(m):if type(m) in [nn.Linear, nn.Conv2d]:nn.init.normal_(m.weight, std=0.01)net.apply(init_weights)# 在多个GPU上设置模型net = nn.DataParallel(net, device_ids=devices)trainer = torch.optim.SGD(net.parameters(), lr)loss = nn.CrossEntropyLoss()timer, num_epochs = d2l.Timer(), 10animator = d2l.Animator('epoch', 'test acc', xlim=[1, num_epochs])for epoch in range(num_epochs):net.train()timer.start()for X, y in train_iter:trainer.zero_grad()X, y = X.to(devices[0]), y.to(devices[0])l = loss(net(X), y)l.backward()trainer.step()timer.stop()animator.add(epoch + 1, (d2l.evaluate_accuracy_gpu(net, test_iter),))print(f'测试精度:{animator.Y[0][-1]:.2f}{timer.avg():.1f}秒/轮,'f'在{str(devices)}')

  接下来看看这在实践中是如何运作的。我们先在单个GPU上训练网络进行预热。

train(net, num_gpus=1, batch_size=256, lr=0.1)

在这里插入图片描述
在这里插入图片描述

  接下来我们使用2个GPU进行训练。与多GPU训练中评估的LeNet相比,ResNet-18的模型要复杂得多。这就是显示并行化优势的地方,计算所需时间明显大于同步参数需要的时间。因为并行化开销的相关性较小,因此这种操作提高了模型的可伸缩性。

train(net, num_gpus=2, batch_size=512, lr=0.2)

在这里插入图片描述
在这里插入图片描述

小结

  • 神经网络可以在(可找到数据的)单GPU上进行自动评估。
  • 每台设备上的网络需要先初始化,然后再尝试访问该设备上的参数,否则会遇到错误。
  • 优化算法在多个GPU上自动聚合。
http://www.dtcms.com/a/338805.html

相关文章:

  • 守护通行安全,“AI+虚拟仿真”领航交通设施人才培育
  • ROS点云可视化工具——Foxglove工具使用
  • Spring Cloud 微服务架构:Eureka 与 ZooKeeper 服务发现原理与实战指南 NO.1
  • 前端如何处理首屏优化问题
  • 微信小程序实现蓝牙开启自动播放BGM
  • 八大排序简介
  • 【集合框架LinkedList底层添加元素机制】
  • el-table 动态列表渲染和动态表格背景设置
  • JavaWeb前端03(Vue用法及具体案例)
  • UniApp 微信小程序之间跳转指南
  • Ubuntu 18.04上安装GCC 9
  • 关于Linux内核中头文件问题相关总结
  • 《Dual Prompt Personalized Federated Learning in Foundation Models》——论文阅读
  • 【使用三化学习早期融合的非标记化架构】
  • ZooKeeper 一致性模型解析:线性一致性与顺序一致性的平衡
  • ReLens「Focus DSLR 大光圈虚化相机」v4.1.2 f 解锁付款版 —一款专业大光圈和单反级背景虚化编辑软件
  • 知微传感3D相机上位机DkamViewer使用:给相机升级固件
  • 实现自己的AI视频监控系统-第一章-视频拉流与解码1
  • 【Ansible】Ansible架构及Ansible工作流程
  • 基于Java(SSM框架)+MySQL实现(Web)的超市管理系统
  • 私有化部署全攻略:开源模型本地化改造的性能与安全评测
  • 【大模型本地运行与部署框架】Ollama的使用记录
  • 选项式api和组合式api
  • 【冒泡排序】
  • Java 检查给定的四个点是否形成正方形(Check if given four points form a square)
  • Springboot 3 上传图片,并返回路径让前端显示图片
  • 《UE5_C++多人TPS完整教程》学习笔记43 ——《P44 奔跑混合空间(Running Blending Space)》
  • 监督分类——最小距离分类、最大似然分类、支持向量机
  • Spring Boot 敏感词过滤组件实现:基于DFA算法的高效敏感词检测与替换
  • BROADCHIP广芯电子在各类电子产品的方案与应用