如何使用 neptune.ai 优化模型训练期间的 GPU 使用率

GPU 可以大大加速深度学习模型的训练,因为它们专门用于执行神经网络核心的张量运算。

由于 GPU 是昂贵的资源,因此充分利用它们至关重要。GPU 使用率、内存利用率和功耗等指标可以洞悉资源利用率及其改进潜力。提高 GPU 使用率的策略包括混合精度训练、优化数据传输和处理以及在 CPU 和 GPU 之间适当划分工作负载。可以使用 Neptune 等 ML 实验跟踪器监控 GPU 和 CPU 指标,使团队能够识别瓶颈并系统地提高训练性能。

作为数据科学家或机器学习工程师,我们日常工作的一项任务是快速实验并在不同设置下训练多个模型,以找出最有效的模型。这个迭代过程通常是最昂贵且最耗时的阶段之一,因此任何可能的优化都值得探索。

利用图形处理单元 (GPU) 进行深度学习 (DL) 可以显著加快训练速度,这得益于 GPU 的并行处理能力和高内存带宽。GPU 的内核专门用于执行 DL 算法核心的矩阵乘法。

GPU 通常是训练流程中最昂贵的资源。因此,我们必须充分利用它们。这需要仔细关注 GPU 设置,例如利用率和内存分配。优化 GPU 实例可确保您的组织只支付其所需的费用,尤其是在使用云端服务时,因为账单上分秒必争。

在本文中,我们将首先探讨一些关键的 GPU 指标,然后介绍优化 GPU 性能的技术。我们将探讨批次大小、框架选择以及数据流水线设计等因素如何深刻影响 GPU 的高效利用。在本文的后半部分,我们将了解如何监控 GPU、CPU 和内存等资源的利用率,从而确定 GPU 未能充分发挥其潜力的原因。

评估 GPU 性能的指标

为了了解 GPU 是否以最大潜能运行,我们依赖一些能够提供宝贵见解的特定指标,包括利用率、使用量和温度。对于我们大多数人可能使用的 NVIDIA GPU,当然也可以使用“nvidia-smi”命令行工具来检查这些指标。

利用率

GPU利用率指标量化了 GPU 在深度学习模型训练过程中的参与程度。该指标以百分比表示,表示在过去的采样周期内执行了一条或多条指令( CUDA 内核 )的时间比例。

记忆

GPU 内存在模型训练过程中发挥着重要作用。它负责保存从模型参数到正在处理的数据的所有内容。

GPU 内存使用率指标反映了分配给 GPU 的内存量相对于其总内存容量的比例。通过观察此指标,我们可以找到尽可能大的批处理大小,从而最大限度地利用 GPU 的并行处理能力。跟踪此指标对于避免内存不足错误也至关重要。

GPU 内存利用率指标表示 GPU 内存控制器在过去一秒内用于读取或写入内存的时间百分比。较低的 GPU 内存利用率通常表示 GPU 的计算时间多于从内存中获取数据的时间。降低此百分比的一种方法是增加批处理大小,以减少 GPU 获取数据的时间。

我们还可以让 GPU 同时执行计算和访问内存。NVIDIA 的博客上有一篇关于如何在 CUDA 中重叠数据传输的精彩文章。

功率和温度

跟踪 GPU 的温度和功耗可确保最佳性能,并防止过热等问题。GPU 是功耗密集型硬件,运行时会产生热量。因此,它们需要冷却解决方案来将其温度保持在可接受的水平。

GPU 温度以摄氏度为单位,监控温度对于确保 GPU 在可接受的温度范围内运行至关重要。高温会导致过热问题,触发 GPU 自动降低时钟速度以防止进一步过热,从而影响性能。

GPU 功耗指标反映了总用电量(以瓦特为单位)。该指标对于验证 GPU 是否获得最佳运行所需的功率至关重要,同时也是检测潜在硬件问题(包括电源问题)的有效指标。

