7. mcdnn_adv_train

此实体包含对应于mcdnn_adv_infer的训练相关功能与算法。mcdnn_adv_train库依赖于mcdnn_ops_infer,mcdnn_ops_train和mcdnn_adv_infer。

7.1. 数据类型参考

以下为mcdnn_adv_train.h中的数据类型参考。

7.1.1. 枚举类型

以下为mcdnn_adv_train.h中的枚举类型。

7.1.1.1. mcdnnLossNormalizationMode_t

mcdnnLossNormalizationMode_t是一种枚举类型,用于控制损失函数(Loss function)的输入归一化模式。此类型可与mcdnnSetCTCLossDescriptorEx()一起使用。

MCDNN_LOSS_NORMALIZATION_NONE

mcdnnCTCLoss()函数的输入prob应是归一化概率,而输出梯度是非归一化概率相关的损失梯度。

MCDNN_LOSS_NORMALIZATION_SOFTMAX

mcdnnCTCLoss()函数的输入prob应是上一层的非归一化激活,而输出梯度是激活相关的梯度。概率是由softmax归一化内部计算得到的。

7.1.1.2. mcdnnWgradMode_t

mcdnnWgradMode_t是一种枚举类型,用于选择如何更新缓冲区,该缓冲区保存损失函数的梯度,根据可训练参数计算所得。目前,此类型仅支持mcdnnMultiHeadAttnBackwardWeights()和mcdnnRNNBackwardWeights_v8()函数使用。

MCDNN_WGRAD_MODE_ADD

与新batch输入对应的权重梯度组件将添加到已求值的权重梯度中。使用此模式之前,将保存权重梯度的缓冲区初始化为零。或者,输出到未初始化缓冲区的第一个API调用应使用MCDNN_WGRAD_MODE_SET选项。

MCDNN_WGRAD_MODE_SET

与新batch输入对应的权重梯度组件会覆盖输出缓冲区中已存储的权重梯度。

7.2. API参考

7.2.1. API函数

以下为mcdnn_adv_train.h中的API函数。

7.2.1.1. mcdnnAdvTrainVersionCheck()

此函数检查库的AdvTrain子集的版本是否与其他子库一致。

mcdnnStatus_t mcdnnAdvTrainVersionCheck(void)

返回值

MCDNN_STATUS_SUCCESS

版本与其他子库一致。

MCDNN_STATUS_VERSION_MISMATCH

AdvTrain的版本与其他子库不一致。用户应检查并确保所有子组件安装版本一致。

7.2.1.2. mcdnnCreateCTCLossDescriptor()

此函数创建CTC损失函数描述符。

mcdnnStatus_t mcdnnCreateCTCLossDescriptor(
    mcdnnCTCLossDescriptor_t* ctcLossDesc)

参数

ctcLossDesc

输出。要设置的CTC损失描述符。更多信息,参见mcdnnCTCLossDescriptor_t。

返回值

MCDNN_STATUS_SUCCESS

此函数返回成功。

MCDNN_STATUS_BAD_PARAM

传入函数的CTC损失描述符无效。

MCDNN_STATUS_ALLOC_FAILED

此CTC损失描述符的内存分配失败。

7.2.1.3. mcdnnCTCLoss()

给定概率和标签,该函数返回CTC成本和梯度。

mcdnnStatus_t mcdnnCTCLoss(
    mcdnnHandle_t                        handle,
    const   mcdnnTensorDescriptor_t      probsDesc,
    const   void                        *probs,
    const   int                          hostLabels[],
    const   int                          hostLabelLengths[],
    const   int                          hostInputLengths[],
    void                                *costs,
    const   mcdnnTensorDescriptor_t      gradientsDesc,
    const   void                        *gradients,
    mcdnnCTCLossAlgo_t                   algo,
    const   mcdnnCTCLossDescriptor_t     ctcLossDesc,
    void                                *workspace,
    size_t                              *workSpaceSizeInBytes)

备注

根据所选的mcdnnLossNormalizationMode_t(使用mcdnnSetCTCLossDescriptionEx()绑定到mcdnnCTCLossDescriptor_t),此函数的接口可能不一致。对于MCDNN_LOSS_NORMALIZATION_NONE,此函数的接口不一致,例如,probs输入是由softmax归一化的概率,但梯度输出与非归一化激活有关。但是,对于MCDNN_LOSS_NORMALIZATION_SOFTMAX,函数的接口一致;所有值均由softmax归一化。

参数

handle

输入。已创建的mcDNN上下文的句柄。更多信息,参见mcdnnHandle_t。

probsDesc

输入。已初始化的概率张量描述符的句柄。更多信息,参见mcdnnTensorDescriptor_t。

probs

输入。指向已初始化的概率张量的指针。这些输入概率由softmax归一化。

hostLabels

输入。指向CPU内存中已初始化的标签列表的指针。

hostLabelLengths

输入。指向CPU内存中已初始化的长度列表的指针,以遍历上述标签列表。

hostInputLengths

输入。指向CPU内存中已初始化列表的指针,该列表为每个batch中时间步长的列表。

costs

输出。指向CTC计算成本的指针。

gradientsDesc

输入。已初始化的梯度张量描述符的句柄。

gradients

输出。指向CTC计算梯度的指针。这些计算的梯度输出与非归一化激活有关。

algo

输入。指定所选CTC损失算法的枚举。更多信息,参见mcdnnCTCLossAlgo_t。

ctcLossDesc

输入。已初始化的CTC损失描述符的句柄。更多信息,参见mcdnnCTCLossDescriptor_t。

workspace

输入。指针,指向执行指定算法所需的GPU内存工作空间。

sizeInBytes

输入。作为工作空间所需的GPU内存量,以便能够使用指定的算法执行CTC损失计算。

返回值

MCDNN_STATUS_SUCCESS

查询成功。

MCDNN_STATUS_BAD_PARAM

需至少满足以下任一条件:

  • probsDesc的维度与gradientsDesc的维度不匹配。

  • inputLengths与probsDesc的第一维不一致。

  • workSpaceSizeInBytes不足。

  • labelLengths大于255。

MCDNN_STATUS_NOT_SUPPORTED

选择了浮点以外的计算或数据类型,或者选择了未知算法类型。

MCDNN_STATUS_EXECUTION_FAILED

此函数在GPU上启用失败。

7.2.1.4. mcdnnCTCLoss_v8()

给定概率和标签,该函数返回CTC成本和梯度。

mcdnnStatus_t mcdnnCTCLoss_v8(
    mcdnnHandle_t                        handle,
    mcdnnCTCLossAlgo_t                   algo,
    const   mcdnnCTCLossDescriptor_t     ctcLossDesc,
    const   mcdnnTensorDescriptor_t      probsDesc,
    const   void                        *probs,
    const   int                          labels[],
    const   int                          labelLengths[],
    const   int                          inputLengths[],
    void                                *costs,
    const   mcdnnTensorDescriptor_t      gradientsDesc,
    const   void                        *gradients,
    size_t                              *workSpaceSizeInBytes,
    void                                *workspace)

备注

根据所选的mcdnnLossNormalizationMode_t(使用mcdnnSetCTCLossDescriptionEx()绑定到mcdnnCTCLossDescriptor_t),此函数的接口可能不一致。对于MCDNN_LOSS_NORMALIZATION_NONE,此函数的接口不一致,例如,probs输入是由softmax归一化的概率,但梯度输出与非归一化激活有关。但是,对于MCDNN_LOSS_NORMALIZATION_SOFTMAX,函数的接口一致;所有值均由softmax归一化。

参数

handle

输入。已创建的mcDNN上下文的句柄。更多信息,参见mcdnnHandle_t。

algo

输入。指定所选CTC损失算法的枚举。更多信息,参见mcdnnCTCLossAlgo_t。

ctcLossDesc

输入。已初始化的CTC损失描述符的句柄。要使用此_v8函数,必须使用mcdnnSetCTCLossDescriptor_v8()设置此描述符。更多信息,参见mcdnnCTCLossDescriptor_t。

probsDesc

输入。已初始化的概率张量描述符的句柄。更多信息,参见mcdnnTensorDescriptor_t。

probs

输入。指向已初始化的概率张量的指针。这些输入概率由softmax归一化。

labels

输入。指向GPU内存中已初始化的标签列表的指针。

labelLengths

输入。指向GPU内存中已初始化的长度列表的指针,以遍历上述标签列表。

inputLengths

输入。指向GPU内存中已初始化列表的指针,该列表为每个batch中时间步长的列表。

costs

输出。指向CTC计算成本的指针。

gradientsDesc

输入。已初始化的梯度张量描述符的句柄。

gradients

输出。指向CTC计算梯度的指针。这些计算的梯度输出与非归一化激活有关。

workspace

输入。指针,指向执行指定算法所需的GPU内存工作空间。

sizeInBytes

输入。作为工作空间所需的GPU内存量,以便能够使用指定的算法执行CTC损失计算。

返回值

MCDNN_STATUS_SUCCESS

查询成功。

MCDNN_STATUS_BAD_PARAM

需至少满足以下任一条件:

  • probsDesc的维度与gradientsDesc的维度不匹配。

  • inputLengths与probsDesc的第一维不一致。

  • workSpaceSizeInBytes不足。

  • labelLengths大于256。

MCDNN_STATUS_NOT_SUPPORTED

选择了浮点以外的计算或数据类型,或者选择了未知算法类型。

MCDNN_STATUS_EXECUTION_FAILED

此函数在GPU上启用失败。

7.2.1.5. mcdnnDestroyCTCLossDescriptor()

此函数用于销毁CTC损失函数描述符。

mcdnnStatus_t mcdnnDestroyCTCLossDescriptor(
    mcdnnCTCLossDescriptor_t        ctcLossDesc)

参数

ctcLossDesc

输入。要销毁的CTC损失函数描述符。

返回值

MCDNN_STATUS_SUCCESS

此函数返回成功。

7.2.1.6. mcdnnFindRNNBackwardDataAlgorithmEx()

此函数保留API,不再单独实现。 此函数使用用户分配的GPU内存尝试mcdnnRNNBackwardData()的所有可用mcDNN算法。它将影响算法性能的参数输出到用户分配的mcdnnAlgorithmPerformance_t数组。这些参数指标以一种有序的方式写入,其中第一个元素的计算时间最短。

mcdnnStatus_t mcdnnFindRNNBackwardDataAlgorithmEx(
    mcdnnHandle_t                    handle,
    const mcdnnRNNDescriptor_t       rnnDesc,
    const int                        seqLength,
    const mcdnnTensorDescriptor_t    *yDesc,
    const void                       *y,
    const mcdnnTensorDescriptor_t    *dyDesc,
    const void                       *dy,
    const mcdnnTensorDescriptor_t    dhyDesc,
    const void                       *dhy,
    const mcdnnTensorDescriptor_t    dcyDesc,
    const void                       *dcy,
    const mcdnnFilterDescriptor_t    wDesc,
    const void                       *w,
    const mcdnnTensorDescriptor_t    hxDesc,
    const void                       *hx,
    const mcdnnTensorDescriptor_t    cxDesc,
    const void                       *cx,
    const mcdnnTensorDescriptor_t    *dxDesc,
    void                             *dx,
    const mcdnnTensorDescriptor_t    dhxDesc,
    void                             *dhx,
    const mcdnnTensorDescriptor_t    dcxDesc,
    void                             *dcx,
    const float                      findIntensity,
    const int                        requestedAlgoCount,
    int                              *returnedAlgoCount,
    mcdnnAlgorithmPerformance_t      *perfResults,
    void                             *workspace,
    size_t                           workSpaceSizeInBytes,
    const void                       *reserveSpace,
    size_t                           reserveSpaceSizeInBytes)

参数

handle

输入。已创建的mcDNN上下文的句柄。

rnnDesc

输入。已初始化的RNN描述符。

seqLength

输入。要展开的迭代次数。seqLength的值不能超过mcdnnGetRNNWorkspaceSize()函数中用于查询执行RNN所需的工作空间大小。

yDesc

输入。完全压缩的张量描述符数组,描述每个循环迭代输出(一个迭代一个描述符)。张量的第二维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第二维应与hiddenSize参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第二维应是hiddenSize参数的2倍。

张量n的第一维必须与dyDesc中张量n的第一维匹配。

y

输入。数据指针,指向与输出张量描述符yDesc关联的GPU内存。

dyDesc

输入。完全压缩的张量描述符数组,描述每个循环迭代输出梯度(一个迭代一个描述符)。张量的第二维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第二维应与hiddenSize参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第二维应是hiddenSize参数的2倍。

张量n的第一维必须与dxDesc中张量n的第二维匹配。

dy

输入。数据指针,指向与dyDesc数组中张量描述符关联的GPU内存。

dhyDesc

输入。完全压缩的张量描述符,描述RNN的最终隐藏状态梯度。 张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与dxDesc所描述张量的第一维匹配。 第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

dhy

输入。数据指针,指向与张量描述符dhyDesc关联的GPU内存。如果传入NULL指针,则网络的初始隐藏状态梯度将初始化为零。

dcyDesc

输入。完全压缩的张量描述符,描述RNN的最终单元状态梯度。 张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与dxDesc所描述张量的第一维匹配。 第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

dcy

输入。数据指针,指向与张量描述符dcyDesc关联的GPU内存。如果传入NULL指针,则网络的初始单元状态梯度将初始化为零。

wDesc

输入。已初始化的卷积核描述符的句柄,描述RNN权重。

w

输入。数据指针,指向与卷积核描述符wDesc关联的GPU内存。

hxDesc

输入。完全压缩的张量描述符,描述RNN的初始隐藏状态(initial hidden state)。 张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与dxDesc所描述张量的第一维匹配。 第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

