Advertisement

More Related Content

Similar to 組み込みxAI(15)

Advertisement

組み込みxAI

  1. 組み込みAI 2018/7/7 #nds56 Yukilab 菊地 優基
  2. 何それ?おいしいの? • 反応早い。(データ少なくする) • そんなに難しいことはできないかもしれないけど、 安い・賢い。 • 通信するときも生データを全部送 らなくて済むので省通信。 • (個人の所感です):今年爆発す る (エッジコンピューティング = AI+IoT) 勝手にいい感じにとってくれるカメラ様、らしい
  3. たとえばこれくらいのハード ウェアでもできることもある ARM Cortex-M4F 96MHz FPU付き $20 GPUの乗っている携帯は組み込み屋にとってエッジ(いぢれる)ではない・・ (遠い目//)
  4. ところであんた誰? • IoTフルスタックフリーランス (2012 - ) • AIの勉強中・業務応用開発は現在進行形 • IoTLT新潟、AI朝会主催 • Prototype Cafe - シェアオフィス兼open IoT作業所運営 • 海で遊ぶのが好きで、東京から新潟へ移住。仕事は変わらず
  5. AI仕事で使ったり、遊 んだりした人
  6. ワールドカップ見ました
  7. (普通の)AIプロジェクト 教師データ (画像など情報量多) AIモデル (例えばkerasを使っ たNN構造の定義) CPU/GPU 学習させる 学習済みモデル (hd5ファイル等)  (kerasなどで)読 み込んで予測などに 使う CPU/GPU ( 個 人 の 所 感 で す ) 学習は時間がかかって、計算 量もすごく多くて重たい 時間はそれほどでもないが、 計算量はあってやっぱり重たい
  8. 組み込みAI例 (制約:CPU弱、FPUやGPUがない場合も。ROMもRAMも少なめ) 教師データ (信号など情報量少) AIモデル (例えばkerasを使っ たNN構造の定義) CPU/GPU 学習させる 学習済みモデル (hd5ファイル等)  (kerasなどの)モ デルを参照して、C言 語などでモデル作っ て実行 MPU/FPU学習済みモデル C言語で扱える 様に変換 モデル(推論計算式) ROM 学習済みモデル (重み・バイアス値) ROMでいいかも モデルの使う変数 RAM
  9. ポイント(1/2) • ネットワークを使いづらい・早い応答が必要な、画像など重 くないセンサ信号処理でなにかしたいケース向けか。 • 学習を組み込みシステム内でやるのは無理が多そう。学習は 外でやる • できた結果(trained model=重み、バイアスの配列)とそれを 使用するモデル(計算)部分だけ組み込み機器の中で実装 • モデルの構造の理解 • モデルの吐き出すhd5ファイル(hd5ファイルじゃなくても いいが重み・バイアス値)の理解 • 組み込みMPU/FPU/GPUの機能の理解 • 組み込み側で支えるライブラリの理解
  10. ポイント(2/2) • 組み込みAIのプロジェクトはwater fallで はできない。 • 良い学習ができるまでモデル作り直し=> 評価の繰り返し • 組み込み機器内で希望するメモリ・時間・ エネルギー消費量の範囲内でできるか実 装して検証。だめなら、HWやSW修正か、 モデルから作り直しも。
  11. 応用 •産業用:個々の設備の異常検出(振動など) •人体・室内/室外環境など各種信号を元に異 常検出
  12. 辰岡鉄郎 インターフェース 2018/6
  13. MIT-BIH Arrhythmia database
  14. ひとりでやるのは大変 (必要なスキルセットが多い)
  15. (多分典型的な)AIエキスパートの理解
  16. q15フォーマット とは? へっ??
  17. keras/TensorFlow/Pandas/Python/… bit, register, asm, C,時々ライブ ラリ。 気になるのは実行速度とメモリ容量
  18. AI(多分特にML)の組み込み適用に あたっては両者(エンジニア・技術) を相互に理解することが必要です
  19. わからない? ですよね・・・
  20. 今週おぼえたのでここ で振り返り
  21. モデルを作る • Keras などを用いて作ります。 • まあ、python を使ってたとえば model = Sequential() model.add(Dense(512, input_shape=(N,))) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add((Dense(1), activation='sigmoid'))
  22. トレーニング • たくさんのデータが必要。数千∼数万 •(できればGPU付きの)PCでやると早い。 •時間はかかりますが、待っていれば終わる ので実作業はない。
  23. トレーニング結果の出力 •hd5データ形式ファイルのようなバイナリファイルにトレーニング結果(重 み・バイアス値)を書き出します。 •入っているのは、モデルの各レイヤの計算に必要な重みとバイアスの配列 •hd5プロジェクトのライブラリを使うと簡単に読み出すことができます。 •トレーニングの最後にモデルから別の形式で吐き出させることもできます。 hd5: https://support.hdfgroup.org/HDF5/doc/UG/HDF5_Users_Guide-Responsive%20HTML5/ index.html#t=HDF5_Users_Guide%2FDataModelAndFileStructure%2FThe_HDF5_Data_Model_and_File_Structure.htm
  24. トレーニング結果のC言語へ の変換 • h5ファイルを解析するライブラリなどの助けを借りて、h5 ファイルの中にある重み・バイアスを読み出し、C言語で 使えるように書き出します。 • 書き出す際には組み込み機器の中で演算できる様に(浮動 小数点のままだと計算遅いのがきになるとき)固定小数 点や、integerに変換 • python でも Cでも好きな言語で。個人的には、python かな・・
  25. 組み込み機器内のモデル • (C言語で書くとして) 組み込み機器の中にモデルを作ります。 • 行列の乗算・加算です。CPUでもできますが、FPUやGPUがあ れば高速。それらを効率的に支えるライブラリがあればベスト • 何をどう乗算して、加算するかはモデルのソースコードや参考 資料をみるとわかる
  26. C言語による実装例 ARM CMSIS-NNライブラリ利用 void gru_example(q15_t * scratch_input, uint16_t input_size, uint16_t history_size, q7_t * weights_update, q7_t * weights_reset, q7_t * weights_hidden_state, q7_t * bias_update, q7_t * bias_reset, q7_t * bias_hidden_state) { q15_t *reset = scratch_input; q15_t *input = scratch_input + history_size; q15_t *history = scratch_input + history_size + input_size; q15_t *update = scratch_input + 2 * history_size + input_size; q15_t *hidden_state = scratch_input + 3 * history_size + input_size; // reset gate calculation // the range of the output can be adjusted with bias_shift and output_shift arm_fully_connected_mat_q7_vec_q15_opt(input, weights_reset, input_size + history_size, history_size, 0, 15, bias_reset, reset, NULL); // sigmoid function, the size of the integer bit-width should be consistent with out_shift arm_nn_activations_direct_q15(reset, history_size, 0, ARM_SIGMOID); arm_mult_q15(history, reset, reset, history_size); // update gate calculation // the range of the output can be adjusted with bias_shift and output_shift arm_fully_connected_mat_q7_vec_q15_opt(input, weights_update, input_size + history_size, history_size, 0, 15, bias_update, update, NULL); // sigmoid function, the size of the integer bit-width should be consistent with out_shift arm_nn_activations_direct_q15(update, history_size, 0, ARM_SIGMOID); // hidden state calculation arm_fully_connected_mat_q7_vec_q15_opt(reset, weights_hidden_state, input_size + history_size, history_size, 0, 15, bias_hidden_state, hidden_state, NULL); // tanh function, the size of the integer bit-width should be consistent with out_shift arm_nn_activations_direct_q15(hidden_state, history_size, 0, ARM_TANH); arm_mult_q15(update, hidden_state, hidden_state, history_size); // we calculate z - 1 here // so final addition becomes substraction arm_offset_q15(update, 0x8000, update, history_size); // multiply history arm_mult_q15(history, update, update, history_size); // calculate history_out
  27. /* ---------------------------------------------------------------------- * Copyright (C) 2010-2018 Arm Limited. All rights reserved. * * * Project: CMSIS NN Library * Title: arm_nnexamples_gru.cpp * * Description: Gated Recurrent Unit Example * * Target Processor: Cortex-M4/Cortex-M7 * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * - Neither the name of Arm LIMITED nor the names of its contributors * may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * -------------------------------------------------------------------- */
  28. ARMのVFP アセンブラ命令 • VABS、VNEG、VSQRT
 浮動小数点絶対値、否定、および平方根 • VADD、VSUB、VDIV
 浮動小数点加算、減算、および除算 • VMUL、VMLA、VMLS、VNMUL、VNMLA、VNMLS
 必要に応じて否定を伴う浮動小数点乗算および積和 • VFMA、VFMS、VFNMA、VFNMS
 必要に応じて否定を伴う結合浮動小数点積和および結合浮動小数点積差 • VCMP
 浮動小数点比較 • VCVT(単精度と倍精度の間)
 単精度と倍精度間の変換 • VCVT(浮動小数点と整数間の変換)
 浮動小数点と整数間の変換 • VCVT(浮動小数点と固定小数点間)
 浮動小数点と固定小数点間の変換 • VCVTB、VCVTT(半精度拡張)
 半精度浮動小数点数と単精度浮動小数点数間の変換 • VMOV
 単精度または倍精度レジスタへの浮動小数点イミディエート値の挿入
  29. ARM CMSISライブラリ https://github.com/ARM-software/CMSIS_5 http://arm-software.github.io/CMSIS_5/General/html/index.html
  30. ARM CMSIS-DSP/NN ライブラリ • https://github.com/ARM-software/CMSIS_5 あたりを見 るといいと思います。 • CPUによる実装も書いてあります。FPUがある場合はFPUを 使った高速な演算をしてくれます。 • CMSIS_5 じゃなくても古いCMSISでも、ハックすれば使え ます。 • 無理そうだったら CPU直でも、古いCMSISにも入っている CMSIS-DSPでこつこつやっても。乗算と加算しか使いません。
  31. • 使ってるMPUじゃとってもAI処理なんて無理、と思って ましたが、意外と工夫すればできそうです。(現在進行形 なので答えはないけど) • AIのエンジニアと組み込みハード・ソフトエンジニアがす り寄れば実現できます。 • 続きは 7月末の IoTLT新潟で。 • 年末から来年にかけてエッジAIチップが出て安くなってき たらそれを使えば良いだけになり、この実装は無駄にな る・・? MPU / FPGA / GPU /他HWの戦いの年です。
  32. 参考&謝辞 • インターフェース誌 2018/6月号  辰岡さんの記事 • 辰岡さん(東京) • Blincamの Sumanthさん (新潟市 Prototype Cafeにいま す) • Python プロフェッショナルプログラミング 第3版 • ARMのAI戦略 : http://eetimes.jp/ee/articles/1803/23/ news070_2.html
  33. 新潟市無料解放場所の ご案内
  34. • 無料 電子工作・IoTシェア作業所。勉強・仕事もOK。新潟駅から徒歩10分。 特にオ フィスメンバに用事がなくてもOK。相談もOK。 • おおよそ平日 9:00 - 17:00 空いてます。他の時間帯もお知らせいただければ開けられます。 (twitter @Prototypecafe で open時間など流してます) • 技術・デザイン・経営など勉強会・コミュニティーに一度以上参加する・参加している方 と関係者向けにスペース解放。 • 基本的に部品の販売はありませんが要望あれば。 • 飲食の提供はありません。持ち込み・飲酒/食自由。 • WiFi/電源/電気・IoT系雑誌などおいてます • 展示スペースあり。 • どうしてもという方には、営業・有料セミナー用に有料解放します。費用は応相談。 • 飲み物・部品・お菓子寄付歓迎。来場者用です。 • 制約これだけ:半面はシェア作業所・オフィスです。利用はお静かに。片付けをお願いします 依頼されない限りこの場所での営業はありません。どんどん使ってください。 よくわらなくてできない・やらない・機会がない、相 談できる人がいない、学びをシェアしたい、を解決し て前に進めるようにスペースを解放
  35. 電子工作に必要な道具一式 3Dプリンタ・工具 オシロ、マルチメータ 電源 エアコンプレッサ ホワイトボード プロジェクタ など使えます。 cafe内にある部品は使ってみたりできます。ラ ズパイ・micro:bitなども これまでに開催されたもの ・IoTLT新潟 ・某社内勉強会 ・組込系Python Bootcamp (勝手開催 2回) ・グロービス新潟会 ・AI朝活 ・製品化のための電子回路相談
  36. ありがとうございました @yukilab222 Prototype Cafeのトイレの水が止まらない時があります。 今は住人が音を聞きつけて止めてますが、 誰か組み込みMLで解決してください(^n^);;; AI朝活 Vol.4 は明日早朝 IoTLT新潟 Vol.6 は 7/29です
Advertisement