GPUサーバ増設とA6000のベンチマーク


こんにちは、先進技術部の松林です。自己紹介は昨年(2020年)の「A100はじめました」というブログ記事に執筆いたしましたが、大学院で重力相互作用専用スパコンのGRAPEを利用していた影響もあり、未だにスパコンや並列計算による高速化と言うのが好きな人です。 さて、ALBERTの先進技術部では、昨年末にDGX A100を導入し、動画分析や3D認識の研究などに利用してきました。今回はこのDGX A100に加えて、A6000を8枚積んだ8GPUサーバを新たに4台導入し、合計40GPUのGPUクラスタシステムを導入しました。DGX A100をさらに導入する計画もありましたが、夏期インターンに向けてGPUを早期に拡充しておきたい点と、社内での利用者増加を見越してバランス重視で、A6000のシステム導入を決めました。 システム全体のピーク性能としては表のとおり、倍精度演算能力(FP64)は138.7 TFlops ですが、単精度演算能力(FP32)としてはGPUだけで1.4PFlopsあります。FP16 Sparse Tensor の疎行列の積和演算に関しては14.9PFlopsの性能があるので、Tensor coreなどを有効活用できればかなりの性能を引き出せることが分かります。一方で、混合精度を利用して性能を引き出すにはハード特性考慮したコードを書く工夫が必要で、多くの場合は単精度演算処理のまま利用している人が多いです。そのため「A100よりもGeForce 3080 の方が速い」ということも起こります。逆に言うと、FP32が速いハードを使えば、ハード特性を意識しなくても、コードがそのまま速くなる事も多いというのも事実です。
( 138.7Tflops = 18.7Tflops(CPU) + 120Tflops(GPU) の総計値です)
改めて表のA6000とA100を見比べてみると、A100の方が全体的にハイスペックなのですが、GPUメモリサイズはA6000の方が少し大きく、FP32の性能に関してはA100よりも倍近い性能が出ます。FP64は、HPC(High Performance Computing)などでは重要視される反面、機械学習のシーンではあまり重要視される機会が少ないため、今回はFP32の性能が高いA6000に注目しました。ちなみに、GeForce 3090という選択肢もあったのですが、仮想通貨のマイナー用に売れ続けてしまって非常に確保が難しいことと、電力効率とメモリサイズも重視してA6000/A5000に絞り、最終的にA6000を導入しました。個人的には費用対効果と電力効率的にA5000推しでしたが、48GBのデバイスメモリが魅力的だという意見も強く、A6000の導入を決めました。

システムSUPERMICRONVIDIA DGX A100全体
ノード数41
CPU 性能EPYC 7763 (Zen3) x2EPYC 7742 (Zen2) x2
コア/スレッド96/192128/256512/1024
クロック2.3GHz2.25GHz
FP641.8 TFlops2.3 Tflops18.7 TFlops
メモリ1TB1TB5TB
GPU 性能A6000 (PCIE)A100 (SXM4)
個数32840
GPU メモリサイズ48GB40GB1856 GB
FP641.25 TFlops9.7 TFlops120 TFlops
FP3238.7 TFlops19.5 TFlops1.4 PFlops
FP1640 TFlops78 TFlops1.9 PFlops
RT Core75.6 TFlops2.4 PFlops
FP64 Tensor( 1 TFlops??)19.5 TFlops?
TF32 Tensor( 10/20 TFlops??)156/312 TFlops?
FP16 Tensor155/310 TFlops312/624 TFlops7.5/14.9 PFlops
BF16 Tensor( 155/310 TFlops?)312/624 TFlops?
INT8 Tensor( 310/620 TFlops?)624/1024 TFlops?
表:今回導入したA6000のGPUサーバとA100を積んだDGXの比較と、システム全体の理論性能。

