Vengineerの戯言 (Yahooブログから移行しました)

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

TensorFlow Lite (GPU, Google Edge TPU)関連いろいろ

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

8月の上旬からお盆までに見つけた TensorFlow Lite (GPU, Google Edge TPU)に関するものを集めてみました。

インターンでも Edge TPU を利用しているんですね。

tech-blog.optim.co.jp

 

Yoshikawaさん作

 

 これ凄いですよね。Edge TPUにあわせて、モデルのチューニングもしているんですよね。

blog.hackster.io

Google AI のブログでも紹介。

ai.googleblog.com

 

このリリースで、Post-training quant もサポートされました。

また、TF Lite delegate も追加されました。

developers.googleblog.com

 

Google Japanのイベントでのビデオが公開されました。

D1-4-S11: Edge TPU でインテリジェントな IoT サービスの実現

www.youtube.com

 

LSTM Object DetectionのTensorFlow Liteモデルで、Edge TPU でもサポート

github.com

config_setting(
name = "enable_edgetpu",
define_values = {"enable_edgetpu": "true"},
visibility = ["//visibility:public"],
)

cc_library(
name = "mobile_ssd_tflite_client",
srcs = ["mobile_ssd_tflite_client.cc"],
hdrs = ["mobile_ssd_tflite_client.h"],
defines = select({
"//conditions:default": ,
"enable_edgetpu": ["ENABLE_EDGETPU"],
}),
deps = [
":mobile_ssd_client",

 

"@com_google_glog//:glog",

"@com_google_absl//absl/memory",
"@org_tensorflow//tensorflow/lite:arena_planner",
"@org_tensorflow//tensorflow/lite:framework",
"@org_tensorflow//tensorflow/lite/delegates/nnapi:nnapi_delegate",
"@org_tensorflow//tensorflow/lite/kernels:builtin_ops",
"//protos:anchor_generation_options_cc_proto",
"//utils:file_utils",
"//utils:ssd_utils",
] + select({
"//conditions:default": ,
"enable_edgetpu": ["@libedgetpu//libedgetpu:header"],
}),
alwayslink = 1,
)

 

TensorFlow 1.14のARM 32 ARM 64 x86-64の Python 3.5 と 3.7 のパッケージがあります。

x86-64 だけは、3.6 のパッケージもあります。

www.tensorflow.org

 

 

TensorFlow Lite の「Post Training quantization」をするためのパラメータの設定。

converter.optimizations に、[tf.lite.Optimize.OPTIMIZE_FOR_SIZE] を設定する。

 

「Post-training quantization」の方針がいろいろ書いてある。

 

vFlat というアプリが TensorFlow Lite にて、GPU を利用していると。

 

え、Google Edge TPU Compiler ってオープンソースになるの?

 

 OpenGL ES v3.1版ではない、GPU Delegateも登場!

 

TensorFlow Lite の GPU Delegate に OpenCL版が登場

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

TensorFlow Lite の GPU Delegate は、OpenGL ES v3.1ベースですが。

OpenCLバージョンも公開されたようです。

github.com

github.com

ここで登録していますね。

TfLiteStatus DelegatePrepare(TfLiteContext* context, TfLiteDelegate* delegate) {
const TfLiteRegistration kRegistration = {
// .init
(TfLiteContext* context, const char* buffer, size_t) -> void* {
const auto* params =
reinterpret_cast<const TfLiteDelegateParams*>(buffer);
auto* gpu_delegate = GetDelegate(params->delegate);
// Everything below should happen in prepare function call, but TFLite
// for whatever reason forbids that.
const auto status = gpu_delegate->Prepare(context, params);
if (!status.ok()) {
context->ReportError(context, "TfLiteGpuDelegate Init: %s",
status.error_message().c_str());
return nullptr;
}
return gpu_delegate;
},
// .free
(TfLiteContext*, void* buffer) -> void {},
// .prepare
(TfLiteContext* context, TfLiteNode* node) -> TfLiteStatus {
if (!node->user_data) {
context->ReportError(
context,
"TfLiteGpuDelegate Prepare: delegate is not initialized");
return kTfLiteError;
}
// TODO(akulik): tflite tensors are not allocated here either. It would
// be good to set inputs and outputs only once here instead of setting
// them every time in .invoke.
return kTfLiteOk;
},
// .invoke
(TfLiteContext* context, TfLiteNode* node) -> TfLiteStatus {
const auto status = GetDelegate(node)->Invoke(context);
if (!status.ok()) {
context->ReportError(context, "TfLiteGpuDelegate Invoke: %s",
status.error_message().c_str());
return kTfLiteError;
}
return kTfLiteOk;
},
nullptr, // .profiling_string
0, // .builtin_code
"TfLiteGpuDelegate_New", // .custom_name
1, // .version
};
TfLiteIntArray* ops_to_replace = GetOpsToReplace(context);
const auto status = context->ReplaceNodeSubsetsWithDelegateKernels(
context, kRegistration, ops_to_replace, delegate);
TfLiteIntArrayFree(ops_to_replace);
return status;
}

 カーネルもいっぱいありますね。

 

MYIRのZU3EG, 784 Pin Package搭載SOM

 

 

ZU3EGって、Ultra96と同じだけど、Ultra96は484ピンパッケージで、MYIRのは784ピンパッケージ

 

