uni ed memoryを用いた大規模ディープラーニング モデ...

11
日本ソフトウェア科学会第 34 回大会 (2017 年度) 講演論文集 Unified Memory を用いた大規模ディープラーニング モデルの性能に関する考察 根岸 康 今井 晴基 土井 淳 河内谷 清久仁 ディープラーニングのネットワークモデルは年々大きくなる一方、GPU 上のメモリ容量は計算速度程向上して いない。一方、高解像度イメージの処理や、3D イメージの処理等ディープラーニングの入力データの大規模化への 需要は高まっており、近い将来ミニバッチサイズを 1 としても GPU 上のメモリに全てのデータが乗らないことも 想定される。 処理に必要なメモリ量が GPU メモリの量を超える場合、一般に CPU-GPU 間で必要なデータを明示的に転送 する複雑なプログラムが必要となるが、Unified Memory の導入により、最小限の変更で GPU メモリを意識しな いプログラミングが可能になる。 しかし、Unified Memory をこのような目的で使用した場合の性能測定結果はあまりない。このため、(1) Unified Memory 導入によりどの程度まで大きなメモリを使用するプログラムを実行可能か (2) Unified Memory 導入に伴 う実行速度の低下が実用的な範囲であるか (3) ヒントにより十分な性能向上が得られるのかについての検証が必要と なる。 我々は、Chainer を用いて Unified Memory 使用時の実行時間を検証し、(1) Unified Memory の使用により、 同一モデルで 4-28 倍のミニバッチサイズ、同一ミニバッチで 4-81 倍の入力サイズに対応するモデルを実行可能で あること (2) 使用するメモリ量が実メモリより十分小さい場合、Unified Memory による性能低下はほとんどない こと (3) 使用するメモリ量が実メモリより大きい場合、性能低下は 5-10 倍程度であること (4) 現状の CUDA8 Unified Memory の実装及び API ではヒントにより Unified Memory の性能を向上させることは困難であること を確認した。 以下、第 1 章で背景について、第 2 章で Unified Memory を使用したソフトウェア開発について、第 3 章で性 能測定及びその結果について、第 4 章で最適化の方針について、第 5 章でまとめについて述べる。 Deep learning models are becoming large, but GPU memory size is not becoming large. Accordingly the learning model will not fit into the GPU memory in the near future. When the model does not fit in the GPU memory, complex programing is required to transfer the data between CPU and GPU explicitly. We resolve this issue by introducing Unified Memory, but there are little reports about the performance with Unified Memory. This paper discuss the performance with Unified Memory. In this paper, we found (1) Unified Memory supports 4-81 times larger memory than normal execution, (2) when the memory usage is enough less than the GPU memory, the peformance depreciation is small (3) when the memory usage is larger than the GPU memory, the performance becomes worse by 5-10 times, and (4) it is difficult to improve the performance by inserting hint, according to the current implementation of CUDA8. 1 背景 ディープラーニングでは、精度の向上のためより多 くのが用いられるとともに、入力データ、モデルの大 Consideration on Performance of Large model Deep Learning Model wih Unified Memory and its API Yasushi Negishi, Haruki Imai, Jun Doi, and Kiyokuni Kawachiya, 日本アイ・ビー・エム () 東京基礎研究 , IBM Research - Tokyo. 規模化が進んでいる。ディープラーニングでは GPU が用いられれることが多いが、GPU 上のメモリの大 きさは計算能力の向上と比較するとあまり拡大して いない。 ディープラーニングのモデルは大規模化が進んでい る。例えば、Resnet [3] では 152 層が使用されてお り近年他のネットワークでもこれまでよりより多くの 層が使われている。同様に入力データについても、医

Upload: trinhkhue

Post on 22-Mar-2018

231 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: Uni ed Memoryを用いた大規模ディープラーニング モデ …jssst.or.jp/files/user/taikai/2017/GENERAL/general1-2.pdf · Uni ed Memoryを用いた大規模ディープラーニング

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

Unified Memoryを用いた大規模ディープラーニング

モデルの性能に関する考察

根岸 康 今井 晴基 土井 淳 河内谷 清久仁

ディープラーニングのネットワークモデルは年々大きくなる一方、GPU 上のメモリ容量は計算速度程向上していない。一方、高解像度イメージの処理や、3D イメージの処理等ディープラーニングの入力データの大規模化への需要は高まっており、近い将来ミニバッチサイズを 1 としても GPU 上のメモリに全てのデータが乗らないことも想定される。処理に必要なメモリ量が GPU メモリの量を超える場合、一般に CPU-GPU 間で必要なデータを明示的に転送

する複雑なプログラムが必要となるが、Unified Memory の導入により、最小限の変更で GPU メモリを意識しないプログラミングが可能になる。しかし、Unified Memoryをこのような目的で使用した場合の性能測定結果はあまりない。このため、(1) Unified

Memory 導入によりどの程度まで大きなメモリを使用するプログラムを実行可能か (2) Unified Memory 導入に伴う実行速度の低下が実用的な範囲であるか (3) ヒントにより十分な性能向上が得られるのかについての検証が必要となる。我々は、Chainer を用いて Unified Memory 使用時の実行時間を検証し、(1) Unified Memory の使用により、

