日本ソフトウェア科学会第 34 回大会 (2017 年度) 講演論文集

ワークスペース自動割当による畳み込みニューラルネッ
トワークの高速化
関山 太朗

今井 晴基

畳み込みニューラルネットワーク (CNN) は中間データを保存するためのメモリ (ワークスペース) を割り当てることで高速化されることが知られている．本稿ではニューラルネットワーク (NN) を動的に構築・操作できる深層学習
フレームワークにおけるワークスペース管理手法を提案，CNN を自動的に高速化する．NN の動的構築により NNが最低限必要とするメモリ量を推定することが難しくなり，その結果ワークスペースに割けるメモリ量の推測が困難になる．我々は NN が必要とするメモリを空きメモリからだけではなくワークスペースからも割り当てることでワークスペース割当を自動化しつつ NN の構築を妨げない範囲で CNN を高速化する．我々は提案手法を Chainerに実装し，ワークスペースの自動割当により VGGNet などの主要な CNN における伝搬処理が最大 1.60 倍高速化されたことを確認した．

Convolutional neural networks (CNNs) are accelerated by using memory (called workspace) in which intermediate data of convolution are stored. This article proposes a workspace management technique foraccelerating CNNs automatically in deep learning frameworks that support dynamic construction of neuralnetworks (NNs). Support for dynamic NN construction makes it diﬃcult to estimate the amount of thememory needed by a NN, and, as a result, how much memory we can use as workspace becomes unclear.
Our approach allocates memory needed by NN construction from not only free available memory but also
workspace, which enables ones to both construct NNs dynamically and allocate workspace automatically.
We implemented our workspace management method in Chainer and confirmed that major CNNs such as
VGGNet are accelerated 1.60 times.

習の研究開発を促進する多くの機能をサポートして

1 はじめにいる．

深層 学 習 は 人 工 ニュー ラ ル ネット ワ ー ク を 用 い

特に最近の TensorFlow, Torch, Chainer, CNTK

た機械学習技術で，Alex らが物体画像認識コンペ

といった主要なフレームワークではニューラルネット

ティション ImageNet Large-Scale Visual Recogni-

ワークの構成要素はプログラミング言語の第一級オ

tion Challenge (ILSVRC) 2012 で優勝 [9] して以来，ブジェクトとして扱われ，実行中にニューラルネット

画像認識，音声認識，自然言語処理といった様々なワークを構築・操作することが可能となる．これに分野で急速に研究が進められており，その発展にとより再帰型ニューラルネットワーク [7] のような対象もない多くの深層学習フレームワークが開発されてデータによって構造が変わるようなネットワークや，いる [8] [1] [14] [2] [3] [5]．これらのフレームワークは

GoogLeNet [13] や ResNet [6] といった巨大なニューニューラルネットワークの構築を簡単にし，微分計

ラルネットワークを簡単に構築・変更することが可能

算の自動化，GPU による自動並列化といった深層学となる．このような柔軟なニューラルネットワークの∗ Accelerating convolutional neural networks by au-

tomatic workspace allocation
This is an unrefereed paper. Copyrights belong to
the Authors.
Taro Sekiyama, Haruki Imai, IBM 東 京 基 礎 研 究 所,
IBM Research – Tokyo.

操作はユーザーにとって便利である一方，フレームワークがニューラルネットワークを解析・高速化することを難しくする一因になる．
本稿では動的ニューラルネットワーク操作をサポートする深層学習フレームワークのための，畳み込みニューラルネットワークの高速化に向けたメモリ管
理技法を提案する．畳み込みニューラルネットワー
ク [10] は画像認識の畳み込み計算を取り入れたニュー
ラルネットワークで，画像認識分野の他，近年では自然言語処理でも応用されつつある [11]．これまでに複数の畳み込みアルゴリズムが開発されており [4]，その中には中間データを保存するため余剰のメモリを必要とするものもある．そのような高速化のために使われるメモリはワークスペースと呼ばれ，特に GPUのような利用可能なメモリが比較的小さいデバイス上
ではワークスペースをどのように割り当てるかが重

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

