141

投稿日

更新日

NVIDIA GPUスペック(機械学習用)

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 の子会社。

情報源

以下、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

Google

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

情報源 https://www.xilinx.com/support/documentation/selection-guides/ultrascale-plus-fpga-product-selection-guide.pdf

クラウドのコスト比較

会社 種別 マシン名 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
Google CPU n2-highcpu-80 40 7.68 0.6944 11.06
Google GPU n1-highcpu-4
+ T4
2 65 8.1 0.14 464.29 57.86
Google GPU a2-highgpu-1g 6 312 19.5 1.153 270.60 16.91
Google 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 の窓口で聞いたところ、

  1. 請求先アカウント別のリソース quota (利用者からは見られない)
  2. プロジェクト別のリソース quota (利用者から見られる)

の2つがあるそうです。https://cloud.google.com/compute/quotas には執筆時現在はプロジェクト別のリソース quota の方しか記載がありません。プロジェクト別 ≦ 請求先アカウント別 の制限があるそうです。プロジェクト別のリソース quota の方は48時間以内に対応するとなっているのですが、$10/h 程度の規模感の場合、請求先アカウント別のリソース quota の引き上げも必要です。

その際は、

  1. https://console.cloud.google.com/iam-admin/quotas から申請する
  2. アメリカ本社から日本のセールスに再度申請して欲しいと言われる
  3. セールスの窓口に申請すると、担当者を割り振るというメールをいただく
  4. 担当者が割り振られ、リソースの割り当てが完了する

という手順をたどります。1ステップ1週間程度かかり、合計1か月程度かかりました。最悪3か月程度はかかることを見越して早めに申請されることをお勧めします。

分散化の方法

1つだけスポットではない落ちないサーバー(親ノード)を立て、ここに NFS サーバーも立てます。Google Cloud の場合、インスタンステンプレートを作り、そこからインスタンスグループを立ち上げるとインスタンス(子ノード)を一気に立ち上げられます。インスタンステンプレートのメタデータで startup-script と shutdown-script で起動時と終了時に実行するスクリプトを指定できます。

処理の流れはこうなります。

  1. 落ちない親ノードにキューとそのサーバーソケットを開いて、子ノードを待ちます。通信がボトルネックにならない粒度で問題を細かく分割してキューに詰めます。
  2. インスタンスグループで子ノードを立ち上げます。
  3. 子ノードは startup-script で rsync して親ノードからソースコードをダウンロードし、プログラムを開始します。
  4. 子ノードは親ノードのサーバーソケットから、(分割された問題に不変な)計算全体に必要なデータをダウンロードします。Cloud Storage や S3 からダウンロードしても良いです。マシンイメージに大量のデータを入れるのは起動が遅くなるので止めた方が良いです。
  5. 子ノードは親ノードのキューから1つ取りだし、問題を解き、計算結果を親ノードにソケットで返したり、親ノードの NFS にファイルとして返します。
  6. スポットインスタンスが強制終了する際に 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年遅れ

新規登録して、もっと便利にQiitaを使ってみよう

  1. あなたにマッチした記事をお届けします
  2. 便利な情報をあとで効率的に読み返せます
ログインすると使える機能について

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
新規登録
すでにアカウントを持っている方はログイン
141