aptpod Tech Blog

株式会社アプトポッドのテクノロジーブログです

EDGEPLANT T1 + Dockerでかんたん!ディープラーニング

f:id:aptpod_tech-writer:20210415201233j:plain

こんにちは。製品開発グループに所属しております、きしだです。

前回の記事でもご紹介の通り、弊社でついにハードウェアブランドが立ち上がり、その第一弾としてEDGEPLANT T1がリリースされました! 🎉

個人的にはデザインがとてもイケててずっと見つめていたくなる製品ですが、もちろん素敵な点はそこだけではありません。

EDGEPLANT T1 (以降、T1とよびます)は、NVIDIA® Jetson™ TX2を搭載している産業向けハードウェアで、GPUを利用したエッジコンピューティングが可能になります。そのため、自動車や建機などのデバイスに搭載することで、簡単にエッジAIコンピューティングが実現できます。

とはいっても、「エッジAIコンピューティングを構築するためにT1を買ったものの、何から手をつければいいのだろう」という方もいらっしゃると思います。 今回はその方々向けに、簡単なディープラーニング環境を構築する手順をご紹介します。

簡単なサンプルも合わせて用意したので、T1を試しに動かす最初のステップとして、お手元にある方はぜひお試しください。

その前に、T1をエッジAIとして活用する意義について少しだけ触れたいと思います。早くT1を動かしたい!という方は「EDGEPLANT T1で顔検出をやってみる」までスキップしてください。

EDGEPLANT T1をエッジAIとして活用する

最近話題の "エッジAI" とは、センサーやデータの収集源となるデバイス上で、発生したデータにAI処理をかけてしまう考え方です。エッジ端末でAI処理が完結することがなぜ重要なのでしょうか。 それは、「AIが扱うデータの多様化」がキーワードになります。

AIデータの多様化とクラウドコンピューティングの限界

一般的にAWSやGoogleなどが提供するクラウド上でAI処理を行うケースが盛んな印象を受けますが、近年「AIが扱うデータの多様化」が進んだことで、扱うデータ量が爆発的に増加しました。そのため通信容量や通信速度などを理由にクラウド上で対応できないケースが現れてきています。

例えば、自動運転を行う自動車上で物体検知を行う場合、遅延などが認められない緊急性の高いAI処理が求められます。この場合、クラウド上で動作させる際には悩ましい課題として注視されているようです。

そのため通信タイムラグをなくすために、「端末のそばに分散配置したサーバー上で処理し、必要な情報のみクラウドに送信するような構成」あるいは「端末側で独立して処理を行う構成」をとる試みが各所で行われています。前者では近年 "MEC (Mobile/Multi-access Edge Computing)" という技術規格が進められ勢いを増していますが、後者の端末単体で独立したAI処理も「自律制御型ロボット」などで重要な要素を持っています。

そしてこのニーズは、自動車や建機などの自然環境で動作するデバイスでも同様のことが言えると思います。

産業向けデバイスのエッジコンピューティングを実現する

対してT1は、NVIDIA® Jetson™ TX2を搭載しており、GPUを利用したエッジコンピューティングが可能になります。つまり、画像処理に大きな実績のある機械学習アルゴリズムを処理するのに最適な環境を適用することができ、工場の産業ロボットや自動車などのIoT端末となりうるデバイスで発生したデータに対してAI技術を適用した分析・学習・予測を行うことができるようになります。

ここでのポイントとしては「車載組み込みコンピューターとして利用可能」という点です。

実際のフィールドで運用されるモビリティに搭載されるコンピューターには、電源ノイズ耐性や耐振動/衝撃性能、高低温環境下での安定した動作が求められます。 しかしながら、AIプラットフォームとして使いやすい(エコシステムができている)NVIDIAのJetsonを搭載して、かつ上記のような信頼性を保証した機器を選定しようとすると選択肢が限られるのが現状です。

弊社のT1は、上記のようなケースにあてはまる自動車や建機などの車載上で動作することができ、エッジ端末でAI処理を完結することができます。そのため動作する環境を意識することなく様々なシーンでエッジコンピューティングが実現できるというわけです。  

さて、紹介としては以上になります。
ここから、今まで解説した "エッジAI" 実現の初級編として、冒頭でご紹介した内容をご紹介したいと思います。

EDGEPLANT T1で顔検出をやってみる

それでは、いよいよ本題にうつりたいと思います。
EDGEPLANT T1はNVIDIA® Jetson™ TX2を搭載しており、環境構築もNVIDIA提供のツール群を駆使します。とはいっても、今までNVIDIA Jetson を扱った方々なら体験したことがあると思うのですが、これがまたしんどいんですよね...。

  • 環境構築には、GPUドライバー、JetPackなどの使用ライブラリ、DeepLearningフレームワークの依存関係を理解して、構築する必要がある
  • 使用しているフレームワークによっては、GPUへの最適化を行う必要がある
  • アルゴリズムによって使用するライブラリやフレームワークが異なるので、一つのOSでの利用が厳しい
  • フレームワークあるいはライブラリ1つにアップデートがあると、環境すべてが使えなくなり期待の動作が行えなくなる
  • その上、環境内の依存関係が複雑なため環境を作り直すにも時間がかかる

など、心あたりがある方もいると思います。自分も運用時には相当悩みました。 そこで、今回はこれらを解決すべく、Dockerを利用してみようというお話です。

まずDockerですが、T1にはデフォルトでDockerが入っており、すぐに使うことができます。 これで環境を複数立てることは可能そうです。

