theano.sandbox.cuda.dnn – cuDNN

cuDNN是一个NVIDIA库,具有深层神经网络使用的功能。它提供了一些操作的优化版本,如卷积。cuDNN当前未与CUDA一起安装。你必须自己下载并安装它。

要安装它,请解压缩下载的文件,并使*.h*.so*文件可用于编译环境。至少有三种可能的方式:

  • 最简单的是将它们包含在您的CUDA安装中。*.h文件复制到CUDA_ROOT/include*.so*文件复制到CUDA_ROOT/lib64默认情况下,Linux上的CUDA_ROOT/usr/local/cuda)。

  • 或者,在Linux上,您可以将环境变量LD_LIBRARY_PATHLIBRARY_PATHCPATH设置为从下载提取的目录。If needed, separate multiple directories with : as in the PATH environment variable.

    例:

    export LD_LIBRARY_PATH=/home/user/path_to_CUDNN_folder/lib64:$LD_LIBRARY_PATH
    export CPATH=/home/user/path_to_CUDNN_folder/include:$CPATH
    export LIBRARY_PATH=/home/user/path_to_CUDNN_folder/lib64:$LIBRARY_PATH
    
  • 作为第三种方式,在Linux上,你可以将*.h文件复制到/usr/include*.so*文件到/lib64

默认情况下,Theano将检测是否可以使用cuDNN。如果是这样,它会使用它。如果没有,Theano优化不会引入cuDNN操作。所以如果用户没有手动介绍它,Theano仍然会工作。

最近添加的Theano标志dnn.enabled允许更改默认行为以强制或禁用它。旧版Theano版本不支持此标志。要在无法使用cuDNN时遇到错误,请使用此标志:optimizer_including=cudnn

注意

在Theano主版本中支持cuDNN v5.1。所以它下降了cuDNN v3支持。Theano 0.8.0和0.8.1只支持cuDNN v3和v4。Theano 0.8.2将只支持v4和v5。

注意

从cuDNN v3开始,提供多个卷积实现,并且可以使用启发法来自动选择非常适合于卷积的参数的卷积实现。

Theano标志dnn.conv.algo_fwd允许指定Theano应用于正向卷积的cuDNN卷积实现。可能的值包括:

  • small(默认值):使用具有小内存使用率的卷积实现
  • none:使用较慢的实施,最小内存使用
  • large:使用有时更快的实现,内存使用量大
  • fft:使用卷积的快速傅里叶变换实现(非常高的内存使用)
  • fft_tiling:使用快速傅里叶变换实现卷积(高内存使用,但小于fft)
  • guess_once:第一次执行卷积时,根据cuDNN的启发式选择要使用的实现,并为卷积的每个后续执行重复使用。
  • guess_on_shape_change:like guess_once但是每次输入和内核的形状与上次执行的形状不匹配时,选择一个新的卷积实现。
  • time_once:第一次执行卷积时,cuDNN提供的每个卷积实现都会被执行和定时。最快的是对卷积的每个后续执行重复使用。
  • time_on_shape_change:like time_once但是每次输入和内核的形状与上次执行的形状不匹配时选择新的卷积实现。

Theano标志dnn.conv.algo_bwd_filterdnn.conv.algo_bwd_data允许指定Theano应用于梯度卷积的cuDNN卷积实现。可能的值包括:

  • none(默认):使用默认的非确定性卷积实现
  • deterministic:使用较慢但确定性的实现
  • fft:使用卷积的快速傅里叶变换实现(非常高的内存使用)
  • guess_once:第一次执行卷积时,根据cuDNN的启发式选择要使用的实现,并为卷积的每个后续执行重复使用。
  • guess_on_shape_change:like guess_once但每次输入和内核的形状与上次执行的形状不匹配时,选择一个新的卷积实现。
  • time_once:第一次执行卷积时,cuDNN提供的每个卷积实现都会被执行和定时。最快的是对卷积的每个后续执行重复使用。
  • time_on_shape_change:like time_once但是每次输入和内核的形状与上次执行的形状不匹配时选择新的卷积实现。
  • (仅限algo_bwd_data)fft_tiling:使用快速傅立叶变换实现卷积(高内存使用,但小于fft)
  • (仅限algo_bwd_data)small:使用具有小内存使用率的卷积实现

guess_*time_*标志值在选择实现时考虑可用内存量。这意味着如果没有足够的内存可用于更快的实现,则可以选择较慢的实现。

注意

