nikkie-ftnextの日記

イベントレポートや読書メモを発信

Streamlitは4通りで設定できる! browser.gatherUsageStatsを例に

はじめに

はぁ、かわいい... nikkieです。

久々にStreamlitを触って1気づいた小ネタです。
configuration(設定)、いろいろなやり方をサポートしているんですね!

目次

Streamlitのドキュメント「Configuration」

Streamlit provides four different ways to set configuration options.

意訳:Streamlitは、設定オプションをセットするために、4つの異なる方法を提供します

以下の4つが紹介されます。

  1. global config file(グローバルなconfigファイル
  2. per-project config file(プロジェクトごとのconfigファイル
  3. 環境変数
  4. streamlit runの引数

1. global config file

tomlファイルを配置します。

  • macOSLinuxでは ~/.streamlit/config.toml
  • Windowsでは %userprofile%/.streamlit/config.toml

2. per-project config file

global config fileと共通の形式のtomlファイルを$CWD/.streamlit/config.tomlに配置します

例えばstreamlit run app.pyと動かしているなら(app.pyがある現在のディレクトリが$CWDですから)

.
├── app.py
└── .streamlit/
    └── config.toml

という配置になるわけですね。

3. 環境変数

STREAMLIT_*という命名規則環境変数でも設定できます!

設定の仕方についてはstreamlit run --helpでenv varとしてどう設定するか教えてもらえます。

4. streamlit runの引数

streamlit run app.pyに続けても指定できます。

4つの設定の優先順位

This list is in reverse order of precedence, i.e. command line flags take precedence over environment variables when the same configuration option is provided multiple times.

このリストは優先順位の逆順になっています。
すなわち、同一の設定オプションが複数回指定されたとき、コマンドライン引数は環境変数より優先されます。

ここで示した1〜4のうち、数が大きいほど優先されるということですね。
同じ設定値を指定したとき、数が大きい設定方法が優先される✍️

なお、この4通りで設定できるオプションの一覧がView all configuration optionsセクションにあります。

例:browser.gatherUsageStatsを設定する

Configurationのドキュメントの「Telemetry」に記載があります。
Streamlitが使用統計を集めるのをオプトアウトできる設定値です。

最初にstreamlit run app.pyしたときにもコマンドラインに表示されますよね2

  You can find our privacy policy at https://streamlit.io/privacy-policy

  Summary:
  - This open source library collects usage statistics.
  - We cannot see and do not store information contained inside Streamlit apps,
    such as text, charts, images, etc.
  - Telemetry data is stored in servers in the United States.
  - If you'd like to opt out, add the following to ~/.streamlit/config.toml,
    creating that file if necessary:

    [browser]
    gatherUsageStats = false

streamlit run --helpの中にもあります。

  --browser.gatherUsageStats BOOLEAN
                                  Whether to send usage statistics to
                                  Streamlit.  [env var:
                                  STREAMLIT_BROWSER_GATHER_USAGE_STATS]

検証:browser.gatherUsageStatsをfalseに設定する

tomlファイルを使った設定は知っていましたが、環境変数streamlit runの引数による設定は初めて知ったので手を動かして検証しました。
Dockerコンテナでアプリを動かし、起動時のログからfalseに設定できているかを判断しています。

(2023/05/11 追記)
「起動時のログからfalseに設定できているかを判断」、これは筋が悪くP.S.にあるような混乱を招きました。
config.get_option("browser.gatherUsageStats")を確認するバージョンで近く更新します (追記終わり)

(2023/05/16 追記)
config.get_optionを使ってリベンジした確認はこちらです。
本記事の検証部分は非推奨です。ぜひリベンジにお進みください
(追記終わり)

検証用アプリ

Streamlitアプリとしては何もしません。

import streamlit as st

st.title("Awesome app!")

Dockerfileはこちら

docker build -t practice_streamlit .

「Streamlit, version 1.22.0」がインストールされたイメージができました。

このコンテナを起動すると、
docker run --rm -it -p 8501:8501 practice_streamlit
使用統計の収集をオプトアウトしていないので、以下のメッセージが表示されます。

Collecting usage statistics. To deactivate, set browser.gatherUsageStats to False.

(なお、http://127.0.0.1:8501/ にアクセスすると、アプリが動いていることが確認できます)

環境変数STREAMLIT_BROWSER_GATHER_USAGE_STATSによる設定

docker run --rm -it -e STREAMLIT_BROWSER_GATHER_USAGE_STATS=false -p 8501:8501 practice_streamlit

-eオプションで環境変数を指定しました。
このとき、「Collecting usage statistics.」は表示されません。
表示されていないのでdeactivateされたと理解しています。

streamlit runの引数--browser.gatherUsageStatsによる設定

DockerfileでCMD命令を使っているので、外から上書きが可能です。

CMDと同様の命令を外から渡してみます。
docker run --rm -it -p 8501:8501 practice_streamlit streamlit run app.py

Collecting usage statistics. To deactivate, set browser.gatherUsageStats to False.

使用統計の収集をオプトアウトしていない状態ですね。

--browser.gatherUsageStatsを渡してみましょう。
docker run --rm -it -p 8501:8501 practice_streamlit streamlit run app.py --browser.gatherUsageStats false

「Collecting usage statistics.」は表示されなくなりました!

終わりに

Streamlit、tomlファイルや環境変数streamlit runの引数と、4通りで設定できます!

  • tomlファイル
    • グローバルに置く、または、プロジェクトごとに置く
  • 環境変数
    • STREAMLIT_で始まる
    • 単語ごとに_で区切られる規則に従う(例:STREAMLIT_BROWSER_GATHER_USAGE_STATS
    • streamlit run --helpでenv varも確認できる
  • streamlit runの引数
    • --<tomlの[]>.<[]の下の設定値>という形式(例:--browser.gatherUsageStats
    • streamlit run --helpで確認できる
  • 優先順位は streamlit runの引数 > 環境変数 > プロジェクトごとのtomlファイル > グローバルのtomlファイル

環境変数で設定できるのはいいですね〜。
Dockerコンテナとして動かすとき、DockerfileにENVを1行書いておくだけで設定できるのが個人的に好みです。
「Dockerコンテナの中にtomlファイルを置くの、やってもいいけどあんまり気が進まないな〜」と感じましたが、環境変数で行数少なく解決できました🙌

P.S. 設定優先順位の動作確認、あれ?

宿題事項です。なにか間違えているように思います

環境変数よりstreamlit runの引数が優先なので

  • (A) 環境変数でgatherUsageStats=false、streamlit runの引数でtrue 👉 streamlit runの引数優先でtrueになるはず
  • (B) 環境変数でgatherUsageStats=true、streamlit runの引数でfalse 👉 streamlit runの引数優先でfalseになるはず

(A)の検証

docker run --rm -it -e STREAMLIT_BROWSER_GATHER_USAGE_STATS=false -p 8501:8501 practice_streamlit streamlit run app.py --browser.gatherUsageStats true

「Collecting usage statistics.」は表示されません、あれ?(表示されると期待していた)

(B)の検証

docker run --rm -it -e STREAMLIT_BROWSER_GATHER_USAGE_STATS=true -p 8501:8501 practice_streamlit streamlit run app.py --browser.gatherUsageStats false

「Collecting usage statistics.」は表示されません

また、STREAMLIT_BROWSER_GATHER_USAGE_STATSの指定をtrueにしたとき「Collecting usage statistics.」が表示されません(オプトアウトしていない設定なので表示されると期待していた)。
docker run --rm -it -e STREAMLIT_BROWSER_GATHER_USAGE_STATS=true -p 8501:8501 practice_streamlit3
ソースコード見てみよう(宿題。この設定だけトクベツなのかな?)


  1. 2020年 2021年 アーカイブ https://www.youtube.com/live/rrRB2FeEqEU?feature=share
  2. https://github.com/streamlit/streamlit/blob/1.22.0/lib/streamlit/runtime/credentials.py#L77-L93
  3. docker run --rm -it -p 8501:8501 practice_streamlit streamlit run app.py --browser.gatherUsageStats true でも「Collecting usage statistics.」が表示されないですね