'''
python test_dali.py -d data/ -b 64 -t 4-d 数据地址
-b batchsize
-t 读数据的线程数
'''
import argparse
import nvidia.dali.ops as ops
import nvidia.dali.types as types
from nvidia.dali.pipeline import Pipeline
from nvidia.dali.plugin.pytorch import DALIClassificationIterator, DALIGenericIteratorclass HybridTrainPipe(Pipeline):def __init__(self, batch_size, num_threads, device_id, data_dir, crop, dali_cpu=False, local_rank=0, world_size=1):super(HybridTrainPipe, self).__init__(batch_size, num_threads, device_id, seed=12 + device_id)dali_device = "gpu"self.input = ops.FileReader(file_root=data_dir, shard_id=local_rank, num_shards=world_size, random_shuffle=True)self.decode = ops.ImageDecoder(device="mixed", output_type=types.RGB)self.res = ops.RandomResizedCrop(device="gpu", size=crop, random_area=[0.08, 1.25])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])self.coin = ops.CoinFlip(probability=0.5)print('DALI "{0}" variant'.format(dali_device))def define_graph(self):rng = self.coin()self.jpegs, self.labels = self.input(name="Reader")images = self.decode(self.jpegs)images = self.res(images)output = self.cmnp(images, mirror=rng)return [output, self.labels]class HybridValPipe(Pipeline):def __init__(self, batch_size, num_threads, device_id, data_dir, crop, size, local_rank=0, world_size=1):super(HybridValPipe, self).__init__(batch_size, num_threads, device_id, seed=12 + device_id)self.input = ops.FileReader(file_root=data_dir, shard_id=local_rank, num_shards=world_size,random_shuffle=False)self.decode = ops.ImageDecoder(device="mixed", output_type=types.RGB)self.res = ops.Resize(device="gpu", resize_shorter=size, interp_type=types.INTERP_TRIANGULAR)self.cmnp = ops.CropMirrorNormalize(device="gpu",output_dtype=types.FLOAT,output_layout=types.NCHW,crop=(crop, crop),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]def get_imagenet_iter_dali(type, image_dir, batch_size, num_threads, device_id, num_gpus, crop, val_size=256,world_size=1,local_rank=0):if type == 'train':pip_train = HybridTrainPipe(batch_size=batch_size, num_threads=num_threads, device_id=local_rank,data_dir=image_dir + '/train',crop=crop, world_size=world_size, local_rank=local_rank)pip_train.build()dali_iter_train = DALIClassificationIterator(pip_train, size=pip_train.epoch_size("Reader") // world_size, auto_reset=True)return dali_iter_trainelif type == 'val':pip_val = HybridValPipe(batch_size=batch_size, num_threads=num_threads, device_id=local_rank,data_dir=image_dir + '/val',crop=crop, size=val_size, world_size=world_size, local_rank=local_rank)pip_val.build()dali_iter_val = DALIClassificationIterator(pip_val, size=pip_val.epoch_size("Reader") // world_size, auto_reset=True)return dali_iter_valdef getArgs():args = argparse.ArgumentParser()args.add_argument('-d', '--datadir', help='img folder containing train & val data',default='data')  #数据目录,包含train,val两个目录,args.add_argument('-b', '--batch_size', help='batch size',type=int,default='16')args.add_argument('-t', '--read_thread', help='num thread for reading data',type=int,default='1') #加载数据的线程数return vars(args.parse_args())if __name__ == '__main__':args = getArgs()data_dir = args['datadir'] #数据目录batch_size = args['batch_size'] #bznum_workers = args['read_thread'] #读线程数train_loader = get_imagenet_iter_dali(type='train', image_dir=data_dir, batch_size=batch_size,num_threads=num_workers, crop=224, device_id=0, num_gpus=1)val_loader = get_imagenet_iter_dali(type='val', image_dir=data_dir, batch_size=batch_size,num_threads=num_workers, crop=224, device_id=0, num_gpus=1)num_epochs = 1# Each epoch has a training and validation phasefor phase in ['train', 'val']:if phase == 'train':dataloader = train_loaderelse:dataloader = val_loader# Iterate over data.for i, data in enumerate(dataloader):inputs = data[0]["data"].cuda(non_blocking=True)labels = data[0]["label"].squeeze().long().cuda(non_blocking=True)

ps:

  • auto_reset参数置为True来实现多个epoch时数据的获取,否则每个epoch需要单独获取loader数据,如这里。DALIClassificationIterator参数的设置详见这里。
  • 文件夹中onehot的顺序根据字母排序获得,即ls当前目录的结果。
FileReader supports a flat directory structure. The file_root directory must contain directories with data files. To obtain the labels, FileReader sorts directories in file_root in alphabetical order and takes an index in this order as a class label.
  • dali对部分数据无法处理,异常数据表现汇总如下

cannot identify image file

Corrupt EXIF data

libpng error: PNG input buffer is incomplete

  • 可通过如下代码获取有问题图片

import os
import imghdr
import argparse
from PIL import Image
import warnings
warnings.filterwarnings("error", category=UserWarning)try:# if True:img = Image.open(img_path)# img.verify()# print( imghdr.what(img_path), img.format)assert imghdr.what(img_path) != 'gif'assert imghdr.what(img_path) in ['jpg', 'jpeg', 'JPEG', 'png', 'bmp']if img.format in ['JPEG']:with open(img_path, 'rb') as f:check_chars = f.read()[-2:]# assert check_chars == b'\xff\xd9' #判断JPEG图片
except Exception as e:# else:print ('{} error: {}'.format(img_path, str(e)))

参考文献:

  1. DataLoaders_DALI

  2. NVIDIA DALI: Speeding up PyTorch

  3. nvidia.dali.ops.FileReader

  4. Image Processing

  5. nvidia-dali GPU加速预处理

  6. PyTorch Plugin API reference

nvidia dali读数据测试程序相关推荐

  1. nvidia.dali:深度学习加速神器!

      最近准备准备整合一个基于pytorch的深度学习平台,把常用的训练推理流程.模型.数据管理.metric测试以及各种有效的黑科技攒到一起,作为个人的使用工具可以提升算法开发和实验效率.为了验证不同 ...

  2. NVIDIA DALI从入门到放弃之五:Image Processing

    NVIDIA DALI从入门到放弃之一:概述 NVIDIA DALI从入门到放弃之二:入门示例 NVIDIA DALI从入门到放弃之三:Data Loading NVIDIA DALI从入门到放弃之四 ...

  3. NVIDIA DALI从入门到放弃之四:Multiple GPU

    NVIDIA DALI从入门到放弃之一:概述 NVIDIA DALI从入门到放弃之二:入门示例 NVIDIA DALI从入门到放弃之三:Data Loading NVIDIA DALI从入门到放弃之四 ...

  4. Nvidia DALI python库安装

    默认pypi源中的nvidia-dali-cuda110包是无效的,需要添加nvidia的源 如果没有添加nvidia的源,直接安装,会提示先安装nvidia-pyindex pip install ...

  5. 在NVIDIA A100 GPU上利用硬件JPEG解码器和NVIDIA nvJPEG库

    在NVIDIA A100 GPU上利用硬件JPEG解码器和NVIDIA nvJPEG库 根据调查,普通人产生的1.2万亿张图像可以通过电话或数码相机捕获.这样的图像的存储,尤其是以高分辨率的原始格式, ...

  6. 用NVIDIA A100 GPUs提高计算机视觉

    用NVIDIA A100 GPUs提高计算机视觉 Improving Computer Vision with NVIDIA A100 GPUs 在2020年英伟达GPU技术会议的主题演讲中,英伟达创 ...

  7. NVIDIA A100 GPUs上硬件JPEG解码器和NVIDIA nvJPEG库

    NVIDIA A100 GPUs上硬件JPEG解码器和NVIDIA nvJPEG库 Leveraging the Hardware JPEG Decoder and NVIDIA nvJPEG Lib ...

  8. OpenVX, 运算加速库, NVIDIA

    OpenVX Khronos Group Khronos Group是一个行业组织,创建开放标准以实现并行计算.图形.视觉.传感处理和动态媒体在各种平台和设备上的编写和加速.Khronos标准包括Vu ...

  9. 快速图像增强的简便大法来了,英伟达开源新库代号“DALI”| CVPR 18

    林鳞 编译整理 量子位 出品 | 公众号 QbitAI 又有新的开源库来了,英伟达出品,数量×2. 正在举行的CVPR 2018大会上,英伟达开源了数据增强库NVIDIA DALI和图像解码库NVID ...

最新文章

  1. LeadTools Android 入门教学——运行第一个Android Demo
  2. weblogic中设置数据源的注意点
  3. Day5---D4:合规和审计管理
  4. 数据库设计(四)概念数据模型
  5. dd-wrt 定时重连 pppoe 更换ip地址
  6. C++ STL之vector详解
  7. .NET 环境下进制间的转换
  8. Next主题 - 图片设置
  9. 对不起,免费午餐现在只提供稀饭了-- MSN停止支持对第三方软件的登录请求
  10. Adobe各种最新版本软件下载 PhotoShop Dreamweaver FW Ai Fl.....
  11. 表达无序列表语义的html标签是,HTML语义标签的介绍和常用的语义标签
  12. 湖大计算机考研范围,湖大计算机829考研要点提要(来自于湖南历年真题,整理不易)...
  13. C语言 负数对正数取余,负数取余/整除,Python和C语言的不同
  14. iOS开发之观察者模式
  15. 服务器编程入门(11)TCP并发回射服务器实现 - 单线程select实现
  16. Science封面6连发:人类最完整的基因组测序完成!
  17. Java-高德地图根据经纬度计算两坐标之间的直线距离
  18. jmeter 聚合报告里面是什么意思
  19. 中国工商银行网银不能识别U盾或打不开网页
  20. 一招解决macOS12 CleanMyMac闪退

热门文章

  1. ecif java_关于企业级ECIF系统的构建设计(未完工)
  2. FPGA 黑金XC6SLX9 08.spi_flash源码分析 spi flash数据的读取擦除写入实验(1)
  3. Exception in thread “main“ java.lang.UnsupportedClassVersionError: org/apache
  4. python将图片裁剪成九宫格
  5. linux时区文件命令,修改Linux时间和时区
  6. 以机器人为核心的无人仓库解决方案和技术探讨
  7. 不了解FPGA工作原理?看看世界第一颗FPGA芯片级拆解
  8. Fluke ADPT连接器给福禄克万用表插上翅膀----交流电压测量
  9. ctfshow 新手杯web
  10. centos7.3安装python3.9