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

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の管理も大変で、、、。この辺りってみなさんどうしてるんでしょうか?  何か知見を教えていただけると嬉しいです。


『 機械学習 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。