docker on windows (gpu) 2022/09/13 Updated by

Docker on Windows (GPU)

Ubuntu Container with GPU


[Up] Japanese English

4年セミナー(2022年度) で利用可能な docker コンテナ

  1. Docker Host のマシン情報
  2. Docker ホストでは、nVidia が配布する Ubuntu Image (GPU + TensorFlow) が利用可能 である。
  3. Docker ホストでは、TCPポートの 7070-7075, 8080-8085 が解放してある。
  4. Docker ホスト上で、上記の Image から複数の Docker コンテナが起動中である。
  5. $ docker run --name コンテナ名 --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 --gpus all \
        -p ポート1:22 -p ポート2:8888 \
        -v /home/docker/コンテナ名:/root/doc -it nvcr.io/nvidia/tensorflow:21.08-tf2-py3
    
    割当コンテナ名ポート1
    (22へ転送)
    ポート2
    (8888へ転送)
    nitta4semi070708080
    g199054semi170718081
    g199114semi270728082
    g199284semi370738083
    g199374semi470748084
    g199384semi570758085



    [注意] 各コンテナ中では /root/doc/ の下のファイルだけが永続的に残るので注意してください。それ以外のファイルは、コンテナを消去したときにはすべて無くなります。変なタイミングで Docker ホストが再起動したりしてコンテナが壊れたときは、コンテナを消去して作り直す可能性があります。

  6. 各Dockerコンテナ内では以下の方法で、外部から root ユーザとして ssh アクセスできるように設定されている。
  7.   # 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
    

    各Docker コンテナにアクセスするためのパスワードは、授業時に伝えます。

  8. [2022/10/11 追記] 上記のようにして起動した sshd プロセスは container が停止したときに終了してしまう。 コンテナを再起動したときにはssh サーバを再起動する必要がある(root 権限で "service ssh start" )。

