Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

SYCL Academy と SYCLでNVIDIAのGPUをプログラミングできる?

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそ、すべては、SystemC v0.9公開から始まった

Intel が oneAPI で利用しようとしている SYCL 。

このブログでも何度も取り上げています。 

そんな SYCL ですが、思いっきり力を入れているCodeplayの下記のブログはSYCL Academy について書かれています。

www.codeplay.com

SYCL Academy は、github にあります。

github.com

以下の内容って感じです。SYCL v1.2.1準拠の Codeplay 社の ComputeCpp を使って、以下の4つのレッスンをやってみる! 

  • An Introduction to SYCL
  • Launching SYCL Kernels
  • Handling SYCL Errors
  • Managing Data in SYCL

SYCLについては、これを見ればいいのでは?

sycl.tech

www.codeplay.com

 SC19の記事

www.codeplay.com

 

下記の記事では、NVIDIAGPUを SYCLでコードが書けるするというもの?
codeplay.com

We are excited to announce that in 2020 we will be releasing a project that brings full support for Nvidia devices to SYCL developers. This project will be fully open source and initially includes integration with Intel's oneAPI, however it could be integrated with other SYCL implementations. During this project our engineers have been working in conjunction with Intel's engineers to implement a back-end for SYCL that uses CUDA to dispatch kernels in PTX format enabling parallel execution on Nvidia GPUs.

とあるので、Open Sourceで開発中なんですね。。。そういう時代なんだね。

 

 

 

MLIR(TensorFlow)やRelay(TVM)を使っても、変わらない。。

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった 

LLVMの中のMLIR と TensorFlowの中のMLIR(TensorFlow/XLA/Lite)

そして、Relay+TVM のソースコードRelayの論文 をお正月明けの先週末(4日と5日)に眺めて、考えたんだけど、

ハードウェア側から見ると、あんまり変わらないことが分かった。

GEMMのためのハードウェアはみんな似ているので、入力とパラメータをどのように突っ込んで、その結果をどのように引き出すかが微妙に違うだけ。

ソフトウェアであっても、ハードウェアに近い部分は一般的には公開されていないもの。Glowにある Habana (Intelに買収された)や Intel NNP-I のコードの中を覗いてみても、それぞれのSDKの中にある API にあわせてモデルを再構築しているだけ。

TensorFlowでも、PyTorchでも同じで、それそれのSDKAPIにあわせてモデルを変換しているだけ。

MLIRは、モデル変換が大変だから、LLVMのように大変じゃないようにしましょうという観点で出てきたのだと思っています。

となると、

ハードウェアに近い部分って、どうすれば、大変じゃないようになるのかな?

規模が小さいものであれば、FPGAを使ったプロトタイプでいろいろと試すことができると思います。じゃ、どんな道具を使えばいいのか?

他に何かあるか? 

あたしが気になっているのは、イケメンのお兄さんの NNGen です。

github.com

この NNGen は、

A Fully-Customizable Hardware Synthesis Compiler for Deep Neural Network

なのですが、工夫すれば、もっといろいろなことが出来そう。

これに、XilinxのSDSoCで自動生成している CPU <=> FPGA 間のデータ移動ができるようになれば、かなり楽ちん。

 

しかし、

NNGenで生成したVerilog HDLをFPGAマッピングするのに結構時間がかかる。

これは、なかなか解決しない問題かな。。。

対策は、SWエミュレータを使うというのがあるが、アクセラレートするぐらい遅い処理をSWエミュレータで実行したら、もっと遅くなっちゃうんだよね。どうにかならないかな。。。

 

それから、XilinxのVasalの、

  • CPU(Correx-A72x2)
  • AIエンジン
  • DSPエンジン
  • FPGA

の各ハードウェアにマッピングできるようなシステムを作って遊ぶのもかなり面白そうね。何時頃できそうかな。。。

 

nGraphのMLIR

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった 

MLIRがLLVMに統合されて、覗いておいた方がいいかな?と思って、MLIRを使っているプロジェクトを探っています。

今日は、Intel nGraphです。

github.com

CMakeList.txt の中で、