GPU性能优化技术

人们沉迷于使用强大的 GPU,却很容易忘记高效管理这些资源的重要性。尽管 GPU 擅长并行计算,但如果分配和管理不当,其全部潜力可能会被浪费。 

在上一节中,我们介绍了一些可能表明未充分利用 GPU 资源的标准指标。让我们来探索解决此问题并最大限度地利用 GPU 的有效策略。

增加批次大小以提高 GPU 利用率

如果在训练时遇到 GPU 使用率低的问题,那么首先应该尝试增加批次大小。可用的 GPU 内存限制了最大批次大小,超过该大小会触发内存不足错误。

增加批次大小时需要考虑的另一个问题是,它可能会导致测试数据的准确率降低。最近,一项关于批次大小在训练深度学习模型过程中影响的研究发现,设置较大的批次大小通常会导致训练收敛到尖锐的最小值,从而导致泛化能力下降。

有效的解决方法,例如提高学习率或采用逐层自适应速率缩放(LARS)等技术,可以在不影响模型准确性的情况下允许更大的批量大小。

由于这些权衡,找到最佳批量大小通常需要采用反复试验的方法来平衡正面和负面影响。

使用混合精度训练来最大化 GPU 性能

神经网络通过操作数值来运行,这些数值通常以 32 位或 64 位格式的浮点数表示。存储数字的位数直接影响模型的计算效率和准确性。需要操作的位数越少,计算速度越快,但精度也越低。

混合精度训练是模型训练中采用的一种技术,它利用不同的浮点类型(例如 32 位和 16 位)来提高计算速度并减少内存占用,同时保持准确性。它通过以 16 位格式执行操作来实现计算加速,同时将模型的某些部分保留为 32 位格式以确保数值稳定性。

混合精度训练通过降低所需内存、允许训练更大的模型或设置更大的批次大小来提高 GPU 的使用率。它可将批次大小最多增加一倍,从而显著提高 GPU 的利用率。

另一个显著的优势是减少了计算时间,因为 16 位运算将访问的字节数减少了一半,从而减少了在内存受限的层(例如批量归一化、激活和池化)上花费的时间。NVIDIA 声称,其 GPU 的 16 位运算吞吐量是 32 位的八倍。值得注意的是,计算能力达到7.0 或更高的 NVIDIA GPU 能够从混合精度中获得最显著的性能提升。它们拥有专门用于 16 位矩阵运算的硬件单元,称为Tensor Core。

我推荐这个混合精度训练教程,以获得更全面的介绍。

深度学习中的优化

请查看我们博客上探讨深度学习优化方面的其他文章:

  • 深度学习模型优化方法:深度学习模型表现出色,但需要大量计算资源。剪枝、量化和知识提炼等技术对于提高计算效率至关重要。
  • 模型调整和超参数优化的最佳工具:系统地调整机器学习模型的超参数以提高其性能是任何机器学习工作流程中的关键步骤。
  • 深度学习优化算法:训练深度学习模型意味着解决优化问题:逐步调整模型以最小化目标函数。深度学习中使用了一系列优化器,每种优化器都针对基本梯度下降方法的一个特定缺陷。

优化数据管道以提高 GPU 利用率

为了最大限度地提高 GPU 利用率,我们必须确保 GPU 始终保持繁忙状态,避免其处于空闲状态并等待数据。为了实现这一目标,我们需要一个经过优化的数据流水线。

该流水线包含多个步骤。首先,数据样本从存储器加载到主内存,这需要输入和输出操作 (I/O)。随后,数据进行预处理,主要在 CPU 上进行;最后,预处理后的数据被传输到 GPU 的内存中。

确保所有这些步骤高效执行至关重要。因此,让我们深入研究 I/O 的具体细节,重点关注从存储到主存以及从主存到 GPU 的数据传输。

优化数据加载

