解釈可能な機械学習モデルを作るライブラリ Interpret を Docker で動かすときのメモ
解釈可能なモデリングを目的としたライブラリ interpret
を使うときに Docker で利用していると動かないという現象があったのでその解決方法です。
環境
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)
原因
interpret は output として静的なコンテンツを生成しておらず、逐次 interpret がバックグラウンドで起動している API からデータを取得しているようです。試しに F12 の検証から開いてみると http://127.0.0.1:7001/140350020331408/
に対してリクエストを送っていることがわかります。
interpert は docker 内部で実行されているため, 内部での localhost:7001 と jupyter の実行環境の localhost が一致していないためリクエストが通らず、エラーになっています。
解決方法
- docker 起動時に interpret のための port を開放しておく (例えば 7001番など、これをAとします)
- 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))
これを実行すると画面が表示されます。やったね。
リモートサーバーの時
適当なリモートサーバーで jupyter を起動している時もあると思います。その場合には set_show_addr
で指定するホストをそのサーバーの名前にしましょう。例えば https://www.example.com
で繋いているのであれば以下のような感じです。
from interpret import set_show_addr set_show_addr((https://www.example.com', 7121))