2025/2/24 Updated by

Vision Transfeormer 入門

第3章のコードが動くDocker コンテナ


[Up] Japanese English

前提条件



1. Docker Container を用意する


1.1. 作成すべき python 仮想環境


1.2. nVidia GPU (CUDA) に対応した Docker Image を探す

nVidia は CUDA をインストールした Docker Image (nvidia-docker image) コンテナを 公式サイト上で公開していて、 その使い方は" NGC コンテナー ユーザーガイド" (キャッシュ) で解説されている。

「nvidia-docker は、起動時に nVidia driver のユーザーモードコンポーネント GPU を Docker コンテナにマウントする」 と記述されているので、 「docker host となる Windows でnVidiaのドライバを最新にする」ことが重要で、 「docker host である Windows自体にインストールされた CUDA や cuDNN のバージョンは関係ない」ようだ。


1.3. Docker Container を作成する

  1. 使用したい Docker Image (Web上では「コンテナ」と表示されている)が見つかったら、 以下のコマンドでダウンロードして Docker Container を作成し、実行できる。
  2. (例) 緑色の文字部分は環境に合わせて変更すること
    docker run --gpus all -it --rm -v local_dir:container_dir nvcr.io/nvidia/pytorch:20.10-py3:XX,XX-torchYYY-py3
    
  3. 以下の条件でコンテナを作成する。
  4. 割当コンテナ名ポート1
    (22へ転送)
    ポート2
    (8888へ転送)
    /root/doc
    マウント先
    Docker Image
    -vit_book70798089 /home/docker/vit nvcr.io/nvidia/pytorch:20.10-py3
  5. Docker Host である Windows 上の Ubuntu (WSL2) の対話環境の中で以下のコマンドを実行する。
  6.  docker run --name vit_book --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 --gpus all \
         -p 7079:22 -p 8089:8888 \
         -v /home/docker/vit:/root/doc \
         -it nvcr.io/nvidia/pytorch:20.10-py3
    

1.4. Docker Container の環境を整える (ssh)

  1. Docker Guest の対話環境にアクセスする。
  2. Docker Host の Windows 上で動作する Ubuntu (WSL2) において、docker コマンドを用いて vit_book コンテナに接続する。

    docker attach vit_book
    
  3. openssh の環境を整える。パスワードの部分は推測されにくい文字列に変更すること。
  4. apt-get update
    apt-get upgrade -y
    apt-get install -y openssh-server
    echo 'root:パスワード' | chpasswd
    sed -i "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/" /etc/ssh/sshd_config
    service ssh start
    
  5. これで、ポート番号を指定して外からdocker guest に ssh アクセスできるようになる。 IP アドレスは docker host のもの。
  6. ssh -p 7079 root@133.99.41.195
    
  7. rsync は別にインストールが必要のようだ。
  8. apt install rsync
    
  9. 後で cmake をコンパイルするときに必要になるので openssh 開発用ライブラリもインストールしておく。
  10. apt-get install libssl-dev
    apt-get install -y openssh
    