Docker コンテナの利用について

  1. 自分が利用可能な Docker コンテナの IP Address とポート番号 (ssh接続用 707x, http接続用: 808x, x は0-5の整数) を確認します。
  2. 手元のパソコン (PC or Mac) を学内LANに接続するか、VPNに接続します。
  3. PCの場合は「cygwin」または「Tera Term」、 Mac の場合「ターミナル」からdockerコンテナにの707x ポートに sshでアクセスします。
  4.     [PCのcygwin or Mac の場合]
        $ ssh root@133.99.22.13 -p 707x      ← xは0-5の数字
    
        [例]
        $ ssh root@133.99.22.13 -p 7070
    
  5. パッケージ関係を update および upgrade しておきます。
  6.   $ apt-get update
      $ apt-get upgrade -y
    
  7. venv を用いて新しいpython 仮想環境を /root/doc/venv の下に作成します。ここでは、仮想環境の名前は imgentf2 としています。一番最初はエラーが起きるので、指示にしたがって venv をインストールします。
  8. [注意] conda コマンドを root 権限で動作させると Warning が表示されるので、Anaconda は使用しないことにします。こういう場合は venv を使う方がよいようです。

      # cd
      # apt update
      # python3 -m venv ./doc/venv/imgentf2
      エラーが起きるので、指示にしたがって venv をインストールする。
      # apt install python3.8-venv
    
  9. 再び venv を用いて新しいpython 仮想環境を作成します。
  10.   # python3 -m venv ./doc/venv/imgentf2
    
  11. 新しいpython仮想環境に切り替えて、パッケージをインストールします。
  12.   # source ./doc/venv/imgentf2/bin/activate
      (imgentf2) #    ← 新しい仮想環境でシェルが動いているので、"pip install パッケージ名" でインストールしていきます。
    
  13. "pip install -r ファイル名" コマンドで、まとめてパッケージをインストールすることもできます
  14. たとえば Hands on Image Generation with TensorFlow 2 のgithub に置かれている https://github.com/PacktPublishing/Hands-On-Image-Generation-with-TensorFlow-2.0/blob/master/README.md では、venv を使ってpython仮想環境 imgentf2 を作成していますが、requirements.txt というファイルから一気にパッケージを バージョン指定してインストールしています。 今回は、GPUが動作するTensorFlowのバージョンに変更してインストールしてみます。

    [注意] cuda 11.2 & cuDNN 8.1 に対応していないバージョンの TensorFlow では GPU を利用できません。対応している TensorFlow は こちら にあるように2.5.0, 2.6.0, 2.7.0, 2.8.0, 2.9.0, 2.10.0 (Oct/09/2022 時点)なので、それらを使うように設定してください。

      # source ./doc/venv/imgentf2/bin/activate
      (imgentf2) # pip3 install --upgrade pip
      (imgentf2) # pip3 install -r req.txt    ← TensorFlow のバージョンを変更したもの。相当時間(30分?)がかかる。
      (imgentf2) # python -m ipykernel install --user --name=imgentf2
      (imgentf2) # jupyter nbextension enable --py widgetsnbextension   ← これはエラーになる。
    
    req.txt
    tensorflow==2.8.3
    tensorflow_addons
    tensorflow-datasets
    opencv-python
    dlib
    face_recognition
    tqdm
    matplotlib
    ipykernel
    ipywidgets
    packaging
    
  15. 必要ならば "scp -P ポート番号" コマンドで、手元のパソコンとコンテナ上のシェルとの間でファイル転送を行います。"-P" は(sshの場合とは異なり)大文字であることに注意してください。
  16.   [手元のPC上の cygwin または Mac の「ターミナル」上で]
    
        手元のパソコンからコンテナにファイル(例 src.zip)をコピーするには
          $ scp -P 707x  src.zip   root@133.99.22.13:doc
    
        コンテナから手元のパソコンにファイル(例 doc/src.zip)をコピーするには
          $ scp -P 707x root@133.99.22.13:doc/src.zip .
    
    
  17. python仮想環境の中で jupyter notebook を起動します。
  18.   (imgentf2) # jupyter notebook
    
  19. 手元のパソコンでブラウザを立ち上げ "http://133.99.22.13:808x/?token=トークンの数字" にアクセスする(x は0-5の数字)。token は jupyter に表示されている。
  20. jupyter 側で「カーネルで NUMA がサポートされていない」というWarningが出るが、これは無害のようです。
  21. jupyter notebook 中で "import cv2" とすると "libGL.so.1: cannot open Error" がでる場合は、それよりも前のセルで apt をupdate してから、libgl1-mesa-dev をインストールする。
  22. [jupyter notebook のCell内での記述] ← imgentf2 環境でインストールしておいたほうが面倒がないが
    # "import cv2" causes "libGL.so.1: cannot open Error"
    ! apt-get update
    ! apt-get upgrade -y
    ! apt-get install -y libgl1-mesa-dev
    
  23. jupyter 内の計算で正しく GPU が使われるはずである。docker ホストにインストールされている cuda 11.2 & cuDNN-8.1 に対応したバージョンの TensorFlow を使うことが重要である。
  24. jupyter notebook 上では、指定したカーネルが使われていることを確認すること。もしも、想定していないカーネルが使われている場合は、切り替えること。
  25.     [例]
            "Kernel" → "Change kernel" → imgentf2
    



    [注意]venvでactivate した後で jupyter を起動した場合、 デフォルトの"Python 3" というカーネルで 「標準のpythonが使われる」か、 「venvで切り替えていた仮想環境のpythonが使われるか」はシステム依存のようだ。 面倒な状態に陥らないために、必ずカーネルを正しいものに設定すること。
    [Jupyter Notebookで使われている python のパスを調べる方法]
    import sys
    sys.executable
    
    '/usr/bin/python'
    標準のpythonの場合仮想環境のpythonの場合

    [2022/10/11 注記] なぜか「新たに作成した venv 仮想環境で、matploglib パッケージをインストールしても、import できないというエラーがでる」ようになった。昨日までは動いていたはずなのだが。パッケージ配布サイトの問題か?しばらく様子を見ることにする。 ← 「ipynb が標準のpython環境で実行されていた」のが原因であった。


dockerの管理作業をリモートから行う

Windows を Docker Host にした場合、リモートで作業を行うには3通りの方法が考えられる。

Docker コンテナをスタートする

Windows が reboot すると、docker 上のコンテナが停止する。手動での起動方法は以下の通り。

  $ docker start  コンテナ名

[例]
  $ docker start  4semi0

Docker コンテナ内で ssh サーバ を起動する

コンテナが一旦停止 (stop) して再スタートすると、sshサーバは起動されない。手動での起動方法は以下の通り。

    $ docker exec -it  コンテナ名  service ssh start

[例]
    $ docker exec -it  4semi0  service ssh start