Main Content

MATLAB による複数の GPU での深層学習

MATLAB® は、複数の GPU を使用した、1 つの深層ニューラル ネットワークの並列学習をサポートしています。GPU をもつ並列ワーカーを使用することで、ローカル マシン、クラスター、またはクラウドにある複数の GPU で学習を行えます。複数の GPU を使用すると、学習を大幅に高速化できます。マルチ GPU での学習で性能の向上が期待できるかどうかを判断するには、以下の点を検討します。

  • 各 GPU の反復の長さはどれだけか。各 GPU の反復が短ければ、GPU 間の通信の追加オーバーヘッドの影響が大きくなります。バッチ サイズをより大きくして、反復あたりの計算量を増やしてみてください。

  • すべての GPU が 1 つのマシン上にあるか。異なるマシン上にある GPU 間の通信は、大幅な通信遅延を生みます。適切なハードウェアがあれば、これを軽減できます。詳細については、高速マルチノード GPU 通信の高度なサポートを参照してください。

ヒント

複数の GPU をローカル マシンで使用して 1 つのネットワークに学習させるには、ExecutionEnvironment オプションを "multi-gpu" として指定し、コードの他の箇所はそのまま変更せずに残します。trainNetwork は、学習計算に利用できる GPU を自動的に使用します。

リモート クラスターで学習を行うには、ExecutionEnvironment オプションを "parallel" として指定します。クラスターから 1 つ以上の GPU にアクセスできる場合、trainNetwork はその GPU のみを学習に使用します。固有の GPU をもたないワーカーは学習計算に使用されません。

より多くのリソースを使用する必要がある場合は、深層学習における学習をクラスターまたはクラウドにスケールアップできます。並列オプションの詳細は、Scale Up Deep Learning in Parallel, on GPUs, and in the Cloudを参照してください。例を試してみるには、自動並列サポートを使用したクラウドでのネットワークの学習を参照してください。

GPU または並列オプションを使用するには、Parallel Computing Toolbox™ が必要です。GPU を使用するには、サポートされている GPU デバイスも必要です。サポートされているデバイスについては、リリース別の GPU サポート (Parallel Computing Toolbox)を参照してください。リモート クラスターを使用する場合、MATLAB Parallel Server™ も必要です。

ローカル マシンにおける複数の GPU の使用

メモ

ssh またはリモート デスクトップ プロトコル (RDP) を使用して接続したクラウドにある 1 つのマシンで MATLAB を実行する場合、ローカル マシンで実行した場合と同様に、ネットワークの実行と学習で同じコードが使用されます。

複数の GPU があるマシンにアクセスできる場合は、ExecutionEnvironment オプションを "multi-gpu" として指定できます。

  • trainNetwork を使用して学習を行う場合、関数 trainingOptions を使用して名前と値のオプション ExecutionEnvironment"multi-gpu" に設定。

  • classify および predict を使用して推論を行う場合、名前と値のオプション ExecutionEnvironment"multi-gpu" に設定。

"multi-gpu" オプションを使用すると、ローカルの並列プールで複数の GPU を使用できます。現在の並列プールがない場合、trainNetworkpredict、および classify は、既定のクラスター プロファイルの設定を使用してローカルの並列プールを自動的に起動します。このプールには、使用可能な GPU と同じ数のワーカーがあります。

ローカル マシンで複数の GPU を使用してカスタム学習を実行する方法の詳細については、Run Custom Training Loops on a GPU and in Parallelを参照してください。

クラスターにおける複数の GPU の使用

リモート クラスターで複数の GPU を使用して学習と推論を行うには、"parallel" オプションを使用します。

  • trainNetwork を使用して学習を行う場合、関数 trainingOptions を使用して名前と値のオプション ExecutionEnvironment"parallel" に設定。

  • classify および predict を使用して推論を行う場合、名前と値のオプション ExecutionEnvironment"parallel" に設定。

現在の並列プールがない場合、trainNetworkpredict、および classify は、既定のクラスター プロファイルの設定を使用して並列プールを自動的に起動します。プールから GPU にアクセスできる場合、固有の GPU を持つワーカーのみが学習計算を実行します。プールに GPU がない場合、代わりに使用可能なすべての CPU ワーカーで学習が実行されます。

リモート クラスターで複数の GPU を使用してカスタム学習を実行する方法の詳細については、Run Custom Training Loops on a GPU and in Parallelを参照してください。

ミニバッチ サイズと学習率の最適化

通常、畳み込みニューラル ネットワークは、イメージのミニバッチを使用して反復的に学習させます。これは、一般にデータセット全体が大きすぎて GPU メモリに収まらないためです。最適な性能を得るために、関数 trainingOptions 使用して名前と値のオプション MiniBatchSize を変更し、ミニバッチ サイズを試すことができます。

最適なミニバッチ サイズは、実際のネットワーク、データセット、および GPU ハードウェアによって異なります。複数の GPU を使用した学習の場合、各イメージ バッチが GPU 間に分散されます。これによって、利用可能な合計 GPU メモリが実質上増え、より大きなバッチ サイズを処理できます。GPU の数でミニバッチ サイズを線形にスケールアップし、各 GPU における作業負荷を一定に保つことを推奨します。たとえば、64 のミニバッチ サイズを使用して 1 つの GPU で学習を行っており、タイプが同じ GPU を 4 つ使用して学習を行うようにスケールアップする場合、ミニバッチ サイズを 256 まで大きくすることで、反復ごとに各 GPU に 64 個の観測値を処理させることができます。

