konchangakita

KPSを一番楽しんでいたブログ 会社の看板を背負いません 転載はご自由にどうぞ

【Xi IoT】自作 Runtime を作ろう【PyTorch】

f:id:konchangakita:20200529135406p:plain


Xi IoT上では、IoTセンサーデバイスからデータ処理をする手段は2種類あります
 1)データパイプライン
 2)Kubernetes Apps

このうちデータパイプラインは Function as a Serviceになり、標準で用意されたプログラミング言語環境でFunctionを作って組み合わせていきます
標準で用意されている言語
 ・Python(2, 3, TensorFlow)
 ・Golang
 ・Node.js

TensorFlowのruntimeは用意されていますが、せっかく勉強しているPyTorchは実装されていません。。。
なので、PyTorchモジュール自作RuntimeをDockerコンテナの形式でアップロードしてやることになります

作成の流れ

Dockerコンテナの知識さえあれば、案外簡単に作れてしまいます
この為にDockerもはじめたようなもんです

  1. Xi IoTのオリジナルRuntime dockerfileを 入手(Nutanixへお問い合わせください)
  2. コンテナ作成、どこかのクラウドストレージへアップロード
  3. Xi IoT管理画面よりダウンロード・適用

自作Runtime用のコンテナを作る

入手した dockerファイルを編集して、追加したいモジュールを追記します
追加するモジュール:pytorch, pytorch-lightning

FROM python:3.7
  
RUN python -V
# ///////////////////////////////////////////////////////
# /////////////  Python3 runtime //////////////////
# /////////////   オリジナル 部分 //////////////
# /////////////  ここは触らない //////////////////////
# ///////////////////////////////////////////////////////


# 追記の箇所
RUN pip install torch==1.5.0+cpu torchvision==0.6.0+cpu -f https://download.pytorch.org/whl/torch_stable.html
RUN pip install pytorch-lightning
# 追記の箇所

# ///////////////////////////////////////////////////////
# /////////////  Python3 runtime //////////////////
# /////////////   オリジナル 部分 //////////////
# /////////////  ここは触らない //////////////////////
# ///////////////////////////////////////////////////////
CMD ["/python-env/run.sh"]

ここからは、Dockerコマンドでイメージ作成、タグ付け、Docker hubへプッシュしてやります

Dockerイメージ作成

コマンド:docker build -t <イメージ名> <dockerfileの場所>

(例)
> docker build -t kon_pytorch15_env .
> docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
kon_pytorch15_env                 latest              1c8ab6faf29e        2 seconds ago          1.8GB

タグ付け

コマンド:docker tag <イメージ名> <アカウント名>/<リポジトリ名>:<タグ>

(例)
docker tag 1c8ab6faf29e konchangakita/kon_pytorch15_env:latest
> docker images
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
konchangakita/kon_pytorch15_env   latest              1c8ab6faf29e        2 seconds ago          1.8GB
kon_pytorch15_env                 latest              1c8ab6faf29e        2 days ago          1.8GB

Docker hubへログイン
> docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: xxxxxx
Password:
Login Succeeded

Docker hubへプッシュ
> docker push konchangakita/kon_pytorch15_env


Xi IoT管理画面で Runtime適用

Xi IoTポータルサイト上で、コンテナレジストリ、Runtime Environmentを設定してやります

コンテナレジストリ Profile の作成

作った Runtime コンテナをアップロードしてあるクラウド情報の Profile を作ってやります
AWSとかAzure、GCPとかとか設定してやってもOKです
今回はDocker hubの profile を作ります
f:id:konchangakita:20200529012905p:plain

ハマりポイントは、「Container Registry Profile Host Address」をどう入力してやるかなんですが、Docker hub の場合はこんな記述になります
https://index.docker.io/v1/
f:id:konchangakita:20200529013358p:plain

Projectへ登録

コンテナレジストリを使いたいプロジェクトに登録してやります
これは何個でも登録できます
左のペインから [Projects] - プロジェクトを選択 - [Edit] - [Next]
Container Registry Selection で先ほど作成した Profileを選択
f:id:konchangakita:20200528202231p:plain

Runtime Environment へ登録

Project への登録が終わったら、ようやく Runtime の登録になります
Runtime Environment で Create します
f:id:konchangakita:20200528220626p:plain


【入力項目】
Name:なんでもいいです
Description:Python3.7とかバージョン名などメモ
Project:先ほどのプロジェクトを選択
Container Registry Profile:先ほど登録した Profile
Container Image Path:Docker hubへプッシュした<アカウント名>/<リポジトリ名>
Languages:ベースとなる言語
f:id:konchangakita:20200528221742p:plain


自作Runtime をつかう

これで、PyTorch をXi IoT上でも使えるようになりました!
早速 Function を作ってみて試してみます

※注意:Function を試すにはData Pipeline を作る必要があり、Data Source(センサーデバイス)からなんらかのデータが飛んできている必要があります
f:id:konchangakita:20200529015354p:plain


ちゃんと自作Runtime いました
f:id:konchangakita:20200529100447p:plain


とりあえずの動作確認用に PyTorch 定番の torch.tensor を出力してみます
f:id:konchangakita:20200529100208p:plain

import logging
import torch
import torch.nn as nn
import pytorch_lightning as pl

def main(ctx, msg): 
    logging.info("Parameters: %s", ctx.get_config())
    logging.info("Receive msg from %s", ctx.get_topic())

    x = torch.randint(10, (1, 3, 5, 5))
    print(x)
    logging.info("pytorch output %s", x)


Data Pipeline に実装してみます
※Input (Data Source )から、データ飛んできている必要があります
f:id:konchangakita:20200529101012p:plain


Real-Time logs を確認します
f:id:konchangakita:20200529133807p:plain


PyTorch の Tensor がエラーなく出力されています
やったー
f:id:konchangakita:20200529133925p:plain


ただ、jupyter notebook なんかに慣れると、ちょっとしたFunctionの確認でもメンドウだな、、、
Xi IoT検証環境をローカルに作りたいな。。。