0

cudnnSoftmaxForwardの特定のフロート値セットを使用すると、CUDNN_SOFTMAX_ACCURATEの代わりにCUDNN_SOFTMAX_FASTを使用するとNaN出力が生成されます。誰がなぜこれが起こっているのか知っていますか?これは図書館のバグですか?ここでcudnn:CUDNN_SOFTMAX_ACCURATEが正常に動作したときにNaNを出力するCUDNN_SOFTMAX_FAST

cudnnHandle_t lib; 
cudnnCreate(&lib); 
int count = 10; 
size_t size = count * sizeof(float); 

float examples[] = { 
    95.094505f, 
    -600.288879f, 
    85.621284f, 
    72.220154f, 
    70.099487f, 
    43.734470f, 
    69.538422f, 
    69.705490f, 
    20.752966f, 
    81.020088f 
}; 

float* cexamples; 
cudaMalloc(&cexamples, size); 
cudaMemcpy(cexamples, examples, size, cudaMemcpyKind::cudaMemcpyHostToDevice); 

cudnnTensorDescriptor_t tExamples; 
cudnnCreateTensorDescriptor(&tExamples); 
cudnnSetTensor4dDescriptor(tExamples, cudnnTensorFormat_t::CUDNN_TENSOR_NCHW, cudnnDataType_t::CUDNN_DATA_FLOAT, 1, count, 1, 1); 

float one = 1; 
float zero = 0; 

cudnnSoftmaxForward(lib, cudnnSoftmaxAlgorithm_t::CUDNN_SOFTMAX_FAST, cudnnSoftmaxMode_t::CUDNN_SOFTMAX_MODE_INSTANCE, &one, tExamples, cexamples, &zero, tExamples, cexamples); 

cudaMemcpy(examples, cexamples, size, cudaMemcpyKind::cudaMemcpyDeviceToHost); 
for (size_t i = 0; i < count; i++) 
{ 
    printf("\n"); 
    printf("%f ", examples[i]); 
} 

CUDNN_SOFTMAX_FASTを使用して結果されています

enter image description here

ここではCUDNN_SOFTMAX_ACCURATEを使用した結果は以下のとおりです。

enter image description here

答えて

1

私はあなたの問題はあなたすなわち、オーバーフローによって引き起こされていることを推測(プロセスのどこかで)値が大きくなりすぎてfloat

CUDNN_SOFTMAX_FASTオーバーフローが発生したかどうかをチェックせずに実行するだけです。一方、CUDNN_SOFTMAX_ACCURATEはそれを回避します(減算を使用)。

CUDNNがオーバーフローにNaNを返し

は、私が提案することができるもの( 'スタンダール' Cは、おそらくこのように振る舞うないことに注意してください):(?normalizationを使用していない理由)

  • 使用小さな値を
  • ちょうどCUDNN_SOFTMAX_ACCURATE
を設定し、より大きなタイプを使用してみてください(ナイーブに見えますが、多分それは大丈夫だろう)

希望します。

pltrdy

関連する問題