Vengineerの戯言

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

KerasからTPUがサクサク使えるようになった?

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

このツイートから知った、KerasからTPUをサクサク使う方法

 先日、TensorFlow 2.0 がリリースされたばかりなのに、2.1とか。。。

ツイートしている人、Googleの中の人っぽいんだけど、フランスのMobiPocketという電子書籍っぽいものを開発していた会社でCEOで、Amazonに買収されて、2011年でMobiPocketそのものが終了されたタイミングでGoogleに移ったみたいと読み取りました。

 

TensorFlow World 2019 Conferenceでのスライドは、ここ

スライドにあるお顔を拝見して思い出しました。

Google I/O '19のこのビデオに人です。このビデオには、Kazさんも登場します。

Cloud TPU Pods: AI Supercomputing for Large Machine Learning Problems (Google I/O'19)

www.youtube.com

 

ということで、普通の人は、Keras で書けば、CPU/GPUだけでなく、ちょっとした修正でTPUが使えるようになったんですね。。。素晴らしい。

 

現時点でも、Colab with TF 1.15にて、TPU無料で利用できるが、TF 2.1になると、いろいろと改善しているって。

 

GraphcoreのPopARTを覗いてみる

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

GraphcoreのSoftwareは、Poplar

www.graphcore.ai

下図のURLで引用しています。

POPLARは、

  • XLA と PopART
  • Graph Libraries (PopLIBS)
  • Graph Compiler
  • Graph Engine

から構成されているようです。

https://www.graphcore.ai/hs-fs/hubfs/Poplar%20(1).jpg?width=2053&height=769&name=Poplar%20(1).jpg

 

では、PopARTを github にて公開されている example の中から見つけてみまっす。

ResNetのサンプルコード。PopART library ONNX builderを使うみたいです。

popart.Builder()

にて、モデルビルダーを生成して、

builder.aiOnnx.XXX

にて、各Opを生成して、モデルを組み立てていくようです。aiOnnx は、

  • constant
  • add
  • mul
  • matmul
  • pad
  • conv
  • maxpool
  • argmax
  • relu
  • softmax
  • lstm

などがあるようです。

  • addInputTensor

もあります。

 aiGraphcoreには、

  • subsample (ResNet用?)
  • groupnormalization

というのもありますね。

 

また、カスタムOpも定義できるようですね。ただし、C++コードです。Onnxベース。

Graphcoreの3つのケースとは?

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

下記の 「London Meetup: Deep Dive into TensorFlow #27」に関するTweetから

ハッシュタグ #TensorFlowLDN で Graphcore に関するものを見ていきます。

www.eventbrite.com

 

 

 この最後の写真にある3つのケース

  • MODEL SHARDING
  • MODEL REPLICATION
  • MODEL PIPELING

これ、昨日のgithub の examples にもありました。

TensorFlow の code_examples の中に。

ここ の説明によれば、Sharding とは、以下のように1つのモデルを複数チップ実行するときのオプション。

--shards : The number of IPUs to split the model over (default 1). If shards > 1 then the first part of the model will be run on one IPU with later parts run on other IPUs with data passed between them. This is essential if the model is too large to fit on a single IPU, but can also be used to increase the possible batch size. As an advanced usage, the sharding algorithm can be influenced using the --sharding-exclude-filter and --sharding-include-filter options. These specify sub-strings of edge names that can be used when looking for a cutting point in the graph.

このファイルが、-shards の例題になっている。

tensorflow.python.ipu.autoshard.ipu_autoshard() にて、自動分割してくれる。

tensorflow.python.ipu.scopes.ipu_shard(n) にて、手動分割ができる。

cfg = utils.create_ipu_config(profiling=True)
cfg = utils.auto_select_ipus(cfg, NUM_SHARDS)

utils.configure_ipu_system(cfg)

にて、分割を指定できる。あとは普通にTensorFlowのsessionにて、run するだけ。

 

 このファイルが、REPLICATIONの例

# To use replication, we make as many feeds as there are replicated IPUs by passing in replication_factor
infeed = ipu_infeed_queue.IPUInfeedQueue(dataset, replication_factor=opts.replication_factor, feed_name='in')
outfeed = ipu_outfeed_queue.IPUOutfeedQueue(replication_factor=opts.replication_factor, feed_name='out')

InfeedQueueとOutputfeedQueueの replication_factorを指定すればいいみたい。

 

PIPELININGについては、Image Classification Inference には、

Run inference using optimized data pipelining for image classification with pre-trained weights

とありました。

また、ここ には、

  • --pipeline-splits
  • --pipeline-depth

というオプションの説明があります。

--pipeline-depth : When a model is run over multiple shards (see --shards) pipelining the data flow can improve throughput by utilising more than one IPU at a time. At present the splitting points for the pipelined model must be specified, with one less split than the number of shards used. Use --pipeline-splits to specifiy the splits - if omitted then the list of available splits will be output.

 

Graphcoreのgithub

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

Graphcoreの github がかなり前からあるのは知っていたのだが、examples がアップされていました。たぶん、SC19にあわせてアップされたようです。

github.com

このブログに書いてありました。

Customers are able to replicate our benchmarks using code we will make available as public examples on the Graphcore GitHub site from Monday 18th November 2019.

www.graphcore.ai

examples は、こちら

github.com

にて、288ファイルを

github.com

にて、8ファイルがアップデート。

内容は、

  • Notable examples
  • Application examples
  • Code examples
  • Utilities

って、感じ。

現時点で対応しているディープラーニングフレームワークは、

  • TensorFlow
  • その他は、PopART経由

のようです。

下図は、サイトで公開されている図(URLで引用します)

https://www.graphcore.ai/hs-fs/hubfs/Poplar%20(1).jpg?width=2053&height=769&name=Poplar%20(1).jpg

この図にあるように、TensorFlowはXLA経由、ONNX、PyTorch、mxnet、PaddlePaddleは、PopART経由です。

TensorFlowとPopART対応のコードが公開されています。

cnnsのベンチマークコードは、こちら。

github.com

README.md の最後に、

Profiling
Logging information can be generated that can be used with the GC profiler tool at https://github.com/graphcore/toolshed/

 とありますが、まだ、toolshed は公開されていません。

こちらも、ソースコード解析の出番ですかね。

あー、いろいろやることあるわ。

Graphcoreの詳細というか、図。

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

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

学習用チップで、PCIe ボード上に2個載ったものがDellのサーバーに8枚ささっているものが Microsoftクラウドにて利用できるようになっています。

vengineer.hatenablog.com

Dellのサーバー(4U)は、下のような写真(URLで引用します)がGraphcoreのサイトにあります。

https://www.graphcore.ai/hs-fs/hubfs/GC008_CAULDRON_C2_001_W4K.jpg?width=1441&name=GC008_CAULDRON_C2_001_W4K.jpg

そんな Graphcore ですが、このブログで取り上げたのは、なんと2017-04-30です。2年半も前です。

vengineer.hatenablog.com

実際にチップが出てきたのが2018年11月。

vengineer.hatenablog.com

この時点での情報は、

  • チップ名:Colossus GC2
  • IPU-Cores なるものが1216個搭載
  • 各IPUは、100GFlopsでかつ、7スレッド
  • チップあたり300MBのSRAM、30TB/sのメモリ帯域
  • 各IPUは、low precision floating pointをサポート
  • 23.6Bトランジスタ。。。
  • 80 IPU-Links なるチップ間インターコネクトにて、2.5Tbpsの転送レート
  • チップ間転送では、IPU-Exchangeなるもので、8TB/sの転送レート。
  • PCIe Gen 4 x16

でした。

そして、最新情報は、GraphcoreのProducts/ipu にあります。その中の数をURLで引用し、表示します。この図には、

  • IPU-Tiles TM (1216 IPU-Tiles each with an independent, IPU-Core and tightly coupled In-Processor-Memory)
  • IPU-Core TM (1216 IPU-Core with 7296 programs executing in parallel)
  • In-Processor Memory TM (300MB In-Processor-Memory, 45TB/s memory bandwidth, While model held on-chip)
  • IPU-Exchange TM (8 TB/s all to all IPU-Exchange, Non-blocking, and communication pattern)
  • IPU-Links TM (80 IPU-Links, 3200GB/s chip to chip bandwidth)
  • PCIe Gen4 x16

のように、すべてに TM が付いています。

https://www.graphcore.ai/hs-fs/hubfs/ipu_diagram_021218.png?width=2250&height=1350&name=ipu_diagram_021218.png

  • 基本的には追加された情報は無いですね。
  • IPU-LinkとPCIeは基本的には同じSerDes使っていそう
  • IPU-Coreに対して、In-Processor-Memoryが約250KB
  • Thread数は、7ではなく、6(7296 programs / 1216 IPU-Core)
  • In-Processor-Memory の帯域が 30TB/s から 45TB/s にアップ
  • IPU-Links の帯域が 2.5TB/s かあ 3.2TB/s にアップ


下記がこのブログで紹介した Graphcore 。

vengineer.hatenablog.com

IntelがHabanaを買収の噂

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

先週、IntelがHabana Labsを買収するという噂が流れました。

Intelは、Intel Capital経由でHanabaに出資していますが、Habanaは120Mドルの出資を受けていて、Intelは1Bドル以上で買収するというお話。

www.calcalistech.com

Intelは、Nervanaを3.5憶ドルで買収したのですが、あれはどうなっているんでしょうか?

Intel Nervana NNP-TとNNP-Iは、Habana LabsのGoyaとGaudiとガチ、ぶつかっているように感じますが、買収する理由は何なのでしょうか?ね。

jp.techcrunch.com

 

このブログで最初にHabanaを取り上げたのは、2018年10月

vengineer.hatenablog.com

2018年9月のブログの時点では、Webサイトが無かったHabana.

vengineer.hatenablog.com

そして、今年の8月のHot Chip 31にて、推論用のGoyaと学習用のGaudiの情報が出てきました。

vengineer.hatenablog.com

FacebookのGlowにもHabanaのコードがあります。

github.com

 

IntelがHabana Labsを買収をするという噂 

www.timesofisrael.com

www.eetimes.com