Python
DeepLearning
docker
画像解析
PyTorch

Docker環境でPyTorch 〜画像解析〜 #01 環境構築編

はじめに

株式会社クリエイスCTOの志村です。
何回かに渡り、PyTorch(ディープラーニング)で画像解析をする実践で使えそうなコードを掲載していきたいと思います。
せっかくなのでDockerで環境構築をしていきます。
最終的にはキャプチャー認証を突破できるレベルまで持ってけたらと思っています。(できなかったらごめんなさい)
大前提として自分、AI絡みの裏の仕組みは全くと言っていいほど理解していませんから。
今となっては微分積分すら怪しいです。はい。
そんな感じですが、その辺の意味不明な計算式を勝手にやってくれるフレームワークがせっかくあるのですからあやかれば良いんです。

経緯

上田「PyTorchが正式リリースされたから他のフレームワークと何が違うのか触ってみよう」
志村「来たAI!!クリエイスもとうとうこの分野に手を出しちゃいますか!」
曽宮モトキ「AI?それっておいしいんですか?」(誇張してます)
志村「・・・。全く知らなくても案外出来ちゃうってのを見せたれ!」
ということで勉強兼ねて、知見が多少ある志村・上田は画像解析を、知見ゼロの曽宮・モトキは株価分析をそれぞれ記事を書くことになりました。

この記事でやること

PyTorchの環境をDockerで構築し、CIFAR10のデータセットを利用しサンプルコードを動かすところまで

登場人物

画像解析班(この記事の筆者)

  • 志村上田
    はたしてキャプチャー認証を突破することができるのか?!

株価分析班

  • 曽宮モトキ
    はたして知見ゼロでどこまでできるのか?!

前提条件

  1. 実験場を作成する目的
  2. 今回は最終にImageをビルドする訳ではない
  3. というわけで、かな〜り緩めにvolumesで実験ソースをマウントして行きます
  4. ホストでIDEをつかってガンガン修正しつつ、コンテナ上でガンガンテストできる環境を目指します

この記事でやらないこと
1. Dockerfileを使って公式Imageを元にカスタムImageを作りません
2. AWSのECS, EKSには対応いたしません
3. コピペしやすい様にコードブロックの頭のユーザーマーク($, %, #)は記述いたしません

環境構築手順

ざっくりとこんな感じで進めて行きます
1. Docker環境を作成する。(local環境を汚さないように...)
2. Examples系を利用できるようにディレクトリを整備する。
3. docker-compose.ymlを作成する。
4. テストコードを作成する
5. 公式Imageからコンテナを起動してアクセスする
6. 公式Imageに足りないライブラリを入れる
7. テストする
8. dockerの後片付け

Localに次の様なディレクトリ構造で構築して行きます

# ディレクトリ構成
~
└── git  
    ├── deep-learning
    │   └── pytorch (★current workspace)
    │       ├── src
    │       │   └── ...
    │       └── docker-compose.yml  
    └── education  
        └── pytorch-examples  
            └── ...

全部educationだろっ!って声が聞こえなくもないですが、そんな方は後述する  
2. Examples系を利用できるようにディレクトリを整備
4. テストコードを作成するのパスを変更して使ってください。

1. Docker環境を作成します

vagrantとvirtual boxは使わずに、brewでdockerを入れます
あとはLaunchpadからDockerを起動して数秒待つだけ

brew update
brew cask install docker

2. Examples系を利用できるようにディレクトリを整備

## ディレクトリを作成
mkdir -p ~/git/deep-learning/pytorch/src
mkdir -p ~/git/deep-learning/pytorch/tmp
mkdir -p ~/git/education && cd $_

## examplesをクローン
git clone https://github.com/pytorch/examples pytorch-examples
cd ~/git/deep-learning/pytorch

## docker-composeからファイルを作成
touch docker-compose.yml

3. docker-compose.ymlを作成する

2の最後で作成したdocker-compose.ymlを記述して行きます。

docker-compose.yml
version: '3.3'
services:
  pytorch:
    container_name: pytorch
    image: pytorch/pytorch
    tty: true
    # runtime: nvidia
    stdin_open: true
    ipc: host
    volumes:
      - ~/git/education/pytorch-examples:/workspace/examples
      - ./tmp:/workspace/tmp
      - ./src:/workspace/src
    working_dir: /workspace/examples
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "10"

4. テストコードを作成する

公式のcifar10_tutorial.pyをコピーします

# viで開いてペーストする
vi ~/git/deep-learning/pytorch/src/cifar10_tutorial.py

または、Macの人は以下でもOKです

pbpaste > ~/git/deep-learning/pytorch/src/cifar10_tutorial.py

甘んじてbeginner_sourceを使わせていただきます。
これもvolumeで入れろよ!って声が聞こえなくもないですが  
ゆくゆくはこれをバラして行く予定なので我慢です

5. 公式Imageからコンテナを起動してアクセスする

アクセス方法は3通り

## 1. compose run (おすすめ)
docker-compose run --name pytorch --entrypoint=/bin/bash pytorch

## 2. compose up & exec
docker-compose up -d pytorch
docker exec -it pytorch bash

## 3. run
docker run --name pytorch -it --ipc=host -v ~/Git/education/pytorch-examples:/workspace/examples

6. 公式Imageに足りないライブラリを入れる

pip install -r /workspace/examples/mnist/requirements.txt
pip install cython
pip install --upgrade pip
pip install matplotlib
apt-get update
apt-get install -y xvfb

これを入れずに進めると、pythonに「ねーよ」と怒られたやつを入れている感じです。
本来はこれらを含めたDockerfileを作成してカスタムImageを作成すべきでしょう。
ま~今回は割愛です、ごめんなさい。

7. テストする

cd /workspace/src
python cifar10_tutorial.py

すると結果が出ました

Accuracy of plane : 71 %
Accuracy of   car : 67 %
Accuracy of  bird : 29 %
Accuracy of   cat : 55 %
Accuracy of  deer : 37 %
Accuracy of   dog : 15 %
Accuracy of  frog : 67 %
Accuracy of horse : 71 %
Accuracy of  ship : 71 %
Accuracy of truck : 47 %

飛行機だったようですね、って何がやねん.....まーサンプルコードは動いたので今回はOKです。

8. dockerの後片付け

dockerはimageが結構かさむので、こまめに掃除しましょう。

docker rm -f $(docker ps -qa)
docker volume prune
docker rmi `docker images -aq`

次回

サンプルコードを改変して、モデルの訓練と保存をしていきます。