Vengineerの戯言

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

OctoMLのファーストプロダクト「The Octomizer」

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

今日は4月1日。。。なんどけどね。。。このような状況ではね。。。。

 

OctoMLのブログ。。。ブログと言えば、medium になったね。

medium.com

OctoMLのファーストプロダクトの「The Octomizer」

この件に関しては、このブログでも2019年12月14日に紹介しています。

vengineer.hatenablog.com

その時のスライドは、これ

$ pip install octomizer
$export OCTOML_ACCESS_TOKEN=...

import octomizer
model = octomizer.upload(model, params, 'resnet-18')
job = model.start_job('autotvm', { # also 'onnÿrt' etc!!.
                                    'hardware': 'gcp/<instance_tĀpe>',
                                    'TVM_NUM_THREADS': 1,
                                    'tvm_hash': '!!.'
})
while job.get_status().status != 'COMPLETE':
    sleep(1)
model.download_pkg("base_model", 'pĀthon') # Package with default schedules
model.download_pkg("optimized_model", 'pĀthon', job)

 がデモ用のコード。。。

optimizer にモデルを upload して、クラウド上で最適化を行う

最適化処理が終わったら、ベースモデルと最適化後のモデルをダウンロードできる。

 

これ、GoogleMicrosoft の AutoML と同じやんねん。何が違うのだろうか?

このスライドでは、

  • GCP cloud instances
  • ARM A class CPU/GPU
  • ARM M class microcontrollers

がサポートしているもので、ロードマップ的には

  • AWS and Azure cloud instances
  • Quantization
  • Hardware-aware architecture search
  • Compression/distillation

があがっている。GCPAWS、Azure 対応になるということは、どんなところでも対応できるのがポイントかな。。。

それが出来れば、ロードマップの下3つをサポートして、機能強化を進めると。。。

Mesh TensorFlow の中身を覗いてみた

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

Mesh TensorFlow の github の眺めたら、書いてあった。

  • The parameters of the model do not fit on one device
  • An example is so large that the activations do not fit on one device
  • Lower-latency parallel inference (at batch size 1).

github.com

最初のモデルのパラメータが大きい時、

2番目のアクティベーションが1つのデバイスにフィットしないぐらい大きい時、

は分かるんだけど、

3番目の Lower-latency parallel inference もそうなのね。。。

 

お、これって、Groq や Graphcore の Inference のアプローチと同じじゃん。。。

 

バイスの設定って、こんな感じに。4つのデバイス

devices = ["gpu:0", "gpu:1", "gpu:2", "gpu:3"]
mesh_shape = [("all_processors", 4)]
layout_rules = [("batch", "all_processors")]
mesh_impl = mtf.placement_mesh_impl.PlacementMeshImpl(
                                              mesh_shape, layout_rules, devices)
lowering = mtf.Lowering(graph, {mesh:mesh_impl})
tf_update_ops = [lowering.lowered_operation(update_w1_op),
                            lowering.lowered_operation(update_w2_op)]

 この中の、mtf.Lowering がポイントなんだろうか?

 

Loweringの ここ にあった。