hx

输入。数据指针,指向与张量描述符hxDesc关联的GPU内存。如果传入NULL指针,则网络的初始隐藏状态将初始化为零。

cxDesc

输入。完全压缩的的张量描述符,描述LSTM网络的初始单元(cell)状态。 张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与dxDesc所描述张量的第一维匹配。 第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

cx

输入。数据指针,指向与张量描述符cxDesc关联的GPU内存。如果传入NULL指针,则网络的初始单元状态将初始化为零。

dxDesc

输入。完全压缩的张量描述符数组,描述每个循环迭代输入梯度(一个迭代一个描述符)。张量的第一维(批大小)可能从元素n减少到元素n+1,但可能不会增加。每个张量描述符必须具有相同的第二维(向量长度)。

dx

输出。数据指针,指向与dxDesc数组中张量描述符关联的GPU内存。

dhxDesc

输入。完全压缩的张量描述符,描述RNN的初始隐藏状态梯度。 张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与dxDesc所描述张量的第一维匹配。 第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

dhx

输出。数据指针,指向与张量描述符dhxDesc关联的GPU内存。如果传入NULL指针,将不会设置网络的隐藏输入梯度。

dcxDesc

输入。完全压缩的张量描述符,描述RNN的初始单元状态梯度。 张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与dxDesc所描述张量的第一维匹配。 第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

dcx

输出。数据指针,指向与张量描述符dcxDesc关联的GPU内存。如果传入NULL指针,将不会设置网络的单元输入梯度。

findIntensity

输入。此输入在mcDNN之前的版本中未使用。 在之后的版本中,它通过选择要搜索的空间占大的笛卡尔积空间的百分比,来控制RNN查找算法的总体运行时。

  • 在(0,1.]范围内设置findIntensity,则是设置要搜索的空间占整个RNN搜索空间的百分比。当findIntensity设置为1.0时,将对所有RNN参数执行完整搜索。

  • 当findIntensity设置为0.0f时,将执行快速,最小的搜索。此设置可获得最佳运行时。但是,在这种情况下,此函数返回的参数不会获得算法的最佳性能;更大范围的搜索可能会发现更好的性能参数。此选项将最多执行三个已配置的RNN problem的实例。运行时会随RNN problem size而成比例地变化,在其他情况下也是如此,因此不能保证明确的时间限制。

  • 在[-1.,0)范围内设置findIntensity,则是设置要搜索的空间占归约笛卡尔积空间的百分比。为获得良好的性能,已启发式地选择此归约搜索空间。设置为-1.0表示在此归约搜索空间上进行完整搜索。

  • [-1,1]范围以外的值被截断到[-1,1]范围中,然后按照上述说明进行解释。

  • 此函数对大参数空间上的单个RNN执行进行乘积—一个参数组合一次执行。此函数返回的时间是运行总时间。

requestedAlgoCount

输入。要存储在perfResults中的最大元素数。

returnedAlgoCount

输出。存储在perfResults中的输出元素数。

perfResults

输出。用户分配的数组,用于存储按计算时间升序排序的性能指标。

workspace

输入。数据指针,指向要用作此调用工作空间的GPU内存。

workSpaceSizeInBytes

输入。指定已提供的workspace大小(以字节为单位)。

reserveSpace

输入/输出。数据指针,指向要用作此调用预留空间的GPU内存。

reserveSpaceSizeInBytes

输入。指定已提供的reserveSpace的大小(以字节为单位)。

返回值

MCDNN_STATUS_SUCCESS

此函数启用成功。

MCDNN_STATUS_NOT_SUPPORTED

此函数不支持已提供的配置。

MCDNN_STATUS_BAD_PARAM

需至少满足以下任一条件:

  • rnnDesc描述符无效。

  • dhxDesc、wDesc、hxDesc、cxDesc、dcxDesc、dhyDesc或dcyDesc描述符中或者yDesc、dxdesc、dydesc描述符中至少有一个是无效的。

  • yDesc、dxDesc、dyDesc、dhxDesc、wDesc、hxDesc、cxDesc、dcxDesc、dhyDesc或dcyDesc的步幅或维度不正确。

  • workSpaceSizeInBytes太小。

  • reserveSpaceSizeInBytes太小。

MCDNN_STATUS_EXECUTION_FAILED

此函数在GPU上启用失败。

MCDNN_STATUS_ALLOC_FAILED

此函数不能用来分配内存。

7.2.1.7. mcdnnFindRNNBackwardWeightsAlgorithmEx()

此函数保留API,不再单独实现。 此函数使用用户分配的GPU内存尝试mcdnnRNNBackwardWeights()的所有可用mcDNN算法。它将影响算法性能的参数输出到用户分配的mcdnnAlgorithmPerformance_t数组。这些参数指标以一种有序的方式写入,其中第一个元素的计算时间最短。

mcdnnStatus_t mcdnnFindRNNBackwardWeightsAlgorithmEx(
    mcdnnHandle_t                    handle,
    const mcdnnRNNDescriptor_t       rnnDesc,
    const int                        seqLength,
    const mcdnnTensorDescriptor_t    *xDesc,
    const void                       *x,
    const mcdnnTensorDescriptor_t    hxDesc,
    const void                       *hx,
    const mcdnnTensorDescriptor_t    *yDesc,
    const void                       *y,
    const float                      findIntensity,
    const int                        requestedAlgoCount,
    int                              *returnedAlgoCount,
    mcdnnAlgorithmPerformance_t      *perfResults,
    const void                       *workspace,
    size_t                           workSpaceSizeInBytes,
    const mcdnnFilterDescriptor_t    dwDesc,
    void                             *dw,
    const void                       *reserveSpace,
    size_t                           reserveSpaceSizeInBytes)

参数

handle

输入。已创建的mcDNN上下文的句柄。

rnnDesc

输入。已初始化的RNN描述符。

seqLength

输入。要展开的迭代次数。seqLength的值不能超过mcdnnGetRNNWorkspaceSize()函数中用于查询执行RNN所需的工作空间大小。

xDesc

输入。完全压缩的张量描述符数组,描述每个循环迭代的输入(一个迭代一个描述符)。张量的第一维(批大小)可能从元素n减少到元素n+1,但可能不会增加。每个张量描述符必须具有相同的第二维(向量长度)。

x

输入。数据指针,指向与xDesc数组中张量描述符关联的GPU内存。

hxDesc

输入。完全压缩的张量描述符,描述RNN的初始隐藏状态(initial hidden state)。 张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc所描述张量的第一维匹配。 第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

hx

输入。数据指针,指向与张量描述符hxDesc关联的GPU内存。如果传入NULL指针,则网络的初始隐藏状态将初始化为零。

yDesc

输入。完全压缩的张量描述符数组,描述每个循环迭代输出(一个迭代一个描述符)。张量的第二维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第二维应与hiddenSize参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第二维应是hiddenSize参数的2倍。

张量n的第一维必须与dyDesc中张量n的第一维匹配。

y

输入。数据指针,指向与输出张量描述符yDesc关联的GPU内存。

findIntensity

输入。此输入在mcDNN之前的版本中未使用。 在之后的版本中,它通过选择要搜索的空间占大的笛卡尔积空间的百分比,来控制RNN查找算法的总体运行时。

  • 在(0,1.]范围内设置findIntensity,则是设置要搜索的空间占整个RNN搜索空间的百分比。当findIntensity设置为1.0时,将对所有RNN参数执行完整搜索。

  • 当findIntensity设置为0.0f时,将执行快速,最小的搜索。此设置可获得最佳运行时。 但是,在这种情况下,此函数返回的参数不会获得算法的最佳性能;更大范围的搜索可能会发现更好的性能参数。此选项将最多执行三个已配置的RNN problem的实例。 运行时会随RNN problem size而成比例地变化,在其他情况下也是如此,因此不能保证明确的时间限制。

  • 在[-1.,0)范围内设置findIntensity,则是设置要搜索的空间占归约笛卡尔积空间的百分比。 为获得良好的性能,已启发式地选择此归约搜索空间。设置为-1.0表示在此归约搜索空间上进行完整搜索。

  • [-1,1]范围以外的值被截断到[-1,1]范围中,然后按照上述说明进行解释。

  • 此函数对大参数空间上的单个RNN执行进行乘积—一个参数组合一次执行。此函数返回的时间是运行总时间。

requestedAlgoCount

输入。要存储在perfResults中的最大元素数。

returnedAlgoCount

输出。存储在perfResults中的输出元素数。

perfResults

输出。用户分配的数组,用于存储按计算时间升序排序的性能指标。

workspace

输入。数据指针,指向要用作此调用工作空间的GPU内存。

workSpaceSizeInBytes

输入。指定已提供的workspace大小(以字节为单位)。

dwDesc

输入。已初始化的卷积核描述符的句柄,描述RNN权重梯度。

dw

输入/输出。数据指针,指向与卷积核描述符dwDesc关联的GPU内存。

reserveSpace

输入。数据指针,指向要用作此调用预留空间的GPU内存。

reserveSpaceSizeInBytes

输入。指定已提供的reserveSpace的大小(以字节为单位)。

返回值

MCDNN_STATUS_SUCCESS

此函数启用成功。

MCDNN_STATUS_NOT_SUPPORTED

此函数不支持已提供的配置。

MCDNN_STATUS_BAD_PARAM

需至少满足以下任一条件:

  • rnnDesc描述符无效。

  • hxDesc、dwDesc描述符中或者xDesc、yDesc描述符中至少有一个是无效的。

  • xDesc、hxDesc、yDesc、dwDesc中任一描述符的步幅或维度不正确。

  • workSpaceSizeInBytes太小。

  • reserveSpaceSizeInBytes太小。

MCDNN_STATUS_EXECUTION_FAILED

此函数在GPU上启用失败。

MCDNN_STATUS_ALLOC_FAILED

此函数不能用来分配内存。

7.2.1.8. mcdnnFindRNNForwardTrainingAlgorithmEx()

此函数保留API,不再单独实现。 此函数使用用户分配的GPU内存尝试mcdnnRNNForwardTraining()的所有可用mcDNN算法。它将影响算法性能的参数输出到用户分配的mcdnnAlgorithmPerformance_t数组。这些参数指标以一种有序的方式写入,其中第一个元素的计算时间最短。

mcdnnStatus_t mcdnnFindRNNForwardTrainingAlgorithmEx(
    mcdnnHandle_t                   handle,
    const mcdnnRNNDescriptor_t      rnnDesc,
    const int                       seqLength,
    const mcdnnTensorDescriptor_t  *xDesc,
    const void                     *x,
    const mcdnnTensorDescriptor_t   hxDesc,
    const void                     *hx,
    const mcdnnTensorDescriptor_t   cxDesc,
    const void                     *cx,
    const mcdnnFilterDescriptor_t   wDesc,
    const void                     *w,
    const mcdnnTensorDescriptor_t  *yDesc,
    void                           *y,
    const mcdnnTensorDescriptor_t   hyDesc,
    void                           *hy,
    const mcdnnTensorDescriptor_t   cyDesc,
    void                           *cy,
    const float                    findIntensity,
    const int                      requestedAlgoCount,
    int                            *returnedAlgoCount,
    mcdnnAlgorithmPerformance_t    *perfResults,
    void                           *workspace,
    size_t                          workSpaceSizeInBytes,
    void                           *reserveSpace,
    size_t                          reserveSpaceSizeInBytes)

参数

handle

输入。已创建的mcDNN上下文的句柄。

rnnDesc

输入。已初始化的RNN描述符。

xDesc

输入。完全压缩的张量描述符数组,描述每个循环迭代的输入(一个迭代一个描述符)。张量的第一维(批大小)可能从元素n减少到元素n+1,但可能不会增加。每个张量描述符必须具有相同的第二维(向量长度)。

seqLength

输入。要展开的迭代次数。seqLength的值不能超过mcdnnGetRNNWorkspaceSize()函数中用于查询执行RNN所需的工作空间大小。

x

输入。数据指针,指向与xDesc数组中张量描述符关联的GPU内存。

hxDesc

输入。完全压缩的张量描述符,描述RNN的初始隐藏状态(initial hidden state)。 张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc所描述张量的第一维匹配。 第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

hx

输入。数据指针,指向与张量描述符hxDesc关联的GPU内存。如果传入NULL指针,则网络的初始隐藏状态将初始化为零。

cxDesc

输入。完全压缩的的张量描述符,描述LSTM网络的初始单元(cell)状态。 张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc中描述的张量的第一维匹配。 第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

cx

输入。数据指针,指向与张量描述符cxDesc关联的GPU内存。如果传入NULL指针,则网络的初始单元状态将初始化为零。

wDesc

输入。已初始化的卷积核描述符的句柄,描述RNN权重。

w

输入。数据指针,指向与卷积核描述符wDesc关联的GPU内存。

yDesc

输入。完全压缩的张量描述符数组,描述每个循环迭代输出(一个迭代一个描述符)。张量的第二维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第二维应与hiddenSize参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第二维应是hiddenSize参数的2倍。

张量n的第一维必须与xDesc中张量n的第一维匹配。

y

输出。数据指针,指向与输出张量描述符yDesc关联的GPU内存。

hyDesc

输入。完全压缩的张量描述符,描述RNN的最终隐藏状态。 张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc所描述张量的第一维匹配。 第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

hy

输出。数据指针,指向与张量描述符hyDesc关联的GPU内存。如果传入NULL指针,将不会保存网络的最终隐藏状态。

cyDesc

输入。完全压缩的张量描述符,描述LSTM网络的最终单元状态。 张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc所描述张量的第一维匹配。 第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

