Pytorch モデルのトレーニングを最適化するためのヒント

Pytorch モデルのトレーニングを最適化するためのヒント

この記事では、ディープラーニング モデルのトレーニングを改善するために私が個人的に見つけた 4 つの異なる Pytorch トレーニング トリックについて説明し、コードを紹介します。

[[389579]]

混合精度

通常のトレーニング ループでは、PyTorch はすべての浮動小数点変数を 32 ビットの精度で保存します。厳しい制約の下でモデルをトレーニングする場合、これによりモデルが大量のメモリを占有し、より遅いトレーニング プロセスのためにより小さなモデルとより小さなバッチ サイズを使用せざるを得なくなることがあります。したがって、モデル内のすべての変数/数値を 16 ビットの精度で保存すると、モデルのメモリ消費量を大幅に削減し、トレーニング ループを高速化するなど、モデルのパフォーマンス/精度を維持しながら、これらの問題のほとんどを改善および修正できます。

Pytorch ですべての計算を 16 ビット精度に変換するのは非常に簡単で、数行のコードしか必要ありません。ここにあります:

  1. スケーラー = torch.cuda.amp.GradScaler()

上記の方法は、fp16 で操作するときに勾配アンダーフローを最小限に抑えるために勾配スケーリング スカラーを作成します。

  1. オプティマイザ.zero_grad()
  2. torch.cuda.amp.autocast()を使用する場合:
  3. 出力= モデル(入力).to (デバイス)
  4. 損失 = 基準(出力、正解).to (デバイス)
  5. スケーラー.スケール(損失).後方()
  6. スケーラー.ステップ(オプティマイザー)
  7. スケーラー.更新()

損失とオプティマイザーを使用してバックプロパゲーションを実行する場合は、loss.backward() と optimizer.step() を使用する代わりに、scale.scale(loss) を使用する必要があります。オプティマイザーを更新するには、scaler.step(optimizer) を使用します。これにより、すべての勾配をスカラー変換し、すべての計算を 16 ビットの精度で実行し、最後に scaler.update() を使用してスケーラーを更新し、トレーニング勾配に適応させることができます。

すべてを 16 ビットの精度で実行すると、数値が不安定になり、使用している一部の関数が正しく動作しなくなる可能性があります。 16 ビットの精度では、特定の操作のみが正しく機能します。詳細については公式ドキュメントを参照してください。

進捗バー

各段階で完了したトレーニングの割合を示す進行状況バーがあると非常に便利です。進行状況バーを取得するには、tqdm ライブラリを使用します。ダウンロードしてインポートする方法は次のとおりです。

  1. pip インストール tqdm
  2. tqdmからtqdm をインポート

トレーニング ループと検証ループでは、次の操作を行う必要があります。

  1. のために インデックス、tqdm内のバッチ(enumerate(loader)、total = len(loader)、position = 0、leave = True ):

トレーニングおよび検証ループに tqdm コードを追加すると、モデルが完了したトレーニングの割合を示す進行状況バーが表示されます。次のようになります:

この図では、691 はモデルが完了する必要があるバッチ数、7:28 はモデルが 691 バッチに要する合計時間、1.54 it/s はモデルが各バッチに費やす平均時間を表しています。

勾配の蓄積

CUDA メモリ不足エラーが発生した場合は、コンピューティング リソースを超えたことを意味します。これを修正するには、すべてを 16 ビット精度に変換する、モデルのバッチ サイズを縮小する、より小さなモデルに切り替えるなど、いくつかの方法があります。

しかし、16 ビット精度に切り替えても問題が完全に解決されない場合があります。これを修正する最も簡単な方法はバッチ サイズを縮小することですが、バッチ サイズを縮小したくない場合は、勾配累積を使用して目的のバッチ サイズをシミュレートできます。 CUDA のメモリ不足問題​​に対する別の解決策は、複数の GPU を単純に使用することですが、これは多くの人が利用できないオプションです。

マシン/モデルが 16 のバッチ サイズしかサポートできず、これを増やすと CUDA メモリ不足エラーが発生するため、バッチ サイズを 32 にしたいとします。勾配累積は、バッチ サイズ 16 でモデルを 2 回実行し、各バッチの計算された勾配を累積し、最後にこれら 2 つの順方向伝播と勾配累積の後に最適化ステップを実行することによって機能します。

勾配の蓄積を理解するには、ニューラル ネットワークのトレーニング時に何が行われているのかを正確に理解することが重要です。次のようなトレーニング ループがあるとします。

  1. モデル = model.train()
  2. のために インデックス、バッチin enumerate(train_loader):
  3. 入力 = batch[0] .to (デバイス)
  4. 正解 = batch[1].to (デバイス)
  5. オプティマイザ.zero_grad()
  6. 出力= モデル(入力).to (デバイス)
  7. 損失 = 基準(出力、正解).to (デバイス)
  8. 損失.後方()
  9. オプティマイザ.ステップ()

上記のコードを見ると、覚えておくべき重要な点は、 loss.backward() がモデルの勾配を作成して保存するのに対し、 optimizer.step() は実際に重みを更新するということです。オプティマイザーを呼び出す前に loss.backward() が 2 回呼び出されると、勾配が累積されます。 PyTorch で勾配累積を実装する方法は次のとおりです。

  1. モデル = model.train()
  2. オプティマイザ.zero_grad()
  3. のために インデックス、バッチin enumerate(train_loader):
  4. 入力 = batch[0] .to (デバイス)
  5. 正解 = batch[1].to (デバイス)
  6. 出力= モデル(入力).to (デバイス)
  7. 損失 = 基準(出力、正解).to (デバイス)
  8. 損失.後方()
  9. (インデックス+1)%2==0の場合:
  10. オプティマイザ.ステップ()
  11. オプティマイザ.zero_grad()

