0

cudnnSoftmaxForward に float 値の特定のセットを使用すると、CUDNN_SOFTMAX_ACCURATE の代わりに設定 CUDNN_SOFTMAX_FAST が使用されたときに NaN 出力が生成されます。なぜこれが起こっているのか誰にも分かりますか?これはライブラリのバグですか?

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 を使用した結果は次のとおりです。

ここに画像の説明を入力

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

ここに画像の説明を入力

4

1 に答える 1

1

あなたの問題はオーバーフローによって引き起こされていると思います。つまり、(プロセスのどこかで) 値が大きくなりすぎてfloat.

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

CUDNN はオーバーフロー時に NaN を返します ('標準' C はおそらくこのように動作しないことに注意してください)

私が提案できること:

  • より小さい値を使用します (正規化を使用しないのはなぜですか?)
  • より大きな型を使用してみてください(素朴に見えますが、おそらく大丈夫でしょう)
  • 設定するだけCUDNN_SOFTMAX_ACCURATE

お役に立てれば

pltrdy

于 2017-01-04T13:45:39.163 に答える