並列処理、GPU、およびクラウドによる深層学習のスケール アップ
R2026b深層ネットワークの学習は計算量が多いため、計算に何時間もかかる可能性があります。しかし、ニューラル ネットワークは本質的に並列アルゴリズムです。高性能の GPU やコンピューター クラスターで並列実行することで、この並列性の利点を活かすことができます。
GPU を使用して学習させることを推奨します。GPU を使用できない場合にのみ、CPU を使用するようにしてください。通常、学習と推論のどちらの場合も GPU と比べて CPU は非常に低速です。一般に、複数の CPU コアで実行するよりも 1 つの GPU で実行する方がはるかに高いパフォーマンスを得られます。
適切な GPU がない場合は、クラウド上の高性能な GPU やクラスターをレンタルすることができます。クラウドで MATLAB® にアクセスして深層学習を実行する方法の詳細については、クラウドでの深層学習を参照してください。
GPU または並列オプションを使用するには、Parallel Computing Toolbox™ が必要です。GPU を使用するには、サポートされている GPU デバイスも必要です。サポートされているデバイスの詳細については、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。リモート クラスターを使用する場合、MATLAB Parallel Server™ も必要です。
ヒント
trainnet ワークフローでは、GPU が自動的にサポートされます。既定では、trainnet 関数は利用可能な GPU がある場合にそれを使用します。複数の GPU があるマシンにアクセスできる場合は、ExecutionEnvironment 学習オプションを "multi-gpu" として設定します。
GPU 上でカスタム学習ワークフローを実行するには、minibatchqueue を使用してデータを gpuArray オブジェクトへ自動的に変換します。
GPU による高速化をサポートするその他の深層学習関数の一覧については、関数一覧 (GPU 配列) を参照してください。
並列処理のリソースを使用することで、単一のネットワークの深層学習をスケールアップすることができます。また、複数のネットワークに同時に学習させることもできます。以下に示すセクションでは、MATLAB で深層学習を並列実行するために利用できるオプションを示しています。
メモ
単一のリモート マシン (SSH やリモート デスクトップ プロトコルで接続したクラウド マシンなど) で MATLAB を実行する場合は、ローカル リソースの手順に従います。クラウド リソースへの接続に関する詳細については、クラウドでの深層学習を参照してください。
単一のネットワークの並列学習
ローカル リソースを使用した単一のネットワークの並列学習
次の表は、ローカル ワークステーション上で単一のネットワークの学習と推論を行うために利用できるオプションを示しています。
| リソース | trainnet ワークフロー | カスタム学習ワークフロー | 必要な製品 |
|---|---|---|---|
| 単一の CPU | GPU を利用できない場合に自動的に選択されます。 単一の CPU を使用した学習は推奨されません。 | 単一の CPU を使用した学習は推奨されません。 |
|
| 複数の CPU コア | GPU を利用できる場合、複数の CPU コアを使用した学習は推奨されません。 | GPU を利用できる場合、複数の CPU コアを使用した学習は推奨されません。 |
|
| 単一の GPU | 自動的に選択されます。既定では、利用できる GPU がある場合に学習と推論を GPU 上で実行します。 または、 |
例については、カスタム学習ループを使用したネットワークの学習を参照してください。 | |
| 複数の GPU |
例については、自動マルチ GPU のサポートを使用したネットワークの学習を参照してください。 | 利用可能な GPU と同じ数のワーカーを使用して、ローカル並列プールを起動します。詳細については、MATLAB による複数の GPU での深層学習を参照してください。
例については、カスタム学習ループを使用したネットワークの並列学習を参照してください。 |
リモート クラスター リソースを使用した単一のネットワークの並列学習
次の表は、リモート クラスター上で単一のネットワークの学習と推論を行うために利用できるオプションを示しています。
| リソース | trainnet ワークフロー | カスタム学習ワークフロー | 必要な製品 |
|---|---|---|---|
| 任意 | 目的のクラスターを既定のクラスター プロファイルとして指定します。詳細については、並列環境の管理とプールの自動作成を参照してください。
プールから GPU にアクセスできる場合、固有の GPU をもつワーカーのみが学習計算を実行し、余ったワーカーはアイドル状態になります。プールに GPU がない場合、代わりに使用可能なすべての CPU ワーカーで学習が実行されます。 | 目的のクラスターを既定のクラスター プロファイルとして指定します。詳細については、並列環境の管理とプールの自動作成を参照してください。
既定では、ソフトウェアは CPU のみを使用して計算を実行します。 例については、カスタム学習ループを使用したネットワークの並列学習を参照してください。 |
|
| 複数の CPU | GPU を利用できる場合、複数の CPU コアを使用した学習は推奨されません。 目的のクラスターを既定のクラスター プロファイルとして指定します。詳細については、並列環境の管理とプールの自動作成を参照してください。
プールから GPU にアクセスできる場合でも、GPU は使用されません。 | GPU を利用できる場合、複数の CPU コアを使用した学習は推奨されません。 | |
| 複数の GPU | 目的のクラスターを既定のクラスター プロファイルとして指定します。詳細については、並列環境の管理とプールの自動作成を参照してください。
| 利用可能な GPU と同じ数のワーカーを使用して、目的のクラスター内にある並列プールを起動します。詳細については、MATLAB による複数の GPU での深層学習を参照してください。
例については、カスタム学習ループを使用したネットワークの並列学習を参照してください。 |
複数のネットワークの並列学習
ローカル リソースまたはリモート クラスター リソースを使用した複数のネットワークの並列学習
複数のネットワークに並列で学習させるには、異なる並列ワーカーで各ネットワークの学習を実行します。各ワーカー上でネットワーク パラメーターや学習パラメーターを変更することで、パラメーター スイープを並列で実行できます。
各ワーカーで単一のネットワークに学習させるには、parfor (Parallel Computing Toolbox) または parfeval (Parallel Computing Toolbox) を使用します。ローカルの MATLAB をブロックすることなくバックグラウンドで実行するには、parfeval を使用します。OutputFcn 学習オプションを使用すると、結果をプロットできます。
ローカルで実行することも、リモート クラスターを使用して実行することもできます。リモート クラスターを使用する場合、MATLAB Parallel Server が必要です。
| リソース | trainnet ワークフロー | カスタム学習ワークフロー | 必要な製品 |
|---|---|---|---|
| 複数の CPU | 目的のクラスターを既定のクラスター プロファイルとして指定します。詳細については、並列環境の管理とプールの自動作成を参照してください。 各ワーカーで学習または推論を同時に実行するには、 以下の例を参照してください。
| 目的のクラスターを既定のクラスター プロファイルとして指定します。詳細については、並列環境の管理とプールの自動作成を参照してください。 各ワーカーで学習または推論を同時に実行するには、 |
|
| 複数の GPU | 利用可能な GPU と同じ数のワーカーを使用して、目的のクラスター内にある並列プールを起動します。詳細については、MATLAB による複数の GPU での深層学習を参照してください。 各ワーカーでネットワークを同時に実行するには、 以下の例を参照してください。
| 利用可能な GPU と同じ数のワーカーを使用して、目的のクラスター内にある並列プールを起動します。詳細については、MATLAB による複数の GPU での深層学習を参照してください。 各ワーカーで学習または推論を同時に実行するには、 ミニバッチ データをそれぞれ |
実験マネージャーを使用した複数のネットワークの並列学習
実験マネージャーを使用すると、複数の並列ワーカーで同時に試行を実行できます。実験を行う前に、並列環境を設定し、実験マネージャーのツールストリップで [モード] を Simultaneous に設定します。実験マネージャーは、並列プール内にあるワーカーの数と同じ数の試行を同時に実行します。詳細については、Run Experiments in Parallelを参照してください。
バッチ深層学習
batch (Parallel Computing Toolbox) 関数を使用すると、深層学習の計算をオフロードしてバックグラウンドで実行することができます。これにより、バックグラウンドで計算を行いながら MATLAB を使用することができます。また、クライアントの MATLAB を閉じて、後で結果を取得することもできます。
バッチ ジョブは、ローカル クラスターまたはリモート クラスターで実行できます。深層学習の計算をオフロードするには、batch を使用し、クラスター内で実行されるスクリプトまたは関数を送信します。並列計算を含め、あらゆる種類の深層学習の計算をバッチ ジョブとして実行できます。例については、Send Deep Learning Batch Job to Clusterを参照してください。
バッチ ジョブをスクリプトとして送信すると、既定では、クライアントからワーカーにワークスペース変数がコピーされます。ワークスペース変数がワーカーにコピーされないようにするには、バッチ ジョブを関数として送信します。
並列実行するには、ローカルまたはクラスターで並列実行する際に使用するコードと同じコードを含むスクリプトまたは関数を使用します。たとえば、スクリプトや関数を使用することで、ExecutionEnvironment 学習オプションを "parallel-auto" に設定して trainnet を実行したり、カスタム学習ループを並列で実行したりすることができます。batch を使用してスクリプトまたは関数をクラスターに送信し、使用するワーカーの数を Pool オプションで指定します。batch による並列計算の実行に関する詳細については、バッチ並列ジョブの実行 (Parallel Computing Toolbox)を参照してください。
複数のネットワークで深層学習の計算を実行する場合、ネットワークごとに 1 つのバッチ ジョブを送信することをお勧めします。これにより、クラスター内で並列プールを起動するのに必要なオーバーヘッドを回避でき、ジョブ モニターを使用して各ネットワークの計算の進行状況を個別に監視することができます。
複数のバッチ ジョブを送信できます。送信されたジョブを実行するのに必要なワーカーの数が、クラスター内で現在利用できるワーカーの数よりも多い場合、後から送信されたジョブは、先に送信されたジョブが完了するまでキューに格納されます。キューに格納されたジョブは、それらのジョブを実行するのに十分な数のワーカーが利用できるようになった時点で開始されます。
クラスターによっては、クラスターのワーカーに学習データを提供するオプションが複数存在します。データ セットが大きい場合は、クラスターの管理者に相談してください。
クラスターに共有ネットワーク ファイル システムがある場合、ワーカーからデータに直接アクセスできるため、このファイル システムを利用してデータを共有するのが最も簡単です。ワーカーの既定の検索パスは、クライアントの MATLAB の検索パスと同じではない可能性があるため、ワーカーに追加するパスを
batch関数のAdditionalPathsオプションを使用して指定することで、クラスター内のワーカーから必要なファイルに確実にアクセスさせることができます。詳細については、ワーカーとのコードの共有 (Parallel Computing Toolbox)を参照してください。クラウド ストレージを利用することもできます。この方法は、特に、クラウド クラスターを使用して学習を行う場合に便利です。クラウド ストレージは便利ですが、リモート ストレージから学習データにアクセスすると、ネットワークの学習速度が低下する可能性があります。詳細については、クラウドでの深層学習データの処理を参照してください。
各ワーカーに学習データをコピーできます。これにより、必ずクラスターのワーカーが学習データにローカルでアクセスできるようになり、学習速度が向上しますが、データ セットが大きい場合にデータのコピーを繰り返し作成するのは得策ではない可能性があります。各ワーカーにデータをコピーする方法を示す例については、Send Deep Learning Batch Job to Clusterを参照してください。
ジョブ完了後に結果を取得するには、fetchOutputs (Parallel Computing Toolbox) 関数を使用します。fetchOutputs は、バッチ ワーカーのワークスペース内にあるすべての変数を取得します。バッチ ジョブをスクリプトとして送信すると、既定では、クライアントからワーカーにワークスペース変数がコピーされます。ワークスペース変数の再帰を防ぐには、スクリプトではなく関数としてバッチ ジョブを送信します。
バッチ ジョブの実行中にコマンド ラインの出力を取得するには、diary (Parallel Computing Toolbox) を使用します。これは、Verbose オプションを true に設定して trainnet 関数を実行する場合に役立ちます。
並列環境の管理とプールの自動作成
Parallel Computing Toolbox には、ローカルのデスクトップ マシンで並列コードを実行するためのクラスター プロファイル Processes があらかじめ設定されています。既定では、MATLAB はすべての並列プールを Processes クラスター プロファイルを使用して起動します。リモート クラスター上でコードを実行するには、リモート クラスターのプロファイルを使用して並列プールを起動しなければなりません。
クラスター プロファイルの管理、クラスターの検出、並列プールの起動と停止、および GPU デバイスの選択を行うには、[並列] パネル を使用します (R2026b 以降)。または、クラスター プロファイル マネージャーを使用してクラスター プロファイルを管理することもできます。クラスター プロファイルの管理に関する詳細については、クラスターの検出とクラスター プロファイルの使用 (Parallel Computing Toolbox)を参照してください。
trainnet、parfor、parfeval などの一部の関数は、並列プールを自動的に起動できます。並列プールの自動作成機能を活用するには、[並列] パネルまたはクラスター プロファイル マネージャーで、目的のクラスターを既定のクラスター プロファイルとして設定します。または、プールを手動で作成し、プール作成時に目的のクラスター リソースを指定することもできます。
リモート クラスターで複数の GPU を使用し、複数のネットワークの並列学習を実行したり、カスタム学習ループを実行したりする場合は、利用できる GPU の数と同じ数のワーカーを使い、目的のクラスター内で並列プールを手動で起動するのが最善の方法です。詳細については、MATLAB による複数の GPU での深層学習を参照してください。
ローカル GPU の監視
GPU モニター (Parallel Computing Toolbox)を使用すると、GPU 使用率、メモリ使用量、およびプロセスをリアルタイムで監視できます (R2026b 以降)。この情報を使用して、コードの非効率性やボトルネックを特定できます。詳細については、Improve Performance Using GPU Monitor Metrics (Parallel Computing Toolbox)を参照してください。
深層学習の適合率
最高のパフォーマンスを得るには、すべての深層学習ワークフローで GPU を使用することをお勧めします。GPU のパフォーマンスは、計算に使用される浮動小数点数の精度によって大きく異なる可能性があるため、どの精度で計算が実行されているかを知ることが重要です。一般に、GPU は、低精度の計算において非常に優れたパフォーマンスを発揮します。
深層学習のためだけに GPU を使用する場合、単精度演算と半精度演算のパフォーマンスは、GPU を評価する最も重要な特性の一つとなります。Parallel Computing Toolbox を使用して他の計算にも GPU を使用する場合、倍精度演算のパフォーマンスが高いことが重要になります。これは、MATLAB の多くの関数が既定で倍精度演算を使用しているためです。詳細については、単精度での計算の実行 (Parallel Computing Toolbox)を参照してください。
既定では、trainnet 関数は単精度浮動小数点演算を使用してニューラル ネットワークに学習させ、単精度の学習可能なパラメーターと状態パラメーターをもつネットワークを返します。GPU で学習させる場合は、trainingOptions 関数を使用して TrainingPrecision オプションを "automatic-mixed" に設定することで、パフォーマンス向上のために可能な限り半精度浮動小数点演算を使用できます。自動混合精度を使用する場合、trainnet 関数は、単精度の学習可能なパラメーターと状態パラメーターをもつネットワークを返します。
予測関数か検証関数を単精度の学習可能なパラメーターと状態パラメーターをもつ dlnetwork オブジェクトと組み合わせて使用する場合、単精度浮動小数点演算を使用して計算が実行されます。
予測関数か検証関数を倍精度 (double) の学習可能なパラメーターと状態パラメーターをもつ dlnetwork オブジェクトと組み合わせて使用する場合は、次のようになります。
入力データが単精度の場合、単精度浮動小数点演算を使用して計算が実行されます。
入力データが倍精度の場合、倍精度浮動小数点演算を使用して計算が実行されます。
MATLAB の浮動小数点データ型の詳細については、浮動小数点数を参照してください。
カスタム学習ワークフローの場合、データを単精度に変換して学習や推論を実行することをお勧めします。minibatchqueue を使用してミニバッチを管理する場合、データは既定で単精度に変換されます。
再現性
最高のパフォーマンスを提供するために、GPU を使用した MATLAB での深層学習は確定的であることを保証しません。ネットワーク アーキテクチャによっては、GPU を使用して 2 つの同一のネットワークに学習させたり、同じネットワークとデータを使用して 2 つの予測を行ったりする場合に、ある条件下で異なる結果が得られることがあります。GPU を使用して深層学習演算を実行するときに確定性が必要な場合は、deep.gpu.deterministicAlgorithms 関数 (R2024b 以降)を使用します。
参考
trainnet | trainingOptions | dlnetwork | minibatchqueue | ディープ ネットワーク デザイナー | 実験マネージャー