ABEJA の Platform エンジニアの小笠原です。
ABEJA Platform は Cloud 環境のみならず Edge 環境でも推論機能を提供していますが、正式にサポートしている Edge device として NVIDIA Jetson があります。
ABEJA Platform は、ユーザーコードの実行を Docker コンテナ上で行うことで、Cloud でも Edge device 上でも同じソースコードを利用できる仕組みになっています。
Jetson の CPU アーキテクチャは arm64 なので、各 Deep Learning フレームワークを含む Docker イメージも、arm64 アーキテクチャ用のものを作成する必要がありました。
最初の頃は Jetson TX2 上でビルドを行っていたのですが、tensorflow や pytorch といったフレームワークを含む Docker イメージのビルドには数時間かかるし、スケールもさせられないので、非常に辛いものがあります。
そこで、 QEMU で CPU emulate させて、スケールアップ/アウト可能な EC2 上でビルド出来るようにしたので、今回簡単に紹介したいと思います。
Docker のインストール
Ubuntu Server 16.04 の AMI を利用して EC2 インスタンスを起動しましたが、Docker のバージョンが古いので、最新の Docker をインストールします。 公式サイトの記載に従ってコマンドを実行していけば大丈夫です。
$ sudo apt update $ sudo apt install -y apt-transport-https ca-certificates curl software-properties-common $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" $ sudo apt update $ sudo apt install docker-ce
毎回 sudo
するのも面倒ですし、そもそも AWS ECR への docker login
で詰まったので、ubuntu
ユーザーを docker
グループに所属させます。
$ sudo usermod -g docker ubuntu
現在のセッションには反映されないので、コマンド実行後ログインし直す必要があるのに注意してください。
binfmt_misc のセットアップ
binfmt_misc についての詳細は Wikipedia の記事 等を参照してください。 Multiarch Project が、binfmt_misc のセットアップを行ってくれる Docker イメージ を公開してくれているので、これを利用します。
docker run --rm --privileged multiarch/qemu-user-static:register
ホスト OS 側の /proc
配下にアクセスするため、--privileged
オプションをつけて実行します。
EC2 インスタンスを再起動するとこの操作の内容が消えてしまうため、インスタンス起動時に毎回実行する必要があります。
動作確認
ここまで出来たら、qemu-user-static
のバイナリを組み込み済みの Docker イメージを利用して、build/run を行うことが可能です。
Docker Hub にqemu-user-static
のバイナリを組み込み済みの Docker イメージとしては、
辺りがあるようです。今回は multiarch/ubuntu-core
を使って動作確認してみましょう。
build
$ cat Dockerfile FROM multiarch/ubuntu-core:arm64-xenial RUN apt-get update && \ apt-get install -y vim $ docker build -t arm64-xenial-vim -f Dockerfile . Sending build context to Docker daemon 53.76kB Step 1/2 : FROM multiarch/ubuntu-core:arm64-xenial arm64-xenial: Pulling from multiarch/ubuntu-core (中略) Processing triggers for libc-bin (2.23-0ubuntu10) ... Removing intermediate container b5fba8ade6c0 ---> b6f3583613e9 Successfully built b6f3583613e9 Successfully tagged arm64-xenial-vim:latest
ビルド出来ました!
run
実行してみます。
$ docker run -it --rm arm64-xenial-vim:latest bash root@abd0176ff4ec:/# uname -m aarch64 root@abd0176ff4ec:/# file /bin/bash /bin/bash: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=64c27467ad7a6c507c8f79464fea872fed5dd044, stripped
ARM エミュレーション環境として正しく実行出来ているようです。
(Jetson TX2 上でも動作させてみて、正常に動作することを確認済みです)
まとめ
arm64 用の Docker イメージをスケールアップ/アウト可能な環境でビルドできる準備が整いました。
宣伝
ABEJAでは色々な職種を募集しています。海外で色々な体験をさせてくれる会社ですので、ぜひご応募ください。
ABEJAが発信する最新テクノロジーに興味がある方は、是非ともブログの読者に!
ABEJAという会社に興味が湧いてきた方はWantedlyで会社、事業、人の情報を発信しているので、是非ともフォローを!! www.wantedly.com
ABEJAの中の人と話ししたい!オフィス見学してみたいも随時受け付けておりますので、気軽にポチッとどうぞ↓↓