Custom Vision on IoT Edge v2 (Docker)
いままでCustom Visionにはあまり興味が無かったのですが、Build 2018のVision KeynoteでCustom VisionをIoT Edge v2(Docker)で動かしていたようなので試してみました。
Custom Vision
データの用意が簡単そうな、Classificationでやってみることに。compactじゃないと後でDockerfileにエクスポートできないようなので、‘General(compact)`を選びます。
手元に使えそうな、、、Wio LTEとWio 3Gの写真があったのでこれを買いました。
Custom Visonは初めてですが、なんとなくポチポチすれば大丈夫な感じですw
それぞれの写真にWio LTE
もしくはWio 3G
のタグを付けます。
どうやら、各タグに最低5枚の写真を用意しなければいけないようです。
で、Train
をポチっと。
なんか出来たっぽい♪
Quick Test
で、アップしていない画像をテストしてみます。
あれ?
どちらも0%だと。
気を取り直して、条件良さそうな画像でテスト。
83.7%でWio LTE。ちゃんと動いているようです。
じゃあ、Export
でDockerFile
を選んでみます。
LinuxかWindowsを選ばないといけないようなので、Linux
を選びます。
Dockerfileの入った、zipファイルが取れました。2.57MB。
Docker
手元にあるUPボードのUbuntu Server 16.04にzipファイルをコピー、解凍して、docker buildします。
$ docker build -t wio-module . unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/ubuntu/cv/Dockerfile: no such file or directory
あれれエラーw
ファイル名を変更して、再トライ。
$ docker build -t wio-module . Sending build context to Docker daemon 2.938MB Step 1/6 : FROM python latest: Pulling from library/python 3d77ce4481b1: Downloading [=> ] 1.609MB/54.26MB 534514c83d69: Downloading [======> ] 2.364MB/17.58MB d562b1c3ac3f: Downloading [==> ] 2.199MB/43.25MB 4b85e68dc01d: Waiting a60ceaabb01c: Waiting ba209b7a7239: Waiting 235ce1ab7310: Waiting bd6e9cb6b441: Waiting
今度は問題なく動き出しました。(これどこにフィードバックしたらいいんだろう、、、まぁ、すでに気づいているはずだ。うんうん。)
10分ほどで完了。
結構デカイな。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE wio-module latest fcc778e06ba7 8 seconds ago 1.1GB python latest d69bc9d9b016 5 days ago 691MB
では、実行してみましょう。
$ docker run -p 127.0.0.1:80:80 -d wio-module $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4eeaad81e990 wio-module "/bin/sh -c 'python …" 8 seconds ago Up 7 seconds 127.0.0.1:80->80/tcp trusting_lichterman $ docker logs 4eeaad81e990 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
動いているっぽい。
適当な画像をcurlでPOSTしてみると、
$ time curl -X POST http://127.0.0.1/image -H "Content-Type: application/octet-stream" --data-binary @IMG_0015.JPG { "created": "2018-05-10T13:09:01.371454", "id": "", "iteration": "", "predictions": [ { "boundingBox": null, "probability": 0.9996715784072876, "tagId": "", "tagName": "Wio LTE" } ], "project": "" } real 0m1.364s user 0m0.012s sys 0m0.028s
オォー
動いているっぽい。
Dockerコンテナのログは、
$ docker logs 4eeaad81e990 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit) 2018-05-10 13:07:15.363135: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 172.17.0.1 - - [10/May/2018 13:07:16] "POST /image HTTP/1.1" 200 -
POST来てますね♪
Dockerコンテナのメモリ使用量は115MBでした。
$ docker stats 4eeaad81e990 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 4eeaad81e990 trusting_lichterman 0.03% 114.6MiB / 3.274GiB 3.42% 3.28MB / 12.3kB 0B / 0B 13
感想
- ちょーお手軽簡単に、CustomVisionのローカル実行環境が立てれました。(ただし、Dockerの知識は必要。)
- 中身はTensorFlowなのでGPUを使ってより高速化が可能?(HTTPのオーバーヘッドも結構ありそう?)
Python + Flask + TensorFlowで動いているようですが、詳しくは後日調べたいと思います。