class MLP ( chainer . Chain ):def __init__ ( self , n_units , n_out ):super ( MLP , self ). __init__ ()with self . init_scope ():self . l1 = L . Linear ( None , n_units )self . l2 = L . Linear ( None , n_units )self . l3 = L . Linear ( None , n_out )def __call__ ( self , x ):h1 = F . relu ( self . l1 ( x ))h2 = F . relu ( self . l2 ( h1 ))return self . l3 ( h2 )model = MLP (1000 , 10)

要となるが，静的にニューラルネットワークを構築するフレームワークに比べ，動的ニューラルネットワー

ソースコード 1

3 層の全結合をもつニューラルネット

ク操作をサポートするフレームワークではワークス

ワーク

ペースの自動割当はより難しくなる．
本稿で提案する手法は，ニューラルネットワークのself.l1

self.l2

self.l3

構築・変更にともなって必要になるメモリを空きメモ
リからだけではなくワークスペースからも割り当てる
ことで，ニューラルネットワークの構築・変更を妨げな

n_in-1n_in

n_units-1

n_units-1

n_unitsn_units

1…

れたことを POWER8, NVIDIA Tesla P100 上で確

2

… … …

畳み込みニューラルネットワークの伝搬処理がそれぞれ最大 1.53 倍，1.09 倍，1.60 倍，1.18 倍高速化さ

2

… … …

VGGNet (モデル D) [12]，ResNet-50 [6] の 4 つの2…

を Chainer に実装し，AlexNet [9]，GoogLeNet [13]，11い範囲で畳み込み計算を最大限高速化するようなワー
クスペースの自動的割当を実現する．我々はこの手法

1

n_out

認した．
本稿の以降の構成は次のようになっている．第 2 節
では Chainer を例に動的ニューラルネットワーク構
築とそれが何故ワークスペースの割当を難しくする

図1

ソースコード 1 が構築するニューラルネットワークのかについて述べる．その後第 3 節で提案手法，第 4節で提案手法の実装，第 5 節で実験結果について述
べ，最後に第 6 節で本論をまとめる．

2. 1 動的ニューラルネットワーク構築
Chainer は Python 上のライブラリとして提供されており，ユーザーが定義するニューラルネットワーク

2 動的ニューラルネットワーク構築のワーク
スペース割当問題
本節では Chainer を例にニューラルネットワーク

も Python 上のオブジェクトとして表現される． ソー
スコード 1 は Chainer を使ってニューラルネットワー
クを構成する Python プログラムの例である．†1 クラの動的構築とそれによってワークスペースの割当が難しくなる理由について説明する．

†1 https://github.com/chainer/chainer/blob/master/
examples/mnist/train mnist.py 2017 年 7 月 14 日
アクセス可能であることを確認．

る．†2 ただし val model は train model とパラメー
def run ( epoch , train_data , val_data ):train_model = MLP (1000 , 10)val_model = copy_from ( train_model )for _ in range ( epoch ):train_one_epoch ( train_model ,train_data )validate ( val_model , val_data )

1
2
3
4
5
6
7
8

タを共有するため関数 copy from によって生成されたものとする．train model，val model を生成すると，関数 run は epoch 回だけ学習と検証を繰り返す．
このとき Caﬀe のようにニューラルネットワークの構築中にワークスペースを割り当てることを考える．

Chainer ではニューラルネットワークは順伝搬中に構ソースコード 2

築されるので最初の train one epoch を呼び出す際

MLP の学習と検証にワークスペースも割り当てられる．最初の学習が終ス MLP は図 1 のような，2 つの隠れ層をもち，各層了すると次は関数 validate によって学習結果の検証が全結合されるニューラルネットワークを表わしておが行われる．検証用のニューラルネットワークもこのり，図中の n in，n units，n out はそれぞれ入力層

とき構築され，ソースコード 1 の h1 や h2 といったのベクトルサイズ，隠れ層のニューロン数，出力層の中間結果を表わすデータにメモリが割り当てられる．

ベクトルサイズである．ソースコード 1 では n units

このとき，もし学習用ニューラルネットワークとワー= 1000，n out = 10 としてニューラルネットワーク

クスペースがメモリのほとんどを占有し，検証用のを構築している．入力層のサイズ n in は実際に順伝

ニューラルネットワークを構築するのに十分なメモ

搬処理を行った際に入力データから決定される．MLP

リがない場合，h1 や h2 へのメモリ割当に失敗し実

