深層学習におけるデータ レイアウトの考慮事項
生成された CUDA® C++ コードを使用するアプリケーションをビルドする場合、生成コードを呼び出す CUDA C++ main 関数を提供しなければなりません。既定では、codegen
コマンドを使用するソース コード、スタティック ライブラリ、ダイナミック ライブラリ、および実行可能ファイルのコード生成に対して、GPU Coder™ は CUDA C++ main ファイルの例 (ビルド フォルダーの examples
サブフォルダーにある main.cu
ソース ファイルと main.h
ヘッダー ファイル) を生成します。このメイン ファイルの例は、生成された CUDA コードをアプリケーションに組み込むのに役立つテンプレートです。main 関数の例は、動的に割り当てられたものを含むデータを宣言して初期化します。これは、エントリポイント関数を呼び出しますが、エントリポイント関数が返す値は使用しません。
深層畳み込みニューラル ネットワーク (CNN) のコードを生成する際に、コード ジェネレーターは NVIDIA® cuDNN、NVIDIA GPU の TensorRT または ARM® Mali GPU の ARM Compute Library を利用します。これらのライブラリには、イメージ、ビデオ、およびその他のデータを保持する入力テンソルに対する固有のデータ レイアウト要件があります。アプリケーションのビルド時にカスタムの main 関数をオーサリングする場合、これらのライブラリに必要な形式で生成されたエントリポイント関数にデータを提供する入力バッファーを作成しなければなりません。
CNN のデータ レイアウト形式
深層畳み込みニューラル ネットワーク (CNN) の場合、2 次元イメージのバッチに対する形式を定義するために、次の文字をもつ 4 次元テンソル記述子が使用されます。
N
– バッチ サイズC
– 特徴マップの数 (チャネル数)H
– 高さW
– 幅
最も一般的に使われる 4 次元テンソル形式を示します。文字は、ストライドの降順に並べ替えられて表示されます。
NCHW
NHWC
CHWN
これらのうち、GPU Coder は NCHW
形式を使用します (既定では列優先のレイアウト)。行優先のレイアウトを使用するには、codegen
コマンドに -rowmajor
オプションを渡します。あるいは、コード生成構成オブジェクトの cfg.RowMajor
パラメーターを変更して、行優先のレイアウトでコードを構成します。
たとえば、次元 N=1
、C=3
、H=5
、W=4
をもつイメージのバッチについて考えます。イメージ ピクセル要素が整数のシーケンスで表される場合、入力イメージは次のように図形で表すことができます。
main 関数で入力バッファーを作成する場合、4 次元イメージはメモリで次のように NCHW
形式でレイアウトされます。
最初のチャネル (
C=0
) から開始し、要素は行優先の順序で連続的に配置されます。すべてのチャネルの要素がレイアウトされるまで、2 番目以降のチャネルで続行します。
次のバッチに進みます (
N > 1
の場合)。
LSTM のデータ レイアウト形式
長短記憶 (LSTM) ネットワークは、再帰型ニューラル ネットワーク (RNN) の一種で、シーケンス データのタイム ステップ間の長期的な依存関係を学習できます。LSTM の場合、データ レイアウト形式を以下の文字で表すことができます。
N
– バッチ サイズS
– シーケンス長 (タイム ステップ数)d
– 1 つの入力シーケンス内のユニット数
LSTM の場合、GPU Coder は既定で SNd
形式を使用します。
参考
関数
オブジェクト
coder.gpuConfig
|coder.CodeConfig
|coder.EmbeddedCodeConfig
|coder.gpuEnvConfig
|coder.CuDNNConfig
|coder.TensorRTConfig