NVIDIA DALI(Data Loading Library)是一个高效的数据加载和预处理库,专为深度学习任务设计。它可以减轻数据加载和预处理对 CPU 的压力,从而提高 GPU 的利用率。
可以通过 pip 安装 NVIDIA DALI:
pip install nvidia-dali
下面是一个使用 DALI 加速数据加载的示例:
-
定义 DALI 数据管道:
from nvidia.dali.pipeline import Pipeline import nvidia.dali.ops as ops import nvidia.dali.types as types class MelGANDatasetPipeline(Pipeline): def __init__(self, batch_size, num_threads, device_id, data_dir): super(MelGANDatasetPipeline, self).__init__(batch_size, num_threads, device_id) self.input = ops.FileReader(file_root=data_dir, random_shuffle=True) self.decode = ops.ImageDecoder(device="mixed", output_type=types.RGB) self.res = ops.Resize(device="gpu", resize_x=224, resize_y=224) self.cmnp = ops.CropMirrorNormalize(device="gpu", output_dtype=types.FLOAT, output_layout=types.NCHW, image_type=types.RGB, mean=[0.485 * 255, 0.456 * 255, 0.406 * 255], std=[0.229 * 255, 0.224 * 255, 0.225 * 255]) def define_graph(self): self.jpegs, self.labels = self.input(name="Reader") images = self.decode(self.jpegs) images = self.res(images) output = self.cmnp(images) return output, self.labels
-
创建 DataLoader:
from nvidia.dali.plugin.pytorch import DALIGenericIterator batch_size = 32 pipeline = MelGANDatasetPipeline(batch_size=batch_size, num_threads=4, device_id=0, data_dir="/path/to/your/data") pipeline.build() dali_dataloader = DALIGenericIterator(pipeline, ["data", "label"], size=pipeline.epoch_size("Reader"))
-
在训练和推理过程中使用 DALI DataLoader:
for data in dali_dataloader: inputs = data[0]["data"].cuda(non_blocking=True) labels = data[0]["label"].cuda(non_blocking=True) # 训练或推理步骤 outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step()