数据加载成本主要由 I/O 操作决定。由于 I/O 请求通常频率较高,因此有效管理 I/O 操作对于机器学习工作负载至关重要。例如,在大型数据集上进行训练时,数据可能分散在多个较小的文件中。在其他情况下,数据是增量收集的,例如从硬件传感器收集。使用 GPU 时,I/O 可能成为瓶颈,因为向 GPU 提供数据的速度可能是一个限制因素,从而影响整个流水线的整体速度。

对于处理较小数据集的团队来说,本地 SSD 驱动器可提供卓越的性能。然而,对于更大规模的深度学习任务,连接到 GPU 集群的远程存储解决方案必不可少。GPU 的快速处理能力与云存储服务较慢的数据检索速度之间的不匹配可能会造成性能瓶颈。解决此 I/O 瓶颈的一种方法是缓存频繁访问的数据,使其更靠近计算资源。这可以显著提高处理大型数据集时的性能。

优化 CPU 和 GPU 之间的数据传输

关于数据的另一个重要考虑因素是 CPU 和 GPU 之间的传输速度。优化此速度的一个简单方法是利用所谓的CPU 固定内存 (CPU-pinned memory),通过让 CPU 写入 GPU 可以直接访问的内存部分,可以加快从 CPU 内存到 GPU 内存的数据传输速度。(此功能在PyTorch 的 DataLoader中可用,只需将 pin_memory 设置为 True 即可。)通过利用固定内存,还可以将数据传输与 GPU 上的计算重叠。

优化数据预处理

除了 I/O 和向 GPU 的数据传输之外,数据预处理也可能成为 GPU 利用率的瓶颈。在训练阶段,CPU 负责数据预处理,当一个或多个 CPU 达到其最大利用率时,就会出现瓶颈,导致 GPU 在等待 CPU 提供下一批训练数据时处于部分空闲状态。

我们可以通过多种方式来解决这个问题。一种方法是将预处理流程构建成可以离线完成的任务,例如在训练开始之前的数据创建阶段完成。将操作转移到数据创建阶段可以在训练期间释放一些 CPU 周期。

为了优化运行时间,将数据预处理流水线中的所有任务都迁移到离线似乎合乎逻辑。然而,这种方法对于训练来说可能并不理想,因为在训练过程中引入一定程度的随机性对输入样本有益。例如,引入随机旋转和翻转可以改善某些任务(例如对抗训练)的结果。

解决数据预处理瓶颈的另一种方法是将数据操作转移到 GPU 上。NVIDIA 提供了数据加载库 (DALI),用于构建高度优化的数据预处理流水线,将特定任务(例如解码、裁剪和调整图像大小)卸载到 GPU 上。虽然这种方法提高了数据加载流水线的效率,但它也存在一个缺点,即会给 GPU 带来额外的工作负载。

深度学习框架的选择

在深度学习中,我们可以从多个框架中进行选择,例如TensorFlow、PyTorch和JAX(所有这些框架也可在多后端框架Keras中使用)。

每个框架都有不同的性能特性,并采用各种技术来优化算法的实现。因此,同一算法在不同框架之间的性能可能会存在相当大的差异。

现在,在选择框架时,可能会考虑各种各样的标准,例如编码的简易性、灵活性、社区支持或学习曲线。但今天,我们将重点关注这些框架如何利用资源,尤其是 GPU。

值得注意的是,这些框架中没有绝对的赢家,因为它们的 GPU 利用率会根据各种因素而波动,例如具体任务、数据集特征和神经网络的架构。

2021 年发表的一篇研究论文比较了当时流行的不同深度学习框架。研究人员实现了不同的模型架构,例如 CNN 和 LSTM,并在 CIFAR-100 和 IMDB Reviews 等不同数据集上训练模型,并观察了不同的 CPU 和 GPU 指标。之后,他们还比较了模型的性能。研究人员发现,不同框架在 GPU 使用率、训练时间和任务性能方面存在显著差异。

