Vengineerの妄想(準備期間)

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

ONNXでTraining?

 

 

 

 

[Training Add Adagrad optimizer operator #1955]

 

[Training Adam Optimizer #1970]

 

[Training SG with Momentum Optimizer #1959]

 

これらをPRしている人は、Wei-Sheng Chin さんMicrosoftの中の人ですね。

 

MicrosoftCNTKを開発していますが、
Twitterにもツイートしました、MXNetに抜かれ、6位になっちゃたんですよね。

 

推論専用のONNXに学習機能が付けば、
一気に順位入りしそうなのでONNXに力を入れているMicrosoftとしてはいいのかもしれませんね。

YahooブログからHatenaブログに移行しました。

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

かなり前からYahooブログが無くなるので、どこかに移行しないといけないなと思っていました。

Hatenaブログも移行先になったのですが、7月末にやっと移行ツールが出てきたので先週の土曜日に移行作業をやりました。

結構面倒かな?と思いましたが、

  • Hatenaに登録 (Vengineer取れました。すべてに Vengineer を)
  • Yahooブログの移行画面からHatenaを選択して、移行先を指定
  • 画像データも移行 (こちらは何度もクリックしないといけなかった)

ぐらいで、2番目のブログの移行は1時間半ぐらいで4500以上の記事を移行できました。

Yahooブログでは、Wiki記法 でブログ書いていたのですが、

Hatenaブログでは、書いて、おお飾り付けるだけなので、かなり便利です。

それから予約投稿とTwitterへの投稿もできるので嬉しいです。

Yahooブログでは2週間先までの記事しか書けませんが、

Hatenaブログではもっと先まで書けるのはいいですね。

統計データもブログを書いた日数は、年と月、全体数も出るのはいいです。

現時点の背景というかデザインは、

HatenaのデザインからPOPな感じがよかったので選びました。

Yahooブログの時とどうように適度に変えていきます。

 

P.S

HTMLなので、特別な理由が無い限り、改行は入れない方がいいみたいです。

 

追記)、2019.08.19

Yahooブログの2019.08.18までの訪問者数は、479,766 人でした。 

SynopsysのARCがオープンソースで公開?

 

いつものように、Google君に聞いていたら、見つけた

 

embARCというサイト。

 

引用です
   The embARC Community is a comprehensive resource for embedded developers, 
    providing a single point of access to Free and Open Source Software (FOSS), 
    Tools and Platforms to accelerate the development of embedded applications for ARC Processors.

 

これは、知らなかった。。。

 

Machine Learningに関しては、
  ・embARC Machine Learning Inference (MLI) Library
  ・Caffe Framework for Synopsys EV6x Processors
  ・Caffe Models for Synopsys EV6x Processors
  ・OpenCV for Synopsys EV6x Processors
があります。

 

embARC Machine Learning Inference (MLI) Libraryのソースコードをざっくり見たのですが、下記の図(引用です)にあるように学習済みモデルをMLIベースのCコードに変えるの大変そう。

 

https://embarc.org/embarc_mli/doc/build/html/_images/1_depl_process.png

 

ディープラーニング用のフレームワーク内でPython使ってモデルを学習するだけだけど、お気楽だけど、
ここにあるように学習済みモデルをArm用のC言語のコードに書き換えるのって、本当に大変そう。。。

 

ディープラーニングアクセラレータをハードウェア(ASICなど)で作っても、
この部分が大変なのでユーザーが増えなくて、スケールしなくて、儲からなくて、EOLになっちゃうパターン。

 

 

96Boards RK1808 & RK3399Pro SoM & Devkit

 

 

RockchipのSoC搭載の96Boardsが出たねん。

 

 

 

 ・3GB LPDRR3(CPU 2GB + NPU 1GB)
 ・16GB eMMC

 

DRAMがCPU用とNPU用が別なんだ。

 

SoMなので、ベースボードが必要だよね。。。。

 

あった、ベースボード。

 

 

なので、RK1808 ベースでは、125+59 = 184ドル、RK3399Pro ベースでは、125+119 = 244ドル。

 

RK3399搭載のボード、RockPro64

 

これによると、
    ROCKPro64 2GB Single Board Computer : Price: $59.99
    ROCKPro64 4GB Single Board Computer : Price: $79.99
    ROCKPro64-AI 4GB Single Board Computer : Price: $99.99

 

こっちは、-AI有無でメモリ4GBで同じ。ということは、NPU用には特別にメモリ付けていない?

 

メモリが多い…? VAMRS「TB-RK3399Pro(Toybrick RK3399Pro)」はNPU付きのRK3399Pro搭載でメモリ最大6GBを見たら、
3GB版と6GB版があるようですね。
引用
 Pine64「RockPro64」も”RK3399Pro”搭載モデルを予告していましたが、実現しませんでした。
 これはもともと”RK3399 Pro”が”RK3399″互換を予定されていたのですが、
 その方針が変更され、”RK3399″のチップサイズが22mm×22mmなのに対し、
 ”RK3399 Pro”は27mm×27mmとなり、再設計が必要だったためでした。
とあるので、NPU用にメモリ追加したんでしょうね。

 

ROCKPro64-AIは、NPU用メモリは搭載されていないと。。

 

写真を見ると、DRAMが1個と2個載っているようなので、1個の方がNPU用、2個の方がCPU用でしょうね。

 

お値段
 ・3GBメモリ+16GB eMMC : 249ドル(約27,300円)
 ・6GBメモリ+32GB eMMC : 299ドル(約32,800円)

 

なので、96Boards RK3399Pro SoM & Devkit の 119ドル + 125ドル = 244ドルは同じぐらいですね。

Ice LakeのOPIって、何?


IntelのIce Lakeって、CPUチップとI/Oチップ(昔のICH)って、DMIじゃあなくてQPIで繋げているのね。知らなかった。
いや、違う、QPIではなく、OPI だよ。


https://images.anandtech.com/doci/14679/U_and_Y_2_575px.png

Cannon LakeIntel® Core™ i3-8121U Processor

  Bus Speed    4 GT/s OPI

とあるので、OPIは、Ice Lakeからではなく、Cannon Lakeから導入されていたと。

その前に、Coffee Lakeは、Intel® Core™ i3-9100TE Processorは、8 GT/s DMI3 とありますね。

Cannon Lakeより転送レート高いよ。

OPIって、Whiskey LakeとAmber Lakeの正体によると、
引用
 On Package Interconnect、DMIがパッケージの中に入ったときにこの呼び方になった。
 基本的にはPCI Express x4でIntel独自プロトコルのインターコネクト)で接続されているPCHだ。

なんだ、呼び方が違うだけで、DMIなんだね。


DMI 3.0のバス帯域幅は8GT/sなのに対して,OPIは4GT/s

OpenVINOのDeep Learning Workbench



 ・Added Deep Learning Workbench Profiler for neural network topologies and layers

 ・Added new non-vision topologies: GNMT, BERT, TDNN (NNet3), ESPNet

 ・Introduced new Inference Engine Core APIs. Core APIs automate direct mapping to devices, 
    provide Query API for configuration and metrics to determine best deployment platform.

 ・Added Multi Device Inference with automatic load-balancing across available devices for higher throughput.

 ・Serialized FP16 Intermediate Representation to work uniformly across all platforms 
  to reduce model size by 2x compared to FP32, improve utilization of device memory and portability of models.

 ・Model Optimizer

  Renamed Intel® experimental layer Quantize to FakeQuantize 
  and ONNX Intel® experimental operator Quantize to FakeQuantize.

 ・Multi-Device plugin
  Automatic inference load-balancing between multiple devices
などなど。。。


ブラウザベースのプロファイラなんだね。。。

LeapMindのBlueOilとCNN IPは?


LeapMindのBlueOilに関する講演を聞いたんですが、そのスライドの中にChiselで開発しているIPがあるようですね。

AI技術やIoTなどの企業研究に特化した「CCSE2019」にて、CRO兼村による機械学習を使った科学領域における研究の発表と、新ハードウェアアクセラレータ設計を活用した顔検出デモを初公開!に情報がありました。
  【Convolutional Neural Network ProcessorをChiselで開発する】

  要旨
   近年RISC-VプロセッサやGoogle Edge TPUの開発に使われたChiselをCNNプロセッサ開発に使った事例を簡単に紹介します。

また、ちょっと先だけど、9月28日の第二回 Deep Learning Acceleration 勉強会(DLAccel #2)で聞けそう。

BlueOilのソースコードを調べてみたら、

RunTCAという関数があって、TCAConv2dの中で、下記のように、ホストメモリ => DMA => Conv2D TCA =>=>DMA => ホストメモリをやっていますね。
引用
    Measurement::Start("Sync UDMABuf Input");
    p.dma_input_buffer->sync_size(input_byte_size);
    p.dma_input_buffer->sync_for_device();
    Measurement::Stop();

    Measurement::Start("Conv2D TCA");
    de10_nano::RunTCA(p.device_input_phys_addr, p.device_output_phys_addr, p.device_kernel_phys_addr, p.thresholds, in_w, in_h,
      k_c, MAX_NBIT_QINPUT, out_w, out_h, out_c, k_w, k_h, cp.padding, cp.stride_along_height);
    Measurement::Stop();

    Measurement::Start("Sync UDMABuf Output");
    p.dma_output_buffer->sync_size(output_byte_size);
    p.dma_output_buffer->sync_for_cpu();
    Measurement::Stop();

RunTCAでは、

  static volatile uint32_t* csr = nullptr;
  if (csr == nullptr) {
    csr = reinterpret_cast<uint32_t*>(mapPhysicalMemory(HPS_TO_FPGA_LW_BASE, 0xFF));
  }

にて、CSR(レジスタ)にパラメータを設定して、

      csr[Csr::start] = 1;

にて、スタートレジスタに 1 を書いて、

    while (csr[Csr::statusRegister] != 127) {
        // std::cout << "Status " << csr[Csr::statusRegister] << std::endl;
        continue;
    }

ステータスレジスタが 127 (0xff)になるまで、ポーリングしていますね。

dlk::impl::TCAConv2dは、QuantizedConv2DでRUN_ON_FPGAが定義されている時のみ使われています。

このQuantizedConv2dは、Pythonコードのdlk/core/view.pyの run メソッド内で、
オペレータが Conv & op.is_quantized and nbit_qinput == 2 の時に、
        elif self.op.op_type == 'Conv':
                    conv_func = 'func_QuantizedConv2D'

で登録され、

                    {conv_func}({inputs_string}, {op.name}, scaling_factors::{op.name}, binConv2D_struct);
のように実行されていますね。
}}}