主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

深層学習におけるデータレイアウトの考慮事項

生成されたCUDA®c++コードを使用するアプリケーションをビルドする場合,生成コードを呼び出すCUDA c++主要関数を提供しなければなりません。既定では,codegenコマンドを使用するソースコード,スタティックライブラリ,ダイナミックライブラリ,および実行可能ファイルのコード生成に対して,GPU编码器™はCUDA c++主要ファイルの例(ビルドフォルダーの例子サブフォルダーにあるmain.cuソースファイルとmain.hヘッダーファイル)を生成します。このメインファイルの例は,生成されたCUDAコードをアプリケーションに組み込むのに役立つテンプレートです。主要関数の例は,動的に割り当てられたものを含むデータを宣言して初期化します。これは,エントリポイント関数を呼び出しますが,エントリポイント関数が返す値は使用しません。

深層畳み込みニューラルネットワーク(CNN)のコードを生成する際に,コードジェネレーターはNVIDIA®cuDNN, NVIDIA GPUのTensorRTまたは手臂®马里GPUの臂计算库を利用します。これらのライブラリには,イメージ,ビデオおよびその他のデータを保持する入力テンソルに固有のデータレイアウト要件があります。アプリケーションのビルド時にカスタムの main 関数をオーサリングする場合、これらのライブラリに必要な形式で生成されたエントリポイント関数にデータを提供する入力バッファーを作成しなければなりません。

CNNのデータレイアウト形式

深層畳み込みニューラルネットワーク(CNN)の場合,2次元イメージのバッチに対する形式を定義するために,次の文字をもつ4次元テンソル記述子が使用されます。

  • N——バッチサイズ

  • C——特徴マップの数(チャネル数)

  • H——高さ

  • W——幅

最も一般的に使われる4次元テンソル形式を示します。文字は,ストライドの降順に並べ替えられて表示されます。

  • NCHW

  • NHWC

  • CHWN

これらのうち,GPU编码器はNCHW形式を使用します(既定では列優先のレイアウト)。行優先のレイアウトを使用するには,codegenコマンドに-rowmajorオプションを渡します。あるいは,コード生成構成オブジェクトのcfg。RowMajorパラメーターを変更して,行優先のレイアウトでコードを構成します。

たとえば,次元N = 1C = 3H = 5W = 4をもつイメージのバッチについて考えます。イメージピクセル要素が整数のシーケンスで表される場合,入力イメージは次のように図形で表すことができます。

主要関数で入力バッファーを作成する場合,4次元イメージはメモリで次のようにNCHW形式でレイアウトされます。

  1. 最初のチャネル(C = 0)から開始し,要素は行優先の順序で連続的に配置されます。

  2. すべてのチャネルの要素がレイアウトされるまで,2番目以降のチャネルで続行します。

  3. 次のバッチに進みます(N > 1の場合)。

LSTMのデータレイアウト形式

長短記憶(LSTM)ネットワークは,再帰型ニューラルネットワーク(RNN)の一種で,シーケンスデータのタイムステップ間の長期的な依存関係を学習できます。LSTMの場合,データレイアウト形式を以下の文字で表すことができます。

  • N——バッチサイズ

  • 年代——シーケンス長(タイムステップ数)

  • d- 1つの入力シーケンス内のユニット数

LSTMの場合,GPU编码器は既定でSNd形式を使用します。

参考

関数

オブジェクト

関連するトピック