两张条形图展示了不同框架间 GPU 使用情况的比较分析

不同框架的 GPU 使用情况比较分析。(a)此条形图比较了不同框架在训练期间的平均 GPU 利用率,突出显示了使用不同数据集训练 CNN 时效率的差异。(b)同样,此条形图还比较了不同框架在训练 LSTM 期间的平均 GPU 利用率,显示了使用不同数据集时效率的差异。|来源

优化 GPU 使用率的策略

了解 GPU、CPU 和内存等资源在训练阶段的利用情况,有助于优化训练并最大限度地发挥 GPU 的性能。以下指南或许能帮助你们根据这些资源的使用情况识别潜在的瓶颈: 

  • 如果GPU 利用率低CPU 利用率高,则表明数据加载或预处理中存在潜在瓶颈。
  • 如果注意到CPU 内存利用率较低,那么提高性能的快速方法是增加数据加载器使用的工作器数量。
  • 如果GPU 利用率较低,并且尽管数据集足够大,但 CPU 利用率仍然持续较低,则可能表明代码中的资源利用率不够理想。在这种情况下,需要探索并行化和代码优化技术,并确保模型架构能够高效地利用 GPU。
  • 如果GPU 内存利用率较低,增加批量大小是提高资源利用率的潜在策略。

案例研究:使用neptune.ai监控和优化 GPU 使用情况

密切监控资源利用率(包括 CPU、GPU 和内存)会给我们的工作流程带来额外的复杂性。Neptune等实验跟踪工具可以简化这一流程,使我们的工作更轻松,并确保监控井然有序。

Neptune 会自动记录系统指标,包括 CPU、GPU(仅限 NVIDIA)和内存使用情况等硬件消耗指标。此外,还可以将任何硬件指标记录到 Neptune 中,并通过训练脚本访问这些指标。

Neptune 应用程序中的实时训练监控

Brainly 如何使用 Neptune 优化其 GPU 使用情况

Brainly 是一个学习平台,提供涵盖所有学校科目的广泛知识库。Brainly 的视觉搜索团队使用 Neptune 来跟踪视觉内容提取 (VICE) 系统的训练,以实现其“Snap to Solve”功能。这项核心功能允许用户拍摄并上传带有疑问或问题的照片,并提供相关的解决方案。

在监控他们的训练时,训练过程中生成的图表显示,GPU 并未得到充分利用。事实上,它经常处于完全闲置状态。

使用 Neptune 生成的 GPU 利用率图。折线图展示了 Brainly 视觉搜索团队使用的各个 GPU 随时间的变化情况。GPU 利用率经常会降至 25% 以下,有时甚至接近于零。这表明,通过提高 GPU 利用率,可以加快训练速度,并更高效地利用 GPU 资源。

因此,Brainly 团队彻底调查了这个问题,跟踪了包括 CPU 在内的各种资源的使用情况。他们发现数据预处理流水线中的瓶颈是问题的根源。具体来说,他们注意到将图像从 CPU 内存复制到 GPU 内存以及数据增强过程中的效率低下。为了解决这个问题,他们通过解压缩 JPEG 图像并将数据预处理从普通的 TensorFlow 和 Keras 转换为NVIDIA DALI来优化数据增强任务。他们进一步选择使用多处理而非多线程来处理作业,以创建更高效​​的数据流水线。

团队使用 Neptune 分析了每个优化步骤带来的性能提升。

GPU 优化清单 

在本文中,我们研究了各种评估 GPU 使用率的方法,并探索了改进策略。用于训练深度学习模型的最佳 GPU 设置和配置因具体任务而异,彻底的分析和系统的实验是不可或缺的。

