DockerによるPyTorch実行環境構築:使い方編

環境構築

どうも、しもつきです。
今回は、Dockerによる実行環境構築のいろを説明する記事三部作の第二弾です。
第一弾同様、初学者さんがDockerでPyTorch実行環境を構築できるようになることを目指して、わかりやすいように要点をまとめていきます。
なお、本記事は第一弾の記事で説明したこと(docker-ce、NVIDIA container toolkit、docker-composeのインストール)は終わっている前提で説明をしていますので、終わってない方は以下の記事を参照してやってみることをオススメします。

それでは、以下よりどうぞ。

今回の記事で説明すること

今回の記事では、主に以下二つのファイルに関する説明と、それらを使ってDockerのイメージやコンテナを構築・使用していく方法をします。

  • docker-compose.yml
    • docker-composeのための設定ファイル
    • もしdocker-composeを使用しない場合は不要
  • Dockerfile
    • Dockerイメージを構築するための設定ファイル
    • もしDocker Hubなどから既存のイメージをそのまま使うなら不要

先に使い方のまとめ

docker-compose.ymlとDockerfileの説明は少し込み入ってしまいますので、先にDockerのイメージやコンテナを構築・使用方法をまとめておきます。
なお、後に解説で使用しますが、多くのケースで使えるようなdocker-compose.ymlとDockerfileのテンプレートを以下の私のgithubにアップロードしていますので、事前に任意の場所で下記コマンドを実行してダウンロードしておいてください。

git clone https://github.com/shimotsuki-cv/docker_pytorch_base_env.git env
cd env

以下、上記コマンドが実行された前提で話を進めます。
使い方の流れをとしては、

  1. Dockerイメージを構築する
  2. Dockerコンテナを起動する
  3. Dockerコンテナにログインする

です。順にコマンドを紹介をしていきます。

Dockerイメージを構築する

コマンドは以下です。説明することは特にないです。

docker-compose build

Dockerコンテナを起動する

コマンドは以下です。やっていることを簡単に説明すると、Dockerコンテナのバックグラウンド起動です。バックグラウンド起動にすることで、操作や管理などが楽になります。

docker-compose up -d

Dockerコンテナにログインする

コマンドは以下です。コマンド中の「sample」に該当するところは、docker-compose.ymlのservicesで設定している名前に応じて変更する必要があります。
※私のgithubのファイルでは「sample」という名前で設定しているだけです。

docker-compose exec sample bash

これでおそらく、PyTorchの環境構築がされたコンテナにログインされたのではないかと思います。
試しに、例えば以下の記事に掲載されているサンプルプログラムをmain.pyとしてコピペして作成し、「python main.py」で実行して実際に動かしてみましょう。おそらく動作するはずです。

dockerの基本的な使い方は以上です。
あとは、好きなようにコーディングをすれば各々自由にしてもらってOKです。

docker-compose.ymlの書き方

ここでは、私のgithubからダウンロードされたdocker-compose.yml(以下に貼り付け)を題材に、書き方を簡単に解説していきます。

services:
  sample:
    build:
      context: .
      dockerfile: ./Dockerfile_pip # あるいは「./Dockerfile_conda」
    image: sample/torch
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix:ro
      # コンテナ側と共有したいホスト側のディレクトリがあれば、以下の通りに
      # - [path-to-host-directory]:[path-to-container-directory]
    command: >
      bash -c " source /home/user/entrypoint.sh && /bin/bash "
    environment:
      - USER_ID=1000    # 自分のユーザID
      - GROUP_ID=1000   # 自分のグループID
      - DISPLAY=$DISPLAY
    shm_size: '8gb'
    stdin_open: true
    tty: true
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              capabilities: [ gpu ]

services

docker-composeにおいては、動かすアプリケーション一つ一つをサービスと呼ぶのですが、それらを設定するための項目です。
上記のdocker-compose.ymlにおいては「sample」という名前のサービスを設定していますが、基本的に好きな名前をつけてもらってOKです。

なお、servicesという名前の通り複数のサービスを設定することができます。例えば、ウェブ系の領域ではDB用とwebサービス用とで2つ立てたりしているのをよく目にします。
自分でAIなどを実行・開発したりする分には基本的には1つで十分なのですが、やりたいことに応じて、いじる余地が多いかなと思います。

build&image

これらは、Dockerイメージの設定に関する項目です。

buildの方では、イメージ構築で参照するDockerfileの指定することができます。
私テンプレートにおいては、各々がやりたいことに応じてDockerfileは適宜変更する必要があるかと思います。

imageの方では、単にイメージの名前やタグを指定しているだけです。

volumes