ここで、いくつかA100とA6000でベンチマークを取ってみます。前回A100を稼働させた時はmatrixMulCUBLASとcudaTensorCoreGemmのベンチマークをV100と比較してみたのですが、今回は、NVIDIAがA6000の公称スペックをあまり公開していないため、少し細かく取得してみました。
なお、それぞれの環境は下記の通りです。DGX OSは勝手にドライバ更新とかしてはいけないらしいので、DGX OS は極力触らないようにしていますが、バージョンは恐らく最新のはずです。今回マザーボードと電源ユニット交換の話があってファームアップデートなどをかけましたので、もう一度ベンチマークを取ってみます。なお、サンプルコードの行列積は全て密行列A(MxN) と密行列B(NxK)の行列積C(MxK)を求める計算となっていて、疎行列(SparseMatrix)モードは試していません。
・A100:
  CUDA 11.0.221
  OS Ubuntu 20.04.1 (DGX OS 5.0.0)
  NVIDIA GPU driver Release 450
・A6000:

  CUDA 11.4.100
  OS Ubuntu 20.04.3
  NVIDIA GPU driver Release 470

matrixMulCUBLAS (FP32)
A100: Performance= 8508.12 GFlop/s
A6000: Performance= 10034.84 GFlop/s

M=640, N=480, K=320 のFP32の計算で、A6000の方が若干高速で10TFlops出ていますが、行列サイズも小さいのでピーク性能にはまだまだです。それでもV100が6.9TFlpos程度だったので倍ぐらい高速になっています。

dmmaTensorCoreGemm (FP64 Tenosr)
A100: FP64 TFLOPS: 11.75
A6000: FP64 TFLOPS: 0.54
M=8192, N=8192, K=4096 のFP64Tenosrの行列積計算で、シンプルに倍精度演算を行っている。A100はHPC用に倍精度演算能力も妥協していないために、さすがの高スペックでA6000では歯が立ちません。なお、A6000のFP64 Tensorの公称値は見つけることができなかったのですが、1TFlops程度でしょうか。

tf32TensorCoreGemm (TF32 Tensor)
A100 :TFLOPS: 30.35
A6000:TFLOPS: 2.48

M=8192, N=8192, K=4096のTF32 Tensorの行列積計算である。ここでTensor Float 32とは,指数部分は8bitsでfloat32と同じ値の範囲(-1e-38~1e-38)を持ち、仮数部分は通常のFP32の23bitsを使わず10bitsだけ利用し、トータル19bitsに削減して演算を行う混合精度演算である(図参考)。A100ではピーク性能156Tflopsに対して1/5程度の速度で、A6000がその1/12程度しか性能が出ていません。これが本当なのか気になったのでソースコードを改編して純粋に演算処理部分だけ計測しましたが 2.48Tflops 程度でした。また、行列サイズを(M=N=K=32768)と巨大にして計算させても「A100 : 38.48Tflops、A6000 : 2.52Tflops」だったので、A100がピークの1/4程度な事を考えると、A6000もピーク性能10Tflops程度でしょうか。(正確な値分かる人教えてください)

cudaTensorCoreGemm (FP16 Tensor)
A100:TFLOPS: 78.40
A6000:TFLOPS: 77.85

M=4096, N=4096, K=4096の行列積演算で、いわゆる混合演算(Mixed precision)です。行列A, Bはhalf (FP16)で、積和を行列Cのfloat(FP32)で受け取り、推論だけではなく学習にも十分有効であるとして利用されています。A6000はピーク性能の50%出ていてA100に遜色ありませんが、行列サイズを大きく(M=N=K=32768)して計測すると「A100 : 103.75Tflops、A6000 : 76.15Tflops」となりましたので、A100はまだ余力がありそうです。いずれにしても両方のGPUとも高速なのがよく分かります。

bf16TensorCoreGemm (BFLOAT16 Tensor)
A100 : TFLOPS: 98.78
A6000 : TFLOPS: 81.66

