Apr/11/2025 Updated by

「AlphaZero 深層学習・強化学習・探索 人工知能プログラミング実践入門」

のコードが動く Docker コンテナ


[Up] Japanese English

前提条件



1. Docker Container を用意する


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


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

https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tensorflow/tags
nvcr.io/nvidia/tensorflow:19.03-py3 が tensorflow 1.13.1 に対応しているようだ。

1.3. Docker Container を作成する

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

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

  1. Docker Guest の対話環境にアクセスする。
  2. docker ゲストOS で GPU が見えているかを確認する。
  3. root@4a82ecfbaf49:~/doc# nvidia-smi
    Sat Apr 12 10:31:28 2025
    +-----------------------------------------------------------------------------------------+
    | NVIDIA-SMI 565.72                 Driver Version: 566.14         CUDA Version: 12.7     |
    |-----------------------------------------+------------------------+----------------------+
    | 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 3070 ...    On  |   00000000:01:00.0 Off |                  N/A |
    | N/A   44C    P0             34W /  125W |       0MiB /   8192MiB |      0%      Default |
    |                                         |                        |                  N/A |
    +-----------------------------------------+------------------------+----------------------+
    
    +-----------------------------------------------------------------------------------------+
    | Processes:                                                                              |
    |  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
    |        ID   ID                                                               Usage      |
    |=========================================================================================|
    |  No running processes found                                                             |
    +-----------------------------------------------------------------------------------------+
    root@4a82ecfbaf49:~/doc# cat /usr/local/cuda/version.txt
    CUDA Version 10.1.105
    root@4a82ecfbaf49:~/doc# nvcc --version
    nvcc: NVIDIA (R) Cuda compiler driver
    Copyright (c) 2005-2019 NVIDIA Corporation
    Built on Fri_Feb__8_19:08:17_PST_2019
    Cuda compilation tools, release 10.1, V10.1.105
    
  4. python の状況を調べる
  5. root@4a82ecfbaf49:~/doc# python
    Python 3.5.2 (default, Nov 12 2018, 13:43:14)
    [GCC 5.4.0 20160609] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import tensorflow as tf
    >>> print(tf.__version__)
    1.13.1
    >>> exit()
    
    (注意) python 3.5.2 では、f文字列が使えない可能性がある。4_4でエラーが検出された。 f文字列が導入されたのは python 3.6 以降とのこと。 python のバージョンを変更する必要がある。
  6. openssh の環境を整える。パスワードの部分は推測されにくい文字列に変更すること。
  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
    
  8. これで、ポート番号を指定して外からdocker guest に ssh アクセスできるようになる。 IP アドレスは docker host のもの。
  9. ssh -p 7075 root@133.99.41.195
    

    remote login すると 次のようなエラーが表示される。

    rm: cannot remove '/lib': Is a directory
    

    これは /etc/profile の中で実行される /etc/shinit が、CUDA ライブラリを消して、パスを張りなおしている部分からきているようだ。

    [/etc/shinit]
    #!/bin/sh
    if test \( \! -L ${_CUDA_COMPAT_PATH}/lib \) -o \( -z "${_CUDA_COMPAT_STATUS}" \); then
      rm -f ${_CUDA_COMPAT_PATH}/lib
      export _CUDA_COMPAT_STATUS="$(LD_LIBRARY_PATH=${_CUDA_COMPAT_PATH}/lib.real /usr/local/bin/cudaCheck 2>/dev/null &&
     ln -sf ${_CUDA_COMPAT_PATH}/lib.real ${_CUDA_COMPAT_PATH}/lib 2>/dev/null)"
    fi
    
    docker desktop の Exec から入った場合は _CUDA_COMPAT_PATH は次の値に設定されている。
    root@4a82ecfbaf49:/etc# echo $_CUDA_COMPAT_PATH
    /usr/local/cuda/compat
    
    remote login するとこの値が設定されていない。 /etc/shinit の先頭に次の行を追加する。
    export _CUDA_COMPAT_PATH=/usr/local/cuda/compat
    
    remote login 時にエラーは出なくなったが、
  10. 後で cmake をコンパイルするときに必要になるので openssh 開発用ライブラリもインストールしておく。
  11. apt-get install libssl-dev
    apt-get install -y openssh    ← openssh パッケージのインストールがなぜか失敗する。
    

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

  1. AlphaZero 実践入門 のサンプルコードを送り込む。rsyncコマンドを使っているが、通信プロトコルは ssh で、docker guest への ssh ポート番号である 7075 を指定する。
  2. rsync -avr -e "ssh -p 7075" sample root@133.99.41.195:/root/doc
    
  3. 本のサンプルコードを動かす環境は以下の通り。
  4. requirements.txt
    tensorflow_gpu==1.13.1
    numpy==1.14.6
    matplotlib==3.0.3
    panas==0.22.0
    Pillow==4.1.1
    h5py==2.8.0
    gym==0.10.11
    
  5. 最初からインストールされているパッケージのバージョンを調べる。
  6. root@4a82ecfbaf49:~/doc# python
    Python 3.5.2 (default, Jan 26 2021, 13:30:48)
    [GCC 5.4.0 20160609] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    
    python は 3.5.2 のようだ。 本のpython のバージョンは 3.6.7 (p.67) だが、 とりあえずこのまま進めて、 もしエラーがでる場合は変更することにする。
  7. tensorflow は 1.13.1 がインストール済み。
  8. >>> import tensorflow as tf
    >>> print(tf.__version__)
    1.13.1
    
  9. numpy は1.14.6ではなく、1.14.5 であった。このまま進める。
  10. >>> import numpy as np
    >>> print(np.__version__)
    1.14.5
    
  11. matplotlib は3.0.3で本と同じであった。
  12. >>> import matplotlib
    >>> print(matplotlib.__version__)
    3.0.3
    
  13. pandas は 0.22.0 ではなく、0.23.0 であった。このまま進める。
  14. >>> import pandas as pd
    >>> print(pd.__version__)
    0.23.0
    
  15. PIL (Pillow) はインストールされていない。
  16. >>> import PIL
    Traceback (most recent call last):
      File "", line 1, in 
    ImportError: No module named 'PIL'
    >>> from PIL import Image
    Traceback (most recent call last):
      File "", line 1, in 
    ImportError: No module named 'PIL'
    
  17. h5py は 2.8.0 ではなく、2.9.0 であった。このまま進める
  18. >>> import h5py
    >>> print(h5py.__version__)
    2.9.0
    
  19. gym はインストールされていない。
  20. >>> import gym
    Traceback (most recent call last):
      File "", line 1, in 
    ImportError: No module named 'gym'
    
  21. 新しい python 仮想環境を作成せずに、pandas, Pillow (PIL), gym パッケージをインストールする。
  22. pillow パッケージをインストールする。
  23. pip install pillow==4.1.1
    
  24. gym パッケージをインストールする。
  25. pip install gym==0.10.11
    