通常你不应该直接调用GPU Ops,但是CPU接口当前不允许cuDNN操作支持的所有选项。所以你可能需要手动调用它们。

注意

CUDNN的文档指出,对于以下2个操作,使用默认实现不能保证再现性:cudnnConvolutionBackwardFiltercudnnConvolutionBackwardData那些对应于梯度wrt的权重和梯度wrt的卷积的输入。它们也有时在正向传递中使用,当它们加速时。

Theano标志dnn.conv.algo_bwd可用于强制使用较慢但确定性的卷积实现。

注意

有一个问题,我们还不明白,当cudnn路径使用符号链接。所以避免使用它。

注意

cudnn.so *必须可读和可执行的每个人。cudnn.h必须是每个人都可读的。

List of Implemented Operations

class theano.sandbox.cuda.dnn.DnnBase[source]

创建cudnn的句柄并拉入cudnn库和头文件。

class theano.sandbox.cuda.dnn.GpuDnnConv(workmem=None, inplace=False, algo=None)[source]

正向卷积。

参数:
  • image -
  • 内核 -
  • descr - 卷积描述符。
  • workmem - 已弃用,请改用参数algo。
  • algo ({'none', 'small', 'large', 'fft', 'fft_tiling', 'guess_once', 'winograd',) – ‘guess_on_shape_change’, ‘time_once’, ‘time_on_shape_change’} Default is the value of config.dnn.conv.algo_fwd.
static get_out_shape(ishape, kshape, border_mode, subsample)[source]

此函数计算具有指定参数的卷积的输出形状。ishapekshape可以是符号或标量。

class theano.sandbox.cuda.dnn.GpuDnnConv3d(workmem=None, inplace=False, algo=None)[source]

正向卷积。

