本実施形態の説明に先立ち、本願発明者が検討した事項について説明する。
図1は、深層学習の処理の流れを模式的に示す図である。
深層学習では、画像等の識別対象に関する教師あり学習を行うことにより、ニューラルネットワークに識別対象の特徴を学習させる。そのように学習させたニューラルネットワークを用いることにより、識別対象を識別することができる。
ニューラルネットワークは、脳のニューロンを模したユニットを階層的に結合したネットワークである。各ユニットは、他のユニットからデータを受け取り、他のユニットへデータを受け渡す。ニューラルネットワークでは、ユニットのパラメータを学習によって変化させることで様々な識別対象を識別できる。
以下では、図1を参照しながら、画像の認識に用いられる畳み込みニューラルネットワーク(CNN:Convolutional Neural Network)について説明する。
このニューラルネットワークは、畳み込み(convolution)層、サブサンプリング(sub-sampling)層、及び全結合(fully-connected)層を備えた階層構造を有する。図1の例では畳み込み層とサブサンプリング層を交互に2回設けているが、これらの層を更に多く設けてもよい。更に、全結合層を複数設けてもよい。ニューラルネットワークの階層構造や各層の構成は、識別する対象などに応じて設計者が予め定めればよい。
ニューラルネットワークで画像の識別を行う処理はフォワード処理とも呼ばれる。フォワード処理では、図1に示すように、左から右に向かって畳み込み層とプーリング層とが交互に複数繰り返される。そして、最後に全結合層で画像に写った識別対象の識別が行われる。
また、ニューラルネットワークで画像の学習を行う処理はバックワード処理とも呼ばれる。バックワード処理では、識別した結果と正解との誤差を求め、それを右から左へニューラルネットワークに逆伝播させ、畳み込みニューラルネットワークの各階層のパラメータを変更する。
図2は、畳み込み層で行う畳み込み計算について模式的に示す図である。
図2においては、入力画像の画素データが各要素に格納されたbottom行列と、入力画像に作用させるフィルタを表すweight行列との畳み込み計算について例示している。この例では、bottom行列とweight行列の各々を複数用意し、それらの間で畳み込みを行う。
なお、複数のbottom行列の各々は、バッチ数Nと入力チャネル番号Cinとにより識別される。一方、weight行列は、出力チャネル番号Coutと入力チャネル番号Cinとにより識別される。
図2の例では畳み込み計算は以下のようにして行われる。
まず、バッチ数Nと出力チャネル番号Coutの組み合わせを一つ選択する。例えば、N=0、Cout=0とする。
そして、選択したバッチ数Nを有する複数のbottom行列と、選択した出力チャネル番号Coutを有する複数のweight行列との組み合わせのうちで、入力チャネル番号Cinが同一となる組み合わせを選択する。例えば、前述のようにN=0、Cout=0とした場合には、N=0かつCin=0のbottom行列と、Cout=0かつCin=0のweight行列とを選択する。
そして、選択したこれらのbottom行列とweight行列との間で畳み込みを行う。その畳み込みにより得られた行列を以下ではtop行列と呼ぶ。
バッチ数Nと出力チャネル番号Coutとを固定した状態でこのような畳み込みをCin=0~255の各々のbottom行列とweight行列に行うことで256個のtop行列が得られる。その後に、これら256個のtop行列の各々を足すことにより、バッチ数Nと出力チャネル番号Coutとで特定される一つの出力行列を得る。
更に、バッチ数Nと出力チャネル番号Coutとを変えながらこのような計算を行うことにより、最終的に全バッチ数N×全出力チャネル番号Coutの個数の出力行列が得られる。図2の例では、64×384個の出力行列が得られる。
このようにして複数のbottom行列と複数のweight行列との畳み込み計算が行われる。
そのような畳み込み計算では、前述のように入力チャネル番号Cinが同一の二つのbottom行列とweight行列との間で畳み込み計算が行われる。そこで、これらの行列の畳み込み計算について詳細に説明する。
図3(a)~(c)は、bottom行列とweight行列との畳み込み計算を模式的に示す図である。
まず、図3(a)に示すように、畳み込みの対象となるbottom行列とweight行列を用意する。この例では、bottom行列を13×13の正方行列とし、weight行列を3×3の正方行列としている。
次に、図3(b)に示すように、bottom行列の周囲を0パディングすることにより15×15の行列Mを得る。
続いて、図3(c)に示すように、行列Mにおいてweight行列と同じサイズの小行列Pijを抽出する。以下ではその小行列Pijのk行l列の要素を(Pij)kl(0≦k,l≦2)で表し、weight行列のk行l列の要素をgkl(0≦k,l≦2)で表す。
また、行列Mとweight行列との畳み込みで得られた行列を前述のようにtop行列と呼ぶ。この場合、top行列の各要素rijは、以下の式(1)から算出することができる。
但し、この方法では、top行列の一つの要素rijを求めるために、weight行列の要素数(3×3)と同じ数だけ乗算をする必要があり、畳み込み計算の高速化を実現できない。
畳み込み計算を高速化するアルゴリズムとしてWinogradアルゴリズムが知られている。そこで、以下にWinogradアルゴリズムについて説明する。
深層学習には前述のようにフォワード処理とバックワード処理とがあるが、ここではフォワード処理におけるWinogradアルゴリズムについて説明する。
図4(a)~(c)は、フォワード処理におけるWinogradアルゴリズムについて模式的に示す図である。
まず、図4(a)に示すように、bottom行列からt×tの小bottom行列dを切り出す。なお、tは自然数である。
次に、次の式(2)に従い、小top行列yを求める。
小top行列yは、top行列の一部を形成する行列である。
また、式(2)におけるB、G、Aは定数行列である。これらの定数行列B、G、Aの要素やサイズは、各行列g、dのサイズに応じて変わる。例えば、weight行列gのサイズが3×3であり、小bottom行列dのサイズが4×4の場合には、定数行列B、G、Aの要素とサイズは以下の式(3)のようになる。
なお、式(2)における演算子「◎」は行列の要素ごとの乗算である。例えば、型が同一の任意の行列U、Vの各々の要素をuij、vij、U◎Vのij要素を(U◎V)ijとすると、(U◎V)ij=uijvijとなる。
次に、図4(b)に示すように、bottom行列から小bottom行列dを切り出す位置を図4(a)の場合よりも2列ずらし、切り出した小bottom行列dに対して上記と同じ計算を行う。これにより得られた小top行列yは、top行列において、図4(a)で得た小top行列yの隣のブロックを形成する。
このようにbottom行列から小bottom行列dを切り出す位置を列方向と行方向に二個ずつずらすことにより、図4(c)に示すように、各小top行列yで形成されるtop行列を得ることができる。
以上により、Winogradアルゴリズムを用いたbottom行列とtop行列との畳み込み計算を終える。
式(2)のWinogradアルゴリズムでは、行列GgGTと行列BTdBを一度作ってしまえば、後はそれらの要素ごとの積を計算するだけで畳み込みを行うことができるため、畳み込み計算を高速に行うことができる。
本願発明者は、この例のようにweight行列gのサイズが3×3であり、かつ小bottom行列dのサイズが4×4の場合の計算時間を試算した。その結果、Winogradアルゴリズムを使用しない図3(a)~(c)の例では、計算時間が1152サイクルとなった。なお、「サイクル」は、レジスタへの書き込み回数と等価である。
一方、Winogradアルゴリズムでは計算時間は940サイクルとなり、図3(a)~(c)の例と比較して1.23(=1152/940)倍の高速化が図られることが明らかとなった。
次に、このようなWinogradアルゴリズムを利用して畳み込み計算を行う計算機について説明する。
図5は、深層学習等における畳み込み計算を行うための計算機のハードウェア構成図である。
図5に示すように、この計算機10は、バス13を介して接続されたメインメモリ11とプロセッサ12とを有する。
このうち、メインメモリ11はDRAM(Dynamic Random Access Memory)等のようにデータを一時的に記憶するデバイスであり、プロセッサ12と協働して様々なプログラムを実行する。
一方、プロセッサ12は、ALU(arithmetic and logic unit)等の演算器を備えたハードウェアである。この例では、プロセッサ12としてDLU(Deep Learning Unit: 登録商標)を使用する。DLUは、深層学習に適したアーキテクチャを有するプロセッサであり、8個のDPU(Deep learning Processing Unit)-chain14を有する。
図6(a)は、一つのDPU-chain14のハードウェア構成図である。
図6(a)に示すように、DPU-chain14は4個のDPU15を備える。これらのDPU15の各々において後述のように並列計算が行われる。
また、図6(b)は、一つのDPU15のハードウェア構成図である。
図6(b)に示すように、DPU15は、16個のDPE(Deep learning Processing Element)0~15を有する。
図7は、各DPEのハードウェア構成図である。
なお、図6(b)に示したようにDPEの総数は16であるが、以下ではそのうちのDPE0~DPE7のみを示して説明する。
図7に示すように、DPE0~DPE7の各々は、8個の計算コアC#0~C#7と、これらの計算コアC#0~C#7が読み書き可能なレジスタファイル20とを有する。
このうち、計算コアC#0~C#7は各々が独立したSIMD(Single Instruction Multiple Data)演算器であり、各計算コアC#0~C#7において並列計算を実行することができる。
一方、レジスタファイル20は、バス13(図5参照)を介してメインメモリ11に接続されており、メインメモリ11から読み出されたデータを格納したり、計算コアC#0~C#7が計算した計算結果を格納したりする。
この例では、レジスタファイル20を4個のレジスタG#0~G#3に分け、各々が並行して読み出しや書き込みが行えるようにする。例えば、レジスタG#0がメインメモリ11からデータを読み出している場合には、それと並行して計算コアC#0~C#7が計算した計算結果をレジスタG#1に格納することができる。
図8は、DPE0のハードウェア構成図である。
なお、DPE1~DPE15もこれと同様のハードウェア構成を有するため、その説明については省略する。また、図8では、レジスタファイル20のレジスタG#0~G#3のうち、レジスタG#0のハードウェア構成のみを示している。他のレジスタG#1~G#3もこれと同様のハードウェア構成を有する。
図8に示すように、レジスタG#0は、8個のバンクR#0~R#7を備える。バンクR#0~R#7は、それぞれが記憶領域の一例であって、計算コアC#0~C#7の各々に対応して設けられる。例えば、バンクR#0は、計算コアC#0に対応して設けられた記憶領域である。計算コアC#0が計算を行うときには、バンクR#0にあるデータを計算コアC#0が読み込んだり、計算コアC#0が計算結果をバンクR#0に書き込んだりすることになる。
図9は、バンクR#0~R#7の各々に付されたライン番号について説明するための図である。
ライン番号は、バンクR#0~R#7のそれぞれのエントリを識別するための識別子であり、この例ではL0~L127の128個のライン番号を使用する。各エントリに格納されるデータは特に限定されない。この例では、浮動小数点型のデータを一つのエントリに格納する。これによれば、127個の浮動小数点型のデータをバンクR#0に格納できる。バンクR#1~R#7についても同様である。
また、深層学習の畳み込み計算を行う場合には、畳み込み計算の対象となる行列の要素が各エントリに格納される。その場合、行列の要素は、メインメモリ11において配列要素として格納されている。
そこで、次に、メインメモリ11に格納されている配列要素をDPE0~DPE7に展開する展開方法について説明する。
その展開方法にはシーケンシャル方式とマルチキャスト方式とがある。
まず、シーケンシャル方式について説明する。
図10及び図11は、シーケンシャル方式について説明するための模式図である。
この例では、メインメモリ11に格納された配列要素a[0]、a[1]、a[2]、…a[127]をDPE0~DPE7に展開するものとする。
この場合は、まず図10(a)に示すように、DPE0のバンクR#0においてライン番号L0で特定されるエントリに最初の配列要素a[0]を格納する。
次に、図10(b)に示すように、ライン番号L0を変えずに隣のバンクR#1に次の配列要素a[1]を格納する。
そして、図10(c)に示すように、ライン番号L0を変えずに隣のバンクに次々と要素を格納していく。これにより、DPE0~DPE7の各バンクR#0~R#7においてライン番号L0で特定されるエントリが、配列要素a[0]、a[1]、a[2]、…a[63]で埋められることになる。
この後は、図11(a)に示すように、DPE0のバンクR#0においてライン番号L1で特定されるエントリに次の配列要素a[64]を格納する。
そして、図11(b)に示すように、ライン番号L1を変えずに隣のバンクR#1に次の配列要素a[65]を格納する。
更に、このようにライン番号L1を変えずに隣のバンクに次々と配列要素を格納していく。これにより、図11(c)に示すように、DPE0~DPE7の各バンクR#0~R#7においてライン番号L1で特定されるエントリが配列要素a[64]、a[65]、a[66]、…a[127]で埋められる。
以上により、シーケンシャル方式により配列要素a[0]、a[1]、a[2]、…a[127]がDPE0~DPE7に展開されたことになる。このようなシーケンシャル方式によれば、DPE0~DPE7の同一のライン番号Liにあるエントリが順に埋められていき、そのライン番号Liの最後のエントリが埋まったところで次のライン番号Li+1に配列要素が格納されていく。
次に、マルチキャスト方式について説明する。
図12は、マルチキャスト方式について説明するための模式図である。
この例では、メインメモリ11に格納された配列要素a[0]、a[1]、a[2]、…a[23]をDPE0~DPE7に展開するものとする。
マルチキャスト方式では、DPE0にa[0]、a[1]、a[2]、…a[23]を順に格納していく。そして、これと同様にしてDPE1~DPE7の各々にa[0]、a[1]、a[2]、…a[23]を格納する。この方法によれば、DPE0~DPE7のそれぞれに格納される配列要素が同一となる。
次に、計算機10においてWinogradアルゴリズムで畳み込み計算を行う場合のレジスタの中身について説明する。
図13は、各DPEのそれぞれのレジスタG#0の中身を模式的に示す図である。
以下では、行列を表す記号と、その行列の各要素を格納した配列とを同じ記号で表す。例えば、t×tのbottom行列dの各要素を格納する配列をdで表し、3×3のweight行列gの各要素を格納する配列をgで表す。
そして、これらの配列d、gを以下の式(4)のように記述する。
式(4)においてNは、0~63の値をとるバッチ数である。また、Cinは0~255の値をとる入力チャネル番号であり、Coutは0~383の値をとる出力チャネル数である。
そして、HとWは、一つのbottom行列における要素を特定する変数である。同様に、H’とW’は、一つのweight行列における要素を特定する変数である。
この場合、配列dは、シーケンシャル方式によりDPE0~DPE7のそれぞれのレジスタG#0に展開される。
配列dのような多重配列の場合は、最下位の配列要素から順にレジスタG#0に格納される。配列dの最下位の要素はバッチ数Nで特定される。よって、DPE0のバンクR#0、R#1、…R#7の順に、バッチ数Nが0、1、…7の配列要素が格納される。そして、バッチ数Nが8、9、…15の配列要素は、DPE1のバンクR#0、R#1、…R#7に順に格納される。このようにしてバッチ数Nが0~63の各要素がDPE0~DPE7に展開される。
また、配列d[Cin][H][W][N]において、Cin、H、Wで特定される上位の要素については以下のように取り扱う。
まず、図4(a)に示したように、bottom行列からt×tの小bottom行列dを切り出す位置を固定し、その小bottom行列dのt×t個の要素を[H][W]に格納する。そして、Cinについては、0~255の値のうちの最初の0~4とする。
これによれば、Cin=0に対応するt×tの行列要素がDPE0~DPE7のそれぞれに展開される。同様に、Cin=1、Cin=2、Cin=3のそれぞれに対応するt×tの行列要素もDPE0~DPE7に展開される。
一方、配列gについては、マルチキャスト方式によりDPE0~DPE7のそれぞれのレジスタG#0に展開される。
この例では、Coutの値が0~7の配列要素を、入力チャネル番号Cinごとにマルチキャストを行う。例えば、Coutの値が0~7の配列要素のうち、Cin=0の要素をDPE0~DPE7のそれぞれにマルチキャストする。Cin=0、Cin=1、Cin=2の配列要素についても同様にマルチキャストによりDPE0~DPE7に転送する。
但し、このようにマルチキャスト方式で配列gを転送すると、DPE0のバンクR#0における入力チャネル番号Cinと出力チャネルCoutの値に規則性がなくなる。これでは、そのバンクR#0に対応した計算コアC#0が、Winogradアルゴリズムで配列g、dを畳み込むのに不便である。他の計算コアC#1~C#7や、DPE1~DPE7においても同様である。
そこで、配列gの要素については以下のように並び替えを行う。
図14は、メインメモリ11にある配列gの配列要素を模式的に示す図である。
前述のように、配列gは、weight行列を表す配列であり、3×3の正方行列に対応させることができる。そこで、以下ではこの3×3の正方行列の各要素に順に0、2、…8の数字を割り当て、これらの数字で各要素を識別する。
これによれば、式(4)のようにg[Cout][Cin][H’][W’]と記述した場合、[H’]と[W’]の各々に0、2、…8の数字が割り当てられることになる。
図15は、前述のマルチキャスト方式で転送された直後のDPE0のレジスタG#0の中身を示す図である。
図15に示すように、マルチキャスト方式で転送を行うと、g[Cout][Cin][H’][W’]の下位の要素から順にバンクR#0~R#7の一つのラインが埋められる。そして、そのラインの最後のバンクR#7が埋まると、一つ上のラインが順に埋められていく。
weight行列gの要素数は9であるのに対し、バンクR#0~R#7の個数は8個であり、両者の数は一致しない。よって、このようにマルチキャスト方式でレジスタに転送を行うと、Cin=0かつCout=0の9個の要素が二つのラインをまたいでレジスタに格納されることになる。他のCinとCoutの組み合わせでも同様である。
これにより、バンクR#0にはCinやCoutの値が様々な配列要素が格納されてしまい、バンクR#0におけるCinとCoutの規則性が低下する。
そこで、この例では、DPE0の各計算コアC#0~C#7が、DPE0の残りのレジスタG#1~G#3のいずれかをバッファとしながら、レジスタG#0における配列gの要素を整列させる。
図16は、整列後のDPE0のレジスタG#0の中身を示す図である。
図16に示すように、整列をすることによって、Coutの値が同一の要素は同一のバンクに格納される。例えば、バンクR#0にはCout=0の要素のみが格納される。
図17は、このように整列をした後のDPE0~DPE7の各々のレジスタG#0の中身を示す図である。
図17に示すように、例えばDPE0のバンクR#0に格納される配列gの要素は、Cout=0かつCin=0~3の要素となる。また、このバンクR#0に格納される配列dの要素は、N=0かつCin=0~3の要素である。
これにより、バンクR#0における配列d、gのそれぞれのCinの値が同一となり、Cinの値が同一の配列d、g同士の畳み込みを計算コアC#0がWinogradアルゴリズムに従って実行できるようになる。
また、各バンクR#0~R#7とバッチ数Nとは一対一に対応しており、異なるバッチ数に対する畳み込み計算が各バンクR#0~R#7において実行される。これについては他のDPE1~DPE7でも同様である。
そして、このような畳み込み計算を各DPE0~DPE7の各計算コアC#0~C#7が並列実行することにより、深層学習のフォワード処理やバックワード処理を高速に実行できると期待される。
しかし、本願発明者が検討したところ、このように各バンクR#0~R#7とバッチ数Nとを一対一に対応させる方法には以下のような問題があることが明らかとなった。
図18は、その問題について説明するための図であり、DPE0のレジスタG#0のバンクR#0の模式図である。
この例では、各バンクR#0~R#7とバッチ数Nとを一対一に対応させつつ、入力チャネル番号Cinが相互に等しい小bottom行列dとweight行列gとを一つのバンクに格納する。よって、一つのバンクに小bottom行列dとweight行列をそれぞれ同じ個数だけ格納する必要が生じ、小bottom行列dのサイズを大きくしようとすると小bottom行列dの要素がバンクから溢れてしまう。
例えば、図18のように、4個の小bottom行列dと4個のweight行列gとをバンクR#0に格納する場合を考える。小bottom行列dのサイズはt×tであり、weight行列gのサイズは3×3である。よって、バンクR#0に格納される要素数は、4×t2+4×32個となる。前述のように一つのバンクに格納可能なデータの個数は127個であるから、これを要素数が超えないようにするにはtを4以下にする必要がある。
このようにtが小さいと、式(2)で得られる小top行列yのサイズも小さくなるため、top行列を得るために多数の小top行列yを計算しなければならず、畳み込みに要する計算時間が長くなってしまう。その結果、畳み込み計算を高速化できるというWinogradアルゴリズムの特徴を十分に活かすことができなくなってしまう。
以下に、畳み込み計算を高速に実行することが可能な各実施形態について説明する。
(本実施形態)
図19は、本実施形態に係る情報処理装置31のハードウェア構成図である。
情報処理装置31は、計算機10(図5参照)で実行可能なプログラムを生成するためのPC(Personal Computer)等のコンピュータであり、記憶装置32、メインメモリ33、プロセッサ34、入力装置35、及び表示装置36を備える。これらの各部はバス37によって相互に接続される。
このうち、記憶装置32は、例えばHDD(Hard Disk Drive)やSSD(Solid State Drive)等の二次記憶装置であり、本実施形態に係る情報処理プログラム39を記憶する。
その情報処理プログラム39を実行することにより、後述のように計算機10(図5参照)で実行可能なプログラムを生成することができる。
なお、情報処理プログラム39をコンピュータが読み取り可能な記録媒体38に記録させておき、プロセッサ34に記録媒体38の情報処理プログラム39を読み取らせるようにしてもよい。
そのような記録媒体38としては、例えばCD-ROM(Compact Disc - Read Only Memory)、DVD(Digital Versatile Disc)、及びUSB(Universal Serial Bus)メモリ等の物理的な可搬型記録媒体がある。また、フラッシュメモリ等の半導体メモリやハードディスクドライブを記録媒体38として使用してもよい。これらの記録媒体38は、物理的な形態を持たない搬送波のような一時的な媒体ではない。
更に、公衆回線、インターネット、及びLAN(Local Area Network)等に接続された装置に情報処理プログラム39を記憶させておき、プロセッサ34が情報処理プログラム39を読み出して実行するようにしてもよい。
一方、メインメモリ33は、DRAM(Dynamic Random Access Memory)等のようにデータを一時的に記憶するハードウェアであって、その上に情報処理プログラム39が展開される。
プロセッサ34は、自装置の各部を制御したり、メインメモリ33と協働して情報処理プログラム39を実行したりするCPU(Central Processing Unit)等のハードウェアである。
入力装置35は、ユーザが操作するキーボードやマウス等の入力デバイスである。また、表示装置36は、情報処理プログラム39の実行時にユーザが使用する様々なコマンドを表示する液晶ディスプレイ等の表示デバイスである。
図20は、本実施形態に係る情報処理装置31の機能構成図である。
図20に示すように、情報処理装置31は、出力部41と算出部42とを有する。これらの各部は、プロセッサ34とメインメモリ33が協働して前述の情報処理プログラム39を実行することにより実現される。
このうち、出力部41は、計算機10(図5参照)で実行可能なプログラム50を生成する機能ブロックである。そのプログラムは、中間コードが記述されたファイルでもよいし、実行可能なバイナリファイルでもよい。
また、算出部42は、そのプログラム50における様々なパラメータを最適化する機能ブロックである。そのパラメータとしては、図4(a)~(c)のようにbottom行列から切り出す小bottom行列dのサイズtがある。また、後述するバンクの個数qも最適化の対象となるパラメータの一例である。
図21は、プログラム50を実行することにより実現される計算機10の機能ブロック図である。
図21に示すように、計算機10は、受付部51、選択部52、格納部53、計算部54、及び出力部55を備える。これらの各部は、図5のメインメモリ11とDLU12が協働してプログラム50を実行することにより実現される。
このうち、受付部51は、bottom行列とweight行列の入力を受け付ける。また、選択部52は、図4(a)~(c)に示したように、bottom行列からt×tの小bottom行列dを選択する。前述のようにサイズtの値は算出部42によって最適化されており、最適化されたサイズtを利用して選択部52が小bottom行列dを選択する。
そして、格納部53は、小bottom行列dとweight行列gのそれぞれの要素をDPE0~DPE7の各バンクR#0~R#7に格納する。
また、計算部54は、各バンクR#0~R#7に格納されたこれらの要素を用いて畳み込み計算を行う。出力部55は、畳み込み計算の結果である小top行列y(図4(a)~(c)参照)を出力する。
次に、格納部53の機能について詳細に説明する。
格納部53は、メインメモリ11から読み出した各配列の要素を各バンクR#0~R#7に格納する機能ブロックであるが、どのように格納するかはフォワード処理とバックワード処理とで異なる。
ここではフォワード処理について説明する。フォワード処理の場合、格納部53は、メインメモリ11から読み出した各配列の要素を次の式(5)のように並び替え、各要素をDPE0~DPE7の各バンクR#0~R#7に格納する。
なお、配列yは、小bottom行列dとweight行列gとを畳み込んで得られた小top行列の要素を格納するための配列である。そして、この例では、weight行列gが第1の行列の一例となり、t×tの小bottom行列dが第2の行列の一例となる。
また、(Cinの個数)=(Cinmajorの個数)×(Cinminorの個数)であり、組(Cinmajor、Cinminor)によって入力チャネル番号Cinを特定することができる。そこで、以下では組(Cinmajor、Cinminor)と入力チャネル番号Cinとを同一視する。例えば、Cinmajor=0、Cinminor=0の配列要素はCin=0に対応し、Cinmajor=0、Cinminor=1の配列要素はCin=1に対応する。
同様に、(Nの個数)=(Nmajorの個数)×(Nminorの個数)であり、組(Nmajor、Nminor)によってバッチ数Nを特定することができるため、以下では組(Nmajor、Nminor)とバッチ数Nとを同一視する。例えば、Nmajor=0、Nminor=0の配列要素はN=0に対応し、Nmajor=0、Nminor=1の配列要素はN=1に対応する。
式(5)によれば、入力チャネル番号Cinとバッチ数Nとを特定することで一つの小bottom行列dを特定することができる。この例における入力チャネル番号Cinは、このように小bottom行列dを特定する第1の識別子の一例である。同様に、この例におけるバッチ数Nは、小bottom行列dを特定する第2の識別子の一例である。
また、この例では、Cinminorの総数を4とし、Nminorの総数を16とする。更に、Cinmajorの総数は1とし、Nmajorの総数は4とする。これにより、図2のように全部で256個ある入力チャネル番号Cinのうちの4(=1×4)個と、64(=4×16)個のバッチ数の各々で特定されるbottom行列に対して畳み込み計算が行われる。
更に、配列dにおける要素[H][W]は、t×tの小bottom行列dの各要素に対応する。
一方、配列gの要素[H’][W’]は、3×3のweight行列gの各要素に対応する。また、配列gの入力チャネル番号Cinの総数は、配列dの入力チャネル番号と同じ4個とする。そして、出力チャネル番号Coutの総数は8個とする。
図22は、フォワード処理を行う場合に、格納部53によって各配列d、gが格納されたDPE0~DPE7の各々のレジスタG#0の中身を示す図である。
DPE0においては、複数の計算コアの各々が、バンクR#0~R#7のうちで自身に対応するバンクに格納された各行列d、gの間で畳み込み計算を行う。その畳み込み計算は、複数の計算コアの各々で並列実行されるため、畳み込み計算を高速化することができる。これについてはDPE0~DPE7においても同様である。
また、配列d、gのうち、配列dについては、図13と同様にシーケンシャル方式でDPE0~DPE7の各バンクR#0~R#7に格納する。ここでは、Cinmajorが同一の配列dのみを各バンクR#0~R#7に一度に格納する。そして、その配列dの畳み込みが終了した後に、Cinmajorが別の値の配列dを各バンクR#0~R#7に格納する。図22は、Cinmajor=0の配列dを各バンクR#0~R#7に格納した場合を想定している。
このとき、本実施形態では、式(5)のように配列dの最下位にCinminorを記述し、その上位にNminorを記述したため、Nminorが同一の範囲で各バンクとCinminorとが一対一に対応する。そのため、Cinminorの総数をq(=4)個とすると、一つのDPEにおけるq個のバンクの各々には、入力チャネル番号(Cinmajor、Cinminor)が相互に異なり、かつバッチ数(Nmajor、Nminor)が同一のq個の小bottom行列dが格納されることになる。
例えば、DPE0においては、R#0~R#3の4(=q)個のバンクの各々に、バッチ数Nが(0、0)であり、かつ入力チャネル番号Cinが(0、0)、(0、1)、(0、2)、(0、3)である4個の小bottom行列dが格納される。
これにより、図13のようにバンクR#0~R#7ごとにバッチ数Nを変える例とは異なり、同一のバッチ数Nを有するq個の小bottom行列dの畳み込み計算をq個の計算コアが並列して実行することができる。
一方、weight行列gについては、格納部53が図13の例と同様にマルチキャスト方式によりメインメモリ11から各DPE0~DPE7の各バンクに格納する。
ここでは、格納部53は、小bottom行列dと同一の入力チャネル番号Cinを有するweight行列gを各DPE0~DPE7の各バンクに格納する。このように入力チャネル番号Cinが相互に等しい行列d、gを同一のバンクに格納することにより、計算部54が、図2のように同一の入力チャネル番号Cinが相互に等しい行列d、g同士の畳み込み計算を行うことができる。
但し、マルチキャスト方式で配列gを各バンクに転送すると、図15を参照して説明したように、一つのバンクにおける入力チャネル番号Cinと出力チャネルCoutの規則性が低下する。そこで、本実施形態では、Winogradアルゴリズムで畳み込み計算を行うときに、計算部54が以下のようにして配列gの要素を整列させる。
図23~図25は、計算部54がWinogradアルゴリズムで畳み込み計算を行う場合のDPE0の各レジスタG#0~G#3の中身を示す図である。なお、図23~図25では、図が煩雑になるのを避けるために、レジスタG#0~G#3のバンクR#0のみを示している。
畳み込み計算を行う前は、図23(a)に示すように、レジスタG#0のバンクR#0に配列d、gの各要素が格納されている。このうち、配列dとしては、前述のようにバッチ数N(=(Nmajor、Nminor))が異なる複数の配列dがバンクR#0に格納されている。
次に、式(2)に従って、配列dの両側から行列BT、Bを乗算し、その結果である行列BTdBを配列dと同じラインに格納する。なお、行列BT、Bの各要素は、バンクR#0の定数領域cstに格納されている。
また、この段階では、weight行列を表す配列gは、図15のように規則性が乱れた状態となっている。
そこで、次のステップでは、図23(b)に示すように、レジスタG#0のバンクR#0に格納されている配列gの各要素を、レジスタG#3のバンクR#0に転送しながら各要素を整列させる。
整列後のレジスタの中身は、図16に示したように、バンクR#0~R#7と出力チャネル番号Coutとが一対一に対応しており、バンクR#0にはCout=0の要素のみが格納される。
次に、図24に示すように、式(2)に従って、配列gの両側から行列G、GTを乗算し、その結果である行列GgGTを同じバンクの空き領域に格納する。なお、行列G、GTの各要素は、バンクR#0の定数領域cstに格納されている。
次いで、図25に示すように、レジスタG#0のバンクR#0にある二つの行列BTdBと、レジスタG#3のバンクR#0にある一つの行列GdGTとに対して、式(2)の要素ごとの乗算「◎」を行う。
なお、畳み込み計算は、図2を参照して説明したように入力チャネル番号Cinが同じ二つの行列に対して行う。よって、レジスタG#3のバンクR#0にある四つの行列GdGTのうちのCin=0の行列と、レジスタG#0のバンクR#0にあるCinminor=0の二つの行列BTdBを用いて要素ごとの乗算「◎」を行う。
この後は、式(2)に従って[GgGT]◎[BTdB]の両側から行列AT、Aを乗算し、小top行列yを得る。
以上により、計算部54が行うWinogradアルゴリズムを用いた畳み込み計算を終了する。
このような畳み込み計算によれば、図23(a)に示したように、レジスタG#0のバンクR#0に、バッチ数N(=(Nminor、Nmajor))が異なるbottom行列を格納する。
これにより、図17のようにバッチ数Nが同一で入力チャネル番号Cinが異なる複数の小bottom行列dを同一のバンクに格納する例と比較して、一つのバンクに格納する小bottom行列dの個数を減らすことができる。その結果、bottom行列dのサイズtを大きくすることができ、Winogradアルゴリズムで畳み込み計算を高速に行うことが可能となる。
t=6の場合について本願発明者が試算したところ、Winogradアルゴリズムを使用しない図3(a)~(c)の例では、畳み込みに要する計算時間が2304サイクルとなった。一方、本実施形態ではその計算時間は1264サイクルとなり、1.82(=2304/1264)倍の高速化が図られることが明らかとなった。
畳み込み計算を更に高速に行うにはtの値をなるべく大きくすればよいが、tを大きくし過ぎるとバンクR#0~R#7の各々に小bottom行列dを格納することができなくなってしまう。一方、tの値が小さいとバンクR#0~R#7の各々に小bottom行列dを確実に格納できるものの、畳み込み計算の計算時間が長くなってしまう。
そこで、本実施形態では、以下のようにして最適なtの値を求める。
まず、各パラメータを次のように定義する。
p: 一つのDPEにおけるバンクの個数
q: 一つのDPEにおいて、同一のNminorを有する小bottom行列dが格納されるバンクの個数
R: 一つのバンクに格納できるデータの個数
図22の例の場合、これらのパラメータの具体的な値は次のようになる。
p: 8個
q: 4個
R 128個
更に、次のパラメータを定義する。
Cin’: DPE0で一度に処理する入力チャネル番号Cinの個数
Cout’: DPE0で一度に処理する出力チャネル番号Coutの個数
N’: DPE0で一度に処理するバッチ数Nの個数
これらのパラメータについて、図22の例を参照しながら説明する。
Cin’は、上記のようにDPE0で一度に処理する入力チャネル番号Cinの個数である。入力チャネル番号Cinは組(Cinmajor、Cinminor)で特定されるが、図22の例では(Cinmajor、Cinminor)=(0、0)、(0、1)、(0、2)、(0、3)の配列g、dのみをDPE0で処理しているため、Cin’=4となる。
一方、Cout’は、上記のようにDPE0で一度に処理する出力チャネル番号Coutの個数である。図22の例ではCoutの値が0~7の8個のweight行列gがDPE0に格納されているため、Cout’=8となる。
また、N’は、上記のようにDPE0で一度に処理するバッチ数Nの個数である。図22の例では、組(Nmajor、Nminor)が(0、0)、(0、1)、(1、0)、(1、1)の4個の小bottom行列dがDPE0で処理されているため、N’=4となる。
次に、畳み込み計算の計算時間について検討する。
まず、図23(a)のようにt×tの小bottom行列dから行列BTdBを求める場合の計算時間について検討する。行列BTdBを求めるには、例えば最初にBTdを計算し、その計算結果に右から行列Bをかければよい。また、BTdを計算するには、t×tの小bottom行列dをt個の列ベクトルに分解し、その列ベクトルと行列BTとの積を求めればよい。
そこで、この例では、t×tの小bottom行列dを構成するt個の列ベクトルのうちの一つと行列BTとの積を求めるときに要する計算時間をb(t)と書く。その関数b(t)を用いると、一つのDPEでBTdBを求めるのに要する計算時間は次の式(6)のように書ける。
式(6)に「t」を含めたのは、BTdを求めるときに、小bottom行列dのt個の列ベクトルを行列BTに乗ずる必要があるため、関数b(t)が表す計算時間よりもt倍長い計算時間が必要になることを考慮してのことである。同様に、行列BTdとBとの積を求める場合にも、行列Bのt個の列ベクトルを行列BTdに乗じる必要がある。よって、トータルの計算時間は関数b(t)が表す計算時間のt+t倍となるため、因子「t+t」を式(6)に含めた。
また、図22に示したように、一つのDPEには全部でCin’・N’個の小bottom行列dがあるから、一つのバンクあたりの小bottom行列dの個数はCin’・N’/q個となる。計算コアC#0~C#7の各々は、自身に対応する一つのバンクにあるCin’・N’/q個の小bottom行列dの各々についてBTdBを求める必要があるため、式(6)に因子Cin’・N’/qを含めた。
次に、図24のように3×3のweight行列gから行列GgGTを求める場合の計算時間について検討する。
行列GgGTを求めるには、例えば最初にGgを計算し、その計算結果に右から行列GTをかければよい。また、Ggを計算するには、weight行列gを3個の列ベクトルに分解し、その列ベクトルと行列Gとの積を求めればよい。
そこで、この例では、3×3のweight行列gを構成する3個の列ベクトルのうちの一つと行列Gとの積を求めるときに要する計算時間をw(t)と書く。その関数w(t)を用いると、一つのDPEでGgGTを求めるのに要する計算時間は次の式(7)のように書ける。
式(7)に「3」を含めたのは、行列Ggを求めるときに、weight行列gの3個の列ベクトルを行列Gに乗ずる必要があるため、関数w(t)が表す計算時間よりも3倍長い計算時間が必要になることを考慮してのことである。
また、行列Ggと行列GTとの積を求める場合には、行列GTのt個の列ベクトルを行列Ggに乗じる必要がある。よって、トータルの計算時間は関数w(t)が表す計算時間よりもt+3倍だけ長くなるため、因子「t+3」を式(7)に含めた。
また、図22に示したように、一つのDPEには全部でCin’・Cout’個のweight行列gがあるから、一つのバンクあたりのweight行列gの個数はCin’・Cout’/p個となる。計算コアC#0~C#7の各々は、自身に対応する一つのバンクにあるCin’・Cout’/p個の小bottom行列dの各々についてGgGTを求める必要があるため、式(7)に因子Cin’・Cout’/pを含めた。
次に、図25のように行列BTdBとGgGTとの要素ごとの乗算を行うのに要する計算時間について検討する。
図22に示したように、一つのDPEに格納される小bottom行列dの個数はN’・Cin’・Cout’/pとなる。また、小bottom行列dの要素数はt2である。よって、行列BTdBとGgGTのそれぞれの要素ごとを乗算するときの乗算の回数は、次の式(8)で表される。
式(6)~(8)は、N個のバッチ数からN’個を選択し、Cout個の出力チャネル番号からCout’個を選択し、Cin個の入力チャネル番号からCin’個を選択した場合の計算時間である。よって、図2の全てのbottom行列とweight行列との畳み込み計算を行うには、更に次の式(9)の回数だけ計算を行う必要がある。
なお、式(9)における因子HW/(t-2)2は、H×Wのbottom行列からt×tの小行列を切り出すときの切り出し方の総数を表す。
以上の式(6)~(9)によれば、計算時間は、tだけでなくqにも依存する。そこで、本実施形態では一つのDPEで畳み込み計算をするときの計算時間を第1の関数f(t,q)で表す。第1の関数f(t,q)は、式(6)~(7)の和に式(9)を乗じることにより以下の式(10)のように表すことができる。
畳み込みに必要な計算時間を短くするには、weight行列gと小bottom行列dの各々の要素数がレジスタに格納可能な個数を超えない条件下で、第1の関数f(t,q)の値を最小とするようなtとqの組み合わせを見つければよい。
そこで、次に小bottom行列dとweight行列gの各々の要素数について検討する。
まず、小bottom行列dの要素数について説明する。
一つのDPEの一つのバンクにおける小bottom行列dの要素数Ebは次の式(11)で表すことができる。
式(11)において、t2は、一つの小bottom行列dの要素数である。また、Cin’・N’/qは、一つのバンクに格納される小bottom行列dの個数である。
一方、一つのDPEの一つのバンクにおけるweight行列gの要素数Ewは次の式(12)で表すことができる。
式(12)において、32は、一つのweight行列gの要素数である。また、Cin’・Cout’/pは、一つのバンクに格納されるweight行列gの個数である。
式(11)と式(12)より、小bottom行列dとweight行列gの各々の要素の総数を表す第2の関数g(t,q)は次の式(13)のように書ける。
前述のように一つのバンクに格納できるデータの個数をRとすると、次の式(14)の制約条件が得られる。
以上により、式(14)の制約条件を満たすt,qの組み合わせのうちで、式(10)の第1の関数f(t,q)の値を最小とするようなtとqの組み合わせを見つけることにより畳み込み計算を高速化できることになる。
そこで、本実施形態では、算出部42が式(14)の制約条件を満たすt,qの組み合わせのうちで、式(10)の第1の関数f(t,q)の値を最小とするようなtとqの組み合わせを算出する。
なお、本実施形態ではR=128であり、式(14)を満たすtとqの候補の数はそれほど多くはない。そのため、算出部42は、全探索で式(14)を満たすtとqの組み合わせを見つけ出し、これらのうちで式(10)の第1の関数f(t,q)の値を最小とするものを特定することができる。
ところで、式(10)では、b(t)とw(t)を既知の関数として扱った。b(t)とw(t)は、以下のようにして求めることができる。
まず、w(t)の求め方について説明する。前述のように、w(t)は、Ggを計算するときに、3×3のweight行列gを構成する3個の列ベクトルのうちの一つと行列Gとの積を求めるときに要する計算時間である。t=6のとき、行列Gの各要素は次の式(15)のようになる。
式(16)の右辺の二つの行列を以下の式(17)、(18)のようにおく。
よって、Ggを計算するには、最初にG’gを計算し、その結果に左からG”をかければよいことになる。そこで、G’gの計算方法について説明する。
3×3のweight行列gの一つの列g’を以下では(g0,g1,g2)Tと書く。すると、G’g’は次の式(19)のように書ける。
なお、(x0,x1,x2,x3,x4,x5)Tは、G’g’の各要素を格納する変数である。
ここで、式(19)の計算を行うために、6個の配列要素a[0]、a[1]、a[2]、a[3]、a[4]、a[5]を用意する。そして、a[0]、a[1]、a[2]の各々にg0、g1、g2を格納しておく。そして、計算用のバッファとして2個の配列要素b[0]、b[1]を用意する。
このとき、式(19)の計算は、図26の順序で各配列要素に値を代入することにより実現できる。
図26は、式(19)の計算をステップ順に示す模式図である。なお、図26における「//」は、各ステップの意味を表すコメント文である。これについては後述の図27においても同様である。
図26に示す手順で計算を行うと、最終的に(a[0]、a[1]、a[2]、a[3]、a[4]、a[5]) = (x0,x1,x5,x2,x4,x3)となり、配列要素a[0]、a[1]、a[2]、a[3]、a[4]、a[5]の各々にG’g’の計算結果を格納することができる。
そして、G’g’の計算は、8ステップで行うことができる。よって、w(6)=8となる。tの値が6とは異なる場合もこれと同様にしてw(t)の値を求めることができる。
次に、b(t)の求め方について説明する。前述のように、b(t)は、t×tの小bottom行列dを構成するt個の列ベクトルのうちの一つと行列BTとの積BTdを求めるときに要する計算時間である。t=6のとき、行列BTの各要素は次の式(20)のようになる。
また、6×6の小bottom行列dの一つの列d’を以下では(d0,d1,d2,d3,d4,d5)Tと書く。このとき、BTd’は次の式(21)のように書ける。
なお、(x0,x1,x2,x3,x4,x5)Tは、BTd’の各要素を格納する変数である。
ここで、式(21)の計算を行うために、6個の配列要素a[0]、a[1]、a[2]、a[3]、a[4]、a[5]を用意し、この各々にd0,d1,d2,d3,d4,d5を予め格納しておく。
そして、計算用のバッファとして4個の配列要素b[0]、b[1]、b[2]、b[3]を用意する。
このとき、式(21)の計算は、図27の順序で各配列要素に値を代入することにより実現できる。
図27は、式(21)の計算をステップ順に示す模式図である。
図27に示す手順で計算を行うと、最終的に(a[0]、a[1]、a[2]、a[3]、a[4]、a[5]) = (x0,x1,x2,x3,x4,x5)となり、配列要素a[0]、a[1]、a[2]、a[3]、a[4]、a[5]の各々にBTd’の計算結果を格納することができる。
そして、BTd’の計算は、15ステップで行うことができる。よって、b(6) = 15となる。tの値が6とは異なる場合もこれと同様にしてb(t)の値を求めることができる。
以上説明した事項に基づき、本実施形態に係る情報処理装置31は以下のような情報処理方法を実行する。
図28は、本実施形態に係る情報処理方法のフローチャートである。
まず、ステップS1において、算出部42(図20参照)がtとqの組み合わせを算出する。例えば、算出部42は、式(14)の制約条件を満たすtとqの組み合わせのうちで、式(10)の第1の関数f(t,q)の値が最小となる組み合わせを算出する。これにより、weight行列gとt×tの小bottom行列dの要素をq個のバンクに格納できるtとqの組み合わせのうちで、計算時間が最小の組み合わせを得ることができる。
次に、ステップS2に移り、出力部41(図20参照)が、計算機10(図5参照)で実行可能なプログラム50を出力する。
そのプログラム50には、ステップS1で算出したtとqの組み合わせが使用される。例えば、計算機10でプログラム50を実行すると、選択部52(図21参照)がbottom行列からt×tの小bottom行列dを選択する。
そして、格納部53が、DPE0のバンクR#0~R#7のうちのq個のバンクの各々に、t×tの小bottom行列dとweight行列gを格納する。その後、計算部54が、図23~図25の手順に従って、Winogradアルゴリズムを用いて小bottom行列dとweight行列gとの畳み込み計算を行う。
以上により、本実施形態に係る情報処理方法の基本ステップを終了する。
上記した本実施形態によれば、小bottom行列dとweight行列gを一つのバンクに格納できるという式(14)の制約条件の下で、畳み込み計算の計算時間を表す第1の関数f(t,q)が最小となるtとqの組み合わせを算出部42が算出する。
そのため、レジスタのバンクに小bottom行列dとweight行列gを格納しつつ、これらの行列を用いて高速に畳み込み計算を行うことが可能となる。
<backword処理>
図22の例では、深層学習のフォワード処理における畳み込み計算をWinogradアルゴリズムで行った。
以下では、深層学習のバックワード処理におけるWinogradアルゴリズムについて説明する。backword処理には、top行列とweight行列とを畳み込んでbottom行列を得る処理と、top行列とbottom行列とを畳み込んでweight行列を得る処理がある。
まず、前者のようにtop行列とweight行列との畳み込み計算によりbottom行列を得る処理について説明する。
図29(a)~(c)は、backword処理において、top行列とweight行列との畳み込み計算をWinogradアルゴリズムで行うときの模式図である。
まず、図29(a)に示すように、選択部52(図21参照)が、H行W列のtop行列からt×tの小top行列yを選択する。
次に、次の式(22)に従い、計算部54が、weight行列gと小top行列yとを畳み込むことにより小bottom行列dを求める。
次に、図29(b)に示すように、top行列から小top行列yを切り出す位置を図29(a)の場合よりも2列ずらし、切り出した小top行列yに対して上記と同じ計算を行う。これにより得られた小bottom行列dは、botttom行列において、図29(a)で得た小bottom行列dの隣のブロックを形成する。
このようにtop行列から小top行列yを切り出す位置を列方向と行方向に2個ずつずらすことにより、図29(c)に示すように、各小bottom行列dで形成されるbottom行列を得ることができる。
以上により、backword処理におけるtop行列とweight行列との畳み込み計算を終える。この例では、weight行列gが第1の行列の一例となり、t×tの小top行列yが第2の行列の一例となる。
次に、このようにbackword処理をする場合の格納部53の機能について詳細に説明する。
格納部53は、次の式(23)のように各配列の要素を並べ、各要素をDPE0~DPE7の各バンクR#0~R#7に格納する。
ここで、Nをバッチ数とすると、(Nの個数)=(Nmajorの個数)×(Nminorの個数)、(Coutの個数)=(Coutmajorの個数)×(Coutminorの個数)である。この場合、式(5)と同様に組(Nmajor、Nminor)でバッチ数Nが特定される。なお、このバックワード処理においては、バッチ数Nは、小top行列yを識別する第2の識別子の一例である。
また、出力チャネル番号Coutも組(Coutmajor、Coutminor)で特定される。例えば、Coutmajor=0、Coutminor=0の配列要素はCout=0に対応し、Coutmajor=0、Coutminor=1の配列要素はCout=1に対応する。そして、このバックワード処理においては、出力チャネル番号Coutが、小top行列yを識別する第1の識別子となる。
更に、この例では、図2と同様にバッチ数Nの総数を64、出力チャネル番号Coutの総数を384とする。そして、Nmajorの総数を16、Nminorの総数を4、Coutminorの総数を4とする。
また、配列yにおける要素[H’’][W’’]は、t×tの小top行列yの各要素に対応する。
図30は、格納部53によって各配列y、gが格納されたDPE0~DPE7の各々のレジスタG#0の中身を示す図である。
各配列y、gのうち、配列yについては、格納部53がシーケンシャル方式でDPE0~DPE7の各バンクR#0~R#7に格納する。
このとき、本実施形態では、式(23)のように配列yの最下位にCoutminorを記述し、その上位にNminorを記述したため、Nminorが同一の範囲で各バンクとCoutminorとが一対一に対応する。そのため、Coutminorの総数をq(=4)個とすると、一つのDPEにおけるq個のバンクの各々には、出力チャネル番号(Coutmajor、Coutminor)が相互に異なり、かつバッチ数(Nmajor、Nminor)が同一のq個の小top行列yが格納されることになる。
例えば、DPE0においては、R#0~R#3の4個のバンクの各々に、バッチ数Nが(0、0)であり、かつ出力チャネル番号Coutが(0、0)、(0、1)、(0、2)、(0、3)である4個の小top行列yが格納される。
これにより、図13のようにバンクR#0~R#7ごとにバッチ数Nを変える例とは異なり、同一のバッチ数Nを有するq個の小top行列yの畳み込み計算をq個の計算コアで並列して実行することができる。
一方、weight行列gについては、格納部53が図22の例と同様にマルチキャスト方式によりメインメモリ11から各DPE0~DPE7に転送する。
なお、図15を参照して説明したように、マルチキャスト方式では、入力チャネル番号Cinと出力チャネルCoutの値に規則性がない。よって、この例においても、図23~図25と同様にして計算部54が配列gを整列させる。
次に、このバックワード処理における畳み込み計算の計算時間について検討する。
式(22)のBTyBを一つのDPEで求めるのに要する計算時間は、式(6)におけるCin’をCout’に置き換えることにより、次の式(24)のように書ける。
また、式(22)のGgGTを一つのDPEで求めるのに要する計算時間は、式(7)と同じ理由により、式(25)のように書ける。
更に、式(22)において行列BTyBとGgGTのそれぞれの要素ごとを乗算するときの乗算の回数は、式(8)と同様に次の式(26)で表される。
そして、全てのtop行列とweight行列との畳み込み計算を行うには、式(9)のpをCout’に置き換えた次の式(27)の回数だけ計算を行う必要がある。
一つのDPEで畳み込み計算をするときの計算時間を表す第1の関数f(t,q)は、式(24)~(26)の和に式(27)を乗じることにより以下の式(28)のように表すことができる。
次に、小top行列yとweight行列gの各々の要素数がレジスタに格納可能な個数を超えない条件について検討する。
まず、小top行列yの要素数について説明する。
一つのDPEの一つのバンクにおける小top行列yの要素数Eyは、式(11)のCin’をCout’に置き換えることにより次の式(29)で表すことができる。
一方、一つのDPEの一つのバンクにおけるweight行列gの要素数Ewは、式(12)と同様に次の式(30)で表すことができる。
式(29)と式(30)より、小top行列yとweight行列gとを合わせた要素の総数を表す第2の関数g(t,q)は次の式(31)のように書ける。
よって、一つのバンクに格納できるデータの個数をRとすると、次の式(32)の制約条件が得られる。
以上により、式(32)の制約条件を満たすt,qの組み合わせのうちで、式(28)の第1の関数f(t,q)の値を最小とするようなtとqの組み合わせを見つけることにより、畳み込み計算を高速化できることになる。
そこで、この例のようにtop行列とweight行列とを畳み込んで小bottom行列dを得るバックワード処理をする場合には、算出部42は、式(32)の制約条件を満たすt,qの組み合わせを特定する。そして、特定した組み合わせのうち、式(28)の第1の関数f(t,q)の値を最小とするようなtとqの組み合わせを算出部42が算出し、畳み込み計算を高速化する。
次に、top行列とbottom行列とを畳み込んでweight行列を得るバックワード処理について説明する。
図31~図32は、backword処理において、top行列とbottom行列との畳み込み計算をWinogradアルゴリズムで行うときの模式図である。
まず、図31(a)に示すように、選択部52が、H×Wのtop行列からt’×t’の小top行列yを選択する。
そして、図31(b)に示すように、選択部52が、H’×W’のbottom行列から(t’-2)×(t’-2)の小bottom行列dを選択する。
続いて、図32(a)に示すように、計算部54が、小top行列yから(t’-2)×(t’-2)の行列y’を選択する。そして、計算部54が、次の式(33)に従ってweight行列gの11成分を求める。
次に、図32(b)に示すように、小top行列yから行列y’を選択する位置を図32(a)の場合よりも1列ずらし、選択した行列y’に対して計算部54が上記と同じ計算を行うことにより、weight行列gの12成分を求める。
このように小top行列yから行列y’を切り出す位置を列方向と行方向にずらすことにより、図32(c)に示すように、3×3のweight行列gの各要素を得ることができる。
以上により、backword処理におけるtop行列とbottom行列との畳み込み計算を終える。この例では、(t’-2)×(t’-2)の小bottom行列dが第1の行列の一例となり、t’×t’の小top行列yが第2の行列の一例となる。
次に、このbackword処理をする場合の格納部53の機能について詳細に説明する。
格納部53は、次の式(34)のように各配列の要素を並べ、各要素をDPE0~DPE7の各バンクR#0~R#7に格納する。
この例でも、バッチ数N(=(Nmajor、Nminor))と入力チャネル番号Cin(=(Cinmajor、Cinminor))との組み合わせにより小bottom行列dが特定される。なお、バッチ数N(=(Nmajor、Nminor))は第1の識別子の一例であり、入力チャネル番号Cin(=(Cinmajor、Cinminor))は第2の識別子の一例である。
図33は、格納部53によって各配列y、dが格納されたDPE0~DPE7の各々のレジスタG#0の中身を示す図である。
配列dについては、格納部53がシーケンシャル方式でDPE0~DPE7の各バンクR#0~R#7に格納する。
このとき、本実施形態では、式(34)のように配列dの最下位にNminorを記述し、その上位にCinminorを記述したため、Cinminorが同一の範囲で各バンクとNminorとが一対一に対応する。そのため、Nminorの総数をq(=4)個とすると、一つのDPEにおけるq個のバンクの各々には、バッチ数(Nmajor、Nminor)が相互に異なり、かつ入力チャネル番号(Cinmajor、Cinminor)が同一のq個の小bottom行列dが格納されることになる。
例えば、DPE0においては、R#0~R#3の4個のバンクの各々に、入力チャネル番号Cinが(0、0)であり、かつバッチ数Nが(0、0)、(0、1)、(0、2)、(0、3)である4個の小bottom行列dが格納される。
これにより、図13のようにバンクR#0~R#7ごとにバッチ数Nを変える例とは異なり、同一の入力チャネル番号Cinを有するq個の小bottom行列dの畳み込み計算をq個の計算コアで並列して実行することができる。
また、小top行列yについては、格納部53がマルチキャスト方式によりメインメモリ11から各DPE0~DPE7に転送する。
なお、図30の例とは異なり、この例では式(34)のように配列yの最下位にCoutminorを記述し、その上位にNminorを記述する。また、Coutminorの総数は4個とし、Nminorの総数は4個とする。
これにより、例えばDPE0においては、Nmajor=0かつNminor=0の配列yの要素のうち、Coutminorの値が小さい要素から順にバンクR#0~R#3に格納される。そして、バンクR#4~R#7には、Nmajor=0かつNminor=1の要素が、Coutminorの値が小さい順に格納される。
また、配列yのNmajor=1の要素についても、Coutminorの値が小さい要素から順にバンクR#0~R#3に格納され、バンクR#0~R#3にはNminorの値が一つ繰り上がった要素が格納されていく。
これにより、一つのバンクにはCoutminor値が同一の配列yの要素が格納されるようになるため、バンク内でCoutminor値を揃えるために配列yの各要素を整列させる必要がない。
次に、このバックワード処理における畳み込み計算の計算時間について検討する。
式(33)のGy’GTを一つのDPEで求めるのに要する計算時間は、式(24)におけるtをt’に置き換えることにより、次の式(35)のように書ける。
また、式(33)のBTdBを一つのDPEで求めるのに要する計算時間は、式(25)の3をt’-2に置き換え、tをt’に置き換え、cout’をN’に置き換えることにより、次の式(36)のように書ける。
更に、式(33)において行列Gy’GTと行列BTdBとのそれぞれの要素ごとを乗算するときの乗算の回数は、式(8)と同様に次の式(37)で表される。
そして、全てのtop行列とweight行列との畳み込み計算を行うには、式(27)と同様に次の式(38)の回数だけ計算を行う必要がある。
一つのDPEで畳み込み計算をするときの計算時間を表す第1の関数f(t,q)は、式(35)~(37)の和に式(38)を乗じることにより以下の式(39)のように表すことができる。
次に、小bottom行列dと小top行列yの各々の要素数がレジスタに格納可能な個数を超えない条件について検討する。
まず、小top行列yの要素数について説明する。一つのDPEの一つのバンクにおける小top行列yの要素数Eyは、次の式(40)のように書ける。
式(40)において、t2は、一つの小top行列yの要素数である。また、N’・Cin’/pは、一つのバンクに格納される小top行列yの個数である。
一方、一つのDPEの一つのバンクにおける小bottom行列dの要素数Edは、次の式(41)のように書ける。
式(41)において、(t’-2)2は、一つの小bottom行列dの要素数である。また、N’・Cout’/pは、一つのバンクに格納される小bottom行列dの個数である。
式(29)と式(30)より、小top行列yとweight行列gとを合わせた要素の総数を表す第2の関数g(t,q)は次の式(42)のように書ける。
よって、一つのバンクに格納できるデータの個数をRとすると、次の式(43)の制約条件が得られる。
以上により、式(43)の制約条件を満たすt,qの組み合わせのうちで、式(39)の第1の関数f(t,q)の値を最小とするようなtとqの組み合わせを見つけることにより、畳み込み計算を高速化できることになる。
そこで、この例のようにbottom行列とtop行列とを畳み込んでweight行列を得るバックワード処理をする場合には、算出部42は、式(43)の制約条件を満たすt,qの組み合わせを特定する。そして、特定した組み合わせのうち、式(39)の第1の関数f(t,q)の値を最小とするようなtとqの組み合わせを算出部42が算出し、畳み込み計算を高速化する。
<1×1の畳み込み>
深層学習においては1×1の畳み込みが行われることがある。例えば、ResNet-50やResNet101においては1×1の畳み込みが使用される。そこで、本実施形態における1×1の畳み込みについて説明する。
なお、1×1の畳み込みの対象となる行列は特に限定されないが、以下では小bottom行列dとweight行列gとの畳み込みについて説明する。
行列d、gの1×1の畳み込みを行う場合は、格納部53は、次の式(44)のように各行列の要素を配列に格納し、各要素をDPE0~DPE7の各バンクR#0~R#7に格納する。
式(44)における各配列d、gの要素の並び順は式(5)におけるのと同様である。例えば、配列dにおいては最下位にCinminorが記述され、その上位にNminorが記述される。
図34は、1×1の畳み込みを行う場合に、格納部53によって各配列d、gが格納されたDPE0のレジスタG#0の中身を示す図である。
式(5)の場合には図22のようにシーケンシャル方式によりDPE0~DPE7に配列dを格納したが、この例ではマルチキャスト方式によりDPE0~DPE7に配列dを格納する。
これにより、例えばNmajor=0かつNminor=0の要素は、Cinminor=0,1,2,3の順にバンクR#0,R#1,R#2,R#3に格納されていく。そして、Nmajor=0かつNminor=0の全ての要素が格納されると、次はNmajor=0かつNminor=1の要素がCinminor=0,1,2,3の順にバンクR#4,R#5,R#6,R#7に格納されていく。これにより各バンクR#0~R#7の最初の一つのラインが埋まるため、Nminor=2以降の要素は一つ上のラインに格納される。
なお、Nmajor=1の配列dの要素については、Nmajor=0の要素の畳み込みが終了した後にDPE0に展開される。Nmajorの値が2以上の配列dの要素についても同様である。
また、配列gについても、マルチキャスト方式によりバンクR#0に配列dを格納する。
1×1の畳み込みに適用可能なWinogradアルゴリズムは存在しない。よって、この例では、各バンクR#0~R#7に格納された要素を用いて、計算部54が図3(a)~(c)に示した手順で畳み込みを行う。
<batch normalization>
深層学習においては、batch normalizationを行うことにより性能が向上する場合がある。batch normalizationは、複数の画像の間で画素データの値が大きく異なる場合に、各画像の画素データの平均値を0にし、かつその分散を1にする規格化の手法である。その手法について以下に説明する。
batch normalizationを行う場合は、格納部53は、次の式(45)のように各配列d、yの各要素を並べ、各要素をDPE0~DPE7の各バンクR#0~R#7にマルチキャスト方式で格納する。
batch normalizationは、bottom行列とtop行列のどちらにも適用することができる。以下では、bottom行列の一部である小bottom行列dに対してbatch normalizationを行う場合について説明する。
図35は、batch normalizationのときに格納部53によって小bottom行列dが格納されたDPE0のレジスタG#0の中身を示す図である。
この例では、図34におけるのと同様に、格納部53が、マルチキャスト方式によりバンクR#0に小bottom行列dを格納する。式(45)に示すように、小bottom行列dの最下位にはCinminorが記述される。よって、各バンクR#0~R#7のうちの一つに着目すると、そのバンクにはCinminorの値が同じ要素が格納される。例えば、バンクR#0には、Cinminor=0の要素のみが格納される。
また、式(45)によれば、小bottom行列dにおいてCinminorの上位にNminorが記述される。そのため、各バンクR#0~R#7のうちの一つに着目すると、そのバンクには、バッチ数(Nmajor、Nminor)が異なる要素が格納される。例えば、バンクR#0には、(Nmajor、Nminor)=(0、0)、(0、2)、…(0、14)、(1、0)、(1、2)、…(1、14)、…(3、0)、(3、2)、…(3、14)の要素が格納される。
このように、一つのバンクには、Cinminorが同じでバッチ数(Nmajor、Nminor)が異なる要素が格納される。そのため、計算コアC#0~C#7の各々が、自身に対応する一つのバンクのみを用いて、Cinminorが同じでバッチ数(Nmajor、Nminor)が異なる複数の要素の平均と、これらの要素の分散とを計算することができる。
その計算は、計算部54によって以下のように実行される。
図36(a)、(b)は、batch normalizationのときに計算部54が行う計算について説明するためのDPE0のレジスタG#0の中身を示す図である。
まず、図36(a)に示すように、計算コアC#0が、バンクR#0にある小bottom行列dの各要素の値を加算し、これにより得られた値x0をバンクR#0のラインLsum_1に格納する。他のバンクR#1~R#7においても、計算コアC#1~C#7の各々が、対応するバンクにある小bottom行列dの各要素の値を加算し、これにより得られた値x1~x7をそれぞれバンクR#1~R#7のラインLsum_1に格納する。
ここで、図35に示されるように、バンクR#0にはNminorが偶数の要素のみが格納される。そのため、値x0は、全てのバッチ数(Nmajor、Nminor)にわたる要素の合計ではなく、Nminorが偶数の要素の値のみを合計したものとなる。
そこで、計算部54は、値x0~x7のうちで同一のCinminorに対応するもの同士を加算する。例えば、値x0と値x4は両方ともCinminor=0に対応するため、計算部54は、両者を加算してその結果を値x0に書き込む。これにより得られた値x0は、Cinminor=0の要素を全てのバッチ数(Nmajor、Nminor)にわたって合計した値となる。同様にして、計算部54は次の計算を行う。
x1=x1+x5
x2=x2+x6
x3=x3+x7
次に、計算コアC#0が、バンクR#0に格納した値x0をバッチ数で割ることにより平均値m0を計算し、その平均値m0をバンクR#0のラインLmeanに格納する。バンクR#1~R#3においても、計算コアC#1~C#3の各々が値x1~x3の平均値m1~m3を計算し、これらの値をそれぞれバンクR#1~R#3のラインLmeanに格納する。
以上により、バンクR#0~R#3ごとに小bottom行列dの要素の平均値m0~m3が得られたことになる。
次に、分散を求める計算方法について説明する。
まず、図36(b)に示すように、計算コアC#0が、バンクR#0にある小bottom行列dの各要素の値を二乗し、これにより得られた各値を合計した値y0をバンクR#0のラインLsum_2に格納する。他のバンクR#1~R#7においても、計算コアC#1~C#7の各々が、対応するバンクにある各要素を二乗してそれらを加算し、これにより得られた値y1~y7をそれぞれバンクR#1~R#7のラインLsum_2に格納する。
図36(a)の例と同様に、値y0は、全てのバッチ数(Nmajor、Nminor)にわたる要素の二乗の合計ではなく、Nminorが偶数の要素を二乗した値のみを合計したものとなる。そこで、計算部54は、次の計算を行うことにより、全てのバッチ数(Nmajor、Nminor)にわたる小bottom行列dの要素の二乗の合計を値y0~y3の各々に書き込む。
y0=y0+y4
y1=y1+y5
y2=y2+y6
y3=y3+y7
次に、計算コアC#0が、バンクR#0に格納した値y0をバッチ数で割ることにより平均値a0を計算し、その平均値a0をバンクR#0のラインLmean_2に格納する。バンクR#1~R#3においても、計算コアC#1~C#3の各々が値y1~y3の平均値a1~a3を計算し、これらの値をそれぞれバンクR#1~R#3のラインLmean_2に格納する。
以上により、バンクR#0~R#3ごとに小bottom行列dの要素の二乗の平均値a0~a3が得られたことになる。
次に、計算部54は、v0=a0-m0
2を計算することにより、バンクR#0にある小bottom行列dの各要素の分散v0を算出し、それをバンクR#0のラインLvarに格納する。これと同様に、計算部54が以下の計算を行うことによりバンクR#1~R#3の各要素の分散v1~v3を算出し、それをバンクR#1~R#3のラインLvarに格納する。
v1=a1-m1
2
v2=a2-m2
2
v3=a3-m3
2
この後は、計算部54は、以下の式(46)のように小bottom行列dの各要素の値(d[Nmajor][Cinmajor][H][W][Nminor][i])と平均値miとの差を分散viで割ることにより、Cinminor=i (i=0,1,2,3)の要素に対してbatch normalizationを行う。
以上によりbatch normalizationを終える。
このようにbatch normalizationを行うことで、深層学習における学習性能の向上が期待できる。
以上説明した各実施形態に関し、更に以下の付記を開示する。
(付記1) 複数の第1の行列とt行t列の複数の第2の行列の各々の要素の総数が、レジスタが備える複数の記憶領域のうちのq個の各々に格納できるデータの個数を超えないtとqの組み合わせのうちで、q個の前記記憶領域の各々に対応したq個の計算コアの各々が複数の前記第1の行列と複数の前記第2の行列との畳み込み計算をWinogradアルゴリズムで並列して実行するときの計算時間が最小となる組み合わせを算出する算出部と、
算出したtとqの組み合わせを用いてq個の前記記憶領域の各々に複数の前記第1の行列とt行t列の複数の前記第2の行列とを格納する処理と、q個の前記計算コアの各々がWinogradアルゴリズムを用いて前記第1の行列と前記第2の行列との畳み込み計算を行う処理とを、前記計算コアと前記レジスタとを備えた計算機に実行させるためのプログラムを出力する出力部と、
を有することを特徴とする情報処理装置。
(付記2) 前記第1の行列と前記第2の行列の各々は、深層学習の畳み込み層における行列であることを特徴とする付記1に記載の情報処理装置。
(付記3) 前記計算時間を第1の関数f(t,q)で表し、かつ一つの前記記憶領域に格納される複数の前記第1の行列と複数の前記第2の行列の各々の前記要素の前記総数を第2の関数g(t,q)で表したときに、前記算出部は、一つの前記記憶領域に格納可能なデータの個数を前記第2の関数g(t,q)の値が超えない範囲内で前記第1の関数f(t,q)の値が最小となるqとtとの組み合わせを算出することを特徴とする付記1に記載の情報処理装置。
(付記4) 前記第1の行列と前記第2の行列の各々は、深層学習の畳み込み層における行列であり、
前記深層学習のバックワード処理における前記第1の関数f(t,q)及び前記第2の関数g(t,q)は、前記深層学習のフォワード処理における前記第1の関数f(t,q)及び前記第2の関数g(t,q)とそれぞれ異なることを特徴とする付記3に記載の情報処理装置。
(付記5) 複数の前記第2の行列の各々は、第1の識別子と第2の識別子との組み合わせにより特定され、
前記プログラムは、
前記第1の識別子が相互に異なり、かつ前記第2の識別子が同一のq個の前記第2の行列の各々を、q個の前記記憶領域の各々に格納する処理を前記計算機に実行させることを特徴とする付記1に記載の情報処理装置。
(付記6) 前記プログラムは、
前記第1の識別子が相互に等しい前記第1の行列と前記第2の行列とを同一の前記記憶領域に格納し、
同一の前記記憶領域に格納された前記第1の行列と前記第2の行列との間で前記畳み込み計算を実行する処理を前記計算機に実行させることを特徴とする付記5に記載の情報処理装置。
(付記7) 前記プログラムは、
複数の前記記憶領域ごとに前記要素の値の平均値と分散とを計算し、
複数の前記記憶領域ごとに、前記要素の値と前記平均値との差を前記分散で割ることにより、前記要素の値を規格化する処理を前記計算機に実行させることを特徴とする付記1に記載の情報処理装置。
(付記8) 複数の第1の行列とt行t列の複数の第2の行列の各々の要素の総数が、レジスタが備える複数の記憶領域のうちのq個の各々に格納できるデータの個数を超えないtとqの組み合わせのうちで、q個の前記記憶領域の各々に対応したq個の計算コアの各々が複数の前記第1の行列と複数の前記第2の行列との畳み込み計算をWinogradアルゴリズムで並列して実行するときの計算時間が最小となる組み合わせを算出する処理と、
算出したtとqの組み合わせを用いてq個の前記記憶領域の各々に複数の前記第1の行列とt行t列の複数の前記第2の行列とを格納する処理と、q個の前記計算コアの各々がWinogradアルゴリズムを用いて前記第1の行列と前記第2の行列との畳み込み計算を行う処理とを、前記計算コアと前記レジスタとを備えた計算機に実行させるためのプログラムを出力する処理と、
をコンピュータに実行させるための情報処理プログラム。
(付記9) 複数の第1の行列とt行t列の複数の第2の行列の各々の要素の総数が、レジスタが備える複数の記憶領域のうちのq個の各々に格納できるデータの個数を超えないtとqの組み合わせのうちで、q個の前記記憶領域の各々に対応したq個の計算コアの各々が複数の前記第1の行列と複数の前記第2の行列との畳み込み計算をWinogradアルゴリズムで並列して実行するときの計算時間が最小となる組み合わせを算出する処理と、
算出したtとqの組み合わせを用いてq個の前記記憶領域の各々に複数の前記第1の行列とt行t列の複数の前記第2の行列とを格納する処理と、q個の前記計算コアの各々がWinogradアルゴリズムを用いて前記第1の行列と前記第2の行列との畳み込み計算を行う処理とを、前記計算コアと前記レジスタとを備えた計算機に実行させるためのプログラムを出力する処理と、
をコンピュータが実行することを特徴とする情報処理方法。