Python 3.6 系を追加インストールする

本で使用しているのは python 3.6.7 であるが、docker Container にインストールされていたのは 3.5.2 であった。 「f文字列」が使えるのは 3.6 以降なので、3.6以降の python を追加インストールする必要がある。

ChatGPT によれば 3.6.9 は用意されているとのこと。

  1. add-apt-repository コマンドをインストールする
  2. apt update
    apt install -y software-properties-common
    
  3. python 3.6.9 をインストール。
  4. add-apt-repository ppa:deadsnakes/ppa
    apt update
    apt install -y python3.6 python3.6-venv python3.6-distutils
    
エラー python 3.6.7 をソースからビルドする。
  1. 必要なパッケージをインストール
  2. apt install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev \
    libnss3-dev libssl-dev libreadline-dev libffi-dev wget libsqlite3-dev \
    libbz2-dev liblzma-dev uuid-dev xz-utils
    
  3. python 3.6.7 を公式ソースから取得してビルドする
  4. wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tgz
    tar xzf Python-3.6.7.tgz
    cd Python-3.6.7
    ./configure --enable-optimizations
    make -j$(nproc)
    make altinstall  # これ重要!「python3」には上書きしない
    
    "make altinstall" により /usr/local/bin/python3.6 としてインストールされる。既存の python3 → python3.5 を壊さない。
  5. インストール確認
  6. /usr/local/bin/python3.6 --version
    
  7. デフォルトの python3 を切り替える
  8. update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.6 2
    update-alternatives --config python3
    エラー
    
    root@4a82ecfbaf49:~/doc/Python-3.6.7# ls -ld /usr/local/bin/python*
    -rwxr-xr-x 2 root root 13756912 Apr 13 06:13 /usr/local/bin/python3.6
    -rwxr-xr-x 2 root root 13756912 Apr 13 06:13 /usr/local/bin/python3.6m
    -rwxr-xr-x 1 root root     3097 Apr 13 06:13 /usr/local/bin/python3.6m-config
    root@4a82ecfbaf49:~/doc/Python-3.6.7# ls -ld /usr/bin/python*
    lrwxrwxrwx 1 root root      18 Mar 11  2019 /usr/bin/python -> /usr/bin/python3.5
    lrwxrwxrwx 1 root root       9 Mar 23  2016 /usr/bin/python3 -> python3.5
    -rwxr-xr-x 2 root root 4456208 Jan 26  2021 /usr/bin/python3.5
    lrwxrwxrwx 1 root root      33 Jan 26  2021 /usr/bin/python3.5-config -> x86_64-linux-gnu-python3.5-config
    -rwxr-xr-x 2 root root 4456208 Jan 26  2021 /usr/bin/python3.5m
    lrwxrwxrwx 1 root root      34 Jan 26  2021 /usr/bin/python3.5m-config -> x86_64-linux-gnu-python3.5m-config
    lrwxrwxrwx 1 root root      10 Mar 23  2016 /usr/bin/python3m -> python3.5m
    root@4a82ecfbaf49:~/doc/Python-3.6.7# update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.6 2
    update-alternatives: using /usr/local/bin/python3.6 to provide /usr/bin/python3 (python3) in auto mode
    root@4a82ecfbaf49:~/doc/Python-3.6.7# update-alternatives --config python3
    There is only one alternative in link group python3 (providing /usr/bin/python3): /usr/local/bin/python3.6
    Nothing to configure.
    root@4a82ecfbaf49:~/doc/Python-3.6.7# ls -l /usr/bin/python* /usr/local/bin/python*
    lrwxrwxrwx 1 root root       18 Mar 11  2019 /usr/bin/python -> /usr/bin/python3.5
    lrwxrwxrwx 1 root root       25 Apr 13 06:16 /usr/bin/python3 -> /etc/alternatives/python3
    -rwxr-xr-x 2 root root  4456208 Jan 26  2021 /usr/bin/python3.5
    lrwxrwxrwx 1 root root       33 Jan 26  2021 /usr/bin/python3.5-config -> x86_64-linux-gnu-python3.5-config
    -rwxr-xr-x 2 root root  4456208 Jan 26  2021 /usr/bin/python3.5m
    lrwxrwxrwx 1 root root       34 Jan 26  2021 /usr/bin/python3.5m-config -> x86_64-linux-gnu-python3.5m-config
    lrwxrwxrwx 1 root root       10 Mar 23  2016 /usr/bin/python3m -> python3.5m
    -rwxr-xr-x 2 root root 13756912 Apr 13 06:13 /usr/local/bin/python3.6
    -rwxr-xr-x 2 root root 13756912 Apr 13 06:13 /usr/local/bin/python3.6m
    -rwxr-xr-x 1 root root     3097 Apr 13 06:13 /usr/local/bin/python3.6m-config
    root@4a82ecfbaf49:~/doc/Python-3.6.7# ls -l /etc/alternatives/python*
    lrwxrwxrwx 1 root root 24 Apr 13 06:16 /etc/alternatives/python3 -> /usr/local/bin/python3.6
    
  9. 手動で以下のリンクに張り替えても、jupyter の使う python は変化しない、とのこと。
  10.   /usr/bin/python --> /usr/bin/python3.5
      /usr/bin/python3 --> /usr/bin/python3.5
    
  11. pipのインストール
  12. 
    wget  https://bootstrap.pypa.io/pip/3.6/get-pip.py
    /usr/local/bin/python3.6 get-pip.py
    
    
  13. venv がない
  14. 本来は python のインストール時にできるはずだがなぜか存在しない。 かわりに virtualenv を使うことにする。
    /usr/local/bin/python3.6 -m pip install vertualenv
    /usr/local/bin/python3.6 -m virtualenv ~/py36env
    
  15. jupyter 全体を python3.6 に切り替えたい
  16. /usr/local/bin/jupyter を移動する
    mv /usr/local/bin/jupyter /usr/local/bin/jupyter3.5.2
    
    python3.6 上でjupyter を再インストール
    /usr/local/bin/python3.6 -m pip install jupyter
    
    そのうえで /usr/local/bin/jupyter を使う。
    /usr/local/bin/jupyter notebook --allow-root --ip=0.0.0.0 --no-browser
    

jupyter notebookを起動する。

jupyter notebook --allow-root --ip=0.0.0.0 --no-browser
他のマシンからアクセスするには "--ip=0.0.0.0" の指定が必要であることに注意。
(動作中の jupyter notebook の token を知る)
jupyter notebook list

外部からアクセスする

http://133.99.41.195:8085/?token=a62e....e0ab

python3.6.2 を使う jupyter で gym パッケージが見えなくなっている。 pip は python のバージョンに依存しているので、新たにインストールが必要かも? /usr/local/bin/python3.6 -m pip install gym=0.10.11 /usr/local/bin/python3.6 -m pip install pillow==4.1.1 /usr/local/bin/python3.6 -m pip install tensorflow_gpu=1.13.1 /usr/local/bin/python3.6 -m pip install keras /usr/local/bin/python3.6 -m pip install matplotlib==3.0.3 /usr/local/bin/python3.6 -m pip install pandas==0.22.0 /usr/local/bin/python3.6 -m pip install numpy==1.14.6 /usr/local/bin/python3.6 -m pip install h5py==2.8.0