DNNトレーニングのCPUおよびGPUメモリ要件の予測


9

いくつかのディープラーニングモデルアーキテクチャと、選択されたミニバッチサイズがあるとします。これらのモデルから、そのモデルをトレーニングするために予想されるメモリ要件をどのように導き出しますか?

例として、次元1000の入力、次元100の4つの完全に接続された非表示層、および次元10の追加の出力層を持つ(非反復)モデルを考えます。ミニバッチサイズは256の例です。CPUとGPUのトレーニングプロセスのおおよそのメモリ(RAM)フットプリントをどのように決定しますか?違いがある場合は、モデルがTensorFlow(したがってcuDNNを使用)を備えたGPUでトレーニングされていると仮定します。

回答:


2

@ik_visionの答えは、重みを格納するために必要なメモリスペースを推定する方法を説明しますが、中間のアクティベーションも格納する必要があります。特に、3Dデータを扱うたたみ込みネットワークでは、これが必要なメモリの主要部分です。

例を分析するには:

  1. 入力には1000要素が必要です
  2. レイヤー1〜4レイヤーの後、100要素、合計400要素があります
    1. 最終層の後、10個の要素があります

合計1つのサンプルで、順方向パスには1410要素が必要です。入力を除いて、バックワードパスのそれぞれについての勾配情報も必要です。つまり、410以上で、サンプルあたり合計1820要素です。バッチサイズを掛けて465 920を取得します。

要素ごとに必要なサイズは使用するデータ型によって異なるため、「要素」と言いました。単精度のfloat32場合は4Bで、データブロブを格納するために必要なメモリの合計は約1.8MBになります。


1

2つのオプションが表示されます。

  1. ネットワークはディスクからロードされます
  2. ネットワークはその場で作成されます

どちらの場合も、ネットワークのほとんどが各サンプルにコピーされるため、GPUのメモリサイズにバッチサイズを掛ける必要があります。

ディスクから読み込まれた場合の経験則:DNNがディスク上でX MBを使用する場合、ネットワークはバッチサイズ1のGPUメモリで2倍になります。

ネットワークは、バッチサイズ1のオンザフライで作成されます。パラメーターをカウントして4バイトを乗算します(float32ビット):パラメーターの数を手動でカウントします:fc1:1000x100(重み)+ 100(バイアス)fc2:100x100(重み)+ 100(バイアス)fc3:100x100(ウェイト)+ 100(バイアス)fc4:100x100(ウェイト)+ 100(バイアス)出力:100x10(ウェイト)+ 10(バイアス)

Kerasを使用してパラメーターの数を数える:model.count_params()


3
私が知る限り、これは重み自体を格納するためのメモリ要件を提供しますが、勾配など、トレーニング厳密に必要なものを格納するための専用のメモリは無視します。勢いを実装するために、グラデーションの保存が必要です。私は行方不明ですか?
Whaa

1
@Whaaこれは正しいです。通常のトレーニングでは、重み、フォワードパスでのアクティブ化、バックプロパゲーションパスでの勾配を保存するためのメモリが必要です(勢いがなくても3倍のメモリ)。
mjul

@mjul私の実験は、4.5x ik_visionの推定値を示しています。3xの背後にある理論的根拠は理解していますが、実際に4.5xを使用している理由がわかりません。他のKeras / TFオーバーヘッドが存在する必要がありますか?
ウェス、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.