Article

2019年6月24日

はじめに

こんにちは、Fixstars Autonomous Technologiesの吉村です。
NVIDIA GPUを搭載しているArm開発ボードとして様々な分野で活躍しているNVIDIA Jetsonですが開発環境のセットアップが色々大変です。このセットアップのわずらわしさから少しでも解放されるようDocker上に環境を隔離してセットアップを試みてみました。

NVIDIA SDK Managerとは

NVIDIA SDK Managerは、NVIDIA Jetsonプラットフォーム、NVIDIA DRIVEプラットフォームの開発環境をセットアップするツールです。かつてはプラットフォーム毎に以下のツールに分かれていましたが、あるタイミングでNVIDIA SDK Managerに共通化されることになったようです。

  • JetPack:NVIDIA Jetsonプラットフォームの開発環境セットアップ
  • DriveInstall:NVIDIA DRIVEプラットフォーム(自動運転向けの開発ボード)の開発環境セットアップ

SDK Managerがやっていること

SDK Managerは、ホストとUSB接続した開発ボードに対して以下のような手順でセットアップを行っています(ここではJetsonの場合に内部的に行っているであろう処理内容を記載しています)。

  1. 必要なパッケージ(OSイメージ、開発ツールのパッケージ)をダウンロードする
  2. USBリカバリーモードで起動されたJetson(JetsonのeMMCがホストPCからはUSBストレージとして見えている)に対して、OSイメージをflashする
  3. Jetsonをリブートし、Ubuntu 18.04の初期設定画面に遷移し、初期設定を促す
  4. ホストPC、JetsonのUSB接続をCDC-Etherとして認識できるようにする
  5. CDC-Etherで接続されたホストPC、JetsonのUSB接続を特定のIPアドレスで固定IP化する
  6. scpコマンドでホストPCからターゲット開発ボードに開発ツールパッケージを転送する
  7. Jetson上で開発ツールパッケージをインストールする

これからもわかるように何気に複雑なことをやっていることがわかります。

SDK Managerの問題点

SDK Managerには以下の問題点があり、Jetsonを最新OSに追従していこうとすると、セットアップの度にホスト環境を毎回クリーンインストールする必要が出てきます。

  • システムに関連パッケージを大量に入れてしまい開発環境が汚れる(OSアップデートの度にセットアップ環境を作り直し・・・)
  • ホストPCでapt-get updateできなくなる(参考:https://qiita.com/Pychan/items/a29d58a2ed7fcb01d01f

NVIDIA SDK Manager on Dockerでやったこと

Jetsonを最新OSに追従していこうとすると、セットアップの度にホスト環境を毎回クリーンインストールする必要が出てきます。

これは明らかにエンジニアの時間を無駄にしているので、ホスト環境とは隔離できるようDockerコンテナ上でNVIDIA SDK Managerを実行できるようにしました。
https://github.com/atinfinity/sdk_manager_docker

以降、NVIDIA SDK Manager on Dockerを作るにあたって工夫したポイントを述べていきます。


X Window有効化

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アカウント作成

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を実行し、セットアップできるようにしました。 現状、一部のデバイスでは動作確認できていないのでフィードバックしてくれる方を募集しています。

Tags

About Author

yoshimura

Leave a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Recent Comments

Social Media