オブジェクトを生成する際には，まずが呼行時エラーが起こってしまう．そのため，動的ニュー

び出されネットワークの各層を全結合する L.Linear

ラルネットワーク構築が可能なフレームワークでは，

オブジェクトが生成される．実際のネットワークの構

ニューラルネットワークの構築中にワークスペースを

築はメソッドcallinitで行われる．このメソッドは割り当てることは不適切である．

入力層に相当するベクトル x を受け取ると，各層をChainer を含めたいくつかのフレームワークでは

全結合し，出力層への結合結果をネットワーク全体のユーザーがワークスペースのサイズを指定すること

出力として返す．このとき隠れ層のパラメータや隠れができ，適切なワークスペースサイズを指定すること

層・出力層の出力 (h1, h2, self.l3(h2)) に対して

で上記の問題を解決することができる．しかしこのメモリが割り当てられる．隠れ層の出力はランプ関数

方法には，ユーザーはニューラルネットワークの構築

F.relu によって活性化される．

を妨げず，かつ畳み込み計算を十分に高速化させることのできる適当なワークスペースサイズを事前に知っ2. 2 ワークスペース割当問題ていなければならないという問題がある．

Caﬀe [8] のような，ニューラルネットワークを静的に構築するフレームワークの場合，ワークスペース

3 提案手法: ワークスペース管理技法

は畳み込みニューラルネットワークの構築中に割り当

本稿では動的ニューラルネットワーク構築をサポーてられることが多い．しかしその方法は動的なニュートするフレームワークのためのワークスペース管理技

ラルネットワーク構築をサポートするフレームワーク

法を提案する．我々の提案手法は次の 3 つのステッには不向きである．

プから構成される．

それを示す例として，ソースコード 2 の MLP モデル

1. ニューラルネットワークの構築時ではなく，伝の学習と検証を行うプログラムについて考えてみる．
このプログラムでは学習用・検証用の二つのニューラ
ルネットワーク train model・val model を使ってい†2 Chainer では学習と検証に同じオブジェクトを使うことができるが，ここではわかりやすさのためそれぞれのネットワークを異なるオブジェクトとして与えている．
．

1 回目の伝搬処理終了
直後のメモリ使用状況
Algo1: 100MB
Algo2: 10MB
Algo3: 1MB
Algo4: 0MB

学習伝搬（1 回目）> 100 MB

ワーク
スペース
割当

検証中・3 回目の伝搬処理後のメモリ使用状況

4 回目の伝搬処理開始
直前のメモリ使用状況< 100 MB

10 MB

学習伝搬
（2 回目）

畳み込み層の処理

検証

学習伝搬（3 回目）

ワーク
スペース
割当

学習
伝搬

…

メモリ使用用途の凡例

学習用ニューラル
ネットワークが使用

検証用ニューラル
ネットワークが使用

ワークスペースが使用

未使用

100 MB
2 回目の伝搬処理開始
直前のメモリ使用状況

図2

提案手法を実装したフレームワーク上での学習と検証．

搬計算時に各アルゴリズムが必要とするメモリ

り当てる．ここでは 100 MB 以上の未使用メモリが量を計算する．

あるため，最も多くのワークスペースを必要とする

2. 伝搬処理が終わったときワークスペースが未割

Algo1 が利用できるように 100 MB のメモリをワー

当であれば，アルゴリズムが必要とするメモリの

クスペースとして割り当てる．そして 2 回目の伝搬

うち，可能な限り大きなものに一致するようワー

計算では割り当てられたワークスペースを使って畳

クスペースを割り当てる．

み込み処理を行う．2 回目の伝搬計算終了時には既に

3. ニューラルネットワークの計算中に必要になる

ワークスペースが割り当てられているため，再度ワー

メモリ (例えば MLP の h1 や h2 に割り当てられ

クスペースを割り当てる必要はない．次に学習結果のるメモリ) はまず空きメモリから割り当て，もし検証を行うが，ここで検証用のニューラルネットワー

十分な空きメモリがない場合にはワークスペー

クを構築するためには未使用メモリだけでは不十分

スから割り当てる．このときワークスペースは一だとする．その場合，必要に応じてワークスペースを旦解放する．

解放することで検証用ニューラルネットワークの構築