参数:
  • image -
  • 内核 -
  • descr - 卷积描述符
  • workmem - 已弃用,请改用参数algo。
  • algo{'none' 'small' fft_tiling' 'winograd' 'guess_once' ) - 'guess_on_shape_change','time_once','time_on_shape_change'}默认值是config.dnn.conv.algo_fwd的值。
static get_out_shape(ishape, kshape, border_mode, subsample)[source]

此函数计算具有指定参数的卷积的输出形状。ishapekshape可以是符号或标量。

class theano.sandbox.cuda.dnn.GpuDnnConv3dGradI(inplace=False, workmem=None, algo=None)[source]

相对于输入的卷积梯度。

参数:
  • image -
  • 内核 -
  • descr - 卷积描述符
  • workmem - 已弃用,请改用参数algo。
  • algo ({'none', 'deterministic, 'fft_tiling', 'winograd', 'guess_once',) – ‘guess_on_shape_change’, ‘time_once’, ‘time_on_shape_change’} Default is the value of config.dnn.conv.algo_bwd_data.
class theano.sandbox.cuda.dnn.GpuDnnConv3dGradW(inplace=False, workmem=None, algo=None)[source]

相对于权重的卷积梯度。

参数:
  • image -
  • 内核 -
  • descr - 卷积描述符
  • workmem - 已弃用,请改用参数algo。
  • algo ({'none', 'small', 'guess_once', 'guess_on_shape_change',) – ‘time_once’, ‘time_on_shape_change’} Default is the value of config.dnn.conv.algo_bwd_filter.
class theano.sandbox.cuda.dnn.GpuDnnConvDesc(border_mode, subsample=(1, 1), conv_mode='conv', precision='float32')[source]

此Op构建卷积描述符以用于其他卷积运算。

有关参数的说明,请参阅dnn_conv()的文档。

class theano.sandbox.cuda.dnn.GpuDnnConvGradI(inplace=False, workmem=None, algo=None)[source]

相对于输入的卷积梯度。

参数:
  • image -
  • 内核 -
  • descr - 卷积描述符。
  • workmem - 已弃用,请改用参数algo。
  • algo{'none' 'deterministic' fft' 'fft_tiling' 'winograd' 'guess_once' ) - 'guess_on_shape_change','time_once','time_on_shape_change'}默认值为config.dnn.conv.algo_bwd_data
class theano.sandbox.cuda.dnn.GpuDnnConvGradW(inplace=False, workmem=None, algo=None)[source]

相对于权重的卷积梯度。

参数:
  • image -
  • 内核 -
  • descr - 卷积描述符。
  • workmem - 已弃用,请改用参数algo。
  • algo{'none' 'deterministic' fft' 'small' 'guess_once' ) - 'guess_on_shape_change','time_once','time_on_shape_change'}默认值为config.dnn.conv.algo_bwd_filter
class theano.sandbox.cuda.dnn.GpuDnnPool(mode='max')[source]

合流。

参数:
  • img - 图像4d或5d张量。
  • ws - Windows大小。
  • stride - (dx,dy)。
  • mode{'max' 'average_inc_pad' average_exc_pad'}) - 旧的弃用名称“average”对应于“average_inc_pad”。
  • pad - (padX,padY)填充信息。padX是左右边框的大小,padY是上下边框的大小。
class theano.sandbox.cuda.dnn.GpuDnnPoolDesc(ws=(1, 1), stride=(1, 1), mode='max', pad=(0, 0))[source]

这个Op构建了一个池描述符,用于其他池操作。

参数:
  • ws - Windows大小。
  • stride - (dx,dy)。
  • mode{'max' 'average_inc_pad' average_exc_pad'}) - 旧的弃用名称“average”对应于“average_inc_pad”。
  • pad - (pad_h,pad_w)填充信息。pad_h是添加到顶部和底部边界中的每一个的零值像素的数量。pad_w是添加到左边界和右边界中的每一个的零值像素的数量。
class theano.sandbox.cuda.dnn.GpuDnnPoolGrad(mode='max')[source]

池的梯度。

参数:
  • inp - 池的输入。
  • out - 在转发中的输出。
  • inp_grad - 与大小相同,但是对应的梯度信息。
  • ws - Windows大小。
  • stride - (dx,dy)。
  • mode{'max' 'average_inc_pad' average_exc_pad'}) - 旧的弃用名称“average”对应于“average_inc_pad”。
  • pad - (padX,padY)填充信息。padX是左右边框的大小,padY是上下边框的大小。
class theano.sandbox.cuda.dnn.GpuDnnSoftmax(tensor_format, algo, mode)[source]

Op用于cuDNN Softmax。

参数:
  • tensor_format - 始终设置为'bc01'。
  • algo{'fast' 'accurate'}) - 指示计算是否应针对速度进行优化精度。
  • 模式{'instance' 'channel'}) - 指示是否应根据图像计算softmax跨'c01'或每个图像的每个空间位置'01'跨'c'。
class theano.sandbox.cuda.dnn.GpuDnnSoftmaxBase(tensor_format, algo, mode)[source]

Op用于cuDNN Softmax。

参数:
  • tensor_format - 始终将此设置为“bc01”。
  • algo{'fast' 'accurate' log'}) - 分别指示计算是否应针对速度,精度进行优化,或者cuDNN应该计算log-softmax。
  • 模式{'instance' 'channel'}) - 指示是否应根据图像计算softmax跨'c01'或每个图像的每个空间位置'01'跨'c'。
class theano.sandbox.cuda.dnn.GpuDnnSoftmaxGrad(tensor_format, algo, mode)[source]

Op为cuDNN SoftmaxGrad。

参数:
  • tensor_format - 始终设置为'bc01'。
  • algo{'fast' 'accurate'}) - 指示计算是否应针对速度进行优化精度。
  • 模式{'instance' 'channel'}) - 指示是否应根据图像计算softmax跨'c01'或每个图像的每个空间位置'01'跨'c'。
theano.sandbox.cuda.dnn.dnn_conv(img, kerns, border_mode='valid', subsample=(1, 1), conv_mode='conv', direction_hint=None, workmem=None, algo=None, precision=None)[source]

GPU卷积使用NVIDIA的cuDNN。

要使用的内存布局是'bc01',即'batch','channel','first dim','second dim'按顺序。

参数:
  • img - 要进行卷积的图片。
  • kerns - 卷积过滤器。
  • border_mode - “有效”,“满”,“半”之一另外,填充大小可以由整数或一对整数(作为元组)直接指定,指定添加到_both_的顶部和底部(第一条目)以及左和右(第二条目)侧的零填充量。图片。
  • 子采样 - 对输出执行子采样(默认值:(1,1))。
  • conv_mode - 执行卷积(内核翻转)或交叉相关。“conv”,“cross”(默认值:“conv”)之一。
  • direction_hint - 由图表优化器用于更改算法选择。默认情况下,GpuDnnConv将用于执行卷积。如果border_mode是'valid',subsample是(1,1),direction_hint是'bprop weights',它将使用GpuDnnConvGradW。如果border_mode为'full',子样本为(1,1),direction_hint为'bprop inputs',则它将使用GpuDnnConvGradI。此参数由图表优化程序在内部使用,并且可以在任何时间删除,而不使用弃用期。你已经被警告。
  • workmem - 已弃用,请改用参数algo。
  • algo ({'none', 'small', 'large', 'fft', 'guess_once', 'guess_on_shape_change', 'time_once', 'time_on_shape_change'}) – Convolution implementation to use. 其某些值可能需要安装某些版本的cuDNN。默认值为config.dnn.conv.algo_fwd的值。
  • precision{'as_input' 'float16' float32' 'float64'}) - 应在其中进行卷积计算的dtype的描述。可能的值为'as_input','float16','float32'和'float64'。默认值为config.dnn.conv.precision的值。
theano.sandbox.cuda.dnn.dnn_conv3d(img, kerns, border_mode='valid', subsample=(1, 1, 1), conv_mode='conv', direction_hint=None, workmem=None, algo=None, precision=None)[source]

GPU卷积使用NVIDIA的cuDNN。

要使用的内存布局是“bct01”,即“batch”,“channel”,“first dim”,“second dim”,“third dim”。

参数:
  • img - 图像做卷积
  • kerns - 卷积过滤器
  • border_mode - “有效”,“满”,“半”之一另外,填充大小可以由整数的整数或三元组(作为元组)直接指定,指定添加到顶部和底部(第一条目)和左侧和右侧(第二条目)和前部的零填充量和后(第三入口)侧。
  • 子采样 - 对输出执行子采样(默认值:(1,1,1))
  • conv_mode - 执行卷积(内核翻转)或交叉相关。一个“conv”,“cross”。(默认:'conv')
  • direction_hint - 由图表优化器用于更改算法选择。默认情况下,GpuDnnConv将用于执行卷积。如果border_mode是'valid',subsample是(1,1,1),direction_hint是'bprop weights',它将使用GpuDnnConvGradW。此参数由图表优化程序在内部使用,并且可以在任何时间删除,而不使用弃用期。你已经被警告。
  • workmem - 已弃用,请改用param algo
  • algo - 要使用的卷积实现。对conv3d只实现了“none”。默认值为config.dnn.conv.algo_fwd的值。
:param精度
dtype其中计算卷积
需要被完成。可能的值为'as_input','float16','float32'和'float64'。默认值为config.dnn.conv.precision的值。
警告:cuDNN库仅适用于具有3.0或更高的计算能力的GPU。这意味着较旧的GPU将不能与这个操作。
警告:dnn_conv3d仅适用于cuDNN库3.0
theano.sandbox.cuda.dnn.dnn_gradinput(kerns, topgrad, img_shp, border_mode='valid', subsample=(1, 1), conv_mode='conv')[source]

GPU卷积梯度相对于使用来自NVIDIA的cuDNN的输入。

要使用的内存布局是'bc01',即'batch','channel','first dim','second dim'按顺序。

FIXME参数doc

警告:cuDNN库仅适用于具有3.0或更高的计算能力的GPU。这意味着较旧的GPU将不能与这个操作。
theano.sandbox.cuda.dnn.dnn_gradweight(img, topgrad, kerns_shp, border_mode='valid', subsample=(1, 1), conv_mode='conv')[source]

GPU卷积梯度相对于重量使用来自NVIDIA的cuDNN。

要使用的内存布局是'bc01',即'batch','channel','first dim','second dim'按顺序。

FIXME参数doc

警告:cuDNN库仅适用于具有3.0或更高的计算能力的GPU。这意味着较旧的GPU将不能与这个操作。
theano.sandbox.cuda.dnn.dnn_pool(img, ws, stride=(1, 1), mode='max', pad=(0, 0))[source]

GPU池使用NVIDIA的cuDNN。

要使用的内存布局是'bc01',即'batch','channel','first dim','second dim'按顺序。

参数:
  • img - 图像做池。
  • ws - 子采样窗口大小。
  • stride - Subsampling stride(默认值:(1,1))。
  • mode{'max' 'average_inc_pad' average_exc_pad}) -
  • pad - (pad_h,pad_w)填充信息。pad_h是添加到顶部和底部边界中的每一个的零值像素的数量。pad_w是添加到左边界和右边界中的每一个的零值像素的数量。
:param .. warning :: cuDNN库仅适用于具有计算能力为3.0或更高的GPU。这意味着更老的GPU不会
使用这个Op。

笔记

此Op实现max_pool_2d的ignore_border = True。