cy

输出。数据指针,指向与张量描述符cyDesc关联的GPU内存。如果传入NULL指针,将不会保存网络的最终单元状态。

findIntensity

输入。 此输入之前未使用。 在之后的版本中,它通过选择要搜索的空间占大的笛卡尔积空间的百分比,来控制RNN查找算法的总体运行时。

  • 在(0,1.]范围内设置findIntensity,则是设置要搜索的空间占整个RNN搜索空间的百分比。 当findIntensity设置为1.0时,将对所有RNN参数执行完整搜索。

  • 当findIntensity设置为0.0f时,将执行快速,最小的搜索。此设置可获得最佳运行时。 但是,在这种情况下,此函数返回的参数不会获得算法的最佳性能;更大范围的搜索可能会发现更好的性能参数。此选项将最多执行三个已配置的RNN problem的实例。 运行时会随RNN problem size而成比例地变化,在其他情况下也是如此,因此不能保证明确的时间限制。

  • 在[-1.,0)范围内设置findIntensity,则是设置要搜索的空间占归约笛卡尔积空间的百分比。 为获得良好的性能,已启发式地选择此归约搜索空间。设置为-1.0表示在此归约搜索空间上进行完整搜索。

  • [-1,1]范围以外的值被截断到[-1,1]范围中,然后按照上述说明进行解释。

  • 此函数对大参数空间上的单个RNN执行进行乘积—一个参数组合一次执行。此函数返回的时间是运行总时间。

requestedAlgoCount

输入。要存储在perfResults中的最大元素数。

returnedAlgoCount

输出。存储在perfResults中的输出元素数。

perfResults

输出。用户分配的数组,用于存储按计算时间升序排序的性能指标。

workspace

输入。数据指针,指向要用作此调用工作空间的GPU内存。

workSpaceSizeInBytes

输入。指定已提供的workspace大小(以字节为单位)。

reserveSpace

输入/输出。数据指针,指向要用作此调用预留空间的GPU内存。

reserveSpaceSizeInBytes

输入。指定已提供的reserveSpace的大小(以字节为单位)。

返回值

MCDNN_STATUS_SUCCESS

此函数启用成功。

MCDNN_STATUS_BAD_PARAM

需至少满足以下任一条件:

  • rnnDesc描述符无效。

  • hxDesc、cxDesc、wDesc、hyDesc、cyDesc描述符中或者xDesc、yDesc描述符中至少有一个是无效的。

  • xDesc、hxDesc、cxDesc、wDesc、yDesc、hyDesc、cyDesc中任一描述符的步幅或维度不正确。

  • workSpaceSizeInBytes太小。

  • reserveSpaceSizeInBytes太小。

MCDNN_STATUS_EXECUTION_FAILED

此函数在GPU上启用失败。

MCDNN_STATUS_ALLOC_FAILED

此函数不能用来分配内存。

7.2.1.9. mcdnnGetCTCLossDescriptor()

该函数返回传入的CTC损失函数描述符的配置。

mcdnnStatus_t mcdnnGetCTCLossDescriptor(
    mcdnnCTCLossDescriptor_t         ctcLossDesc,
    mcdnnDataType_t*                 compType)

参数

ctcLossDesc

输入。传入的CTC损失函数描述符,用以从中检索配置。

compType

输出。与此CTC损失函数描述符关联的计算类型。

返回值

MCDNN_STATUS_SUCCESS

此函数返回成功。

MCDNN_STATUS_BAD_PARAM

传入的输入ctcLossDesc描述符无效。

7.2.1.10. mcdnnGetCTCLossDescriptorEx()

该函数返回传入的CTC损失函数描述符的配置。

mcdnnStatus_t mcdnnGetCTCLossDescriptorEx(
    mcdnnCTCLossDescriptor_t         ctcLossDesc,
    mcdnnDataType_t                 *compType,
    mcdnnLossNormalizationMode_t    *normMode,
    mcdnnNanPropagation_t           *gradMode)

参数

ctcLossDesc

输入。传入的CTC损失函数描述符,用以从中检索配置。

compType

输出。与此CTC损失函数描述符关联的计算类型。

normMode

输出。此CTC损失函数描述符的输入归一化类型。有关更多信息,请参见mcdnnLossNormalizationMode_t。

gradMode

输出。此CTC损失函数描述符的NaN传播类型。

返回值

MCDNN_STATUS_SUCCESS

此函数返回成功。

MCDNN_STATUS_BAD_PARAM

传入的输入ctcLossDesc描述符无效。

7.2.1.11. mcdnnGetCTCLossDescriptor_v8()

该函数返回传入的CTC损失函数描述符的配置。

mcdnnStatus_t mcdnnGetCTCLossDescriptor_v8(
    mcdnnCTCLossDescriptor_t         ctcLossDesc,
    mcdnnDataType_t                 *compType,
    mcdnnLossNormalizationMode_t    *normMode,
    mcdnnNanPropagation_t           *gradMode,
    int                             *maxLabelLength)

参数

ctcLossDesc

输入。传入的CTC损失函数描述符,用以从中检索配置。

compType

输出。与此CTC损失函数描述符关联的计算类型。

normMode

输出。此CTC损失函数描述符的输入归一化类型。有关更多信息,请参见mcdnnLossNormalizationMode_t。

gradMode

输出。此CTC损失函数描述符的NaN传播类型。

maxLabelLength

输出。此CTC损失函数描述符的最大标签长度。

返回值

MCDNN_STATUS_SUCCESS

此函数返回成功。

MCDNN_STATUS_BAD_PARAM

传入的输入ctcLossDesc描述符无效。

7.2.1.12. mcdnnGetCTCLossWorkspaceSize()

此函数返回用户应分配的GPU内存工作空间量,以便能够使用指定算法来调用mcdnnCTCLoss()函数。然后,分配的工作空间将传入mcdnnCTCLoss()函数。

mcdnnStatus_t mcdnnGetCTCLossWorkspaceSize(
    mcdnnHandle_t                        handle,
    const   mcdnnTensorDescriptor_t      probsDesc,
    const   mcdnnTensorDescriptor_t      gradientsDesc,
    const   int                         *labels,
    const   int                         *labelLengths,
    const   int                         *inputLengths,
    mcdnnCTCLossAlgo_t                   algo,
    const   mcdnnCTCLossDescriptor_t     ctcLossDesc,
    size_t                              *sizeInBytes)

参数

handle

输入。已创建的mcDNN上下文的句柄。

probsDesc

输入。已初始化的概率张量描述符的句柄。

gradientsDesc

输入。已初始化的梯度张量描述符的句柄。

labels

输入。指向已初始化的标签列表的指针。

labelLengths

输入。指向已初始化的长度列表的指针,以遍历上述标签列表。

inputLengths

输入。指向已初始化列表的指针,该列表为每个batch中时间步长的列表。

algo

输入。指定所选CTC损失算法的枚举。

ctcLossDesc

输入。已初始化的CTC损失描述符的句柄。

sizeInBytes

输出。作为工作空间所需的GPU内存量,以便能够使用指定的算法执行CTC损失计算。

返回值

MCDNN_STATUS_SUCCESS

查询成功。

MCDNN_STATUS_BAD_PARAM

需至少满足以下任一条件:

  • probsDesc的维度与gradientsDesc的维度不匹配。

  • inputLengths与probsDesc的第一维不一致。

  • workSpaceSizeInBytes不足。

  • labelLengths大于256。

MCDNN_STATUS_NOT_SUPPORTED

选择了浮点以外的计算或数据类型,或者选择了未知算法类型。

7.2.1.13. mcdnnGetCTCLossWorkspaceSize_v8()

此函数返回用户应分配的GPU内存工作空间量,以便能够使用指定算法来调用mcdnnCTCLoss_v8()函数。然后,分配的工作空间将传入mcdnnCTCLoss_v8()函数。

mcdnnStatus_t mcdnnGetCTCLossWorkspaceSize_v8(
    mcdnnHandle_t                        handle,
    mcdnnCTCLossAlgo_t                   algo,
    const   mcdnnCTCLossDescriptor_t     ctcLossDesc,
    const   mcdnnTensorDescriptor_t      probsDesc,
    const   mcdnnTensorDescriptor_t      gradientsDesc,
    size_t                              *sizeInBytes)

参数

handle

输入。已创建的mcDNN上下文的句柄。

algo

输入。指定所选CTC损失算法的枚举。

ctcLossDesc

输入。已初始化的CTC损失描述符的句柄。

probsDesc

输入。已初始化的概率张量描述符的句柄。

gradientsDesc

输入。已初始化的梯度张量描述符的句柄。

sizeInBytes

输出。作为工作空间所需的GPU内存量,以便能够使用指定的算法执行CTC损失计算。

返回值

MCDNN_STATUS_SUCCESS

查询成功。

MCDNN_STATUS_BAD_PARAM

需满足以下条件:

  • probsDesc的维度与gradientsDesc的维度不匹配。

MCDNN_STATUS_NOT_SUPPORTED

选择了浮点以外的计算或数据类型,或者选择了未知算法类型。

7.2.1.14. mcdnnMultiHeadAttnBackwardData()

此函数根据其输入来计算多头注意力块的精确一阶导数:Q、K、V 。如果 y = F (x)是代表多头注意力层的向量值(vector-valued)函数,它将某个向量 \(w\epsilon{\mathbb{R}}^{n}\) 作为输入(所有其他参数和输入均为常量),输出向量 \(y\epsilon{\mathbb{R}}^{m}\) ,然后mcdnnMultiHeadAttnBackwardData()计算 \(\left( {{\partial y}_{i}/\partial x_{j}} \right)^{T}\delta_{out}\) 的结果,其中 \(\delta_{out}\) 是关于多头注意力输出的损失函数 \(m \times 1\) 梯度。\(\delta_{out}\) 梯度通过深度学习模型的前层(prior layers)进行反向传播。 \(\partial y_{i}/\partial x_{j}\) 是F (x)的 \(m \times n\) 雅可比矩阵。通过dout参数提供输入,Q、K、V 的梯度结果写入dqueries、dkeys和dvalues缓冲区。

mcdnnStatus_t mcdnnMultiHeadAttnBackwardData(
    mcdnnHandle_t handle,
    const mcdnnAttnDescriptor_t attnDesc,
    const int loWinIdx[],
    const int hiWinIdx[],
    const int devSeqLengthsDQDO[],
    const int devSeqLengthsDKDV[],
    const mcdnnSeqDataDescriptor_t doDesc,
    const void *dout,
    const mcdnnSeqDataDescriptor_t dqDesc,
    void *dqueries,
    const void *queries,
    const mcdnnSeqDataDescriptor_t dkDesc,
    void *dkeys,
    const void *keys,
    const mcdnnSeqDataDescriptor_t dvDesc,
    void *dvalues,
    const void *values,
    size_t weightSizeInBytes,
    const void *weights,
    size_t workSpaceSizeInBytes,
    void *workSpace,
    size_t reserveSpaceSizeInBytes,
    void *reserveSpace);

mcdnnMultiHeadAttnBackwardData()函数不输出残差连接的偏导数,因为该结果等于 \(\delta_{out}\) 。如果多头注意力模型启用直接来自Q的残差连接,则需要将dout张量添加到dqueries中,以获得后者的正确结果。此操作在mcDNN

必须在mcdnnMultiHeadAttnForward()之后调用mcdnnMultiHeadAttnBackwardData()函数。oWinIdx[]、hiWinIdx[]、queries、keys、values、weights、reserveSpace参数应与mcdnnMultiHeadAttnForward()调用中的参数相同。 devSeqLengthsDQDO[]和devSeqLengthsDKDV[]设备数组应包含与前向函数调用中的devSeqLengthsQO[]和devSeqLengthsKV[]数组相同的起始和结束注意力窗口索引。

备注

mcdnnMultiHeadAttnBackwardData()不验证存储在devSeqLengthsDQDO[]和devSeqLengthsDKDV[]中的序列长度是否包含与相应序列数据描述符中的seqLengthArray[]相同的设置。

参数

handle

输入。当前的mcDNN上下文句柄。

attnDesc

输入。已初始化的注意力描述符。

loWinIdx[], hiWinIdx[]

输入。两个主机整数组,指定每个Q时间步的注意力窗口的起始和结束索引。 包含K,V集合中的起始索引,而不包含结束索引。

devSeqLengthsDQDO[]

输入。设备数组,包含dqDesc或doDesc序列数据描述符中序列长度数组的拷贝。

devSeqLengthsDKDV[]

输入。设备数组,包含dkDesc或dvDesc序列数据描述符中序列长度数组的拷贝。

doDesc

输入。\(\delta_{out}\) 梯度的描述符(关于多头注意力输出的损失函数偏导数向量)。

dout

指向设备内存中 \(\delta_{out}\) 梯度数据的指针。

dqDesc

输入。queries和dqueries序列数据的描述符。

dqueries

输出。设备指针,指向关于queries向量的计算损失函数梯度。

queries

输入。指向设备内存中queries数据的指针。这与mcdnnMultiHeadAttnForward()中的输入相同。

dkDesc

输入。keys和dkeys序列数据的描述符。

dkeys

输出。设备指针,指向关于keys向量的计算损失函数梯度。

keys

输入。指向设备内存中keys数据的指针。这与mcdnnMultiHeadAttnForward()中的输入相同。

dvDesc

输入。values和dvalues序列数据的描述符。

dvalues

输出。设备指针,指向关于values向量的计算损失函数梯度。

values

输入。指向设备内存中values数据的指针。这与mcdnnMultiHeadAttnForward()中的输入相同。

weightSizeInBytes