ここは、ホスト側とコンテナ側とで、データを共有したいディレクトリがある場合に設定するところです。
学習などのデータセットや自前のプログラムのディレクトリを、設定しておくとかなり楽になります。
なお、私のテンプレートで既に設定されているものは、コンテナにおけるGUI表示関係の設定です。

command

ここは、コンテナを起動する際に実行されるコマンドを設定できます。
私のテンプレートでは、「entrypoint.sh」というシェルスクリプトを実行するようにしていて、そのスクリプトではコンテナ内のユーザIDの再設定や、コンソールの色付けなどの設定をしています。

environment

ここは、コンテナを起動する際に追加する環境変数を設定できます。
私のテンプレートでは、docker-composeを実行するユーザのユーザ・グループIDを設定することで、前述の「entrypoint.sh」の処理によってホスト側とコンテナ側のユーザ・グループIDを同期できます。(同期しておかないとファイル権限まわりで結構面倒なことになりがちです)

その他

その他はほぼ固定でよいかと思います。
唯一、shm_sizeに関しては、学習や推論時にデータの大きさによっては不足する場面があるかもしれませんが、16GBも設定しておけばほとんどのケースでは問題ないと思います。

ベースとなるDockerfileの解説

まず、私のgithubのテンプレートでは、以下の2種類のDockerfileがあります。

  • Dockerfile_pip
  • Dockerfile_conda

これらは、どちらが良いというものではなく、状況に応じて使い分けるのがいいかなと思っています。
ちなみに私がやっている使い分けとしては、以下のような感じになります。

  • Dockerfile_pipをベースとする場合:
    • 自分でゼロから環境を設計したいとき
    • ベースとしたい環境が「requirement.txt」でライブラリ管理されているとき
  • Dockerfile_condaをベースとする場合:
    • ベースとしたい環境がcondaベースでライブラリ管理されているとき
      (論文の著者公開コードでは環境をcondaで作ってる方は結構多かったりする)

なお、自分でゼロから環境を設計したいときにDockerfile_pipベースとする理由は、conda環境をいれる必要がないので、Dockerイメージのサイズを小さくできる(=容量削減できる)ためです。
SSDないしはHDDの容量を気にしないなら、好きな方を使えばいいかなと思います。

そして肝心の中身についてですが、以下の3つの要所にしぼって簡単に説明していきます。

  • 継承イメージ(1行目)
  • 前提ライブラリ&Python用ライブラリインストールの部分
  • Python環境構築部分の前あるいは後の部分

継承イメージ

テンプレートのDockerfileの1行目のところのことで、スタートとするDockerイメージのことです。
私のテンプレート準拠で編集を行う場合は、以下のDocker Hubの中から所望のCUDAやUbuntuのバージョンに合うものを適宜選択すればいいかなと思います。

ちなみに、もしPyTorchの実行環境がほしいだけなら、わざわざ自分で作らずとも最初から構築されているものを入手してそれを使うだけでもOKです。例えば以下のような。

ただ、この環境はCUDAのコンパイル環境などはなく、後々になって「追加のCUDAを使った外部ライブラリをビルドしたい」ってなったときに対応が難しく、カスタマイズ性に欠けます。
「ならそこにCUDA環境をいれてもいいのでは?」という声が聞こえてきそうですが、CUDA環境を後入れするのは個人的にはあまりオススメしません。
理由はハマるポイントが多く、なんやかんや時間がかかってしまうことが多いからです。
というわけで、私のテンプレートではCUDA環境が整っているイメージをベースとして作成しています。

前提ライブラリ&Python用ライブラリのインストール

これは「sudo」とか「vim」とかを「apt install」している部分と、Python環境向けに「pip install」あるいは「conda create/install」したりする部分ですね。
ここに関しては、テンプレートでは最小限のものとかよく使いそうなものしかいれていませんので、やりたいことに応じて適宜ライブラリを追加してもらえれば構いません。

Python環境構築部分

これに関しては、各々がやりたいことに応じて変わります。
テンプレートの場合はPyTorchを使いたいだけなので特筆すべきことは特にありませんが、例えば、

  • 著者コードや環境ファイル(requirement.txtやenvironment.yamlなど)を事前にダウンロードしておく、とか
  • 著者コードとか外部ライブラリをビルドする、とか
  • Pythonのバージョンを変える、とか(pipベースなら2行目)
  • conda環境の場合はその名前を変える、とか(condaベースの3行目)

をしたい場合には必要になってきます。
この部分に関しては、実際の流れをイメージしづらい方もいらっしゃるかもしれませんので、実践編として編集の具体例を別の記事にてまとめたいと思っています。

というわけで、この記事は説明をここまでとしたいと思います。
それでは。

コメント

タイトルとURLをコピーしました