同一モデルで 4-28 倍のミニバッチサイズ、同一ミニバッチで 4-81 倍の入力サイズに対応するモデルを実行可能であること (2) 使用するメモリ量が実メモリより十分小さい場合、Unified Memory による性能低下はほとんどないこと (3) 使用するメモリ量が実メモリより大きい場合、性能低下は 5-10 倍程度であること (4) 現状の CUDA8 のUnified Memory の実装及び API ではヒントにより Unified Memory の性能を向上させることは困難であることを確認した。以下、第 1 章で背景について、第 2 章で Unified Memory を使用したソフトウェア開発について、第 3 章で性

能測定及びその結果について、第 4 章で最適化の方針について、第 5 章でまとめについて述べる。

Deep learning models are becoming large, but GPU memory size is not becoming large. Accordingly the

learning model will not fit into the GPU memory in the near future.

When the model does not fit in the GPU memory, complex programing is required to transfer the data

between CPU and GPU explicitly. We resolve this issue by introducing Unified Memory, but there are little

reports about the performance with Unified Memory.

This paper discuss the performance with Unified Memory. In this paper, we found (1) Unified Memory

supports 4-81 times larger memory than normal execution, (2) when the memory usage is enough less than

the GPU memory, the peformance depreciation is small (3) when the memory usage is larger than the GPU

memory, the performance becomes worse by 5-10 times, and (4) it is difficult to improve the performance

by inserting hint, according to the current implementation of CUDA8.

1 背景

ディープラーニングでは、精度の向上のためより多

くのが用いられるとともに、入力データ、モデルの大

Consideration on Performance of Large model Deep

Learning Model wih Unified Memory and its API

Yasushi Negishi, Haruki Imai, Jun Doi, and Kiyokuni

Kawachiya, 日本アイ・ビー・エム (株) 東京基礎研究所, IBM Research - Tokyo.

規模化が進んでいる。ディープラーニングでは GPU

が用いられれることが多いが、GPU上のメモリの大

きさは計算能力の向上と比較するとあまり拡大して

いない。

ディープラーニングのモデルは大規模化が進んでい

る。例えば、Resnet [3] では 152 層が使用されてお

り近年他のネットワークでもこれまでよりより多くの

層が使われている。同様に入力データについても、医

Page 2: Uni ed Memoryを用いた大規模ディープラーニング モデ …jssst.or.jp/files/user/taikai/2017/GENERAL/general1-2.pdf · Uni ed Memoryを用いた大規模ディープラーニング

療等でより解像度が高い画像データを直接入力とし

て使用する要求が高まっており、各層が必要とするメ

モリ量は拡大している。一方、GPUのメモリの量は

あまり拡大していない。Nvidia社の場合でも次世代

GPU VOLTAとなっても搭載メモリの量は当面現行

と変わらず 16GBの予定である。GPU用のメモリに

は HBM(High Bandwidth Memory)と呼ばれる高速

だが高価なメモリが使用されるため、この傾向は当面

維持されると考えられる。

この様な状況下では、ミニバッチサイズを 1 とし

ても使用メモリがGPUの物理メモリの量を超えるこ

とが現実の問題となりつつある。例えば、入力データ

として 4K(スーパーハイビジョン)画像 (3840x2100)

を近年良く利用される ResNet152というモデルを修

正して適用した場合を考えると、必要となる GPUメ

モリは 21-40 GB となり †1。次世代の GPU メモリ

VOLTAの量を上回る。

我々の目標は、このような GPUメモリの物理的上

限を意識することなくDeap Learning Frameworkを

実装・利用できる環境を用意することにある。

2 Unified Memoryを使用したソフトウェ

ア開発

2. 0. 1 Unified Memoryの概要

Unified Memorは、Nvidia社の提供する GPUを

使用するためプラットフォーム CUDA [7]において、

主にホストメモリとGPUメモリを統一的に取り扱う

ために提供されていおり、メモリ確保用に特別なAPI

CudaMemAllocManaged を使用することで、ホスト

側からのメモリアクセスとGPU側からのメモリアク

セスを同一のポインタで表現することが可能になる。

この機能は、本来、同一データをホストと GPU

の両方からアクセスする場合を想定して、同一デー

タに対する CPU メモリ用 GPU メモリ用の複数の

allocationや明示的な CPU-GPU間のメモリ転送に

関する記述を省き、より簡潔に記述するための機能で

ある。

†1 入力データサイズは元の画像サイズ 256x256の 123.4

倍で、重み数 6GB・データ数 15G となる。16bit 浮動小数点 (2 バイト) で 1-2 セット保持と仮定

本論文でも Unified Memory を使用するが、その

使用方法は上記のものとは異なり、CPUからのメモ

リアクセスは想定せず GPU メモリを実メモリサイ

ズ以上に使用 (オーバーコミット)するために使用

する。Unified Memory の機能は CUDA6.0 から導

入されていたが、現行の PASCAL 世代 GPU から

は、GPU page fault がサポートされ、On-demand

で CPU-GPU 間のページ移動が行えるようになり、

実行時に GPU のメモリが不足する場合に、CUDA

のランタイムシステムが自動的に CPU-GPU間のメ

