Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Mulvery技術詳細

3,418 views

Published on

Mulveryの技術の詳細をまとめました

Published in: Software
  • Sex in your area is here: ❤❤❤ http://bit.ly/2F7hN3u ❤❤❤
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Follow the link, new dating source: ❶❶❶ http://bit.ly/2F7hN3u ❶❶❶
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • ACCESS that WEBSITE Over for All Ebooks (Unlimited) ......................................................................................................................... DOWNLOAD FULL PDF EBOOK here { http://bit.ly/2m6jJ5M } ......................................................................................................................... DOWNLOAD FULL EPUB Ebook here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download Full PDF EBOOK here { http://bit.ly/2m6jJ5M } ......................................................................................................................... Download EPUB Ebook here { http://bit.ly/2m6jJ5M }
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • ..............ACCESS that WEBSITE Over for All Ebooks ................ ......................................................................................................................... DOWNLOAD FULL PDF EBOOK here { https://urlzs.com/UABbn } ......................................................................................................................... Download Full EPUB Ebook here { https://urlzs.com/UABbn } .........................................................................................................................
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • ..............ACCESS that WEBSITE Over for All Ebooks ................ ......................................................................................................................... DOWNLOAD FULL PDF EBOOK here { https://urlzs.com/UABbn } ......................................................................................................................... Download Full EPUB Ebook here { https://urlzs.com/UABbn } .........................................................................................................................
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Mulvery技術詳細

  1. 1. Mulvery CPU+FPGAプラットフォームのための Rubyベースの開発環境(技術詳細) 2017年度 未踏事業 スーパークリエータ まるさ 12018/05/10
  2. 2. 自己紹介 まるさ(照屋大地) 2017年度未踏事業 スーパークリエータ 東京農工大学 工学府 博士後期課程 2018/05/10 2 ほとんど気づいてもら えなかったけどロゴを 紋代わりにした
  3. 3. アジェンダ 1. Mulveryの概要ときっかけ 2. ReactiveXとハード合成のアイデア 3. 未踏での開発 • ハード合成の仕組みの試行錯誤 • ラムダ抽象の合成 • Schedulerの合成 • ソフト/ハードの連携 4. 余談 2018/05/10 3
  4. 4. マイコン Internet きっかけ:IoTデバイス開発の課題 2018/05/10 4 多数の高速な 外部I/Oを扱いたい センサデバイス
  5. 5. FPGA Internet 2018/05/10 5 内部の論理回路を自由に 組み換え可能なチップ 「処理のハードウェア化」 ネットワークに 接続したい きっかけ:IoTデバイス開発の課題センサデバイス
  6. 6. マイ コン FPGA Internet 2018/05/10 6 多数の高速な 外部I/Oを扱いたい ネットワークに 接続したい CPU+FPGA環境 におけるシステム開発の簡略化がしたい! きっかけ:IoTデバイス開発の課題センサデバイス 連携が面倒 “ぜんぶRubyだけでサクサク書きたい” Mulveryプロジェクト
  7. 7. CPU FPGA Mulveryフレームワークとは? 2018/05/10 7 Internet ソフトウェア 開発段階 開発するシステム ハードウェア Mulvery フレームワーク Ruby ソースコード ハード化対象を 自動で抽出 回路設計の 知識不要 セ ン サ ( ア ク チ ュ エ ー タ )
  8. 8. マイ コン FP GA Internet 2018/05/10 8 CPU+FPGA環境 におけるシステム開発の簡略化がしたい! きっかけ:大量のマイクを扱いたいセンサ群 開発が ちょっと面倒 扱いやすいけど パワー不足 “ぜんぶRubyだけでサクサク書きたい” Mulveryプロジェクト 連携が面倒
  9. 9. これまでに作ってきたもの 2018/05/10 9 高専ロボコン(’10~) 高専プロコン(‘11~) Android開発(‘12~) 電気自動車ECU(‘13) 自律分散システム (’15~) FPGA開発支援環境 (’16~) もっと早くFPGAに 気づけたら・・・
  10. 10. システムづくりデビュー 2018/05/10 10 賢く可視化、簡単節電 かしこん!! (2012年度高専プロコン 自由部門) 通信+センシングは つらい・・・ PLC FPGA使えない かなあ
  11. 11. メモリ CPU FPGA 2 デバイス ドライバ ソフトウェア ソフトウェア ソースコード群 ハードウェア 制約ファイル ハードウェア 設計ファイル ハードウェア ソースコード群 Network ソフトウェア 開発するシステム ハードウェア 開発段階 これまでの再構成可能計算システム 課題1 幅広い知識が必要 2018/05/10
  12. 12. set_directive_pipeline “Interface::get_data /get_data_loop0” 高位合成とその複雑さ • 高位合成(High Level Synthesis, HLS) 3 CやJava等の高級言語を,ハードウェア記述言語(HDL) によるレジスタ転送レベル(RTL)設計に変換する技術 ビヘイビア 記述 (高級言語) 最適化 指示の記述 (専用命令) 高位合成系 RTL設計 (HDL) シミュレータ による評価 FPGA 課題2 「動作記述≠構造記述」 →HW技術者による最適化が必要 2018/05/10
  13. 13. CPU FPGA 目指すところ 2018/05/10 13 Internet ソフトウェア 開発段階 開発するシステム ハードウェア Mulvery フレームワーク mRuby ソースコード FPGAとの つなぎ込み不要 回路の知識 不要 セ ン サ ( ア ク チ ュ エ ー タ )
  14. 14. CPU FPGA データ処理のアクセラレータにも 2018/05/10 Internet ソフトウェア 開発するシステム ハードウェア ネットワーク接続, データのパース・整形, 条件分岐の多い処理, ... ストリームデータの アグリゲーション, 操作, 並列処理, ... 14
  15. 15. HW-SW協調設計環境 15 • C/C++コードの一部をハードウェア化 • オフロード対象を明示的に指定する Intel FPGA SDK for OpenCL 2018/05/10 高速化のための 試行錯誤が必要 ⇒HW技術者向け
  16. 16. 軽量言語によるメタプログラミング 162018/05/10 CλaSH (Haskell)(Scala) • 軽量言語をドメイン固有言語(DSL)として用いる • 生成されるHWを設計しておく必要がある (ScalaもHaskellも強い静的型付けでHW合成しやすそう) class Max2 extends Module { val io = new Bundlw { val x = UInt(INPUT, 8) val y = UInt(INPUT, 8) val z = UInt(OUTPUT, 8)} io.z = Mux(io.x > io.y, io.x, io.y) } ハードウェア記述言語の メタプログラミング ⇒HW技術者向け
  17. 17. マイコン+FPGAな環境? Trenz Electronics社 “Zynqberry” ラズパイみたい なものもある! マイコン+FPGAな Raspberry Pi 互換ボード 172018/05/10
  18. 18. PythonでFPGAを便利に使うヤツ 2018/05/10 • ハードウェアをAPI的にPythonから呼び出せる • SDK+ハードウェア • ハードは専門家が作る • DeepLearningや リアルタイム画像処理 で遊べる こういうの Rubyにもほしい! 18
  19. 19. ReactiveXと ハード合成のアイデア 2018/05/10 19
  20. 20. Mulveryのアプローチ 2018/05/10 20 Reactive Programmin (RP) 「データストリーム」をオブジェクトとして扱う プログラミングパラダイム Reactive Programmingを用いたプログラムからの合成 Web開発 Web開発 Android開発 今回は Rxを使ったコードを 速くする
  21. 21. ReactiveXとは • Observer Pattern … • LINQ ………………… • Scheduler …………… 2018/05/10 21 次の3つの要素を組み合わせて データフローを記述してプログラムを作る 非同期の実現 操作クエリの実装 スケジューリング
  22. 22. Reactive Programmingの例 2018/05/10 22 time map( event becomes 1 ) 1 1 1 1 1 2 3 4 scan(+) Source map scan ・データの到着回数を数える例: Data Flow Events Observable
  23. 23. Observer Pattern • Publish/Subscribeとも • ObserverがSubjectを観察する • RxではSubject=Observable 2018/05/10 23 ライブラリ側 ユーザ実装 イベントを 配信 イベントを 購読
  24. 24. Observer PatternとHW合成アイデア 2018/05/10 24 class Pin < SubjectBase <pin_watcherの定義> def notify(event) @observers.each do |o| o.onNotify(event) end end end Observer1 ハードウェア Observer2 ハードウェア … pin_watcher ハードウェア Pin pin_0 pin_0.addObserver do |e| <Observer1の定義> end pin_0.addObserver do |e| <Observer2の定義> end
  25. 25. LINQ • Language-INtegrated Query • データ列(DBとか)を操作するための標準クエリ 2018/05/10 25 ラムダ抽象の内容を各イベントに適用 図:Rxのページより
  26. 26. LINQ • Language-INtegrated Query • データ列(DBとか)を操作するための標準クエリ 2018/05/10 26 前に作ったデータとイベントのデータを使えるクエリ 図:Rxのページより
  27. 27. LINQ • Language-INtegrated Query • データ列(DBとか)を操作するための標準クエリ 2018/05/10 27 イベントをバッファして1つのイベントにする 図:Rxのページより
  28. 28. LINQ • Language-INtegrated Query • データ列(DBとか)を操作するための標準クエリ 2018/05/10 28 2つのデータフローを待ち合わせる 図:Rxのページより
  29. 29. LINQ • Language-INtegrated Query • データ列(DBとか)を操作するための標準クエリ 2018/05/10 29 一定時間後にイベントを発生させる 図:Rxのページより
  30. 30. LINQ on Reactive Extensions 2018/05/10 30
  31. 31. LINQとHW合成アイデア 2018/05/10 31 time map( event becomes 1 ) 1 1 1 1 1 2 3 4 scan(+) Source map HW scan HW ・データの到着回数を数える例(再掲) 各HWは HDLのテンプレート から合成 Events Observable
  32. 32. Scheduler • 動作スレッドを制御するための仕組み • たとえばTimerだと・・・ 2018/05/10 32 o1 = Observable.timer(1) do p “this is o1” end o2 = Observable.timer(1) do p “this is o2” end Current Thread Local Thread Local Thread this is o1 this is o2 timer(len, scheduler=DefaultScheduler) 使い方に応じてschedulerを変える
  33. 33. Scheduler 2018/05/10 33 m_th = LocalScheduler.new o1 = Observable.timer(1, m_th) do p “this is o1” end o2 = Observable.timer(1, m_th) do p “this is o2” end Current Thread Local Thread this is o1 this is o2 • 同一スレッドで時間計測させる例 SchedulerBaseを使って 任意の戦略が実装可能
  34. 34. SchedulerとHW合成アイデア 2018/05/10 34 Current Thread Local Thread this is o1 this is o2 • 動的スケジューリングを制限すれば そのままデータフローグラフとして扱えそう Source o1 HW o2 HW Current Thread HW
  35. 35. 未踏での開発 2018/05/10 35
  36. 36. 実装しなければならないもの 1. HW抽出機構 2. HW合成機構 3. ラムダ抽象の合成 4. Schedulerの合成 5. ソフト/ハード連携 2018/05/10 36
  37. 37. V1:静的解析による実装 • mRubyのフロントを使って合成系を実装 • トランスパイラのようなものを作る 2018/05/10 37
  38. 38. 型推論機構の実装 • Observableを抽出したい • Rx記述をハード、それ以外をソフトとして実行したい • 動的型付け言語なので型推論が必要 2018/05/10 38 とりあえず Observableと 数値型さえ 見つかればOK
  39. 39. 静的解析による実装の問題 • mRubyのパーサの実装がイマイチだった • ASTいじりたいのにメモリ解放の機構がない • 自前で新しく作り足したAST操作機構がバグだらけ • 結局mRubyにベッタリになってしまう • 後々フロント/バックに分離したくても難しい 2018/05/10 39
  40. 40. V2:動的解析による実装 • 多段階計算を使った動的解析の実装への舵切り • フレームワークとして提供するので 通常のRubyで合成も実行も全部できる 2018/05/10 40
  41. 41. ハード/ソフトの自動分割 41 I2C Bus A groupBy averag e averag e 0x1234 0x5678 データフローグラフ def initialize() i2c_stream = Stream.new(I2C_BUS_A) sensors = i2c_stream.group_by(2) { |d| d. sensor_ id } for sensor in sensors do @averages[sensor] =sensor.average(5) end end def main() for average in @averages do p average[sensor].get_latest() end wait_ms(100) end ソフトウェア部ハードウェア部 sensors[A] Sensors[B] averages[B]averages[A] i2c_stream Rxで書きにくい部分は 多く場合ソフト実行が速い Rx記述⇒ハード それ以外⇒ソフト ハード化 メモリに マップ 2018/05/10
  42. 42. ハードウェア合成の例 2018/05/10 42 events = Stream.new(MIO::p0) count = events .map(){ |event| 1 } .scan(){ |acc, x| acc + x } Streamオブジェクトが ハードウェアを生成する
  43. 43. ハードウェア合成の例 2018/05/10 43 events = Stream.new(MIO::p0) count = events .map(){ |event| 1 } .scan(){ |acc, x| acc + x } module S_0(p0); … endmodule Streamオブジェクトが ハードウェアを生成する S_0.v
  44. 44. ハードウェア合成の例 2018/05/10 44 events = Stream.new(MIO::p0) count = events .map(){ |event| 1 } .scan(){ |acc, x| acc + x } module S_0(p0); … Map_0 map_0( .din(w_0_0), .v_din(v_w_0_0), .dout(w_0_1), .v_dout(v_w_0_1)); endmodule module Map_0(…); … dout <= 8’d1; v_din <= 1’b1; … endmodule Streamオブジェクトが ハードウェアを生成する Map_0.vS_0.v テンプレート から生成
  45. 45. ハードウェア合成の例 2018/05/10 45 events = Stream.new(MIO::p0) count = events .map(){ |event| 1 } .scan(){ |acc, x| acc + x } module S_0(p0); … Map_0 map_0( .din(w_0_0), .v_din(v_w_0_0), .dout(w_0_1), .v_dout(v_w_0_1)); Scan_0 scan_0( … endmodule module Map_0(…); … dout <= 8’d1; v_din <= 1’b1; … endmodule Streamオブジェクトが ハードウェアを生成する module Scan_0(…); … endmodule Scan_0.v Map_0.vS_0.v
  46. 46. ハードウェア合成の例 2018/05/10 46 events = Stream.new(MIO::p0) count = events .map(){ |event| 1 } .scan(){ |acc, x| acc + x } module S_0(p0); … Map_0 map_0( .din(w_0_0), .v_din(v_w_0_0), .dout(w_0_1), .v_dout(v_w_0_1)); Scan_0 scan_0( … endmodule module Map_0(…); … dout <= 8’d1; v_din <= 1’b1; … endmodule Streamオブジェクトが ハードウェアを生成する module Scan_0(…); … endmodule Scan_0.v Map_0.vS_0.v 他にも・・・ ・Topモジュール ・計算カーネル etc…
  47. 47. 実装しなければならないもの 1. HW抽出機構 2. HW合成機構 3. ラムダ抽象の合成 4. Schedulerの合成 5. ソフト/ハード連携 2018/05/10 47 ✔ ✔
  48. 48. ラムダ抽象の合成について • LINQクエリの多くは高階関数 • ラムダ抽象の合成はどうしよう・・・ ⇒現状は用途に合わせた 多段階計算で誤魔化している 2018/05/10 48
  49. 49. サンプル:畳み込み演算 • 128x128の画像に対するラプラシアンフィルタ適用 2018/05/10 49 ∗ = … 128画素 (1行) … … … … … 入力バッファ 5行バッファ 畳み込みx128 … 128画素 (1行)
  50. 50. result コーディング例 2018/05/10 50 buffer = input.sliding_buffer(5) line = buffer.map(){ |data| mats = Array.new() for i in (0…SIZE) do mats.push(Matrix[data[0][i, 5], ¥ data[1][i, 5], ¥ data[2][i, 5], ¥ data[3][i, 5], ¥ data[4][i, 5]]) end result_row = Array.new() mats.map() do |mat| result_row.push(mat.conv(kernel)) end } result = line.buffer(128) input sliding_ buffer map buffer 5行ぶん待つ 5行毎に処理(畳み込み) 128行出力待つ
  51. 51. コーディング例 2018/05/10 51 buffer = input.sliding_buffer(5) line = buffer.map(){ |data| mats = Array.new() for i in (0…SIZE) { mats.push(Matrix[data[0][i, 5], ¥ data[1][i, 5], ¥ data[2][i, 5], ¥ data[3][i, 5], ¥ data[4][i, 5]]) } result_row = Array.new() mats.map() { |mat| result_row.push(mat.conv(kernel)) } } result = line.buffer(128)
  52. 52. ラムダ抽象をメタプロ的に扱う 2018/05/10 52 buffer = input.sliding_buffer(5) line = buffer.map(){ |data| mats = Array.new() for i in (0…SIZE) { mats.push(Matrix[data[0][i, 5], ¥ data[1][i, 5], ¥ data[2][i, 5], ¥ data[3][i, 5], ¥ data[4][i, 5]]) } result_row = Array.new() mats.map() { |mat| result_row.push(mat.conv(kernel)) } } result = line.buffer(128) data mats Array, Matrixは オーバーロード されている
  53. 53. ラムダ抽象をメタプロ的に扱う 2018/05/10 53 buffer = input.sliding_buffer(5) line = buffer.map(){ |data| mats = Array.new() for i in (0…SIZE) { mats.push(Matrix[data[0][i, 5], ¥ data[1][i, 5], ¥ data[2][i, 5], ¥ data[3][i, 5], ¥ data[4][i, 5]]) } result_row = Array.new() mats.map() { |mat| result_row.push(mat.conv(kernel)) } } result = line.buffer(128) data mats mat kernel result_ row (convolution)
  54. 54. IF文のハードウェア化 2018/05/10 54 line = buffer.map(){ |data| check(data == 0) { do_something_1() } .elsewhen(data == 1) { do_something_2() } .otherwise { do_something_3() } .endcheck } check CheckContext#elsewhen CheckContext#otherwise CheckContext#endcheck ハード合成時:すべて評価 ソフト実行時:IFとおなじ
  55. 55. 実装しなければならないもの 1. HW抽出機構 2. HW合成機構 3. ラムダ抽象の合成 4. Schedulerの合成 5. ソフト/ハード連携 2018/05/10 55 ✔ ✔ ✔
  56. 56. LocalThread_0 Schedulerの合成 2018/05/10 56 Current Thread Local Thread this is o1 this is o2 • Thread毎にステートマシンを持つ • CurrentThreadはかならずできる o1 HW o2 HW CurrentThread Current Thread HW
  57. 57. Schedulerの合成の問題 • 複数のThreadを同時にキックしたい場合 (未解決) 2018/05/10 57 o1 = Observable.timer(1) do p “this is o1” end o2 = Observable.timer(1) do p “this is o2” end Current Thread Local Thread Local Thread this is o1 this is o2 違うstateで キックしてしまう
  58. 58. 実装しなければならないもの 1. HW抽出機構 2. HW合成機構 3. ラムダ抽象の合成 4. Schedulerの合成 5. ソフト/ハード連携 2018/05/10 58 ✔ ✔ ✔ ✔
  59. 59. ソフト/ハード自動連携 • 現状はかなり素朴な実装 • 共有メモリでデータ共有のみ 2018/05/10 59 I2C Bus A groupBy averag e averag e 0x1234 0x5678 データフローグラフ sensors[A] Sensors[B] averages[B]averages[A] i2c_stream ハード化 メモリに マップ ユーザアプリ(Ruby) Ruby拡張 (C言語) Debian OS管理 メモリ OS管理外 メモリ メモリアクセス機構 Ruby ライブラリ Mulvery合成回路 外部I/O Processing System Programmable Logic
  60. 60. 実装しなければならないもの 1. HW抽出機構 2. HW合成機構 3. ラムダ抽象の合成 4. Schedulerの合成 5. ソフト/ハード連携 2018/05/10 60 ✔ ✔ ✔ ✔ ✔
  61. 61. Mulveryの 楽しいところ 2018/05/10 61
  62. 62. これまでのハードウェアオフロード 2018/05/10 62 __kernel void func( __global int *data){ ... } ・オフロードする関数を指定する必要 ・オフロードした関数はFPGA上で実行 Intel FPGA SDK for OpenCL
  63. 63. 透過性の高い記述 2018/05/10 63 def func(data) … end stream_1 = Stream.new() grouped_stream_1 = stream_1.group_by{|d| func(d)} array_1 = [1, 2, 3, 4, 5, 6] grouped_array_1 = array_1.group_by{|d| func(d)} 非Stream: CPUで実行 Stream: FPGAで実行 データに近い場所で処理が行われる 透過性の高い記述
  64. 64. 透過性の高い記述の例2 2018/05/10 64 i2c_stream = Stream.new(I2C_BUS_A) sensors = i2c_stream.group_by(2) { |d| d. sensor_ id } averages = sensors.map{ |key, val| [key, sensor.average(5)] }.to_h() I2C Bus A i2c_stream groupBy average average sensors[A] Sensors[B] averages[B]averages[A] 同じメソッドが「ソフトウェア記述」 「ハードウェア記述」「generator文」の3役を果たす ⇒ハードにもソフトにもならないmap
  65. 65. デバイスコントローラとしての活用 65 1024個のフルカラーLED(NeoPixel)を制御してみる マイコン Web Server FPGA LED制御 LED マトリクス マイコンだと アセンブリが必要 akiba LED ピカリ館さんにて 1000個!? 一度にまとめて 動かせるんですか!? 1.25us信号 x24x1024 2018/05/10 Rubyの資産を使って システム実装できる
  66. 66. 用途の検討 工場IoTで使えるかも ⇒データアグリゲーションしたい ⇒でもオペレーションでFPGAは 触りたくない・・・ 車やロボは難しい ⇒必ずプロがチューニング 66 プロユースと汎用マイコン の境目にマーケット? FPGAベンダのXilinx社を訪問 2018/05/10
  67. 67. 余談 2018/05/10 67
  68. 68. ところで・・・ 合宿の時: 68 Twitterでは: micropython mruby Pythonのほうがよいかも? 2018/05/10
  69. 69. なぜRubyなのか 69 Rubyの方が見た目が好みだったから events = Stream.from_pin(MIO::p0) t = events.map(lambda event: 1) count = t.scan(lambda acc, x: acc + x) VS Python ・Method chainがしにくい ・ブロックが渡せない ⇒ちょっとイマイチ events = Stream.from_pin(MIO::p0) count = events .map(){ |event| 1 } .scan(){ |acc, x| acc + x } Ruby ・Method chainできる ・ラムダ抽象をブロックで ⇒かっこいい! 2018/05/10 (でも)今後はPythonにも展開していきたい
  70. 70. 自動テストの話 • RSpec+自作テスタ on Travis CI 2018/05/10 70 RSpecを用いた 各メソッド単体テスト makefileから テストハードの合成 Icarus Verilogで テストハードの動作検証 Vivadoでテストハードの 配置配線が通るかテスト on 自宅サーバ
  71. 71. 712018/05/10

×