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信号(在时间步之间和层之间)。
图 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
传入的输入参数至少有一个是无效的。