Kaggle・機械学習実験用Docker環境構築入門


はじめに

初めましての方は初めまして,最近Volareという学生団体に所属することになったtattakaです.
普段は関西の大学院の修士課程でロボットビジョンの研究をしていて,趣味ではKaggleの主に画像コンペに参加しています.
この記事では機械学習の研究やKaggleで使いまわせる環境の構築について書いていこうと思います.
(この記事はVolare Advent Calendar 2019の24日目です.)

この記事で書くこと

  • Kaggleや機械学習系の研究室でDockerを使う利点
  • ディレクトリ構成について
  • DockerHubを使ったイメージの管理

書かないこと

  • NVIDIA Docker・Docker Composeの話
    • (このあたりは筆者が怠慢諸事情により最新バージョンを追えていないので......)

1. Kaggleや機械学習系の研究室でDockerを使う利点

具体的な環境構築の前に,Dockerを使ってKaggleや機械学習の環境を構築することの利点について述べていきます.

  • 環境構築するときの虚無の緩和
    ホスト環境に影響を与えないのでインストール方法などの試行錯誤がしやすいです.
    また,既存環境との衝突をあまり考えなくてもよくなります.

  • 環境汚染からの脱却
    同じイメージからは同じコンテナが生成されるので環境を汚してもコンテナを作り直せば良いので直で環境構築をするよりは環境が汚れにくいです.

  • 環境の共有が楽
    Dockerfileを共有すれば基本的に(GPUドライバ周りを合わせていれば)同じイメージを生成できます.また、後に説明するDockerHubを使えばイメージをビルドする時間の省略のほか,docker pullコマンドだけで違うマシンでも同じ環境を構築できるようになります.

2. ディレクトリ構成について

私はKaggleや研究では深層学習を主に用いるので以下のようなディレクトリ構成で運用しています.

ml_environment
├── projects
│   ├── project_dir1
│   ├── project_dir2
│   └── project_dir...
├── docker
│   ├── base
│   │   └── Dockerfile
│   ├── framework1
│   │   └── Dockerfile
│   ├── framework2
│   │   └── Dockerfile
│   ├── framework...
│   │   └── Dockerfile
│   ├── scripts
│   │   └──initialize-docker-container.sh
│   └── docker-compose.yml
└── RUN-DOCKER-CONTAINER.sh

それぞれのファイル・ディレクトリの説明をしていきます.

  • projects
    Kaggleや研究で用いるソースファイルを入れる場所です.ここに集めておくことによってJupyter Notebookなどをprojectsディレクトリで開いた時にプロジェクト間の行き来がしやすくなります.

  • docker
    Dockerfiledocker-compose.ymlなどを入れる場所です.
    フレームワークごとにDockerfileを分けたディレクトリを作っていて,イメージを再利用できるようにしています.

    • base
      ここにはフレームワークによらず共通で使うライブラリを固めるためのイメージを作成するDockerfileを置いています.
      筆者の場合こんな感じで使っています.
    • framework...
      ここにはフレームワーク別のDockerfileを置いています. 例えばPyTorchだとこのようなファイルになります.
    • scripts
      ここにはDocker起動時や内部で動作させるスクリプトを配置しています. 例えばinitialize-docker-container.shdbusの起動・exitをしてもバックグラウンドで動き続けさせるためのスクリプトです.
    • docker-compose.yml

      「はじめに」でも述べた通り,詳しくは書きませんが必須な設定とやっておくと便利な設定をいくつか述べます.

      • volumes: - ../:/root/ml_environment/
        ホスト上のプロジェクトディレクトリをDocker上にマウントします.
      • command: /root/ml_environment/docker/scripts/initialize-docker-container.sh
        上で設定したinitialize-docker-container.shを適用する設定です.
      • network_mode: host
        ネットワークデバイスをホストと共有する設定です.一般的にはポートマッピングを使った方が良いのですが,リモートでこのDocker環境を使うときSSHのポートフォワードだけでいろいろできるので便利です.
  • RUN-DOCKER-CONTAINER.sh
    上のdocker-compose.ymlを使ってコンテナを立ち上げるスクリプトです.こんな感じで書くといいと思います.

3. GitHubとDockerHubを使ったイメージの管理

なぜDockerHubを使った方が良いか