输入。权重缓冲区的大小(以字节为单位),存储了所有多头注意力可训练参数。

weights

输入。设备内存中权重缓冲区的地址。

workSpaceSizeInBytes

输入。用于临时API存储的工作空间缓冲区大小(以字节为单位)。

workSpace

输入/输出。设备内存中工作空间缓冲区的地址。

reserveSpaceSizeInBytes

输入。用于在正向和反向(梯度)API调用之间进行数据交换的预留空间缓冲区大小(以字节为单位)。

reserveSpace

输入/输出。设备内存中预留空间缓冲区的地址。

返回值

MCDNN_STATUS_SUCCESS

处理API输入参数和启动GPU内核时,未检测到错误。

MCDNN_STATUS_BAD_PARAM

遇到一个无效或不兼容的输入参数。

MCDNN_STATUS_EXECUTION_FAILED

启动GPU内核的过程返回错误,或之前的内核未成功完成。

MCDNN_STATUS_INTERNAL_ERROR

内部状态不一致。

MCDNN_STATUS_NOT_SUPPORTED

请求的选项或输入参数组合不受支持。

MCDNN_STATUS_ALLOC_FAILED

共享内存不足,无法启动GPU内核。

7.2.1.15. mcdnnMultiHeadAttnBackwardWeights()

此函数根据其可训练参数(投影权重和投影bias)来计算多头注意力块的精确一阶导数。 如果 y = F (w)是代表多头注意力层的向量值(vector-valued)函数,它将某个平展权重或bias的向量 \(x\epsilon{\mathbb{R}}^{n}\) 作为输入(所有其他参数和输入均为固定的),输出向量 \(y\epsilon{\mathbb{R}}^{m}\) ,然后mcdnnMultiHeadAttnBackwardWeights()计算 \(\left( {{\partial y}_{i}/\partial x_{j}} \right)^{T}\delta_{out}\) 的结果,其中 \(\delta_{out}\) 是关于多头注意力输出的损失函数 \(m \times 1\) 梯度。 \(\delta_{out}\) 梯度通过深度学习模型的前层(prior layers)进行反向传播。\(\partial y_{i}/\partial x_{j}`是F (x)的 :math:`m \times n\) 雅可比矩阵。\(\delta_{out}\) 输入通过dout参数提供。

mcdnnStatus_t mcdnnMultiHeadAttnBackwardWeights(
    mcdnnHandle_t handle,
    const mcdnnAttnDescriptor_t attnDesc,
    mcdnnWgradMode_t addGrad,
    const mcdnnSeqDataDescriptor_t qDesc,
    const void *queries,
    const mcdnnSeqDataDescriptor_t kDesc,
    const void *keys,
    const mcdnnSeqDataDescriptor_t vDesc,
    const void *values,
    const mcdnnSeqDataDescriptor_t doDesc,
    const void *dout,
    size_t weightSizeInBytes,
    const void *weights,
    void *dweights,
    size_t workSpaceSizeInBytes,
    void *workSpace,
    size_t reserveSpaceSizeInBytes,
    void *reserveSpace);

有关权重和bias的所有梯度结果都写入dweights缓冲区。dweights缓冲区的大小和组织与包含多头注意力权重和bias的weights缓冲区相同。mcDNN

关于权重或bias的损失函数梯度通常在多batch上计算。在这种情况下,应将每个batch中计算的结果相加。addGrad参数指定是否应将当前batch的梯度添加到已计算的结果中,或者是否应使用新结果覆盖dweights缓冲区。

必须在mcdnnMultiHeadAttnBackwardData()之后调用mcdnnMultiHeadAttnBackwardWeights()函数。 queries、keys、values、weights、reserveSpace参数应与mcdnnMultiHeadAttnForward()和mcdnnMultiHeadAttnBackwardData()调用中的参数相同。dout参数应与mcdnnMultiHeadAttnBackwardData()中的参数相同。

参数

handle

输入。当前的mcDNN上下文句柄。

attnDesc

输入。已初始化的注意力描述符。

addGrad

输入。权重梯度输出模式。

qDesc

输入。queries序列数据的描述符。

queries

输入。指向设备内存中queries序列数据的指针。

kDesc

输入。keys序列数据的描述符。

keys

输入。指向设备内存中keys序列数据的指针。

vDesc

输入。values序列数据的描述符。

values

输入。指向设备内存中values序列数据的指针。

doDesc

输入。\(\delta_{out}\) 梯度的描述符(关于多头注意力输出的损失函数偏导数向量)。

dout

输入。指向设备内存中 \(\delta_{out}\) 梯度数据的指针。

weightSizeInBytes

输入。weights和dweights缓冲区的大小(以字节为单位)。

weights

输入。设备内存中权重缓冲区的地址。

dweights

输出。设备内存中权重梯度缓冲区的地址。

workSpaceSizeInBytes

输入。用于临时API存储的工作空间缓冲区大小(以字节为单位)。

workSpace

输入/输出。设备内存中工作空间缓冲区的地址。

reserveSpaceSizeInBytes

输入。用于在正向和反向(梯度)API调用之间进行数据交换的预留空间缓冲区大小(以字节为单位)。

reserveSpace

输入/输出。设备内存中预留空间缓冲区的地址。

返回值

MCDNN_STATUS_SUCCESS

处理API输入参数和启动GPU内核时,未检测到错误。

MCDNN_STATUS_BAD_PARAM

遇到一个无效或不兼容的输入参数。

MCDNN_STATUS_EXECUTION_FAILED

启动GPU内核的过程返回错误,或之前的内核未成功完成。

MCDNN_STATUS_INTERNAL_ERROR

内部状态不一致。

MCDNN_STATUS_NOT_SUPPORTED

请求的选项或输入参数组合不受支持。

7.2.1.16. mcdnnRNNBackwardData()

使用mcdnnRNNBackwardData_v8()代替mcdnnRNNBackwardData()。

mcdnnStatus_t mcdnnRNNBackwardData(
    mcdnnHandle_t                   handle,
    const mcdnnRNNDescriptor_t      rnnDesc,
    const int                       seqLength,
    const mcdnnTensorDescriptor_t  *yDesc,
    const void                     *y,
    const mcdnnTensorDescriptor_t  *dyDesc,
    const void                     *dy,
    const mcdnnTensorDescriptor_t   dhyDesc,
    const void                     *dhy,
    const mcdnnTensorDescriptor_t   dcyDesc,
    const void                     *dcy,
    const mcdnnFilterDescriptor_t   wDesc,
    const void                     *w,
    const mcdnnTensorDescriptor_t   hxDesc,
    const void                     *hx,
    const mcdnnTensorDescriptor_t   cxDesc,
    const void                     *cx,
    const mcdnnTensorDescriptor_t  *dxDesc,
    void                           *dx,
    const mcdnnTensorDescriptor_t   dhxDesc,
    void                           *dhx,
    const mcdnnTensorDescriptor_t   dcxDesc,
    void                           *dcx,
    void                           *workspace,
    size_t                          workSpaceSizeInBytes,
    const void                     *reserveSpace,
    size_t                          reserveSpaceSizeInBytes)

此函数执行rnnDesc描述的循环神经网络,输出梯度为dy、dhy、dhc,权重为w,输入梯度为dx、dhx、dcx。需要工作空间用于中间存储。reserveSpace中的数据必须已由mcdnnRNNForwardTraining()生成。如果将来在相同的输入数据上执行mcdnnRNNBackwardWeights()调用,则必须使用相同的reserveSpace数据。

参数

handle

输入。已创建的mcDNN上下文的句柄。更多信息,参见mcdnnHandle_t。

rnnDesc

输入。已初始化的RNN描述符。更多信息,参见mcdnnRNNDescriptor_t。

seqLength

输入。要展开的迭代次数。seqLength的值不能超过mcdnnGetRNNWorkspaceSize()函数中用于查询执行RNN所需的工作空间大小。

yDesc

输入。完全压缩的张量描述符数组,描述每个循环迭代输出(一个迭代一个描述符)。更多信息,参见mcdnnTensorDescriptor_t。 张量的第二维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第二维应与hiddenSize参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第二维应是hiddenSize参数的2倍。

张量n的第一维必须与dyDesc中张量n的第一维匹配。

y

输入。数据指针,指向与输出张量描述符yDesc关联的GPU内存。

dyDesc

输入。完全压缩的张量描述符数组,描述每个循环迭代输出梯度(一个迭代一个描述符)。张量的第二维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第二维应与hiddenSize参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第二维应是hiddenSize参数的2倍。

张量n的第一维必须与dxDesc中张量n的第一维匹配。

dy

输入。数据指针,指向与dyDesc数组中张量描述符关联的GPU内存。

dhyDesc

输入。完全压缩的张量描述符,描述RNN的最终隐藏状态梯度。张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc所描述张量的第一维匹配。第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

dhy

输入。数据指针,指向与张量描述符dhyDesc关联的GPU内存。如果传入NULL指针,则网络的初始隐藏状态梯度将初始化为零。

dcyDesc

输入。完全压缩的张量描述符,描述RNN的最终单元状态梯度。张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc所描述张量的第一维匹配。第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

dcy

输入。数据指针,指向与张量描述符dcyDesc关联的GPU内存。如果传入NULL指针,则网络的初始单元状态梯度将初始化为零。

wDesc

输入。已初始化的卷积核描述符的句柄,描述RNN权重。更多信息,参见mcdnnFilterDescriptor_t。

w

输入。数据指针,指向与卷积核描述符wDesc关联的GPU内存。

hxDesc

输入。完全压缩的张量描述符,描述RNN的初始隐藏状态(initial hidden state)。张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc所描述张量的第二维匹配。第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

hx

输入。数据指针,指向与张量描述符hxDesc关联的GPU内存。如果传入NULL指针,则网络的初始隐藏状态将初始化为零。

cxDesc

输入。完全压缩的的张量描述符,描述LSTM网络的初始单元(cell)状态。张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc所描述张量的第二维匹配。第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

cx

输入。数据指针,指向与张量描述符cxDesc关联的GPU内存。如果传入NULL指针,则网络的初始单元状态将初始化为零。

dxDesc

输入。完全压缩的张量描述符数组,描述每个循环迭代输入梯度(一个迭代一个描述符)。张量的第一维(批大小)可能从元素n减少到元素n+1,但可能不会增加。每个张量描述符必须具有相同的第二维(向量长度)。

dx

输出。数据指针,指向与dxDesc数组中张量描述符关联的GPU内存。

dhxDesc

输入。完全压缩的张量描述符,描述RNN的初始隐藏状态梯度。张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc所描述张量的第一维匹配。第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

dhx

输出。数据指针,指向与张量描述符dhxDesc关联的GPU内存。如果传入NULL指针,将不会设置网络的隐藏输入梯度。

dcxDesc

输入。完全压缩的张量描述符,描述RNN的初始单元状态梯度。张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc所描述张量的第一维匹配。第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

dcx

输出。数据指针,指向与张量描述符dcxDesc关联的GPU内存。如果传入NULL指针,将不会设置网络的单元输入梯度。

workspace

输入。数据指针,指向要用作此调用工作空间的GPU内存。

workSpaceSizeInBytes

输入。指定已提供的workspace大小(以字节为单位)。

reserveSpace

输入/输出。数据指针,指向要用作此调用预留空间的GPU内存。

reserveSpaceSizeInBytes

输入。指定已提供的reserveSpace的大小(以字节为单位)。

返回值

MCDNN_STATUS_SUCCESS

此函数启用成功。

MCDNN_STATUS_NOT_SUPPORTED

此函数不支持已提供的配置。

MCDNN_STATUS_BAD_PARAM

需至少满足以下任一条件:

  • rnnDesc描述符无效。

  • dhxDesc、wDesc、hxDesc、cxDesc、dcxDesc、dhyDesc或dcyDesc描述符中或者yDesc、dxdesc、dydesc描述符中至少有一个是无效的。

  • yDesc、dxDesc、dyDesc、dhxDesc、wDesc、hxDesc、cxDesc、dcxDesc、dhyDesc或dcyDesc的步幅或维度不正确。

  • workSpaceSizeInBytes太小。

  • reserveSpaceSizeInBytes太小。

MCDNN_STATUS_INVALID_VALUE

在RNN描述符中选择MCDNN_RNN_ALGO_PERSIST_DYNAMIC时,在当前函数之前未调用mcdnnSetPersistentRNNPlan()。

MCDNN_STATUS_MAPPING_ERROR

GPU/MXMACA资源(如纹理对象,共享内存或零拷贝内存)没有所需的空间,或者用户资源与mcDNN内部资源不匹配。例如,在调用mcdnnSetStream()时,可能会出现资源不匹配。调用mcdnnCreate()时,用户提供的MXMACA流与mcDNN句柄中实例化的内部MXMACA事件之间可能不匹配。

此错误状态与纹理尺寸,共享内存大小或零拷贝内存可用性相关时,可能无法纠正。如果mcdnnSetStream()返回MCDNN_STATUS_MAPPING_ERROR,则通常是可纠正的,但是,这意味着mcDNN句柄是在一个GPU上创建的,且传入此函数的用户流与另一个GPU相关联。

MCDNN_STATUS_EXECUTION_FAILED

此函数在GPU上启用失败。

MCDNN_STATUS_ALLOC_FAILED

此函数不能用来分配内存。

7.2.1.17. mcdnnRNNBackwardData_v8()

