データ並列でもモデル並列でも使うことができるWSE
WSE上での並列性の利用法は柔軟で、1つのアルゴリズムでモデル並列とデータ並列の両方の並列性が利用されることもある。
データ並列は同じモデルをDevice1 、Device2のように複数作り、それぞれのデバイスは入力データの異なる部分を処理する。モデル並列は大きなモデルを複数のパーツに分け、それらのパーツを並列に実行する。
WSEはたくさんのコアがあるので、モデル並列でも高い実行並列度が得られる。一方、GPUなどはバッチサイズを大きくして高いデータ並列の処理はできるが、並列に作れるモデルの数は制約があるので、高いモデル並列を実現するのは難しい。
モデル並列の場合は、ネットワークのすべての層をパイプライン的に並列に実行させる。すべての層を並列に実行するので、高い性能が得られる。ただし、このためには高いバンド幅を持つインタコネクトが必要である。
モデル並列では、複数のモデルの間で重みの値を同期させるオーバヘッドは生じない。そのため、小さなバッチサイズでの実行でも良く、直線的なスケーリングが得られる。右側のグラフは4レイヤのBERTの性能をコア数を横軸にとってプロットしたもので、1つのモデルに使うコア数は100Kで、4コアまで並列にすることができている。
BERTの相対性能は100Kコアの時を1.0として、400Kコア、4モデルの場合には3.6倍の性能となっている。
データ並列の場合は、各層のレプリカを作り、異なるデータでレプリカを並列に実行する。レプリカの数が増えると相対性能は上がるが、使用コア数が少ない場合は、レプリカのデータの入れ替えのオーバヘッドが影響しているのか、性能は飽和する傾向にある。