みんなのPython勉強会 #72
2021/08/11🎋 nikkie
初めて聞いた
聞いたことある
触ったことある
使っている
Streamlit初めて聞いた方向け
デモ & ハンズオンでStreamlitを 体験
目標:Streamlitの概要を掴む
Streamlitの特徴3点(3つの原則として紹介)
おまけ:Streamlitの限界
網羅的な説明はしません
代わりに、網羅している学習リソースを紹介します
pip install streamlit
お願いします!環境構築は 自身の慣れた方法で 行ってください( pipenv
など)
Python 3.8.6
Requires: Python >=3.6 なので 3.9 でも動作するかも(未検証)
Streamlit, version 0.86.0
2021/08/06 リリース版🚀
みんなのPython勉強会4代目LT王子🤴・スタッフ
PyCon JP 2021 座長🇨🇭
我が名はにっきー。アニメ大好き🥰この夏はアニメ映画がアツい!!
— nikkie 📣PyCon JP 2021 スタッフ募集中! (@ftnext) July 31, 2021
竜とそばかすの姫🐉、サイダーのように言葉が湧き上がる🥤、映画大好きポンポさん🎦、かくしごと👩🎨、きんモザ and so on!
しかしここ数日都内は感染者数3000人突破。外出しづらい。めっちゃ見たい!けどリスクとるか悩む。ぐおおお🤨
pip install streamlit
参加予定
しないかな
ってなんすか?
Py thon Con ference JP
日本最大のPython祭り
座長が 6月末時点の全てをお話し 済み
8/9にプロポーザルを採択( 採択速報)
Djangoのカンファレンス(7月開催)公式さんの言
まったく問題ありませんよ!トークの内容も幅広いので。もし当日「内容難しいかな」と感じられた場合も「こういうことができるんだ」とキーワードだけお持ち帰りいただければ十分と思います。
— django-ja (@django_ja) May 27, 2021
pip install streamlit
Pythonのライブラリ PyPIリンク
機械学習分野で プロトタイピングツール として注目
https://streamlit.io/ のかっこいい動画を見ましょう🆒
Pythonを書くだけ
インタラクティブに動くWebアプリ
簡単にデプロイできる
副題:Introducing Streamlit, an app framework built for ML engineers
API(Flask)、HTML、JavaScript(コールバックの実装など)
ツール作成が、 Jupyter notebook でのモデル訓練やデータ分析のように感じられるには?
なぜ作ったか記事のslugに coding-ml-tools-like-you-code-ml-models
なぜ作ったか記事で読んだ解説をもとに、今回 nikkieの言葉で言語化
このトークで 一緒に手を動かしながら 3つの原則を体験しましょう
ライブラリ Streamlit はオープンソースで開発が進む
Streamlit社も創業( 2021年4月に $35 million シリーズB調達)
観測範囲で国内から2事例
エムスリー社
ティアフォー社
GKEでStreamlitをホスティングして社内用アプリを作った話 (2020/10)
社内向けのデータ可視化アプリをStreamlitで作成
コンテナ化してGKEにデプロイ
自動運転データの検索システムを爆速で作った話 (2021/04)
画面はStreamlitのおかげで3日くらいで作れました。
先日のstapy外伝でも触れられています( YouTube)
ユーザーが日本語テキストを入力
アプリ(機械学習モデル)が続きを生成 して表示します
「みんなのPython勉強会」では、Pythonを中心としてプログラミングを仕事、研究、趣味など様々なシーンに生かす方法を一緒に学びます。
今回の勉強会のconnpass からコミュニティの概要
2016〜ソフトウェアエンジニア。2019〜データサイエンティストとしてユーザベースにJoin、
nikkieのプロフィールの書き出しです
書いたのはPythonスクリプトだけ
Streamlit sharingにデプロイ
https://github.com/ftnext/stapy72-streamlit-sample/blob/main/app.py
モデル呼び出すコード + StreamlitによるUIでも100行未満
モデルはこちら:「 AIチャットボット「りんな」を手がけるrinnaが日本語特化のGPT-2大規模言語モデルをオープンソース化」
PythonスクリプトをGitHubに公開
Streamlit sharing側で、リポジトリ、ブランチ、スクリプトを指定する だけ
https://streamlit.io/sharing から登録申請。利用は無料
詳しくは https://docs.streamlit.io/en/stable/deploy_streamlit_app.html
st.secrets
による秘密情報サポート( 2021/04 v0.80.0〜)
開発のモチベーション:ツール作成が、Jupyter notebookでのモデル訓練やデータ分析のように感じられるには?
動画やデモアプリで体験十分。3つの原則を体得していきましょう🏃♂️
十分に発達した科学技術は、魔法と見分けがつかない。(アーサー・C・クラーク)
ハンズオン🤲🔛パート!
一緒に手を動かしながら、3つの 原則 (principles)を押さえます
Pythonスクリプト、是れ即ちアプリ
作業ディレクトリを mkdir 後、 cd
そこにファイルを作ります
$ mkdir stapy72-streamlit
$ cd stapy72-streamlit
$ touch first.py
first.py
の中身
import streamlit as st
st.title("My first app")
streamlit run first.py
Webブラウザが起動し、http://localhost:8501/ が表示されます
文字列 "My first app"
がタイトルの書式で表示される
https://docs.streamlit.io/en/stable/api.html#streamlit.title
~/.streamlit/config.toml
(グローバルな設定ファイル)
https://docs.streamlit.io/en/stable/streamlit_configuration.html#view-all-configuration-options
[browser]
# Default: true
gatherUsageStats = false
右上ハンバーガーメニューから Run on save を有効に
スクリプトを保存すると、 ただちに ブラウザ画面が 再描画 されます
プロトタイピング捗ります!( st.write
で値を確認しながら進む=対話モード感)
first.py
に追記
import pandas as pd
import streamlit as st
st.title("My first app")
st.write("Here's our first attempt at using data to create a table:")
st.write(
pd.DataFrame(
{"first column": [1, 2, 3, 4], "second column": [10, 20, 30, 40]}
)
)
pandas
の DataFrame
は 表 として表示される
https://docs.streamlit.io/en/stable/api.html#streamlit.write
あとはスクリプトをどう書くかを身に着けていきましょう
本トークは体験重視!網羅性は重視しません
巨人の肩へ 202102Streamlit勉強会スライド at fin-py
⬆️はまとまっている日本語情報源
nikkieの言葉で雑にまとめると
図の表示がイケてる(matplotlib, bokeh, plotly)
このトークでは取り上げません🙏
インタラクション !(後述・お楽しみに)
streamlit run にローカルのPythonスクリプトのパスを渡した
Web上にあるPythonスクリプトの URL も渡せる
$ streamlit run https://raw.githubusercontent.com/ftnext/stapy72-streamlit-sample/main/first.py
https://github.com/streamlit/streamlit/tree/develop/examples
気になるスクリプトはガンガン試しましょう
あなたが作ったスクリプトの 共有 にも使えます!
curl で取得しましょう
$ curl https://raw.githubusercontent.com/ftnext/stapy72-streamlit-sample/main/app.py -O
$ streamlit run app.py
実は streamlit run は、URLで指定したスクリプトをローカルに 一時ファイルとして保存 しています
Streamlitの強みの1つ、インタラクションを取り上げます
first.py
を書き換える
from datetime import datetime
import streamlit as st
st.write(datetime.now())
x = st.slider("Select a value")
st.write(x, "squared is", x * x)
スライダーのUIが表示される(0から100までの整数)
st.slider
はスライダーウィジェットを表示
https://docs.streamlit.io/en/stable/api.html#streamlit.slider
x
は現在のスライダーの値
スライダーの下に2乗した値が計算される
スライダーを変えると、2乗した値が 再計算 される
スクリプト 全体を再実行 して実現
スライダーの上に出している現在日時の表示も変わっています
値変わらば、最新の値を変数に代入してスクリプトを再実行
これによりインタラクティブなアプリを実現
詳しくは https://docs.streamlit.io/en/stable/api.html#display-interactive-widgets
1行のテキスト入力 st.text_input
数値の入力 st.number_input
パラメタの選択 st.slider
ラジオボタン st.radio
チェックボックス st.checkbox
https://github.com/ftnext/stapy72-streamlit-sample/blob/main/widgets.py
詳しくは https://docs.streamlit.io/en/stable/api.html#display-media
画像 st.image
音声プレーヤー st.audio
動画プレーヤー st.video
st.audio
の例#stapy 本日19時からですー。
— nikkie 📣PyCon JP 2021 スタッフ募集中! (@ftnext) January 13, 2021
実はBGMはStreamlit製アプリから流しています。
audioも扱えるんですよ、先月から引き続きですけれど、やばくないですか!?
今後はシャッフル再生つけてみたいですね pic.twitter.com/uceZ94qWC8
st.audio
の例stapy開始前のBGM再生
音源を並べて選んで流しています(自作iTunes)
機械学習モデルをインタラクティブに触れるStreamlit製アプリ(例:デモアプリ)
モデルの推論には 時間がかかる ことも
インタラクションがあるたびにスクリプトを再実行🤔
first.py
でシミュレートモデルに推論させる関数(=時間のかかる処理)を単純化
time.sleep
で 必ず2秒かかる 関数とする
first.py
import time
import streamlit as st
def expensive_computation(a, b):
time.sleep(2)
return a * b
a = 2
b = 21
res = expensive_computation(a, b)
st.write("Result:", res)
2秒経過してからResultを表示
ブラウザをリロードすると 毎回2秒待つ
@st.cache
で関数をデコレート端的に言うと、 インメモリのKVS (key-value store)
イメージ「同じ引数で関数を実行した結果がキャッシュにあれば、 関数を呼び出さずに キャッシュから返す」
⚠️キャッシュのキーは引数だけではないので「イメージ」です
first.py
を変更
import time
import streamlit as st
@st.cache
def expensive_computation(a, b):
time.sleep(2)
return a * b
a = 2
b = 21
res = expensive_computation(a, b)
st.write("Result:", res)
初回表示は、2秒経過してからResultを表示
ブラウザをリロードすると 2秒待たずに Resultを表示(キャッシュが効いている)
モデル・Tokenizerの読み込み(初回1回だけ)
テキスト生成
@st.cache
によるキャッシュは ユーザー間で共通
私が試したのと同じテキストなら、キャッシュを使って結果を返す
スクリプトを再実行する方針ゆえ、キャッシュ利用を指定すべし
公式ドキュメント Improve app performance
公式ドキュメントを読んで書いた拙ブログ 魔法みたいな機能満載のStreamlit。その中でもとびっきりの魔法、キャッシュについて
max_entries
や ttl
の設定例 https://towardsdatascience.com/advanced-streamlit-caching-6f528a0f9993
Pythonスクリプト、是れ即ちアプリ
値変わらば、最新の値を変数に代入してスクリプトを再実行
スクリプトを再実行する方針ゆえ、キャッシュ利用を指定すべし
プロトタイピングツールと紹介したStreamlit
「これはもう、Webアプリなのでは」
少し考察してみましょう
データベース
ユーザー認証
各種データベースとつなげられる(MySQL、PostgreSQL、・・)
なんとGoogleスプレッドシートもDBにできる
.streamlit/secrets.toml
に キー=値
形式で書く
├── .streamlit # プロジェクト単位の設定情報ディレクトリ
│ └── secrets.toml
└── app.py
スクリプトでは st.secrets["キー"]
で秘密情報にアクセス
データベース: 使える (可視化アプリのプロトタイピング楽しそう)
ユーザー認証
データベース: 使える (可視化アプリのプロトタイピング楽しそう)
ユーザー認証 👈
ユーザーのログイン機能
簡易版:Webに公開しているが、 パスワードを知っているユーザーにだけ 見せたい(ベーシック認証的)
パスワード入力欄を表示
パスワードが合致すると、スライダーの例が動かせる
リロードするとパスワード入力まで戻る(Session Stateはタブを閉じたらクリアされる)
データベースを使ってユーザー登録まで実装した例 https://zenn.dev/lapisuru/articles/3ae6dd82e36c29a27190
Custom login widget https://github.com/MarcSkovMadsen/awesome-streamlit/tree/master/gallery/custom_widgets_hack
データベースと合わせれば、ユーザー管理はできそう(未検証)
IMO:nikkieは オススメしません (できる≠使える)
c-bataさんがこの後話すDjangoなど、Webアプリケーションフレームワークの出番かなと思います
shimizukawaさんが話す『エキスパートPythonプログラミング 改訂3版』
Pythonスクリプトが上手く書けるようになれば、Streamlitにも活きるでしょう
(今回のテーマ 全方位Python、私の中ではつながった🙌)
https://streamlit.io/for-teams Coming soon
Quickly and securely share your Streamlit apps with anyone in your organization.
データベースと接続できる!
ページにパスワードも掛けられる
IMO:ユーザー管理が必要なら for Teams or Webアプリフレームワーク
豊富!(コミュニティが盛り上がっている)
nikkieは必要な情報をつまむ学び方なので、オススメ学習順は no idea です ¯_(ツ)_/¯
リンク集 的に使ってください
ドキュメント:https://docs.streamlit.io/en/stable/index.html
日本語翻訳提案したらすごーく勉強になりそうですね
YouTube(動画チュートリアル):https://www.youtube.com/channel/UC3LD42rjj-Owtxsa6PwGU5Q/playlists
Streamlit製Roadmap:https://share.streamlit.io/streamlit/roadmap
Gallery(アプリの例):https://streamlit.io/gallery
Components(第三者が開発した拡張):https://streamlit.io/components
Forum:https://discuss.streamlit.io/
質問かなり盛んな印象
Wikiなど https://discuss.streamlit.io/t/streamlit-deployment-guide-wiki/5099
Streamlitで 大きなアプリ を作る際の参考にもなると思います
上記の勉強会の内容について fin-py コミュニティに日本語で質問に行くのも、あると思います
Streamlitは機械学習分野で注目される プロトタイピングツール
ハンズオンを通して3つの原則を共有
Webアプリかの考察から、あくまでプロトタイピング
Pythonスクリプト、是れ即ちアプリ
値変わらば、 最新の値 を変数に代入してスクリプトを 再実行
スクリプトを再実行する方針ゆえ、 キャッシュ利用を指定 すべし
Pythonスクリプトを書くだけ でインタラクティブなアプリになる
スクリプトをGitHubで公開して、Streamlit sharingで指定するだけの 簡単デプロイ
streamlit run URL コピペすら不要という、こんなに簡単なスクリプトの共有方法がかつてあっただろうか
キャッシュ! スクリプトを何度も再実行しているので、積極利用しましょう
社内の勉強会でフィードバックくださった皆さま
前哨戦のおかげで資料引き締まりました!
Enjoy magical Streamlit Season!
Scrapboxで発表準備