此函数根据RNN模型的输入计算精确的一阶导数:x、hx和LSTM单元typealsocx。如果o = [y, hy, cy] = F(x, hx, cx) = F(z)是表示整个RNN模型的向量值函数,它将向量x(对于所有时间步)和向量hx、cx(对于所有层)作为连接到 \(z\epsilon{\mathbb{R}}^{n}\) 的输入(假设网络权重和bias为常量),并输出连接到向量 \(o\epsilon{\mathbb{R}}^{m}\) 的向量y、hy、cy,然后mcdnnRNNBackwardData_v8()计算 \(\left( {{\partial o}_{i}/\partial z_{j}} \right)^{T}\delta_{out}\) 的结果,其中 \(\delta_{out}\) 是关于所有RNN输出的损失函数 \(m \times 1\) 梯度。 \(\delta_{out}\) 梯度通过深度学习模型的前层进行反向传播,从模型输出开始。 \(\partial o_{i}/\partial z_{j}\) 是F (z)的 \(m \times n\) 雅可比矩阵。 \(\delta_{out}\) 输入通过dy、dhy和dcy参数提供,梯度结果 \(\left( {{\partial o}_{i}/\partial z_{j}} \right)^{T}\delta_{out}\) 写入dx、dhx和dcx缓冲区。

mcdnnStatus_t mcdnnRNNBackwardData_v8(
    mcdnnHandle_t handle,
    mcdnnRNNDescriptor_t rnnDesc,
    const int32_t devSeqLengths[],
    mcdnnRNNDataDescriptor_t yDesc,
    const void *y,
    const void *dy,
    mcdnnRNNDataDescriptor_t xDesc,
    void *dx,
    mcdnnTensorDescriptor_t hDesc,
    const void *hx,
    const void *dhy,
    void *dhx,
    mcdnnTensorDescriptor_t cDesc,
    const void *cx,
    const void *dcy,
    void *dcx,
    size_t weightSpaceSize,
    const void *weightSpace,
    size_t workSpaceSize,
    void *workSpace,
    size_t reserveSpaceSize,
    void *reserveSpace);

多层RNN模型中的x、y、hx、cx、hy、cy、dx、dy、dhx、dcx、dhy和dcy信号的位置如下图所示。请注意,mcdnnRNNBackwardData_v8()函数不会暴露内部RNN信号(在时间步之间和层之间)。

../_images/dnnRNNBackwardData_v8.jpg

图 7.1 多层RNN模型中的x、y、hx、cx、hy、cy、dx、dy、dhx、dcx、dhy和dcy信号的位置

主RNN输出y的内存地址,初始隐藏状态hx和初始单元状态cx(仅限LSTM)应指向与前面mcdnnRNNForward()调用相同的数据。dy和dx指针不能为NULL。

mcdnnRNNBackwardData_v8()函数接受dhy、dhx、dcy、dcx缓冲区地址任意组合为NULL。当dhy或dcy为NULL时,假定这些输入为零。当dhx或dcx指针为NULL时,则mcdnnRNNBackwardData_v8()不会写对应的结果。

当所有hx、dhy、dhx指针都为NULL时,相应的张量描述符hDesc也可以为NULL。同样的规则适用于cx,dcy,dcx指针和cDesc张量描述符。

mcdnnRNNBackwardData_v8()函数允许用户对输入y、dy和输出dx使用非压缩(填充)布局。在压缩或非压缩布局(MCDNN_RNN_DATA_LAYOUT_SEQ_MAJOR_UNPACKED、MCDNN_RNN_DATA_LAYOUT_BATCH_MAJOR_UNPACKED)中,mini-batch中的每个向量序列都有固定长度,是由mcdnnSetRNNDataDescriptor()函数中的maxSeqLength参数定义的。“非压缩”在此处指填充向量的存在,而不是连续向量之间未使用的地址范围。

每个已填充的固定长度序列都从一段有效向量开始。有效的向量计数存储在传入mcdnnSetRNNDataDescriptor()的seqLengthArray中,这样对于mini-batch中的所有序列,0 < seqLengthArray[i] <= maxSeqLength,即对于i=0..batchSize-1。其余填充向量使组合序列长度等于maxSeqLength。支持sequence-major和batch-major填充布局。

此外,用户可以选择sequence-major压缩布局:MCDNN_RNN_DATA_LAYOUT_SEQ_MAJOR_PACKED。 在后一种布局中,mini-batch中的向量序列根据序列长度按降序排序存储。首先,存储时间步为零的所有向量。然后存储时间步为1的向量,依此类推。此布局不使用填充矢量。

必须在xDesc和yDesc描述符中指定相同的布局类型。

RNN数据描述符xDesc和yDesc中名为seqLengthArray的两个主机数组必须相同。此外,必须通过devSeqLengths参数传递设备内存中seqLengthArray的拷贝。此数组直接提供给GPU内核。mcdnnRNNBackwardData_v8()函数不用于验证存储在GPU内存中devSeqLengths中的序列长度与CPU内存中xDesc和yDesc描述符中的是否相同。但是,会检查xDesc和yDesc描述符中的序列长度数组是否一致。

必须在mcdnnRNNForward()之后调用mcdnnRNNBackwardData_v8()函数。调用mcdnnRNNForward()函数时,应将mcdnnRNNForward()类型的fwdMode参数设置为MCDNN_FWD_MODE_TRAINING。

参数

handle

输入。当前的mcDNN上下文句柄。

rnnDesc

输入。已初始化的RNN描述符。

devSeqLengths

输入。RNN数据描述符xDesc或yDesc中seqLengthArray的拷贝。devSeqLengths数组必须存储在GPU内存中,因为该数组可能在mcdnnRNNBackwardData_v8()函数之后,被GPU内核异步访问。此参数不能为NULL。

yDesc

输入。与RNN模型主输出对应的已初始化的描述符。dataType、layout、maxSeqLength、batchSize和seqLengthArray必须与xDesc中的匹配。

y, dy

输入。指向GPU缓冲区的数据指针,该缓冲区包含RNN模型的主输出和梯度增量(关于y的损失函数梯度)。y输出应由前面的mcdnnRNNForward()调用产生。y和dy向量应根据yDesc指定的布局在内存中排列。张量中的元素(包括填充向量元素)必须紧密压缩。y和dy参数不能为NULL。

xDesc

输入。已初始化的RNN数据描述符,该描述符对应于与RNN主模型输入相关的损失函数梯度。dataType、layout、maxSeqLength、batchSize和seqLengthArray必须与yDesc中的匹配。vectorSize参数必须与传入mcdnnSetRNNDescriptor_V8函数的inputSize参数匹配。

dx

输出。指向GPU内存的数据指针,该内存中应存储与RNN主输入x相关的损失函数反向传播梯度。向量应根据xDesc指定的布局在内存中排列。张量中的元素(包括填充向量)必须紧密压缩。此参数不能为NULL。

hDesc

输入。张量描述符,描述初始RNN隐藏状态hx和关于最终隐藏状态初始值的损失函数的梯度。隐藏状态数据和相应的梯度为完全压缩格式。 张量的第一维取决于传入mcdnnSetRNNDescriptor_v8()函数的dirMode参数。

  • 如果dirMode为MCDNN_UNIDIRECTIONAL,则第一维应与传入mcdnnSetRNNDescriptor_v8()的numLayers参数匹配。

  • 如果dirMode为MCDNN_BIDIRECTIONAL,则第一维应是传入mcdnnSetRNNDescriptor_v8()的numLayers参数的2倍。

第二维必须与xDesc中描述的batchSize参数匹配。 第三维取决于RNN模式是否为MCDNN_LSTM以及是否启用了LSTM投影。具体而言:

  • 如果RNN模式为MCDNN_LSTM且启用了LSTM投影,则第三维必须与传入mcdnnSetRNNDescriptor_v8()调用的projSize参数匹配。

  • 否则,第三维必须与传入mcdnnSetRNNDescriptor_v8()调用的hiddenSize参数匹配,其中mcdnnSetRNNDescriptor_v8()是用于初始化rnnDesc。

hx, dhy

输入。包含RNN初始隐藏状态hx和梯度增量dhy的GPU缓冲区地址。数据维度由hDesc张量描述符描述。如果hx或dhy参数中传入了NULL指针,则假定相应的缓冲区全为零。

dhx

输出。指向GPU缓冲区的指针,该缓冲区应存储与初始隐藏状态变量对应的一阶导数。数据维度由hDesc张量描述符描述。如果将NULL指针分配给dhx,则不会保存反向传播导数。

cDesc

输入。仅适用于LSTM网络。张量描述符,描述初始单元状态cx和关于最终单元状态初始值的损失函数的梯度。单元状态数据为完全压缩格式。 张量的第一维取决于传入mcdnnSetRNNDescriptor_v8()函数的dirMode参数。

如果dirMode为MCDNN_UNIDIRECTIONAL,则第一维应与传入mcdnnSetRNNDescriptor_v8()的numLayers参数匹配。 如果dirMode为MCDNN_BIDIRECTIONAL,则第一维应是传入mcdnnSetRNNDescriptor_v8()的numLayers参数的2倍。

第二维必须与xDesc中描述的batchSize参数匹配。 否则,第三维必须与传入mcdnnSetRNNDescriptor_v8()调用的hiddenSize参数匹配。

cx, dcy

输入。仅适用于LSTM网络。包含初始LSTM状态数据cx和梯度增量dcy的GPU缓冲区地址。数据维度由cDesc张量描述符描述。如果cx或dcy参数中传入了NULL指针,则假定相应的缓冲区全为零。

dcx

输出。仅适用于LSTM网络。指向GPU缓冲区的指针,该缓冲区应存储与初始LSTM状态变量对应的一阶导数。数据维度由cDesc张量描述符描述。如果将NULL指针分配给dcx,则不会保存反向传播导数。

weightSpaceSize

输入。指定已提供的权重空间缓冲区的大小(以字节为单位)。

weightSpace

输入。GPU内存中权重空间缓冲区的地址。

workSpaceSize

输入。指定已提供的工作空间缓冲区的大小(以字节为单位)。

workSpace

输入/输出。GPU内存中用于存储临时数据的工作空间缓冲区地址。

reserveSpaceSize

输入。指定预留空间缓冲区的大小(以字节为单位)。

reserveSpace

输入/输出。GPU内存中预留空间缓冲区的地址。

返回值

MCDNN_STATUS_SUCCESS

处理API输入参数和启动GPU内核时,未检测到错误。

MCDNN_STATUS_NOT_SUPPORTED

需至少满足以下任一条件:

  • 在指定MCDNN_RNN_ALGO_PERSIST_STATIC或MCDNN_RNN_ALGO_PERSIST_DYNAMIC时,传入变量序列长度输入

  • 在pre-Pascal设备上请求MCDNN_RNN_ALGO_PERSIST_STATIC或MCDNN_RNN_ALGO_PERSIST_DYNAMICC

  • “double” 浮点类型用于输入/输出和MCDNN_RNN_ALGO_PERSIST_STATIC算法

MCDNN_STATUS_BAD_PARAM

遇到一个无效或不兼容的输入参数。例如:

  • 一些输入描述符为NULL

  • rnnDesc、xDesc、yDesc、hDesc或cDesc描述符中的设置无效

  • weightSpaceSize、workSpaceSize或reserveSpaceSize太小。

MCDNN_STATUS_MAPPING_ERROR

GPU/MXMACA资源(如纹理对象,共享内存或零拷贝内存)没有所需的空间,或者用户资源与mcDNN内部资源不匹配。例如,在调用mcdnnSetStream()时,可能会出现资源不匹配。调用mcdnnCreate()时,用户提供的MXMACA流与mcDNN句柄中实例化的内部MXMACA事件之间可能不匹配。

此错误状态与纹理尺寸,共享内存大小或零拷贝内存可用性相关时,可能无法纠正。如果mcdnnSetStream()返回MCDNN_STATUS_MAPPING_ERROR,则通常是可纠正的,但是,这意味着mcDNN句柄是在一个GPU上创建的,且传入此函数的用户流与另一个GPU相关联。

MCDNN_STATUS_EXECUTION_FAILED

启动GPU内核的过程返回错误,或之前的内核未成功完成。

MCDNN_STATUS_ALLOC_FAILED

此函数不能用来分配CPU内存。

7.2.1.18. mcdnnRNNBackwardDataEx()

使用mcdnnRNNBackwardData_v8()代替mcdnnRNNBackwardDataEx()。

mcdnnStatus_t mcdnnRNNBackwardDataEx(
    mcdnnHandle_t                     handle,
    const mcdnnRNNDescriptor_t        rnnDesc,
    const mcdnnRNNDataDescriptor_t    yDesc,
    const void                        *y,
    const mcdnnRNNDataDescriptor_t    dyDesc,
    const void                        *dy,
    const mcdnnRNNDataDescriptor_t    dcDesc,
    const void                        *dcAttn,
    const mcdnnTensorDescriptor_t     dhyDesc,
    const void                        *dhy,
    const mcdnnTensorDescriptor_t     dcyDesc,
    const void                        *dcy,
    const mcdnnFilterDescriptor_t     wDesc,
    const void                        *w,
    const mcdnnTensorDescriptor_t     hxDesc,
    const void                        *hx,
    const mcdnnTensorDescriptor_t     cxDesc,
    const void                        *cx,
    const mcdnnRNNDataDescriptor_t    dxDesc,
    void                              *dx,
    const mcdnnTensorDescriptor_t     dhxDesc,
    void                              *dhx,
    const mcdnnTensorDescriptor_t     dcxDesc,
    void                              *dcx,
    const mcdnnRNNDataDescriptor_t    dkDesc,
    void                              *dkeys,
    void                              *workSpace,
    size_t                            workSpaceSizeInBytes,
    void                              *reserveSpace,
    size_t                            reserveSpaceSizeInBytes)

该函数是mcdnnRNNBackwardData()函数的扩展版本。mcdnnRNNBackwardDataEx()函数允许用户对输入y和输出dx使用非压缩(填充)布局。

