apex正在加载并编译,apex正在加载进不去

  

  选自《朝向数据科学》   

  

  作者:Pieterluitjens   

  

  机器之心编译   

  

  参与:一鸣、嘉明、思   

  

  你的数据处理影响整个训练速度。如果加上NVIDIA DALI库,处理速度可以比原生PyTorch快4倍。   

  

     

  

  关于深度学习的加速,除了训练和推理过程的加速,还有数据加载和预处理阶段的加速。这一阶段尤为关键,因为数据处理流水线的处理速度也影响着整体的处理效率。   

  

  最近有开发者介绍了如何使用NVIDIA数据加载库(DALI)以及如何使用这个库加速数据预处理。DALI和TensorFlow自己的DataLoader一样,是一个致力于加速数据预处理过程的库。   

  

  在一篇博客中,开发者表示,该库不仅可以加速GPU,还可以在CPU上构建完整的数据预处理过程。如果在特斯拉V100上测试,PyTorch DALI的处理速度可以达到4000张图像/秒,比原来的PyTorch快了近4倍。   

  

  支持多个框架,针对预处理   

  

  Nvidia数据加载库DALI是一个方便的开源库,用于解码和增强图像或视频,从而加速深度学习应用。通过并行训练和预处理,降低了延迟和训练时间,为流行的深度学习框架中内置的数据加载器和数据迭代器提供了嵌入式替代,易于集成或重定向到不同的框架。   

  

  开发人员可以在GPU上运行他们的数据处理通道,从而减少训练神经网络所花费的时间。DALI实现了数据处理管道的可移植性,因为可以方便地重定向到TensorFlow、PyTorch和MXNet。   

  

     

  

  DALI设计之初就是为了帮助用户突破数据预处理的瓶颈,让模型的训练和推理达到最高的效率。它的主要设计是为了在GPU上进行预处理,但大部分操作也可以在CPU上实现。   

  

  主要特征   

  

  易于使用的Python API在多个GPU之间显式扩展,以加快图像分类(ResNet-50)和对象检测分类(SSD)的工作流。灵活的计算图使开发人员能够创建自定义的数据处理管道,支持多种格式-LMDB,RecordIO,TFRecord,COCO,JPEG,H.264和HEVC开发人员可以添加自定义的图像或视频处理运算符。   

  

  达利在MXNet上训练ResNet50的性能。   

  

  使用 DALI 重构数据预处理 pipeline   

  

  内存占用大是DALI加速数据预处理面临的重要问题。随着批处理大小的增加,DALI的内存占用将变得更大。这个问题还没有解决。   

  

     

  

  达利的记忆占用问题。   

  

  与其他数据预处理工具相比,DALI可以处理的最大批量是TorchVision的一半。   

  

     

  

  因此,使用DALI来加速数据预处理需要重建整个管道。在教程中,作者分别介绍了构建CPU流水线和GPU流水线的方法。   

  

  构建 CPU pipepline   

  

  在使用CPU进行数据预处理时,通常的做法是让CPU处理解码和调整大小的工作,而CropMirrorNormalize等工作则放在GPU上。由于使用DALI将输出传输到GPU会占用大量内存,因此作者构建了一个基于CPU的流水线。   

  

  首先重装导入DALI。   

  

     

  

  然后构建一个基于CPU的管道。   

src="https://tupian.lamuhao.com/pic/img.php?k=apex正在加载并编译,apex正在加载进不去7.jpg">

  

在这里设置一下哪些操作应当由 CPU 运行。

  

  

然后开始相应的操作。如解码:

  

  

以及 resize:

  

  

CropMirrorNormalize 的操作由 GPU 进行。

  

  

当然,还需要从 CPU 到 GPU 的转移过程,这一过程使用 PyTorch 进行,作者在教程中也给出了相应的代码。

  

构建基于 GPU 的 pipeline

  

当模型较大(如使用 ResNet50)的时候,基于 CPU 的 pipepline 效果较好,而在类似于 AlexNet 或 ResNet18 这样的小模型上,CPU 的处理还是跟不上 GPU 的数据处理速度。其主要原因在于,GPU pipeline 会降低近一半的批大小。

  

为了解决这个问题,作者建议将验证 pipepline 从 GPU 中关掉,直到每个 epoch 的最后需要的时候再开启。

  

效果评价

  

以下是作者在 ResNet18 中使用的最大批量大小:

  

  

因此通过合理应用这一系列修改,DALI 可以使得最大批量大小在 CPU 或 GPU 模式下提升 50%

  

而在 Shufflenet V2 0.5 上,如果批大小为 512,则 DALI GPU 和 CPU 能够处理的批大小如下:

  

  

可以看到,即使是 CPU,其处理速度也达到了每秒 1800 张图像,速度超过了 TorchVision。

  

所有的测试都在 Google Cloud V100 实例下运行:包含 12 个 vCPU(6 个物理内核),78GB 内存,以及使用 ApexFP16 进行训练。

  

因此,通过 DALI,一个 Tesla V100 GPU 就可以达到将近每秒 4000 张图像。接近英伟达有 8 个 V100 GPU 的 DGX-1 的性能,尽管使用的是小模型。

  

参考链接:

  

https://towardsdatascience.com/nvidia-dali-speeding-up-pytorch-876c80182440

相关文章