NVIDIAのサーバー用(旧NVIDIA Tesla)
単位はTFLOPS(全て行列積)。メモリ帯域の単位はGB/s。
2019年よりTeslaという名称は消えました。NVIDIA Tesla V100 → NVIDIA V100。
Hopper
H100 SXM |
H100 PCIe |
|
---|---|---|
INT8 | 2000 | 1600 |
FP8 | 2000 | 1600 |
FP16 BF16 |
1000 | 800 |
TF32 | 500 | 400 |
FP32 | 60 | 48 |
FP64 | 60 | 48 |
メモリ | 80GB | 80GB |
メモリ帯域 | 3TB/s | 2TB/s |
発売日 | 2022年Q3 | 2022年Q3 |
新たに FP8 に対応。E5M2(指数部5ビット、仮数部2ビット)、E4M3(指数部4ビット、仮数部3ビット)に対応。Ampere 同様、疎行列は密行列の倍の性能で動作します。
A100→H100が2年半で3倍の性能向上なので、10年で100倍のムーアの法則は2022年でも健在ですね。
Ampere
CUDA コア数 |
Tensor コア数 |
MHz | INT8 | FP16 BF16 |
TF32 | FP32 | FP64 | メモリ 帯域 |
発表年 | |
---|---|---|---|---|---|---|---|---|---|---|
A100 | 6912 | 432 | 1410 | 624 | 312 | 156 | 19.5 | 19.5 | 1555 | 2020/5 |
A40 | 10752 | 336 | 1740 | 299.3 | 149.7 | 74.8 | 37.4 | 696 | 2020/10 | |
A30 | 3584 | 224 | 1440 | 330 | 165 | 82 | 10.3 | 10.3 | 933 | 2021/4 |
A16 | 1280 * 4 | 40 * 4 | 1695 | 35.9 * 4 | 17.9 * 4 | 9 * 4 | 4.5 * 4 | 200 * 4 | 2021/4 | |
A10 | 9216 | 288 | 1695 | 250 | 125 | 62.5 | 31.2 | 600 | 2021/4 | |
A2 | 1280 | 40 | 1770 | 36 | 18 | 9 | 4.5 | 200 | 2021/11 | |
GeForce RTX 3090 |
10496 | 328 | 1695 | 285 | 142 | 71 | 36 | 1.1 | 936 | 2020/9 |
TF32という19ビットで表現する浮動小数点数を新設。指数部はFP32やbfloat16と同じ8ビットで、仮数部はFP16と同じ10ビット。https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/ 。bfloat16もサポート。INT4もINT8の倍の性能で対応。疎行列の高速化にも対応し、密行列の倍の性能で動作します。
対応クラウド(全てA100)
- EC2 p4d
- Google A2
- Azure NDv4
クラウドは Google が1台に16GPU、AWS と Azure が1台に8GPU。マシンの通信回線帯域は AWS が 0.4 Tbps、Google が 0.1 Tbps、Azure が 1.6 Tbps で、AWS と Azure は低遅延回線。
Turing
CUDA コア数 |
Tensor コア数 |
MHz | INT8 | FP16 | FP32 | メモリ 帯域 |
発表年 | クラウド | |
---|---|---|---|---|---|---|---|---|---|
T4 | 2560 | 320 | 1582 | 130 | 65 | 8.1 | 320 | 2018/9 | EC2 g4dn Google T4 Azure NCasT4_v3 Alibaba gn6i |
GeForce RTX 2080 Ti |
4352 | 544 | 1350 | 215 | 108 | 11.8 | 616 | 2018/8 |
INT4もINT8の倍の性能で対応。
Volta
コア数 | MHz | INT32 | FP16 | FP32 | FP64 | メモリ 帯域 |
発表年 | クラウド | |
---|---|---|---|---|---|---|---|---|---|
V100 (NVLink) |
5120 | 1455 | 14.90 | 119.19 | 14.90 | 7.45 | 900 | 2017/5 | EC2 p3 Google V100 Azure NCv3 Azure NDv2 Alibaba gn6v |
V100 (PCIe) |
5120 | 1370 | 14.02 | 112.23 | 14.02 | 7.01 | 900 | 2017/7 |
Tensor Core を搭載し、入力FP16・出力FP32の4行4列の行列積が出来るようになり、かつ、高速化。INT32対応。
Pascal
コア数 | MHz | INT8 | FP16 | FP32 | FP64 | メモリ 帯域 |
発表年 | クラウド | |
---|---|---|---|---|---|---|---|---|---|
P100 (NVLink) |
3584 | 1480 | x | 21.205 | 10.609 | 5.304 | 720 | 2016/4 | |
P100 (PCIe) |
3584 | 1300 | x | 18.636 | 9.318 | 4.659 | 720 | 2016/4 | Google P100 Azure NCv2 Alibaba gn5 |
P40 | 3840 | 1531 | 47.032 | x | 11.758 | 0.367 | 345.6 | 2016/9 | Azure ND |
P4 | 2560 | 1063 | 21.770 | x | 5.443 | 0.170 | 192 | 2016/9 | Google P4 Alibaba gn5i |
GeForce GTX 1080 Ti |
3584 | 1582 | x | 0.177 | 11.340 | 0.354 | 484 | 2017/3 |
一部 INT8 対応。
Maxwell
コア数 | MHz | FP16 | FP32 | FP64 | メモリ 帯域 |
発表年 | クラウド | |
---|---|---|---|---|---|---|---|---|
M60 | 2048 * 2 | 1180 | 9.667 * 2 | 4.833 * 2 | 0.156 * 2 | 160 * 2 | 2015/8 | EC2 g3 Azure NV |
M40 | 3072 | 1114 | 13.689 | 6.844 | 0.219 | 288 | 2015/11 | Alibaba gn4 |
M10 | 640 * 4 | 1033 | 2.644 * 4 | 1.322 * 4 | 0.041 * 4 | 83 * 4 | 2016/5 | |
M6 | 1536 | 1051 | 6.457 | 3.229 | 0.100 | 147.2 | 2015/8 | |
M4 | 1024 | 1072 | 4.391 | 2.195 | 0.069 | 88 | 2015/11 | |
GeForce GTX 980 Ti |
2816 | 1076 | x | 6.060 | 0.189 | 336 | 2015/6 |
FP16 対応。
Kepler
コア数 | MHz | FP32 | FP64 | メモリ帯域 | 発表年 | クラウド | |
---|---|---|---|---|---|---|---|
K80 | 2496 * 2 | 875 | 4.368 * 2 | 1.456 * 2 | 240 * 2 | 2014/11 | EC2 p2 Azure NC Google K80 Oracle OCSG |
K40 | 2880 | 875 | 5.040 | 1.680 | 288 | 2013/10 | |
GRID K520 | 1536 * 2 | 800 | 2.458 * 2 | 0.096 * 2 | 160 * 2 | 2013/7 | EC2 g2 |
GRID K340 | 384 * 4 | 950 | 0.730 * 4 | 28.8 * 4 | 2013/7 | ||
K20 | 2496 | 706 | 3.524 | 1.175 | 208 | 2012/11 | |
K10 | 1536 * 2 | 745 | 2.289 * 2 | 0.763 * 2 | 160 * 2 | 2012/5 |
Fermi
コア数 | MHz | FP32 | FP64 | 発表年 | クラウド | |
---|---|---|---|---|---|---|
M2090 | 512 | 1300 | 1.331 | 0.665 | 2011/5 | |
M2070 | 448 | 1150 | 1.030 | 0.515 | 2011/5 | |
M2050 | 448 | 1150 | 1.030 | 0.515 | 2011/5 | EC2 cg1 |
FP32 : FP64
- Ampere(CUDAコア) = 2 : 1
- Volta = 2 : 1
- Pascal(P100) = 2 : 1
- Pascal(P100以外) = 16 : 1
- Maxwell = 32 : 1
- Kepler = 3 : 1
- Fermi = 2 : 1
NVIDIA Tegra
コア数 | MHz | INT8 | FP16 | FP32 | メモリ帯域 | 発表年 | ||
---|---|---|---|---|---|---|---|---|
Jetson AGX Orin | GPU DLA2つ |
2048 ? |
1000 ? |
合計200 (DLA 97) |
? | 4.1 | 204.8 | 2021/11 |
Jetson Xavier NX | GPU DLA2つ |
384+48 ? |
1100 1100 |
21 4.5 * 2 |
6 ? |
51.2 | 2019/11 | |
Jetson Nano | GPU | 128 | 921 | x | 0.472 | 25.6 | 2019/3 | |
Jetson AGX Xavier | GPU DLA2つ |
512 ? |
1377 ? |
22 5 * 2 |
11 2.5 * 2 |
1.5 x |
137 | 2018/6 |
Jetson TX2 | GPU | 256 | 1302 | x | 1.333 | 0.666 | 58.3 | 2016/8 |
Jetson TX1 | GPU | 256 | 998 | x | 1.022 | 0.511 | 25.6 | 2015/1 |
Jetson TK1 | GPU | 192 | 950 | x | x | 0.365 | 14.9 | 2014/1 |
DLA は deep learning accelerator の略。
Jetson AGX Orin は Ampere 世代。15, 30, 50 W。
Jetson Xavier NX は Volta 世代。10W と 15W があり、上記は15W版。NVIDIA Jetson Xavier NX Developer Kit では Raspberry Pi 用のカメラが2つ接続できる。M.2 NVMe SSD が搭載可能。10W の方はファンレスで動きそう(推測)。https://devblogs.nvidia.com/jetson-xavier-nx-the-worlds-smallest-ai-supercomputer/
Jetson Nano は Jetson TX1 と同じ Maxwell 世代。NVIDIA はリアルタイム画像認識が出来る最低ラインだとしている。 https://devblogs.nvidia.com/jetson-nano-ai-computing/
Jetson AGX Xavier は Volta 世代。Tesla V100 の 1/10 サイズの GPU。Tensor Core は FP16 に加えて INT8 も対応。NVDLA を搭載。今までは Tegra は Tesla のムーアの法則7年遅れだったが30Wにして6年遅れにターゲット変更。組み込みレベルからノートパソコンレベルへ変更。ただし10Wや15Wモードも搭載。https://devblogs.nvidia.com/nvidia-jetson-agx-xavier-32-teraops-ai-robotics/
NVIDIA Drive PX 2 AutoCruise には Parker に加えて 1.25 TFLOPS / 2 GB (GDDR5, 80 GB/s) の外部 GPU も2つ搭載。ノートパソコン向け GeForce 10 シリーズのローエンドレベル。
Intel
Intel Xeon
型番 | アーキテクチャ | コア数 | GHz | FP32 | FP64 | メモリ帯域 | 年 |
---|---|---|---|---|---|---|---|
Xeon Platinum 9282 | Cascade Lake | 56 | 3.8 | 262.26 | 2019 | ||
Xeon Platinum 8180 | Skylake | 28 | 3.2 | 5.734 | 2.867 | 119.21 | 2017 |
E7-8890 v4 | Broadwell | 24 | 3.4 | 2.611 | 1.306 | 85 | 2016 |
E7-8890 v3 | Haswell | 18 | 3.3 | 1.901 | 0.950 | 85 | 2015 |
E7-8890 v2 | Ivy Bridge | 15 | 3.4 | 0.816 | 0.408 | 85 | 2014 |
E5-2687W | Sandy Bridge | 8 | 3.8 | 0.486 | 0.243 | 51.2 | 2012 |
すいません。クロック周波数は「全てのコアを使用するが AVX を使用しない場合」のクロック周波数で、AVX を使う場合は、もっとクロックが下がるそうです。Xeon Platinum 8180 は 3.2 → 2.3 GHz で、本当は 4.122 TFLOPS。
1コア・1クロックあたりの演算数(FP32)
- AVX-512: Skylake, Cascade Lake = 64
- AVX2: Haswell, Broadwell = 32
- AVX1: Sandy Bridge, Ivy Bridge = 16
Intel GPU
型番 | INT8 | FP16 BF16 |
FP32 | 年 |
---|---|---|---|---|
Ponte Vecchio | 180? | 90? | 45 |
FP32 以外は資料からの僕の推定です。
Intel Xeon Phi
コア数 | MHz | FP32 | 発表年 | |
---|---|---|---|---|
7295 | 72 | 1500 | 14 | 2017/12 |
Habana Labs (Intel)
用途 | INT8 | BF16 | FP32 | 発表年 | クラウド | |
---|---|---|---|---|---|---|
Gaudi HL-2000 | 学習 | 2019 | EC2 | |||
Goya HL-100 | 推論 | x | 2018 |
TFLOPS の形での性能は非公開。2021年より Gaudi が AWS で使えるようになります。
Intel Nervana
コア数 | flex16+5 | 発表年 | |
---|---|---|---|
NNP-L1000 | 120 | 2019 | |
Lake Crest | 12 | 39 | 2017 |
Lake Crest の性能は理論性能の96.4%が38TOPSという事から逆算。 https://pc.watch.impress.co.jp/docs/news/1123602.html
2020年2月に Nervana は終了。Habana Labs に注力。
Intel Movidius
コア数 | MHz | INT8 | FP16 | 発表年 | |
---|---|---|---|---|---|
Myriad X MA2485 | 16 | 1 | 2017/8 | ||
Myriad 2 MA2450 | 12 | 600 | 0.2? | 0.1? | 2014/9 |
Intel Neural Compute Stick 2 は Myriad X を搭載。
Myriad 2 MA2450 は、おそらく 128bit / 16bit * 2 * 12コア * 0.6GHz / 1000 = 0.1152 TFLOPS (FP16) だと思われます。性能は曖昧な形で発表しています。上記とは別にHoGやガンマ補正など各種画像処理の専用回路も多数搭載。メモリもLPDDR2ですし、速度的にはRaspberry Piレベルのチップと釣り合うレベル。LPDDR4のIntel AtomだとCPUの方が速くてバランスが悪いです。
MobileEye (Intel)
自動運転用のチップ。Intel の子会社。
情報源
- http://wccftech.com/tesla-autopilot-story-in-depth-technology/5/
- http://www.mobileye.com/wp-content/uploads/2016/11/Mobileye_EyeQ_Infographic6-002.pdf
- https://car.watch.impress.co.jp/docs/topic/special/1295382.html
以下、TOPS は INT8 か?
EyeQ6
CPU コア数 |
INT8 | BF16? | GPU | 発売年 | |
---|---|---|---|---|---|
EyeQ Ultra | 12 | 176 | 4.20 | 0.256 | 2025 |
EyeQ6 High | 8 | 34 | 1.00 | 0.064 | 2024 |
EyeQ6 Light | 2 | 5 | 0.72 | 2023/Q2 |
PMA, VMP, MPC, XNN という4種類のアクセラレーターを CPU や GPU とは別に搭載。XNN はニューラルネットワーク用。CPU は EyeQ Ultra は RISC-V で EyeQ6 High と Light は MIPS64 。プロセスルールは EyeQ Ultra が5nmで、それ以外は7nm。
EyeQ5
2021年発売予定。プロセスルール7nm。
種別 | コア数 |
---|---|
CPU | 8 |
Computer Vision Processors | 18 |
- 7 TOPS @ 7.5W
- 12 TOPS @ 17 W
- 24 TOPS @ 34 W
EyeQ4
2018年出荷。下記4種類を1つにまとめた物。プロセスルールは28nm。
種別 | コア数 | MHz | MAC/コア | TOPS |
---|---|---|---|---|
CPU | 4 | 1000 | 32? | 0.256? |
VMP (Vector Microcode Processors) | 6 | 1000 | 76 | 0.912 |
PMA (Programmable Macro Array) | 2 | 750 | 372 | 1.116 |
MPC (Multithreaded Processing Clusters) | 2 | 1000 | 32 | 0.128 |
- 1.1 TOPS @ 4.5W
- 2.2 TOPS @ 6.5 W
EyeQ3
2014年出荷。テスラモーターズ等に採用。TDP 2.5W。プロセスルールは40nm。
コア数 | MHz | MAC/コア | TOPS |
---|---|---|---|
4 | 500 | 64 | 0.256 |
EyeQ2
2010年出荷。TDP 2.5W。プロセスルールは90nm。0.026 TOPS。
EyeQ1
2008年出荷。TDP 2.5W。プロセスルールは180nm。4.4 GOPS。
AMD
INT8 | FP16 | BF16 | FP32 | FP64 | メモリ 帯域 |
発表年 | クラウド | |
---|---|---|---|---|---|---|---|---|
Instinct MI250X | 383 | 383 | 383 | 95.7 | 95.7 | 3200 | 2021/11 | |
Instinct MI100 | 184.6 | 184.6 | 92.3 | 46.1 | 11.5 | 1200 | 2020/11 | |
Instinct MI25 | 24.6 | 12.3 | 0.8 | 484 | 2017/6 | Azure NVv4 |
Tensor Processing Unit
MAC数 | MHz | INT8 | BF16 | メモリ帯域 | 開発年 | クラウド | |
---|---|---|---|---|---|---|---|
v4 | x | 275 | 2020 | ||||
v3 | x | 105 | 2018 | Google TPU v3 | |||
v2 | 32768 | 700 | x | 45 | 600 | 2017 | Google TPU v2 |
v1 | 65536 | 700 | 92 | x | 2015 |
v2は1つのTPU Chipに2コア。1コアにつき128 * 128 = 16384個の積和算回路。TPU Chipに2 * 8 = 16GBのメモリ。上記はTPU Chipの情報。1つのTPUボードに4つのTPU Chip搭載。メモリは合計4 * 16GB/TPUボード。TPU Podは64TPUボード。コア→TPU Chip→TPUボード→TPU Podという階層構造。単にTPUと呼んだ場合は1枚のTPUボードの事をさす。bfloat16を採用。符号部1ビット、指数部8ビット、仮数部7ビット。仮数部以外はfp32と同じ。
v1も発表は2017年。
Edge TPU
MAC数 | MHz | INT8 | BF16 | 開発年 | |
---|---|---|---|---|---|
Edge TPU | 4096 | 480 | 4 | x | 2018 |
何種類かシングルボードコンピュータあり。
Amazon
用途 | INT8 | FP16 BF16 |
FP32 | 年 | クラウド | |
---|---|---|---|---|---|---|
AWS Trainium | 学習 | 210 | 2021 | EC2 Trn1 | ||
AWS Inferentia | 推論 | 128 | 64 | x | 2019 | EC2 inf1 |
Amazon Elastic Inference | 推論 | x | 8 | 1 | 2018 | EC2 eia1, eia2 |
AWS Inferentia と Amazon Elastic Inference はディープラーニングの推論用であり、学習は GPU を使ってください、という方針。学習はバッチ処理により複数のデータをまとめて処理するが、推論は1つのデータしか扱わないため、処理の向き不向きが異なるため、推論用に作られたチップ。
Apple
Apple Neural Engine
INT8 | 発表年 | |
---|---|---|
A16 Bionic | 17 | 2022/9 |
M2 A15 Bionic |
15.8 | 2022/6 2021/9 |
M1 A14 Bionic |
11 | 2020/11 2020/9 |
A13 Bionic | 6 | 2019/9 |
A12 Bionic | 5 | 2018/9 |
A11 Bionic | 0.6 | 2017/9 |
Apple 内蔵GPU (ARM)
FP16 | FP32 | FP64 | 発表年 | |
---|---|---|---|---|
M2 | 7.10 | 3.55 | 0.89 | 2022/6 |
M1 Max 32コア |
20.8 | 10.4 | 2021/10 | |
M1 | 5.22 | 2.61 | 0.65 | 2020/11 |
ARM
INT8 | 発表年 | |
---|---|---|
Ethos-N78 | 10 | 2020/5 |
Ethos-N77 | 4 | 2019/5 |
Arm Compute Library を経由して利用可能です(当然、その上に上位ライブラリを経由して利用する前提です)。
Qualcomm Snapdragon
INT8 | 発表年 | |
---|---|---|
Hexagon 780 | 26 | 2020/12 |
Hexagon 698 | 15 | 2019/12 |
Hexagon 690 | 7 | 2018/12 |
Hexagon 685 | 3 | 2017/12 |
Google Pixel 4 は Snapdragon 855 (Hexagon 690) ですが、実測のベンチマーク結果が https://www.tensorflow.org/lite/performance/measurement#android_performance_benchmarks にあります。ベンチマーク結果を見て思ったのですが、専用回路を止めて GPU で INT8 を扱った方が良いのではないでしょうか?
(2014~2016年の話)ハイエンドの GPU は NVIDIA Tegra とほぼ同じ性能です。Snapdragon には Hexagon DSP が搭載されていて、8/16/32bitの固定小数点が扱えます。GPU の半分の性能で設計されていますが、8bitが扱えることが特徴です。
Huawei
Ascend
INT8 | FP16 | 発表年 | |
---|---|---|---|
Ascend 910 | 512 | 256 | 2019/8 |
Ascend 310 | 16 | 8 | 2019/8 |
Kirin NPU
NPU数 | FP16 | 発表年 | |
---|---|---|---|
Kirin 990 5G | 2 | 5? * 2 | 2019/9 |
Kirin 980 | 2 | 2.1? * 2 | 2018/9 |
Kirin 970 | 1 | 1.92 | 2017/9 |
Kirin 990 5G は 980 から2.5倍の高速化だそうですが詳細不明。INT8 も対応。
Kirin 980 の NPU の詳細は非公開ですが、NPU が1つから2つに増え、合計して2.2倍高速になったと書いてあったので、そこから逆算して10%高速になったと推測しました。
Kirin 970 の NPU は3行3列の行列積。HiKey 970 などのファンレスシングルボードコンピュータあり。TensorFlow や Caffe が利用可能。
PowerVR
INT8 | 発表年 | |
---|---|---|
AX2185 | 4.1 | 2018/6 |
AX2145 | 1.0 | 2018/6 |
AX2185, AX2145 は Android Neural Networks API 経由で利用可能。
Rockchip
INT8 | 発表年 | |
---|---|---|
RK3588 | 6 | 2021 |
RK3399Pro | 2.4 | 2018/1 |
Preferred Networks
型番 | FP16 | FP32 | FP64 | 年 |
---|---|---|---|---|
PFN MN-Core | 131 | 32.75 | 8.19 | 2020 |
1つのパッケージには4つのダイがあり、パッケージの性能で発表しているのですが、上記は4で割ったダイの性能です。報道の感じだと2020年稼働で社内利用専用か?
自動車メーカーのTesla
型番 | INT8 | FP16 | FP32 | 年 |
---|---|---|---|---|
Dojo D1 | 362 | 22.6 | 2021/8 | |
? | 36 | 0.6 | ? | 2019 |
Dojo D1 はサーバー用。
2019年のは車載用で、NNプロセッサ+GPU+CPUの組合せ。NNプロセッサがINT8、GPUが浮動小数を扱える。
Graphcore
型番 | MHz | FP16 | FP32 | 発表年 | クラウド |
---|---|---|---|---|---|
Colossus MK2 GC200 | 1325 | 250 | 62.5 | 2020/7 | Azure NDv3 |
GPUではなくIPUと呼んでいます。MK2は1IPUに1472タイルあり、1タイルに624KBのSRAMを搭載。それぞれのタイルが異なる計算を並列に実行可能。よって、小さなバッチサイズでも動作するそうです。Azureでは1台に16IPU。
Xilinx Virtex
型番 | DSP | INT8 | クラウド |
---|---|---|---|
UltraScale+ VU9P | 6840 | 21.3 | EC2 f1 Alibaba f3 |
クラウドのコスト比較
会社 | 種別 | マシン名 | CPU コア数 |
FP16 | FP32 | 価格 | コスパ FP16 |
コスパ FP32 |
---|---|---|---|---|---|---|---|---|
Amazon | CPU | t3.nano | 1 | 0.192 | 0.0516 | 3.72 | ||
Amazon | CPU | c5.24xlarge | 48 | 9.216 | 1.5546 | 5.93 | ||
Amazon | inf1.xlarge | 2 | 64 | 0.1104 | 579.71 | |||
Amazon | GPU | g4dn.xlarge | 2 | 65 | 8.1 | 0.1578 | 411.91 | 51.33 |
Amazon | GPU | p3.2xlarge | 4 | 119.194 | 14.89 | 0.9180 | 129.84 | 16.22 |
CPU | n2-highcpu-80 | 40 | 7.68 | 0.6944 | 11.06 | |||
GPU | n1-highcpu-4 + T4 |
2 | 65 | 8.1 | 0.14 | 464.29 | 57.86 | |
GPU | a2-highgpu-1g | 6 | 312 | 19.5 | 1.153 | 270.60 | 16.91 | |
TPU | n1-highcpu-4 + TPU v3 |
2 | 420 | 2.43 | 172.84 | |||
Azure | CPU | F72s v2 | 36 | 6.912 | 0.6974 | 9.91 | ||
Azure | GPU | NC4as T4 v3 | 4 | 65 | 8.1 | 0.2104 | 308.94 | 38.50 |
全てスポットインスタンスです。価格は2020年12月22日の米国インスタンスの価格。価格の単位はドル/時。コスパの単位は TFLOPS・時/ドル 。CPU のクロックは全て 3.0 GHz (ブースト) として計算(やや不正確です)。
t3.nano は t3 unlimited を使う前提です。そして Intel MKL など Hyper-Threading を使わない前提です。t3 unlimited は稼働時しかコストが発生しないので、c5.18xlarge 比だと平均負荷が4割以下、Google n2-highcpu 相手で平均負荷が3割以下で、t3.nano の方がコスパが良くなります。embarrassingly parallel でなく、かつ、複数のマシンに分割可能なタスクに対して効果的です。とは言えども、可能であれば、正攻法の"通信がボトルネックにならない粒度でタスクを細かく分割してキューにつめ、計算ノードの負荷を均一にする"という手法の方が良いと思います。
$10/h ルール
クラウドで金銭的に暴走しない自主規制ルールとして$10/h(1000円/時)というルールがあります。月720時間使っても72万円です。個人の裁量としてここまでは自由に使って良いという会社さんもあるようです。
Google Cloud の $10/h ルールの場合の上限(スポット)
種別 | 個数 |
---|---|
n2-highcpu | 1152 vCPU (576コア) |
NVIDIA T4 | 71 GPU |
NVIDIA A100 | 8 GPU |
TPU v3 | 4 TPU |
マシンの台数は100~200台を限度にしないと面倒なことになるので、CPUの場合は n2-highcpu-8 を144台が上限になります。クラウドの傾向として、多くのマシンは負荷を限界まで使っていないため、どうも、1つ1つのvCPUを少なめにして、多くのマシンにばらけさせた方が、発熱の制限が余っていたり、L3キャッシュやメモリ帯域は共有なので、1つ1つの処理速度を上げられて高速に動作します。あとは台数の数の制限で、現在は、n2-highcpu-8 がちょうどだと思います。(もちろん計算する内容次第で highmem だったり色々です)
Google Cloud のリソースの割り当てを増やすのにかかる日数
昔は違ったのですが、2021年12月現在は、Google の窓口で聞いたところ、
- 請求先アカウント別のリソース quota (利用者からは見られない)
- プロジェクト別のリソース quota (利用者から見られる)
の2つがあるそうです。https://cloud.google.com/compute/quotas には執筆時現在はプロジェクト別のリソース quota の方しか記載がありません。プロジェクト別 ≦ 請求先アカウント別 の制限があるそうです。プロジェクト別のリソース quota の方は48時間以内に対応するとなっているのですが、$10/h 程度の規模感の場合、請求先アカウント別のリソース quota の引き上げも必要です。
その際は、
- https://console.cloud.google.com/iam-admin/quotas から申請する
- アメリカ本社から日本のセールスに再度申請して欲しいと言われる
- セールスの窓口に申請すると、担当者を割り振るというメールをいただく
- 担当者が割り振られ、リソースの割り当てが完了する
という手順をたどります。1ステップ1週間程度かかり、合計1か月程度かかりました。最悪3か月程度はかかることを見越して早めに申請されることをお勧めします。
分散化の方法
1つだけスポットではない落ちないサーバー(親ノード)を立て、ここに NFS サーバーも立てます。Google Cloud の場合、インスタンステンプレートを作り、そこからインスタンスグループを立ち上げるとインスタンス(子ノード)を一気に立ち上げられます。インスタンステンプレートのメタデータで startup-script と shutdown-script で起動時と終了時に実行するスクリプトを指定できます。
処理の流れはこうなります。
- 落ちない親ノードにキューとそのサーバーソケットを開いて、子ノードを待ちます。通信がボトルネックにならない粒度で問題を細かく分割してキューに詰めます。
- インスタンスグループで子ノードを立ち上げます。
- 子ノードは startup-script で rsync して親ノードからソースコードをダウンロードし、プログラムを開始します。
- 子ノードは親ノードのサーバーソケットから、(分割された問題に不変な)計算全体に必要なデータをダウンロードします。Cloud Storage や S3 からダウンロードしても良いです。マシンイメージに大量のデータを入れるのは起動が遅くなるので止めた方が良いです。
- 子ノードは親ノードのキューから1つ取りだし、問題を解き、計算結果を親ノードにソケットで返したり、親ノードの NFS にファイルとして返します。
- スポットインスタンスが強制終了する際に shutdown-script が走るので、親ノードに離脱する旨をソケットで返します。計算が完了しなかった旨を親ノードに通知して、キューに詰め直し、別の子ノードに振り分けます。
なお Google Cloud のドキュメントによると「まれに」、ちゃんと計測はしていませんが5%位の確率で shutdown-script が実行されずにインスタンスが突然終了します。なので、インスタンスが生きているかどうか定期的にポーリングして死活監視する必要があります。Java ならば InetAddress.html.isReachable() で死活監視できます。
普通の LAN ではなく NVLink や高速な通信回線を使用する場合は、当然、方法は変わります。
(親ノードではなく)子ノードから計算したい内容をキューに詰めて、子ノードで計算結果を受け取るのは、子ノードのインスタンスが強制終了させられる状況では、継続渡しスタイルが必要になると思うのですが、多くのケースで厄介だと思います。
Java の場合の Tips
Java の場合は、ラムダ式をシリアライゼーションして送信してしまうと便利ですが、問題点はラムダ式から親スコープの変数にアクセスしている場合、それらを含んでシリアライゼーションするのですが、一体、何を送信するのかが分かりにくいです。自明な場合以外は XStream の toXML() を使って XML にしてシリアライゼーション内容を確認すると便利でした。Java の static フィールドや Scala の object のフィールドはラムダ式からアクセスしてもシリアライゼーション対象外なので、大規模データは static フィールドなどに置くと便利です。
更に、Scala の場合は、def distributedMap[A, B](childrenCount: Int, machineType: String, nvcpu: Int)(tasks: Seq[A])(fn: A => B): Seq[B]
こんな感じの分散化マップを自作すると良いです。distributedMap 内からクラウドのインスタンスグループを作成してしまいます(distributedMap が2回目に呼ばれる際は共有して利用)。タスク非依存のデータはサイズが小さい場合(1KB以下など)はラムダ式 fn の親スコープの変数に置き、fn をシリアライゼーションする際に自動的についてくるので、fn を送信する際にまとめて送ってしまいます。distributedMap を実行する度に fn を送信するので、サイズが大きいデータは object のフィールドに置きます。
Scala の並列コレクションと共存させるには、並列コレクションは「CPUを使用しない長時間処理は blocking {} で包むこと」というルールがあるので、distributedMap の中の子ノードからの計算結果待ちの所を blocking で包めば、並列コレクションの .par.map()
の所を distributedMap()
に置き換えることが出来ます。多重ループを綺麗に並列化かつ分散化処理として記述することが出来ます。
総括
- 5年で10倍速くなるムーアの法則は健在。(モバイルの通信速度も5年で10倍速くなっています)
- Tegra は Tesla の7年遅れ
コメント