pytorchマルチGPUのトレーニングの概要(DataParallelの使用)

免責事項:この記事はブロガーオリジナル記事です、BY-SAの著作権契約、複製、元のソースのリンクと、この文を添付してくださいCC 4.0に従ってください。
このリンクします。https://blog.csdn.net/weixin_40087578/article/details/87186613
ここに多くのピットを記録するためには、マルチGPUは、分散訓練でのみシングルサーバーマルチGPUの並列データの代わりに、複数のマシンのために電車を踏んpytorch

公式モデルをパッケージの最初に、アイデア


これは、参照を変更する必要があり、この公式によると、公式pytorch模式図です。

https://blog.csdn.net/qq_19598705/article/details/80396325

上記にもdataParallelオプティマイザ、第二の制御概略公式第二列、勾配モデル更新のそれぞれに勾配分布アウト(第2、第3行目)でパッケージ化することができ、その勾配を更新しますマスタGPUモデルパラメータ(最後のステップの2行目)にマージ

バックプロパゲーション勾配損失は、各GPUに配布される必要がない場合、各ディストリビューションモデルが、可能になる前まで時間が広がっているため、絶対に必要は勾配別々に計算して、モデルをマージし、ありません。時間前に配布モデルを広がっていくので、ちょうどメインGPU上でモデルを更新するために、総損失の傾きに応じて、モデルはもはや、他の上のGPUを同期しないことがあります。

dataParallel包装オプティマイザなし上記のリンクでそう。       

並列コンピューティングDataParallel伝播が前方にのみあり

手順の概要:

OSのインポート
インポートトーチ
=「2,7」をargs.gpu_id; ID番号は、GPUの指定された
CPUのかどうかを決定したargs.cuda = args.no_cudaとtorch.cuda.is_availableない()#を
#構成は、実行時に一時的な環境かもしれ=のCUDA_VISIBLE_DEVICES '2,7' train.pyパイソンを指定する
[ 'CUDA_VISIBLE_DEVICES']はos.environ =#args.gpu_idここで割り当てた文字列、リストが与えられなければならない
device_ids =範囲(torch.cuda.device_count()) #torch .cuda.device_count()= 2
#device_ids = [0,1] 0 2を指定した場合、フロントGPUは,. 1が7であり、そしてメインGPUによって分散モデルデータ

IF arg.cuda:
モデルmodel.cuda =( )ここでレプリケーションモデル#GPUに、デフォルトのCUDA( '0')、即ち、第一GPU 2
(DEVICE_ID)lenのIF> 1:
モデル= torch.nn.DaraParallel(モデル)のモデルは#を有していることを条件とします.cuda()

データ#フロントは(また、CUDAを伝播する)、すなわち、主GPUにコピー
PBARに(データ、ラベル)、batch_idx用:
args.cuda IF:
データ、ラベル= data.cuda()、ラベル.cuda()。
=可変data_v(データ)
target_var =変数(ラベル)
予測モデル=(data_v、target_var、引数)
ここでは2つの組み合わせGPU以前から構成され#予測の予測結果は、最初の並列計算の存在が中を伝播
伝播フロント#各GPUは他の上前伝播量BATCH_SIZE / LEN(device_ids)を、計算し、メインのGPUをもたらす
#prediction長= BATCH_SIZEの

基準= nn.CrossEntropyLoss()
損失=基準(予測、target_var)#計算損失
オプティマイザ。 zero_grad()
loss.backward()
optimizer.step()
関数呼び出し機能の後に連続してモデルは、例えばmodel.state_dict()、model.load_state_dict(torch.load(のために直接呼び出すことができ model_path)...... ではありませんその効果は、.module model.module.forward_getfeature(X)関数が書き込み動作に平行でないジョブを書き込むための機能を追加するために、本体のみGPUの前方に伝播.DataParallelのみ並列計算操作があります。しかし、思考の変化または書面による前方があるかもしれないことは、前方にいくつかのパラメータが戻ると予測し、機能を返却する必要はありません以上のコールであります

第二に、マルチGPU負荷の不均衡の問題に対処するために
、私はメインGPUメモリバーストがある経験、および他のGPUメモリにのみ許容することができない不均衡をロードするために1/5を取った、もはやBATCH_SIZEを増やすことはできません

参考ます。https://discuss.pytorch.org/t/dataparallel-imbalanced-memory-usage/22551/20(英語のみ...読むために半日見ました)

その理由は、偏荷重損失=基準(予測、target_var)損失である私たちは一人で、それぞれのGPUコンピューティングの損失を許可すれば、大量のメモリを占有して計算し、この問題を解決するために戻る、すなわち予測、損失=モデル(データ、ターゲット)されます(#バック予測されていない場合、予測だけでも損失を返す、返しません)。各GPUはloss.mean()またはloss.sum()、推奨平均値であるためには、リストはメインGPUに近い損失を、返されました。

このよう以来、他のすべてのGPUで別々に計算することができますが、前方に書き込むことができ、その結果を返すことができます。しかし、lenの増加、例えば予測レンス= BATCHSIZE、そのような特定の数の損失にノートテンソル型アレイは、リストがマージされ、[loss1.loss2]

効果:マスターGPUが少し高くなります。数百Mよりますが、負荷分散の基本的な実現

例:

#model前方で機能
DEF前方(セルフ、X、target_var、引数):
feature512 = self.forward_GetFeature(X)
target_var Noneの場合:
feature512を返します。
classifyResult = self.classifier(feature512)
#DataParallel、前方に復帰する場合リターン機能は、GPUの複数のマージの結果である
#を各GPUはBATCHSIZE / n個のサンプルを返し、n個のGPUの数であり、


コンピューティング#損失
center_loss = self.get_center_loss(feature512、target_var、引数)
基準= nn.CrossEntropyLoss()
cross_entropy_loss =基準( classifyResult、target_var)
#CrossEntropyLossソフトマックスに分類結果への直接入力を求めて

損失* = args.center_loss_weight cross_entropy_loss center_loss +
PREC =精度(classifyResult.data、target_var、TOPK =(1、))

その後、#リターンスカラー、それは、最後のリストに戻るには、nはGPUの結果であり、
)(loss.meanするには#の後loss.backwardで()
の戻りprecの[0]、損失
 
----------------
免責事項:この記事では、 "lllily"オリジナルCSDNブロガーであります記事、BY-SAの著作権契約、複製、元のソースのリンクと、この文を添付してくださいCC 4.0に従ってください。
オリジナルリンクします。https://blog.csdn.net/weixin_40087578/article/details/87186613

おすすめ

転載: www.cnblogs.com/jfdwd/p/11466126.html