Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

Docker Advent Calendar 2016 の5日目の記事です。

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

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

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

はじめに:自然言語処理や機械学習のエンジニアに伝えたい、 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の管理も大変で、、、。この辺りってみなさんどうしてるんでしょうか?  何か知見を教えていただけると嬉しいです。

jxpress
技術力で「ニュースの産業革命」を起こす。言語処理・データ解析分野の専門家が集まる、News Techベンチャー。
https://jxpress.net/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away