使用DALI模块加速

官方文档:https://docs.nvidia.com/deeplearning/dali/user-guide/docs/installation.html

一、安装

TIPS: 我的版本是CUDA 11.4,我安装的是11.0版本的,没啥影响

1.cuda10.2

pip install --extra-index-url https://developer.download.nvidia.com/compute/redist --upgrade nvidia-dali-cuda102  

2.cuda 11.0

pip install --extra-index-url https://developer.download.nvidia.com/compute/redist --upgrade nvidia-dali-cuda110

二、Pipeline

1.基本使用

Pipeline是DALI模块处理数据的核心概念,定义在nvidia.dali.Pipeline (from nvidia.dali.pipeline import Pipeline)中

  1. 使用pipeline_def(官方文档)装饰器进行定义
  2. 定义的装饰器会添加多个参数。更多的参数参见官方文档
from nvidia.dali import pipeline_def
import nvidia.dali.fn as fn
import nvidia.dali.types as types

#随便找些图,给images下建几个文件夹,在文件夹下图片就行了
image_dir = "data/images"
max_batch_size = 8


@pipeline_def
def simple_pipeline():
    jpegs, labels = fn.readers.file(file_root=image_dir,random_shuffle=True)
	#device的'mixed'指使用GPU和CPU混合解码,这对于大分辨率的JPEG图像非常有效,也可以只使用CPU解码
    images = fn.decoders.image(jpegs, device='mixed').gpu()

    return images, labels
    
pipe = simple_pipeline(batch_size=max_batch_size, num_threads=1, device_id=0)
pipe.build()

#运行,得到一个batch的结果
pipe_out = pipe.run()
images, labels = pipe_out

上面最后一步,我们得到了图片和对应的标签,接下来将images保存成文件。labels的值通过print(np.array(labels.as_tensor()))获取

import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt

def show_images(image_batch):
    columns = 4
    rows = (max_batch_size + 1) // (columns)
    fig = plt.figure(figsize = (32,(32 // columns) * rows))
    gs = gridspec.GridSpec(rows, columns)
    for j in range(rows*columns):
        plt.subplot(gs[j])
        plt.axis("off")
        plt.imshow(image_batch.at(j))
    
    plt.savefig("dummy_name.png")

show_images(images.as_cpu())

打开dummy_name.png文件即可看到图片。
在这里插入图片描述

2.增强功能

随机图片旋转,空白处补1,(更多的参数阅读官方文档)

@pipeline_def
def simple_pipeline():
    jpegs, labels = fn.readers.file(file_root=image_dir,random_shuffle=True)
    images = fn.decoders.image(jpegs, device='mixed').gpu()
    angle = fn.random.uniform(range=(-10.0, 10.0))
   
    rotated_images = fn.rotate(images, angle=angle, fill_value=1)

    return rotated_images, labels

在这里插入图片描述
3. 提示
DALI模块不支持在管道内将数据从GPU移动到CPU中。

三、实现

通过继承Pipeline类并重写define_graph方法
以后补

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贱贱的剑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值