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の価値が強調されている

ブログ    
ブログ    

推薦する

人工知能アルゴリズムが構造生物学の難問を解決

新しい人工知能アルゴリズムは、RNA 分子の正しい 3 次元構造を間違ったものから選び出すことができ...

上海交通大学が「人間行動理解エンジン」を発表:AIが超大作映画のあらゆる行動をフレームごとに理解

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

AI倫理: CIOが問うべき5つの質問

[51CTO.com クイック翻訳] 人工知能ツールを導入する IT リーダーは、責任の取り方、プラ...

...

第3回北京知源大会が開幕、世界最大のインテリジェントモデル「五道2.0」が発表

6月1日、北京知源人工知能研究所(以下、知源研究所)が主催する2021年北京知源会議が北京市中関村国...

人工知能を活用してビジネスを成長させ、企業価値を創造する方法

組織は、全員を関与させれば、AI を活用してビジネスを成長させることができます。人工知能への投資は、...

ゼロベース科学の普及: 4 つのシンプルな推奨アルゴリズムの背後にある原理

[[402797]]この記事はWeChatのパブリックアカウント「Big Data DT」から転載し...

AI 開発の世界では、自然言語処理を真に習得することはどれほど重要ですか?

人工知能開発の分野で最も重要な目標は、自然言語処理 (NLP) を真に習得したシステムを作成すること...

グラフ畳み込みネットワークの作り方は?これは最小限のNumpy実装です

グラフは非常に複雑な構造を持ち、大量の情報を含んでいるため、グラフ上での機械学習は困難な作業です。こ...

中国情報通信研究院が2021年最初の「信頼できるAI成果」を発表、百度が5つの賞を受賞

[[416150]]グローバルな AI ガバナンスのコンセンサスを実装し、信頼できる AI テクノロ...

...

2021年に自動運転はどのように発展するのでしょうか?

EEtimesより翻訳2021年に自動運転車はどうなるでしょうか。自動運転業界の昨年の業績は平凡で...

2024 年のクラウド コンピューティング セキュリティの 5 つのトレンドと進歩

クラウドの世界を探ってみましょう。ただし、単なるクラウドではなく、未来のクラウドです。具体的には、2...

何も知らない状態から、3分で「ナレッジグラフ」を素早く理解するまで

[51CTO.com からのオリジナル記事] ナレッジ グラフは、インテリジェント マシンの脳を解き...

...