引用です。
 ・System Memory – 4GB DDR4 @ 2,400MHz
 ・Storage – 4GB eMMC Flash, 128MB QSPI Flash
 ・On-module chips
 ・Gigabit Ethernet PHY
 ・USB PHY
 ・Intel Power Module
 ・Clock Generator
 ・2x Samtec 0.5mm pitch 160-pin high-speed headers bringing out
 ・Networking – Gigabit Ethernet
 ・USB – USB 2.0 interface
 ・4x PS GTR transceivers along with 2 GTR reference clock inputs
 ・4x PL GTH transceivers along with 1 GTH reference clock input
 ・PS JTAG interface
 ・156x user PL I/O pins
 ・Misc – 4x status LEDs, watchdog
 ・Power supply – 3.3V
 ・Dimensions – 60  x 52 mm (12-layer PCB design)
 ・Temperature Range – 0~70 Celsius (commercial grade)

 

Ultra96は、
引用です。
 ・Micron 2 GB(512M x 32)LPDDR4メモリ
 ・Delkin 16 GB microSDカード+アダプター
 ・ダウンロード可能なPetaLinux環境
 ・マイクロチップWi-Fi / Bluetooth
 ・Mini DisplayPort(MiniDPまたはmDP)
 ・1x USB 3.0 Type Micro-Bアップストリームポート
 ・2倍速USB 3.0、1倍速USB 2.0タイプAダウンストリームポート
 ・40ピン96ボード低速拡張ヘッダ
 ・60ピン96ボード高速拡張ヘッダ
 ・85mm x 54mmのフォームファクタ
 ・Linaro 96Boards Consumer Edition互換

 

メモリが4GB、eMMC(4GB)、GbE

 

 

お値段は、MYiR MYC-CZU3EG CPU module は399ドル、
開発ボード(CPU module付)は659ドル(cables, power supply, 16GB microSD card, etc…)

GlowのRuntimeの図が更新されていたよ

 

GlowのRuntimeが更新されていますよ。

 

Runtimeのソースコードの場所には、
 ・HostManager
 ・Executor
 ・Provisioner
の3つしかないけど、PartitionerDeviceManagerが必要です。

 

モデルを分割するのが Partitionerで、分割したグラフの実行するのが Executor、Executorが各デバイス(アクセラレータ)に対応した DeviceManager を起動する感じ。

 

で、Provisioner は何をするのか?

 

    The Provisioner takes in the list of executionDAG and assigns sub-function to specific devices. 
    The Provisioner compiles each sub-function and stores them in a map, 
    it then passes a pointer to the compiledFunction and a Module reference to the DeviceManager 
    to initialize the function on the device. 

    It fills in the remaining fields of the excecutionDAGs and returns them in a list to the HostManager.
とありますね。

 

分割したグラフから各デバイスへのサブ関数への割り当てを行い、サブ関数のコンパイルをして、
DeviceManagerにコンパイル済みの関数(compiledFunction)をわたすして、HostManagerに渡す。。。

 

HostManagerが全体を管理。。。。

 

HostManagerのaddNetworkメソッドの中で、Provisionerのprovisionを呼んでいますね。

 

Partitionもこの addNetwork メソッドの中で、provisionの前にpartitioner.Partition()を呼んでいますね。

Arm32ビットでもNCS2(Intel® Neural Compute Stick) + OpenVINO が使える

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

software.intel.com

によると、Intel Neural Compute Stick2 (Intel NCS2)がArm7でも動くようです。

Arm7といえば、Raspberry Piとかですよ。Raspberry Pi 以外にも Orange pi PC Plus や  ASUS Tinkerboard S でも動くようです。

 

OpenVINOをソースコードからのビルドして、OpenCVと合わせて推論すると。

software.intel.com

Open Source OpenVINO Toolkitについては、

2019年6月20日のブログ、

vengineer.hatenablog.com

2019年6月21日のブログ、

vengineer.hatenablog.com

 で紹介しています。

 

Arm7* Single Board Computers and the Intel® Neural Compute Stick 2 (Intel® NCS 2)

Ultra96とAlexaを統合!

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

www.hackster.io

によると、Ultra96とAlexa を統合。

必要なものは、AvnetのUltra96。

サービスとしては、Amazon Web Services AWS Lambda、Amazon Web Services AWS S3、Amazon Alexa Skills Kit が必要。

勿論、Xilinx Vivado Design Suite もね。

AWS S3が必要なのは、Ultra96からのファイルはこのS3にストアされるため。S3のデータをAWS LAMBDAにて、JSON Response => Alexa => JSON Request にて、S3に書き戻されると。。。

AWSへのサービスへのアクセスは、Pythonでできるんですね。

Alexa Skillというものを生成する必要があるんですね。

Ultra96からは ssh にて、AWSにアクセスするんですね。実際のコードは Ultra96上で動くPythonで。

FPGAで何かを行って、その結果をAWS S3にストアすればいいんですね。

どのくらいのデータを入れると、どのくらいの費用が掛かるのでしょうかね。

 参考)、

 ALEXAで開発入門してみたので自分なりに纏めてみる

によると、Amazon Developer のアカウントは費用がかからない。

AWS Lambdaは従量課金制。
Alexa AWSプロモーションクレジットのご紹介というのもありました。

通常のAWS無料利用枠は、毎月100万件のAWS Lambdaリクエストと最大750時間のAmazon Elastic Compute Cloud (Amazon EC2) コンピューティング時間

 

Alexa AWSプロモーションクレジットのご紹介

 

 

Intel Falcon Mesa

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

OGAWAさんのこのツイートにある「FPGAs for Deep Leaning」の中に関して、続き

Intel Falcon Mesa」って、Agilexの最初の製品ということなのね。

  • Machine learning
  • Object detection and recognition
  • Advanced driver assistance system (ADAS)
  • Gesture recognition
  • Face detection

なんか、カテゴリー分けの流動が違うような気がするが。。。

FPGA部は、Intel HyperFlex

EMIBにて、XCVR(各種高速インターフェース)、DRAM(HBM等)を接続すると。

 

Wiki Chip