図 2 は提案手法によるワークスペースの自動割当と検証を可能にする．検証のためにワークスペースをの例である．この図は提案手法を実装したフレーム解放したため検証終了後にはワークスペースが割りワークでの，畳み込みニューラルネットワークを用い当てられていない状態になり，3 回目の伝搬計算ではて 2 回学習のための伝搬計算を行った後に検証を行

ワークスペースを用いずに畳み込み計算を行う．3 回

い，その後再度学習を行った際のメモリ使用状況の推目の伝搬計算終了後には再度未使用メモリからワーク移を表わしている．提案手法はまず最初の伝搬計算

スペースを割り当てる．このとき未使用メモリは 100

時に畳み込み層で各畳み込みアルゴリズムが使用すMB より小さいため，2 番目に大きなワークスペース

るワークスペースのサイズを求める．ここでは 4 つである 10 MB を割り当てることで 2 番目に速いであの畳み込みアルゴリズムが利用可能だとする．このろう Algo2 を使うことが可能となる．このようにし時点ではまだワークスペースは割り当てられておらて提案手法はワークスペースとしてできるだけ大きず，畳み込み計算にはワークスペースを用いないアル

なメモリを確保し畳み込み計算を高速化しつつ，柔軟

ゴリズム Algo4 を使用する．その後 1 回目の伝搬計

なニューラルネットワークの構築・操作を実現する．

算が終わると未使用メモリからワークスペースを割

# P: Dict [ int , List [ GPU memory ]]def alloc ( self , size ):if len ( P [ size ]) > 0:
mem = P [ size ]. pop ()else :
mem = cudaMalloc ( size )return Memory ( mem )ソースコード 3

1
2
3
4
5
6
7

cupy のメモリ割当# P: Dict [ int , List [ GPU memory ]]# WS : GPU memory
def alloc ( self , size ):if len ( P [ size ]) > 0:
mem = P [ size ]. pop ()else :try :mem = cudaMalloc ( size )except CUDARuntimeError :cudaFree ( WS )WS = Nonemem = cudaMalloc ( size )return Memory ( mem )

1
2
3
4
5
6
7
8
9
10
11
12
13

4 実装
我々は提案手法を Chainer における CUDA GPU
上のメモリ管理技法として実装し，主に (1) GPU メ

ソースコード 4

ワークスペース導入後の cupy のメモリ
割当

モリの割当処理，(2) 畳み込み計算の前処理，(3) 伝搬計算の後処理に変更を加えた．以降ではこれらの変
更の詳細について述べる．

• 指定したサイズのワークスペース WS の割当を明示的に行う関数 alloc WS を追加．この関数により割り当てられたワークスペースはメモリプー

4. 1 GPU メモリの割当処理への変更

ルによって管理されない．

Chainer での GPU メモリの割当を始めとしたGPU 操作は cupy†3 という GPU 用の数値演算ライ• メモリ割当処理をソースコード 4 のように変更．

ブラリを通して行われる．cupy でのメモリ割当処理とき，まずは通常通りメモリプールに要求に適を簡易化したものをソースコード 3 に示す．cupy でうメモリがないかを確認し，なければ新たにシは GPU メモリをメモリプール P で管理しており，メステムに対しメモリ割当命令を発行する．このモリプールはメモリサイズからそのサイズの GPU メ

ときシステムへのメモリ割当命令が失敗，すな

モリのリストへのマップとして実装されている．GPU

わち十分な空きメモリがなければ (これは例外

メモリの割当要求が起こるとまずメモリプール P に

CUDARuntimeError として通知される)，ワー

要求されたメモリサイズ size のメモリがないかを調

クスペースに割り当てられたメモリを解放してかべ，あればそれを返しプールからは削除する．もし目ら再度システムへのメモリ割当命令を発行する．

的のサイズのメモリがプールされていなければ，新たワークスペースの解放後，ワークスペースにメモにシステムに対しメモリ割当命令 cudaMalloc(size)

リが割り当てられていないことを示すため Noneを発行し，その結果を返す．割り当てられた GPU メを代入する．この変更によってワークスペースを

モリは Python の Memory オブジェクトとして振る舞

割り当てつつ，ニューラルネットワークの構築を

い，参照されなくなると Python のガベージコレク

妨げないメモリ管理が可能になる．

cupy へ一般の GPU メモリ割当要求が起こった