在非压缩布局中,mini-batch中的每个序列都被视为固定长度,由其对应的RNNDataDescriptor中的maxSeqLength指定。每个固定长度序列(例如,mini-batch中的第n个序列)都由一个有效段(由其对应的RNNDataDescriptor中的seqLengthArray[n]指定)和一个填充段组成,使组合序列长度等于maxSeqLength。

对于非压缩布局,同时支持序列主要(sequence-major)布局(即,时间主要)和批主要(batch-major)布局。为了向后兼容,支持压缩的序列主要布局。但是,与非扩展函数mcdnnRNNBackwardData()类似,mini-batch中的序列需要根据长度按降序排序。

参数

handle

输入。已创建的上下文的句柄。此函数保留API,不再单独实现。

rnnDesc

输入。已初始化的RNN描述符。

yDesc

输入。已初始化的RNN数据描述符。必须与已传入mcdnnRNNForwardTrainingEx()的描述符匹配或完全相同。

y

输入。数据指针,指向与RNN数据描述符yDesc关联的GPU内存。向量应根据yDesc指定的布局在内存中排布。张量中的元素(包括填充向量中的元素)必须紧密压缩,且不支持步幅。必须包含与mcdnnRNNForwardTrainingEx()已生成的完全相同的数据。

dyDesc

输入。已初始化的RNN数据描述符。dataType、layout、maxSeqLength、batchSize、vectorSize和seqLengthArray需要与已传入mcdnnRNNForwardTrainingEx()的yDesc匹配。

dy

输入。数据指针,指向与RNN数据描述符dyDesc关联的GPU内存。向量应根据dyDesc指定的布局在内存中排布。张量中的元素(包括填充向量中的元素)必须紧密压缩,且不支持步幅。

dhyDesc

输入。完全压缩的张量描述符,描述RNN的最终隐藏状态梯度。 张量的第一维取决于初始化rnnDesc的方向参数。此外:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc中描述的batchSize参数匹配。 第三维取决于RNN模式是否为MCDNN_LSTM以及是否启用了LSTM投影。此外:

  • 如果RNN模式为MCDNN_LSTM且启用了LSTM投影,则第三维必须与传入mcdnnSetRNNProjectionLayers()调用的recProjSize参数匹配,其中mcdnnSetRNNProjectionLayers()是用于设置rnnDesc的。

  • 否则,第三维必须与初始化rnnDesc的hiddenSize参数匹配。

dhy

输入。数据指针,指向与张量描述符dhyDesc关联的GPU内存。如果传入NULL指针,则网络的初始隐藏状态梯度将初始化为零。

dcyDesc

输入。完全压缩的张量描述符,描述RNN的最终单元状态梯度。 张量的第一维取决于初始化rnnDesc的方向参数。此外:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc所描述张量的第一维匹配。 第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

dcy

输入。数据指针,指向与张量描述符dcyDesc关联的GPU内存。如果传入NULL指针,则网络的初始单元状态梯度将初始化为零。

wDesc

输入。已初始化的卷积核描述符的句柄,描述RNN权重。

w

输入。数据指针,指向与卷积核描述符wDesc关联的GPU内存。

hxDesc

输入。完全压缩的张量描述符,描述RNN的初始隐藏状态(initial hidden state)。必须与已传入mcdnnRNNForwardTrainingEx()的描述符匹配或完全相同。

hx

输入。数据指针,指向与张量描述符hxDesc关联的GPU内存。如果传入NULL指针,则网络的初始隐藏状态将初始化为零。必须包含与已传入mcdnnRNNForwardTrainingEx()的完全相同的数据,或者如果已将NULL传入mcdnnRNNForwardTrainingEx(),则必须为NULL。

cxDesc

输入。完全压缩的的张量描述符,描述LSTM网络的初始单元(cell)状态。必须与已传入mcdnnRNNForwardTrainingEx()的描述符匹配或完全相同。

cx

输入。数据指针,指向与张量描述符cxDesc关联的GPU内存。如果传入NULL指针,则网络的初始单元状态将初始化为零。必须包含与已传入mcdnnRNNForwardTrainingEx()的完全相同的数据,或者如果已将NULL传入mcdnnRNNForwardTrainingEx(),则必须为NULL。

dxDesc

输入。已初始化的RNN数据描述符。dataType、layout、maxSeqLength、batchSize、vectorSize和seqLengthArray需要与已传入mcdnnRNNForwardTrainingEx()的xDesc匹配。

dx

输出。数据指针,指向与RNN数据描述符dxDesc关联的GPU内存。向量应根据dxDesc指定的布局在内存中排布。张量中的元素(包括填充向量中的元素)必须紧密压缩,且不支持步幅。

dhxDesc

输入。完全压缩的张量描述符,描述RNN的初始隐藏状态梯度。此描述符的设置必须与dhyDesc完全一致。

dhx

输出。数据指针,指向与张量描述符dhxDesc关联的GPU内存。如果传入NULL指针,将不会设置网络的隐藏输入梯度。

dcxDesc

输入。完全压缩的张量描述符,描述RNN的初始单元状态梯度。此描述符的设置必须与dcyDesc完全一致。

dcx

输出。数据指针,指向与张量描述符dcxDesc关联的GPU内存。如果传入NULL指针,将不会设置网络的单元输入梯度。

dkDesc

保留。用户可以传入NULL。

dkeys

保留。用户可以传入NULL。

workspace

输入。数据指针,指向要用作此调用工作空间的GPU内存。

workSpaceSizeInBytes

输入。指定已提供的workspace大小(以字节为单位)。

reserveSpace

输入/输出。数据指针,指向要用作此调用预留空间的GPU内存。

reserveSpaceSizeInBytes

输入。指定已提供的reserveSpace的大小(以字节为单位)。

返回值

MCDNN_STATUS_SUCCESS

此函数启用成功。

MCDNN_STATUS_NOT_SUPPORTED

需至少满足以下任一条件:

  • 在使用MCDNN_RNN_ALGO_PERSIST_STATIC或MCDNN_RNN_ALGO_PERSIST_DYNAMIC时,传入变量序列长度输入。

  • 在pre-Pascal设备上使用MCDNN_RNN_ALGO_PERSIST_STATIC或MCDNN_RNN_ALGO_PERSIST_DYNAMIC。

  • 双输入/输出用于MCDNN_RNN_ALGO_PERSIST_STATIC。

MCDNN_STATUS_BAD_PARAM

需至少满足以下任一条件:

  • rnnDesc描述符无效。

  • yDesc、dxDesc、dyDesc、dhxDesc、wDesc、hxDesc、cxDesc、dcxDesc、dhyDesc、dcyDesc中至少有一个描述符无效,或者步幅或维度不正确。

  • workSpaceSizeInBytes太小。

  • reserveSpaceSizeInBytes太小。

MCDNN_STATUS_INVALID_VALUE

在RNN描述符中选择MCDNN_RNN_ALGO_PERSIST_DYNAMIC时,在当前函数之前未调用mcdnnSetPersistentRNNPlan()。

MCDNN_STATUS_MAPPING_ERROR

GPU/MXMACA资源(如纹理对象,共享内存或零拷贝内存)没有所需的空间,或者用户资源与mcDNN内部资源不匹配。例如,在调用mcdnnSetStream()时,可能会出现资源不匹配。调用mcdnnCreate()时,用户提供的MXMACA流与mcDNN句柄中实例化的内部MXMACA事件之间可能不匹配。

此错误状态与纹理尺寸,共享内存大小或零拷贝内存可用性相关时,可能无法纠正。如果mcdnnSetStream()返回MCDNN_STATUS_MAPPING_ERROR,则通常是可纠正的,但是,这意味着mcDNN句柄是在一个GPU上创建的,且传入此函数的用户流与另一个GPU相关联。

MCDNN_STATUS_EXECUTION_FAILED

此函数在GPU上启用失败。

MCDNN_STATUS_ALLOC_FAILED

此函数不能用来分配内存。

7.2.1.19. mcdnnRNNBackwardWeights()

使用mcdnnRNNBackwardWeights_v8()代替mcdnnRNNBackwardWeights()。

mcdnnStatus_t mcdnnRNNBackwardWeights(
    mcdnnHandle_t                   handle,
    const mcdnnRNNDescriptor_t      rnnDesc,
    const int                       seqLength,
    const mcdnnTensorDescriptor_t  *xDesc,
    const void                     *x,
    const mcdnnTensorDescriptor_t   hxDesc,
    const void                     *hx,
    const mcdnnTensorDescriptor_t  *yDesc,
    const void                     *y,
    const void                     *workspace,
    size_t                          workSpaceSizeInBytes,
    const mcdnnFilterDescriptor_t   dwDesc,
    void                           *dw,
    const void                     *reserveSpace,
    size_t                          reserveSpaceSizeInBytes)

此函数通过输入x、hx和输出y,从rnnDesc描述的循环神经网络中累积权重梯度dw。在这种情况下,操作模式是累加的,计算出的权重梯度将添加到dw中已存在的梯度中。需要工作空间用于中间存储。reserveSpace中的数据必须已由mcdnnRNNBackwardData()生成。

参数

handle

输入。已创建的mcDNN上下文的句柄。

rnnDesc

输入。已初始化的RNN描述符。

seqLength

输入。要展开的迭代次数。seqLength的值不能超过mcdnnGetRNNWorkspaceSize()函数中用于查询执行RNN所需的工作空间大小。

xDesc

输入。完全压缩的张量描述符数组,描述每个循环迭代的输入(一个迭代一个描述符)。张量的第一维(批大小)可能从元素n减少到元素n+1,但可能不会增加。每个张量描述符必须具有相同的第二维(向量长度)。

x

输入。数据指针,指向与xDesc数组中张量描述符关联的GPU内存。

hxDesc

输入。完全压缩的张量描述符,描述RNN的初始隐藏状态(initial hidden state)。 张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc所描述张量的第一维匹配。 第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

hx

输入。数据指针,指向与张量描述符hxDesc关联的GPU内存。如果传入NULL指针,则网络的初始隐藏状态将初始化为零。

yDesc

输入。完全压缩的张量描述符数组,描述每个循环迭代输出(一个迭代一个描述符)。张量的第二维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第二维应与hiddenSize参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第二维应是hiddenSize参数的2倍。

张量n的第一维必须与dyDesc中张量n的第一维匹配。

y

输入。数据指针,指向与输出张量描述符yDesc关联的GPU内存。

workspace

输入。数据指针,指向要用作此调用工作空间的GPU内存。

workSpaceSizeInBytes

输入。指定已提供的workspace大小(以字节为单位)。

dwDesc

输入。已初始化的卷积核描述符的句柄,描述RNN权重梯度。

dw

输入/输出。数据指针,指向与卷积核描述符dwDesc关联的GPU内存。

reserveSpace

输入。数据指针,指向要用作此调用预留空间的GPU内存。

reserveSpaceSizeInBytes

输入。指定已提供的reserveSpace的大小(以字节为单位)。

返回值

MCDNN_STATUS_SUCCESS

此函数启用成功。

MCDNN_STATUS_NOT_SUPPORTED

此函数不支持已提供的配置。

MCDNN_STATUS_BAD_PARAM

需至少满足以下任一条件:

  • rnnDesc描述符无效。

  • hxDesc、dwDesc描述符中或者xDesc、yDesc描述符中至少有一个是无效的。

  • xDesc、hxDesc、yDesc、dwDesc中任一描述符的步幅或维度不正确。

  • workSpaceSizeInBytes太小。

  • reserveSpaceSizeInBytes太小。

MCDNN_STATUS_EXECUTION_FAILED

此函数在GPU上启用失败。

MCDNN_STATUS_ALLOC_FAILED

此函数不能用来分配内存。

7.2.1.20. mcdnnRNNBackwardWeights_v8()

此函数计算RNN模型中所有可训练参数(权重和bias)的一阶精确导数。 如果o = [y, hy, cy] = F(w)是代表多层RNN模型的向量值函数,它将某个平展权重或bias的向量 \(w\epsilon{\mathbb{R}}^{n}\) 作为输入(所有其他数据输入为常量),输出向量 \(o\epsilon{\mathbb{R}}^{m}\),mcdnnRNNBackwardWeights_v8()计算 \(\left( {{\partial o}_{i}/\partial w_{j}} \right)^{T}\delta_{out}\) 的结果,其中 \(\delta_{out}\) 是关于所有RNN输出的损失函数 \(m \times 1\) 梯度。\(\delta_{out}\) 梯度通过深度学习模型的前层进行反向传播,从模型输出开始。 \(\partial o_{i}/\partial w_{j}\) 是F(w)的 \(m \times n\) 雅可比矩阵。\(\delta_{out}\) 输入由mcdnnRNNBackwardData_v8()函数中的dy、dhy和dcy参数提供。

mcdnnStatus_t mcdnnRNNBackwardWeights(
    mcdnnHandle_t                   handle,
    const mcdnnRNNDescriptor_t      rnnDesc,
    const int                       seqLength,
    const mcdnnTensorDescriptor_t  *xDesc,
    const void                     *x,
    const mcdnnTensorDescriptor_t   hxDesc,
    const void                     *hx,
    const mcdnnTensorDescriptor_t  *yDesc,
    const void                     *y,
    const void                     *workspace,
    size_t                          workSpaceSizeInBytes,
    const mcdnnFilterDescriptor_t   dwDesc,
    void                           *dw,
    const void                     *reserveSpace,
    size_t                          reserveSpaceSizeInBytes)