の2つが MLIR 関連の変数。NGRAPH_MLIR_ENABLE が TRUEの時有効になる。

if (NGRAPH_MLIR_ENABLE)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNGRAPH_MLIR_ENABLE")
  set(NGRAPH_MLIR_SOURCE_DIR ${CMAKE_SOURCE_DIR}/src/contrib/mlir)
endif()

 で、src/contrib/mlir の下を取り込むということに。

if (NGRAPH_MLIR_ENABLE)
  include(cmake/external_mlir.cmake)
endif()

 にて、CMakeのありかも。こちらで、MLIRをソースコードからビルド。NGRAPH_USE_PREBUILT_MLIR が TRUE なら、ビルドはしない。

 

ソースコード全体の CMakeList.txt では、

# This must be added before any backend that uses MLIR
if (NGRAPH_MLIR_ENABLE)
  add_subdirectory(${NGRAPH_MLIR_SOURCE_DIR})
endif()

src/ngraph/runtime/cpu の CMakeLists.txt にも、

if (NGRAPH_MLIR_ENABLE)
   set(SRC

         ${SRC} 

         builder/mlir_cpu_compiled_kernel.cpp
   )
endif()

 

実際に使われている部分は、cpu_runtime_context.hpp 

#ifdef NGRAPH_MLIR_ENABLE
    /// Maps CompiledKernel nodes to their MLIR compiler
    /// The MLIR compiler caches the compiled code on the first invocation,
    /// and may in the future support re-compilation
    std::unordered_map<ngraph::op::CompiledKernel*,
    ngraph::runtime::ngmlir::MLIRCPURuntime>
    mlir_runtimes;
#endif

 で MLIRCPURuntime を使っています。この mlir_runtimes は、上に出てきた mlir_cpu_compiled_kernel.cpp の中で使われています。

MLIRCPURuntime& mlir_runtime =
        ctx->mlir_runtimes.find(compiled_kernel)->second;
// Grab the context and initialize a core compiler
mlir::MLIRContext& context = mlir_runtime.get_context();
MLIRCompiler mlir_compiler(compiled_kernel, context);
// Compile to NG dialect
mlir_compiler.compile();
// Grab a context and initialize a CPU backend using same context
MLIRCPUBackend mlir_backend(mlir_compiler.get_module(), context);
// Codegen to LLVM dialect
mlir_backend.codegen();
// Store module into runtime, and invoke.
mlir_runtime.set_module(mlir_backend.get_module());
mlir_runtime.run(&ptr_args);

 MLIRCompiler にて、カーネルコンパイルして、MLIRCPUBackedn にて、LLVM dialectにてコード生成し、実行。

nGraph => MLIR への変換は、NgDialectConversionPass の runOnModule でやっています。

 

とういうことで、

  • MLIRCompilerにて、nGraph => MLIR に変換
  • MLIRCPUBackend にて、MLIR => LLVM に変換
  • MLIRCPURuntime にて、CPU で実行

でした。

 

ArmのNeoverse N1 & E1 Platform ができたそうな

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった 

www.anandtech.com

この記事の写真にあるよに、TSMC 7nm でのチップ。

左隣りには、XilinxのKintex-7が載っていますね。

  • 2019 : Ares Platform、7nm 
  • 2020 : Zeus Platform、7/5nm+
  • 2021:Poseidon Platform、5nm

から

  • 2019 : Neoverse N1 Platform、7nm 
  • 2020 : Zeus Platform、7/5nm+
  • 2021:Poseidon Platform、5nm

に。

Cortex-A72に対して、LMBenchのLatencyが110nsから83nsに、Memory Streamingも60GB/sから175GB/sに約3倍に。内部接続はRingからMeshに。

Meshになるということは、それなりのコア数搭載のチップになるからサーバー用になると。64/128コア、4チャネルのメモリコントローラが2個、64LanesのPCIe/CCXが2個。こちらは、2コアを8個セットにしたSuper Tileしたものを4個で64コア。

N1のEdge用だと、8コアのリファレンスがある。E1では16コア

E1は2スレッド対応か。

 

github の Arm Trusted Firmware を覗いてみたら、N1対応のコードがありましたよ。11月19日には公開されていたようです。

