Docker Advent Calendar 2016 の5日目の記事です。
2016年もあとわずかですが、振り返ると、僕の2016年は Dockerfile と docker-compose.yml を書いた記憶しかないです。大小 20 個くらいは書いたんじゃないでしょうか。今年の漢字は docker です。
私の所属しているJX通信社では、言語処理/機械学習系の API や、速報/災害検知 API などを提供しています。それらの各種 API に Docker を活用しているわけですが、形態素解析などはよく再利用するので、社外に Docker イメージとして公開しました。
そのような、社外にスピンアウトした 3 個の自然言語処理系 Docker イメージや、今年お世話になった Docker イメージなどをご紹介します。先に、紹介するイメージの目次を書いておくので「知ってるのしかない!」と言う人はそっと閉じていただくか、ご紹介いただけると。笑
- 機械学習系
- miniconda と anaconda: データサイエンス用 Python 環境
- Tensorflow: 公式の Tensorflow 環境
- 自然言語処理系
- miniconda-neologd:MeCab用
- mecab-bottle: 形態素解析API
- jumanpp: JUMAN++
- tsutomu7/negaposi: ネガポジ判定
- xebxeb/fasttext-docker: テキスト分類 / 分散表現獲得
- その他
- Google Cloud Datalab
- データベース系イメージの紹介 (+1)
はじめに:自然言語処理や機械学習のエンジニアに伝えたい、 Docker を使うメリット
Docker を使うメリットとして、実感値が大きいのは、環境設定/セットアップが圧倒的に楽になり、環境依存に悩まされなくなる。ということです
JUMAN++ という形態素解析システムを例に挙げます。 JUMAN++ は Linux 環境が必要であり、 gcc や Boost が正しくインストールされている必要があり、 make
コマンドでインストールする必要があります。しかし Docker 化したものを使えば、Mac でも Windows でも docker run
だけで動きます。(すみません、書いてから気づきましたが、現在はhomebrewで入れられるとのことです)
また、NEologd は 2GB のメモリがないとインストールに失敗することがありますが、事前に Docker 化してビルドしたものを使えば、512MB のメモリの環境で NEologd を使うこともできます。
これは裏を返すと、自分が作ったソフトウェア/API を、簡単に、誰にでも共有できる、ということでもあります。 Mac 上で作ったソフトウェアを Linux 使ってる人にそのまま共有できるわけですね。他にも、
- ライブラリが複数バージョン共存しやすくなる
- 実験の再現性の担保がしやすい
といったメリットを感じています。もうバージョン環境の違いに悩まされることがありません・・・!
それでは、 Docker イメージの紹介に移ります。
機械学習系の Docker イメージ
miniconda と anaconda
データサイエンス向けの Python 環境の Anaconda の公式 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 になるでしょう。
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
わざわざ言う必要もないかもしれませんが、Tensorflow も Docker 経由でインストールできます。デフォルトでは、Jupyter Notebook が起動します。
docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow
他にも、私自身は使っていませんが、Rや、Caffeなどもあります(数えればきりがない・・・!)。
自然言語処理系の Docker イメージ
miniconda-neologd
前述の Miniconda(Anaconda) の上に形態素解析ソフトウェアの MeCab と、 MeCab 用のすごい辞書 NEologd を搭載した Docker イメージです。Python 2と3に対応しています。僕が作っているので、 Contribute 大歓迎です。
CLI 経由で使うことも
echo "ももいろクローバーZ" | docker run -i --rm yamitzky/miniconda-neologd mecab -d /usr/lib/mecab/dic/mecab-ipadic-neologd
Python 経由で使うこともできます。
from natto import MeCab
tagger = MeCab('-d /usr/lib/mecab/dic/mecab-ipadic-neologd')
print(tagger.parse('ももいろクローバーZ'))
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 などと組み合わせて使うと便利です。
version: '2'
services:
app:
build: .
command: ["curl", "http://mecab/parse?q=きゃりーぱみゅぱみゅ"]
depends_on:
- mecab
mecab:
image: yamitzky/mecab-bottle
jumanpp
黒橋・河原研究室で開発されている、JUMAN++ を Docker 化したものです。
echo 日本語を入力 | docker run -i --rm yamitzky/jumanpp
こちらも自分で作った Docker イメージですが、Python バインディングを使った API 化はあきらめました。。。どなたか!
tsutomu7/negaposi
こちらの Docker イメージは、ネガポジ判定をするためのものです。
docker run --rm tsutomu7/negaposi あいつはマジ最高
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
こちらは Google 謹製の Docker イメージです。Jupyter Notebook を改修して、 BigQuery などにアクセスできるようにしたり、Tensorflow が使えるようになっているものです。NewsDigest のログ基盤は BigQuery を使っているので活用させていただいています。
データベース系の Docker イメージを活用する
こちらは直接 NLP/機械学習に関係のあるものではありませんが、関連してお世話になったので紹介します。
実験データを保存したり、コーパスを保存していくために、データベースが欲しくなってきますね。当然、MySQL、MongoDB、redis、Elasticsearch などのサーバーも Docker 上で構築することができ、多くは公式イメージが提供されています。
大抵は docker-compose と一緒に使うことになると思います。例えば、MongoDB を使いたい場合は次のようにします。
version: '2'
services:
app:
build: .
depends_on:
- db
db:
image: mongo
volumes:
- ./data:/data/db
こうすることによって、app コンテナからは、「db」というホスト名で MongoDB にアクセスすることができます。また、volumes を設定することによって、データがロストしないようになっています。
複数の実験を1つのサーバーで動かすとき、データベースが混線しなくて便利です。
より高度な使い方
いくつか Docker イメージを紹介させていただいたのですが、 Docker 上でも GPU を使って Tensorflow を動かしたり(nvidia-docker)、ビッグデータ処理用のクラスタを組んだり(docker-swarm)ということもできるそうです。このあたりは自分が疎い部分であり、今後トライしたい分野です。
終わりに
自分が作った Docker イメージを中心に、自然言語処理、機械学習、データ分析に携わる人に有用な Docker イメージを紹介しました。他にも、良いDockerイメージがあったら是非教えてください!
また、 Qiita などでやってみた系の記事を書く方は、ぜひ Docker イメージを公開してみてください。
最後に、一つご相談なんですが、自分で作っている Docker イメージ、更新されていないのがとても残念なところです。特に、 NEologd は、2週間に一回更新されるので、Docker イメージも2週間に一回更新したいのですが、現状できていません。 あとは、tagの管理も大変で、、、。この辺りってみなさんどうしてるんでしょうか? 何か知見を教えていただけると嬉しいです。