温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何提升PyTorch的性能

发布时间:2021-06-15 11:00:00 来源:亿速云 阅读:279 作者:Leah 栏目:编程语言

如何提升PyTorch的性能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

Pin memory

如何提升PyTorch的性能

你知道有时候你的GPU内存显示它是满的但你很确定你的模型没有使用那么多?这种开销称为pinned memory。这个内存被保留为一种“working allocation”类型。

当你在一个DataLoader中启用pinned_memory时,它“自动将获取的数据张量放在pinned memory中,并使数据更快地传输到CUDA-enabled的gpu”

如何提升PyTorch的性能

这意味着你不应该不必要的去调用:

torch.cuda.empty_cache()

避免CPU到GPU的传输,反之亦然

# bad.cpu()  .item()  .numpy()

我看到大量使用.item()或.cpu()或.numpy()调用。这对于性能来说是非常糟糕的,因为每个调用都将数据从GPU传输到CPU,从而极大地降低了性能。

如果你试图清除附加的计算图,请使用.detach()。

# good.detach()

这不会将内存转移到GPU,它会删除任何附加到该变量的计算图。

直接在GPUs上构建张量

大多数人都是这样在GPUs上创建张量的

t = tensor.rand(2,2).cuda()

然而,这首先创建CPU张量,然后将其转移到GPU……这真的很慢。相反,直接在想要的设备上创建张量。

t = tensor.rand(2,2, device=torch.device('cuda:0'))

如果你正在使用Lightning,我们会自动把你的模型和批处理放到正确的GPU上。但是,如果你在代码的某个地方创建了一个新的张量(例如:为一个VAE采样随机噪声,或类似的东西),那么你必须自己放置张量。

t = tensor.rand(2,2, device=self.device)

每个LightningModule都有一个方便的self.device调用,无论你是在CPU上,多 GPUs上,还是在TPUs上,lightning会为那个张量选择正确的设备。

使用DistributedDataParallel不要使用DataParallel

PyTorch有两个主要的模式用于在多 GPUs训练。第一种是DataParallel,它将一批数据分割到多个GPUs上。但这也意味着模型必须复制到每个GPU上,一旦在GPU 0上计算出梯度,它们必须同步到其他GPU。

这需要大量昂贵的GPU传输!相反,DistributedDataParallel在每个GPU(在它自己的进程中)上创建模型副本,并且只让数据的一部分对该GPU可用。这就像是让N个独立的模型进行训练,除了一旦每个模型都计算出梯度,它们就会在模型之间同步梯度……这意味着我们在每批处理中只在GPUs之间传输一次数据。

在Lightning中,你可以在两者之间轻松切换

Trainer(distributed_backend='ddp', gpus=8)  Trainer(distributed_backend='dp', gpus=8)

请注意,PyTorch和Lightning都不鼓励使用DP。

使用16-bit精度

这是另一种加快训练速度的方法,我们没有看到很多人使用这种方法。在你的模型进行16bit训练的部分,数据从32位变到到16位。这有几个优点:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2.  你使用了一半的内存(这意味着你可以将batch大小翻倍,并将训练时间减半)。

  3.  某些GPU(V100, 2080Ti)可以自动加速(3 -8倍),因为它们针对16位计算进行了优化。

在Lightning中,这很简单:

Trainer(precision=16)

注意:在PyTorch 1.6之前,你还必须安装Nvidia Apex,现在16位是PyTorch的原生版本。但如果你使用的是Lightning,它同时支持这两种功能,并根据检测到的PyTorch版本自动切换。

对你的代码进行Profile

如果没有Lightning,最后一条建议可能很难实现,但你可以使用cprofiler这样的工具来实现。然而,在Lightning中,你可以通过两种方式获得所有在训练期间所做的调用的总结:

首先,内置的basic profiler

Trainer(profile=True)

可以给出这样的输出:

如何提升PyTorch的性能

或者是高级的profiler:

profiler = AdvancedProfiler()  trainer = Trainer(profilerprofiler=profiler)

得到更小粒度的结果:

如何提升PyTorch的性能

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI