ABEJA Tech Blog

中の人の興味のある情報を発信していきます

Jetson 上で Docker イメージをビルドするのが辛かったので EC2 上にビルド環境を作った

f:id:seiro-ogasawara:20180820130526j:plainABEJA の 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の中の人と話ししたい!オフィス見学してみたいも随時受け付けておりますので、気軽にポチッとどうぞ↓↓