Python の機械学習環境を Docker イメージで作成

書籍「データサイエンティスト養成読本 機械学習入門編 (Software Design plus)」を参考に、numpy・scipy・matplotlib・scikit-learn パッケージをインストールした Python 3.5.0 の環境を Docker イメージとして作成してみました。

サンプルソースhttp://github.com/fits/try_samples/tree/master/blog/20151029/

python イメージをベースに作成

まずは、Docker の最新 python イメージ (この時は Python 3.5.0) をベースに Docker イメージを作成します。

なお、書籍では libblas-dev をインストールしていましたが、ここでは代わりに libatlas-base-dev をインストールしています。

Dockerfile
FROM python

RUN apt-get update && apt-get upgrade -y

RUN apt-get install -y libfreetype6-dev libatlas-base-dev liblapack-dev gfortran

RUN pip install numpy
RUN pip install scipy
RUN pip install matplotlib
RUN pip install scikit-learn

RUN apt-get clean

docker build で上記の Dockerfile からイメージを作成します。

Docker イメージの作成

$ docker build --no-cache -t sample/python-ml:0.1 .

動作確認

scikit-learn を使った単純な Python スクリプトSVM で "あやめ" の品種を予測) を実行してみます。

/vagrant/svm_sample.py
from sklearn import datasets
from sklearn import svm

iris = datasets.load_iris()

svc = svm.SVC()
svc.fit(iris.data, iris.target)

print(svc.predict([[5, 3, 4, 1], [6, 3, 5, 2]]))

先程作成した Docker イメージを docker run で実行します。 DeprecationWarning が出力されますが、動作しているようです。

実行結果
$ docker run --rm -it -v /vagrant:/work sample/python-ml:0.1 python /work/svm_sample.py
・・・
[1 2]

DeprecationWarning の内容は inspect.getargspec() is deprecated, use inspect.signature() instead です。

centos イメージをベースに作成

次に、CentOS をベースに Python 3.5.0 をソースからビルドした Docker イメージを作成してみました。

atlas を使う場合、そのままでは libcblas.so が作られず scikit-learn のビルドに失敗するようなので、libtatlas.soシンボリックリンクとして libcblas.so を作成するようにしています。

pip はデフォルトで pip3.5 としてインストールされるため、今回は pip3.5 をそのまま使って numpy 等をインストールしています。

なお、python コマンドでは Python 2.7.5 が起動するので、Python 3.5 は python3 コマンドで起動します。

Dockerfile
FROM centos

RUN yum update -y && yum install -y make automake libtool openssl-devel curl

RUN curl -O https://www.python.org/ftp/python/3.5.0/Python-3.5.0.tgz
RUN tar zxf Python-3.5.0.tgz
RUN cd Python-3.5.0 && ./configure && make && make install
RUN rm -fr Python-3.5.0 && rm -f Python-3.5.0.tgz

RUN yum install -y lapack-devel atlas-devel gcc-c++ freetype-devel libpng-devel

RUN cd /usr/lib64/atlas && ln -s libtatlas.so libcblas.so

RUN pip3.5 install numpy
RUN pip3.5 install scipy
RUN pip3.5 install matplotlib
RUN pip3.5 install scikit-learn

RUN yum clean all

Docker イメージの作成

$ docker build --no-cache -t sample/python-ml-centos:0.1 .

動作確認

docker run で実行すると、先程と同じ結果になりました。

実行結果
$ docker run --rm -it -v /vagrant:/work sample/python-ml-centos:0.1 python3 /work/svm_sample.py
・・・
[1 2]