深層学習モデルをトレーニングする際のミニバッチメモリの影響を計算する方法は?


17

Andrej Karphatyの次のメモに基づいて、モデルをトレーニングするためにGPUに必要なメモリ量を計算しようとしています:http ://cs231n.github.io/convolutional-networks/#computational-considerations

私のネットワークには、532,752のアクティベーション19,072,984のパラメーター(重みとバイアス)があります。これらはすべて32ビットのfloat値であるため、それぞれが4バイトのメモリを消費します。

私の入力画像は180x50x1(幅x高さx奥行き)= 9,000 float 32値です。私は画像増強を使用しないので、その他のメモリはミニバッチサイズにのみ関連すると思います。128個の画像のミニバッチサイズを使用しています。

Andrejの推奨に基づいて、次のメモリサイズを取得します。

アクティベーション: 532,752 * 4 /(1024 ^ 2)= 2.03 MB

パラメーター: 19,072,984 * 4 /(1024 ^ 2)* 3 = 218.27 MB

その他: 128 * 9,000 * 4 /(1024 ^ 2)= 4.39 MB

したがって、このネットワークをトレーニングするための合計メモリは224,69 MBになります。

TensorFlowを使用していますが、何かが足りないと思います。私はまだトレーニングを実行していませんが、(過去の経験に基づいて)使用中のメモリが計算した値よりもはるかに大きいことを確信しています。

ミニバッチの各画像について、TensorFlowが勾配を保持して、単一の重み/バイアス更新ステップで後で正規化できる場合、メモリは別の532,752 * 128の値を考慮する必要があると思います(各画像の勾配ミニバッチ)。その場合、128個のイメージ/ミニバッチでこのモデルをトレーニングするには、260.13 MBがさらに必要になります。

ディープラーニングモデルをトレーニングするためのメモリに関する考慮事項を理解するのに役立ちますか?上記の考慮事項は正しいですか?


こちらの質問に対する私の(提案された)回答をご覧ください。
アダム・ヘンドリー

回答:


5

あなたは正しい軌道に乗っていると思います。

はい、バックプロパゲーションのアクティベーションとパラメーターの派生物を保存する必要があります。

さらに、最適化の選択が重要になる場合があります。SGD、Adam、またはAdagradを使用してトレーニングしていますか?これらはすべて異なるメモリ要件を持ちます。たとえば、モーメンタムベースのメソッドのステップサイズのキャッシュを保存する必要がありますが、これは他のメモリに関する考慮事項と比較して二次的なものである必要があります。

全体として、フォワードパスのメモリ要件を計算したようです。Andrej Karpathyは、バックワードパスがフォワードパスの3倍のメモリを消費する可能性があると述べているため、このような違いが見られるのはこのためです(Webサイトの「ケーススタディ」にスクロールしてVGGNetの例を参照してください)。


4

@StatsSorceress TL; DR:

このアクティビティを実行して、必要なメモリを自分で計算できるかどうかを確認します。

アクティベーション: 532,752 * 2 * 4 /(1024 ^ 2)= 4.06 MB

パラメーター: 19,072,984 * 4 /(1024 ^ 2)* 3 = 218.27 MB

その他: 128 * 9,000 * 4 /(1024 ^ 2)= 4.39 MB

合計メモリ:(4.06 * 128)+ 218.27 + 4.39 = 742.34 MB

私が間違っている場合、誰かがこれを修正してください。参考までに、あなたはすでに128を雑多に掛けていたので、上記の128を掛けなかったのはそのためです


この記事対応するビデオを紹介します。彼らは何が起こっているのかをより良く理解するのを助けてくれました。

注: 予測にネットワークを使用するために必要なメモリは、次の2つの理由でトレーニングに必要なメモリよりもはるかに少ないです。

  • 予測時には、ネットワークでは画像を前方に送信するだけで、後方には送信しません(したがって、メモリX 3を乗算しません。以下を参照)
  • 画像ごとに1つの予測があります(予測にバッチを使用しないため、1つの画像に必要なメモリにバッチサイズを掛ける必要はありません)。