然而,在我参与的众多项目中,以下优化 GPU 使用率的指南通常是有效的:

  • 训练期间务必监控 GPU 内存使用情况。如果仍有大量可用内存,请尝试将批量大小设置得较大,同时使用不会因使用较大批量大小而影响模型性能的技术。
  • 检查GPU 是否支持混合精度并在训练时实现它以获得最佳性能。
  • 跟踪 CPU 和 GPU 的利用率,以识别数据管道中可能存在的瓶颈。仔细评估每项改进对整体性能的影响。
  • 探索深度学习框架的功能并了解其实现细节。每个框架在 GPU 利用方面都展现出独特的能力,受模型架构和任务类型等因素的影响。

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

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

相关文章

腾讯混元3D制作简单模型教程-1

腾讯混元3D制作简单模型的零门槛教程,涵盖新手快速入门与进阶操作,结合官方工具特性及行业实践,分为两个核心板块: 🎯 一、新手零门槛:5分钟生成可打印模型(适合完全小白) 通过腾讯元宝APP的“3D角色梦工厂”功能,无需任何建模基础: 上传照片 打开腾讯元宝APP → …

一个库,比如kott_tinymce ,想把的依赖库从kotti升级到kotti2 ,请问我是不是查找替换,把所有的kotti字符替换成kotti2就行了?

一个库,比如kott_tinymce ,想把的依赖库从kotti升级到kotti2 ,请问我是不是查找替换,把所有的kotti字符替换成kotti2就行了? kotti和kotti2的包结构、模块路径、接口完全一样,除了import kotti 变成kotti2 如果 kotti…

企业实践 | 银河麒麟KylinOS-V10(SP3)高级服务器操作系统基础安装指南

前言:国产操作系统的崛起与实践背景 在国产化浪潮与信息技术自主可控的大背景下,银河麒麟操作系统作为国产操作系统的代表之一,正逐步成为企业级应用的重要选择。本文将详细介绍银河麒麟高级服务器操作系统V10 SP3版本的基础知识与安装实践&…

Ubuntu 一键安装 ROS

Ubuntu 一键安装 ROS 安装命令如下: wget http://fishros.com/install -O fishros && . fishros 指令执行后,显示log如下图: 之后根据不同的系统安装对应的ros版本即可。

深度学习——基于卷积神经网络实现食物图像分类【4】(使用最优模型)

文件目录 引言一、环境准备二、数据预处理训练集预处理说明:验证集预处理说明: 三、自定义数据集类四、设备选择五、CNN模型构建六、模型加载与评估1. 加载预训练模型2. 准备测试数据3. 测试函数4. 计算准确率 七、完整代码八、总结 引言 本文将详细介绍…

C++基础算法————并查集

C++并查集详解与实战指南 一、引言 并查集(Union-Find)是一种高效的数据结构,用于处理一些不相交集合的合并与查询问题。它在图论、社交网络、网络连通性等领域有广泛的应用。并查集的核心思想是通过一个数组来记录每个元素的父节点,从而将元素组织成若干棵树,每棵树代表…

系统性能优化的关键手段

系统性能的提升方向 服务器并发处理能力:通过优化内存管理策略、选择合适的连接模式(长连接或短连接)、改进 I/O 模型(如 epoll、IOCP)、以及采用高效的服务器并发策略(如多线程、事件驱动等)&a…

httpclient实现http连接池

HTTP连接池是一种优化网络通信性能的技术,通过复用已建立的TCP连接减少重复握手开销,提升资源利用率。以下是关键要点: 核心原理与优势 ‌连接复用机制‌ 维护活跃连接队列,避免每次请求重复TCP三次握手/SSL协商,降低…

广义焦点丢失:学习用于密集目标检测的合格和分布式边界盒之GFL论文阅读

摘要 一阶段检测器通常将目标检测形式化为密集的分类与定位(即边界框回归)问题。分类部分通常使用 Focal Loss 进行优化,而边界框位置则在狄拉克δ分布下进行学习。最近,一阶段检测器的发展趋势是引入独立的预测分支来估计定位质量,所预测的质量可以辅助分类,从而提升检…

