NLP/機械学習/データ分析系のDockerイメージ8選 + 1

[Docker Advent Calendar 2016](http://qiita.com/advent-calendar/2016/docker) の5日目の記事です。

2016年もあとわずかですが、振り返ると、僕の2016年は Dockerfile と docker-compose.yml を書いた記憶しかないです。大小 20 個くらいは書いたんじゃないでしょうか。今年の漢字は docker　です。

私の所属している[JX通信社](http://jxpress.net)では、言語処理/機械学習系の API や、速報/災害検知 API などを提供しています。それらの各種 API に Docker を活用しているわけですが、形態素解析などはよく再利用するので、社外に Docker イメージとして公開しました。

そのような、社外にスピンアウトした 3 個の自然言語処理系 Docker イメージや、今年お世話になった Docker イメージなどをご紹介します。先に、紹介するイメージの目次を書いておくので「知ってるのしかない！」と言う人はそっと閉じていただくか、ご紹介いただけると。笑

- 機械学習系
    - [miniconda　と anaconda](https://hub.docker.com/r/continuumio/): データサイエンス用 Python 環境
    - [Tensorflow](https://www.tensorflow.org/versions/r0.12/get_started/os_setup.html#docker-installation): 公式の Tensorflow 環境
- 自然言語処理系
    - [miniconda-neologd](https://hub.docker.com/r/yamitzky/miniconda-neologd/)：MeCab用
    - [mecab-bottle](https://hub.docker.com/r/yamitzky/mecab-bottle/)： 形態素解析API
    - [jumanpp](https://hub.docker.com/r/yamitzky/jumanpp/): JUMAN++
    - [tsutomu7/negaposi](https://hub.docker.com/r/tsutomu7/negaposi/): ネガポジ判定
    - [xebxeb/fasttext-docker](https://hub.docker.com/r/xebxeb/fasttext-docker): テキスト分類 / 分散表現獲得
- その他
    - [Google Cloud Datalab](https://cloud.google.com/datalab/docs/)
    - データベース系イメージの紹介 (+1)

## はじめに：自然言語処理や機械学習のエンジニアに伝えたい、 Docker を使うメリット

Docker を使うメリットとして、実感値が大きいのは、**環境設定/セットアップが圧倒的に楽になり、環境依存に悩まされなくなる**。ということです

[JUMAN++](http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN++) という形態素解析システムを例に挙げます。 JUMAN++ は Linux 環境が必要であり、 gcc や Boost が正しくインストールされている必要があり、 `make` コマンドでインストールする必要があります。しかし [Docker 化したもの](https://hub.docker.com/r/yamitzky/jumanpp/)を使えば、Mac でも Windows でも `docker run` だけで動きます。(すみません、書いてから気づきましたが、現在はhomebrewで入れられるとのことです)

また、[NEologd](https://github.com/neologd/mecab-ipadic-neologd) は 2GB のメモリがないとインストールに失敗することがありますが、[事前に Docker 化してビルドしたもの](https://hub.docker.com/r/yamitzky/miniconda-neologd/)を使えば、**512MB のメモリの環境で NEologd を使う**こともできます。

これは裏を返すと、**自分が作ったソフトウェア/API を、簡単に、誰にでも共有できる**、ということでもあります。 Mac 上で作ったソフトウェアを Linux 使ってる人にそのまま共有できるわけですね。他にも、

- ライブラリが複数バージョン共存しやすくなる
- 実験の再現性の担保がしやすい

といったメリットを感じています。**もうバージョン環境の違いに悩まされることがありません・・・！**

それでは、 Docker イメージの紹介に移ります。

# 機械学習系の Docker イメージ

## [miniconda　と anaconda](https://hub.docker.com/r/continuumio/)

データサイエンス向けの Python 環境の [Anaconda](https://www.continuum.io/anaconda-overview) の公式 Docker イメージです。 Python 2と3があります。Miniconda　は、デフォルトで入っているライブラリがほぼない、軽量版 Anaconda です。

例えば、Jupyter Notebook を Docker 経由で起動するには、次のコマンドで起動できます。

```
docker run -i -t -p 8888:8888 continuumio/anaconda3 /bin/bash -c "/opt/conda/bin/conda install jupyter -y --quiet && mkdir /opt/notebooks && /opt/conda/bin/jupyter notebook --notebook-dir=/opt/notebooks --ip='*' --port=8888 --no-browser"
```

とは言え、大抵は自分で Dockerfile を書くときのベースイメージとして使うと思います。　例えば、 numpy が必要なプログラムを作るときは、こんな感じの Dockerfile になるでしょう。

```Dockerfile
FROM continuumio/miniconda3

RUN conda install -y --quiet numpy
WORKDIR /usr/src/app
COPY main.py /usr/src/app
CMD ["python", "main.py"]
```

この上に、sklearn を入れたり、pandas 入れたり、色々とやるわけですね。

## [Tensorflow](https://www.tensorflow.org/versions/r0.12/get_started/os_setup.html#docker-installation)

わざわざ言う必要もないかもしれませんが、Tensorflow も Docker 経由でインストールできます。デフォルトでは、Jupyter Notebook が起動します。

```
docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow
```

他にも、私自身は使っていませんが、[R](https://github.com/rocker-org/rocker)や、[Caffe](https://hub.docker.com/r/cordea/pycaffe/)などもあります(数えればきりがない・・・！)。

# 自然言語処理系の Docker　イメージ

## [miniconda-neologd](https://hub.docker.com/r/yamitzky/miniconda-neologd/)

前述の Miniconda(Anaconda) の上に形態素解析ソフトウェアの MeCab と、 MeCab 用のすごい辞書 [NEologd](https://github.com/neologd/mecab-ipadic-neologd) を搭載した Docker イメージです。Python 2と3に対応しています。僕が作っているので、 Contribute 大歓迎です。

CLI 経由で使うことも

```bash
echo "ももいろクローバーZ" | docker run -i --rm yamitzky/miniconda-neologd mecab -d /usr/lib/mecab/dic/mecab-ipadic-neologd
```

Python 経由で使うこともできます。

```bash 
from natto import MeCab

tagger = MeCab('-d /usr/lib/mecab/dic/mecab-ipadic-neologd')
print(tagger.parse('ももいろクローバーZ'))
```

## [mecab-bottle](https://hub.docker.com/r/yamitzky/mecab-bottle/)

前述の miniconda-neologd を bottle と言う Python のサーバーライブラリに乗せて作った、**形態素解析 API** です。Python 3に対応しています。こちらも僕が作ったものなので、Contribution 大歓迎です。

API なので、どんな言語からもすぐに使えることを想定して作っていて、Google Cloud Natural Language API を単語分割 API として使っている人に無料でおすすめする代替案です。

```
docker run --rm -p 8080:80 yamitzky/mecab-bottle
# open http://localhost:8080/parse?q=きゃりーぱみゅぱみゅ
```

メインサーバーが別にある場合、docker-compose などと組み合わせて使うと便利です。

```yaml
version: '2'
services:
  app:
    build: .
    command: ["curl", "http://mecab/parse?q=きゃりーぱみゅぱみゅ"]
    depends_on:
      - mecab
  mecab:
    image: yamitzky/mecab-bottle
```

## [jumanpp](https://hub.docker.com/r/yamitzky/jumanpp/)

黒橋・河原研究室で開発されている、[JUMAN++](http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN%2B%2B) を Docker 化したものです。

```bash
echo 日本語を入力 | docker run -i --rm yamitzky/jumanpp
```

こちらも自分で作った Docker イメージですが、Python バインディングを使った API　化はあきらめました。。。どなたか！

## [tsutomu7/negaposi](https://hub.docker.com/r/tsutomu7/negaposi/)

こちらの Docker イメージは、ネガポジ判定をするためのものです。

```
docker run --rm tsutomu7/negaposi あいつはマジ最高
```

## [xebxeb/fasttext-docker](https://hub.docker.com/r/xebxeb/fasttext-docker)

facebook research による、Skipgram やテキスト分類を学習するためのツールを Docker 化したものです。

ソフトウェアを直接使うのと同じように使うことができますが、volume を指定

```
docker run --rm -it　-v "$PWD:/data" xebxeb/fasttext-docker /fasttext skipgram -input /data/corpus.txt -output /data/model
```

このように、便利なソフトウェアが Docker ベース経由で使えるのは嬉しいですね。

# その他

## [Google Cloud Datalab](https://cloud.google.com/datalab/docs/)

こちらは Google 謹製の Docker イメージです。Jupyter Notebook を改修して、 BigQuery などにアクセスできるようにしたり、Tensorflow が使えるようになっているものです。[NewsDigest](https://newsdigest.jp/) のログ基盤は BigQuery を使っているので活用させていただいています。

## データベース系の Docker イメージを活用する

こちらは直接 NLP/機械学習に関係のあるものではありませんが、関連してお世話になったので紹介します。

実験データを保存したり、コーパスを保存していくために、**データベース**が欲しくなってきますね。当然、MySQL、MongoDB、redis、Elasticsearch などのサーバーも Docker 上で構築することができ、多くは公式イメージが提供されています。

大抵は docker-compose と一緒に使うことになると思います。例えば、MongoDB を使いたい場合は次のようにします。

```yaml
version: '2'
services:
  app:
    build: .
    depends_on:
      - db
  db:
    image: mongo
    volumes:
      - ./data:/data/db
```

こうすることによって、app コンテナからは、「db」というホスト名で MongoDB にアクセスすることができます。また、volumes を設定することによって、データがロストしないようになっています。

複数の実験を１つのサーバーで動かすとき、データベースが混線しなくて便利です。

# より高度な使い方

いくつか Docker イメージを紹介させていただいたのですが、 Docker 上でも **GPU** を使って Tensorflow を動かしたり([nvidia-docker](https://github.com/NVIDIA/nvidia-docker))、ビッグデータ処理用の**クラスタ**を組んだり([docker-swarm](https://docs.docker.com/swarm/))ということもできるそうです。このあたりは自分が疎い部分であり、今後トライしたい分野です。

# 終わりに

自分が作った Docker イメージを中心に、自然言語処理、機械学習、データ分析に携わる人に有用な Docker イメージを紹介しました。他にも、良いDockerイメージがあったら是非教えてください！

また、 Qiita などでやってみた系の記事を書く方は、ぜひ Docker イメージを公開してみてください。

最後に、一つご相談なんですが、自分で作っている Docker イメージ、更新されていないのがとても残念なところです。特に、 NEologd は、２週間に一回更新されるので、Docker イメージも２週間に一回更新したいのですが、現状できていません。 あとは、tagの管理も大変で、、、。この辺りってみなさんどうしてるんでしょうか？　　何か知見を教えていただけると嬉しいです。