有关权重和bias的所有 \(\left( {{\partial o}_{i}/\partial w_{j}} \right)^{T}\delta_{out}\) 梯度结果都写入dweightSpace缓冲区。 dweightSpace缓冲区的大小和组织与包含RNN权重和bias的weightSpace缓冲区相同。

关于权重和bias的损失函数梯度通常在多个mini-batch上计算。在这种情况下,应将每个mini-batch中计算的结果相加。addGrad参数指定是否应将当前mini-batch的梯度添加到已计算的结果中(MCDNN_WGRAD_MODE_ADD),或者是否应使用新结果覆盖dweightSpace缓冲区(MCDNN_WGRAD_MODE_SET)。目前,mcdnnRNNBackwardWeights_v8()函数仅支持MCDNN_WGRAD_MODE_ADD模式,因此用户应在首次调用函数之前将dweightSpace缓冲区归零。

必须在xDesc描述符和设备数组devSeqLengths中配置相同的序列长度。必须在mcdnnRNNBackwardData()之后调mcdnnRNNBackwardWeights_v8()函数。

参数

handle

输入。当前的mcDNN上下文句柄。

rnnDesc

输入。已初始化的RNN描述符。

addGrad

输入。权重梯度输出模式。更多信息,参见mcdnnWgradMode_t枚举类型的说明。目前,mcdnnRNNBackwardWeights_v8()函数仅支持MCDNN_WGRAD_MODE_ADD模式。

devSeqLengths

输入。RNN数据描述符xDesc中seqLengthArray的拷贝。devSeqLengths数组必须存储在GPU内存中,因为该数组可能在mcdnnRNNBackwardWeights_v8()函数之后,被GPU内核异步访问。

xDesc

输入。与RNN模型输入数据对应的已初始化的描述符。此描述符与前面的mcdnnRNNForward()和mcdnnRNNBackwardData_v8()调用中使用的RNN数据描述符相同。

x

输入。指针,指向存储主RNN输入的GPU缓冲区。此缓冲地址x应与前面的mcdnnRNNForward()和mcdnnRNNBackwardData_v8()调用中提供的相同。

hDesc

输入。描述RNN初始隐藏状态的张量描述符。隐藏状态数据为完全压缩格式。此描述符与前面的mcdnnRNNForward()和mcdnnRNNBackwardData_v8()调用中使用的张量描述符相同。

hx

输入。指针,指向具有RNN初始隐藏状态的GPU缓冲区。此缓冲地址hx应与前面的mcdnnRNNForward()和mcdnnRNNBackwardData_v8()调用中提供的相同。

yDesc

输入。与RNN模型输出数据对应的已初始化的描述符。此描述符与前面的mcdnnRNNForward()和mcdnnRNNBackwardData_v8()调用中使用的RNN数据描述符相同。

y

输出。指向GPU缓冲区的指针,该缓冲区中主RNN输出由先前的mcdnnRNNForward()调用生成。y缓冲区中的数据由yDesc描述符描述。y张量中的元素(包括填充向量元素)必须紧密压缩。

weightSpaceSize

输入。指定已提供的权重空间缓冲区的大小(以字节为单位)。

dweightSpace

输出。GPU内存中权重空间缓冲区的地址。

workSpaceSize

输入。指定已提供的工作空间缓冲区的大小(以字节为单位)。

workSpace

输入/输出。GPU内存中用于存储临时数据的工作空间缓冲区地址。

reserveSpaceSize

输入。指定预留空间缓冲区的大小(以字节为单位)。

reserveSpace

输入/输出。GPU内存中预留空间缓冲区的地址。

返回值

MCDNN_STATUS_SUCCESS

处理API输入参数和启动GPU内核时,未检测到错误。

MCDNN_STATUS_NOT_SUPPORTED

此函数不支持已提供的配置。

MCDNN_STATUS_BAD_PARAM

遇到一个无效或不兼容的输入参数。例如:

  • 一些输入描述符为NULL

  • rnnDesc、xDesc、yDesc或hDesc描述符中的设置无效

  • weightSpaceSize,workSpaceSize或reserveSpaceSize的值太小。

  • addGrad参数与MCDNN_WGRAD_MODE_ADD不相等

MCDNN_STATUS_EXECUTION_FAILED

启动GPU内核的过程返回错误,或之前的内核未成功完成。

MCDNN_STATUS_ALLOC_FAILED

此函数不能用来分配CPU内存。

7.2.1.21. mcdnnRNNBackwardWeightsEx()

使用mcdnnRNNBackwardWeights_v8()代替mcdnnRNNBackwardWeightsEX()。

mcdnnStatus_t mcdnnRNNBackwardWeightsEx(
    mcdnnHandle_t                    handle,
    const mcdnnRNNDescriptor_t       rnnDesc,
    const mcdnnRNNDataDescriptor_t   xDesc,
    const void                       *x,
    const mcdnnTensorDescriptor_t    hxDesc,
    const void                       *hx,
    const mcdnnRNNDataDescriptor_t   yDesc,
    const void                       *y,
    void                             *workSpace,
    size_t                           workSpaceSizeInBytes,
    const mcdnnFilterDescriptor_t    dwDesc,
    void                             *dw,
    void                             *reserveSpace,
    size_t                           reserveSpaceSizeInBytes)

该函数是mcdnnRNNBackwardWeights()函数的扩展版本。mcdnnRNNBackwardWeightsEx()函数允许用户对输入x和输出dw使用非压缩(填充)布局。

在非压缩布局中,mini-batch中的每个序列都被视为固定长度,由其对应的RNNDataDescriptor中的maxSeqLength指定。每个固定长度序列(例如,mini-batch中的第n个序列)都由一个有效段(由其对应的RNNDataDescriptor中的seqLengthArray[n]指定)和一个填充段组成,使组合序列长度等于maxSeqLength。

对于非压缩布局,同时支持序列主要(sequence-major)布局(即,时间主要)和批主要(batch-major)布局。为了向后兼容,支持压缩的序列主要布局。但是,与非扩展函数mcdnnRNNBackwardWeights()类似,mini-batch中的序列需要根据长度按降序排序。

参数

handle

输入。已创建的mcDNN上下文的句柄。

rnnDesc

输入。已初始化的RNN描述符。

xDesc

输入。已初始化的RNN数据描述符。必须与已传入mcdnnRNNForwardTrainingEx()的描述符匹配或完全相同。

x

输入。数据指针,指向与xDesc数组中张量描述符关联的GPU内存。必须包含与已传入mcdnnRNNForwardTrainingEx()的完全相同的数据。

hxDesc

输入。完全压缩的张量描述符,描述RNN的初始隐藏状态(initial hidden state)。必须与已传入mcdnnRNNForwardTrainingEx()的描述符匹配或完全相同。

hx

输入。数据指针,指向与张量描述符hxDesc关联的GPU内存。如果传入NULL指针,则网络的初始隐藏状态将初始化为零。必须包含与已传入mcdnnRNNForwardTrainingEx()的完全相同的数据,或者如果已将NULL传入mcdnnRNNForwardTrainingEx(),则必须为NULL。

yDesc

输入。已初始化的RNN数据描述符。必须与已传入mcdnnRNNForwardTrainingEx()的描述符匹配或完全相同。

y

输入。数据指针,指向与输出张量描述符yDesc关联的GPU内存。必须包含与mcdnnRNNForwardTrainingEx()已生成的完全相同的数据。

workspace

输入。数据指针,指向要用作此调用工作空间的GPU内存。

workSpaceSizeInBytes

输入。指定已提供的workspace大小(以字节为单位)。

dwDesc

输入。已初始化的卷积核描述符的句柄,描述RNN权重梯度。

dw

输入/输出。数据指针,指向与卷积核描述符dwDesc关联的GPU内存。

reserveSpace

输入。数据指针,指向要用作此调用预留空间的GPU内存。

reserveSpaceSizeInBytes

输入。指定已提供的reserveSpace的大小(以字节为单位)。

返回值

MCDNN_STATUS_SUCCESS

此函数启用成功。

MCDNN_STATUS_NOT_SUPPORTED

此函数不支持已提供的配置。

MCDNN_STATUS_BAD_PARAM

需至少满足以下任一条件:

  • rnnDesc描述符无效。

  • xDesc、yDesc、hxDesc、dwDesc中至少一个描述符无效,或步幅或维度不正确。

  • workSpaceSizeInBytes太小。

  • reserveSpaceSizeInBytes太小。

MCDNN_STATUS_EXECUTION_FAILED

此函数在GPU上启用失败。

MCDNN_STATUS_ALLOC_FAILED

此函数不能用来分配内存。

7.2.1.22. mcdnnRNNForwardTraining()

使用mcdnnRNNForward()代替mcdnnRNNForwardTraining()。

mcdnnStatus_t mcdnnRNNForwardTraining(
    mcdnnHandle_t                   handle,
    const mcdnnRNNDescriptor_t      rnnDesc,
    const int                       seqLength,
    const mcdnnTensorDescriptor_t  *xDesc,
    const void                     *x,
    const mcdnnTensorDescriptor_t   hxDesc,
    const void                     *hx,
    const mcdnnTensorDescriptor_t   cxDesc,
    const void                     *cx,
    const mcdnnFilterDescriptor_t   wDesc,
    const void                     *w,
    const mcdnnTensorDescriptor_t  *yDesc,
    void                           *y,
    const mcdnnTensorDescriptor_t   hyDesc,
    void                           *hy,
    const mcdnnTensorDescriptor_t   cyDesc,
    void                           *cy,
    void                           *workspace,
    size_t                          workSpaceSizeInBytes,
    void                           *reserveSpace,
    size_t                          reserveSpaceSizeInBytes)

此函数使用输入x、hx、cx,权重w和输出y、hy、cy来执行rnnDesc描述的循环神经网络。需要工作空间用于中间存储。reserveSpace存储训练所需的数据。如果将来在相同的输入数据上执行mcdnnRNNBackwardData()和mcdnnRNNBackwardWeights()调用,则必须使用相同的reserveSpace数据。

参数

handle

输入。已创建的mcDNN上下文的句柄。

rnnDesc

输入。已初始化的RNN描述符。

seqLength

输入。要展开的迭代次数。seqLength的值不能超过mcdnnGetRNNWorkspaceSize()函数中用于查询执行RNN所需的工作空间大小。

xDesc

输入。完全压缩的张量描述符的seqLength数组。数组中的每个描述符都应具有三个维度,这些维度将输入数据格式描述为一个循环迭代(一个RNN时间步一个描述符)。张量的第一维(批大小)可能从迭代元素n减少到迭代元素n+1,但可能不会增加。每个张量描述符必须具有相同的第二维(RNN输入向量长度inputSize)。每个张量的第三维需要为1。输入向量应按列主序排列,因此xDesc中的步幅应设置如下:

strideA[0]=inputSize, strideA[1]=1, strideA[2]=1

x

输入。数据指针,指向与张量描述符xDesc的数组关联的GPU内存。输入向量压缩会在迭代n的最后一个向量结束后直接从迭代(时间步)n+1的第一个向量开始连续进行。换言之,所有RNN时间步的输入向量应填充在GPU内存的连续块中,且向量之间没有间隙。

hxDesc

输入。完全压缩的张量描述符,描述RNN的初始隐藏状态(initial hidden state)。 张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc所描述张量的第一维匹配。 第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

hx

输入。数据指针,指向与张量描述符hxDesc关联的GPU内存。如果传入NULL指针,则网络的初始隐藏状态将初始化为零。

cxDesc

输入。完全压缩的的张量描述符,描述LSTM网络的初始单元(cell)状态。 张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc所描述张量的第一维匹配。 第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

cx

输入。数据指针,指向与张量描述符cxDesc关联的GPU内存。如果传入NULL指针,则网络的初始单元状态将初始化为零。

wDesc

输入。已初始化的卷积核描述符的句柄,描述RNN权重。

w

输入。数据指针,指向与卷积核描述符wDesc关联的GPU内存。

yDesc

输入。完全压缩的张量描述符数组,描述每个循环迭代输出(一个迭代一个描述符)。张量的第二维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第二维应与hiddenSize参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第二维应是hiddenSize参数的2倍。

张量n的第一维必须与xDesc中张量n的第一维匹配。

y

输出。数据指针,指向与输出张量描述符yDesc关联的GPU内存。

hyDesc

输入。完全压缩的张量描述符,描述RNN的最终隐藏状态。 张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc所描述张量的第一维匹配。 第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

hy

输出。数据指针,指向与张量描述符hyDesc关联的GPU内存。如果传入NULL指针,将不会保存网络的最终隐藏状态。

cyDesc

输入。完全压缩的张量描述符,描述LSTM网络的最终单元状态。 张量的第一维取决于初始化rnnDesc的方向参数:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc所描述张量的第一维匹配。 第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

cy

输出。数据指针,指向与张量描述符cyDesc关联的GPU内存。如果传入NULL指针,将不会保存网络的最终单元状态。

workspace

输入。数据指针,指向要用作此调用工作空间的GPU内存。

workSpaceSizeInBytes

输入。指定已提供的workspace大小(以字节为单位)。

reserveSpace

输入/输出。数据指针,指向要用作此调用预留空间的GPU内存。

reserveSpaceSizeInBytes

输入。指定已提供的reserveSpace的大小(以字节为单位)。

返回值

MCDNN_STATUS_SUCCESS

此函数启用成功。

MCDNN_STATUS_BAD_PARAM

需至少满足以下任一条件:

  • rnnDesc描述符无效。

  • hxDesc、cxDesc、wDesc、hyDesc、cyDesc描述符中或者xDesc、yDesc描述符中至少有一个是无效的。

  • xDesc、hxDesc、cxDesc、wDesc、yDesc、hyDesc、cyDesc中任一描述符的步幅或维度不正确。

  • workSpaceSizeInBytes太小。

  • reserveSpaceSizeInBytes太小。

