プログラミング素人がAutoware.AIを使ったコンテストに参加した話（その１：Autoware.AIの環境構築）


##まずはじめに
仕事ではプログラミングとは全く縁がありませんが数年前からAIに興味を持って独学で勉強を始めました。
コマンドや参考リンク等は最新の状況では当てはまらないかもしれません。
これは素人が環境構築するだけでもとても大変で非常に勉強になったことをまとめて記事にしたものです。

・[その１：Autoware.AIの環境設定](https://qiita.com/penstood/private/aa0328805bb91ad9340f "自動運転AIチャレンジ")　←いまここ
・[その２：ROSの情報まとめ](https://qiita.com/penstood/private/3e6a734bb2196dd72c9f "プログラミング素人がAutoware.AIを使ったコンテストに参加した話（その２：ROSの情報まとめ）")
・[その3：Autoware.AIとLGSVLシミュレータを使ってみる](https://qiita.com/penstood/private/b024c6486af18fe620e6 "プログラミング素人がAutoware.AIを使ったコンテストに参加した話（その3：Autoware.AIとLGSVLシミュレータを使ってみる）")


| 項番 | ページ内リンク |
|:----:|:-------------|
| 0 | [コンテストに参加したきっかけ](#0-コンテストに参加したきっかけ) |
| 1 | [Ubuntuが起動しない](#1-ubuntuのインストール) |
| 2 | [CUDA、docker、nvidia-docker2とそれぞれインストール](#2-必要なものインストール) |
| 3 | [Autoware.AIのビルド](#3-autowareのビルド) |
| 4 | [参考リンク](#4-参考リンク) |



##0. コンテストに参加したきっかけ
ソフトウェアファーストやコネクティッドの考え方とともにモノづくりが変わろうとしています。私は普段の業務ではソフトウェアにはほとんど関わらないのですがそれではいけないと思い、2年ほど前から社内の有志とともにAIをはじめとしたプログラミング勉強を仕事とは別にやってきました。そのなかで自動運転とAIという非常にホットなワードがある[自動運転AIチャレンジ](https://www.jsae.or.jp/jaaic/index.html "自動運転AIチャレンジ")に参加しました。（ものすごく大変だった。。。）

##1. Ubuntuのインストール
###Ubuntuが起動しない。（PCが起動しない）
当時はUbuntuって何？という知識レベルでした。とりあえずUbuntu18.04のインストーラーを使って起動したのですが何故か起動しません。NVIDIA GPUと標準のUbuntuのグラフィックドライバーの相性が悪いためうまく起動しないようです。

[こちら](https://qiita.com/k_ikasumipowder/items/5e88ec45f958c35e05ed "Deep Learning 環境の構築")の記事を参考にして解決。
###nouveauの無効化
１． BIOSのメニューに入り、Secure Boot を Disabled にしておく
　　（BIOSへの入り方はPCによって異なるので型番とかと合わせてググってください。）
2． `Install Ubuntu にカーソルを合わせて　e  `を押し起動オプションの設定

3．`quiet splash ---`　となっているところを　`quiet splash nomodeset ---`
と書き換えるとnouveauを無効化できます。 
###nvidia-smiができない（GPUドライバのインストール）
[こちら](https://codechacha.com/ja/install-nvidia-driver-ubuntu/ "Ubuntuの18.04 - NVIDIAドライバをインストールする方法")を参考にしました。


```ruby:Install_GPU_Driver
ubuntu-drivers devices
sudo apt update
sudo apt install nvidia-driver-***
```

[もしうまく行かない場合こちら](https://qiita.com/kawazu191128/items/8a46308be6949f5bda57 "ubuntu18.04にnvidiaドライバを入れるの苦労した")の記事を参考にしました。GUIが使えなくなるのはツライ・・・
[NVIDIA公式サイト](https://www.nvidia.co.jp/Download/index.aspx?lang=jp "エヌビディア製品用ドライバを手動検索")でドライバを検索してインストール。もし見つからない場合はβ版があるかもしれないので[こちら](https://www.nvidia.co.jp/Download/Find.aspx?lang=jp "エヌビディア製品用ドライバのベータ版")から探すようにしてください。

```ruby:Install_GPU_Driver
sudo bash NVIDIA-Linux-x86_64-440.36.run
```

##2. 必要なものインストール
GPUのnvidia-driverとCUDA Toolkitの一覧は[こちら](https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html "NVIDIA CUDA Toolkit Release Notes")
ちゃんと対応するものをインストールしましょう。


###CUDA Toolkit 10.0 をインストール（dockerを使うなら不要）
まずCUDAをインストールします。今回は[Autowareの推奨](https://github.com/Autoware-AI/autoware.ai/wiki/Source-Build "Autoware.AI Source Build")がCUDA10なのでそちらをインストールします。

```ruby:CUDA_Toolkit_10.0
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"
sudo apt-get update
sudo apt-get -y install cuda-10.0
# パスをbashrcに追加
echo -e "\n## CUDA and cuDNN paths"  >> ~/.bashrc
echo 'export PATH=/usr/local/cuda-10.0/bin:${PATH}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:${LD_LIBRARY_PATH}' >> ~/.bashrc
source ~/.bashrc
# PCを再起動
sudo reboot
```

###ｃudnn7.6.5 をインストール(参考)
こちら：[cuDNN Archive](https://developer.nvidia.com/rdp/cudnn-archive "cuDNN Archive")からダウンロード（要会員登録）。
下記３つをダウンロードしてくる。
・cuDNN Runtime Library for Ubuntu18.04 (Deb)
・cuDNN Developer Library for Ubuntu18.04 (Deb)
・cuDNN Code Samples and User Guide for Ubuntu18.04 (Deb)

```ruby:install_cudnn7.6.5
sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.0_amd64.deb 
sudo dpkg -i libcudnn7-dev_7.6.5.32-1+cuda10.0_amd64.deb 
sudo dpkg -i libcudnn7-doc_7.6.5.32-1+cuda10.0_amd64.deb 
```

###dockerのインストール
dockerのサイト：[Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/ "Install Docker Engine on Ubuntu")にそっていけばインストールできます。

```ruby:Install_Docker_Engine_on_Ubuntu
sudo apt-get update

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    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-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 一般ユーザがdockerコマンドを使えるようにする
sudo usermod -aG docker $USER
reboot
```


###nvidia-dockerと nvidia-docker2のインストール
こちら~~[NVIDIA Docker って今どうなってるの？ (19.11版)](https://qiita.com/ksasaki/items/b20a785e1a0f610efa08 "NVIDIA Docker って今どうなってるの？ (19.11版)")~~ → こちらが最新のようです[NVIDIA Docker って今どうなってるの？ (20.09 版)](https://medium.com/nvidiajapan/nvidia-docker-%E3%81%A3%E3%81%A6%E4%BB%8A%E3%81%A9%E3%81%86%E3%81%AA%E3%81%A3%E3%81%A6%E3%82%8B%E3%81%AE-20-09-%E7%89%88-558fae883f44?source=collection_home---6------5-----------------------　"NVIDIA Docker って今どうなってるの？ (20.09 版)")と
こちら[NVIDIA-DOCKER2の始め方](https://xvideos.hatenablog.com/entry/install-nvidia-docker2 "NVIDIA-DOCKER2の始め方")を参考にしてインストールします。

```ruby:nvidia-docker2のインストール
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/nvidia-docker.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update

sudo apt-get install nvidia-docker2
sudo pkill -SIGHUP dockerd
```

```ruby:nvidia-docker2の動作確認
docker run --gpus all --rm nvidia/cuda:9.0-base nvidia-smi
docker run --gpus all --rm nvidia/cuda:10.0-base nvidia-smi
```


確認コマンドが動作してイメージをpullしてこない場合はうまく行っていないので注意してください。
~~`sudo docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi`~~  <- imageが存在しないようなので削除しました。

```ruby:nvidia-docker確認コマンド
docker run --rm  --runtime nvidia nvidia/cuda:10.0-base nvidia-smi
```


###ROSのインストール　 <-　（dockerで使用するなら不要）
ROSはOSのバージョンによって対応するバージョンが異なり、Ubuntu18.04にはmelodicをインストールします。
[こちら](http://wiki.ros.org/melodic/Installation/Ubuntu "Ubuntu install of ROS Melodic")にそってインストールしましょう。

```ruby:ROS_melodic_install
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt update
sudo apt install ros-melodic-desktop-full
# 次回起動時もROSの環境ファイルが読み込まれるようにbashrcに追加
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc

# 依存関係のインストール
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential
sudo apt install python-rosdep
sudo rosdep init
rosdep update
```


##3. Autowareのビルド
Autoware.AIにはdockerで起動するAutoware-dockerとローカルPCに直接ビルドする方法の２種類あります。
環境的な制約もあるかもしれませんがAutoware-dockerをおすすめします。
もしROS環境やAutowareがこわれて動かなくなってもdockerならすぐにもとに戻すことができますので。。。

###Autoware-dockerの場合
まずユーザーIDを調べます。

```ruby:ユーザID確認
id
```

あとは[Autoware-docker build](https://github.com/Autoware-AI/autoware.ai/wiki/Generic-x86-Docker "Autoware-docker")にしたがってビルドしていきます。今回はv1.13.0をビルドしていくためバージョン指定します。



```ruby:ユーザID確認
git clone https://github.com/Autoware-AI/docker.git
cd docker/generic
# uid=1000のとき
./run.sh -t 1.13.0
# uid!=1000のとき
./run.sh -s -t 1.13.0
```

####【補足】dockerからexitしてもimageが残るようにする。
このままではdockerからexitするとimageが残らないためまたパッケージのビルドからはじめないといけません。
それを避けるために[Autoware-docker/run.sh](https://github.com/Autoware-AI/docker/blob/master/generic/run.sh "id - Autoware-docker/run.sh")の最後の部分を変えると簡単です。その代わり`./run.sh `するたびにイメージが作成されるようになることになりますが。。。

```ruby:run.sh
# 最後のdockerコマンド
*****

docker run \
    -it\　　　　　　　　　　#<=--rm　コマンドを消すだけ
    $VOLUMES \
    --env="XAUTHORITY=${XAUTH}" \
    --env="DISPLAY=${DISPLAY}" \
    --env="USER_ID=$USER_ID" \
    --privileged \
    --net=host \
    $RUNTIME \
    $IMAGE
```


###ソースビルドする場合
こちら[Autoware-docker Source Build](https://github.com/Autoware-AI/autoware.ai/wiki/Generic-x86-Docker "Autoware-docker Source Build")にそってすすめていきます。私の環境の場合はEigenをビルドするところがちょっとうまく行かなかったので変えています。

```ruby:Autoware_AI_Source_Build
# 依存ライブラリのインストール
sudo apt update
sudo apt install -y python-catkin-pkg python-rosdep ros-$ROS_DISTRO-catkin
sudo apt install -y python3-pip python3-colcon-common-extensions python3-setuptools python3-vcstool
pip3 install -U setuptools
# Eigenのインストール
cd && wget http://bitbucket.org/eigen/eigen/get/3.3.7.tar.gz 
mkdir eigen && tar --strip-components=1 -xzvf 3.3.7.tar.gz -C eigen
cd eigen && mkdir build && cd build && cmake .. && make
sudo make install #<=ここにsudoをいれる
```
あとはこちら[Ubuntu18.04にAutoware.AIをインストール](https://qiita.com/k-koh/items/90647b1cb140b4b75c91 "Ubuntu18.04にAutoware.AIをインストール")にそってやればビルドが完了します。

```ruby:Autoware_AI_Source_Build
mkdir -p autoware.ai/src
cd autoware.ai

#　v1.13.0をビルドしていくためバージョン指定
wget -O autoware.ai.repos "https://gitlab.com/autowarefoundation/autoware.ai/autoware/raw/1.13.0/autoware.ai.repos?inline=false"
vcs import src < autoware.ai.repos
sudo rosdep init
rosdep update
rosdep install -y --from-paths src --ignore-src --rosdistro melodic
source /opt/ros/melodic/setup.bash

# CUDA support　ありでビルド
AUTOWARE_COMPILE_WITH_CUDA=1 colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release

# CUDA Support　なしでビルド
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
```
AutowareのRuntime Managerが起動できればビルド成功です。

```ruby:Autoware_runtime_managerの起動
# Autowareの環境ファイルの読み込み
source ~/Autoware/install/local_setup.bash
# runtime_managerの起動
roslaunch runtime_manager runtime_manager.launch
```

お疲れ様でした。どんなに順調に行ってもここまでやるのに丸一日はかかると思います。（初めてやったときは試行錯誤で４日くらいかかった。）
ここまででようやくAutoware.AIを動かす環境設定が終わりました。
かなり長くなってしまったのであらためてROSの勉強方法とAutoware.AIの使い方など書きたいと思います。

##4. 参考リンク
・[自動運転AIチャレンジ](https://www.jsae.or.jp/jaaic/index.html "自動運転AIチャレンジ")
・[ubuntu18.04にnvidiaドライバを入れるの苦労した](https://qiita.com/kawazu191128/items/8a46308be6949f5bda57 "ubuntu18.04にnvidiaドライバを入れるの苦労した")
・[エヌビディア製品用ドライバ](https://www.nvidia.co.jp/Download/index.aspx?lang=jp "エヌビディア製品用ドライバを手動検索")
・[エヌビディア製品用ドライバのベータ版](https://www.nvidia.co.jp/Download/Find.aspx?lang=jp "エヌビディア製品用ドライバのベータ版")
・[Deep Learning 環境の構築](https://qiita.com/k_ikasumipowder/items/5e88ec45f958c35e05ed "Deep Learning 環境の構築")
・[Autoware.AI Source Build](https://github.com/Autoware-AI/autoware.ai/wiki/Source-Build "Autoware.AI Source Build")
・[Ubuntu 18.04へのCUDAインストール方法](https://qiita.com/yukoba/items/4733e8602fa4acabcc35 "Ubuntu 18.04へのCUDAインストール方法")
・[NVIDIA CUDA Installation Guide for Linux](https://docs.nvidia.com/cuda/archive/10.0/cuda-installation-guide-linux/index.html "NVIDIA CUDA Installation Guide for Linux")
・[Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/ "Install Docker Engine on Ubuntu")
・[NVIDIA Docker って今どうなってるの？ (19.11版)](https://qiita.com/ksasaki/items/b20a785e1a0f610efa08 "NVIDIA Docker って今どうなってるの？ (19.11版)")
・[NVIDIA Docker って今どうなってるの？ (20.09 版)](https://medium.com/nvidiajapan/nvidia-docker-%E3%81%A3%E3%81%A6%E4%BB%8A%E3%81%A9%E3%81%86%E3%81%AA%E3%81%A3%E3%81%A6%E3%82%8B%E3%81%AE-20-09-%E7%89%88-558fae883f44?source=collection_home---6------5-----------------------　"NVIDIA Docker って今どうなってるの？ (20.09 版)")
・[NVIDIA-DOCKER2の始め方](https://xvideos.hatenablog.com/entry/install-nvidia-docker2 "NVIDIA-DOCKER2の始め方")
・[cuDNN Archive](https://developer.nvidia.com/rdp/cudnn-archive "cuDNN Archive"
・[Ubuntu install of ROS Melodic](http://wiki.ros.org/melodic/Installation/Ubuntu "Ubuntu install of ROS Melodic")
・[id - ユーザIDやグループIDを表示する](https://linuxcommand.net/id/ "id - ユーザIDやグループIDを表示する")
・[Autoware-docker build](https://github.com/Autoware-AI/autoware.ai/wiki/Generic-x86-Docker "Autoware-docker")
・[Autoware-docker Source Build](https://github.com/Autoware-AI/autoware.ai/wiki/Generic-x86-Docker "Autoware-docker Source Build")
・[Ubuntu18.04にAutoware.AIをインストール](https://qiita.com/k-koh/items/90647b1cb140b4b75c91 "Ubuntu18.04にAutoware.AIをインストール")
・[Ubuntuの18.04 - NVIDIAドライバをインストールする方法](https://codechacha.com/ja/install-nvidia-driver-ubuntu/ "Ubuntuの18.04 - NVIDIAドライバをインストールする方法")
・[NVIDIA CUDA Toolkit Release Notes](https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html "NVIDIA CUDA Toolkit Release Notes")