Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Elixirで構成された3層構造からなるIoTシステムにおける分散機械学習・推論実行基盤へ向けて / Toward a Distributed Machine Learning Infrastructure for IoT Systems in Elixir

Elixirで構成された3層構造からなるIoTシステムにおける分散機械学習・推論実行基盤へ向けて / Toward a Distributed Machine Learning Infrastructure for IoT Systems in Elixir

Kentaro Kuribayashi

January 20, 2022
Tweet

More Decks by Kentaro Kuribayashi

Other Decks in Technology

Transcript

  1. Elixirで構成された3層構造からなる
    IoTシステムにおける
    分散機械学習・推論実行基盤へ向けて
    栗林 健太郎 / GMO PEPABO inc.
    2022.01.20 K-Ruby#28 LT&もくもく会
    1

    View full-size slide

  2. 2
    自己紹介
    GMOペパボ株式会社 取締役CTO
    栗林 健太郎 Kentaro Kuribayashi
    近況
    JAISTで社会人学生をやっています。現在は、修論をだ
    いたい書き上げたところ。そろそろ次の研究テーマの準
    備をしなければということで、ちょっとさわりについて話し
    ます。4月からは博士後期課程に進む予定。
    ● GitHub: @kentaro
    ● Twitter: @kentaro

    View full-size slide

  3. 3
    目指している世界
    クラウド層で機械学習したパラメタをデバイス層に配布し推論に用いる
    環境
    ① センシング
    ② データ中継・処理 ③ データ集約
    ④ 機械学習
    ⑤ パラメタ転送
    ⑥ 学習済みモデルによる推論
    学習済みパラメタのデバイスへの効率的な更新
    (Pratipadのユースケースのひとつ)
    センシングデータの効率的な処理と集約
    (Pratipad[1]が提供するデータフロー基盤)
    [1] 栗林 健太郎, 三宅 悠介, 力武 健次, 篠田 陽一, IoTシステムの双方向データフローにおける設計と実装の複雑さを解消する手法の提案, インターネットと運用技術シン
    ポジウム論文集, 2021, pp.48-55, Nov 2021.

    View full-size slide

  4. 4
    今回の予備実験
    ● やりたいこと:デバイス層、エッジ層、クラウド層をまたがった学習済みパラメタの配布と、配
    布されたパラメタを用いた学習済みモデルによる推論の実施
    ● 今回試すこと:層をまたいで起動しているものと見立てた
    2つのElixirノード間で、学習済み
    モデルをノード間通信で配布した上で推論
    Elixirのノード間通信で学習済みパラメタを配布し、それを用いて推論する
    学習用ノード 推論用ノード
    ① パラメタ配布要求
    ② パラメタ配布
    ③ パラメタを用いた
    学習済みモデルによる推論
    機械学習
    ※ 実際には、学習用ノードから pushする構成を検討している

    View full-size slide

  5. 5
    利用する機械学習モデル(?)
    機械学習モデルはなんでもいいので、今回はFizzBuzzモデル[2]を使う
    [2] Elixir/Nxを使ってFizzBuzzをディープラーニングで解く https://zenn.dev/kentarok/articles/2402ff378dd6e8

    View full-size slide

  6. 6
    Elixirノードの準備
    $ iex --sname learner -S mix
    iex(learner@keyaki)1> {:ok, pid} = Learner.start_link()
    {:ok, #PID<0.226.0>}
    $ iex --sname predictor -S mix
    iex(predictor@keyaki)1> Node.connect(:learner@keyaki)
    true
    iex(predictor@keyaki)2> Predictor.start_link()
    {:ok, #PID<0.222.0>}
    学習用ノード
    学習用・推論用の2つのノードを起動してノード間通信を確立する
    推論用ノード
    ノード間通信の確立

    View full-size slide

  7. 7
    初期状態での推論
    iex(predictor@keyaki)3> params = Predictor.retrieve_params()
    iex(predictor@keyaki)4> Predictor.predict(params)
    1: prediction: Buzz, answer: 1, matched?: false
    2: prediction: Buzz, answer: 2, matched?: false
    3: prediction: Buzz, answer: Fizz, matched?: false

    98: prediction: Buzz, answer: 98, matched?: false
    99: prediction: Buzz, answer: Fizz, matched?: false
    100: prediction: Buzz, answer: Buzz, matched?: true
    ================
    Accuracy: 0.14
    初期値のランダムなパラメタで推論すると当然うまくいかない
    推論用ノード
    学習用ノードからパ
    ラメタを取得する関

    View full-size slide

  8. 8
    学習用ノードでの学習
    iex(learner@keyaki)2> GenServer.cast(pid, :learn)

    epoch 50, batch 192
    epoch 50, batch 193
    epoch 50, batch 194
    epoch 50, batch 195
    epoch 50, batch 196
    epoch 50, batch 197
    epoch 50, batch 198
    epoch 50, batch 199
    学習用ノードで、データセットに基づいて機械学習させる
    学習用ノード

    View full-size slide

  9. 9
    学習済みモデルを用いた推論
    iex(predictor@keyaki)5> params = Predictor.retrieve_params()
    iex(predictor@keyaki)6> Predictor.predict(params)
    1: prediction: 1, answer: 1, matched?: true
    2: prediction: 2, answer: 2, matched?: true
    3: prediction: Fizz, answer: Fizz, matched?: true

    98: prediction: 98, answer: 98, matched?: true
    99: prediction: Fizz, answer: Fizz, matched?: true
    100: prediction: Buzz, answer: Buzz, matched?: true
    ================
    Accuracy: 1.0
    学習済みモデルを用いて精度の高い推論ができた
    推論用ノード
    ※ ここで利用しているモデルは一種のジョークモデルなので、Accuracyの適切性については気にしないでくださいw
    学習用ノードからパ
    ラメタを取得する関

    View full-size slide

  10. 10
    用語の補足
    モデル自体は学習用も推論用も同じ。配布しているのは学習済みパラメタ
    パラメタ
    モデル
    学習済みモデル
    このパラメタを学習用ノードで学習して、
    推論用ノードに配布している
    https://github.com/kentaro/elixir_remote_learning_demo/blob/
    main/lib/learner.ex#L8-L13
    https://github.com/kentaro/nx_fizzbuzz/blob/main/lib/nx_fizzbu
    zz/model.ex#L42-L50

    View full-size slide

  11. 11
    今回の取り組みでわかったこと
    ● 学習用ノードと推論用ノードを分ける構成を採ることは可能
    ● 学習用ノードで学習したパラメタを、
    Elixirのノード間通信を通じて配布できる
    ● 配布されたパラメタを用いて、学習済みモデルによって期待通りに推論ができた
    今後に向けて:
    ● より規模の大きいデバイス層、エッジ層、クラウド層の
    3層構造のIoTシステムで同様の仕組
    みを実現する
    ● パラメタの効率的な配布のために、エッジ層に
    Pratipadを利用する
    今回の実装コードは https://github.com/kentaro/elixir_remote_learning_demo/ をご覧ください。
    3層構造からなるIoTシステムにおいて、学習・推論を分けて実行できそう

    View full-size slide

  12. 12
    Thank You!
    Thank You!

    View full-size slide