この記事では、ディープラーニング モデルのトレーニングを改善するために私が個人的に見つけた 4 つの異なる Pytorch トレーニング トリックについて説明し、コードを紹介します。
混合精度通常のトレーニング ループでは、PyTorch はすべての浮動小数点変数を 32 ビットの精度で保存します。厳しい制約の下でモデルをトレーニングする場合、これによりモデルが大量のメモリを占有し、より遅いトレーニング プロセスのためにより小さなモデルとより小さなバッチ サイズを使用せざるを得なくなることがあります。したがって、モデル内のすべての変数/数値を 16 ビットの精度で保存すると、モデルのメモリ消費量を大幅に削減し、トレーニング ループを高速化するなど、モデルのパフォーマンス/精度を維持しながら、これらの問題のほとんどを改善および修正できます。 Pytorch ですべての計算を 16 ビット精度に変換するのは非常に簡単で、数行のコードしか必要ありません。ここにあります:
上記の方法は、fp16 で操作するときに勾配アンダーフローを最小限に抑えるために勾配スケーリング スカラーを作成します。
損失とオプティマイザーを使用してバックプロパゲーションを実行する場合は、loss.backward() と optimizer.step() を使用する代わりに、scale.scale(loss) を使用する必要があります。オプティマイザーを更新するには、scaler.step(optimizer) を使用します。これにより、すべての勾配をスカラー変換し、すべての計算を 16 ビットの精度で実行し、最後に scaler.update() を使用してスケーラーを更新し、トレーニング勾配に適応させることができます。 すべてを 16 ビットの精度で実行すると、数値が不安定になり、使用している一部の関数が正しく動作しなくなる可能性があります。 16 ビットの精度では、特定の操作のみが正しく機能します。詳細については公式ドキュメントを参照してください。 進捗バー各段階で完了したトレーニングの割合を示す進行状況バーがあると非常に便利です。進行状況バーを取得するには、tqdm ライブラリを使用します。ダウンロードしてインポートする方法は次のとおりです。
トレーニング ループと検証ループでは、次の操作を行う必要があります。
トレーニングおよび検証ループに tqdm コードを追加すると、モデルが完了したトレーニングの割合を示す進行状況バーが表示されます。次のようになります: この図では、691 はモデルが完了する必要があるバッチ数、7:28 はモデルが 691 バッチに要する合計時間、1.54 it/s はモデルが各バッチに費やす平均時間を表しています。 勾配の蓄積CUDA メモリ不足エラーが発生した場合は、コンピューティング リソースを超えたことを意味します。これを修正するには、すべてを 16 ビット精度に変換する、モデルのバッチ サイズを縮小する、より小さなモデルに切り替えるなど、いくつかの方法があります。 しかし、16 ビット精度に切り替えても問題が完全に解決されない場合があります。これを修正する最も簡単な方法はバッチ サイズを縮小することですが、バッチ サイズを縮小したくない場合は、勾配累積を使用して目的のバッチ サイズをシミュレートできます。 CUDA のメモリ不足問題に対する別の解決策は、複数の GPU を単純に使用することですが、これは多くの人が利用できないオプションです。 マシン/モデルが 16 のバッチ サイズしかサポートできず、これを増やすと CUDA メモリ不足エラーが発生するため、バッチ サイズを 32 にしたいとします。勾配累積は、バッチ サイズ 16 でモデルを 2 回実行し、各バッチの計算された勾配を累積し、最後にこれら 2 つの順方向伝播と勾配累積の後に最適化ステップを実行することによって機能します。 勾配の蓄積を理解するには、ニューラル ネットワークのトレーニング時に何が行われているのかを正確に理解することが重要です。次のようなトレーニング ループがあるとします。
上記のコードを見ると、覚えておくべき重要な点は、 loss.backward() がモデルの勾配を作成して保存するのに対し、 optimizer.step() は実際に重みを更新するということです。オプティマイザーを呼び出す前に loss.backward() が 2 回呼び出されると、勾配が累積されます。 PyTorch で勾配累積を実装する方法は次のとおりです。
上記の例では、マシンがサポートできるバッチ サイズは 16 のみで、必要なバッチ サイズは 32 です。基本的に、2 つのバッチの勾配を計算し、実際の重みを更新します。これにより、有効なバッチ サイズは 32 になります。 翻訳者注: 勾配の蓄積は単なる妥協です。テストの結果、勾配が蓄積されると、最後の loss.backward() の勾配は、前のバックプロパゲーションの重みよりも高くなります。理由は正確にはわかりません。そういった問題はありますが、このようなトレーニングはやはり効果的です。 16 ビット精度の勾配累積は非常に似ています。
結果評価ほとんどの機械学習プロジェクトでは、評価のための指標を手動で計算する傾向があります。精度、適合率、再現率、F1 などのメトリックを計算することは難しくありませんが、加重精度、再現率、F1 など、これらのメトリックのいくつかのバリエーションが必要な場合もあります。これらを計算するにはさらに作業が必要になる場合があります。実装でこれらすべてのメトリックを正確、効率的、迅速かつエラーなく計算できない場合は、sklearns の classified_report ライブラリを使用できます。これは、これらのメトリックを計算するために特別に設計されたライブラリです。
上記のコードはバイナリ分類用です。この機能は、さらに多くの目的に合わせて設定できます。最初のリストはモデルの予測を表し、2 番目のリストは正しい値を表します。上記のコードは以下を出力します: 結論はこの記事では、PyTorch でディープ ニューラル ネットワークのトレーニングを最適化する 4 つの方法について説明しました。 16 ビットの精度によりメモリ消費量が削減され、より大きなバッチ サイズを使用して勾配の蓄積をシミュレートできます。tqdm の進行状況バーと sklearns の classified_report は、モデルのトレーニングを簡単に追跡し、モデルのパフォーマンスを評価できる 2 つの便利なライブラリです。個人的には、私は常に上記のすべてのトレーニング手法を使用してニューラル ネットワークをトレーニングし、必要に応じて勾配累積を使用します。 最後に、pytorch を使用している場合、または pytorch の初心者の場合は、次のライブラリを使用できます。 github/deephub-ai/トーチハンドル 彼はあなたにとって大きな助けとなるでしょう。 |
<<: グラフディープラーニングで複雑な研究タイプのタスクを実装するのは、あまりにも面倒ですか?この新しいツールキットは、
>>: スマート物流が一般的なトレンドであり、ロボット、ドローン、5Gの価値が強調されている
近年、人工知能 (AI) の出現により、私たちの産業や個人の生活は真に革命的な変化を遂げ、これまでに...
毎年恒例の11.11グローバルショッピングフェスティバルが近づいており、JD.comは再び歴史を刻み...
[[229403]]現在の人工知能の発展は「実用的な」段階に入っています。 2018年の初め、国家...
ジョージタウン大学の科学者が率いる国際研究チームは、COVID-19パンデミックの原因ウイルスである...
現地時間5月7日、米国シアトルでMicrosoft Buildカンファレンスが開催され、マイクロソフ...
この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...
従業員の研修は企業にとって重要な問題です。企業は熟練労働者の確保に苦労し、高い離職率に悩まされ、大規...
電子コンピューティングと比較すると、光コンピューティングは高速、高帯域幅、低消費電力という利点があり...
9月26日のニュースによると、OpenAIのChatGPTが発売されて以来、企業の経営者や従業員は...
最も権威のある科学雑誌の一つであるネイチャー誌は最近、明確な声明を発表しました。 生成型人工知能 (...
まず、Zhihu の「アルゴリズム エンジニアになるのはどんな感じか」という質問に対する私の回答を共...
データ侵害が頻繁に起こるようになるにつれて、IT セキュリティの重要性がますます高まります。幸いなこ...