Day 4 - データ並列化、モデル並列化 のまとめ


この記事は個人的なお勉強用のメモです。

講義

高速に学習する方法

・データ並列化
・モデル並列化
・GPU

コンピュータの性能は 1.5 年で 2 倍になると言われているが
モデルの複雑さは毎年 10 倍になっている。
何らかの対策が必要。
 ⇒ 分散深層学習という

低性能の計算機でモデルを動かす方法

・量子化
・蒸留
・プルーニング

データ並列化

構成

親モデルを複数コピー(コピーされて生成されたものをワーカーという)。
データを分割し、ワーカーごとに学習。

ワーカーの配置は、複数のコンピュータであったり
複数の CPU や GPU であったり、それらの組み合わせであったり。

データが大きい場合はデータ並列化を採用する。

パラメータの更新方式

同期型と非同期型の 2 種類。

同期型

  1. 各ワーカーの学習が終わるのを待つ。
  2. 各ワーカーの誤差を集めて誤差の平均を求める。
  3. 誤差の平均を使って、親モデルのパラメータを更新する。

ワーカーの学習が終わるのを待つところが、同期型。

非同期型

ワーカーが複数存在するのは同期型と同じ。

  1. ワーカーは学習を終えると、学習済みのモデルをキューに push する。
  2. 空きのワーカーはキューから pop して学習する。
  3. この繰り返し。

比較

  • 処理スピードは非同期の方が速い。
  • 非同期は学習が不安定になりやすい(最新のモデルを利用しないため)。
  • 現在は同期型が主流(精度が良いことが多いため)。
  • ワーカーの性能が統一されている場合は同期型、不統一の場合は非同期型。

モデル並列化

構成

  1. 親モデルを分割する。
  2. 分割したモデルを複数のワーカーに割り当てる。
  3. 各ワーカーでモデルを作成する。
  4. 学習が終わったら各モデルをマージする。

モデルの分割方法としては、直列のモデルを途中で分割したり、
並列のモデルを分岐ごとに分割したり。
前者の分割は実は難しい。後者の分割がよく用いられる。
複数の GPU で構成することが多い。

モデルが大きい場合はモデル並列化を採用する。

効果

モデルのパラメータ数(重みの個数)が多いほど、効果が高い。

GPU(おまけ)

種類

種類 説明
CPU 高性能なコアが少数
複雑で連続的な処理が得意
GPU 低性能なコアが多数
簡単な並列処理が得意
GPGPU General-purpose GPU
グラフィック以外で使用されるGPU

GPU は NN の学習に向いている(NN は行列演算が多いため)。

GPGPU開発環境

種類 説明
CUDA NVIDIA社のCPUのみで使用可能
DL用に提供されているため、使いやすい
OpenCL NVIDIA社以外のGPUからでも使用可能
DLに特化しているわけではない

現在は CUDA しか使われていない。
TensorFlow や PyTorch の設定をするとすぐに GPGPU が使える。

関連記事

黒本で補習。

データ並列の説明
・親モデルをコピー
・異なるバッチを各 GPU ワーカーに供給
・ワーカーからの勾配を送る先を、パラメータサーバという

同期型の特徴
・すべての GPU ワーカーが勾配を計算して平均勾配を求める
・GPU の性能に差があると無駄が生じる
・非同期型よりもスループットは低い

非同期型の特徴
・ある GPU ワーカーが計算する間にパラメータ更新される場合がある
・これを陳腐化した勾配という
・対策としては学習率を小さくする
・更新時間は最遅の GPU ワーカーに依存しない
・同期型よりもスループットは高い

モデル並列の説明
・モデルの各部分を別の GPU 上にロード
・順伝播と逆伝播の両方で通信が必要
・通信コストがボトルネック
・どのようなモデル分割がよいかは、モデルに依存