def __init__(self, graph, mesh_to_impl, autostack=True, log_file=None):
    """Creates a Lowering of a Graph.
    Args:
        graph: Graph.
       mesh_to_impl: {Mesh: MeshImpl}. Keys are the Mesh's in the graph and
their values are MeshImpl's, which map Tensor Dimension names to
Mesh Dimension names.
        autostack: a boolean. If True, then the graph gets rewritten to
reduce the number of variables (see rewrite_stack_variables()).
This is a helpful performance optimization for large meshes.
For more fine-grained control, you can call
graph.rewrite_stack_variables() yourself before creating the Lowering.
        log_file: an optional string. If provided, information about the variables
and operations will also be logged to this file.

MeshImplとしては、次の2つがあって、SimdMeshImpl が TPU 用

グラフ を mesh_to_impl によって、Lowering するんだけど、autostack を True (デフォルトでも True) にすると、variables の数を少なくするように、書き換えるようですね。

再度見てみると、 

lowering = mtf.Lowering(graph, {mesh:mesh_impl})
tf_update_ops = [lowering.lowered_operation(update_w1_op),
                            lowering.lowered_operation(update_w2_op)]

 lowering.lowered_operation メソッドが下記のように、self.operations[op]を返しているだけですね。ということは、self.operations はどうやっているの?

def lowered_operation(self, op):
    return self.operations[op]

 __init__ メソッドの中で、

for op in graph.operations:
# tf.logging.info("Lowering operation %s" % op.to_string)
with tf.name_scope(op.name):
    op.lower(self)

 のように、op.lower(self) がポイントかな。。。

Operation クラスの定義では、

def lower(self, lowering):
    raise NotImplementedError("Lower not implemented")

 のように未実装なので、Operation クラスを継承するクラスで定義されているっぽい。

例えば、SlicewiseOperation クラス の lower メソッドは、こんな感じ。

def lower(self, lowering):
    # Check that only splittable dims are split
    mesh_impl = lowering.mesh_impl(self)
    for t in self.inputs + self.outputs:
        layout = mesh_impl.tensor_layout(t)
        for d, mesh_axis in zip(t.shape.dims, layout.tensor_axis_to_mesh_axis):
            if mesh_axis is not None and d.name not in self._splittable_dims:
                raise ValueError("dimension %s is not declared as splittable" % d)
            values = mesh_impl.slicewise(
            self._tf_fn, *[lowering.tensors[x] for x in self.inputs])
        if len(self.outputs) == 1:
            values = values,
        for output, value in zip(self.outputs, values):
            lowering.set_tensor_lowering(output, value)

 この中に出てくる set_tensor_lowering は、Lowering クラスのメソッドの模様。

def set_tensor_lowering(self, tensor, laid_out_tensor):
    self.verify_slice_shapes(tensor, laid_out_tensor)
    self.tensors[tensor] = laid_out_tensor

 

2020年3月映画鑑賞

映画好きの戯言

 

3月:41本、アマゾンプライム:35本、DVD:6本

 

1月:DVD:5本、アマゾンプライム:43本

2月:アマゾンプライム:35本

2月までは、83本(DVD:5本、アマゾンプライム:78本)

累計:124本

 

ピッチ・パーフェクト (2012) / PITCH PERFECT (アマゾンプライム)

おもろかった。

ヘイリー・スタインフェルドも出てた。。。

バンブルビー が初演技だと思っていたら、結構出てた。

 

ピッチ・パーフェクト ラストステージ  (2017) /  PITCH PERFECT 3 (アマゾンプライム)

2は、有料なので、3を。

 

火花 (2017) (アマゾンプライム)

やっぱり、菅田将暉の演技は菅田将暉だった

 

ホームレス中学生 (2008) (アマゾンプライム)

主役が小池徹平だった。

 

ストレンジャーズ 地獄からの訪問者 (2018) / THE STRANGERS: PREY AT NIGHT (アマゾンプライム)

13日の金曜日、凄いわ、理由が全くない。。。で始まり終わる。

 

トレイン・ミッション (2018) / THE COMMUTER  (アマゾンプライム)

この映画なかなかよかった。監督と主演で、何作かやっているので、みてみよう。

 

オッド・トーマス 死神と奇妙な救世主 (2013) / ODD THOMAS (アマゾンプライム)

これ面白かった。あんなの見えちゃったら、結構辛そう。

 

デイブレイカー  (2009) / DAYBREAKERS (アマゾンプライム)

吸血鬼の映画、人間から血液採取するための牧場とは。。。

 

嘘の天才 ~史上最大の金融詐欺~ (2017) / THE WIZARD OF LIES (アマゾンプライム)

 

プリデスティネーション  (2014) / PREDESTINATION (アマゾンプライム)

 

ウィンチェスターハウス アメリカで最も呪われた屋敷 (2018) / WINCHESTER (アマゾンプライム)

ヘレン・ミレン主演だった

 

ヤング≒アダルト (2011) / YOUNG ADULT (アマゾンプライム)

シャーリーズ・セロン、37歳の役。1975年生まれなので、そんなもんなのね。

それにしても痛かった。。。

離婚して、結婚・子供生まれた元カレの元に行って、運命の人だと言って、あー。

 

ブレイン・ゲーム  (2015) / SOLACE (アマゾンプライム)

逢った人の過去も未来も見えちゃうのって、なんだか、辛そう。

 

バーニング・クロス (2012) / ALEX CROSS (アマゾンプライム)

ジャン・レノジャン・レノぽっくなかった。

 

コーヒーが冷めないうちに (2018) (アマゾンプライム)

伊藤健太郎、出てたのね。

 

ソウルガールズ (2012) / THE SAPPHIRES (アマゾンプライム)

2016年5月に観ていた。邦題だと何だかわからないので、ソウルガールズ

舞台は、オーストラリア => ベトナム なんだけど、ソウル?

 

マジック・マイク (2012) / MAGIC MIKE  (アマゾンプライム)

マジック・マイク XXL (2015) / MAGIC MIKE XXL  (アマゾンプライム)

男性ストリップのお話。こういう職業もあるのね。みんなマッチョマンだった。

 

サプライズ (2011) / YOU'RE NEXT (アマゾンプライム)

 

タッカーとデイル 史上最悪にツイてないヤツら (2010) / TUCKER AND DALE VS EVIL (アマゾンプライム)

 

放課後ソーダ日和 -特別版- (2019) / (アマゾンプライム)

楽しいJKのお話。クリームソーダって、そんなに美味しいか? 

 

シェアハウス  (2011) (アマゾンプライム)

あんなお家に住めるなんて幸せ。

 

ジョーカー (2019) / JOKER (DVD)

哀しい映画

 

大脱出3 (2019) / ESCAPE PLAN: THE EXTRACTORS (DVD)

三作目、あんまりおもろくなかった。

 

アド・アストラ (2019) / AD ASTRA (DVD)

結構、地味な映画。。。2001年宇宙の旅的な? 

 

マレフィセント2 (2019) / MALEFICENT: MISTRESS OF EVIL (DVD)

1作目とは違って、妖精と人間の戦いになっている。。。

悪いのはいつものように継母。。。

 

ワンス・アポン・ア・タイム・イン・ハリウッド (2019) / ONCE UPON A TIME IN HOLLYWOOD (DVD)

 

ライアー ライアー (1997) / LIAR LIAR (DVD)

ジム・キャリーおもろいわ。。。

 

ハッピー・デス・デイ (2017) / HAPPY DEATH DAY (アマゾンプライム)

これ、エンドレス映画だわ。。おもろかったので、続けて2作目も観た。

 

ハッピー・デス・デイ 2U (2019) / HAPPY DEATH DAY 2U (アマゾンプライム)

2作目になって、主人公がどんどん変わっていくんだよ。

主人公、大学生役なんだけど、30歳近くて、お顔のお肌が。。。。

 

翔んで埼玉 (2018) (アマゾンプライム)

地上波放送も終わったので、アマゾンプライムに落ちてきた

 

LION/ライオン ~25年目のただいま~ (2016) / LION

1986年のインドって、あんな感じだったのか。。。

どうなんだろうか? 

 

少女邂逅 (2018) (アマゾンプライム)

GABAのCMのソバカスの子、トーラ世理奈のデビュー作。

放課後ソーダ日和 -特別版-の最初のシーンは、この作品のとあるシーン。

 

ボブという名の猫 幸せのハイタッチ (2016) / A STREET CAT NAMED BOB (アマゾンプライム)

実話で書籍も出ていた模様。猫がかなり良かった。

12歳からハイになっていたとは。。。どんだけなんだよ。

 

ヴィンセントが教えてくれたこと (2014) / St. VINCENT (アマゾンプライム)

ロシア人の「夜の女」ダカ役がエンドロールでナオミ・ワッツと知って、え、と思った次第ですわ。

 

ステイ (2005)  / STAY (アマゾンプライム)

ユアン・マクレガーナオミ・ワッツ出演。

最後の最後まで何だかわからないけど、なかなかよかった。

 

ナインイレヴン 運命を分けた日 (2017) / 9/11 (アマゾンプライム)

9/11関連映画は、これで4作目ぐらいかな?

 

CUTIE HONEY -TEARS- (2016)

西内まりや、久しぶりに見た。可愛い。

 

ガール・ネクスト・ドア (2004) / THE GIRL NEXT DOOR (アマゾンプライム)

まさに、高校生の青春っていう映画。。ありえないけど。

 

あゝ、荒野 前篇 (2017) (アマゾンプライム)

あゝ、荒野 後編 (2017) (アマゾンプライム)

前半では、菅田将暉の全裸が何度か出てきますよ。

 

Mesh TensorFlow って?

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

ディープ・ラーニングにて学習するのって、多くは Data Parallel。

Data Parallelについては、TensorFlow XLAに興味を持ち始めた頃からちょっとだけですが学びましたが、もう一つもModel Parallel。こっちはほとんど知らない。いや、全く知らないので。。。

で、Model Parallel ができるものってなの?

が見つかった。他にもあると思いますが、あったら、教えてください。

xtech.nikkei.com

ChainerMNのModel Parallelについては、このブログにいろいろと書いてありますね。

GPU間のデータ移動については、Send/Recv を入れるのね。。これ、人間がやるの?

tech.preferred.jp

論文は、これ↓

arxiv.org

Mesh TensorFlowについて呟いてみたら、、、Kazさんが教えてくれた。

 

このビデオのようだが、これ、観たよ。ただ、Mesh TensorFlow のところは記憶にないな。。。

youtu.be


Mesh TensorFlow に関しては、TensorFlow Dev Summit ’19 の方にありますね。

 

www.youtube.com

Mesh TensorFlow、デバイスが Mesh Network になっているということね。

この記事にあるように、Google TPU v2/v3 は Mesh Network ね。

www.infoq.com

論文を眺めてみたら、

Mesh TensorFlowでは、

  • Data-Parallel Layout
  • Model-Parallel Layout
  • Data-Parallel, Model-Parallel Layouts

ができるんだって。

  • As of the writing of this paper, implementations exist for generating SPMD TensorFlow code for TPUs,or MIMD code (using device placement) for multi-CPU/GPU configurations.

CPU/GPUは MIMD コードなんだね。using device placement とあるので、各デバイス毎のプログラムになるんだろうね。

TPUは、SPMD TensorFlow code とあるんだけど、どうなっているんだろうか?

Future Workには、

  • Implementation of SPMD programming on CPU/GPU clusters.

ともあるんだけど、うーん。

XilinxのBrevitasで学習した量子化モデル、QuartzNet

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

記録のために、

XilinxのBrevitasはこのブログでも、2019年10月22日に紹介しています。

vengineer.hatenablog.com

その、Brevitasを使って学習した量子化モデル、QuartzNet

xilinx.github.io

コードは、github にあります。この例題は speech_to_text ですが、この他

・imagenet_classification

・speech_to_text

・text_to_speech

もあります。

 

推論時のバッファ用メモリって?

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

先週の土曜日、GoogleのXNNPACKのソースコードを眺めていた時に、ちと気になったこと。。。

推論時の入力データからモデルに入って、出力データという流れにおいて、モデルの各Opの入力と出力に使っているバッファ用メモリってどのように使っているかというもの

 

Keras/TensorFlowやPyTorchで学習し、推論用環境に学習したモデルをインポートし、各環境用のモデルに変換しますよね。この時、各Opの入力と出力にはバッファを静的に割り当てているような気がします。推論するのがハードウェアアクセラレータならこのバッファは内部のSRAMを使います。一方、CPUの場合はメモリ(DRAM)を使います。バッファを何度も使うのであれば、DRAMからL2 Cache (ものによっては、L3 => L2 というのもあるでしょうが)にキャッシュされ、それを使うことになります。

各Opの入力・出力を再利用すること無しに使うと必ずDRAMにアクセスします。しかしながら、最初のOpの入力データに使ったバッファを次のOpの出力バッファに使えば、DRAMにアクセスせずに、L2 Cache 内にとどまる可能性が高いです。

スマホ用SoCでは、4コアに対して1MBぐらいありますが、再利用しないとすぐに1MBぐらい使いちゃいますよね。

たとえば、ResNet50の場合、最初の部分はこんな感じ。

入力データは、224*224*3 = 15KB

conv1 では、224*224*3 => 112*112*64 => 802KB

conv2.1 では、112*112*64 => 56*56*64 => 200KB 

1MBに入りそうだけど、Convのパラメータを考えると、無理ですね。

(パラメータをキャッシュに入れた方がお得だと思う)

x86-64ならCore i3でL2 が256KBで、L3 3MBぐらい。これなら、L3 Cache に入れられそう。

 

結論:バッファ用メモリを L2 Cache に入れられるほど、L2 は大きくない。

ただし、x86-64 の L3 Cache なら 入るかもしれない、という感じなのかな?

 

なんでこんなことを思ったのかというと、x86-64のプログラムの最適化をやっていた時に、Cache を上手く使えるようにメモリを割り当て、使い方を工夫するとめっちゃ速くなるという経験をしたからです。。。

 

Google XNNPackの実装

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

GoogleのXNNPackについては、このブログでも2回取り上げています。

vengineer.hatenablog.com

vengineer.hatenablog.com

で、実装を眺めてみました。f32-gemm です。

ここ にいろいろなファイルがありますね。ベンチマーク も。

4x8 の実装は、aarch32 で5種類、aarch64 で6種類もありますね。

  • aarch32 neon-ld64
  • aarch32 neon-cortex-a53
  • aarch32 neon-cortex-a55
  • aarch32 neon-cortex-a57
  • aarch32 neon-cortex-a75
  • aarch64 neonfma-ld64
  • aarch64 neonfma-ld128
  • aarch64 neon-cortex-a53
  • aarch64 neon-cortex-a55
  • aarch64 neon-cortex-a57
  • aarch64 neon-cortex-a75

Intelのライブラリのように、各Opに対して各CPUアーキテクチャに合ったコードがあるのね。。。

 この commit では、

4x8 GEMM and IGEMM microkernels for Cortex A55. 7.8% faster for e2e mobile net v2.

Was f32_gemm_4x8__aarch64_neonfma_cortex_a53/mobilenet_v2/real_time 132632 us
Now f32_gemm_4x8__aarch64_neonfma_cortex_a55/mobilenet_v2/real_time 123029 us

The rev 1 version of Cortex A55 can co-issue a 64 bit
vector load with each FMA, so re-arrange the Cortex-A53
microkernel with 3 FMA paired with 2 loads and INS.

とありました。

地道な改善。。。