M=8192, N=8192, K=8192の行列積で、Brain Float16という型を利用している。BFLOATは16bitではあるが、指数はfloatと同じ8bitsで、仮数を7bitsに抑えている。ダイナミックレンジを確保しつつ、積和で桁落ちしてしまう仮数部分を削り落とす思想は基本的にTF32と同じであるが、16bit長であるため扱いやすく、より高速に処理できるのだと想像する。この演算も行列サイズを大きく(M=N=K=32768)して計測すると「A100 : 111.68Tflops、A6000 : 76.71Tflops」とFP16と同じような性能比になったため、A6000はBF16性能は155TFlops程度でしょうか。

immaTensorCoreGemm (INT8 Tenosr)
A100 : TOPS: 147.82
A6000 : TOPS: 123.48

M=4096, N=4096, K=4096 の行列積で、8bit int整数型を用いている。推論時では8bit整数でもそれなりの精度が得られるとは聞くが、ハイスペックなGPUでは利用シーンがあまり無いようにも感じる。演算処理は非常に高速であり、おそらくまだまだピーク性能に達していない。A6000はおそらくピーク性能310Tflopsぐらいあるのではないでしょうか。

 図:Fp32, TF32, Fp16, BF16の違い。

今回試したのはいずれもCUDAのsample コードであり、ピーク性能を引き出すものではないのですが、GPU間の性能比較には多少使えるだろうということで利用しました。A100と異なり、A6000はNVIDIAからも演算性能をあまり公表していないのが、演算用というよりもQuadro系のグラフィック性能に特化させているGPUなので、倍精度(FP64)落として単精度(FP32)の性能が高く、我々もそこには期待したのですが、TF32が性能低そうなのが正直残念でした。ネットの情報(とある代理店のサイトに書かれているスペック表)で75/150Tflopsと書かれていたので期待していたのですが、今思うとRT Core の性能との誤記だったのかもしれません。とはいえ、BF16もFP16も高い性能出しているので、TF32を使わない代わりにFP32でも精度維持しながら十分速度が出ることと、BF16使えば仮数の精度を少し落としても高速化ができるという感じです。個人的には、前述した通り、FP32の演算性能に期待したので、そこはしっかり利用していきたいと思います。
さて、ここまででベンチマークを取らなかった「RT Core」ですが、これはシェーディング処理の高速化のためのチップで、光線の反射と透過などを計算するものです。NVIDAは最近ここにも力を入れていて、特にNVIDIA Omniverse などのシミュレータ環境では、現実世界かと見間違えるようなCG再現をクラウド上で実現しています。OpenGLなどのグラフィック出力はクライアントGPUで処理して出力するものですがに、NVIDIAのvGPUなどは、サーバで処理したグラフィック出力をover IP でクライアントに出力させるもので、NVIDAIもそのようなプロダクトの利用にはA6000/A5000を複数枚積んだサーバを推挙しています。
下の動画は,遠隔のGPUサーバで起動させたOmniverse Isaac Simulator をリモートアクセスして動かしています。レンダリングの演算は遠隔の強力なGPUサーバで動かし、描画結果だけを飛ばしてきているのですが、これは恐らくクライアント側からは操作処理を送り、サーバ側からはライブストリーミング配信のRTSP(Real Time Streaming Protocol)プロトコルで画面を飛ばしているものだと思います。現在社内の同一LAN内では遠隔操作ができていますが、データセンターのようなFirewallの設定(アクセスportの制限など)が厳しい場所での通信では苦労していて、なかなか厳しいものがあります。もちろんハイエンドGPUを積んだデスクトップで作業すればよいのですが、このコロナ禍では在宅を余儀なくされ、自宅からアクセスすることが必須となっているため、色んな苦労はありますが遠隔でできるように色々取り組んでいます。先進技術部でもOmniverse周辺技術には興味があり色々と取り組み、今回のA6000(or A5000)の導入の決め手にもなっていますので、近いうちに別の形で報告しようと思います。
動画:遠隔でサンプルのKaya robotを動かしているところ