ションによって回収される．cupy はその回収作業をフックすることで，参照されなくなった GPU メモリ

4. 2 畳み込み計算の前処理への変更

をプールに追加する．

次に畳み込み計算の変更部分について説明する．こ

我々は cupy の GPU メモリ管理を次のように変更した．

こでは順伝搬方向の畳み込み計算についてだけ述べるが，逆伝搬についても同様の変更を行う．変更前の畳み込みの順伝搬はソースコード 5 のように，畳み†3 https://github.com/cupy/cupy

込み処理を行うたびに指定されたサイズのワークス

def conv_forward ( inputs , WS_size ):WS = cupy . alloc ( WS_size )# WSとinputsから畳み込みアルゴリズム# を選択し，畳み込み計算を実行...
ソースコード 5

1
2
3
4
5
6

ワークスペース自動割当実装前の畳み込
み処理

def conv_forward ( inputs ):WS = cupy . WS
if WS is None :register_WS_size ( inputs )# WSとinputsから畳み込みアルゴリズム# を選択し，畳み込み計算を実行
...

1
2
3
4
5
6
7
8
9

# WS_size_list : register_WS_size で# 登録されたサイズの降順リスト
def train_one_epoch ( model , train_data ):optimizer = model . optimizer ()for data in split_batch ( train_data ):loss = model ( data )loss . backward ()optimizer . update ()for size in WS_size_list :if cupy . WS is not None or
free_GPU_memory_size < size :breakcupy . alloc_WS ( size )
ソースコード 7

1
2
3
4
5
6
7
8
9
10
11
12
13

学習関数でのワークスペース割当

タを全て一度だけ使って学習を行う関数で，9 行目から 13 行目以外は通常通り学習用データをバッチと呼ばれる単位に分割し各バッチごとにパラメータを更新する．9 行目から 13 行目ではワークスペースの割

ソースコード 6

ワークスペース自動割当実装後の畳み込み処理

当を行っている．WS size list は register WS size
によって追加されたワークスペースサイズが降順に並べられたリストで，大きなワークスペースサイズ

ペースを割り当てるのに対し，†4 変更後はソースコー

から順に割当可能であるか調べる．10 行目の条件式

ド 6 のように既に割り当てられているワークスペー

cupy.WS is not None はワークスペースが既に割りスを使用する．ただし，特に初回の伝搬計算のよう当てられているかを確認しており，既に割り当てられに，ワークスペースがまだ割り当てられていない場合ていれば新たなワークスペースの割当は行わない．こは，入力 inputs に対して各畳み込みアルゴリズムをれはワークスペース割当に利用できる空きメモリは最実行するのに必要なメモリを計算し，それを保存す

初の伝搬処理直後が最も多く，それ以降は (一度割りる (register WS size(inputs))．このとき計算され当てられたメモリはプールされるため) 減っていくた

たワークスペースサイズに従って，伝搬処理終了後にめ，ワークスペースが既に割り当てられている場合，

ワークスペースの割当を行う．

それが畳み込み処理の高速化に利用できる最大のワー
クスペースとなるからである．ただしこれは通常の畳

4. 3 伝搬計算の後処理への変更

み込みニューラルネットワークのように，全ての畳み伝搬計算の終了時にはワークスペースを割り当てる．

込み計算が初回の伝搬計算で必ず起こる場合にのみ

これは Chainer の訓練用関数を変更することで実現す最適なワークスペースを割り当てる．もし初回の伝搬

る．ソースコード 7 の train one epoch は Chainer

計算で実行されない畳み込み計算があった場合には，の訓練用関数を簡易化したもので，ソースコード 2

その伝搬計算に使用されるワークスペースサイズがのように使用される．train one epoch は学習用デー

登録されず，最適なワークスペースが割り当てられない可能性がある．11 行目では割り当てようとしてい†4 cupy は割り当てられた GPU メモリをプールしているため cupy.alloc によるワークスペースメモリ割当
によって実際にシステムへメモリ割当命令が発行されるのは最初の順伝搬計算時だけである．

るワークスペースのサイズが未使用の GPU メモリ
量 free GPU memory size 以下であることを確認しており，もしそうなら実際にそのサイズのメモリをワークスペースとして割り当てる．これにより最も大きくである限りその結果は変わらない．そのため我々はかつ割当可能なサイズのワークスペースが割り当て

