如何优化PyTorch以放慢模型训练速度
如何优化PyTorch以放慢模型训练速度?
译文 作者: 布加迪 本文将分享几个最新的性能调优技巧,以减速跨畛域的机器学习模型的训练。这些技巧对任何想要经常使用PyTorch成功初级性能调优的人都大有协助。PyTorch是当今消费环境中最盛行的深度学习框架之一。随着模型变得日益复杂、数据集日益庞大,优化模型训练性能关于缩短训练期间和提高消费劲变得至关关键。
本文将分享几个最新的性能调优技巧,以减速跨畛域的机器学习模型的训练。这些技巧对任何想要经常使用PyTorch成功初级性能调优的人都大有协助。
技巧1:经过剖析识别性能瓶颈
在开局调优之前,你应该了解模型训练管道中的瓶颈。剖析(Profiling)是优化环节中的关键步骤,由于它有助于识别须要留意的内容。你可以从PyTorch的内置智能求梯度剖析器、TensorBoard和英伟达的Nsight系统中启动选用。上方无妨看一下三个示例。
import torch.autograd.profiler as profilerwith profiler.profile(use_cuda=True) as prof:# Run your model training code hereprint(prof.key_averages().table(sort_by="cuda_time_total", row_limit=10))
在这个示例中,PyTorch的内置智能求梯度剖析器识别梯度计算开支。use_cuda=True参数指定你想要剖析CUDA内核口头期间。prof.key_average()函数前往一个汇总剖析结果的表,按总的CUDA期间排序。
import torch.utils.tensorboard as tensorboardwriter = tensorboard.SummaryWriter()# Run your model training code herewriter.add_scalar('loss', loss.item(), global_step)writer.close()
你还可以经常使用TensorBoard集成来显示和剖析模型训练。SummaryWriter类将汇总数据写入到一个文件,该文件可以经常使用TensorBoard GUI加以显示。
nsys profile -t cpu,gpu,memory python your_script.py
关于系统级剖析,可以思索英伟达的Nsight Systems性能剖析工具。上方的命令剖析了Python脚本的CPU、GPU和内存经常使用状况。
技巧2:减速数据加载以优化速度和GPU应用率
数据加载是模型训练管道的关键组成局部。在典型的机器学习训练管道中,PyTorch的数据加载器在每个训练轮次开局时从存储中加载数据集。而后,数据集被传输到GPU实例的本地存储,并在GPU内存中启动处置。假设数据传输到GPU的速度跟不上GPU的计算速度,就会造成GPU周期糜费。因此,优化数据加载关于放慢训练速度、尽量优化GPU应用率至关关键。
为了尽量缩小数据加载瓶颈,你可以思索以下优化:
上方这个示例是经常使用PyTorch的数据加载器和多个worker并行化加载数据:
import torchfrom torch.utils.data import)data_loader =>
在这个示例中,定义了自定义数据集类MyDataset。它为每个索引加载和处置数据。而后创立一个有多个worker(本例中有四个)的数据加载器实例来并行化加载数据。
Alluxio是一个开源散布式缓存系统,提供极速访问数据的机制。Alluxio缓存可以识别从底部存储(比如Amazon S3)频繁访问的数据,并在Alluxio集群的NVMe存储上散布式存储热数据的多个正本。假设经常使用Alluxio作为缓存层,你可以清楚缩短将数据加载到训练节点所需的期间,这在处置大规模数据集或慢速存储系统时特意有用。
上方这个示例标明了你如何经常使用Alluxio与PyTorch和fsspec(文件系统规范)来减速数据加载:
首先,装置所需的依赖项:
pip install alluxiofspip install s3fs
接上去,创立一个Alluxio实例:
import fsspecfrom alluxiofs import AlluxioFileSystem# Register Alluxio to fsspecfsspec.register_implementation("alluxiofs", AlluxioFileSystem,clobber=True)# Create Alluxio instancealluxio_fs = fsspec.filesystem("alluxiofs", etcd_hosts="localhost",target_protocol="s3")
而后,经常使用Alluxio和PyArrow在PyTorch中加载Parquet文件这个数据集:
# Example: Read a Parquet file using Pyarrowimport pyarrow.dataset as dsdataset = ds.dataset("s3://example_bucket/datasets/example.parquet",filesystem=alluxio_fs)# Get a count of the number of records in the parquet filedataset.count_rows()# Display the schema derived from the parquet file header recorddataset.schema# Display the first recorddataset.take(0)
在这个示例中,创立了一个Alluxio实例并将其传递给PyArrow的dataset函数。这准许咱们经过Alluxio缓存层从底层存储系统(本例中为S3)读取数据。
技巧3:为资源应用率优化批义务大小
优化GPU应用率的另一项关键技术是调整批义务大小,它会清楚影响GPU和内存应用率。
import torchimport torchvisionimport torchvision.transforms as transforms# Define the model and optimizermodel = torchvision.models.resnet50(pretrained=True)optimizer = torch.optim.SGD(model.parameters(), lr=0.01)# Define the>
在本例中,批义务大小定义为32。batch_size参数指定了每个批中的样本数量。shuffle=True参数随机化批处置的顺序,num_workers=4参数指定用于加载数据的worker线程的数量。你可以尝试不同的批义务大小,以找到在可用内存范围内尽量提高GPU应用率的最佳值。
技巧4:可识别GPU的模型并行性
处置大型复杂模型时,单个GPU的限度或者会成为训练的瓶颈。模型并行化可以经过在多个GPU上独特散布模型以经常使用它们的减速才干来克制这一应战。
1.应用PyTorch的DistributedDataParallel(DDP)模块
PyTorch提供了DistributedDataParallel(DDP)模块,它可以经过支持多个后端来成功方便的模型并行化。为了尽量提高性能,经常使用NCCL后端,它针对英伟达GPU启动了优化。假设经常使用DDP来封装模型,你可以跨多个GPU无缝散布模型,将训练裁减到史无前例的层面。
import torchfrom torch.nn.parallel import DistributedDataParallel as DDP# Define your model and move it to the desired device(s)model = MyModel()device_ids = [0, 1, 2, 3] # Use 4 GPUs for trainingmodel.to(device_ids[0])model_ddp = DDP(model, device_ids=device_ids)# Train your model as usual
2.经常使用PyTorch的Pipe模块成功管道并行处置
关于须要顺序处置的模型,比如那些具备循环或自回归组件的模型,管道并行性可以扭转游戏规定。PyTorch的Pipe准许你将模型合成为更小的局部,在独自的GPU上处置每个局部。这使得复杂模型可以高效并行化,缩短了训练期间,提高了全体系统应用率。
3.缩小通讯开支
只管模型并行化提供了渺小的好处,但也带来了设施之间的通讯开支。以下是尽量减小影响的几个倡导:
a.最小化梯度聚合:经过经常使用更大的批大小或在同步之前本地累积梯度,缩小梯度聚合的频次。
b.经常使用异步降级:经常使用异步降级,暗藏提前和最大化GPU应用率。
c.启用NCCL的分层通讯:让NCCL库选择经常使用哪种分层算法:环还是树,这可以缩小特定场景下的通讯开支。
d.调整NCCL的缓冲区大小:调整NCCL_BUFF_SIZE环境变量,为你的特定用例优化缓冲区大小。
技巧5:混合精度训练
混合精度训练是一种弱小的技术,可以清楚减速模型训练。经过应用现代英伟达GPU的性能,你可以缩小训练所需的计算资源,从而放慢迭代期间并提高消费劲。
1.经常使用Tensor Cores减速训练
英伟达的Tensor Cores是专门用于减速矩阵乘法的配件块。这些外围可以比传统的CUDA外围更快地口头某些操作。
2.经常使用PyTorch的AMP简化混合精度训练
成功混合精度训练或者很复杂,而且容易出错。幸亏,PyTorch提供了一个amp模块来简化这个环节。经常使用智能混合精度(AMP),你可以针对模型的不同局部在不同精度格局(例如float32和float16)之间切换,从而优化性能和内存经常使用。
以下这个示例标明了如何经常使用PyTorch的amp模块来成功混合精度训练:
import torchfrom torch.amp import autocast# Define your model and optimizermodel = MyModel()optimizer = torch.optim.SGD(model.parameters(), lr=0.01)# Enable mixed precision training with AMPwith autocast(enabled=True, dtype=torch.float16):# Train your model as usualfor epoch in range(10):optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()
3.经常使用低精度格局优化内存经常使用
以较低精度格局(比如float16)存储模型权重可以清楚缩小内存经常使用。当处置大型模型或有限的GPU资源时,这点尤为关键。假设经常使用精度较低的格局,你可以将较大的模型放入到内存中,从而缩小对低廉内存访问的需求,并提高全体训练性能。
记住要尝试不同的精度格局并优化内存经常使用,以便为你的特定用例取得最佳结果。
技巧6:新的配件优化:GPU和网络
新的配件技术产生为减速模型训练提供了大好时机。记得尝试不同的配件性能,并优化你的上班流,以便为特定用例取得最佳结果。
1.应用英伟达A100和H100 GPU
最新的英伟达A100和H100 GPU有先进的性能和内存带宽。这些GPU为用户提供了更多的处置才干,经常使用户能够训练更大的模型、处置更大的批义务,并缩短迭代期间。
2.应用NVLink和InfiniBand减速GPU-GPU通讯
当跨多个GPU训练大型模型时,设施之间的通讯开支或者成为一大瓶颈。英伟达的NVLink互连技术在GPU之间提供了高带宽低提前的链路,从而成功更快的数据传输和同步。此外,InfiniBand互连技术为衔接多个GPU和节点提供了一种易于裁减的高性能处置打算。它有助于尽量减小通讯开支,缩短同步梯度和减速模型训练所破费的期间。
结语
上述这六个技巧将协助你清楚放慢模型训练速度。切记,取得最佳结果的关键是尝试这些技术的不同组合,为你的特定用例找到最佳性能。
原文题目:This Is How To Optimize PyTorch for Faster Model Training,作者:Hope Wang
链接:。
想了解更多AIGC的内容,请访问:
AI.x社区