3. mcdnn_ops_train
此实体包含常用的训练函数算法,例如批量归一化,softmax,丢弃等。mcdnn_ops_train库依赖于mcdnn_ops_infer。
3.1. API参考
3.1.1. API函数
3.1.1.1. mcdnnActivationBackward()
此函数计算神经元激活函数的梯度。
mcdnnStatus_t mcdnnActivationBackward(
mcdnnHandle_t handle,
mcdnnActivationDescriptor_t activationDesc,
const void *alpha,
const mcdnnTensorDescriptor_t yDesc,
const void *y,
const mcdnnTensorDescriptor_t dyDesc,
const void *dy,
const mcdnnTensorDescriptor_t xDesc,
const void *x,
const void *beta,
const mcdnnTensorDescriptor_t dxDesc,
void *dx)
该函数支持就地操作,这意味着dy和dx指针可以相等。但是,这要求相应的张量描述符相同(特别是,输入和输出的步幅必须匹配才能支持就地操作)。所有张量格式都支持4维和5维。但是,当xDesc和yDesc的步幅相等且都为HW-packed时,可以获得最佳性能。对于超过5维的张量,必须压缩其空间维度。
参数
handle
输入。已创建的mcDNN上下文的句柄。更多信息,参见mcdnnHandle_t。
activationDesc
输入。激活描述符。更多信息,参见mcdnnActivationDescriptor_t。
alpha, beta
输入。指向缩放系数(主机内存中)的指针,用于将计算结果与输出层中的先验值混合,如下所示: dstValue = alpha[0]*result + beta[0]*priorDstValue。
yDesc
输入。已初始化的输入张量描述符的句柄。更多信息,参见mcdnnTensorDescriptor_t。
y
输入。数据指针,指向与张量描述符yDesc关联的GPU内存。
dyDesc
输入。已初始化的输入差分张量描述符的句柄。
dy
输入。数据指针,指向与张量描述符dyDesc关联的GPU内存。
xDesc
输入。已初始化的输出张量描述符的句柄。
x
输入。数据指针,指向与输出张量描述符xDesc关联的GPU内存。
dxDesc
输入。已初始化的输出差分张量描述符的句柄。
dx
输出。数据指针,指向与输出张量描述符dxDesc关联的GPU内存。
返回值
MCDNN_STATUS_SUCCESS
此函数启用成功。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
输入差分张量和输出差分张量的nStride,cStride,hStride,wStride步幅不同,并使用就地操作。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。不受支持的配置示例如下:
输入张量和输出张量的n,c,h,w维度不同。
输入张量和输出张量的数据类型不同。
输入张量和输入差分张量的nStride、cStride、hStride和wStride步幅不同。
输出张量和输出差分张量的nStride、cStride、hStride和wStride步幅不同。
MCDNN_STATUS_EXECUTION_FAILED
此函数在GPU上启用失败。
3.1.1.2. mcdnnBatchNormalizationBackward()
该函数执行反向BN层计算。对于BN层,可参见Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift。
mcdnnStatus_t mcdnnBatchNormalizationBackward(
mcdnnHandle_t handle,
mcdnnBatchNormMode_t mode,
const void *alphaDataDiff,
const void *betaDataDiff,
const void *alphaParamDiff,
const void *betaParamDiff,
const mcdnnTensorDescriptor_t xDesc,
const void *x,
const mcdnnTensorDescriptor_t dyDesc,
const void *dy,
const mcdnnTensorDescriptor_t dxDesc,
void *dx,
const mcdnnTensorDescriptor_t bnScaleBiasDiffDesc,
const void *bnScale,
void *resultBnScaleDiff,
void *resultBnBiasDiff,
double epsilon,
const void *savedMean,
const void *savedInvVariance)
Only 4D and 5D tensors are supported. 在训练,反向传播和推理过程中的epsilon值必须相同。当所有x、dy和dx都使用HW-packed张量时,可以获得更高的性能。 有关此函数中使用的参数的辅助张量描述符生成信息,请参见mcdnnDeriveBNTensorDescriptor()。
参数
handle
输入。已创建的mcDNN库描述符的句柄。更多信息,参见mcdnnHandle_t。
mode
输入。操作模式(per-channel或per-activation)。更多信息,参见mcdnnBatchNormMode_t。
alphaDataDiff, betaDataDiff
输入。指向缩放系数(主机内存中)的指针,用于将dx梯度输出与目标张量中的先验值混合,如下所示: dstValue = alphaDataDiff[0]*resultValue + betaDataDiff[0]*priorDstValue。
alphaParamDiff, betaParamDiff
输入。指向缩放系数(主机内存中)的指针,用于将resultBnScaleDiff和resultBnBiasDiff梯度输出与目标张量中的先验值混合,如下所示: dstValue = alphaParamDiff[0]*resultValue + betaParamDiff[0]*priorDstValue。
xDesc, dxDesc, dyDesc
输入。已初始化的张量描述符的句柄。
x
输入。数据指针,指向与张量描述符xDesc关联的GPU内存,用于层的x数据。
dy
输入。数据指针,指向与张量描述符dyDesc关联的GPU内存,用于反向传播差分dy输入。
dx
输入/输出。数据指针,指向与张量描述符dxDesc关联的GPU内存,用于生成与x相关的差分输出。
bnScaleBiasDiffDesc
输入。以下五个张量的共享张量描述符:bnScale,resultBnScaleDiff,resultBnBiasDiff,savedMean和savedInvVariance。此张量描述符的维度取决于归一化模式。更多信息,参见mcdnnDeriveBNTensorDescriptor()。
备注
对于FP16和FP32输入张量,此张量描述符的数据类型必须为float;对于FP64输入张量,必须为double。
bnScale
输入。设备内存中指向BN scale参数的指针。
备注
该层的计算不需要bnBias参数。
resultBnScaleDiff, resultBnBiasDiff
输出。指针,指向此函数计算得到的scale差分和bias差分,位于设备内存中。请注意,这些scale梯度和bias梯度是此BN操作特定的权重梯度,根据定义不会反向传播。
epsilon
输入。BN公式中使用的Epsilon值。其值应等于或大于mcdnn.h中为MCDNN_BN_MIN_EPSILON定义的值。在正向和反向函数中应使用相同的Epsilon值。
savedMean, savedInvVariance
输入。可选的cache参数,包含在正向传递过程中计算并保存的中间结果。为保证工作正常,在调用此反向函数之前,层的x和bnScale数据必须保持不变。
备注
这两个参数可以为NULL,但只能同时为NULL。建议使用此cache,因为内存开销相对较小。
支持的配置
此函数支持多种描述符的以下数据类型组合。
数据 类型 配置 |
xDesc |
bnScale BiasMean VarDesc |
alphaData Diff, beta DataDiff ,alphaPa ramDiff, betaParam Diff |
dyDesc |
dxDesc |
|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
返回值
MCDNN_STATUS_SUCCESS
计算已成功执行。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
alpha、beta、x、dy、dx、bnScale、resultBnScaleDiff和resultBnBiasDiff中任意指针为NULL。
xDesc、yDesc或dxDesc张量描述符维数不在[4,5]范围内(仅支持4D和5D张量)。
spatial模式下,4D张量中bnScaleBiasDiffDesc的维度不是1xCx1x1,5D张量中不是1xCx1x1x1;per-activation模式下,4D张量中不是1xCxHxW,5D张量中不是1xCxDxHxW。
savedMean和savedInvVariance指针中只有一个为NULL。
epsilon值小于MCDNN_BN_MIN_EPSILON。
任意一对xDesc、dyDesc和dxDesc的维度或数据类型不匹配。
3.1.1.3. mcdnnBatchNormalizationBackwardEx()
此函数是mcdnnBatchNormalizationBackward()的扩展,用于使用快速NHWC半持久内核执行反向BN层计算。
mcdnnStatus_t mcdnnBatchNormalizationBackwardEx (
mcdnnHandle_t handle,
mcdnnBatchNormMode_t mode,
mcdnnBatchNormOps_t bnOps,
const void *alphaDataDiff,
const void *betaDataDiff,
const void *alphaParamDiff,
const void *betaParamDiff,
const mcdnnTensorDescriptor_t xDesc,
const void *xData,
const mcdnnTensorDescriptor_t yDesc,
const void *yData,
const mcdnnTensorDescriptor_t dyDesc,
const void *dyData,
const mcdnnTensorDescriptor_t dzDesc,
void *dzData,
const mcdnnTensorDescriptor_t dxDesc,
void *dxData,
const mcdnnTensorDescriptor_t dBnScaleBiasDesc,
const void *bnScaleData,
const void *bnBiasData,
void *dBnScaleData,
void *dBnBiasData,
double epsilon,
const void *savedMean,
const void *savedInvVariance,
const mcdnnActivationDescriptor_t activationDesc,
void *workspace,
size_t workSpaceSizeInBytes
void *reserveSpace
size_t reserveSpaceSizeInBytes);
如果workspace为NULL并且传入的workSpaceSizeInBytes为零,则该API的功能将与非扩展函数mcdnnBatchNormalizationBackward完全相同。 此workspace不需要清理。此外,workspace不必在正向和反向传递之间保持不变,因为它不用于传递任何信息。
此扩展函数可以接受指向GPU workspace的workspace指针,以及来自用户的workSpaceSizeInBytes(workspace大小)。
bnOps输入可用于将此函数设置为仅执行BN,或先执行BN再执行激活,或先执行BN再执行元素级加法,然后执行激活。
仅支持4D和5D张量。在训练,反向传播和推理过程中的epsilon值必须相同。 张量布局为NCHW时,若x、dy和dx都使用HW-packed张量时,可以获得更高的性能。
参数
handle
输入。已创建的mcDNN库描述符的句柄。更多信息,参见mcdnnHandle_t。
mode
输入。操作模式(spatial或per-activation)。更多信息,参见mcdnnBatchNormMode_t。
bnOps
输入。操作模式。目前,仅在NHWC布局中支持MCDNN_BATCHNORM_OPS_BN_ACTIVATION和MCDNN_BATCHNORM_OPS_BN_ADD_ACTIVATION。 更多信息,参见mcdnnBatchNormOps_t。此输入可用于将此函数设置为仅执行BN,或先执行BN再执行激活,或先执行BN再执行元素级加法,然后执行激活。
alphaDataDiff, betaDataDiff
输入。指向缩放系数(主机内存中)的指针,用于将dx梯度输出与目标张量中的先验值混合,如下所示: dstValue = alpha[0]*resultValue + beta[0]*priorDstValue。
alphaParamDiff, betaParamDiff
输入。指向缩放系数(主机内存中)的指针,用于将dBnScaleData和dBnBiasData梯度输出与目标张量中的先验值混合,如下所示: dstValue = alpha[0]*resultValue + beta[0]*priorDstValue。
xDesc, x, yDesc, yData, dyDesc, dyData
输入。用于层的x数据,反向传播梯度输入dy,原始正向输出y数据的张量描述符和指针,位于设备内存中。如果bnOps设置为MCDNN_BATCHNORM_OPS_BN,则不需要yDesc和yData,用户可以传入NULL。更多信息,参见mcdnnTensorDescriptor_t。
dzDesc, dxDesc
输入。用于计算梯度输出dz和dx的张量描述符和指针,位于设备内存中。 当bnOps为MCDNN_BATCHNORM_OPS_BN或MCDNN_BATCHNORM_OPS_BN_ACTIVATION时,不需要dzDesc,用户可以传入NULL。更多信息,参见mcdnnTensorDescriptor_t。
dzData, dxData
输出。用于计算梯度输出dz和dx的张量描述符和指针,位于设备内存中。 当bnOps为MCDNN_BATCHNORM_OPS_BN或MCDNN_BATCHNORM_OPS_BN_ACTIVATION时,不需要dzData,用户可以传入NULL。更多信息,参见mcdnnTensorDescriptor_t。
dBnScaleBiasDesc
输入。以下6个张量的共享张量描述符:bnScaleData、bnBiasData、dBnScaleData、dBnBiasData、savedMean和savedInvVariance。更多信息,参见mcdnnDeriveBNTensorDescriptor()。 此张量描述符的维度取决于归一化模式。
备注
对于FP16和FP32输入张量,此张量描述符的数据类型必须为float;对于FP64输入张量,必须为double。
bnScaleData
输入。设备内存中指向BN scale参数的指针。(在 Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift中,数量scale称为gamma)。
bnBiasData
输入。设备内存中指向BN bias参数的指针。(在 Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift中,bias称为beta)。 此参数仅在执行激活时使用。
dBnScaleData, dBnBiasData
输出。设备内存中分别指向bnScaleData和bnBiasData梯度的指针。
epsilon
输入。BN公式中使用的Epsilon值。其值应等于或大于mcdnn.h中为MCDNN_BN_MIN_EPSILON定义的值。在正向和反向函数中应使用相同的Epsilon值。
savedMean, savedInvVariance
输入。可选的cache参数,包含在正向传递过程中计算并保存的中间结果。为保证工作正常,在调用此反向函数之前,层的x和bnScaleData、bnBiasData数据必须保持不变。请注意这两个参数可以为NULL,但只能同时为NULL。建议使用此cache,因为内存开销相对较小。
activationDesc
输入。激活操作的描述符。
当bnOps输入设置为MCDNN_BATCHNORM_OPS_BN_ACTIVATION或MCDNN_BATCHNORM_OPS_BN_ADD_ACTIVATION时,将使用此激活,否则用户可以传入NULL。
workspace
输入。指向GPU工作空间的指针。如果workspace为NULL并且传入的workSpaceSizeInBytes为零,则该API的功能将与非扩展函数mcdnnBatchNormalizationBackward()完全相同。
workSpaceSizeInBytes
输入。workspace的大小。它必须足够大,才能通过此函数触发快速NHWC半持久内核。
reserveSpace
输入。指针,指向用作reserveSpace的GPU工作空间。
reserveSpaceSizeInBytes
输入。reserveSpace的大小。它必须等于或大于mcdnnGetBatchNormalizationTrainingExReserveSpaceSize()所需的量。
mcdnnBatchNormalizationBackwardEx()支持的配置
数据类型配置
xDesc, yDesc
dBnSc aleBiasDesc
alp haDataDiff, betaDa taDiff,alph aParamDiff, be taParamDiff
dyDesc, dzDesc, dxDesc
PSEUDO_HA LF_CONFIG
MCDNN_ DATA_HALF
MCDNN_D ATA_FLOAT
MCDNN_D ATA_FLOAT
MCDNN_ DATA_HALF
FLO AT_CONFIG
MCDNN_D ATA_FLOAT
MCDNN_D ATA_FLOAT
MCDNN_D ATA_FLOAT
MCDNN_D ATA_FLOAT
DOUB LE_CONFIG
MCDNN_DA TA_DOUBLE
MCDNN_DA TA_DOUBLE
MCDNN_DA TA_DOUBLE
MCDNN_DA TA_DOUBLE
返回值
MCDNN_STATUS_SUCCESS
计算已成功执行。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
alphaDataDiff、betaDataDiff、alphaParamDiff、betaParamDiff、x、dy、dx、bnScale、resultBnScaleDiff和resultBnBiasDiff中任意指针为NULL。
xDesc、yDesc或dxDesc张量描述符维数不在[4,5]范围内(仅支持4D和5D张量)。
spatial模式下,4D张量中dBnScaleBiasDesc的维度不是1xCx1x1,5D张量中不是1xCx1x1x1;per-activation模式下,4D张量中不是1xCxHxW,5D张量中不是1xCxDxHxW。
savedMean和savedInvVariance指针中只有一个为NULL。
epsilon值小于MCDNN_BN_MIN_EPSILON。
任意一对xDesc、dyDesc或dxDesc的维度或数据类型不匹配。
3.1.1.4. mcdnnBatchNormalizationForwardTraining
此函数在训练阶段执行正向BN层计算。对于BN层,可参见Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift。
mcdnnStatus_t mcdnnBatchNormalizationForwardTraining(
mcdnnHandle_t handle,
mcdnnBatchNormMode_t mode,
const void *alpha,
const void *beta,
const mcdnnTensorDescriptor_t xDesc,
const void *x,
const mcdnnTensorDescriptor_t yDesc,
void *y,
const mcdnnTensorDescriptor_t bnScaleBiasMeanVarDesc,
const void *bnScale,
const void *bnBias,
double exponentialAverageFactor,
void *resultRunningMean,
void *resultRunningVariance,
double epsilon,
void *resultSaveMean,
void *resultSaveInvVariance)
仅支持4D和5D张量。
在训练,反向传播和推理过程中的epsilon值必须相同。 对于推理阶段,使用mcdnnBatchNormalizationForwardInference。
当x和y都使用HW-packed张量时,可以获得更高的性能。 有关此函数中使用的参数的辅助张量描述符生成信息,请参见mcdnnDeriveBNTensorDescriptor()。
参数
handle
已创建的mcDNN库描述符的句柄。更多信息,参见mcdnnHandle_t。
mode
操作模式(spatial或per-activation)。更多信息,参见mcdnnBatchNormMode_t。
alpha, beta
输入。指向缩放系数(主机内存中)的指针,用于将层输出值与目标张量中的先验值混合,如下所示: dstValue = alpha[0]*resultValue + beta[0]*priorDstValue。
xDesc, yDesc
设备内存中用于层的x和y数据的张量描述符和指针。更多信息,参见mcdnnTensorDescriptor_t。
x
输入。数据指针,指向与张量描述符xDesc关联的GPU内存,用于层的x输入数据。
y
输入。数据指针,指向与张量描述符yDesc关联的GPU内存,用于BN层的y输出。
bnScaleBiasMeanVarDesc
共享张量描述符,用于通过mcdnnDeriveBNTensorDescriptor()获取的辅助张量。此张量描述符的维度取决于归一化模式。
bnScale, bnBias
输入。设备内存中用于BN scale和bias参数的指针。 请注意,bnBias参数可以替换上一层的bias参数以提高效率。
exponentialAverageFactor
输入。移动平均(Moving Average,MA)计算中使用的系数如下:
runningMean = runningMean*(1-factor) + newMean*factor
在对函数的第N次调用中使用factor=1/(1+n)可进行累积移动平均(Cumulative Moving Average,CMA)计算,例如:
CMA[n] = (x[1]+…+x[n])/n
例如:
CMA[n+1] = (n*CMA[n]+x[n+1])/(n+1)
= ((n+1)*CMA[n]-CMA[n])/(n+1) + x[n+1]/(n+1)
= CMA[n]*(1-1/(n+1))+x[n+1]*1/(n+1)
= CMA[n]*(1-factor) + x(n+1)*factor
resultRunningMean, resultRunningVariance
输入/输出。移动均值(Running mean)和方差(Running variance)张量(与scale和bias张量具有相同的描述符)。这两个指针可以为NULL,但只能同时为NULL。 存储在resultRunningVariance中(或作为推理模式中的输入被传入)的值是样本方差,是方差[x]的移动平均值,其中方差是根据模式在batch或spatial+batch维度上进行计算的。 如果这些指针不为NULL,则张量应初始化为一些合理的值或0。
epsilon
输入。BN公式中使用的Epsilon值。其值应等于或大于mcdnn.h中为MCDNN_BN_MIN_EPSILON定义的值。在正向和反向函数中应使用相同的Epsilon值。
resultSaveMean, resultSaveInvVariance
输出。可选的cache参数,用于保存在正向传递过程中计算得到的中间结果。当用于mcdnnBatchNormalizationBackward()函数时,这些缓冲区可用来加速反向传递。 用户不能直接使用存储在resultSaveMean和resultSaveInvVariance缓冲区的中间结果。根据BN模式,存储在resultSaveInvVariance中的结果可能会有所不同。为保证cache正常工作,在调用反向函数之前,输入层数据必须保持不变。 请注意这两个参数可以为NULL,但只能同时为NULL。在这种情况下,将不会保存中间统计信息,并且mcdnnBatchNormalizationBackward()必须进行重新计算。建议使用此cache,由于这些张量的维数乘积远小于数据张量的维数乘积,因此内存开销相对较小。
支持的mcdnnBatchNormalizationForwardTraining()配置
数据类型 配置 |
xDesc |
bnScaleBias MeanVarDesc |
alpha, beta |
yDesc |
|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
返回值
MCDNN_STATUS_SUCCESS
计算已成功执行。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
alpha、beta、x、y、bnScale和bnBias中任一指针为NULL。
xDesc或yDesc张量描述符维数不在[4,5]范围内(仅支持4D和5D张量)。
spatial模式下,4D张量中bnScaleBiasMeanVarDesc的维度不是1xCx1x1,5D张量中不是1xCx1x1x1;per-activation模式下,4D张量中不是1xCxHxW,5D张量中不是1xCxDxHxW。
resultSaveMean和resultSaveInvVariance指针中只有一个为NULL。
resultRunningMean和resultRunningInvVariance指针中只有一个为NULL。
epsilon值小于MCDNN_BN_MIN_EPSILON。
xDesc或yDesc的维度或数据类型不匹配。
3.1.1.5. mcdnnBatchNormalizationForwardTrainingEx()
该函数是mcdnnBatchNormalizationForwardTraining()的扩展,用于执行正向BN层计算。
mcdnnStatus_t mcdnnBatchNormalizationForwardTrainingEx(
mcdnnHandle_t handle,
mcdnnBatchNormMode_t mode,
mcdnnBatchNormOps_t bnOps,
const void *alpha,
const void *beta,
const mcdnnTensorDescriptor_t xDesc,
const void *xData,
const mcdnnTensorDescriptor_t zDesc,
const void *zData,
const mcdnnTensorDescriptor_t yDesc,
void *yData,
const mcdnnTensorDescriptor_t bnScaleBiasMeanVarDesc,
const void *bnScaleData,
const void *bnBiasData,
double exponentialAverageFactor,
void *resultRunningMeanData,
void *resultRunningVarianceData,
double epsilon,
void *saveMean,
void *saveInvVariance,
const mcdnnActivationDescriptor_t activationDesc,
void *workspace,
size_t workSpaceSizeInBytes
void *reserveSpace
size_t reserveSpaceSizeInBytes);
当满足以下条件时,此API将触发新的半持久NHWC内核:
所有张量,即x、y、dz、dy和dx,必须是NHWC完全压缩,并且类型必须是MCDNN_DATA_HALF。
输入参数模式必须设置为MCDNN_BATCHNORM_SPATIAL_PERSISTENT。
workspace不是NULL。
之前,C张量维度应始终是4的倍数。只有当bnOps为MCDNN_BATCHNORM_OPS_BN_ADD_ACTIVATION时,C张量维度应是4的倍数。
WorkSpaceSizeInBytes等于或大于mcdnnGetBatchNormalizationForwardTrainingExWorkspaceSize()所需的量。
ReserveSpaceSizeInBytes等于或大于mcdnnGetBatchNormalizationTrainingExReserveSpaceSize()所需的量。
必须保留使用mcdnnBatchNormalizationForwardTrainingEx()存储在reserveSpace中的内容。
如果workspace为NULL并且传入的workSpaceSizeInBytes为零,则该API的功能将与非扩展函数mcdnnBatchNormalizationForwardTraining()完全相同。 此workspace不需要清理。此外,workspace不必在正向和反向传递之间保持不变,因为它不用于传递任何信息。
此扩展函数可以接受指向GPU workspace的workspace指针,以及来自用户的workSpaceSizeInBytes(workspace大小)。
bnOps输入可用于将此函数设置为仅执行BN,或先执行BN再执行激活,或先执行BN再执行元素级加法,然后执行激活。
仅支持4D和5D张量。在训练,反向传播和推理过程中的epsilon值必须相同。
张量布局为NCHW时,若x、dy和dx都使用HW-packed张量时,可以获得更高的性能。
参数
handle
已创建的mcDNN库描述符的句柄。更多信息,参见mcdnnHandle_t。
mode
操作模式(spatial或per-activation)。更多信息,参见mcdnnBatchNormMode_t。
bnOps
输入。快速NHWC内核的操作模式。更多信息,参见mcdnnBatchNormOps_t。此输入可用于将此函数设置为仅执行BN,或先执行BN再执行激活,或先执行BN再执行元素级加法,然后执行激活。
alpha, beta
输入。指向缩放系数(主机内存中)的指针,用于将层输出值与目标张量中的先验值混合,如下所示: dstValue = alpha[0]*resultValue + beta[0]*priorDstValue。
xDesc, xData, zDesc, zData, yDesc, yData
设备内存中的张量描述符和指针,用于层的输入x和输出y,以及用于在激活之前对BN操作的结果进行残差相加的可选z张量输入。可选的zDes和zData描述符仅在bnOps为MCDNN_BATCHNORM_OPS_BN_ADD_ACTIVATION时使用,否则用户可以传入NULL。使用时,z的维度应与x和最终输出y的维度完全相同。更多信息,参见mcdnnTensorDescriptor_t。
bnScaleBiasMeanVarDesc
共享张量描述符,用于通过mcdnnDeriveBNTensorDescriptor()获取的辅助张量。此张量描述符的维度取决于归一化模式。
bnScaleData, bnBiasData
输入。设备内存中用于BN scale和bias参数的指针。 请注意,bnBiasData参数可以替换上一层的bias参数以提高效率。
exponentialAverageFactor
输入。移动平均(Moving Average,MA)计算中使用的系数如下:
runningMean = runningMean*(1-factor) + newMean*factor
在对函数的第N次调用中使用factor=1/(1+n)可进行累积移动平均(Cumulative Moving Average,CMA)计算,例如:
CMA[n] = (x[1]+…+x[n])/n
例如:
CMA[n+1] = (n*CMA[n]+x[n+1])/(n+1)
= ((n+1)*CMA[n]-CMA[n])/(n+1) + x[n+1]/(n+1)
= CMA[n]*(1-1/(n+1))+x[n+1]*1/(n+1)
= CMA[n]*(1-factor) + x(n+1)*factor
resultRunningMeanData, resultRunningVarianceData
输入/输出。指向移动均值和移动方差数据的指针。这两个指针可以为NULL,但只能同时为NULL。存储在resultRunningVarianceData中(或作为推理模式中的输入被传入)的值是样本方差,是方差[x]的移动平均值,其中方差是根据模式在batch或spatial+batch维度上进行计算的。如果这些指针不为NULL,则张量应初始化为一些合理的值或0。
epsilon
输入。BN公式中使用的Epsilon值。其值应等于或大于mcdnn.h中为MCDNN_BN_MIN_EPSILON定义的值。在正向和反向函数中应使用相同的Epsilon值。
saveMean, saveInvVariance
输出。可选的cache参数,包含在正向传递过程中计算并保存的中间结果。为保证工作正常,在调用此反向函数之前,层的x和bnScaleData、bnBiasData数据必须保持不变。 请注意这两个参数可以为NULL,但只能同时为NULL。建议使用此cache,因为内存开销相对较小。
activationDesc
输入。激活操作的张量描述符。
当bnOps输入设置为MCDNN_BATCHNORM_OPS_BN_ACTIVATION或MCDNN_BATCHNORM_OPS_BN_ADD_ACTIVATION时,将使用此激活,否则用户可以传入NULL。
workspace, workSpaceSizeInBytes
输入。workspace是指向GPU工作空间的指针,workSpaceSizeInBytes是workspace的大小。当workspace不为NULL且workSpaceSizeInBytes足够大,张量布局为NHWC且数据类型配置受支持时,此函数将触发一个新的半持久NHWC内核以进行BN操作。此workspace不需要清理。此外,workspace不需要在正向和反向传递之间保持不变。
reserveSpace
输入。指针,指向用作reserveSpace的GPU工作空间。
reserveSpaceSizeInBytes
输入。reserveSpace的大小。必须等于或大于mcdnnGetBatchNormalizationTrainingExReserveSpaceSize()所需的量。
支持的mcdnnBatchNormalizationForwardTrainingEx()配置
数据类型 配置 |
xDesc |
bnScale BiasMean VarDesc |
alpha, beta |
zDesc |
yDesc |
|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
不支持 |
|
|
|
|
|
不支持 |
|
返回值
MCDNN_STATUS_SUCCESS
计算已成功执行。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
alpha、beta、x、y、bnScaleData和bnBiasData中任一指针为NULL。
xDesc或yDesc张量描述符维数不在[4,5]范围内(仅支持4D和5D张量)。
spatial模式下,4D张量中bnScaleBiasMeanVarDesc的维度不是1xCx1x1,5D张量中不是1xCx1x1x1;per-activation模式下,4D张量中不是1xCxHxW,5D张量中不是1xCxDxHxW。
saveMean和saveInvVariance指针中只有一个为NULL。
resultRunningMeanData和resultRunningInvVarianceData指针中只有一个为NULL。
epsilon值小于MCDNN_BN_MIN_EPSILON。
xDesc和yDesc的维度或数据类型不匹配。
3.1.1.6. mcdnnDivisiveNormalizationBackward()
该函数执行反向DivisiveNormalization层计算。
mcdnnStatus_t mcdnnDivisiveNormalizationBackward(
mcdnnHandle_t handle,
mcdnnLRNDescriptor_t normDesc,
mcdnnDivNormMode_t mode,
const void *alpha,
const mcdnnTensorDescriptor_t xDesc,
const void *x,
const void *means,
const void *dy,
void *temp,
void *temp2,
const void *beta,
const mcdnnTensorDescriptor_t dxDesc,
void *dx,
void *dMeans)
支持的张量格式为NCHW(适用于4D)和NCDHW(适用于5D),具有任意非重叠非负值步幅。仅支持4D和5D张量。
参数
handle
输入。已创建的mcDNN库描述符的句柄。
normDesc
输入。已初始化的LRN参数描述符的句柄(此描述符用于LRN和DivisiveNormalization层)。
mode
输入。DivisiveNormalization层操作模式。目前仅支持实现MCDNN_DIVNORM_PRECOMPUTED_MEANS。归一化是使用用户要预计算的均值输入张量来执行的。
alpha, beta
输入。指向缩放系数(主机内存中)的指针,用于将层输出值与目标张量中的先验值混合,如下所示: dstValue = alpha[0]*resultValue + beta[0]*priorDstValue。
xDesc, x, means
输入。设备内存中用于层的x和means数据的张量描述符和指针。请注意,means张量应由用户进行预计算。它还可以包含任意有效值(不需要是实际means值,例如可以是高斯内核卷积的结果)。
dy
输入。设备内存中的张量指针,用于层的dy累积损失差分数据(cumulative loss differential data)(错误反向传播)。
temp, temp2
Workspace. 设备内存中的临时张量。这些张量用于在反向传递过程中计算中间值。但在从正向到反向传递的过程中可以不保留。正向和反向传递都使用xDesc作为其描述符。
dxDesc
输入。dx和dMeans的张量描述符。
dx, dMeans
输出。设备内存中的张量指针,用于输出累积梯度dx和dMeans(dLoss/dx和dLoss/dMeans)的层。两者共享相同的描述符。
返回值
MCDNN_STATUS_SUCCESS
计算已成功执行。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
x,dx,temp和temp2中任一张量指针为NULL。
任意输入张量或输出张量的维数不在[4,5]范围内。
alpha或beta指针为NULL。
xDesc和dxDesc之间的维度不匹配。
LRN描述符参数超出其有效范围。
任意张量步幅均为负的。
MCDNN_STATUS_UNSUPPORTED
该函数不支持已提供的配置,例如,不支持输入和输出张量之间的步幅不匹配(同一维度下)。
3.1.1.7. mcdnnDropoutBackward()
此函数以dy执行反向丢弃操作,以dx返回结果。 如果在正向丢弃操作期间,x上的值被传播到y,那么在反向丢弃操作期间,dy的值会传播到dx,否则,dx值将设置为0。
mcdnnStatus_t mcdnnDropoutBackward(
mcdnnHandle_t handle,
const mcdnnDropoutDescriptor_t dropoutDesc,
const mcdnnTensorDescriptor_t dydesc,
const void *dy,
const mcdnnTensorDescriptor_t dxdesc,
void *dx,
void *reserveSpace,
size_t reserveSpaceSizeInBytes)
完全压缩的张量可获得更好的性能。
参数
handle
输入。已创建的mcDNN上下文的句柄。
dropoutDesc
输入。已创建的丢弃描述符对象。
dyDesc
输入。已初始化的张量描述符的句柄。
dy
输入。指针,指向dyDesc描述符描述的张量数据。
dxDesc
输入。已初始化的张量描述符的句柄。
dx
输出。指针,指向dxDesc描述符描述的张量数据。
reserveSpace
输入。指针,指向此函数使用的用户分配的GPU内存。在调用mcdnnDropoutForward时填充的reserveSpace,且未更改。
reserveSpaceSizeInBytes
输入。指定为预留空间提供的内存大小(以字节为单位)。
返回值
MCDNN_STATUS_SUCCESS
调用成功。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
输入张量和输出张量的元素数不同。
输入张量和输出张量的数据类型不同。
输入张量和输出张量的步幅不同,并使用就地操作(即x和y指针相等)。
提供的reserveSpaceSizeInBytes小于mcdnnDropoutGetReserveSpaceSize()返回的值。
没有在带有非NULL状态参数的dropoutDesc上调用mcdnnSetDropoutDescriptor()。
MCDNN_STATUS_EXECUTION_FAILED
此函数在GPU上启用失败。
3.1.1.8. mcdnnGetBatchNormalizationBackwardExWorkspaceSize()
此函数返回用户应分配的工作空间GPU内存量,以便能够为指定的bnOps输入设置来调用mcdnnGetBatchNormalizationBackwardExWorkspaceSize()函数。然后,分配的workspace将传入mcdnnGetBatchNormalizationBackwardExWorkspaceSize()函数。
mcdnnStatus_t mcdnnGetBatchNormalizationBackwardExWorkspaceSize(
mcdnnHandle_t handle,
mcdnnBatchNormMode_t mode,
mcdnnBatchNormOps_t bnOps,
const mcdnnTensorDescriptor_t xDesc,
const mcdnnTensorDescriptor_t yDesc,
const mcdnnTensorDescriptor_t dyDesc,
const mcdnnTensorDescriptor_t dzDesc,
const mcdnnTensorDescriptor_t dxDesc,
const mcdnnTensorDescriptor_t dBnScaleBiasDesc,
const mcdnnActivationDescriptor_t activationDesc,
size_t *sizeInBytes)
参数
handle
输入。已创建的mcDNN库描述符的句柄。更多信息,参见mcdnnHandle_t。
mode
输入。操作模式(spatial或per-activation)。更多信息,参见mcdnnBatchNormMode_t。
bnOps
输入。快速NHWC内核的操作模式。更多信息,参见mcdnnBatchNormOps_t。此输入可用于将此函数设置为仅执行BN,或先执行BN再执行激活,或先执行BN再执行元素级加法,然后执行激活。
xDesc, yDesc, dyDesc, dzDesc, dxDesc
设备内存中的张量描述符和指针,用于层的x数据,反向传播差分dy(输入),可选y输入数据,可选dz输出和dx输出(关于x的结果差分)。更多信息,参见mcdnnTensorDescriptor_t。
dBnScaleBiasDesc
输入。以下6个张量的共享张量描述符:bnScaleData、bnBiasData、dBnScaleData、dBnBiasData、savedMean和savedInvVariance。共享张量描述符,用于通过mcdnnDeriveBNTensorDescriptor()获取的辅助张量。此张量描述符的维度取决于归一化模式。请注意,对于FP16和FP32输入张量,此张量描述符的数据类型必须为float;对于FP64输入张量,此张量描述符的数据类型必须为double。
activationDesc
输入。激活操作的描述符。
当bnOps输入设置为MCDNN_BATCHNORM_OPS_BN_ACTIVATION或MCDNN_BATCHNORM_OPS_BN_ADD_ACTIVATION时,将使用此激活,否则用户可以传入NULL。
sizeInBytes
输出。工作空间所需的GPU内存量,由该函数确定,以便能够使用指定的bnOps输入设置来执行mcdnnGetBatchNormalizationForwardTrainingExWorkspaceSize()函数。
返回值
MCDNN_STATUS_SUCCESS
计算已成功执行。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
xDesc、yDesc或dxDesc张量描述符维数不在[4,5]范围内(仅支持4D和5D张量)。
spatial模式下,4D张量中dBnScaleBiasDesc的维度不是1xCx1x1,5D张量中不是1xCx1x1x1;per-activation模式下,4D张量中不是1xCxHxW,5D张量中不是1xCxDxHxW。
任意一对xDesc、dyDesc或dxDesc的维度或数据类型不匹配。
3.1.1.9. mcdnnGetBatchNormalizationForwardTrainingExWorkspaceSize()
此函数返回用户应分配的工作空间GPU内存量,以便能够为指定的bnOps输入设置来调用mcdnnGetBatchNormalizationForwardTrainingExWorkspaceSize()函数。然后,分配的workspace应由用户传入该函数。
mcdnnGetBatchNormalizationForwardTrainingExWorkspaceSize().
mcdnnStatus_t mcdnnGetBatchNormalizationForwardTrainingExWorkspaceSize(
mcdnnHandle_t handle,
mcdnnBatchNormMode_t mode,
mcdnnBatchNormOps_t bnOps,
const mcdnnTensorDescriptor_t xDesc,
const mcdnnTensorDescriptor_t zDesc,
const mcdnnTensorDescriptor_t yDesc,
const mcdnnTensorDescriptor_t bnScaleBiasMeanVarDesc,
const mcdnnActivationDescriptor_t activationDesc,
size_t *sizeInBytes);
参数
handle
输入。已创建的mcDNN库描述符的句柄。更多信息,参见mcdnnHandle_t。
mode
输入。操作模式(spatial或per-activation)。更多信息,参见mcdnnBatchNormMode_t。
bnOps
输入。快速NHWC内核的操作模式。更多信息,参见mcdnnBatchNormOps_t。此输入可用于将此函数设置为仅执行BN,或先执行BN再执行激活,或先执行BN再执行元素级加法,然后执行激活。
xDesc, zDesc, yDesc
设备内存中的张量描述符和指针,用于层的x数据,可选z输入数据和y输出。仅当bnOps为MCDNN_BATCHNORM_OPS_BN_ADD_ACTIVATION时才需要zDesc,否则用户可以传入NULL。更多信息,参见mcdnnTensorDescriptor_t。
bnScaleBiasMeanVarDesc
输入。以下6个张量的共享张量描述符:bnScaleData、bnBiasData、dBnScaleData、dBnBiasData、savedMean和savedInvVariance。 共享张量描述符,用于通过mcdnnDeriveBNTensorDescriptor()获取的辅助张量。此张量描述符的维度取决于归一化模式。请注意,对于FP16和FP32输入张量,此张量描述符的数据类型必须为float;对于FP64输入张量,此张量描述符的数据类型必须为double。
activationDesc
输入。激活操作的描述符。
当bnOps输入设置为MCDNN_BATCHNORM_OPS_BN_ACTIVATION或MCDNN_BATCHNORM_OPS_BN_ADD_ACTIVATION时,将使用此激活,否则用户可以传入NULL。
sizeInBytes
输出。工作空间所需的GPU内存量,由该函数确定,以便能够使用指定的bnOps输入设置来执行mcdnnGetBatchNormalizationForwardTrainingExWorkspaceSize()函数。
返回值
MCDNN_STATUS_SUCCESS
计算已成功执行。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
xDesc、yDesc或dxDesc张量描述符维数不在[4,5]范围内(仅支持4D和5D张量)。
spatial模式下,4D张量中dBnScaleBiasDesc的维度不是1xCx1x1,5D张量中不是1xCx1x1x1;per-activation模式下,4D张量中不是1xCxHxW,5D张量中不是1xCxDxHxW。
xDesc或yDesc的维度或数据类型不匹配。
3.1.1.10. mcdnnGetBatchNormalizationTrainingExReserveSpaceSize()
此函数返回用户应分配的预留工作空间GPU内存量,以用于为指定的bnOps输入设置执行BN操作。 与工作空间不同,预留空间应保留在正向和反向调用之间,并且不应更改数据。
mcdnnStatus_t mcdnnGetBatchNormalizationTrainingExReserveSpaceSize(
mcdnnHandle_t handle,
mcdnnBatchNormMode_t mode,
mcdnnBatchNormOps_t bnOps,
const mcdnnActivationDescriptor_t activationDesc,
const mcdnnTensorDescriptor_t xDesc,
size_t *sizeInBytes);
参数
handle
输入。已创建的mcDNN库描述符的句柄。更多信息,参见mcdnnHandle_t。
mode
输入。操作模式(spatial或per-activation)。更多信息,参见mcdnnBatchNormMode_t。
bnOps
输入。快速NHWC内核的操作模式。更多信息,参见mcdnnBatchNormOps_t。此输入可用于将此函数设置为仅执行BN,或先执行BN再执行激活,或先执行BN再执行元素级加法,然后执行激活。
xDesc
用于层的x数据的张量描述符。更多信息,参见mcdnnTensorDescriptor_t。
activationDesc
输入。激活操作的描述符。
当bnOps输入设置为MCDNN_BATCHNORM_OPS_BN_ACTIVATION或MCDNN_BATCHNORM_OPS_BN_ADD_ACTIVATION时,将使用此激活,否则用户可以传入NULL。
sizeInBytes
输出。预留的GPU内存量。
返回值
MCDNN_STATUS_SUCCESS
计算已成功执行。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
xDesc张量描述符维数不在[4,5]范围内(仅支持4D和5D张量)。
3.1.1.11. mcdnnGetNormalizationBackwardWorkspaceSize()
此函数返回用户应分配的工作空间GPU内存量,以便能够为指定的normOps和algo输入设置来调用mcdnnNormalizationBackward()函数。然后,分配的workspace将传入mcdnnNormalizationBackward()函数。
mcdnnStatus_t
mcdnnGetNormalizationBackwardWorkspaceSize(mcdnnHandle_t handle,
mcdnnNormMode_t mode,
mcdnnNormOps_t normOps,
mcdnnNormAlgo_t algo,
const mcdnnTensorDescriptor_t xDesc,
const mcdnnTensorDescriptor_t yDesc,
const mcdnnTensorDescriptor_t dyDesc,
const mcdnnTensorDescriptor_t dzDesc,
const mcdnnTensorDescriptor_t dxDesc,
const mcdnnTensorDescriptor_t
dNormScaleBiasDesc,
const mcdnnActivationDescriptor_t
activationDesc,
const mcdnnTensorDescriptor_t
normMeanVarDesc,
size_t *sizeInBytes,
int groupCnt);
参数
handle
输入。已创建的mcDNN库描述符的句柄。更多信息,参见mcdnnHandle_t。
mode
输入。操作模式(per-channel或per-activation)。更多信息,参见mcdnnNormMode_t。
normOps
输入。post-operative模式。目前,仅在NHWC布局中支持MCDNN_NORM_OPS_NORM_ACTIVATION和MCDNN_NORM_OPS_NORM_ADD_ACTIVATION。更多信息,参见mcdnnNormOps_t。此输入可用于将此函数设置为仅执行归一化,或先执行归一化再执行激活,或先执行归一化再执行元素级加法,然后执行激活。
algo
输入。要执行的算法。更多信息,参见mcdnnNormAlgo_t。
xDesc, yDesc, dyDesc, dzDesc, dxDesc
输入。设备内存中的张量描述符和指针,用于层的x数据,反向传播差分dy(输入),可选y输入数据,可选dz输出和dx输出(关于x的结果差分)。更多信息,参见mcdnnTensorDescriptor_t。
dNormScaleBiasDesc
输入。以下4个张量的共享张量描述符:normScaleData、normBiasData、dNormScaleData、dNormBiasData。此张量描述符的维度取决于归一化模式。请注意,对于FP16和FP32输入张量,此张量描述符的数据类型必须为float;对于FP64输入张量,此张量描述符的数据类型必须为double。
activationDesc
输入。激活操作的描述符。
当normOps输入设置为MCDNN_NORM_OPS_NORM_ACTIVATION或MCDNN_NORM_OPS_NORM_ADD_ACTIVATION时,将使用此激活,否则用户可以传入NULL。
normMeanVarDesc
输入。以下张量的共享张量描述符:savedMean和savedInvVariance。此张量描述符的维度取决于归一化模式。请注意,对于FP16和FP32输入张量,此张量描述符的数据类型必须为float;对于FP64输入张量,此张量描述符的数据类型必须为double。
sizeInBytes
输出。工作空间所需的GPU内存量,由该函数确定,以便能够使用指定的normOps输入设置来执行mcdnnGetNormalizationForwardTrainingWorkspaceSize()函数。
groupCnt
输入。分组卷积数。当前仅支持1。
返回值
MCDNN_STATUS_SUCCESS
计算已成功执行。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
xDesc、yDesc或dxDesc张量描述符维数不在[4,5]范围内(仅支持4D和5D张量)。
per-channel模式下,4D张量中dNormScaleBiasDesc的维度不是1xCx1x1,5D张量中不是1xCx1x1x1;per-activation模式下,4D张量中不是1xCxHxW,5D张量中不是1xCxDxHxW。
任意一对xDesc、dyDesc或dxDesc的维度或数据类型不匹配。
3.1.1.12. mcdnnGetNormalizationForwardTrainingWorkspaceSize()
此函数返回用户应分配的工作空间GPU内存量,以便能够为指定的normOps和algo输入设置来调用mcdnnNormalizationForwardTraining()函数。 The workspace allocated should t
mcdnnStatus_t
mcdnnGetNormalizationForwardTrainingWorkspaceSize(mcdnnHandle_t handle,
mcdnnNormMode_t mode,
mcdnnNormOps_t normOps,
mcdnnNormAlgo_t algo,
const mcdnnTensorDescriptor_t xDesc,
const mcdnnTensorDescriptor_t
zDesc,
const mcdnnTensorDescriptor_t
yDesc,
const mcdnnTensorDescriptor_t
normScaleBiasDesc,
const mcdnnActivationDescriptor_t
activationDesc,
const mcdnnTensorDescriptor_t
normMeanVarDesc,
size_t *sizeInBytes,
int groupCnt);
参数
handle
输入。已创建的mcDNN库描述符的句柄。更多信息,参见mcdnnHandle_t。
mode
输入。操作模式(per-channel或per-activation)。更多信息,参见mcdnnNormMode_t。
normOps
输入。post-operative模式。目前,仅在NHWC布局中支持MCDNN_NORM_OPS_NORM_ACTIVATION和MCDNN_NORM_OPS_NORM_ADD_ACTIVATION。更多信息,参见mcdnnNormOps_t。此输入可用于将此函数设置为仅执行归一化,或先执行归一化再执行激活,或先执行归一化再执行元素级加法,然后执行激活。
algo
输入。要执行的算法。更多信息,参见mcdnnNormAlgo_t。
xDesc, zDesc, yDesc
设备内存中的张量描述符和指针,用于层的x数据,可选z输入数据和y输出。仅当normOps为MCDNN_NORM_OPS_NORM_ADD_ACTIVATION时才需要zDesc,否则用户可以传入NULL。更多信息,参见mcdnnTensorDescriptor_t。
normScaleBiasDesc
输入。以下张量的共享张量描述符:normScaleData和normBiasData。此张量描述符的维度取决于归一化模式。请注意,对于FP16和FP32输入张量,此张量描述符的数据类型必须为float;对于FP64输入张量,此张量描述符的数据类型必须为double。
activationDesc
输入。激活操作的描述符。
当normOps输入设置为MCDNN_NORM_OPS_NORM_ACTIVATION或MCDNN_NORM_OPS_NORM_ADD_ACTIVATION时,将使用此激活,否则用户可以传入NULL。
normMeanVarDesc
输入。以下张量的共享张量描述符:savedMean和savedInvVariance。此张量描述符的维度取决于归一化模式。请注意,对于FP16和FP32输入张量,此张量描述符的数据类型必须为float;对于FP64输入张量,此张量描述符的数据类型必须为double。
sizeInBytes
输出。工作空间所需的GPU内存量,由该函数确定,以便能够使用指定的normOps输入设置来执行mcdnnGetNormalizationForwardTrainingWorkspaceSize()函数。
groupCnt
输入。分组卷积数。当前仅支持1。
返回值
MCDNN_STATUS_SUCCESS
计算已成功执行。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
xDesc、yDesc或zDesc张量描述符维数不在[4,5]范围内(仅支持4D和5D张量)。
per-channel模式下,4D张量中normScaleBiasDesc的维度不是1xCx1x1,5D张量中不是1xCx1x1x1;per-activation模式下,4D张量中不是1xCxHxW,5D张量中不是1xCxDxHxW。
xDesc或yDesc的维度或数据类型不匹配。
3.1.1.13. mcdnnGetNormalizationTrainingReserveSpaceSize()
此函数返回用户应分配的预留工作空间GPU内存量,以用于为指定的normOps输入设置执行归一化操作。与工作空间不同,预留空间应保留在正向和反向调用之间,并且不应更改数据。
mcdnnStatus_t
mcdnnGetNormalizationTrainingReserveSpaceSize(mcdnnHandle_t handle,
mcdnnNormMode_t mode,
mcdnnNormOps_t normOps,
mcdnnNormAlgo_t algo,
const mcdnnActivationDescriptor_t
activationDesc,
const mcdnnTensorDescriptor_t xDesc,
size_t *sizeInBytes,
int groupCnt);
参数
handle
输入。已创建的mcDNN库描述符的句柄。更多信息,参见mcdnnHandle_t。
mode
输入。操作模式(per-channel或per-activation)。更多信息,参见mcdnnNormMode_t。
normOps
输入。post-operative模式。目前,仅在NHWC布局中支持MCDNN_NORM_OPS_NORM_ACTIVATION和MCDNN_NORM_OPS_NORM_ADD_ACTIVATION。更多信息,参见mcdnnNormOps_t。此输入可用于将此函数设置为仅执行归一化,或先执行归一化再执行激活,或先执行归一化再执行元素级加法,然后执行激活。
algo
输入。要执行的算法。更多信息,参见mcdnnNormAlgo_t。
xDesc
用于层的x数据的张量描述符。更多信息,参见mcdnnTensorDescriptor_t。
activationDesc
输入。激活操作的描述符。
当normOps输入设置为MCDNN_NORM_OPS_NORM_ACTIVATION或MCDNN_NORM_OPS_NORM_ADD_ACTIVATION时,将使用此激活,否则用户可以传入NULL。
sizeInBytes
输出。预留的GPU内存量。
groupCnt
输入。分组卷积数。当前仅支持1。
返回值
MCDNN_STATUS_SUCCESS
计算已成功执行。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
xDesc张量描述符维数不在[4,5]范围内(仅支持4D和5D张量)。
3.1.1.14. mcdnnLRNCrossChannelBackward()
该函数执行反向LRN层计算。
mcdnnStatus_t mcdnnLRNCrossChannelBackward(
mcdnnHandle_t handle,
mcdnnLRNDescriptor_t normDesc,
mcdnnLRNMode_t lrnMode,
const void *alpha,
const mcdnnTensorDescriptor_t yDesc,
const void *y,
const mcdnnTensorDescriptor_t dyDesc,
const void *dy,
const mcdnnTensorDescriptor_t xDesc,
const void *x,
const void *beta,
const mcdnnTensorDescriptor_t dxDesc,
void *dx)
支持的格式包括:positive-strided,NCHW和NHWC(适用于4D x和y),以及5D中仅支持NCDHW DHW-packed(适用于x和y)。仅支持非重叠4D和5D张量。使用NCHW布局,性能更优。
参数
handle
输入。已创建的mcDNN库描述符的句柄。
normDesc
输入。已初始化的LRN参数描述符的句柄。
lrnMode
输入。LRN层操作模式。目前仅支持实现MCDNN_LRN_CROSS_CHANNEL_DIM1。归一化在张量的dimA[1]维中执行。
alpha, beta
输入。指向缩放系数(主机内存中)的指针,用于将层输出值与目标张量中的先验值混合,如下所示: dstValue = alpha[0]*resultValue + beta[0]*priorDstValue。
yDesc, y
输入。设备内存中用于层的y数据的张量描述符和指针。
dyDesc, dy
输入。设备内存中的张量描述符和指针,用于层的dy输入累积损失差分数据(包括错误反向传播)。
xDesc, x
输入。设备内存中用于层的x数据的张量描述符和指针。请注意,在反向传播过程中不会修改这些值。
dxDesc, dx
输出。设备内存中的张量描述符和指针,用于层的dx累积损失差分数据结果(包括错误反向传播)。
返回值
MCDNN_STATUS_SUCCESS
计算已成功执行。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
x和y中任一张量指针为NULL。
输入张量维数小于或等于2。
LRN描述符参数超出其有效范围。
任一张量参数为5D,但不是NCDHW DHW-packed格式。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。不受支持的配置示例如下:
任意输入张量数据类型都与输出张量数据类型不同。
x,y,dx或dy的任何成对(pairwise)张量维度不匹配。
任意张量参数步幅均为负的。
3.1.1.15. mcdnnNormalizationBackward()
此函数执行模式指定的反向归一化层计算。对于per-channel归一化层,可参见Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift。
mcdnnStatus_t
mcdnnNormalizationBackward(mcdnnHandle_t handle,
mcdnnNormMode_t mode,
mcdnnNormOps_t normOps,
mcdnnNormAlgo_t algo,
const void *alphaDataDiff,
const void *betaDataDiff,
const void *alphaParamDiff,
const void *betaParamDiff,
const mcdnnTensorDescriptor_t xDesc,
const void *xData,
const mcdnnTensorDescriptor_t yDesc,
const void *yData,
const mcdnnTensorDescriptor_t dyDesc,
const void *dyData,
const mcdnnTensorDescriptor_t dzDesc,
void *dzData,
const mcdnnTensorDescriptor_t dxDesc,
void *dxData,
const mcdnnTensorDescriptor_t dNormScaleBiasDesc,
const void *normScaleData,
const void *normBiasData,
void *dNormScaleData,
void *dNormBiasData,
double epsilon,
const mcdnnTensorDescriptor_t normMeanVarDesc,
const void *savedMean,
const void *savedInvVariance,
mcdnnActivationDescriptor_t activationDesc,
void *workSpace,
size_t workSpaceSizeInBytes,
void *reserveSpace,
size_t reserveSpaceSizeInBytes,
int groupCnt)
仅支持4D和5D张量。
在训练,反向传播和推理过程中的epsilon值必须相同。 此workspace不需要清理。此外,workspace不必在正向和反向传递之间保持不变,因为它不用于传递任何信息。
此函数可以接受指向GPU workspace的workspace指针,以及来自用户的workSpaceSizeInBytes(workspace大小)。
normOps输入可用于将此函数设置为仅执行归一化,或先执行归一化再执行激活,或先执行归一化再执行元素级加法,然后执行激活。
张量布局为NCHW时,若x、dy和dx都使用HW-packed张量时,可以获得更高的性能。
当满足以下条件时,可以获得MCDNN_NORM_PER_CHANNEL模式的更高性能:
所有张量,即x、y、dz、dy和dx,必须是NHWC完全压缩,并且类型必须是MCDNN_DATA_HALF。
C张量维度应为4的倍数。
输入参数模式必须设置为MCDNN_NORM_PER_CHANNEL。
输入参数算法必须设置为MCDNN_NORM_ALGO_PERSIST。
workspace不是NULL。
WorkSpaceSizeInBytes等于或大于mcdnnGetNormalizationBackwardWorkspaceSize()所需的量。
ReserveSpaceSizeInBytes等于或大于mcdnnGetNormalizationTrainingReserveSpaceSize()所需的量。
必须保留使用mcdnnNormalizationForwardTraining()存储在reserveSpace中的内容。
参数
handle
输入。已创建的mcDNN库描述符的句柄。更多信息,参见mcdnnHandle_t。
mode
输入。操作模式(per-channel或per-activation)。更多信息,参见mcdnnNormMode_t。
normOps
输入。post-operative模式。目前,仅在NHWC布局中支持MCDNN_NORM_OPS_NORM_ACTIVATION和MCDNN_NORM_OPS_NORM_ADD_ACTIVATION。更多信息,参见mcdnnNormOps_t。此输入可用于将此函数设置为仅执行归一化,或先执行归一化再执行激活,或先执行归一化再执行元素级加法,然后执行激活。
algo
输入。要执行的算法。更多信息,参见mcdnnNormAlgo_t。
alphaDataDiff, betaDataDiff
输入。指向缩放系数(主机内存中)的指针,用于将dx梯度输出与目标张量中的先验值混合,如下所示: dstValue = alpha[0]*resultValue + beta[0]*priorDstValue。
alphaParamDiff, betaParamDiff
输入。指向缩放系数(主机内存中)的指针,用于将dNormScaleData和dNormBiasData梯度输出与目标张量中的先验值混合,如下所示: dstValue = alpha[0]*resultValue + beta[0]*priorDstValue。
xDesc, xData, yDesc, yData, dyDesc, dyData
输入。用于层的x数据,反向传播梯度输入dy,原始正向输出y数据的张量描述符和指针,位于设备内存中。如果normOps设置为MCDNN_NORM_OPS_NORM,则不需要yDesc和yData,用户可以传入NULL。更多信息,参见mcdnnTensorDescriptor_t。
dzDesc, dxDesc
输入。用于计算梯度输出dz和dx的张量描述符和指针,位于设备内存中。 当normOps为MCDNN_NORM_OPS_NORM或MCDNN_NORM_OPS_NORM_ACTIVATION时,不需要dzDesc,用户可以传入NULL。更多信息,参见mcdnnTensorDescriptor_t。
dzData, dxData
输出。用于计算梯度输出dz和dx的张量描述符和指针,位于设备内存中。 当normOps为MCDNN_NORM_OPS_NORM或MCDNN_NORM_OPS_NORM_ACTIVATION时,不需要dzData,用户可以传入NULL。更多信息,参见mcdnnTensorDescriptor_t。
dNormScaleBiasDesc
输入。以下4个张量的共享张量描述符:normScaleData、normBiasData、dNormScaleData、dNormBiasData。此张量描述符的维度取决于归一化模式。
备注
对于FP16和FP32输入张量,此张量描述符的数据类型必须为float。
对于FP64输入张量,必须为double。
normScaleData
输入。设备内存中指向归一化scale参数的指针。(在 Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift中,数量scale称为gamma)。
normBiasData
输入。设备内存中指向归一化bias参数的指针。(在 Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift中,bias称为beta)。 此参数仅在执行激活时使用。
dNormScaleData, dNormBiasData
输出。设备内存中分别指向normScaleData和normBiasData梯度的指针。
epsilon
输入。归一化公式中使用的Epsilon值。其值应等于或大于零。在正向和反向函数中应使用相同的Epsilon值。
normMeanVarDesc
输入。以下张量的共享张量描述符:savedMean和savedInvVariance。此张量描述符的维度取决于归一化模式。
备注
对于FP16和FP32输入张量,此张量描述符的数据类型必须为float;对于FP64输入张量,必须为double。
savedMean, savedInvVariance
输入。可选的cache参数,包含在正向传递过程中计算并保存的中间结果。为保证工作正常,在调用此反向函数之前,层的x和normScaleData、normBiasData数据必须保持不变。 请注意这两个参数可以为NULL,但只能同时为NULL。建议使用此cache,因为内存开销相对较小。
activationDesc
输入。激活操作的描述符。
当normOps输入设置为MCDNN_NORM_OPS_NORM_ACTIVATION或MCDNN_NORM_OPS_NORM_ADD_ACTIVATION时,将使用此激活,否则用户可以传入NULL。
workspace
输入。指向GPU工作空间的指针。
workSpaceSizeInBytes
输入。workspace的大小。它必须足够大,才能通过此函数触发快速NHWC半持久内核。
reserveSpace
输入。指针,指向用作reserveSpace的GPU工作空间。
reserveSpaceSizeInBytes
输入。reserveSpace的大小。它必须等于或大于mcdnnGetNormalizationTrainingReserveSpaceSize()所需的量。
groupCnt
输入。分组卷积的数量。当前仅支持1。
返回值
MCDNN_STATUS_SUCCESS
计算已成功执行。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
alphaDataDiff、betaDataDiff、alphaParamDiff、betaParamDiff、xData、dyData、dxData、normScaleData、dNormScaleData和dNormBiasData中任意指针为NULL。
xDesc、yDesc或dxDesc张量描述符维数不在[4,5]范围内(仅支持4D和5D张量)。
per-channel模式下,4D张量中dNormScaleBiasDesc的维度不是1xCx1x1,5D张量中不是1xCx1x1x1;per-activation模式下,4D张量中不是1xCxHxW,5D张量中不是1xCxDxHxW。
savedMean和savedInvVariance指针中只有一个为NULL。
epsilon的值小于0。
任意一对xDesc、dyDesc、dxDesc、dNormScaleBiasDesc或normMeanVarDesc的维度或数据类型不匹配。
3.1.1.16. mcdnnNormalizationForwardTraining()
此函数在训练阶段执行正向归一化层计算。根据模式,将执行不同的归一化操作。对于Per-channel层,可参见Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift。
mcdnnStatus_t
mcdnnNormalizationForwardTraining(mcdnnHandle_t handle,
mcdnnNormMode_t mode,
mcdnnNormOps_t normOps,
mcdnnNormAlgo_t algo,
const void *alpha,
const void *beta,
const mcdnnTensorDescriptor_t xDesc,
const void *xData,
const mcdnnTensorDescriptor_t normScaleBiasDesc,
const void *normScale,
const void *normBias,
double exponentialAverageFactor,
const mcdnnTensorDescriptor_t normMeanVarDesc,
void *resultRunningMean,
void *resultRunningVariance,
double epsilon,
void *resultSaveMean,
void *resultSaveInvVariance,
mcdnnActivationDescriptor_t activationDesc,
const mcdnnTensorDescriptor_t zDesc,
const void *zData,
const mcdnnTensorDescriptor_t yDesc,
void *yData,
void *workspace,
size_t workSpaceSizeInBytes,
void *reserveSpace,
size_t reserveSpaceSizeInBytes,
int groupCnt);
仅支持4D和5D张量。
在训练,反向传播和推理过程中的epsilon值必须相同。
有关推理阶段的信息,请参见mcdnnNormalizationForwardInference()。
当x和y都使用HW-packed张量时,可以获得更高的性能。
当满足以下条件时,此API将触发新的半持久NHWC内核:
所有张量,即xData和yData,必须是NHWC完全压缩,并且类型必须是MCDNN_DATA_HALF。
C张量维度应为4的倍数。
输入参数模式必须设置为MCDNN_NORM_PER_CHANNEL。
输入参数算法必须设置为MCDNN_NORM_ALGO_PERSIST。
workspace不是NULL。
WorkSpaceSizeInBytes等于或大于mcdnnGetNormalizationForwardTrainingWorkspaceSize()所需的量。
ReserveSpaceSizeInBytes等于或大于mcdnnGetNormalizationTrainingReserveSpaceSize()所需的量。
必须保留使用mcdnnNormalizationForwardTraining()存储在reserveSpace中的内容。
此workspace不需要清理。此外,workspace不必在正向和反向传递之间保持不变,因为它不用于传递任何信息。此扩展函数可以接受指向GPU workspace的workspace指针,以及来自用户的workSpaceSizeInBytes(workspace大小)。
normOps输入可用于将此函数设置为仅执行归一化,或先执行归一化再执行激活,或先执行归一化再执行元素级加法,然后执行激活。
仅支持4D和5D张量。在训练,反向传播和推理过程中的epsilon值必须相同。
张量布局为NCHW时,若xData和yData都使用HW-packed张量时,可以获得更高的性能。
参数
handle
输入。已创建的mcDNN库描述符的句柄。更多信息,参见mcdnnHandle_t。
mode
输入。操作模式(per-channel或per-activation)。更多信息,参见mcdnnNormMode_t。
normOps
输入。 post-operative模式。目前,仅在NHWC布局中支持MCDNN_NORM_OPS_NORM_ACTIVATION和MCDNN_NORM_OPS_NORM_ADD_ACTIVATION。更多信息,参见mcdnnNormOps_t。此输入可用于将此函数设置为仅执行归一化,或先执行归一化再执行激活,或先执行归一化再执行元素级加法,然后执行激活。
algo
输入。要执行的算法。更多信息,参见mcdnnNormAlgo_t。
alpha, beta
输入。指向缩放系数(主机内存中)的指针,用于将层输出值与目标张量中的先验值混合,如下所示: dstValue = alpha[0]*resultValue + beta[0]*priorDstValue。
xDesc, yDesc
输入。已初始化的张量描述符的句柄。
xData
输入。数据指针,指向与张量描述符xDesc关联的GPU内存,用于层的x输入数据。
yData
输出。数据指针,指向与张量描述符yDesc关联的GPU内存,用于归一化层的y输出。
zDesc, zData
输入。在激活之前,设备内存中用于归一化运算结果残差相加的张量描述符和指针。zDesc和zData是可选的,仅当normOps为MCDNN_NORM_OPS_NORM_ADD_ACTIVATION时使用,否则用户可以传入NULL。使用时,z的维度应与xData和最终输出y的维度完全相同。更多信息,参见mcdnnTensorDescriptor_t。
normScaleBiasDesc, normScale, normBias
输入。设备内存中用于归一化scale和bias参数的张量描述符和指针。 此张量描述符的维度取决于归一化模式。
exponentialAverageFactor
输入。移动平均(Moving Average,MA)计算中使用的系数如下:
runningMean = runningMean*(1-factor) + newMean*factor
在对函数的第N次调用中使用factor=1/(1+n)可进行累积移动平均(Cumulative Moving Average,CMA)计算,例如:
CMA[n] = (x[1]+…+x[n])/n
例如:
CMA[n+1] = (n*CMA[n]+x[n+1])/(n+1)
= ((n+1)*CMA[n]-CMA[n])/(n+1) + x[n+1]/(n+1)
= CMA[n]*(1-1/(n+1))+x[n+1]*1/(n+1)
= CMA[n]*(1-factor) + x(n+1)*factor
normMeanVarDesc
输入。用于以下张量的张量描述符:resultRunningMean, resultRunningVariance, resultSaveMean, resultSaveInvVariance。
resultRunningMean, resultRunningVariance
输入/输出。指向移动均值和移动方差数据的指针。这两个指针可以为NULL,但只能同时为NULL。存储在resultRunningVariance中(或作为推理模式中的输入被传入)的值是样本方差,是方差[x]的移动平均值,其中方差是根据模式在batch或spatial+batch维度上进行计算的。如果这些指针不为NULL,则张量应初始化为一些合理的值或0。
epsilon
输入。归一化公式中使用的Epsilon值。其值应等于或大于零。
resultSaveMean, resultSaveInvVariance
输出。可选的cache参数,包含在正向传递过程中计算并保存的中间结果。为保证工作正常,在调用此反向函数之前,层的x和normScale、normBias数据必须保持不变。请注意这两个参数可以为NULL,但只能同时为NULL。建议使用此cache,因为内存开销相对较小。
activationDesc
输入。激活操作的张量描述符。
当normOps输入设置为MCDNN_NORM_OPS_NORM_ACTIVATION或MCDNN_NORM_OPS_NORM_ADD_ACTIVATION时,将使用此激活,否则用户可以传入NULL。
workspace, workSpaceSizeInBytes
输入。workspace是指向GPU工作空间的指针,workSpaceSizeInBytes是workspace的大小。当workspace不为NULL且workSpaceSizeInBytes足够大,张量布局为NHWC且数据类型配置受支持时,此函数将触发一个半持久NHWC内核以进行归一化操作。此workspace不需要清理。此外,workspace不需要在正向和反向传递之间保持不变。
reserveSpace
输入。指针,指向用作reserveSpace的GPU工作空间。
reserveSpaceSizeInBytes
输入。reserveSpace的大小。必须等于或大于mcdnnGetNormalizationTrainingReserveSpaceSize()所需的量。
groupCnt
输入。分组卷积数。当前仅支持1。
支持的mcdnnNormalizationForwardTraining()配置
数据类型 配置 |
|
normScaleBiasDesc, normMeanVarDesc 数据类型 |
|---|---|---|
|
|
|
|
MCDNN_DATA_BFLOAT16 |
|
|
|
|
|
|
|
返回值
MCDNN_STATUS_SUCCESS
计算已成功执行。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
alpha、beta、xData、yData、normScale和normBias中任一指针为NULL。
xDesc或yDesc张量描述符维数不在[4,5]范围内(仅支持4D和5D张量)。
per-channel模式下,4D张量中normScaleBiasDesc的维度不是1xCx1x1,5D张量中不是1xCx1x1x1;per-activation模式下,4D张量中不是1xCxHxW,5D张量中不是1xCxDxHxW。
resultSaveMean和resultSaveInvVariance指针中只有一个为NULL。
resultRunningMean和resultRunningInvVariance指针中只有一个为NULL。
epsilon的值小于0。
xDesc或yDesc的维度或数据类型不匹配。
3.1.1.17. mcdnnOpsTrainVersionCheck()
此函数检查库的OpsTrain子集的版本是否与其他子库一致。
mcdnnStatus_t mcdnnOpsTrainVersionCheck(void)
返回值
MCDNN_STATUS_SUCCESS
版本与其他子库一致。
MCDNN_STATUS_VERSION_MISMATCH
OpsTrain的版本与其他子库不一致。用户应检查并确保所有子组件安装版本一致。
3.1.1.18. mcdnnPoolingBackward()
该函数计算池化操作的梯度。
mcdnnStatus_t mcdnnPoolingBackward(
mcdnnHandle_t handle,
const mcdnnPoolingDescriptor_t poolingDesc,
const void *alpha,
const mcdnnTensorDescriptor_t yDesc,
const void *y,
const mcdnnTensorDescriptor_t dyDesc,
const void *dy,
const mcdnnTensorDescriptor_t xDesc,
const void *xData,
const void *beta,
const mcdnnTensorDescriptor_t dxDesc,
void *dx)
备注
此函数中的任意张量描述符参数都不支持张量向量化。使用HW-packed张量,性能会最佳。只支持2个和3个空间维度。
mcdnnPoolingBackward()允许平均池化的x和y数据指针(以及相关的张量描述符句柄)为NULL。这可以节省内存空间和带宽。
参数
handle
输入。已创建的mcDNN上下文的句柄。
poolingDesc
输入。已初始化的池化描述符的句柄。
alpha, beta
输入。指向缩放系数(主机内存中)的指针,用于将计算结果与输出层中的先验值混合,如下所示: dstValue = alpha[0]*resultValue + beta[0]*priorDstValue。
yDesc
输入。已初始化的输入张量描述符的句柄。平均池化中可以为NULL。
y
输入。数据指针,指向与张量描述符yDesc关联的GPU内存。平均池化中可以为NULL。
dyDesc
输入。已初始化的输入差分张量描述符的句柄。 类型必须为FLOAT、DOUBLE、HALF或BFLOAT16。更多信息,参见mcdnnDataType_t。
dy
输入。数据指针,指向与张量描述符dyDesc关联的GPU内存。
xDesc
输入。已初始化的输出张量描述符的句柄。平均池化中可以为NULL。
x
输入。数据指针,指向与输出张量描述符xDesc关联的GPU内存。平均池化中可以为NULL。
dxDesc
输入。已初始化的输出差分张量描述符的句柄。 类型必须为FLOAT、DOUBLE、HALF或BFLOAT16。更多信息,参见mcdnnDataType_t。
dx
输出。数据指针,指向与输出张量描述符dxDesc关联的GPU内存。
返回值
MCDNN_STATUS_SUCCESS
此函数启用成功。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
yDesc和dyDesc张量的n,c,h,w维度不同。
yDesc和dyDesc张量的nStride、cStride、hStride和wStride步幅不同。
xDesc和dxDesc张量的n,c,h,w维度不同。
xDesc和dxDesc张量的nStride、cStride、hStride和wStride步幅不同。
4个张量的datatype不一样。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。不受支持的配置示例如下:
输入张量或输出张量的wStride不是1。
MCDNN_STATUS_EXECUTION_FAILED
此函数在GPU上启用失败。
3.1.1.19. mcdnnSoftmaxBackward()
此函数计算softmax函数的梯度。
mcdnnStatus_t mcdnnSoftmaxBackward(
mcdnnHandle_t handle,
mcdnnSoftmaxAlgorithm_t algorithm,
mcdnnSoftmaxMode_t mode,
const void *alpha,
const mcdnnTensorDescriptor_t yDesc,
const void *yData,
const mcdnnTensorDescriptor_t dyDesc,
const void *dy,
const void *beta,
const mcdnnTensorDescriptor_t dxDesc,
void *dx)
该函数支持就地操作(In-place Operation);这意味着,dy和dx指针可以一样。 但是,这要求dyDesc描述符和dxDesc描述符必须相同(特别是输入和输出的步幅必须匹配,才能支持就地操作)。 所有张量格式都支持4D和5D张量的所有模式和算法。 NCHW完全压缩格式(fully packed)张量的性能最佳。超过5个维度的张量,必须在其空间维度中进行压缩。
数据类型
此函数支持以下数据类型:
MCDNN_DATA_FLOAT
MCDNN_DATA_DOUBLE
MCDNN_DATA_HALF
MCDNN_DATA_BFLOAT16
参数
handle
输入。已创建的mcDNN上下文的句柄。
algorithm
输入。指定softmax算法的枚举。
mode
输入。指定softmax模式的枚举。
alpha, beta
输入。指向缩放系数(主机内存中)的指针,用于将计算结果与输出层中的先验值混合,如下所示: dstValue = alpha[0]*result + beta[0]*priorDstValue。
yDesc
输入。已初始化的输入张量描述符的句柄。
y
输入。数据指针,指向与张量描述符yDesc关联的GPU内存。
dyDesc
输入。已初始化的输入差分张量描述符的句柄。
dy
输入。数据指针,指向与张量描述符dyDesc关联的GPU内存。
dxDesc
输入。已初始化的输出差分张量描述符的句柄。
dx
输出。数据指针,指向与输出张量描述符dxDesc关联的GPU内存。
返回值
MCDNN_STATUS_SUCCESS
此函数启用成功。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
yDesc、dyDesc和dxDesc张量的n,c,h,w维度不同。
yDesc和dyDesc张量的nStride、cStride、hStride和wStride步幅不同。
3个张量的datatype不一样。
MCDNN_STATUS_EXECUTION_FAILED
此函数在GPU上启用失败。
3.1.1.20. mcdnnSpatialTfGridGeneratorBackward()
该函数计算网格生成(Grid Generation)操作的梯度。
mcdnnStatus_t mcdnnSpatialTfGridGeneratorBackward(
mcdnnHandle_t handle,
const mcdnnSpatialTransformerDescriptor_t stDesc,
const void *dgrid,
void *dtheta)
仅支持2D转换。
参数
handle
输入。已创建的mcDNN上下文的句柄。
stDesc
输入。已创建的空间转换描述符对象。
dgrid
输入。数据指针,指向包含输入差分数据的GPU内存。
dtheta
输出。数据指针,指向包含输出差分数据的GPU内存。
返回值
MCDNN_STATUS_SUCCESS
调用成功。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
handle为NULL。
dgrid和dtheta中任一参数为NULL。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。不受支持的配置示例如下:
stDesc中指定的转换张量的维度> 4。
MCDNN_STATUS_EXECUTION_FAILED
此函数在GPU上启用失败。
3.1.1.21. mcdnnSpatialTfSamplerBackward()
该函数计算采样(Sampling)操作的梯度。
mcdnnStatus_t mcdnnSpatialTfSamplerBackward(
mcdnnHandle_t handle,
const mcdnnSpatialTransformerDescriptor_t stDesc,
const void *alpha,
const mcdnnTensorDescriptor_t xDesc,
const void *x,
const void *beta,
const mcdnnTensorDescriptor_t dxDesc,
void *dx,
const void *alphaDgrid,
const mcdnnTensorDescriptor_t dyDesc,
const void *dy,
const void *grid,
const void *betaDgrid,
void *dgrid)
仅支持2d转换。
参数
handle
输入。已创建的mcDNN上下文的句柄。
stDesc
输入。已创建的空间转换描述符对象。
alpha, beta
输入。指向缩放系数(主机内存中)的指针,用于将源数值与目标张量中的先验值混合,如下所示: dstValue = alpha[0]*srcValue + beta[0]*priorDstValue。
xDesc
输入。已初始化的输入张量描述符的句柄。
x
输入。数据指针,指向与张量描述符xDesc关联的GPU内存。
dxDesc
输入。已初始化的输出差分张量描述符的句柄。
dx
输出。数据指针,指向与输出张量描述符dxDesc关联的GPU内存。
alphaDgrid, betaDgrid
输入。指向缩放系数(主机内存中)的指针,用于将dgrid梯度输出与目标指针中的先验值混合,如下所示: dstValue = alpha[0]*srcValue + beta[0]*priorDstValue。
dyDesc
输入。已初始化的输入差分张量描述符的句柄。
dy
输入。数据指针,指向与张量描述符dyDesc关联的GPU内存。
grid
输入。由mcdnnSpatialTfGridGeneratorForward()生成的坐标网格。
dgrid
输出。数据指针,指向包含输出差分数据的GPU内存。
返回值
MCDNN_STATUS_SUCCESS
调用成功。
MCDNN_STATUS_BAD_PARAM
需至少满足以下任一条件:
handle为NULL。
x、dx、y、dy、grid、dgrid中任一参数为NULL。
dy的维度与stDesc中指定的维度不同。
MCDNN_STATUS_NOT_SUPPORTED
此函数不支持已提供的配置。不受支持的配置示例如下:
转换张量的维度> 4。
MCDNN_STATUS_EXECUTION_FAILED
此函数在GPU上启用失败。