Chemoinfo のアプリをStreamlitを使ってDeployする #streamlit #RDKit #souyakuAC2020

みなさんこんにちは。お元気でしょうか。私はなんとか風邪にもならず過ごしております。寒くて朝起きれなくなってきたIwatobipenです。

今年はネタもない+なぜかいろいろ忙しくて参加しないつもりでしたが、少しでもコミュニティーに貢献しようと思いまして、小ネタを提供することにしました。創薬感はゼロですがご容赦ください。

皆さんStremlitはご存知でしょうか。Qiitaなどにも記事がありますが、PythonだけでイケてるUIもコミコミのデータ解析Appを作れてしまうパッケージです。

機械学習と組み合わせるのであればモデルを作っておいて予測アプリをこれで提供するなどが簡単にできます。ちょっと前にこのStreamlitとRDKITを組み合わせたアプリに関する記事をポストしました。
https://iwatobipen.wordpress.com/2020/12/11/make-interactive-web-app-with-streamlit-and-rdkit-rdkit-streamlit/

その後いろいろドキュメントを見ているとStreamlit はWeb上にデプロイできるようです。share する場合はしたのページからGithubと連携させる必要があります。
https://www.streamlit.io/sharing

手順はこちらに書いてあります。
https://docs.streamlit.io/en/stable/deploy_streamlit_app.html

サンプルのコードはこちらに置いてあります。コードの話は前の記事に書いてあるのですが変更点が二点あります。Shareするようにした場合、Streamlitから提供されるVMに環境がデプロイされます。requirements.txtに通常のパッケージ以外にPipで入れる必要があるパッケージを記載します。

そのあとしばらく悩んだんですけどRequrementsにCondaのPackage書いても入りません。私の大好きなRDKitはここに書いても入らないんです。その後解決策がわかりました!
下のようにconda.txtにパッケージ名を書きます。チャンネルを指定したい場合はconda_channels.txtに指定しておきます。

rdkit だけですと、VM上でインストールできなかったためconda.txtはGCCも入れています。

#conda.txt
libgcc=5.2.0
rdkit

ここまでお膳立てしておくとWeb上でStreamlitAppが配布できるようになりユーザー側に環境整備の必要がなくなります。

実際の成果物がこちら 

https://share.streamlit.io/iwatobipen/chem_streamlit/main/chemstreamlit/app.py

アクセスすると、プルダウンで化合物インデックスを選ぶようになっていて選ぶと該当する分子の溶解度予測の結果と構造が描画されるようになっています。

App.pyはGithubを見ていただければだいたいわかると思いますがこんな感じ。ファイルのPathなどがVMの中で見えるようにするために変えてあります。

分子のイメージは中間ファイルを出さないようにByteioオブジェクトを使って渡す仕様にしました。今回は例示していませんが同じテクニックを使ってMatplotlibの図とかも埋め込めたりします。StreamlitはwriteでMatplotlibのFigを受け取れるのでこみいったことはしないでもいけるはずですが。他の場合に使えるかもですw。

import pickle
import datamaker
import streamlit as st
st.title('Streamlit + RDKit :rocket:')
from rdkit import Chem
from rdkit.Chem import Draw
from rdkit.Chem.Draw import SimilarityMaps
from io import BytesIO
from functools import partial
from PIL import Image
from rdkit.Chem.Draw import rdDepictor
rdDepictor.SetPreferCoordGen(True)
#rfc = pickle.load(open('rf.pkl', 'rb'))
#for streamlit app
rfc = pickle.load(open('/app/chem_streamlit/chemstreamlit/rf.pkl', 'rb'))
fpfunc = partial(SimilarityMaps.GetMorganFingerprint, radius=2)

#mols = [m for m in Chem.SDMolSupplier('./solubility.test.sdf')]
mols = [m for m in Chem.SDMolSupplier('/app/chem_streamlit/chemstreamlit/solubility.test.sdf')]

option = st.selectbox(
    'Please select index of test molecules',
    [i for i in range(len(mols))]
)

st.write('you selected:', option, Chem.MolToSmiles(mols[option]))
fp = [datamaker.mol2fp(mols[option])]
kls = rfc.predict(fp)


img = Draw.MolToImage(mols[option])
bio = BytesIO()
img.save(bio, format='png')
st.image(img)

st.write('predicted class:', datamaker.rclasses[kls[0]])

Google colabなどRDKIT入れるのちょっと面倒だったりするので、アプリを作ってShareする場合、Streamlit使うとユーザー側は環境を構築しないでテストできるので良いですね。と思いました。

公式ドキュメントにはCondaパッケージ使えるとは書いてあるけどどうやって指定するかは書いていなくて困っていたんですが、Stremlitのコミュニティーに聞いたら一瞬で解決しました。感謝感謝です。

オープンソースのパッケージ+アクティブなコミュニティーはデータサイエンスにとって貴重ですね。

ライトな話題ではありましたが何かしらの参考になれば幸いです。

おしまい。

Published by iwatobipen

I'm medicinal chemist in mid size of pharmaceutical company. I love chemoinfo, cording, organic synthesis, my family.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: