GPU でのネットワーク学習の再現
この例では、GPU でネットワークに複数回学習させ、同一の結果を得る方法を示します。
GPU におけるモデルの学習と推論の再現性を確保することは、実験とデバッグに役立ちます。深層学習システムの検証では、GPU でのモデル学習を再現することが特に重要です。
学習データとネットワークの準備
サポート関数 prepareDigitsData と prepareAutoencoderLayers を使用し、学習データとネットワーク アーキテクチャを準備します。これらの関数は、この例にサポート ファイルとして添付されており、image-to-image 回帰用のデータストアの準備の例で説明されているように、データを準備して自己符号化器ネットワークを構築します。
[dsTrain,dsVal] = prepareDigitsData; layers = prepareAutoencoderLayers;
学習オプションの定義
学習オプションを指定します。このオプションは、次の例外を除いてimage-to-image 回帰用のデータストアの準備の例と同じです。
学習を 5 エポック行います。5 エポックはネットワークが収束するには不十分ですが、学習が正確に再現可能かどうかを示すには十分です。
最後の学習反復に対応するネットワークを返します。これにより、学習済みのネットワークを比較する際に公平な比較が保証されます。
GPU でネットワークに学習させます。既定では、関数
trainnetは利用可能な GPU がある場合にそれを使用します。GPU での学習には、Parallel Computing Toolbox™ ライセンスとサポートされている GPU デバイスが必要です。サポートされているデバイスの詳細については、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。すべての可視化を無効にします。
options = trainingOptions("adam", ... MaxEpochs=5, ... MiniBatchSize=500, ... ValidationData=dsVal, ... ValidationPatience=5, ... OutputNetwork="last-iteration", ... ExecutionEnvironment="gpu", ... Verbose=false);
GPU が選択されており、学習に使用できるかどうかを確認します。
gpu = gpuDevice;
disp(gpu.Name + " selected.")NVIDIA RTX A5000 selected.
2 回のネットワーク学習と結果の比較
trainnet関数を使用してネットワークに 2 回学習させます。乱数生成が学習に決して影響を与えないようにするには、学習の前に、それぞれrng関数とgpurng (Parallel Computing Toolbox)関数を使用して、CPU と GPU に乱数発生器とシードを設定します。
rng("default") gpurng("default") net1 = trainnet(dsTrain,layers,"mse",options); rng("default") gpurng("default") net2 = trainnet(dsTrain,layers,"mse",options);
学習済みのネットワークの学習可能なパラメーターが等しいかどうかを確認します。学習では非決定論的アルゴリズムが使用されるため、2 つのネットワークの学習可能なパラメーターは異なります。
isequal(net1.Learnables.Value,net2.Learnables.Value)
ans = logical
0
最初の学習実行と 2 番目の学習実行との間の最初の畳み込み層の重みの差をプロットします。プロットは、2 つのネットワークの重みにわずかな違いがあることを示しています。
learnablesDiff = net1.Learnables.Value{1}(:) - net2.Learnables.Value{1}(:);
learnablesDiff = extractdata(learnablesDiff);
figure
bar(learnablesDiff)
ylabel("Difference in Weight Value")
xlabel("Learnable Parameter Number")
決定論オプションの設定とネットワークの学習
deep.gpu.deterministicAlgorithms関数を使用して GPU の決定論状態を true に設定し、後で復元できるように GPU を決定論状態にする前の状態をキャプチャします。GPU 深層学習演算のこれ以降のすべての呼び出しでは、決定論的アルゴリズムのみが使用されます。
previousState = deep.gpu.deterministicAlgorithms(true);
trainnet 関数を使用してネットワークに 2 回学習させ、学習のたびに CPU と GPU の乱数発生器とシードを設定します。決定論的アルゴリズムのみを使用すると、学習と推論の速度が低下する可能性があります。
rng("default") gpurng("default") net3 = trainnet(dsTrain,layers,"mse",options); rng("default") gpurng("default") net4 = trainnet(dsTrain,layers,"mse",options);
学習済みのネットワークの学習可能なパラメーターが等しいかどうかを確認します。決定論的アルゴリズムのみが使用されているため、2 つのネットワークの学習可能なパラメーターは等しくなります。
isequal(net3.Learnables.Value,net4.Learnables.Value)
ans = logical
1
最初の学習実行と 2 番目の学習実行との間の最初の畳み込み層の重みの差をプロットします。プロットは、2 つのネットワークの重みに違いがないことを示しています。
learnablesDiff = net3.Learnables.Value{1}(:) - net4.Learnables.Value{1}(:);
learnablesDiff = extractdata(learnablesDiff);
figure
bar(learnablesDiff)
ylabel("Difference in Weight Value")
xlabel("Learnable Parameter Number")
GPU の決定論状態を元の値に戻します。
deep.gpu.deterministicAlgorithms(previousState);
参考
deep.gpu.deterministicAlgorithms | rng | gpurng (Parallel Computing Toolbox) | trainnet | trainingOptions
トピック
- 再現可能な乱数の生成
- GPU 上の乱数ストリーム (Parallel Computing Toolbox)
- ワーカー上の乱数ストリームの制御 (Parallel Computing Toolbox)