【Xi IoT】自作 Runtime を作ろう【PyTorch】
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もはじめたようなもんです
- Xi IoTのオリジナルRuntime dockerfileを 入手(Nutanixへお問い合わせください)
- コンテナ作成、どこかのクラウドストレージへアップロード
- 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 を作ります
ハマりポイントは、「Container Registry Profile Host Address」をどう入力してやるかなんですが、Docker hub の場合はこんな記述になります
<https://index.docker.io/v1/>
Projectへ登録
コンテナレジストリを使いたいプロジェクトに登録してやります
これは何個でも登録できます
左のペインから [Projects] - プロジェクトを選択 - [Edit] - [Next]
Container Registry Selection で先ほど作成した Profileを選択
Runtime Environment へ登録
Project への登録が終わったら、ようやく Runtime の登録になります
Runtime Environment で Create します
【入力項目】
・Name:なんでもいいです
・Description:Python3.7とかバージョン名などメモ
・Project:先ほどのプロジェクトを選択
・Container Registry Profile:先ほど登録した Profile
・Container Image Path:Docker hubへプッシュした<アカウント名>/<リポジトリ名>
・Languages:ベースとなる言語
自作Runtime をつかう
これで、PyTorch をXi IoT上でも使えるようになりました!
早速 Function を作ってみて試してみます
※注意:Function を試すにはData Pipeline を作る必要があり、Data Source(センサーデバイス)からなんらかのデータが飛んできている必要があります
ちゃんと自作Runtime いました
とりあえずの動作確認用に PyTorch 定番の torch.tensor を出力してみます
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 )から、データ飛んできている必要があります
Real-Time logs を確認します
PyTorch の Tensor がエラーなく出力されています
やったー
ただ、jupyter notebook なんかに慣れると、ちょっとしたFunctionの確認でもメンドウだな、、、
Xi IoT検証環境をローカルに作りたいな。。。