cudnnFindConvolution をワークスペースが割り当てられることになる．

られてから初めての伝搬処理時にのみ呼び出すこと
で，畳み込みアルゴリズムの選択にかかる負担を軽減

5 実験

させた．

我々は提案手法を Chainer に実装し，更に提案手法をより効果的にするために畳み込みアルゴリズム

5. 2 実験内容の選択処理にも変更を加えた．まず第 5. 1 節でその提案手法により畳み込みニューラルネットワークの変更について述べた後，第 5. 2 節で実験内容を，そ伝搬処理が高速化されることを確認するため，本稿ではして第 5. 3 節で実験結果を示す．

4 つの畳み込みニューラルネットワーク AlexNet [9]，GoogLeNet [13]，VGGNet (モデル D) [12]，ResNet-

5. 1 畳み込みアルゴリズム選択への変更
多くの深層学習フレームワークがそうであるよう

50 [6] の学習における伝搬処理速度を比較した．実験は比較対象である Chainer 3.0.0b1 (PFN Chainer)†6に，Chainer も CUDA GPU 上での畳み込みのためと，Chainer 3.0.0b1 に提案手法と前節の変更を適用に NVIDIA が提供する cuDNN ライブラリ [4] を利した TRL Chainer を用いて行う．PFN Chainer で用している．cuDNN は深層学習の伝搬処理を高速

はワークスペースはソースコード 5 のように割り当に行うための CUDA ライブラリで，畳み込み計算

てられ，そのサイズはユーザーが設定することがでの他に再帰型ニューラルネットワークの伝搬計算やきるが自動調整はされない．デフォルトのワークス活性化関数の CUDA 実装を提供している．cuDNN

ペースサイズは 8 MB であり，本稿の実験でもこのはいくつかの畳み込みアルゴリズムを実装しており，値を用いた．実験に用いる画像として ImageNet [9]Chainer はその中から適切なアルゴリズムを選ぶた
めに cudnnGetConvolution 関数群 †5 を利用していから無作為に選んだカテゴリの画像 (総数 1299) をる．cudnnGetConvolution はヒューリスティックに畳2 (RAM 256 GB)，NVIDIA Tesla P100 (RAM 16

み込みアルゴリズムを決定するため高速であるが，選GB; NVLink 1.0) 上で，CUDA 8.0，cuDNN 6.0.20

択されたアルゴリズムが必ずしも最速なものとは限を用いて行った．

使用した．実験は POWER8 2.86 GHz 10 コア ×

らないという問題がある．cuDNN バージョン 3.0 からは cudnnFindConvolution という関数群が提供さ

5. 3 実験結果れており，これは実際に各畳み込み処理にかかった時

実験結果を図 3 に示す．これらのグラフではワーク間を測定することで最速の (あるいはそれに近い) ア

スペース自動割当を有効にした TRL Chainer (TRL

ルゴリズムを選ぶことのできる畳み込みアルゴリズ

Chainer w/ auto-tune)，ワークスペース自動割当

ム選択関数である．ただし，選択中に各畳み込みアルを無効にした (すなわち畳み込みアルゴリズム選択

ゴリズムを実行するため，選択にかかる時間自体はの変更部分だけを有効にした) TRL Chainer (TRL

cudnnGetConvolution よりも大きくなってしまう．

Chainer w/o auto-tune)，そして PFN Chainer の

我々は 畳 み 込 み ア ル ゴ リ ズ ム の 選 択 に

画像処理速度がそれぞれ示されている．“BS” はバッ

cudnnFindConvolution を 使 う よ う に 変 更 し た ．

チサイズを表わしており，例えば “32 BS” は 1 バッ

Chainer では cudnnGetConvolution を伝搬処理を

チの画像数が 32 であることを意味している．バッチ行う毎に呼び出していたが，実際にはワークスペー

サイズが大きくなるほど処理速度も向上しており，こス (と畳み込み層への入力ベクトルのサイズ) が同じ

れは伝搬計算が CUDA によって並列に行われるため†5 順伝搬，逆伝搬用にそれぞれ実装されている．

†6 https://github.com/chainer/chainer/tree/v3.0.0b1

AlexNet
1400

450

1,044

1000

854 854813 814719 720

800

389

