佐々木邦暢 (@_ksasaki)
エヌビディア合同会社
AUTOMATIC MIXED PRECISION
2019/5/16 GPU Deep Learning Community #11
2
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
FP32 と FP16
FP32 (単精度) FP16 (半精度)
指数部: 8 ビット、仮数部: 23 ビット 指数部: 5 ビット、仮数部: 10 ビット
表現可能な範囲
1.4 x 10-45 < x < 3.4 x 1038
表現可能な範囲
5.96 x 10-8 < x < 65504
3
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
FP32 と FP16
モデルのパフォーマンスを最大化
FP32 (単精度) を基準にすると FP16 (半精度) の性能は
• 計算のスループット
• メモリアクセスのスループット
• メモリの消費量 (フットプリント)
• 計算のスループット - 8 倍
• メモリアクセスのスループット - 2倍
• メモリの消費量 (フットプリント) - 1/2
4
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
TENSOR コア
混合精度行列演算ユニット
D =
FP32
(FP16)
FP16 FP16 FP32
(FP16)
A0,0 A0,1 A0,2 A0,3
A1,0 A1,1 A1,2 A1,3
A2,0 A2,1 A2,2 A2,3
A3,0 A3,1 A3,2 A3,3
B0,0 B0,1 B0,2 B0,3
B1,0 B1,1 B1,2 B1,3
B2,0 B2,1 B2,2 B2,3
B3,0 B3,1 B3,2 B3,3
C0,0 C0,1 C0,2 C0,3
C1,0 C1,1 C1,2 C1,3
C2,0 C2,1 C2,2 C2,3
C3,0 C3,1 C3,2 C3,3
行列の FMA (Fused Multiply-Add)
4x4 の行列の積和演算を1サイクルで計算する性能:
128 演算/サイクル/Tensor コア、1024 演算/サイクル/SM
A B C
5
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
混合精度演算で学習を3倍高速化
Tesla V100 搭載のサーバーでの例
Server: NVIDIA DGX-2 | GPU: 1x V100-SXM3-32GB | CPU: Platinum8168
PyTorch: GNMT: 19.01_py3, Dataset: WMT16 English-German | TensorFlow: OpenSeq2Seq(GNMT), 18.11_py3, Dataset: WMT16 English-German | MXNet: ResNet50: 18.12_py3, Dataset: ImageNet2012
Faster Time to Train
Increased Data
Scientist Productivity
Lower TCO
23435
8115
80051
24476
0
20000
40000
60000
80000
100000
PyTorch
GNMT
TensorFlow
OpenSeq2Seq(GNMT)
TotalTokens/sec
FP32 Mixed
439
1413
0
400
800
1200
1600
MXNet
ResNet50Images/sec
3.0X
3.2X
3.4X
Scale-up Server
1x V100 GPU
6
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
Tensor コアによる混合精度演算
精度を妥協することなく高いスループットを実現
ILSVRC12 classification top-1 accuracy.
(Sharan Narang, Paulius Micikevicius et al., "Mixed Precision Training“, ICLR 2018)
**Same hyperparameters and learning rate schedule as FP32.
0.00%
10.00%
20.00%
30.00%
40.00%
50.00%
60.00%
70.00%
80.00%
AlexNet VGG-D GoogleNet
(Inception v1)
Inception v2 Inception v3 Resnet50
精度
FP32 Mixed Precision**
7
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
機械学習のパフォーマンスを
計測する初めてのベンチマークテスト
https://mlperf.org/
8
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
混合精度演算が MLPERF で勝利
シングルノードでのトレーニング時間
7 部門中 6 部門で NVIDIA GPU が首位を獲得
画像分類
ResNet50 v.1.5
物体検出
(高負荷)
Mask R-CNN
物体検出
(軽負荷)
SSD
翻訳
GNMT
翻訳
Transformer
レコメンデーション
NCF
70 分 167 分 14分
10分 19分 0.4分
Test Platform: DGX-2H - Dual-Socket Xeon Platinum 8174, 1.5TB system RAM, 16 x 32 GB Tesla V100 SXM-3 GPUs connected via NVSwitch
9
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
AMP
GRAPH OPTIMIZATION
CHOOSING WHAT AND
WHERE TO CAST
10
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
混合精度演算の自動適用 (AMP)
わずか数行のコード追加で AMP を有効化することで、最大 3 倍程度のスピードアップ
演算ごとに適切な精度を利用するためにグラフ最適化技術を活用
TensorFlow, PyTorch, MXNet をサポート
容易な高速化で生産性を向上
11
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
勾配のアンダーフロー
勾配の値が 0 に近づくと 0 に丸められてしまう
12
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
ロス スケーリング
小さな値が FP16 の表現可能範囲に収まるようにスケールする
13
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
キャストすべきものの選択
1. できる限り FP16 を使うようにする
特に Tensor コアで実行できる操作は効果が大きいので優先
2. 精度を維持することが重要な部分では FP32 を使う
3. FP16 と FP32 間の「キャスト スラッシング」を避ける
ガイドライン
14
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
キャストすべきものの選択
演算を 3+1 のカテゴリに分類
常にキャスト
(Always)
FP16 化の効果が大きい演算。これらはコストをかけてキャストする価値がある。
例: matmul, conv2d
キャストするかも
(Maybe)
FP16 化によって速くはなるがキャストのコストと見合うとは限らないもの。
例: add, relu
キャストしない
(Never)
数値的安定性を維持するために FP32 が必要なもの。
例: exp, softmax_cross_entropy_with_logits
その他 FP16 実装がないものや入力が浮動小数点型でないもの。
15
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
キャスト可否判定グラフの例
Placeholder
Mul
Reciprocal
GradFilter
MatMul
Placeholder
GradInput
ReluGrad
LossGrad
MatMul
Conv2d
Relu
Add
Loss
MatMul
VariableV2
Mul
VariableV2
Mul
VariableV2
16
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
キャスト可否判定グラフの例
ステップ 1: 演算の色を初期化
Placeholder
Mul
Reciprocal
GradFilter
MatMul
Placeholder
GradInput
ReluGrad
LossGrad
MatMul
Conv2d
Relu
Add
Loss
MatMul
VariableV2
Mul
VariableV2
Mul
VariableV2
17
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
キャスト可否判定グラフの例
ステップ 2: "Never" の伝播
Placeholder
Mul
Reciprocal
GradFilter
MatMul
Placeholder
GradInput
ReluGrad
LossGrad
MatMul
Conv2d
Relu
Add
Loss
MatMul
VariableV2
Mul
VariableV2
Mul
VariableV2
18
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
キャスト可否判定グラフの例
ステップ 3: "Always" に挟まれた "Maybe"
Placeholder
Mul
Reciprocal
GradFilter
MatMul
Placeholder
GradInput
ReluGrad
LossGrad
MatMul
Conv2d
Relu
Add
Loss
MatMul
VariableV2
Mul
VariableV2
Mul
VariableV2
19
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
キャスト可否判定グラフの例
ステップ 4: "Always" の境界検出
Placeholder
Mul
Reciprocal
GradFilter
MatMul
Placeholder
GradInput
ReluGrad
LossGrad
MatMul
Conv2d
Relu
Add
Loss
MatMul
VariableV2
Mul
VariableV2
Mul
VariableV2
20
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
キャスト可否判定グラフの例
ステップ 5: キャストの挿入
FP16 Cast
Mul
Reciprocal
GradFilter
MatMul
Placeholder
GradInput
ReluGrad
LossGrad
MatMul
Conv2d
Relu
Add
Loss
MatMul
VariableV2
Mul
VariableV2
Mul
VariableV2
Placeholder
FP16 Cast
FP16 Cast
FP32 Cast FP16 Cast
FP32 Cast
FP32 Cast
21
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
AMP
GENERAL PURPOSE
22
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
混合精度演算は汎用的
23
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
混合精度演算による高速化
画像分類に限らず様々なタスクで有効
24
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
AMP
SCHEDULE & USAGE
25
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
自動混合精度演算の有効化
わずか数行の追加で最大 3 倍の高速化
More details: https://developer.nvidia.com/automatic-mixed-precision
TensorFlow
PyTorch
MXNet
os.environ['TF_ENABLE_AUTO_MIXED_PRECISION'] = '1'
amp.init()
amp.init_trainer(trainer)
with amp.scale_loss(loss, trainer) as scaled_loss:
autograd.backward(scaled_loss)
model, optimizer = amp.initialize(model, optimizer)
with amp.scale_loss(loss, optimizer) as scaled_loss:
scaled_loss.backward()
OR
export TF_ENABLE_AUTO_MIXED_PRECISION=1
GA Available Since Q2 2018
GA Coming Soon
GA GTC 19
26
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
CHAINER の MIXED PRECISION 対応
https://github.com/chainer/chainer/pull/6337https://github.com/chainer/chainer/pull/6337
27
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
https://twitter.com/melleo1978/status/1110203991764262913
28
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
NGC の TensorFlow イメージ
19.03 以降は Automatic Mixed Precision 対応
https://ngc.nvidia.com/catalog/containers/nvidia:tensorflow
29
Follow us on Twitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP
ngc.nvidia.com
Automatic Mixed Precision の紹介

Automatic Mixed Precision の紹介

  • 1.
    佐々木邦暢 (@_ksasaki) エヌビディア合同会社 AUTOMATIC MIXEDPRECISION 2019/5/16 GPU Deep Learning Community #11
  • 2.
    2 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP FP32 と FP16 FP32 (単精度) FP16 (半精度) 指数部: 8 ビット、仮数部: 23 ビット 指数部: 5 ビット、仮数部: 10 ビット 表現可能な範囲 1.4 x 10-45 < x < 3.4 x 1038 表現可能な範囲 5.96 x 10-8 < x < 65504
  • 3.
    3 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP FP32 と FP16 モデルのパフォーマンスを最大化 FP32 (単精度) を基準にすると FP16 (半精度) の性能は • 計算のスループット • メモリアクセスのスループット • メモリの消費量 (フットプリント) • 計算のスループット - 8 倍 • メモリアクセスのスループット - 2倍 • メモリの消費量 (フットプリント) - 1/2
  • 4.
    4 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP TENSOR コア 混合精度行列演算ユニット D = FP32 (FP16) FP16 FP16 FP32 (FP16) A0,0 A0,1 A0,2 A0,3 A1,0 A1,1 A1,2 A1,3 A2,0 A2,1 A2,2 A2,3 A3,0 A3,1 A3,2 A3,3 B0,0 B0,1 B0,2 B0,3 B1,0 B1,1 B1,2 B1,3 B2,0 B2,1 B2,2 B2,3 B3,0 B3,1 B3,2 B3,3 C0,0 C0,1 C0,2 C0,3 C1,0 C1,1 C1,2 C1,3 C2,0 C2,1 C2,2 C2,3 C3,0 C3,1 C3,2 C3,3 行列の FMA (Fused Multiply-Add) 4x4 の行列の積和演算を1サイクルで計算する性能: 128 演算/サイクル/Tensor コア、1024 演算/サイクル/SM A B C
  • 5.
    5 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP 混合精度演算で学習を3倍高速化 Tesla V100 搭載のサーバーでの例 Server: NVIDIA DGX-2 | GPU: 1x V100-SXM3-32GB | CPU: Platinum8168 PyTorch: GNMT: 19.01_py3, Dataset: WMT16 English-German | TensorFlow: OpenSeq2Seq(GNMT), 18.11_py3, Dataset: WMT16 English-German | MXNet: ResNet50: 18.12_py3, Dataset: ImageNet2012 Faster Time to Train Increased Data Scientist Productivity Lower TCO 23435 8115 80051 24476 0 20000 40000 60000 80000 100000 PyTorch GNMT TensorFlow OpenSeq2Seq(GNMT) TotalTokens/sec FP32 Mixed 439 1413 0 400 800 1200 1600 MXNet ResNet50Images/sec 3.0X 3.2X 3.4X Scale-up Server 1x V100 GPU
  • 6.
    6 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP Tensor コアによる混合精度演算 精度を妥協することなく高いスループットを実現 ILSVRC12 classification top-1 accuracy. (Sharan Narang, Paulius Micikevicius et al., "Mixed Precision Training“, ICLR 2018) **Same hyperparameters and learning rate schedule as FP32. 0.00% 10.00% 20.00% 30.00% 40.00% 50.00% 60.00% 70.00% 80.00% AlexNet VGG-D GoogleNet (Inception v1) Inception v2 Inception v3 Resnet50 精度 FP32 Mixed Precision**
  • 7.
    7 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP 機械学習のパフォーマンスを 計測する初めてのベンチマークテスト https://mlperf.org/
  • 8.
    8 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP 混合精度演算が MLPERF で勝利 シングルノードでのトレーニング時間 7 部門中 6 部門で NVIDIA GPU が首位を獲得 画像分類 ResNet50 v.1.5 物体検出 (高負荷) Mask R-CNN 物体検出 (軽負荷) SSD 翻訳 GNMT 翻訳 Transformer レコメンデーション NCF 70 分 167 分 14分 10分 19分 0.4分 Test Platform: DGX-2H - Dual-Socket Xeon Platinum 8174, 1.5TB system RAM, 16 x 32 GB Tesla V100 SXM-3 GPUs connected via NVSwitch
  • 9.
    9 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP AMP GRAPH OPTIMIZATION CHOOSING WHAT AND WHERE TO CAST
  • 10.
    10 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP 混合精度演算の自動適用 (AMP) わずか数行のコード追加で AMP を有効化することで、最大 3 倍程度のスピードアップ 演算ごとに適切な精度を利用するためにグラフ最適化技術を活用 TensorFlow, PyTorch, MXNet をサポート 容易な高速化で生産性を向上
  • 11.
    11 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP 勾配のアンダーフロー 勾配の値が 0 に近づくと 0 に丸められてしまう
  • 12.
    12 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP ロス スケーリング 小さな値が FP16 の表現可能範囲に収まるようにスケールする
  • 13.
    13 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP キャストすべきものの選択 1. できる限り FP16 を使うようにする 特に Tensor コアで実行できる操作は効果が大きいので優先 2. 精度を維持することが重要な部分では FP32 を使う 3. FP16 と FP32 間の「キャスト スラッシング」を避ける ガイドライン
  • 14.
    14 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP キャストすべきものの選択 演算を 3+1 のカテゴリに分類 常にキャスト (Always) FP16 化の効果が大きい演算。これらはコストをかけてキャストする価値がある。 例: matmul, conv2d キャストするかも (Maybe) FP16 化によって速くはなるがキャストのコストと見合うとは限らないもの。 例: add, relu キャストしない (Never) 数値的安定性を維持するために FP32 が必要なもの。 例: exp, softmax_cross_entropy_with_logits その他 FP16 実装がないものや入力が浮動小数点型でないもの。
  • 15.
    15 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP キャスト可否判定グラフの例 Placeholder Mul Reciprocal GradFilter MatMul Placeholder GradInput ReluGrad LossGrad MatMul Conv2d Relu Add Loss MatMul VariableV2 Mul VariableV2 Mul VariableV2
  • 16.
    16 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP キャスト可否判定グラフの例 ステップ 1: 演算の色を初期化 Placeholder Mul Reciprocal GradFilter MatMul Placeholder GradInput ReluGrad LossGrad MatMul Conv2d Relu Add Loss MatMul VariableV2 Mul VariableV2 Mul VariableV2
  • 17.
    17 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP キャスト可否判定グラフの例 ステップ 2: "Never" の伝播 Placeholder Mul Reciprocal GradFilter MatMul Placeholder GradInput ReluGrad LossGrad MatMul Conv2d Relu Add Loss MatMul VariableV2 Mul VariableV2 Mul VariableV2
  • 18.
    18 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP キャスト可否判定グラフの例 ステップ 3: "Always" に挟まれた "Maybe" Placeholder Mul Reciprocal GradFilter MatMul Placeholder GradInput ReluGrad LossGrad MatMul Conv2d Relu Add Loss MatMul VariableV2 Mul VariableV2 Mul VariableV2
  • 19.
    19 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP キャスト可否判定グラフの例 ステップ 4: "Always" の境界検出 Placeholder Mul Reciprocal GradFilter MatMul Placeholder GradInput ReluGrad LossGrad MatMul Conv2d Relu Add Loss MatMul VariableV2 Mul VariableV2 Mul VariableV2
  • 20.
    20 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP キャスト可否判定グラフの例 ステップ 5: キャストの挿入 FP16 Cast Mul Reciprocal GradFilter MatMul Placeholder GradInput ReluGrad LossGrad MatMul Conv2d Relu Add Loss MatMul VariableV2 Mul VariableV2 Mul VariableV2 Placeholder FP16 Cast FP16 Cast FP32 Cast FP16 Cast FP32 Cast FP32 Cast
  • 21.
    21 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP AMP GENERAL PURPOSE
  • 22.
    22 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP 混合精度演算は汎用的
  • 23.
    23 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP 混合精度演算による高速化 画像分類に限らず様々なタスクで有効
  • 24.
    24 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP AMP SCHEDULE & USAGE
  • 25.
    25 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP 自動混合精度演算の有効化 わずか数行の追加で最大 3 倍の高速化 More details: https://developer.nvidia.com/automatic-mixed-precision TensorFlow PyTorch MXNet os.environ['TF_ENABLE_AUTO_MIXED_PRECISION'] = '1' amp.init() amp.init_trainer(trainer) with amp.scale_loss(loss, trainer) as scaled_loss: autograd.backward(scaled_loss) model, optimizer = amp.initialize(model, optimizer) with amp.scale_loss(loss, optimizer) as scaled_loss: scaled_loss.backward() OR export TF_ENABLE_AUTO_MIXED_PRECISION=1 GA Available Since Q2 2018 GA Coming Soon GA GTC 19
  • 26.
    26 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP CHAINER の MIXED PRECISION 対応 https://github.com/chainer/chainer/pull/6337https://github.com/chainer/chainer/pull/6337
  • 27.
    27 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP https://twitter.com/melleo1978/status/1110203991764262913
  • 28.
    28 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP NGC の TensorFlow イメージ 19.03 以降は Automatic Mixed Precision 対応 https://ngc.nvidia.com/catalog/containers/nvidia:tensorflow
  • 29.
    29 Follow us onTwitter! @NVIDIAAIJP ハッシュタグ: #GDLCJP ngc.nvidia.com