ミニバッチのサイズを大きくすると各反復の重要性が増すため、学習率を大きくすることができます。一般に、ミニバッチ サイズの拡大に比例して学習率を大きくすることを推奨します。用途によって異なりますが、ミニバッチ サイズと学習率を大きくすると、ある程度までは精度を損なわずに学習を高速化できます。

学習に使用する特定の GPU の選択

すべての GPU を使用するわけではない場合は、学習や推論に使用する GPU を直接選択できます。これは、パフォーマンスが低い GPU (ディスプレイ GPU など) で学習が実行されるのを防ぐために役立ちます。

GPU がローカル マシンにある場合、関数 gpuDeviceTable (Parallel Computing Toolbox) および gpuDeviceCount (Parallel Computing Toolbox) を使用して GPU リソースを調べ、使用する GPU のインデックスを決定します。

"auto" オプションまたは "gpu" オプションを指定して 1 つの GPU で学習を行う場合、既定では、MATLAB はインデックスが 1 の GPU デバイスを使用します。学習を開始する前にデバイスを選択することで、異なる GPU を使用できます。gpuDevice (Parallel Computing Toolbox) を使用してインデックスを指定し、目的の GPU を選択します。

gpuDevice(index)
ExecutionEnvironment オプションを "auto" または "gpu" に設定した場合、trainNetworkpredict、および classify は選択された GPU を自動的に使用します。

"multi-gpu" オプションを指定して複数の GPU で学習を行う場合、既定では、MATLAB はローカル マシンで利用可能なすべての GPU を使用します。一部の GPU を除外する場合は、事前に並列プールを起動し、デバイスを手動で選択します。

たとえば、GPU が 3 つあるものの、インデックスが 13 であるデバイスのみを使用したいとします。次のコードを使用することで、2 つのワーカーをもつ並列プールを起動し、ワーカーごとに GPU を 1 つずつ選択することができます。

useGPUs = [1 3];
parpool('local', numel(useGPUs));
spmd 
    gpuDevice(useGPUs(labindex)); 
end

ExecutionEnvironment オプションを "multi-gpu" に設定した場合、trainNetworkpredict、および classify は現在の並列プールを自動的に使用します (オプションを "parallel" に設定しても同じ結果が得られます)。

trainingOptions で名前と値の引数 WorkerLoad を使用してワーカーを選択する方法もあります。次に例を示します。

parpool('local', 5);
opts = trainingOptions('sgdm', 'WorkerLoad', [1 1 1 0 1], ...)
この場合、4 番目のワーカーはプールの一部ですがアイドル状態であり、並列リソースの理想的な使用方法ではありません。gpuDevice を使用して学習用の GPU を手動で選択する方が効率的です。

複数の GPU における複数のネットワークの学習

複数のモデルに 1 つずつ GPU を使用して並列学習を行う場合、使用可能な GPU ごとに 1 つのワーカーをもつ並列プールを起動し、それぞれのワーカー上で各ネットワークに学習させます。各ワーカーでネットワークを同時に実行するには、parfor または parfeval を使用します。関数 trainingOptions を使用して、各ワーカーの名前と値のオプション ExecutionEnvironment"gpu" に設定します。

たとえば、次の形式のコードを使用して、使用可能なすべての GPU 上で複数のネットワークの並列学習を行います。

options = trainingOptions("sgdm","ExecutionEnvironment","gpu");

parfor i=1:gpuDeviceCount("available")
    trainNetwork(…,options); 
end

ローカルの MATLAB をブロックすることなくバックグラウンドで実行するには、parfeval を使用します。parfor および parfeval を使用して複数のネットワークに学習させる方法を示す例については、次を参照してください。

高速マルチノード GPU 通信の高度なサポート

MATLAB の一部のマルチ GPU 機能 (trainNetwork など) は、高速相互接続で直接通信して高い性能を実現できるように最適化されています。

ハードウェアが適切に接続されている場合、複数の GPU 間のデータ転送において、利用可能であれば NVLink などの高速ピアツーピア通信が使用されます。

Infiniband などのマシン間の高速相互接続または GPUDirect RDMA などの異なるマシン上の GPU 間の高速相互接続を使用する Linux 計算クラスターを使用している場合、MATLAB の高速マルチノード サポートを活用できる場合があります。環境変数 PARALLEL_SERVER_FAST_MULTINODE_GPU_COMMUNICATION1 に設定して、プール内のすべてのワーカーでこのサポートを有効にします。この環境変数はクラスター プロファイル マネージャーで設定します。

この機能は、GPU 通信用の NVIDIA NCCL ライブラリの一部です。これを構成するには、追加の環境変数 (特に NCCL_SOCKET_IFNAME) を設定して、ネットワーク インターフェイス プロトコルを定義しなければなりません。詳細については、NCCL のドキュメンテーション、特に NCCL 環境変数の節を参照してください。

参考

| | (Parallel Computing Toolbox) | (Parallel Computing Toolbox) |

関連するトピック