400
処理画像数 / 秒

処理画像数 / 秒

1200

GoogLeNet
1,310

1,230

600
400
200

350

317 314

300

300

250
200
150
100
0

32 BS

64 BS

128 BS

32 BS

64 BS

VGGNet180

ResNet-50

155

151

250

140
120

94

100

94

128 BS

300

96

97

111

97

処理画像数 / 秒

処理画像数 / 秒

384 383

50

0

160

418
362 362

97

80
60
40

226

237
209

200

244
219

190

205

223 222

150
100
50

20
0

0
32 BS

64 BS

TRL Chainer w/ auto-tune

図3

128 BS

32 BS

TRL Chainer w/o auto-tune

64 BS

128 BSPFN Chainer

100 バッチ目から 200 バッチ目までの TRL Chainer と PFN Chainer の画像処理速度．

である．

1.06 倍しか高速化されなかった．これは GoogLeNet

この結果から，全てのケースで提案手法を適用したの畳み込み層が他のニューラルネットワークの畳み込

TRL Chainer が PFN Chainer よりも高速に動作す

み層に比べて小さく，畳み込み処理を高速に行うためることが確認された．提案手法が最も効果的だったに必要なワークスペースも小さくすみ，デフォルトののは VGGNet で，特に 64 バッチサイズのケースで
PFN Chainer に比べて最大の †7 1.60 倍の高速化がワークペースサイズで十分高速に畳み込み処理が行達成された．ただしバッチサイズが 128 の場合はバッのため AlexNet，VGGNet に比べて提案手法の恩恵

チサイズ 32，64 のケースよりも効果が小さくなってが大きくなかったと思われる．

えたためだと考えられる．ResNet-50 も同様の理由いる．これはバッチサイズが大きくなったことで畳みさらに，全てのケースで TRL Chainer w/ auto-

込み計算以外で必要とされるメモリ量が大きくなっtune が TRL Chainer w/o auto-tune よりも高速にてしまい，その結果ワークスペースに使用できるメ動作した．このことから，畳み込みアルゴリズム選択

モリが少なくなり，バッチサイズ 32，64 のときに使方法の変更だけではなくワークスペースの自動割当用できた最も高速な畳み込みアルゴリズムが使用でが高速化に貢献していることが確認できた．

きなくなってしまったためだと考えられる．また，提案手法の効果が最も小さかったのは GoogLeNet で，

6 おわりに

特にバッチサイズ 32 の場合，PFN Chainer に対しChainer は非常に柔軟な深層学習フレームワーク
であるが，学習や検証プロセスをまとめたライブラリ†7 図 3 の数字からは VGGNet 32 BS のケースが最も高速化されているように見えるが，丸め込み前の値を使うと VGGNet 64 BS が最も高速化されていることがわかる．

関数を提供し，それをユーザーに使ってもらうことでニューラルネットワークの学習・検証をある程度制御

することができる．我々は GPU 上のワークスペース
管理技法を Chainer が提供する学習・検証機能と組み合わせることで，ユーザーコードに手を加えることなく畳み込み処理が高速化できることを確認した．今後の方向性としては TensorFlow などの他のフレームワークでの提案手法の実装や，特にヘテロな分散環
境への提案手法ないしはその他の高速化技法の導入が考えられる．