1.5. Docker Container の環境を整える (pytorch)

  1. Vision Transformer 入門 の第3章のコードを送り込む。rsyncコマンドを使っているが、通信プロトコルは ssh で、docker guest への ssh ポート番号である 7079 を指定する。
  2. rsync -avr -e "ssh -p 7079" ch03 root@133.99.41.195:/root/doc
    
  3. ch03のサンプルコードを動かす環境は以下の通り。
  4. requirements.txt
    ● Ubuntu 16.04 LTS
    ● CUDA 10.1
    ● GPU V100 32GB
    ● CPU Xeon E5-2698 v4 2.20GHz
    ● Python 3.7.4
    ● numpy 1.19.5
    ● matplotlib 3.4.3 
    ● Pillow 7.0.0
    ● opencv 4.5.3.56 
    ● PyTorch 1.7.1
    ● Torchvision 0.8.2 
    ● timm 0.6.2
  5. python のバージョンを 3.7.4 にする
  6. root@7c8090f3603d:~/doc/ch3# python
    Python 3.6.10 |Anaconda, Inc.| (default, May  8 2020, 02:54:21)
    [GCC 7.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> exit()
    
    conda create -n vit_book python=3.7.4 ipykernel
    conda activate vit_book
    エラー発生
    CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
    To initialize your shell, run
    
        $ conda init 
    
    Currently supported shells are:
      - bash
      - fish
      - tcsh
      - xonsh
      - zsh
      - powershell
    
    conda init bash
    conda acitvate vit_book
    やはりエラー
    
    一旦、shellを終了して、docker guest自体を終了し、再び docker guest を起動し直して、 Ubuntu から docker attach vit_book すると、conda activate vit_book は正しく動作した。
  7. python のバージョンは大丈夫のようだ。
  8. (base) root@7c8090f3603d:~# conda activate vit_book
    (vit_book) root@7c8090f3603d:~# python
    Python 3.7.4 (default, Aug 13 2019, 20:35:49)
    [GCC 7.3.0] :: Anaconda, Inc. on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> exit()
    
  9. バージョンを指定して pytorch をインストールする。
  10. conda install pytorch=1.7.1 torchvision=0.8.2 -c pytorch
    
  11. pytorchのバージョンも大丈夫で、GPUも使えるようだ。
  12. (vit_book) root@7c8090f3603d:~# python -c 'import torch; print(torch.__version__);'
    1.7.1
    (vit_book) root@7c8090f3603d:~# python -c "import torch; print(torch.cuda.is_available());"
    True
    
  13. opencv をインストールする。
  14. pip install opencv-python==4.5.3.56
    pip install opencv-contrib-python==4.5.3.56
    
  15. pillow をインストールする。
  16. pip install pillow==7.0.0
    
  17. matplotlib をインストールする。
  18. pip install matplotlib==3.4.3
    
  19. numpy
  20. pip install numpy==1.19.5
    
  21. timm のバージョン 0.6.2 はないようだ。。
  22. (vit_book) root@7c8090f3603d:~# pip install timm==0.6.2
    ERROR: Ignored the following versions that require a different python version: 0.9.16 Requires-Python >=3.8; 1.0.10 Requires-Python >=3.8; 1.0.11 Requires-Python >=3.8; 1.0.12 Requires-Python >=3.8; 1.0.13 Requires-Python >=3.8; 1.0.14 Requires-Python >=3.8; 1.0.15 Requires-Python >=3.8; 1.0.3 Requires-Python >=3.8; 1.0.7 Requires-Python >=3.8; 1.0.8 Requires-Python >=3.8; 1.0.9 Requires-Python >=3.8
    ERROR: Could not find a version that satisfies the requirement timm==0.6.2 (from versions: 0.1.1, 0.1.2, 0.1.4, 0.1.6, 0.1.8, 0.1.10, 0.1.12, 0.1.14, 0.1.16, 0.1.18, 0.1.20, 0.1.22, 0.1.24, 0.1.26, 0.1.28, 0.1.30, 0.2.1, 0.3.0, 0.3.1, 0.3.2, 0.3.3, 0.3.4, 0.4.5, 0.4.9, 0.4.12, 0.5.4, 0.6.2.dev0, 0.6.5, 0.6.7, 0.6.11, 0.6.12, 0.6.13, 0.8.0.dev0, 0.8.2.dev0, 0.8.3.dev0, 0.8.6.dev0, 0.8.10.dev0, 0.8.11.dev0, 0.8.13.dev0, 0.8.15.dev0, 0.8.17.dev0, 0.8.19.dev0, 0.8.21.dev0, 0.8.23.dev0, 0.9.0, 0.9.1, 0.9.2, 0.9.5, 0.9.6, 0.9.7, 0.9.8, 0.9.9, 0.9.10, 0.9.11, 0.9.12)
    ERROR: No matching distribution found for timm==0.6.2
    
  23. timm バージョン 0.6.2dev0 を使ってみる。これはうまくインストールできた。
  24. (vit_book) root@7c8090f3603d:~# pip install timm==0.6.2dev0
    

ch3/README.md を参考にして、3章のコードを動かす。

    python position_embedding.py --model vit_tiny_16_224 --checkpoint ./ImageNet/tiny16/best_checkpoint.pth
    
  1. position_embedding.pdf が生成される。


現時点ではここまで編集 Feb/24/2027


以下、未編集




2. Docker Container を使う



2.1. 他のマシンから Docker Container に ssh アクセスする

  1. ポート番号(ここでは 7077)を指定して ssh で Docker Host ( 133.99.41.195 ) にアクセスする。 ポート番号を変更することで個別の Dcoker Container にアクセスできる。
  2. ssh -p 7077 root@133.99.41.195
    
  3. ログインすると /root がカレントディレクトリとなる。
  4. /root/doc というフォルダがDocker Host の /home/docker/4semi7 にマップされていて、 永続的なフォルダとなる。 すなわち、このフォルダ以外は Container が削除されると失なわれる。
  5. Docker Host の Docker Desktop から Container の shell を起動した場合は カレントディレクトリが /workpace になる。いろいろなファイルがそこに置かれている場合がある。
  6. [注意] もしも、 「~/.ssh/known_hosts のキーと異なるので通信できない」というエラーが起きて ssh が終了する場合は、 以下のコマンドで ~/.ssh/known_hosts のエントリを消すことで解決できる。
  7. ssh-keygen -R '[133.99.41.195]:7077'
    




2.2. 他のマシンから Docker Container 上で jupyter を起動する。

  1. ポート番号(ここでは 7077)を指定して ssh で Docker Host ( 133.99.41.195 ) にアクセスすると、 Docker Container の ssh に転送される。
  2. ssh -p 7077 root@133.99.41.195
    
  3. Docker Container 上で jupyter notebook を起動する。起動時に表示される URL (特に token ) を覚えておくこと。 token の値は毎回異なる。
  4. jupyter notebook
    
    http://localhost:8888/?token=...(略)
    or 
    http://127.0.0.1:8888/?token=...(略)




2.3. ブラウザでアクセスする

  1. 手元のPCでブラウザを起動する。Google Chrome を推奨する。
  2. jupyter notebook が起動時に表示したのはローカルホストからアクセスする場合の URL である。 他のマシンからアクセスするにはURL中の IP アドレスとポート番号を変更する。
  3. (例)
    jupyter が表示したURL:
      http://127.0.0.1:8888/?token=64b6f850fc2a1b9fb52c71b7cd3240d59870619b32a4b4e7
    
    (変更点)
    IPアドレス: 127.0.0.1 (または localhost) →  133.99.41.195
    ポート番号: 8888 → 8087 
    
    (アクセスするURL)
      http://133.99.41.195:8087/?token=64b6f850fc2a1b9fb52c71b7cd3240d59870619b32a4b4e7
    



  4. [注意] jupyter notebook は 8888 番ポートが使えない場合に、異なるポート番号(8887 など)を使うので、外部からアクセスできなくなる。
  5. jupyter notebook が異常終了したときに、しばらく(5分程度) 8888 番ポートをつかんだままになることがある。 そのような状態で jupyter notebook 再起動すると、8888番ポート以外のポート番号を使って起動し、 外部からアクセスできなくなる。しばらく(5分程度)待ってから jupyter notebook を起動すること。