Real-World Deep Local Motion Deblurring论文阅读

Real-World Deep Local Motion Deblurring 1. 研究目标与实际问题意义1.1 研究目标1.2 实际问题1.3 产业意义2. 创新方法:LBAG模型与关键技术2.1 整体架构设计2.2 关键技术细节2.2.1 真实模糊掩码生成(LBFMG)2.2.2 门控块(Gate Block)2.2.3 模糊感知补丁裁剪(BAPC)2.3 损…

【Docker基础】Docker镜像管理:docker commit详解

目录 引言 1 docker commit命令概述 1.1 什么是docker commit 1.2 使用场景 1.3 优缺点分析 2 docker commit命令详解 2.1 基本语法 2.2 常用参数选项 2.3 实际命令示例 2.4 提交流程 2.5 步骤描述 3 docker commit与Dockerfile构建对比 3.1 构建流程对比 3.2 对…

可调式稳压二极管

1.与普通稳压二极管的比较: 项目普通稳压二极管可调式稳压二极管(如 TL431)输出电压固定(如5.1V、3.3V)可调(2.5V ~ 36V,取决于外部分压)精度低(5%~10%)高&a…

Kafka使用Elasticsearch Service Sink Connector直接传输topic数据到Elasticsearch

链接:Elasticsearch Service Sink Connector for Confluent Platform | Confluent Documentation 链接:Apache Kafka 一、搭建测试环境 下载Elasticsearch Service Sink Connector https://file.zjwlyy.cn/confluentinc-kafka-connect-elasticsearch…

讯方“教学有方”平台获华为昇腾应用开发技术认证!

教学有方 华为昇腾应用开发技术认证 权威认证 彰显实力 近日,讯方技术自研的教育行业大模型平台——“教学有方”,成功获得华为昇腾应用开发技术认证。这一认证不仅是对 “教学有方” 平台技术实力的高度认可,更标志着讯方在智慧教育领域的…

保护你的Electron应用:深度解析asar文件与Virbox Protector的安全策略

在现代软件开发中,Electron框架因其跨平台特性而备受开发者青睐。然而,随着Electron应用的普及,如何保护应用中的核心资源文件——asar文件,成为了开发者必须面对的问题。今天,我们将深入探讨asar文件的特性&#xff0…

端口安全配置示例

组网需求 如图所示,用户PC1、PC2、PC3通过接入设备连接公司网络。为了提高用户接入的安全性,将接入设备Router的接口使能端口安全功能,并且设置接口学习MAC地址数的上限为接入用户数,这样其他外来人员使用自己带来的PC无法访问公…

零基础RT-thread第四节:电容按键

电容按键 其实只需要理解,手指按上去后充电时间变长,我们可以利用定时器输入捕获功能计算充电时间,超过无触摸时的充电时间一定的阈值就认为是有手指触摸。 基本原理就是这样,我们开始写代码: 其实,看过了…

SQL基础操作:从增删改查开始

好的!SQL(Structured Query Language)是用于管理关系型数据库的标准语言。让我们从最基础的增删改查(CRUD)​​ 操作开始学习,我会用简单易懂的方式讲解每个操作。 🛠 准备工作(建表…

vim 编辑模式/命令模式/视图模式常用命令

以下是一份 Vim 命令大全,涵盖 编辑模式(Insert Mode)、命令模式(Normal Mode) 和 视图模式(Visual Mode) 的常用操作,适合初学者和进阶用户使用。 🧾 Vim 模式简介 Vim…

每天看一个Fortran文件(10)

今天来看下MCV模式调用物理过程的相关代码。我想改进有关于海气边界层方面的内容,因此我寻找相关的代码,发现在physics目录下有一个sfc_ocean.f的文件。 可以看见这个文件是在好多好多年前更新的了,里面内容不多,总共146行。是计算…