ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

DockerでTensorflow環境を作る

(2022-09-18 初稿 - 2023-10-26 追記)

(2023-10-26 追記)

2023年10月25日に、以下の記事をアップした。

Debian 12(bookworm)をお使いの方は、以下をご覧になってください。

(追記終了)

 

これまでDockerの記事を2つアップした。

ここでは、Tensorflowの環境を作る。

以下のサイトを参考にしたが、ほとんどそのままなので、まずは以下のサイトを参照されたい。

ディレクトリ構成

筆者は、以下のディレクトリを作成した。

doc-tf
├── py-s  # pythonのsrcファイルを置く

doc-tfとpy-sは好きな名前で良い。

DockerのTensorflowイメージをダウンロード

最新の安定版をダウンロード。

docker pull tensorflow/tensorflow                     # latest stable release

ダウンロードしたイメージのテスト

docker run -it --rm tensorflow/tensorflow \
   python -c "import tensorflow as tf; print(tf.reduce_sum(tf.random.normal([1000, 1000])))"
(省略 様々なメッセージ)
tf.Tensor(166.21828, shape=(), dtype=float32)

結果は毎回異なるが、上記のメッセージがでれば良い。

Tensorflow環境でBashの起動

bashの起動は以下のとおり。

docker run -it tensorflow/tensorflow bash

現在の環境確認

OSの種類とバージョン確認。

root@697f8d2fb8cc:/# cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.5 LTS"つ

続いて、pythonのモジュール。2022-09-18日時点。

root@697f8d2fb8cc:/# pip3 list
Package                      Version
---------------------------- ---------
absl-py                      1.2.0
astunparse                   1.6.3
cachetools                   5.2.0
certifi                      2022.6.15
charset-normalizer           2.1.1
flatbuffers                  2.0.7
gast                         0.4.0
google-auth                  2.11.0
google-auth-oauthlib         0.4.6
google-pasta                 0.2.0
grpcio                       1.48.1
h5py                         3.7.0
idna                         3.3
importlib-metadata           4.12.0
keras                        2.10.0
Keras-Preprocessing          1.1.2
libclang                     14.0.6
Markdown                     3.4.1
MarkupSafe                   2.1.1
numpy                        1.23.2
oauthlib                     3.2.0
opt-einsum                   3.3.0
packaging                    21.3
pip                          20.2.4
protobuf                     3.19.4
pyasn1                       0.4.8
pyasn1-modules               0.2.8
pyparsing                    3.0.9
requests                     2.28.1
requests-oauthlib            1.3.1
rsa                          4.9
setuptools                   65.3.0
six                          1.16.0
tensorboard                  2.10.0
tensorboard-data-server      0.6.1
tensorboard-plugin-wit       1.8.1
tensorflow-cpu               2.10.0
tensorflow-estimator         2.10.0
tensorflow-io-gcs-filesystem 0.26.0
termcolor                    1.1.0
typing-extensions            4.3.0
urllib3                      1.26.12
Werkzeug                     2.2.2
wheel                        0.34.2
wrapt                        1.14.1
zipp                         3.8.1
WARNING: You are using pip version 20.2.4; however, version 22.2.2 is available.
You should consider upgrading via the '/usr/bin/python3 -m pip install --upgrade pip' command.

最後の警告は、pipのバージョンが古いと言っているが、仮想環境なのでとりあえず無視する。

kerasも入っており、すぐにでも使えそう。

自分のスクリプトを実行する

スクリプトは、ファイル権限の関係もあるためホスト側で作成する。

ホスト側では、スクリプトをdoc-tf/py-sに保存して、以下を実行。

$ cd doc-tf/py-s
$ docker run -it --rm -v $PWD:/tmp -w /tmp tensorflow/tensorflow python ./sample.py

現在のディレクトリ(doc-tf/py-s)が仮想環境では/tmpになり、ワーキング・ディレクトリも/tmpとなる。

なお、  --rm オプションがあるので、実行後、すぐにコンテナは消されてしまう。

GPU版を使う

GPUを使う設定は、以下のサイトを参考にさせていただいた。

aptラインとPGPの追加

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
   && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | apt-key add - \
   && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | tee /etc/apt/sources.list.d/nvidia-docker.list

nvidia-docker2のインストール

apt-get update
apt-get install -y nvidia-docker2

ちなみに、わがDebianには、nvidia-smiもインストールされていなかったので。

apt-get install -y nvidia-smi

Dockerをリスタート。

systemctl restart docker

ドライバの確認

$ docker run --gpus all --rm nvidia/cuda nvidia-smi
Unable to find image 'nvidia/cuda:latest' locally
docker: Error response from daemon: manifest for nvidia/cuda:latest not found: manifest unknown: manifest unknown.
See 'docker run --help'.

あれ、エラーが出る。調べてみると、以下のページで調べてバージョン等も記載しないとだめみたい。

2022-09-18時点では、11.7.1-base-ubuntu22.04が最新だったので、以下の変更。

$ docker run --gpus all --rm nvidia/cuda:11.7.1-base-ubuntu22.04 nvidia-smi
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: Auto-detected mode as 'legacy'
nvidia-container-cli: requirement error: unsatisfied condition: cuda>=11.7, please update your driver to a newer version, or use an earlier cuda container: unknown.

今度は、別のエラーが…  nvidiaのドライバをアップデートしなさいとのこと。

確かにわがDebianのバージョンは、Driver Version: 470.141.03で古いらしい。

ドライバーのアップデート

(2022-10-31 追記)

Debiannvidia-drvierのバージョンがアップしたので、以下のドライバを入れ替えなくてもGPU版が動作するようになった。

Debianパッケージャの方に感謝。m(__)m

念の為に、筆者のドライバは以下のとおり。

$ nvidia-smi
Mon Oct 31 19:47:03 2022       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.141.03   Driver Version: 470.141.03   CUDA Version: N/A      |
|-------------------------------+----------------------+----------------------+

(追記終了)

筆者は、実際に試していないので、リンク先とやり方のみを示す。

参考にさせていただいたのは、以下のサイト。

aptラインに以下を追加。

deb http://deb.debian.org/debian/ experimental main non-free contrib

/etc/apt/apt.conf.d/00mydefaultrelease に以下を記載。

APT::Default-Release "stable";

以下でドライバをインストール。

apt-get update
apt-get -t experimental nvidia-driver

筆者は、まだ、試していないので、試してうまく行ったら追記する。

GPUを使ったサンプル

$ docker run --gpus all -it --rm tensorflow/tensorflow:latest-gpu \
   python -c "import tensorflow as tf; print(tf.reduce_sum(tf.random.normal([1000, 1000])))"

GPUを使った場合のbashの起動

$ docker run --gpus all -it tensorflow/tensorflow:latest-gpu bash

GPUを使った場合のスクリプトの実行

$ cd doc-tf/py-s
$ docker run --gpus all -it --rm -v $PWD:/tmp -w /tmp tensorflow/tensorflow:latest-gpu python ./sample.py

以上、皆さん、快適にtensorflowをお使いください。

関連ページ