モリ移動を行い、GPUプログラムからは仮想的に実

メモリ以上の大きなメモリの使用が可能になった。

GPU 上にメモリ確保する API である Cud-

aMemAllloc の全ての呼び出しを CudaMemAlloc-

Mangedに変更することで、通常のメモリに変わって

Unified Memoryを使用できる。

更に次のVOLTA世代のGPUでは、Unified Mem-

oryの Cache coherencyが向上し、atomic操作も行

えるようになり、Unified Memoryはより一層活用さ

れるようになると考えられる。

2. 0. 2 Unified Memoryを使用したソフトウェ

ア開発

処理に必要なメモリ量がGPUメモリの量を超える

場合、Unified Memoryの使用によりソフトウェア開

発が容易になる。

Unified Memoryを使用しない場合

CPU-GPU間で必要なデータを逐次明示的に転送す

るプログラムを作成する必要がある。

1. コーディング GPU の実メモリの量を考慮し、

転送対象とするデータをプログラミング前に確

定する必要がある。

2. 機能デバッグ データ転送を含むプログラミング

が終了するまで機能デバッグを開始できない。

3. 性能最適化 方針・プログラムが妥当であれば、

機能デバッグ終了時点である程度の性能は得ら

れる。

Unified Memoryを使用する場合

より単純なプログラミングが可能になる。

1. コーディング GPUの実メモリの量を考慮せず

にプログラムを作成する。

Page 3: Uni ed Memoryを用いた大規模ディープラーニング モデ …jssst.or.jp/files/user/taikai/2017/GENERAL/general1-2.pdf · Uni ed Memoryを用いた大規模ディープラーニング

2. 機能デバッグ Unified Memoryを使用して動作

させて機能をデバッグする。

3. 性能最適化 実行時間・メモリ使用量を測定し、

メモリ転送が必要な箇所や性能ボトルネック部分

にヒントを与えることで性能最適化する。

3 測定方針

このように Unified Memory の利用によりソフト

ウェア開発は容易になるが、実際のプログラムが、

GPUの実メモリ量をどの程度まで超えても動作する

のか、またその時の実行速度について報告した研究は

これまであまり無かった。

報告が少ない理由の一つは、現行の GPUの物理メ

モリの範囲内で効率よく実行されるモデルのみがよ

く使用されることにある。

本論文では、将来の利用状況を想定して、次の 2つ

の方法でGPUメモリが大きく消費される状況を設定

し、プログラムを実行して実行可能性や速度について

議論する。

1. ミニバッチサイズ変更 ミニバッチサイズの増加

によりメモリ使用量を増加させる。モデルは修

正しない。入力サイズは元のサイズ (224)に固定

する。

2. 入力サイズ変更 モデルの一部を修正し入力デー

タのサイズを変化させる。ミニバッチサイズは固

定 (今回は 32)する。

次節でモデルの修正方法について説明する。

3. 1 ディープラーニングモデルの修正

3. 1. 1 モデル修正の方針

本節では、大きなサイズの入力データに対応する

ためのモデルの修正方法について説明する。今回は、

層の数は変更せずに各層の大きさのみを修正する。本

論文では元のモデルに対して最小限の修正で使用メ

モリを任意の大きさに増加させることを目的とし、精

度の向上は考えない。

3. 1. 2 モデル修正方法

GoogleNet、ResNet 等多くの Convolution Net-

workが、前半が Convolution層、後半が全結合層か

ら構成されている。この内、Convolution層だけを入

力サイズに合わせて修正し、全結合層のサイズは変更

しない。

Convolution層は入力サイズに比例してメモリサイ

ズと計算量が増加する一方、全結合層は、サイズの二

乗に比例して、メモリサイズと計算量が増加するの

で、入力サイズに合わせて全結合層のサイズを拡大す

ることは現実的ではない。

Convolutionと全結合層のリンクの数を合わせるた

めに、Convolution層と全結合層を結合する層 (例え

ば、max pooling層)のパラメータを調整する。

以下、比較的単純な alexnetの修正を例にとって説

明する。この例では初期化の際に 224 の定数倍の値

を insize として与えている。Chainer では入力行列

のデータサイズに合わせて各層の定義が決定される

ので、コード上での明示的な変更が必要な部分は、以

下の例ではmax pooling層のパラメータのみである。import chainer

import chainer.functions as F

import chainer.links as L

class Alex(chainer.Chain):

insize = 224

def __init__(self, insize=224):

Alex.insize=insize

super(Alex, self).__init__(

conv1=L.Convolution2D(3, 64, 11, stride=4, pad=2),

conv2=L.Convolution2D(64, 192, 5, pad=2),

conv3=L.Convolution2D(192, 384, 3, pad=1),

conv4=L.Convolution2D(384, 256, 3, pad=1),

conv5=L.Convolution2D(256, 256, 3, pad=1),

fc6=L.Linear(256 * 6 * 6, 4096),

fc7=L.Linear(4096, 4096),

fc8=L.Linear(4096, 1000),

)

def forward(self, x):

h = F.max_pooling_2d(F.relu(self.conv1(x)), 3, stride=2)

h = F.max_pooling_2d(F.relu(self.conv2(h)), 3, stride=2)