github.com

メモリコントローラは、2個

SCP Firmwareにもありました。N1対応コード。こちらは11カ月前に公開済み。その後更新有。

github.com

DRAMコントローラは、DMC620. x for direct connection to CCN-5xx or CMN-600 products using AMBA 5 CHIで、DDR4対応

CCIXのコンフィギュレーションもある。CCIXについては、こちら↓

en.wikichip.org

 

 

Graphcoreを1週間使うと、4000ドル

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった 

Graphcore、Azureで使えるようになるようですが、既にクラウドサービスをやっているところがあります。Cirrascal Cloud Servicesにて。

cirrascale.com

でお値段ですが、時間貸しは1か月15999ドル、1週間4000ドル、

1時間21.92ドル相当。Graphcoreは、PCIeボードが1枚(チップは2個)

Graphcore IPU Cloud
Starting at
$15,999 /month
—or— $4,000 /week
$21.92 /hourly equivalent*
Dual Intel® Xeon® Gold 6248
768GB RAM • 4X 1TB NVMe Drives • 2X 480GB SSD
Eight Graphcore® C2 IPU Cards (2x IPUs)
25Gb Bonded Network Connectivity
Long-term discounts and options available

お買い上げの時は、時間貸しと基本的は同じ(ネットワークだけ違う)で、124499ドル

32週間借りると元取れる計算。

Graphcore IPU Server
Starting at
$124,499
Dual Intel® Xeon® Gold 6248
768GB RAM • 4X 1TB NVMe Drives • 2X 480GB SSD
Eight Graphcore® C2 IPU Cards
Mellanox ConnectX-5 SP EDR Adapter
Intel X710 DP 10GbE SFP+ & i350 DP 1GbE
Quad Redundant Power Supplies

Google Cloud TPU Pod のお値段がv2-32(ベータ版)にて、

$24 / hour

$11,038 / month (1年契約)、$7,884 / month (3年契約)

なので、これよりも高いです。

どちらともTensorFlowでやるようですが、それなら、Google TPU Podの方がラクチンでしょう。。。。

 

このクラウドサービス、何れ無くなりそう。。。

 

で、Azure がどのくらいの値付けで出てくるかがお楽しみです。

 

Google Edge TPUファミリーが増えた

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった 

Google Edge TPUのサイトからのお年玉アナウンス

 

Coral Accelerator Moduleは、Murata製で、Edge TPU + PMIC が1パッケージになったもの。Edge TPUだけならこんなパッケージはいらないが、PMIC(Power Management IC)も必要なので。10mm * 15mm と1セントコインより小さい。Mini PCIe と M.2が34.99ドルなので、もっと安いかな。。。25ドルぐらいかな。。。

 

Coral Dev Board Miniは、MediaTekのSoC 8167sを使った Board 。SoC内のCPUコアは、Arm Cortex-53x4から35x4になって、GPUがVivanteからImaginationになった。メモリは1GBから2GBに増え、MiniではSoMボードではなく、直付け。

SoCには、PCIeやUSB 3.0が付いていないので、Edge TPUには USB 2.0 で接続かな。

Dev Boardが 114.99ドルなのでそれより安いかな?メモリ2GBだけど、SoMボードじゃないからね。99.99ドルぐらいで。。。

 

SoMもメモリが1GBだけではなく、2GB、4GBも出てくる模様。

あれ、SoMに載っている白いやつ、これAccelerator Moduleなのかな?

そうだとしたら、USB、Mini PCIe、M.2では、何故?Moduleじゃないのか?

 

追記)、2020.01.11

 

 

TVMがNNVMを捨てて、MLIRはLLVMに統合、Google、IREEもリリース

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった 

 [DEPRECATION] Remove NNVM compiler #4571

NNVMからRelayに完全移行と。。。

tvm.apache.org

ドキュメントから約2年。

 

そして、

MLIR is now part of LLVM, more information on https://mlir.llvm.org

The code from this repository can now be found at https://github.com/llvm/llvm-project/tree/master/mlir/

ということで、MLIRがLLVMの一部になった。

mlir.llvm.org

Talks and Related Publications

にいろいろあります。

ということで、