プロセス(トレーニングするメモリ)

  1. 1つの画像でトレーニングするために必要なメモリを計算する
  2. この数にバッチ内の画像の数を掛けます

覚えておいてください: ミニバッチ処理では、データのサブセットを取得し、そのサブセット内の各画像の勾配と誤差を計算し、それらを平均して、平均の方向に進みます。アクティベーションの数は、バッチ内の画像の数によって複数になります

ステップ1:1つのイメージのメモリ

1つのイメージをトレーニングするには、次のためにメモリを予約する必要があります。

  • モデルパラメータ:

    各レイヤーの重みバイアス勾配、および運動量変数(Adam、Adagrad、RMSPropなどの場合、オプティマイザーが使用されます)

    このメモリを概算するには、重みとバイアスを格納するために必要なメモリを計算し、それに3を掛けます(つまり、重みとバイアスを格納するために必要なメモリの量は(おおよそ)に等しいため、「3」勾配と運動量変数に必要な)

    式:

    畳み込み:

    weights(n)= depth(n)*(kernel_width * kernel_height)* depth(n-1)

    バイアス(n)=深さ(n)

    完全に接続された(密な)レイヤー:

    重み(n)=出力(n)*入力(n)

    バイアス(n)=出力(n)

ここで、nは現在のレイヤー、n-1は前のレイヤー、outputsはFCレイヤーからの出力の数、inputsはFCレイヤーへの入力の数です(前のレイヤーが完全に接続されたレイヤーでない場合、入力の数は、平坦化されたレイヤーのサイズに等しくなります)。

注:重みとバイアスのみのメモリ、および1つの画像のアクティベーションのメモリ(以下を参照)は、予測に必要なメモリの総量です(畳み込みなどのメモリのオーバーヘッドを除く)。

  • アクティベーション(これらはCaffeの「Blob」です):

(私はここで緩く用語を使用しています、我慢してください)

畳み込み層の各畳み込みは、「画像内のピクセル数」アクティベーションを生成します(つまり、1つの畳み込みに画像を渡すと、「m」アクティベーションで構成される単一の特徴マップが得られます。「m」は、画像/入力)。

完全に接続されたレイヤーの場合、生成するアクティベーションの数は出力のサイズに等しくなります。

畳み込み:

activations(n)= image_width * image_height * image_num_channels

完全に接続された(密な)レイヤー:

activations(n)= outputs(n)

入力は実際にはネットワークの最初の画像にすぎないことに注意してください。畳み込みの後、それは何かに変わります(機能マップ)。より正確にするには、実際に「image_width」、「image_height」、および「image_num_channels」を「input_width」、「input_height」、および「layer_depth」に置き換えます。(この概念を画像の観点から考えるのは簡単です。)

各レイヤーでのアクティベーションのエラーも保存する必要があるため(バックワードパスで使用)、アクティベーションの数に2を掛けて、ストレージスペースにスペースを空ける必要があるエンティティの総数を取得します。アクティブ化の数はバッチ内の画像の数とともに増加するため、この数にバッチサイズを掛けます。

ステップ2:バッチをトレーニングするためのメモリ

重みとバイアスの数(3倍)とアクティベーションの数(バッチサイズの2倍)を合計します。これに4を掛けると、バッチのトレーニングに必要なバイト数が得られます。GB単位で答えを得るには、1024 ^ 2で割ることができます。


なぜ「予測にバッチを使用しない」と言うのですか?ユーザーが多数の画像で予測を行う必要がある場合、予測でバッチを使用することは理にかなっています。
user3731622

1

または、プロファイラーライブラリを使用して、プログラムによるメモリとCPU使用率を分析できると思います。ミリ秒間隔で特定のスレッドまたはプロセスによるメモリおよびCPU使用率のスナップショットを提供できる多くのpythonライブラリがあります。

popenを使用して別のサブプロセスで監視したいプログラムの一部を実行し、PIDを使用してメモリとCPU使用率を監視できます。

psutilこのような作業に適していると思います。他にもたくさんありますが。

これが役立つことを願っています。


3
答えてくれてありがとう、@ Anwar。私は経験的観測ではなく分析的計算を探しています。
-barbolo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.