Pythonの機械学習環境をコンテナで構築

# Pythonの機械学習環境をコンテナで構築

ノートPCにPythonの機械学習環境をコンテナで構築します。

今回は、主にテキスト系機械学習用の環境として、fastTextとPython3が使えるコンテナを構築します。

## イメージ

- 実行(学習と検証)は機械学習用コンテナにシェルでログインし、fastTextとPython3の実行を行う。
- ソースコードと学習用ファイルはPC上のフォルダをマウントする。
- エディタはVisual Studio Codeを使う。

![](https://www.plantuml.com/plantuml/img/NL3DQW8n4BxFKmmvzRBsBaM4RO-BqgLUnCEOZ19qCo4xePJYkpU6jLkQq-JxdMGzAYNDmnM0h4f2qx41Hqf76XdDEqSv-q9y6O18zaBdWcvRWz-0vLWPeWGEYljTZwquFY2DkEllutz5BpbPdbLLSmE4K0Oqhs8ld1x9-rQ2aW-S3lNkWt8wKV5taeF23G4wnYR7PZNruHBVdDSAN_caXVWDATmcKY9bgDB6oMTedgQm2hqiSboiS7voyRGo35wVFwAxE__iL8idzzG-Tywhm9g3Az_x0m00)
[Edit](https://www.planttext.com/?text=NL3DQW8n4BxFKmmvzRBsBaM4RO-BqgLUnCEOZ19qCo4xePJYkpU6jLkQq-JxdMGzAYNDmnM0h4f2qx41Hqf76XdDEqSv-q9y6O18zaBdWcvRWz-0vLWPeWGEYljTZwquFY2DkEllutz5BpbPdbLLSmE4K0Oqhs8ld1x9-rQ2aW-S3lNkWt8wKV5taeF23G4wnYR7PZNruHBVdDSAN_caXVWDATmcKY9bgDB6oMTedgQm2hqiSboiS7voyRGo35wVFwAxE__iL8idzzG-Tywhm9g3Az_x0m00)

## 作業

[https://qiita.com/penpenta/items/3b7a0f1e27bbab56a95f](https://qiita.com/penpenta/items/3b7a0f1e27bbab56a95f)

### 環境

- Windows 10 Pro
	- Memory : 8GB
- Docker Desktop for Windows

### ベースになるコンテナイメージを起動

まずベースになるコンテナイメージを起動します。
ここでの実行コマンドはビルドしたコンテナイメージを実行するコマンドと同じにしておくほうが良いでしょう。
今回はfastTextをコンテナ内でビルドするため、CentOSのイメージを使います。

1 . 以下のコマンドでベースになるコマンドを実行します。

```
docker run -it -v /c/temp/data:/data --rm centos:centos8 /bin/bash
```

### 少しずつ必要なものをインストールし検証

最初からDockerfileによるビルドをしても良いですが、インストールエラーになる場合もあります。
この作業は少しずつ環境を検証しながら進めるために行います。

#### Pythonインストール～fastTextビルド

1. 以下のコマンドを実行します。※pip3 install実行後の"Running setup.py install for fasttext ..."で少し待ちます。

```
dnf -y install python36
yum install -y git make gcc gcc-c++
yum install -y python36-devel
cd /usr/local/src
git clone https://github.com/facebookresearch/fastText.git
cd fastText
pip3 install .
```
2. pythonのパッケージとしてimportできるか確認します。以下のコマンドを実行してエラーがでなければOKです。

```
python3
import fasttext
exit()
```

![](https://lh3.googleusercontent.com/hYHsT6aqGAY4884u8514jrpvAhC9zm8Q4rjxJznkakdWaeN5zdt8ZxRh6DKcYujiH7HFXAFlLzPvMkbiEBG0nuXZ0wBNFTB0l6DQbsQxda5POctYnq_Pnq9n1Nc20LA3u98w9daBxtfWi4hF8taZ93XWoaXEVGgiT6jZzt-_zKW6FTJWouk7osaN1Z5lcn57OFN4V3gJqTXzpxfzq4jQNAZgitOG1ELqH8EEFlVb2jNfn0M1kLEGoUel8J61-md_LItUsc_L4dHHHi6Urxr2LrPwtVv0Th6qXF3cLMUstoK47f0emRUn8BtN3fE3Tj-xodXiSIJoVzZrMOhDnCkLbaDZP3Y8hU1BYEqptRz1V5LWqOVLTbUIz3amc1MlgBPifhKL5xnjyRUWzX1_LqM7qL25GKS66b781w7_ja8HoX_KqGpykyy8wmyNeQxVx0CeSWiMkIwJMZ-U91RvZhgw8fyaeovdS9NGK0XcWrjRIAJjGplWZnpkfpw3e1uXrTruFg07L5t7M33Y2-mjZk_Up3kgG85bhf_OatNQ_0EmabZaFKM8RUwajefjJe4g8Q4Sj1nAbJd3lzmE3-Bs7nmE0FcSX7MV0_7rc9_8YV2h5XNthJrLbaOaFYBcqMeMbeTPyguctRvi5pqKd9mJbmLoiHUhbC0T0gioyiU3y2aHEmGD4Tux5YK2KSjhLzfF9A=w585-h101-no)

4. docker exportでここまで作業したコンテナを保存しておきます。次回以降、docker importでここから作業を継続できます。

```
docker export {イメージID} > {ファイル名}.tar
```

#### 機械学習系パッケージをインストール

定番のパッケージをインストールしておきます。

1. 以下のコマンドを実行します。

```
pip3 install numpy pandas matplotlib scikit-learn
```

#### 日本語処理系パッケージをインストール

日本語処理に必要なパッケージをインストールしておきます。
辞書は必須ではないので飛ばしてもOKです。

1. 以下のコマンドを実行します。

```
rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm
yum -y makecache
yum -y install mecab mecab-ipadic
yum -y install --nogpgcheck mecab-devel
pip3 install mecab-python3 neologdn emoji
```
2. 辞書をインストール （diffutils patch which file opensslはインストールスクリプトに必要なためインストールします。）

```
yum install -y diffutils patch which file openssl

cd /usr/local/src
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
./bin/install-mecab-ipadic-neologd -n -y
```

### 環境のエクスポート

今回は個人での利用かつ、常に新しいパッケージバージョンを使用したいのでここまでの作業Dockerfileにし環境をエクスポートします。
※ちなみにここまでの状態でdocker exportしたファイルは、1.7GBでした。

- Dockerfile作成時のポイント
	- cdの代わりにWORKDIRを使う(Dockerfileではcdは使えない)
	- コマンドはbashで実行させるようにする。
	- 辞書はコメントアウトしている。(ビルドに時間がかかるので)

**Dockerfile**

```
FROM centos:centos8

SHELL ["/bin/bash", "-c"]
#Python Install

RUN dnf -y install python36

#fastText Build

RUN yum install -y git make gcc gcc-c++
RUN yum install -y python36-devel
WORKDIR /usr/local/src
RUN git clone https://github.com/facebookresearch/fastText.git
WORKDIR /usr/local/src/fastText
RUN pip3 install .

#Install Python Package
RUN pip3 install numpy pandas matplotlib scikit-learn
RUN rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm
RUN yum -y makecache
RUN yum -y install --nogpgcheck mecab mecab-ipadic mecab-devel
RUN pip3 install mecab-python3 neologdn emoji

#Install Mecab Dictionary

# RUN yum install -y diffutils patch which file openssl
# 
# WORKDIR /usr/local/src
# RUN git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
# WORKDIR /usr/local/src/mecab-ipadic-neologd
# RUN ./bin/install-mecab-ipadic-neologd -n -y
```

#### ビルドと起動確認


1. Dockerfileを使いビルドします。

```
docker build -t fasttext/centos8:v1.0 .
```
2. 以下コマンドで起動できることを確認します。

```
docker run -it -v /c/temp/data:/data --rm fasttext/centos8:v1.0 /bin/bash
```


## まとめ

以下のステップでノートPCにPythonの機械学習環境をコンテナで構築できました。

1. ベースになるコンテナイメージを起動
2. 少しずつ必要なものをインストールし検証
3. コンテナイメージをエクスポート

リモートワークでは社内VPNに常時接続できず、開発サーバでの開発作業が困難な状況でしたが本環境により解決できました。

ノートPCでは学習に時間がかかるため、"学習にリソースが専有される"、"シャットダウンできない" といった問題がありますが、開発用サーバにも事前に同じコンテナを仕込んでおけば、「ノートPCで少ないエポックで動作確認→開発用サーバでエポックを増やして学習」という手順を踏むことで解決できます。
ソースコードのコミットをフックして自動的に開発用サーバでの学習を走らせることも可能です。そのあたりは別途記事をまとめようと思います。