みなさん、自動運転していますか?

現在開催中の 自動運転AIチャレンジ シミュレーション大会 に 私も挑戦しようと思い立ってから1か月、そろそろやらんとまずいということで環境構築に勤しんでおります。

公式の環境構築ドキュメント がかなり良く出来ておりまして、基本的にはここの通りにやるとよいです。 しかし、WSLというちょっと特殊な環境で動かそうとすると若干のハマりポイントが出てまいります。 本記事では、WSLで動かしたいわがままなあなた(そして私)向けに、ハマりポイントの脱出法を記録していきます。

ハマりポイント(1): AWSIMがSEGVで死ぬ

手順の最初でGPU版AWSIMを起動するのですが、SEGVで落ちます。

gdbで検視を行うと、Vulkanの初期化で死んでいるようでした。 WSLg の Github issue を参考に 以下のコマンドを実行したところ、落ちることなく実行できました。

 $ sudo add-apt-repository ppa:kisak/kisak-mesa
 $ sudo apt update
 $ sudo apt upgrade

実行した結果やたら重いですが、これがWSL固有の問題かどうかまでは確かめていません。

ハマりポイント(2): Unable to locate package python3-rocker

手順ではさらっと rocker をインストールしていますが、rockerのインストールの前にはROSのaptリポジトリの追加が必要です。

 $ sudo sh -c 'echo "deb http://packages.ros.org/ros2/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
 $ curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
 $ sudo apt update

なお、ROS公式 の手順だと 私の手元の Ubuntu22.04 ではうまくいきませんでした。 上記の手順は、うまくいくよう一部を修正してあります。 そんなところまで地雷を用意しなくてもいいのに :-)

ハマりポイント(3): NVIDIA Container Toolkit がインストールできているかテストしようとしたら死ぬ

手順では、下記コマンドで NVIDIA Container Toolkit がインストールできているか確認しています。

#インストールできているかをテスト
sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi

これが死にます。

$ docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
docker: Error response from daemon: unknown or invalid runtime name: nvidia.

いろいろ回って調べたところ、--runtime=nvidia が不要だったようです。

 $ docker run --rm --gpus all nvidia/cuda:11.6
.2-base-ubuntu20.04 nvidia-smi
Wed Dec 27 15:32:48 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.36                 Driver Version: 546.33       CUDA Version: 12.3     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 2070        On  | 00000000:08:00.0  On |                  N/A |
|  0%   52C    P8              12W / 175W |   3719MiB /  8192MiB |      9%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+

ハマりポイント(4): rockerが起動しない

rockerを起動してコンテナを動かそうとすると、何やら変なエラーが出て死んでしまいました。 rocker単体でも同じエラーが出たため、rockerの問題とわかります。

$ rocker --version
/usr/lib/python3/dist-packages/requests/__init__.py:87: RequestsDependencyWarning: urllib3 (2.0.7) or chardet (4.0.0) doesn't match a supported version!
  warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "
usage: rocker [-h] [--noexecute] [--nocache] [--nocleanup] [--pull] [--version] [--cuda] [--dev-helpers]
              [--devices [DEVICES ...]] [--env NAME[=VALUE] [NAME[=VALUE] ...]] [--env-file ENV_FILE]
              [--expose EXPOSE] [--git] [--git-config-path GIT_CONFIG_PATH] [--group-add GROUP_ADD] [--home]
              [--hostname HOSTNAME] [--name NAME]
              image [command ...]
rocker: error: DependencyMissing encountered: Docker Client failed to connect to docker daemon. Please verify that docker is installed and running. As well as that you have permission to access the docker daemon. This is usually by being a member of the docker group. The underlying error was:
"""
Error while fetching server API version: HTTPConnection.request() got an unexpected keyword argument 'chunked'
"""

下記コマンドでHTTPクライアントのバージョンを固定すると、うまく動くようです。

 $ pip install requests==2.29.0

ハマりポイント(4): Docker内のAWSIMがSEGVで死ぬ

うっかり忘れていたのですが、ハマりポイント(1)のAWSIM対応はコンテナ内にも実行されている必要があります。(当たり前だ)

aichallenge2023-racing/docker/train にある Dockerfile の末尾に次の変更を入れます。

RUN apt install -y software-properties-common && \
    add-apt-repository ppa:kisak/kisak-mesa && \
    apt update && \
    apt upgrade -y

この変更を入れて、満を持して build_docker.sh からやり直します。

しかしまた下記のSEGVが発生!謎は深まるばかりだな。。。

$ bash run_awsim.sh
Found path: /aichallenge/AWSIM/AWSIM.x86_64
error: XDG_RUNTIME_DIR not set in the environment.
error: XDG_RUNTIME_DIR not set in the environment.
MESA: error: ZINK: failed to choose pdev
glx: failed to create drisw screen
failed to load driver: zink
run_awsim.sh: line 6:  4661 Segmentation fault      /aichallenge/AWSIM/AWSIM.x86_64
Thread 1 "AWSIM.x86_64" received signal SIGSEGV, Segmentation fault.
0x00007ffe403e2e0e in vkGetPhysicalDeviceQueueFamilyProperties () from /lib/x86_64-linux-gnu/libvulkan.so.1
(gdb) bt
#0  0x00007ffe403e2e0e in vkGetPhysicalDeviceQueueFamilyProperties () from /lib/x86_64-linux-gnu/libvulkan.so.1
#1  0x00007ffff69ff261 in vk::Initialize() () from /aichallenge/AWSIM/UnityPlayer.so
#2  0x00007ffff6a08799 in CreateVKGfxDevice() () from /aichallenge/AWSIM/UnityPlayer.so
#3  0x00007ffff6984f4e in CreateClientGfxDevice(GfxDeviceRenderer, GfxCreateDeviceFlags) ()
   from /aichallenge/AWSIM/UnityPlayer.so
#4  0x00007ffff6e65d2b in CreateGfxDevice(GfxDeviceRenderer, GfxCreateDeviceFlags) ()
   from /aichallenge/AWSIM/UnityPlayer.so
#5  0x00007ffff6e66091 in InitializeGfxDevice() () from /aichallenge/AWSIM/UnityPlayer.so
#6  0x00007ffff6d18fe2 in InitializeEngineGraphics(bool) () from /aichallenge/AWSIM/UnityPlayer.so
#7  0x00007ffff6d27bfc in PlayerInitEngineGraphics(bool) () from /aichallenge/AWSIM/UnityPlayer.so
#8  0x00007ffff6f06079 in PlayerMain(int, char**) () from /aichallenge/AWSIM/UnityPlayer.so
#9  0x00007ffff5b9bd90 in __libc_start_call_main (main=main@entry=0x2010e0 <main>, argc=argc@entry=1,
    argv=argv@entry=0x7fffffff7c98) at ../sysdeps/nptl/libc_start_call_main.h:58
#10 0x00007ffff5b9be40 in __libc_start_main_impl (main=0x2010e0 <main>, argc=1, argv=0x7fffffff7c98,
    init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffff7c88)
    at ../csu/libc-start.c:392
#11 0x0000000000201029 in _start ()

うまく動いているホスト側のケースと比べると、以下のエラー出力が増えています。

error: XDG_RUNTIME_DIR not set in the environment.
MESA: error: ZINK: failed to choose pdev

まず前のエラーをつぶすため、足らない環境変数を追加します。

$ export XDG_RUNTIME_DIR=/tmp/xdgruntimedir

が、やはりだめでした。

AWSIM on Docker on WSLg という特殊な環境は一筋縄ではいきません。。。