DALI加速图像数据预处理
DALI预处理加速
NVIDIA DALI 文档:https://docs.nvidia.com/deeplearning/dali/user-guide/docs/examples/general/data_loading/external_input.html
安装:https://docs.nvidia.com/deeplearning/dali/user-guide/docs/installation.html#pip-official-releases
1、DALI pipeline
DALI可以选择纯CPU加载和预处理或者CPU&GPU混合加载,GPU加载。
在DALI中,任何数据处理任务都有一个称为 Pipeline 的对象, Pipeline 对象是类的实例nvidia.dali.Pipeline
或派生类。
可以通过以下方式定义DALI Pipeline
- 通过实现内部使用 DALI 运算符的函数并使用
pipeline_def()
装饰器对其进行装饰。 - 通过
Pipeline
直接实例化对象、构建图形并使用Pipeline.set_outputs()
. - 通过从
Pipeline
类继承并覆盖Pipeline.define_graph()
(这是定义 DALI Pipelines 的传统方式)
2、图像分类的pipeline示例
所有操作均在GPU上,note:使用gpu进行预处理,会占用显存,模型越大占用越多,但是GPU利用率会一直保持在100%。模型较大不推荐使用GPU加载。
使用纯CPU操作,数据处理的速度也比 torchvision快
1 | class TrainPipeline(Pipeline): |
如果需要自定义数据处理的函数,可参考一下方式。以cutout为例:cutout使用的是cpu处理了,如果是gpu处理的话,需要将numpy改成cupy,DALI原生支持的操作和数据增强挺丰富的。
1 | class CUTOUT(object): |
图像分类数据加载的时候的调用方式:其他的Iterator可以参考 https://docs.nvidia.com/deeplearning/dali/user-guide/docs/plugins/pytorch_tutorials.html
1 | from nvidia.dali.plugin.pytorch import DALIClassificationIterator |