このブログは、株式会社フィックスターズのエンジニアが、あらゆるテーマについて自由に書いているブログです。
こんにちは、Fixstars Autonomous Technologiesの吉村です。
NVIDIA GPUを搭載しているArm開発ボードとして様々な分野で活躍しているNVIDIA Jetsonですが開発環境のセットアップが色々大変です。このセットアップのわずらわしさから少しでも解放されるようDocker上に環境を隔離してセットアップを試みてみました。
NVIDIA SDK Managerは、NVIDIA Jetsonプラットフォーム、NVIDIA DRIVEプラットフォームの開発環境をセットアップするツールです。かつてはプラットフォーム毎に以下のツールに分かれていましたが、あるタイミングでNVIDIA SDK Managerに共通化されることになったようです。
SDK Managerは、ホストとUSB接続した開発ボードに対して以下のような手順でセットアップを行っています(ここではJetsonの場合に内部的に行っているであろう処理内容を記載しています)。
これからもわかるように何気に複雑なことをやっていることがわかります。
SDK Managerには以下の問題点があり、Jetsonを最新OSに追従していこうとすると、セットアップの度にホスト環境を毎回クリーンインストールする必要が出てきます。
Jetsonを最新OSに追従していこうとすると、セットアップの度にホスト環境を毎回クリーンインストールする必要が出てきます。
これは明らかにエンジニアの時間を無駄にしているので、ホスト環境とは隔離できるようDockerコンテナ上でNVIDIA SDK Managerを実行できるようにしました。
https://github.com/atinfinity/sdk_manager_docker
以降、NVIDIA SDK Manager on Dockerを作るにあたって工夫したポイントを述べていきます。
https://docs.nvidia.com/sdk-manager/system-requirements/index.htmlに
X11 must be enabled on the host.
とあるのでDocker上でX Windowを有効にする必要があります。今回はUsing GUI’s with Dockerを参考にしました。 具体的には以下のような手順でDockerコンテナを起動します。
XSOCK=/tmp/.X11-unix
XAUTH=/tmp/.docker.xauth
touch $XAUTH
xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -
docker run --privileged --rm -it \
--volume=$XSOCK:$XSOCK:rw \
--volume=$XAUTH:$XAUTH:rw \
--env="XAUTHORITY=${XAUTH}" \
--env="DISPLAY=${DISPLAY}" \
-u "jetpack" \
jetpack:latest \
bash
rootアカウントSDK Managerを起動すると「非rootアカウントで実行してください」という内容のエラーメッセージが出るため、Dockerfileで以下のような記述をし、非rootアカウントを作成しておきます。
# add new sudo user
ENV USERNAME jetpack
ENV HOME /home/$USERNAME
RUN useradd -m $USERNAME && \
echo "$USERNAME:$USERNAME" | chpasswd && \
usermod --shell /bin/bash $USERNAME && \
usermod -aG sudo $USERNAME && \
mkdir /etc/sudoers.d && \
echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/$USERNAME && \
chmod 0440 /etc/sudoers.d/$USERNAME && \
# Replace 1000 with your user/group id
usermod --uid 1000 $USERNAME && \
groupmod --gid 1000 $USERNAME
日本語環境でNVIDIAのJetson開発環境をセットアップすると正しく動かないため、Dockerfile上で明示的にロケールをUSにしておきます。
# set locale
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
前述の手順で非rootアカウントを作成してますが、SDK Managerはセットアップ途中でパスワード入力を要求してくるパスワードを設定します(ここではアカウント名をパスワードにしています)。
USER root
RUN echo "${USERNAME}:${USERNAME}" | chpasswd
ここが今回一番苦労したところです。これまでの設定によってDocker上でSDK Managerは起動するようになったのですが、 SDK Manager上でNVIDIAアカウントを使ってログインした後にクラッシュしてしまう現象が解決できず、半日ほど頭を抱えていました。
SDK Managerのエラーログを漁っていたところ、Chromiumのコンポーネントでエラーが出ていることがわかり、 docker runの--shm-size
オプションで共有メモリサイズを増やしたところ無事動作するようになりました(Dockerではデフォルトで共有メモリサイズは64MB)。
今回、手軽にNVIDIAの開発ボードをセットアップできるようにDockerコンテナ上でNVIDIA SDK Managerを実行し、セットアップできるようにしました。 現状、一部のデバイスでは動作確認できていないのでフィードバックしてくれる方を募集しています。
[…] 参考:https://proc-cpuinfo.fixstars.com/2019/06/nvidia-sdk-manager-on-docker/ […]