h = F.relu(self.conv3(h))

h = F.relu(self.conv4(h))

#h = F.max_pooling_2d(F.relu(self.conv5(h)), 3, stride=2) #orig

h = F.max_pooling_2d(F.relu(self.conv5(h)), 3 * Alex.insize//224, #fixed

stride=2 * Alex.insize//224, cover_all=False) #fixed

h = F.relu(self.fc6(h))

h = F.relu(self.fc7(h))

return self.fc8(h)

今回の測定では、ConvNetベンチマーク及びその

PRに含まれる以下のモデルを使用した。

1. alexnet

2. googlenet

3. resnet50

4. resnet101

5. resnet151

6. vgga

7. vg16

8. vg19

上記 PR中の resnet50, resnet101, resnet151につ

Page 4: Uni ed Memoryを用いた大規模ディープラーニング モデ …jssst.or.jp/files/user/taikai/2017/GENERAL/general1-2.pdf · Uni ed Memoryを用いた大規模ディープラーニング

いては、上記手法と同様の方法で入力サイズ変更に対

応済であったのでそれを使用した。それ以外のモデル

に関しては入力サイズ変更のための修正を適用した。

3. 2 測定環境

3. 2. 1 ハードウェア

計測には以下のノードを使用した。

システム名 IBM Power System S822LC for

High Performance Computing (Minsky) [2]

CPU IBM POWER8 2基 (計 20コア)搭載、シ

ステム全体のメモリ 256GB

GPU NVIDIA Telsa P100 4 基搭載、一基当り

のメモリ 16GB

このシステムでは NVLink のインタフェースを

持つ POWER8 プロセッサが使用されている。各

GPU-GPU 間が NVLink 2 brick を使用して片方向

40GB/s、両方向 80GB/sで結合されている。

x86プロセッサの場合、NVLinkのインタフェース

を持たないため、GPU-CPU間は PCI Express経由

で GPU-CPU間は 32GB/sで接続される。

このため、X86プロセッサを使用した場合、Unified

Memoryの性能に影響を及ぼすことが想定されるが、

本論文では X86プロセッサを使用した場合の性能は

測定できなかったため、今後の課題としたい。

3. 2. 2 ソフトウェア

今回使用したソフトウェアは以下の通り。

RHEL7.3

CUDA9.0

Python3.0.6

Chainer Chainer [4] は、Preferred Netoworks

によって開発されたディープラーニングフレーム

ワークで、Pythonによって記述されている。本

論文では現時点で最新の Version 2を用いた [5]。

Chainerは Cupy [6]と呼ばれる Numpy互換ラ

イブラリを経由してGPUにアクセスする。Cupy

ではメモリオブジェクトが抽象化されているため

統一的な書き換えが容易であり、Unified Mem-

oryを使用するにはCupyのMemory Classを修

正する。Chainer V2はまだ Unified Memory対

応されていないので、本論文では Chainer V1向

けの修正と同様の修正を Chainer V2に行った。

また、CUDA9に対応するための修正を行った。

今回の測定では Chainer を使用したが、本研究

によって得られる知見の多くは他のフレームワー

クにも適用可能であると考えている。

ConvNet Benchmark 異なるディープラーニ

ングフレームワーク間で性能比較するためのベ

ンチマーク [1]。入力データはベンチマークプロ

グラムが乱数で生成するため、入力データを個

別に用意する必要はない。一方、学習精度・検証

精度を測定することはできない。ベンチマーク

自身に alexnet, googlenet, overfeat(標準的な入

力サイズが異なるため本論文では不使用), vgga

のモデル定義が含まれている。Chainer V2に対

応するために [8]を適用した。この branchには

vgg16のモデル定義、及び、入力サイズ変更に対

応した ResNet50, ResNet101, ResNet152 の定

義が含まれている。

3. 3 測定結果

3 章の方針に基づき、(1) ミニバッチサイズ変更、

(2) 入力サイズ変更の 2 つの方針で実行の成否と性

能を測定した。本節ではその測定結果について説明

する。

3. 3. 1 ミニバッチサイズ変更

モデルは修正せず、入力サイズは元のサイズの

224x224 (pixel) * 3 (colors) のまま固定した。ミニ

バッチサイズを変化させてベンチマークを実行し、実

行の成否と実行時間を測定した。

最大ミニバッチサイズ (表 3. 3. 1)

最大ミニバッチサイズの拡大率は、モデルによって

異なり 4-28倍であることを確認できた。

Unfieid Memoryによる拡大率は層の数が大きいほ

ど大きくなる傾向がある。これは、層の数が大きいほ

どメモリ全体に対するワーキングセットの割合が小さ

くなるため、少ないデータ転送で実行が続けられ実行

時のエラーを回避可能であるためと考えられる。

実行速度

ミニバッチサイズを変更させた場合の実行速度を図

2に示す。

Page 5: Uni ed Memoryを用いた大規模ディープラーニング モデ …jssst.or.jp/files/user/taikai/2017/GENERAL/general1-2.pdf · Uni ed Memoryを用いた大規模ディープラーニング

モデル alexnet googlenet ResNet50 ResNet101 ResNet152 vgga vgg16 vgg19

層の数 8 22 50 101 152 11 16 19

最大ミニバッチ数 (オリジナル) 2272 256 96 64 32 160 96 96

最大ミニバッチ数 (Unified Memory) 11072 1984 1248 1056 896 640 640 640

最大ミニバッチサイズの拡大率 4.873 7.750 13.000 16.500 28.000 4.000 6.667 6.667

4.873

7.750

13.000

16.500

28.000

4.000

6.667 6.667

0.000

5.000

10.000

15.000

20.000

25.000

30.000

alexnet googlenet resnet50 resnet101 resnet152 vgga vgg16 vgg19

Ratio of maximum batch size Unified Memory / Normal

図 1 最大ミニバッチ数の拡大率

この内 GoogLeNetの実行時間を示したものが図 3

である。

また、GoogLeNetのイメージ 1枚当りの実行時間

を図 4に示す。

注目すべき点は、以下の通り。

1. Unified Memoryの使用時、ミニバッチサイズ

224まではUnified Memoryを使用しない場合と

実行時間がほぼ同じである。

2. このミニバッチサイズ 224は Unified Memory

を使用しない場合に実行可能なミニバッチサイズ

256の 87%にあたる。

3. Unified Memoryの使用時、ミニバッチサイズ

256を超えると 1イメージあたりの実行時間が急

激に悪化し、Unified Memoryを使用しない場合

の実行時間 (約 3msec)の約 10倍となる。batch

を大きくすると更に徐々に悪化する。

Unified Memoryを使用した場合、1イメージ当り

の実行時間は大きく低下する。ミニバッチ数の拡大は

データパラレルの導入によっても可能であるため、ミ

ニバッチ数拡大のために Unified Memory の導入す

ることに実用的な意味はない。

3. 3. 2 入力サイズ変更

モデルの一部を修正し入力データのサイズを変化

させた。修正の方法は 3. 1. 2節の通り。ミニバッチサ

イズは十分な実行効率が得られる最小のものと考え、

今回は 32に固定した。

最大入力サイズ

最大入力サイズは、Unified Memory の使用によ

り、4(2x2)倍から 81倍 (9x9)に拡大されることが確

認できた。

実行速度

入力サイズを変更した場合の実行速度を図 6 に

示す。

この内 GoogLeNetの実行時間を示したものが図 7

である。

また、GoogLeNetのイメージ 1枚当りの実行時間

を図 8に示す。

Unified Memoryの導入により実行時間の低下が見

られるが、ミニバッチサイズは 1 でも実行不可能な

場合にモデルの実行に対しては、Unified Memoryの

導入は有効な手段の一つとなる。

4 最適化の方針

Unified Memoryにより使用可能なモデルが大きく

拡大可能であることが確認できた。一方、実行速度は

大きく低下している。本章では実行速度の最適化の方

法を検討する。

Page 6: Uni ed Memoryを用いた大規模ディープラーニング モデ …jssst.or.jp/files/user/taikai/2017/GENERAL/general1-2.pdf · Uni ed Memoryを用いた大規模ディープラーニング

0

100000

200000

300000

400000

500000

600000

224 448 672 896 1120 1344 1568 1792 2016 2240 2464 2688 2912 3136 3360 3584 3808 4032

Chart Title

alexnet-normal alexnet-unified googlenet-normal googlenet-unified resnet50-normal resnet50-unified resnet101-normal resnet101-unified

resnet152-normal resnet152-unified vgga-normal vgga-unified vgg16-normal vgg16-unified vgg19-normal vgg19-unified

図 2 ミニバッチサイズ変更

googlenet-normal

vgga-normal

0.00

10000.00

20000.00

30000.00

40000.00

50000.00

60000.00

70000.00

32

96

16

0

22

4

28

8

35

2

41

6

48

0

54

4

60

8

67

2

73

6

80

0

86

4

92

8

99

2

10

56

11

20

11

84

12

48

Exec

uti

n T

ime

(mse

c)

Minibatch Size

GoogLeNetMinibatch v.s. Execution Time

googlenet-normal googlenet-unified

図 3 ミニバッチサイズ変更 (GoogLeNet)

4. 1 ディープラーニングフレームワークのメモリ

使用パターン

GoogleNet、ResNet等の通常の Convolution Net-

work は Forward Propagation と Backward Propa-

0

10

20

30

40

50

60

32

96

16

0

22

4

28

8

35

2

41

6

48

0

54

4

60

8

67

2

73

6

80

0

86

4

92

8

99

2

10

56

11

20

11

84

12

48

Exec

uti

on

Tim

e /

Imag

e (m

sec)

Minibatch Size

GoogLeNetMinibatch v.s. Execution Time / Image

googlenet-normal googlenet-unified

図 4 1 イメージあたりの実行時間 (GoogLeNet)

gation の 2 つのフェーズによって処理される。メモ

リ管理の方針はフレームワークによって異なるが、こ

こでは Chainerを例にとって説明する。

Chainer(Version 1) のメモリ確保・開放部分にト

Page 7: Uni ed Memoryを用いた大規模ディープラーニング モデ …jssst.or.jp/files/user/taikai/2017/GENERAL/general1-2.pdf · Uni ed Memoryを用いた大規模ディープラーニング

0.000

10.000

20.000

30.000

40.000

50.000

60.000

70.000

80.000

90.000

alexnet googlenet resnet50 resnet101 resnet152 vgga vgg16 vgg19

Max Input Size Ratio

図 5 入力サイズ変更

レースを入れて、時間経過毎のメモリ使用量を計測

した。

図 9に、GoogLeNet(入力サイズ 2240x2240)の 10

iteration実行時のメモリ確保・開放回数とメモリ使

用量のグラフを示す。

グラフの青腺が実際に使用されているメモリの使

用量、オレンジ線がMemory Poolを含めた全ての確

保されているメモリ量の合計を示している。Memory

Poolは未使用のメモリを一旦プールするための領域

であり、メモリ確保・開放のコストを軽減するために

導入されている。

このグラフから以下の点が読み取れる。

メモリの最大確保量 Unified Memoryの導入によ

り、実メモリの 16 GBを超えて約 70GBまでメ

モリを確保できることが確認できる。

イテレーション内のメモリ使用パターン Chainer

では Forward フェーズ中にメモリを確保し、

Backwardフェーズ中にメモリを開放している。

このため、GPUの使用メモリの量は各 iteration

の開始時点でほぼ 0、Forward時から Backward

時の折り返しの時点で最大となる。Backwardで

の参照の終了毎に順次開放され、iteration の終

了時点で再びほぼ 0となる。

Memory Poolによるメモリ使用量 今回の測定

では、確保したメモリの約 40%がMemory Pool

によって使用されている。Memory Pool中のメ

モリはアクセスされることは無いが、CUDAシ

ステムによるデータ転送の対象となるので、大き

なデータをMemory Pool用に確保していること

は、性能に影響を与える。

これらの観察から得られる最適化の方針は以下の

通り。

最適化方針 1 Unified Memoryの使用時はMem-

ory Poolは使用しない。

更に、メモリー確保の呼び出し元にもトレースを

入れて、どのモジュールがメモリを使用しているか分

類した。図 9 に、GoogLeNet(入力サイズ 224x224)

の 10 iteration 実行時のメモリ確保・開放回数とモ

ジュール別のメモリ使用量を示す。また、図 9に、モ

ジュール別の合計使用メモリ量を示す。

これらのグラフから得られる知見は以下の通り。

メモリ使用モジュール cudnnActivationforward等

少数のモジュールが使用メモリのほとんどを占め

ており、10個のモジュールで全体の 90%のメモ

リ使用を説明できる。また、ログを直接観察する

と、モジュールあたり数個程度の非常に大きなメ

モリを確保していることがわかる。

層に依存しないメモリ使用 アプリケーション等層

に依存しないモジュールからのメモリ使用量は少

ない。

以上の知見から以下の最適化方針が考えられる。

最適化方針 2 大きなメモリの確保にのみ Unified

Memoryを使用する。

図 12 にここまでの最適化の方針に従って、最適

化を行った結果を示す。MemoryPoolの使用を止め、

4KB以下のメモリ確保に通常のメモリを使用するよ

うにプログラムを変更した。これらの最適化により最

大ミニバッチサイズは 10から 9に減っているが、実

行時間は約 15%削減されている。

4. 2 ヒントによる最適化

プログラムへのヒントの挿入による最適化につい

て検討する。

4. 2. 1 必要なヒントの種類

ディープラーニングは Forward フェーズ、Back-

wardフェーズの順で行われ、Backwardフェーズで

は、対応する Forawardフェーズによる計算結果にア

Page 8: Uni ed Memoryを用いた大規模ディープラーニング モデ …jssst.or.jp/files/user/taikai/2017/GENERAL/general1-2.pdf · Uni ed Memoryを用いた大規模ディープラーニング

0

100000

200000

300000

400000

500000

600000

224 448 672 896 1120 1344 1568 1792 2016 2240 2464 2688 2912 3136 3360 3584 3808 4032

Input SIze v.s. Execution Time

alexnet-normal alexnet-unified googlenet-normal googlenet-unified resnet50-normal resnet50-unified resnet101-normal resnet101-unified

resnet152-normal resnet152-unified vgga-normal vgga-unified vgg16-normal vgg16-unified vgg19-normal vgg19-unified

図 6 実行時間 (GoogLeNet)

0.000

50000.000

100000.000

150000.000

200000.000

224 448 672 896 1120 1344 1568 1792 2016 2240

Minibatch Size v.s. Execution TimeGoogLeNet

googlenet-normal googlenet-unified

図 7 実行時間 (GoogLeNet)

クセスする。

このアクセスパターンを考えると、以下の 2 種類

のヒントによりデータ転送とGPUでの計算を並列に

行うことが性能改善に有効である。

0.000

0.005

0.010

0.015

0.020

0.025

0.030

0.035

0.040

0.045

224 448 672 896 1120 1344 1568 1792 2016 2240

Minibatch Sie v.s. Execution Time / Input Size

googlenet-normal googlenet-unified

図 8 入力サイズ当りの実行時間 (GoogLeNet)

swap outヒント GPU から CPU へのメモリ

swap-out のヒントを forward フェーズでの各

層の計算終了時点に挿入する。

prefetchヒント CPU から GPU へのメモリ

Page 9: Uni ed Memoryを用いた大規模ディープラーニング モデ …jssst.or.jp/files/user/taikai/2017/GENERAL/general1-2.pdf · Uni ed Memoryを用いた大規模ディープラーニング

0

10

20

30

40

50

60

70

80

12

64

52

77

90

10

53

13

16

15

79

18

42

21

05

23

68

26

31

28

94

31

57

34

20

36

83

39

46

42

09

44

72

47

35

49

98

52

61

55

24

57

87

60

50

63

13

65

76

68

39

71

02

73

65

76

28

78

91

81

54

84

17

86

80

89

43

92

06

94

69

97

32

99

95

10

25

81

05

21

10

78

41

10

47

11

31

01

15

73

11

83

6

Memory Stat for GoogLeNet 2240x2240 minibatch=10

UNIFIED-USED UNIFIED-POOL

図 9 GoogleNet(入力サイズ 2240x2240) のメモリ使

用パターン

prefetchのヒントを backwardフェーズでの各層

の計算開始の適切な時間分前に挿入する。

以下、上記 2種類のヒントを CUDAのAPIによっ

て実装可能であるかについて検討する。

4. 2. 2 ヒントの実装についての検討

CUDAは Unified Memoryの使用時にデータ転送

を行う際のヒントを与えるために次の APIを提供し

ている。このうち、cudaMemPrefetchAsyncは上記

の prefetchヒントに相当する。

cudaMemAdviseSetPreferredLocation メモ

リを確保するデバイス (ホスト・GPU)の指定

cudaMemAdviceUnsetPreferredLocation

上記ヒントの削除

cudaMemAdviseSetAccessedBy 次にアク

セスするデバイス (ホスト・GPU)の指定。

cudaMemPrefetchAsync 非同期にメモリ転

0

100000000

200000000

300000000

400000000

500000000

600000000

700000000

800000000

900000000

1E+09

12

44

48

77

30

97

31

21

61

45

91

70

21

94

52

18

82

43

12

67

42

91

73

16

03

40

33

64

63

88

94

13

24

37

54

61

84

86

15

10

45

34

75

59

05

83

36

07

66

31

96

56

26

80

57

04

87

29

17

53

47

77

78

02

08

26

38

50

68

74

98

99

29

23

59

47

89

72

19

96

41

02

07

10

45

01

06

93

10

93

61

11

79

11

42

21

16

65

11

90

81

21

51

12

39

4

Mamory Usage of GoogleNet 224x224 (Minibatch=10)

cudnnActivationforward conv2dForward1 cudaToGPU

pooling2dForwardGPU coreConcatenate1 elementsizeCall

pooling2dBackwardGPU localresponsenormalizationForwardGPU1 cudnnActivationbackward

localresponsenormalizationBackwardGPU4 OTHER POOL

図 10 GoogleNet(入力サイズ 224x224)のモジュール

別メモリ使用パターン

送を指示

我々はこれらの APIを使用して、上記 2種類のヒ

ントを実装することを検討した。

こ の う ち 、cudaMemAdviseSetPreferredLoca-

tion/cudaMemAdviceUnsetPreferredLocation を使

用したが、今回の測定条件では使用の有無で性能に

有意な差は見られなかった。また、cudaMemAdvis-

eSetAccessedByについては、呼び出し時点でデータ

転送が同期的に行われるため, GPUでの計算時間を

削減する効果は確認できたが、APIの CPU-GPU間

のデータ転送が APIの呼び出し時点に移動しただけ

で、全体としての実行時間の削減を実現することはで

きなかった。

CudaMemPrefetchAsync については、Backward

フェーズへの導入により一定のデータ削減効果は確認

できた。図 12に CudaMemPrefetchAsyncの効果に

Page 10: Uni ed Memoryを用いた大規模ディープラーニング モデ …jssst.or.jp/files/user/taikai/2017/GENERAL/general1-2.pdf · Uni ed Memoryを用いた大規模ディープラーニング

0.0

20.0

40.0

60.0

80.0

100.0

120.0

140.0

cud

nn

Act

ivat

ion

forw

ard

con

v2d

Forw

ard

1

cud

aTo

GP

U

po

olin

g2d

Forw

ard

GP

U

core

Co

nca

ten

ate

1

elem

en

tsiz

eC

all

po

olin

g2d

Bac

kwar

dG

PU

localresponsenorm

alizationFo

rwar…

cud

nn

Act

ivat

ion

bac

kwar

d

localresponsenorm

alizationBackw

a…

localresponsenoam

alizationBackw

con

v2d

Bac

kwar

d5

app

l

core

Do

t

con

v2Fo

rwar

d4

con

v2d

Bac

kwar

d6

con

v2d

Bac

kwar

d4

con

v2d

Bac

kwar

d1

gen

era

torR

and

om

Sam

ple

soft

max

cro

sse

ntr

op

yBac

kwar

dG

PU

logs

oft

max

Logs

oft

max

red

uct

ion

Cal

l

con

v2d

Bac

kwar

d7

red

uct

ion

core

Cal

l

vari

able

Bac

kwar

d

core

Co

nca

tin

ate2

core

Co

nca

ten

ate

3

core

Co

nca

ten

ate

2

Max Memory use by module (MB)GoogLeNet 224x224 minibatch=10

図 11 GoogleNet(入力サイズ 224x224)のモジュール

別合計メモリ使用量

ついて示す。最大 5%の実行時間削減効果が得られて

いるが、ミニバッチサイズによっては逆に実行時間が

増加している。

このように CudaMemPrefetchAsync には一定の

効果が見られるが、限度がある。その原因としては、

prefetchの代償として swap outするメモリを制御し

ていないことにある。

swap outするメモリを制御するために cudaMem-

PrefetchAsyncを逆方向に使用して、GPUのメモリ

を非同期にホストに転送することを試みた。

これにより対象メモリのデータがホスト上に転送

され、GPU上のメモリはデータ転送なしにいつでも

再使用できる状態となる。このために再利用の際の優

先度が上がることが期待される。

予備的な実験を行いこのときの動作を確認した。実

験では GPUのメモリ量を超えたメモリを GPU上で

0.0

5000.0

10000.0

15000.0

20000.0

25000.0

30000.0

1 2 3 4 5 6 7 8 9 10 11

Minibatch Size v.s. Convnet Total TimeGoogLeNet 2240x2240

Normal Unified Optimized

図 12 GoogleNet(2240x2240)における最適化の効果

使用し、ディープラーニングを模したアクセスパター

ンに基づいて、メモリ確保・開放及びメモリアクセス

を行った。

予備的な実験の詳細については本論文では触れな

いが、実験により以下の知見を得た。

1. swapout されるデータはメモリ確保 (alloca-

tion)の順序に基づいておこなわれる。アクセス

の順序は swapoutの順序を決定する際に考慮さ

れない。

2. GPU 上のメモリが不足すると、メモリは最も

古く確保されたメモリから順次ホスト上に転送

され再利用される。

3. 再利用が一巡するとラウンドロビン順で最も古

く確保されたから順次再度ホストに転送し再利

用する。

4. メモリ上のデータがホストに転送済みですぐに

再利用可能であっても、上記再利用の順序に影響

Page 11: Uni ed Memoryを用いた大規模ディープラーニング モデ …jssst.or.jp/files/user/taikai/2017/GENERAL/general1-2.pdf · Uni ed Memoryを用いた大規模ディープラーニング

0

2000

4000

6000

8000

10000

12000

14000

32 64 96 128 160 192 224 256 288 320 352 384 416 448 480 512

CudaMemPrefetchAsyncの効果

Original UM-NoHint UM-PrefetchAtBackward

図 13 GoogleNet(2240x2240) における

CudaMemPrefetchAsync の効果

を与えない。

5. cudaMemFreeによって開放されたメモリであっ

ても、すぐには再利用されず上記再利用の順序で

再利用される。

以上の実験を鑑みて、我々はGPUのUnified Mem-

oryの再利用の順序を現状の CUDA APIを使用して

任意に制御することは不可能であると考えている。

次の VOLTA 世代のGPU では、Unified Memory

の Cache coherency が向上し、atomic 操作も行える

ようになる。これに伴ってCUDAのUnified Memory

の機能も改善され、メモリ再利用の順序も制御できる

ようになることを期待している。

5 まとめ

本論文では、、(1) Unified Memory 導入によりど

の程度まで大きなメモリを使用するプログラムを実

行可能か (2) Unified Memory導入に伴う実行速度の

低下が実用的な範囲であるか (3) ヒントにより十分な

性能向上が得られるのかについて、検証した。

我々は、Chainerを用いてUnified Memory使用時

の実行時間を検証し、(1) Unified Memoryの使用に

より、同一モデルで 4-28倍のミニバッチサイズ、同

一ミニバッチで 4-81倍の入力サイズに対応するモデ

ルを実行可能であること (2) 使用するメモリ量が実メ

モリより十分小さい場合、Unified Memoryによる性

能低下はほとんどないこと (3) 使用するメモリ量が実

メモリより大きい場合、性能低下は 5-10倍程度であ

ること (4) 現状の CUDA8の Unified Memoryの実

装及び APIではヒントにより Unified Memoryの性

能を向上させることは困難であることを確認した。

今後は、VOLTA GPU 及び CUDA9 を使用して

ディープラーニングフレームワークで Unified Mem-

oryを使用する際の実行性能の最適化、及び、最大入

力サイズの拡大を進めて生きたい。

参 考 文 献

[1] Chintala, S.: https://github.com/soumith/convnet-

benchmarks.

[2] IBM: IBM Power System S822LC for High Perfor-

mance Computing, https://www.ibm.com/systems/jp-

ja/power/hardware/s822lc-hpc/index.html.

[3] Kaiming He, Xiangyu Zhang, S. R. J. S. M. R.:

Deep Residual Learning for Image Recognition,

https://arxiv.org/abs/1512.03385.

[4] Networks, P.: Chainer, https://chainer.org/.

[5] Networks, P.: Chainer github, https://github.com/chainer/chainer.

[6] Networks, P.: cupy, https://github.com/cupy/cupy.

[7] NVIDIA: CUDA Toolkit, https://developer.nvidia.com/cuda-

toolkit.

[8] Saito, S.: a branch of convnet-benchmarks.