参 考 文 献[ 1 ] Abadi, M., Agarwal, A., Barham, P., Brevdo,
E., Chen, Z., Citro, C., Corrado, G. S., Davis, A.,
Dean, J., Devin, M., Ghemawat, S., Goodfellow,
I., Harp, A., Irving, G., Isard, M., Jia, Y., Jozefowicz, R., Kaiser, L., Kudlur, M., Levenberg, J.,
Mané, D., Monga, R., Moore, S., Murray, D., Olah,C., Schuster, M., Shlens, J., Steiner, B., Sutskever,I., Talwar, K., Tucker, P., Vanhoucke, V., Vasudevan, V., Viégas, F., Vinyals, O., Warden, P., Wattenberg, M., Wicke, M., Yu, Y., and Zheng, X.:
TensorFlow: Large-Scale Machine Learning on Heterogeneous Systems, 2015. Software available fromtensorflow.org.
[ 2 ] Agarwal, A., Akchurin, E., Basoglu, C., Chen,
G., Cyphers, S., Droppo, J., Eversole, A., Guenter,
B., Hillebrand, M., Hoens, T. R., Huang, X., Huang,Z., Ivanov, V., Kamenev, A., Kranen, P., Kuchaiev,
O., Manousek, W., May, A., Mitra, B., Nano, O.,
Navarro, G., Orlov, A., Parthasarathi, H., Peng, B.,
Radmilac, M., Reznichenko, A., Seide, F., Seltzer,
M. L., Slaney, M., Stolcke, A., Wang, H., Wang, Y.,
Yao, K., Yu, D., and andGeoﬀrey Zweig, Y. Z.: An
Introduction to Computational Networks and theComputational Network Toolkit, Technical Report
MSR-TR-2014-112, 2014.
[ 3 ] Chen, T., Li, M., Li, Y., Lin, M., Wang, N.,
Wang, M., Xiao, T., Xu, B., Zhang, C., and Zhang,Z.: MXNet: A flexible and eﬃcient machine learning library for heterogeneous distributed systems,
arXiv preprint arXiv:1512.01274, (2014).
[ 4 ] Chetlur, S., Woolley, C., Vandermersch, P., Cohen, J., Tran, J., Catanzaro, B., and Shelhamer,E.: cuDNN: Eﬃcient Primitives for Deep Learning,
arXiv preprint arXiv:1410.0759, (2014).
[ 5 ] Collobert, R., Kavukcuoglu, K., and Farabet,
C.: Torch7: A Matlab-like Environment for Ma-

chine Learning, Proceedings of Workshop on Machine Learning Systems (LearningSys) in The 25th
Annual Conference on Neural Information Processing Systems (NIPS), 2011.
[ 6 ] He, K., Zhang, X., Ren, S., and Sun, J.: Deep
Residual Learning for Image Recognition, 2016
IEEE Conference on Computer Vision and Pattern
Recognition, CVPR 2016, Las Vegas, NV, USA,
June 27-30, 2016, 2016, pp. 770–778.
[ 7 ] Hochreiter, S. and Schmidhuber, J.: Long
Short-Term Memory, Neural Computation, Vol. 9,
No. 8(1997), pp. 1735–1780.
[ 8 ] Jia, Y., Shelhamer, E., Donahue, J., Karayev, S.,
Long, J., Girshick, R., Guadarrama, S., and Darrell,T.: Caﬀe: Convolutional Architecture for Fast Feature Embedding, arXiv preprint arXiv:1408.5093,(2014).
[ 9 ] Krizhevsky, A., Sutskever, I., and Hinton, G. E.:
ImageNet Classification with Deep Convolutional
Neural Networks, Advances in Neural Information Processing Systems 25: 26th Annual Conference on Neural Information Processing Systems
2012. Proceedings of a meeting held December 3-6,
2012, Lake Tahoe, Nevada, United States., 2012,
pp. 1106–1114.
[10] LeCun, Y., Bottou, L., Bengio, Y., and Haﬀner,
P.: Gradient-Based Learning Applied to Document Recognition, Proceedings of the IEEE, Vol. 86,
No. 11(1998), pp. 2278–2324.
[11] Shi, X., Chen, Z., Wang, H., Yeung, D.-Y.,
kin Wong, W., and chun Woo, W.: Convolutional LSTM Network: A Machine Learning Approach for Precipitation Nowcasting, arXiv preprint
arXiv:1506.04214, (2015).
[12] Simonyan, K. and Zisserman, A.:
Very
Deep Convolutional Networks for Large-Scale Image Recognition, arXiv preprint arXiv:1409.1556,(2014).
[13] Szegedy, C., Liu, W., Jia, Y., Sermanet, P.,
Reed, S. E., Anguelov, D., Erhan, D., Vanhoucke,V., and Rabinovich, A.: Going deeper with convolutions, IEEE Conference on Computer Vision and
Pattern Recognition, CVPR 2015, Boston, MA,
USA, June 7-12, 2015, 2015, pp. 1–9.
[14] Tokui, S., Oono, K., Hido, S., and Clayton, J.:
Chainer: a Next-Generation Open Source Framework for Deep Learning, Proceedings of Workshop
on Machine Learning Systems (LearningSys) in
The 29th Annual Conference on Neural Information Processing Systems (NIPS), 2015.