上記の例では、マシンがサポートできるバッチ サイズは 16 のみで、必要なバッチ サイズは 32 です。基本的に、2 つのバッチの勾配を計算し、実際の重みを更新します。これにより、有効なバッチ サイズは 32 になります。

翻訳者注: 勾配の蓄積は単なる妥協です。テストの結果、勾配が蓄積されると、最後の loss.backward() の勾配は、前のバックプロパゲーションの重みよりも高くなります。理由は正確にはわかりません。そういった問題はありますが、このようなトレーニングはやはり効果的です。

16 ビット精度の勾配累積は非常に似ています。

  1. モデル = model.train()
  2. オプティマイザ.zero_grad()
  3. のために インデックス、バッチin enumerate(train_loader):
  4. 入力 = batch[0] .to (デバイス)
  5. 正解 = batch[1].to (デバイス)
  6. torch.cuda.amp.autocast()を使用する場合:
  7. 出力= モデル(入力).to (デバイス)
  8. 損失 = 基準(出力、正解).to (デバイス)
  9. スケーラー.スケール(損失).後方()
  10. (インデックス+1)%2==0の場合:
  11. スケーラー.ステップ(オプティマイザー)
  12. スケーラー.更新()
  13. オプティマイザ.zero_grad()

結果評価

ほとんどの機械学習プロジェクトでは、評価のための指標を手動で計算する傾向があります。精度、適合率、再現率、F1 などのメトリックを計算することは難しくありませんが、加重精度、再現率、F1 など、これらのメトリックのいくつかのバリエーションが必要な場合もあります。これらを計算するにはさらに作業が必要になる場合があります。実装でこれらすべてのメトリックを正確、効率的、迅速かつエラーなく計算できない場合は、sklearns の classified_report ライブラリを使用できます。これは、これらのメトリックを計算するために特別に設計されたライブラリです。

  1. sklearn.metricsからclassification_reportをインポート
  2. y_pred = [0, 1, 0, 0, 1]
  3. y_correct = [1, 1, 0, 1, 1]print(分類レポート(y_correct, y_pred))

上記のコードはバイナリ分類用です。この機能は、さらに多くの目的に合わせて設定できます。最初のリストはモデルの予測を表し、2 番目のリストは正しい値を表します。上記のコードは以下を出力します:

結論は

この記事では、PyTorch でディープ ニューラル ネットワークのトレーニングを最適化する 4 つの方法について説明しました。 16 ビットの精度によりメモリ消費量が削減され、より大きなバッチ サイズを使用して勾配の蓄積をシミュレートできます。tqdm の進行状況バーと sklearns の classified_report は、モデルのトレーニングを簡単に追跡し、モデルのパフォーマンスを評価できる 2 つの便利なライブラリです。個人的には、私は常に上記のすべてのトレーニング手法を使用してニューラル ネットワークをトレーニングし、必要に応じて勾配累積を使用します。

最後に、pytorch を使用している場合、または pytorch の初心者の場合は、次のライブラリを使用できます。

github/deephub-ai/トーチハンドル

彼はあなたにとって大きな助けとなるでしょう。

<<:  グラフディープラーニングで複雑な研究​​タイプのタスクを実装するのは、あまりにも面倒ですか?この新しいツールキットは、

>>:  スマート物流が一般的なトレンドであり、ロボット、ドローン、5Gの価値が強調されている

ブログ    
ブログ    
ブログ    

推薦する

...

2026年までにIoT分野のAIサービス収益は36億ドルに達する

iottechnewsによると、IoT分野の人工知能(AI)と機械学習(ML)サービスは年間40%成...

GPT-4ではMITでコンピュータサイエンスの学位を取得できない

ある研究者が、MITのコンピューターサイエンスの学位の宿題や試験問題を解くことができると主張するチャ...

...

人工知能が動物を理解するにはどれくらいの時間がかかるのでしょうか?

[[405241]]ビッグデータダイジェスト制作出典: engadget現在、オーストラリアに生息...

マイクロソフトは低コストのAIモデルを見つけるために多方面に賭けている

マイクロソフトはOpenAI LPの半分以下を所有していると言われているが、それでもパワーは劣るがよ...

気候変動との戦い: AIはエネルギーソリューションをリードできる

AI と機械学習をエネルギーと組み合わせることで、再生可能エネルギーの導入を加速することができます。...

大規模言語モデルの視覚的才能: GPTは文脈学習を通じて視覚的タスクも解決できる

現在、大規模言語モデル (LLM) は、自然言語処理 (NLP) の分野で変化の波を引き起こしていま...

Microsoft Bing Chat が AI 株取引機能を解放: 将来の株価動向を予測可能

Microsoft は、生成 AI のさまざまな可能性を積極的に模索しています。将来の応用シナリオの...

NLP入門: 中国語のルールベースの単語分割法を3つ教えます

自然言語理解において、トークンは独立して動作できる意味のある最小の言語コンポーネントです。単語の識別...

ゲーム「原神」では実際に深層強化学習が使われ、オープンソース化されている

[[425402]] 『原神』で魚が釣れないとまだ悩んでいますか?テイワットでの釣りについての遅れば...

高等教育における人工知能の3つの革新的な応用

高等教育の専門家は、AI と完全に連携する準備をしなければ、機会を逃したり、学生とのつながりが断たれ...

...

可観測性はAIの成功の重要な要素の一つである

ますます多くの企業が自社のインフラストラクチャやビジネス プロセスに人工知能を統合するにつれて、シス...