質問
モデルが大きすぎると学習に必要なGPUメモリが増えるのはなぜ? |
解答
とても良い視点です。 これにはいくつかの理由があります。 順を追って整理しますね。 1. パラメータ(重み)のサイズが増える * モデルが大きい=パラメータ(行列の重み)の数が多い。 * すべての重みはGPUメモリ上に載せる必要があります。 例: * 1億パラメータ × 4バイト(FP32) = 約400 MB * 100億パラメータだと単純に 40 GB 必要になります。 2. 順伝播(forward)での中間値(activations)の保存 * ニューラルネットは forward → backward(誤差逆伝播)で学習します。 * backward で勾配を計算するには forward の中間出力(アクティベーション)を保持しておく必要があります。 * モデルが大きいと層が深く、出力のテンソルも巨大になるので、その分のメモリを消費します。 3. 勾配(gradients)の保持 * 学習では 各パラメータの勾配を保持する必要があります。 * つまり「重み(W)」だけでなく「勾配(dW)」も GPU に置く必要があるので、パラメータ数が多いほどメモリが倍増していきます。 4. オプティマイザの追加情報 * たとえば Adam だと、各パラメータに対して * モーメント1 (m) * モーメント2 (v) を持つため、パラメータの 2倍のメモリをさらに必要とします。 * そのため、学習中はパラメータ数の 3〜4倍のメモリが必要になるのが普通です。 5. バッチサイズの影響 * モデルが大きくなると「1サンプルあたりの計算」も大きくなります。 * そこに バッチサイズ × 中間値 が積み重なっていくので、さらにメモリが必要になります。 まとめると モデルが大きいとメモリが増えるのは、単に「重みが多いから」ではなく: 1. 重み(パラメータ) 2. 中間値(activations) 3. 勾配(gradients) 4. オプティマイザの補助データ(m, vなど) これら全部が GPU に乗るからです。 |
|
|
この記事へのコメント