Onnxruntimeのcudaのdockerファイルを使って、Windows11+wsl2+dockerのGUI環境を整える。

# 注意
まず前もってこの記事は、説明が端折らせている部分がありますが、やったことの備忘録なので、流れ沿って行けばほぼ大丈夫だと思います。
# 目次
[1.事前環境](#事前環境)
[2.onnxruntimeのgithubからcloneしてきて、dockerをdockerfileからビルドする。](#onnxruntimeのgithubからcloneしてきて、dockerをdockerfileからビルドする。)
[3.ビルドが終わったら、さっそく建てる。](#ビルドが終わったら、さっそく建てる。)
[4.最低限必要なもののインストール](#最低限必要なもののインストール)
[5.サンプルのclone](#サンプルのclone)
[6.sample.pyを動かしながら、足りないものを探していく。](##sample.pyを動かしながら、足りないものを探していく。)
[7.x-windowを立てて実行](#x-windowを立てて実行)
[8.もしうまくいかない場合](#もしうまくいかない場合：)
[9.まとめ](#まとめ)

# 事前環境
dockerなどのinstallは省きます。
また、windows11+wsl2+cuda on wsl2がきちんと動くのは
は別のコンテナで確認できているものとします。

たとえばcudfなどのdockerを使うと確認がしやすいかと思います。


## onnxruntimeのgithubからcloneしてきて、dockerをdockerfileからビルドする。

~~~
git clone https://github.com/microsoft/onnxruntime.git
cd ./onnxruntime/dockerfiles
git submodule update --init
docker build -t onnxruntime-cuda -f Dockerfile.cuda ..
~~~
なぜか一回目cloneしたときはダメだったが、次の日にコピペでDockerfile.cudaを作成したらうまくいった。よくわからん。 

## ビルドが終わったら、さっそく建てる。
~~~
docker run --gpus all -it onnxruntime-cuda
~~~

## 最低限必要なもののインストール

pythonとかcuda関係は必要なものが入っているが、sudoとかgitとかそこらへんとサンプルを動かすためのファイルがないが、まずはsudoとgitをインストール。
(pythonとかも複数入っていて、気持ち悪い環境)
~~~
apt update
apt install sudo
sudo apt install git
~~~

## サンプルのclone
サンプルはこちらからお借りします。
https://github.com/Kazuhito00/yolox-bytetrack-mcmot-sample

~~~
git clone https://github.com/Kazuhito00/yolox-bytetrack-mcmot-sample.git
cd yolox-bytetrac-mcmot-sample
~~~

## sample.pyを動かしながら、足りないものを探していく。
~~~
/yolox-bytetrack-mcmot-sample# python3 sample.py
Traceback (most recent call last):
  File "sample.py", line 7, in <module>
    import cv2
ModuleNotFoundError: No module named 'cv2'
~~~
~~~
pip install opencv-contrib-python
pip install opencv-python
~~~

~~~
/yolox-bytetrack-mcmot-sample# python3 sample.py
Traceback (most recent call last):
  File "sample.py", line 7, in <module>
    import cv2
  File "/usr/local/lib/python3.8/dist-packages/cv2/__init__.py", line 8, in <module>
    from .cv2 import *
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
~~~
https://cocoinit23.com/docker-opencv-importerror-libgl-so-1-cannot-open-shared-object-file/
こちらを参考に
~~~
sudo apt-get install libgl1-mesa-dev
~~~
~~~
:/yolox-bytetrack-mcmot-sample# python3 sample.py
Traceback (most recent call last):
  File "sample.py", line 11, in <module>
    from bytetrack.mc_bytetrack import MultiClassByteTrack
  File "/yolox-bytetrack-mcmot-sample/bytetrack/mc_bytetrack.py", line 7, in <module>
    from bytetrack.tracker.byte_tracker import BYTETracker
  File "/yolox-bytetrack-mcmot-sample/bytetrack/tracker/byte_tracker.py", line 3, in <module>
    from .kalman_filter import KalmanFilter
  File "/yolox-bytetrack-mcmot-sample/bytetrack/tracker/kalman_filter.py", line 3, in <module>
    import scipy.linalg
ModuleNotFoundError: No module named 'scipy'
~~~
~~~
pip install scipy
~~~
ここらへんで、sampleのgithubを見たら、使ってるものの一覧があったので今までinstallしたもの(onnxruntime,opencv,scipy)以外をインストールしたり、エラー対策でインストール
~~~
apt install g++
sudo apt install python3.8-dev
source ~/.bashrc
pip install cython
pip install lap
pip install cython-bbox
~~~

~~~
/yolox-bytetrack-mcmot-sample# python3 sample.py
[ WARN:0@0.119] global /io/opencv/modules/videoio/src/cap_v4l.cpp (889) open VIDEOIO(V4L2:/dev/video0): can't open camera by index
~~~
仮想環境だからそりゃそう。
~~~
:/yolox-bytetrack-mcmot-sample# python3 sample.py --movie test.mp4
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "/usr/local/lib/python3.8/dist-packages/cv2/qt/plugins" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: xcb.

Aborted
~~~
https://qiita.com/seigot/items/2df59ab8853e004fb3ed
ここまできたらゴール直前?
## x-windowを立てて実行
https://wisteriahill.sakura.ne.jp/CMS/WordPress/2020/09/02/docker-desktop-for-windows-x-window-gui/
これを自分は参考にした(セキュリティは知らんぷり)。
別のコンソールを立ち上げて、
~~~コンソールB
ipconfig
~~~
そのipアドレス(なんでもいいわけではないと思うので一番上のやつと思ったら、どうやらWSLのじゃないとだめ見たい。それであればうまくいった)
もしくは以下のコマンドで出した値をいれる。
~~~
powershell -Command "(Get-NetIPConfiguration | Select-Object IPv4Address, InterfaceAlias|Where-Object {$_.InterfaceAlias -eq 'vEthernet (WSL)'}).IPv4Address.IPAddress"
~~~
~~~コンソールA
export DISPLAY=XXX.XXX.XX.XX:0.0
source ~/.bashrc
python sample.py --movie test.mp4
~~~
ちなみにsample.pyは最初はCPUオンリーの設定になっているので、yoloxの関数に渡しているCPUほにゃららをCUDAほにゃららに変えればCUDA環境にできます。
やったね。


### もしうまくいかない場合：
それまで調査していく段階で
https://medicalfields.jp/blog/python/ubuntu%E3%81%A7python3%E3%81%A7pyqt5%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%9F%E3%81%84%E3%81%AE%E3%81%AB%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E3%81%A7%E3%82%8B/
の内容を実行している。
(pyqtのインストール)

これで自分は実行できました。
別のコンソールを立てて(今のコンソールでexitするとすべてパァになるので注意)
上書き保存しましょう。
~~~
docker commit magical_morse onnxruntime-cuda
~~~
眠いのでおわり。

# まとめ
コンソール
~~~
ipconfig
~~~
でwslのipコードを取得

onnxruntime.cudaのdockerコンソール
~~~
apt update
apt install sudo
sudo apt install git
git clone https://github.com/Kazuhito00/yolox-bytetrack-mcmot-sample.git
cd yolox-bytetrac-mcmot-sample
pip install opencv-contrib-python
pip install opencv-python
sudo apt-get install libgl1-mesa-dev
apt install g++
sudo apt install python3.8-dev
source ~/.bashrc
pip install cython
pip install lap
export DISPLAY={WSLのipアドレス}:0.0
source ~/.bashrc
python sample.py --movie test.mp4
~~~

#### 独り言
自然言語処理から興味が移ったというより、一度やって成功させて、exit()してパァにしたので、書いた。
もうこれで忘れない。

doc2vecとか自然言語処理で遊びたいが、時間がない....
でもyoloxとかも面白いから全然あり。
yolov5_xとかもonnx形式で転がってないかなぁ。