nykergoto’s blog

機械学習とpythonをメインに

解釈可能な機械学習モデルを作るライブラリ Interpret を Docker で動かすときのメモ

解釈可能なモデリングを目的としたライブラリ interpret を使うときに Docker で利用していると動かないという現象があったのでその解決方法です。

github.com

環境

python=3.7.7 / conda==4.8.3 で動作する docker を利用しています。interpret自体のversionは interpret==0.2.1 です。

FROM registry.gitlab.com/nyker510/analysis-template/cpu:1.0.4

RUN pip install -U pip && \
  pip install \
    interpret==0.2.1

現象

docker で起動している jupyter から interpret show を実行しても何も出てこない (本来は分析結果の画面が表示される)

from interpret import show
from interpret.data import Marginal
import pandas as pd

df = pd.DataFrame(np.random.uniform(size=(10, 100)))
marginal = Marginal().explain_data(df, df[0], name='train data')

show(marginal)

f:id:dette:20200928135625p:plain
show を call しても何も出てこない

原因

interpret は output として静的なコンテンツを生成しておらず、逐次 interpret がバックグラウンドで起動している API からデータを取得しているようです。試しに F12 の検証から開いてみると http://127.0.0.1:7001/140350020331408/ に対してリクエストを送っていることがわかります。

f:id:dette:20200928135652p:plain
リクエストが失敗している様子

interpert は docker 内部で実行されているため, 内部での localhost:7001 と jupyter の実行環境の localhost が一致していないためリクエストが通らず、エラーになっています。

解決方法

  1. docker 起動時に interpret のための port を開放しておく (例えば 7001番など、これをAとします)
  2. interpret のサーバーを 0.0.0.0:A に変更する (たとえば 0.0.0.0:7001)

変更は from interpret import set_show_addr から行えます。例えば 7121 port でつなぐなら以下のような感じ

from interpret import set_show_addr

set_show_addr(('0.0.0.0', 7121))

これを実行すると画面が表示されます。やったね。

f:id:dette:20200928135600p:plain
リクエストが200OKになって画面も表示される。

リモートサーバーの時

適当なリモートサーバーで jupyter を起動している時もあると思います。その場合には set_show_addr で指定するホストをそのサーバーの名前にしましょう。例えば https://www.example.com で繋いているのであれば以下のような感じです。

from interpret import set_show_addr

set_show_addr((https://www.example.com', 7121))