MCDNN_STATUS_INVALID_VALUE

在RNN描述符中选择MCDNN_RNN_ALGO_PERSIST_DYNAMIC时,在当前函数之前未调用mcdnnSetPersistentRNNPlan()。

MCDNN_STATUS_EXECUTION_FAILED

此函数在GPU上启用失败。

UDNN_STATUS_ALLOC_FAILED

此函数不能用来分配内存。

7.2.1.23. mcdnnRNNForwardTrainingEx()

使用mcdnnRNNForward()代替mcdnnRNNForwardTrainingEx()。

mcdnnStatus_t mcdnnRNNForwardTrainingEx(
    mcdnnHandle_t                        handle,
    const mcdnnRNNDescriptor_t           rnnDesc,
    const mcdnnRNNDataDescriptor_t       xDesc,
    const void                           *x,
    const mcdnnTensorDescriptor_t        hxDesc,
    const void                           *hx,
    const mcdnnTensorDescriptor_t        cxDesc,
    const void                           *cx,
    const mcdnnFilterDescriptor_t        wDesc,
    const void                           *w,
    const mcdnnRNNDataDescriptor_t       yDesc,
    void                                 *y,
    const mcdnnTensorDescriptor_t        hyDesc,
    void                                 *hy,
    const mcdnnTensorDescriptor_t        cyDesc,
    void                                 *cy,
    const mcdnnRNNDataDescriptor_t       kDesc,
    const void                           *keys,
    const mcdnnRNNDataDescriptor_t       cDesc,
    void                                 *cAttn,
    const mcdnnRNNDataDescriptor_t       iDesc,
    void                                 *iAttn,
    const mcdnnRNNDataDescriptor_t       qDesc,
    void                                 *queries,
    void                                 *workSpace,
    size_t                               workSpaceSizeInBytes,
    void                                 *reserveSpace,
    size_t                               reserveSpaceSizeInBytes);

该函数是mcdnnRNNForwardTraining()函数的扩展版本。mcdnnRNNForwardTrainingEx()允许用户对输入x和输出y使用非压缩(填充)布局。

在非压缩布局中,mini-batch中的每个序列都被视为固定长度,由其对应的RNNDataDescriptor中的maxSeqLength指定。每个固定长度序列(例如,mini-batch中的第n个序列)都由一个有效段(由其对应的RNNDataDescriptor中的seqLengthArray[n]指定)和一个填充段组成,使组合序列长度等于maxSeqLength。

对于非压缩布局,同时支持序列主要(sequence-major)布局(即,时间主要)和批主要(batch-major)布局。为了向后兼容,支持压缩的序列主要布局。但是,与非扩展函数mcdnnRNNForwardTraining()类似,mini-batch中的序列需要根据长度按降序排序。

参数

handle

输入。已创建的mcDNN上下文的句柄。

rnnDesc

输入。已初始化的RNN描述符。

xDesc

输入。已初始化的RNN数据描述符。dataType、layout、maxSeqLength、batchSize和seqLengthArray必须与yDesc中的匹配。

x

输入。数据指针,指向与RNN数据描述符xDesc关联的GPU内存。输入向量应根据xDesc指定的布局在内存中排列。张量中的元素(包括填充向量中的元素)必须紧密压缩,且不支持步幅。

hxDesc

输入。完全压缩的张量描述符,描述RNN的初始隐藏状态(initial hidden state)。

张量的第一维取决于初始化rnnDesc的方向参数。此外:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc中描述的batchSize参数匹配。 第三维取决于RNN模式是否为MCDNN_LSTM以及是否启用了LSTM投影。此外:

  • 如果RNN模式为MCDNN_LSTM且启用了LSTM投影,则第三维必须与传入mcdnnSetRNNProjectionLayers()调用的recProjSize参数匹配,其中mcdnnSetRNNProjectionLayers()是用于设置rnnDesc的。

  • 否则,第三维必须与初始化rnnDesc的hiddenSize参数匹配。

hx

输入。数据指针,指向与张量描述符hxDesc关联的GPU内存。如果传入NULL指针,则网络的初始隐藏状态将初始化为零。

cxDesc

输入。完全压缩的的张量描述符,描述LSTM网络的初始单元(cell)状态。

张量的第一维取决于初始化rnnDesc的方向参数。此外:

  • 如果方向为MCDNN_UNIDIRECTIONAL,则第一维应与numLayers参数匹配。

  • 如果方向为MCDNN_BIDIRECTIONAL,则第一维应是numLayers参数的2倍。

第二维必须与xDesc所描述张量的第一维匹配。 第三维必须与初始化rnnDesc的hiddenSize参数匹配。张量必须为完全压缩格式。

cx

输入。数据指针,指向与张量描述符cxDesc关联的GPU内存。如果传入NULL指针,则网络的初始单元状态将初始化为零。

wDesc

输入。已初始化的卷积核描述符的句柄,描述RNN权重。

w

输入。数据指针,指向与卷积核描述符wDesc关联的GPU内存。

yDesc

输入。已初始化的RNN数据描述符。dataType、layout、maxSeqLength、batchSize和seqLengthArray必须与dyDesc和dxDesc中的相应参数匹配。vectorSize参数取决于RNN模式是否设置为MCDNN_LSTM,是否启用了LSTM投影以及网络是否为双向。具体而言:

  • 对于单向网络,如果RNN模式为MCDNN_LSTM且启用了LSTM投影,则vectorSize参数必须与传入mcdnnSetRNNProjectionLayers()调用的recProjSize参数匹配,其中mcdnnSetRNNProjectionLayers()是用于设置rnnDesc的。如果网络是双向的,则将该值乘以2。

  • 否则,对于单向网络,vectorSize参数必须与初始化rnnDesc的hiddenSize参数匹配。如果网络是双向的,则将该值乘以2。

y

输出。数据指针,指向与RNN数据描述符yDesc关联的GPU内存。输入向量应根据yDesc指定的布局在内存中排列。张量中的元素(包括填充向量中的元素)必须紧密压缩,且不支持步幅。

hyDesc

输入。完全压缩的张量描述符,描述RNN的最终隐藏状态。此描述符的设置必须与hxDesc完全一致。

hy

输出。数据指针,指向与张量描述符hyDesc关联的GPU内存。如果传入NULL指针,将不会保存网络的最终隐藏状态。

cyDesc

输入。完全压缩的张量描述符,描述LSTM网络的最终单元状态。此描述符的设置必须与cxDesc完全一致。

cy

输出。数据指针,指向与张量描述符cyDesc关联的GPU内存。如果传入NULL指针,将不会保存网络的最终单元状态。

kDesc

保留。用户可以传入NULL。

keys

保留。用户可以传入NULL。

cDesc

保留。用户可以传入NULL。

cAttn

保留。用户可以传入NULL。

iDesc

保留。用户可以传入NULL。

iAttn

保留。用户可以传入NULL。

qDesc

保留。用户可以传入NULL。

queries

保留。用户可以传入NULL。

workspace

输入。数据指针,指向要用作此调用工作空间的GPU内存。

workSpaceSizeInBytes

输入。指定已提供的workspace大小(以字节为单位)。

reserveSpace

输入/输出。数据指针,指向要用作此调用预留空间的GPU内存。

reserveSpaceSizeInBytes

输入。指定已提供的reserveSpace的大小(以字节为单位)。

返回值

MCDNN_STATUS_SUCCESS

此函数启用成功。

MCDNN_STATUS_NOT_SUPPORTED

需至少满足以下任一条件:

  • 在使用MCDNN_RNN_ALGO_PERSIST_STATIC或MCDNN_RNN_ALGO_PERSIST_DYNAMIC时,传入变量序列长度输入。

  • 在pre-Pascal设备上使用MCDNN_RNN_ALGO_PERSIST_STATIC或MCDNN_RNN_ALGO_PERSIST_DYNAMIC。

  • 双输入/输出用于MCDNN_RNN_ALGO_PERSIST_STATIC。

MCDNN_STATUS_BAD_PARAM

需至少满足以下任一条件:

  • rnnDesc描述符无效。

  • xDesc、yDesc、hxDesc、cxDesc、wDesc、hyDesc或cyDesc无效,或者步幅或维度不正确。

  • workSpaceSizeInBytes太小。

  • reserveSpaceSizeInBytes太小。

MCDNN_STATUS_INVALID_VALUE

在RNN描述符中选择MCDNN_RNN_ALGO_PERSIST_DYNAMIC时,在当前函数之前未调用mcdnnSetPersistentRNNPlan()。

MCDNN_STATUS_EXECUTION_FAILED

此函数在GPU上启用失败。

MCDNN_STATUS_ALLOC_FAILED

此函数不能用来分配内存。

7.2.1.24. mcdnnSetCTCLossDescriptor()

此函数设置CTC损失函数描述符。另请参见扩展版本mcdnnSetCTCLossDescriptorEx()以设置输入归一化模式。

mcdnnStatus_t mcdnnSetCTCLossDescriptor(
    mcdnnCTCLossDescriptor_t        ctcLossDesc,
    mcdnnDataType_t                 compType)

当扩展版本mcdnnSetCTCLossDescriptorEx()的normMode设置为MCDNN_LOSS_NORMALIZATION_NONE,gradMode设置为MCDNN_NOT_PROPAGATE_NAN时,则它与当前函数mcdnnSetCTCLossDescriptor()相同,即:

mcdnnSetCtcLossDescriptor(*) = mcdnnSetCtcLossDescriptorEx(*, normMode=MCDNN_LOSS_NORMALIZATION_NONE,
    gradMode=MCDNN_NOT_PROPAGATE_NAN)

参数

ctcLossDesc

输出。要设置的CTC损失描述符。

compType

输入。此CTC损失函数的计算类型。

返回值

MCDNN_STATUS_SUCCESS

此函数返回成功。

MCDNN_STATUS_BAD_PARAM

传入的输入参数至少有一个是无效的。

7.2.1.25. mcdnnSetCTCLossDescriptorEx()

此函数是mcdnnSetCTCLossDescriptor()的扩展版本。此函数提供了一个额外的接口normMode来设置CTC损失函数的输入归一化模式,并提供gradMode来控制NaN传播类型。

mcdnnStatus_t mcdnnSetCTCLossDescriptorEx(
    mcdnnCTCLossDescriptor_t        ctcLossDesc,
    mcdnnDataType_t                 compType,
    mcdnnLossNormalizationMode_t    normMode,
    mcdnnNanPropagation_t           gradMode)

当mcdnnSetCTCLossDescriptorEx()的normMode设置为MCDNN_LOSS_NORMALIZATION_NONE,gradMode设置为MCDNN_NOT_PROPAGATE_NAN时,则它与mcdnnSetCTCLossDescriptor()相同,即:

mcdnnSetCtcLossDescriptor(*) = mcdnnSetCtcLossDescriptorEx(*, normMode=MCDNN_LOSS_NORMALIZATION_NONE,
    gradMode=MCDNN_NOT_PROPAGATE_NAN)

参数

ctcLossDesc

输出。要设置的CTC损失描述符。

compType

输入。此CTC损失函数的计算类型。

normMode

输入。此CTC损失函数的输入归一化类型。更多信息,参见mcdnnLossNormalizationMode_t。

gradMode

输入。此CTC损失函数的NaN传播类型。对于序列长度L,序列中重复的字母数R,序列数据的长度T,以下情况适用:当梯度计算过程中遇到L+R > T的样本时,如果gradMode设置为MCDNN_PROPAGATE_NAN(请参见mcdnnNanPropagation_t),则CTC损失函数不会写入该样本的梯度缓冲区。而是保留当前值,即使不是有限值。如果gradMode设置为MCDNN_NOT_PROPAGATE_NAN,则该样本的梯度设置为零。这保证了梯度为有限值。

返回值

MCDNN_STATUS_SUCCESS

此函数返回成功。

MCDNN_STATUS_BAD_PARAM

传入的输入参数至少有一个是无效的。

7.2.1.26. mcdnnSetCTCLossDescriptor_v8()

许多CTC API函数在mcDNN中已更新以支持MXMACA图形。为此,需要一个新参数maxLabelLength。假定标签和输入数据在GPU内存中,否则此信息不易获取。

mcdnnStatus_t mcdnnSetCTCLossDescriptorEx(
    mcdnnCTCLossDescriptor_t        ctcLossDesc,
    mcdnnDataType_t                 compType,
    mcdnnLossNormalizationMode_t    normMode,
    mcdnnNanPropagation_t           gradMode,
    int                             maxLabelLength)

参数

ctcLossDesc

输出。要设置的CTC损失描述符。

compType

输入。此CTC损失函数的计算类型。

normMode

输入。此CTC损失函数的输入归一化类型。更多信息,参见mcdnnLossNormalizationMode_t。

gradMode

输入。此CTC损失函数的NaN传播类型。对于序列长度L,序列中重复的字母数R,序列数据的长度T,以下情况适用:当梯度计算过程中遇到L+R > T的样本时,如果gradMode设置为MCDNN_PROPAGATE_NAN(请参见mcdnnNanPropagation_t),则CTC损失函数不会写入该样本的梯度缓冲区。而是保留当前值,即使不是有限值。如果gradMode设置为MCDNN_NOT_PROPAGATE_NAN,则该样本的梯度设置为零。这保证了梯度为有限值。

maxLabelLength

输入。标签数据的最大标签长度。

返回值

MCDNN_STATUS_SUCCESS

此函数返回成功。

MCDNN_STATUS_BAD_PARAM

传入的输入参数至少有一个是无效的。