一方で、GPUや各フレームワークとの依存関係については、NVIDIA社が運営している NVIDIA NGC (NVIDIA GPU Cloud) というサイトで公開されている、NVIDIA GPU用のソフトウェアに特化したDockerイメージを使用しましょう。こちらは通常のイメージの他に、NVIDIAのソフトウェア向けに最適にビルドされたTensorFlowやPytorchのコンテナイメージなども公開されているので、こちらを使うことで手軽にディープラーニング環境を実現することができます。

上記を使うことで簡単に環境構築ができそうなので、実際にサンプルを試しながら動かしてみましょう。

コンテナイメージを用意する

今回は、サンプルとして顔を検出するアルゴリズムが含まれたパッケージである Face Recognitionを使用します。 このパッケージが動作する環境を構築しましょう。

github.com

まずは、使用しているT1のJetPackのバージョンを確認します。

$  sudo apt show nvidia-jetpack
Package: nvidia-jetpack
Version: 4.4.1-b50
Priority: standard
Section: metapackages
Maintainer: NVIDIA Corporation
Installed-Size: 199 kB
Depends: nvidia-cuda (= 4.4.1-b50), nvidia-opencv (= 4.4.1-b50), nvidia-cudnn8 (= 4.4.1-b50), nvidia-tensorrt (= 4.4.1-b50), nvidia-visionworks (= 4.4.1-b50), nvidia-container (= 4.4.1-b50), nvidia-vpi (= 4.4.1-b50), nvidia-l4t-jetson-multimedia-api (>> 32.4-0), nvidia-l4t-jetson-multimedia-api (<< 32.5-0)
Homepage: http://developer.nvidia.com/jetson
Download-Size: 29.4 kB
APT-Manual-Installed: yes
APT-Sources: https://repo.download.nvidia.com/jetson/t186 r32.4/main arm64 Packages
Description: NVIDIA Jetpack Meta Package

上記より、バージョンは Version: 4.4.1-b50 であることが確認できました。 これをもとにして、NVIDIA NGCにて使用するイメージを探しましょう。今回はTensorFlowを使用するため、こちらnvcr.io/nvidia/l4t-tensorflow:r32.4.4-tf2.3-py3 を使用することにしました。

上記のイメージを参照する形でDockerfileを作成します。今回は以下のようにしました。

FROM nvcr.io/nvidia/l4t-tensorflow:r32.4.4-tf2.3-py3

RUN apt-get update && \
  apt-get install -y \
  g++ \
  make \
  cmake \
  unzip \
  libcurl4-openssl-dev \
  libxtst6 \
  unzip \
  python3-dev \
  libsm6 \
  libxext6 \
  libxrender-dev \
  libgl1-mesa-dev \ 
  python3-pip \
  python3-tk

COPY requirements.txt  .

RUN pip3 install --upgrade pip && \  
    pip install --no-cache-dir -r requirements.txt 

上記で指定している requirements.txt は以下のラインナップです。以下は使いたいモジュールによって適宜変更してください。

numpy
scipy
opencv-python
pillow
jupyter 
face_recognition

上記を指定してビルドします。

$ docker build -t t1-face-detection:latest .

少し時間がかかるので、気長に待ちましょう。

Successfully built 419ed4a78c54
Successfully tagged t1-face-detection:latest

どうやら完了したようです。

試しにDockerを起動し、Jupyter Notebook上で推論がうまくいくか試して見ましょう。 Docker上のJupyter Notebookにホストからアクセスするため、ポートも明示的に指定します。

$ docker run -it -p 8888:8888 --runtime=nvidia --network host t1-face-detection:latest bash 

上記の注意点としては、NVIDIA DockerをRuntimeとして指定します。こちらを指定することで、ホスト側のCUDA環境をDocker上でそのまま参照することができます。

ちなみに私は以下のようなエラーがでました 。

docker: Error response from daemon: Unknown runtime specified nvidia.

このときは、Dockerデーモンの設定にあるRuntimeが正しく指定されているか確認する必要があるので注意です。

$ vi /etc/docker/daemon.json
{
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

$ sudo pkill -SIGHUP dockerd

上記を実施すると、エラーが出力されることなく nvidia-docker をRuntimeとして参照しつつ起動できました。

ためしに推論してみる

それでは、早速推論を試してみましょう。 今回実行するコードは以下の通りです。

import cv2
import face_recognition
import numpy

from PIL import Image

detector = face_recognition.face_locations
img = Image.open('image2.jpg')
img_array = numpy.asarray(img)

# 推論
results = detector(img_array, model="cnn")

# 結果の可視化
for v in results:
    top, right, bottom, left = v
    cv2.rectangle(img_array, (left, top),(right, bottom),(255, 0, 0), 3, 4)

detected_img = Image.fromarray(img_array)

detected_img.show()

上記をこちらの画像*1に対して実行します。

f:id:aptpod_tech-writer:20210415103822j:plain
イメージサンプル

見事に顔が検出されました!🙌

f:id:aptpod_tech-writer:20210415103914p:plain
検出結果

まとめ

今回は EDGEPLANT T1 のリリースに伴い、NVIDIA提供のDockerイメージを使用した簡単なディープラーニングの環境構築のやり方をご紹介しました。 今回は顔を検出するアルゴリズムを動かしただけですが、OpenCVを利用して外付けカメラから収集した動画データを検出にかけるところまでできると、車載器としての"エッジAI" の様々なユースケースにも柔軟に対応できるようになると思います。

今回の手順を踏むことで、T1を "エッジAI" として利用する難易度がぐっと減ると思うので、知らなかった!という方はぜひお試しください。

以上です、ありがとうございました。


参考