まず,DockerHubを使ってイメージを管理するメリットについて簡単に説明します.

  • イメージをビルドする時間の省略
    ローカルでイメージをビルドするのはマシンスペックによっては時間がかかってしまいます.また,ビルド時に大容量を要求するライブラリもありダウンロードするだけの方が時間短縮になる場合が多いです.
  • 違うマシンで同じイメージを使って環境構築できる
    お気づきの方がいるかもしれませんが,上で紹介したDockerfileの中のライブラリはバージョン指定をしていないものがあります.これは調べるのが面倒くさいからパッケージによってはaptのkeyが無効化されていてダウンロードできなくなっていたりunstableなバージョンだと消えていたりすることが考えられるからです.DockerHubを使うことでビルドする回数を最小限にして動作を担保したイメージを別のマシンに配布することが可能になります.

DockerHubとGitHubリポジトリの連携方法

0. 準備

GitHubのリポジトリを準備しましょう.
ここからは筆者のこのリポジトリ(tattaka/ml_environment)を使って説明していきます.
またDockerHubにリポジトリを作るためにはユーザ登録が必要なので登録しておきましょう.

1. リポジトリ作成

次にこのページ(https://hub.docker.com/repositories)に飛んでCreate Repository+ボタンを押しましょう.
ここでリポジトリの各種設定ができるので必須項目を順に埋めていきましょう.

  1. Name: リポジトリ名を入力しましょう.筆者はml_environmentはもう使っているのでml_environment2という名前を使います.
  2. Visibility: リポジトリを公開するかどうかの設定です.無料アカウントだと非公開リポジトリは1つしか作れないみたいです......
  3. Build Settings: 外部のWebサービスと連携するかどうかの設定です.GitHubとBitbucketが選べますが今はおいておいて後で設定しましょう.

こんな画面になったでしょうか?

2. GitHub連携の設定

次にGitHub連携の設定をしていきます.
上の画面のBuildsタブをクリックして,この画面に遷移します.

ここでLink to GitHubを選択します.初めてリポジトリを作る場合は下のようなユーザ設定画面でGitHub連携の初期設定をする必要があります.2回目以降はGitHubの連携の初期設定は不要です.

ここでGitHubの行のConnectボタンをクリックします.
GitHubに遷移するのでAuthorize dockerを選択します.

GitHubのパスワードが求められるので入力してConfirm passwordをクリックします.
これでDockerHubアカウントとGitHubアカウントの連携ができました.

3. Automation Buildの設定

後もう一息です!
次にリポジトリのBuildsタグに戻り,もう一度Link to GitHubをクリックします.
ビルドの設定画面になるのでSelect Organizationに自分のユーザ名を入れ、Select Repositoryで使いたいリポジトリを選択します.

最後に上の画面下部のBUILD RULESを追加していきます.
今回は上で説明したbaseディレクトリのDockerイメージがgit push origin masterをすると自動でビルドされるように設定していきます.今は行いませんがBranchではなくTagと紐付けして自動ビルドを行うこともできます.
今回git push origin masterした時にビルドが走ってほしいのでSourceはそのままで大丈夫です.
Docker Tagはこの場合baseと名付けましょう.
Dockerfile locationはリポジトリの1番上から見てDockerfileがどこにあるかを設定します.
今回はdocker/base/Dockerfileとします.入力したら保存しましょう.
保存が完了するとBuildsタブに戻り設定が完了していることが確認できます.

git push origin masterすることでもビルドが始まりますが,手動でビルドしたい場合,下部に先ほど設定した自動ビルドの項目があるのでTrigger ▶︎をクリックするとビルドが始まります.
これで設定は完了です.お疲れ様でした!

今設定してビルドしたDockerイメージはdocker pull tattaka/ml_environment2:baseでダウンロードすることができます.ぜひ試して見てください.

最後に

本記事では筆者の思う使いやすい環境構築のTipsについて説明してきました.
Dockerの本来の使い方や思想とはあっていない(であろう)使い方のため,「もっとここをこうした方が良いよ」「ここおかしいんじゃない?」という意見があると思います.そのような場合はコメント欄に意見を送ってもらえるととてもありがたいです.
最後に、ここまで読んでいただき本当にありがとうございました.