StreamlitでWebアプリを公開するときに、同社の提供するクラウド型公開サービス”Streamlit Community Cloud”は非常に便利。スムーズにアプリを公開させることが可能です。
しかし、Streamlit Community Cloudでアプリをデプロイする際、しばしばProcessing dependencies…の段階でずっと止まるなどして、画面上には”Your app is in the oven”の文字が表示されるのみでアプリがデプロイされない、という事態に遭遇することがあります。
本記事では、Streamlit Community Cloudでアプリをデプロイさせるときにハマりがちなポイントや、Streamlitのホスティング先・デプロイ先の代替サービスなどについて解説していきます。
目次:
- そもそもStreamlit Community Cloudはしばしば起動・再起動エラーになる。まずは公式フォーラムを確認
- デプロイ時、パッケージの依存関係でつまづく場合
- Streamlit Cloudとローカル環境のPythonバージョンを合わせる
- コンソールのエラーメッセージを参照しつつ、requirements.txtを修正
- 余計なパッケージをrequirements.txtに記載しない
- requirements.txt記載のライブラリ・パッケージのバージョン指定を緩くする
- uvからパッケージをダウンロードできるかローカルから確認する
- pythonコミュニティ以外からのインストールにはpackages.txtを利用する
- 再起動を試みる
- secrets.tomlファイルと設定画面で同じ変数を2回宣言していないか確認する
- パッケージ依存関係のエラーが解消できない場合、Dockerコンテナ化して他プラットフォーム上で公開するのも手
- VPSでStreamlitをホスティングする方法
そもそもStreamlit Community Cloudはしばしば起動・再起動エラーになる。まずは公式フォーラムを確認
何度も設定を確認したり、依存関係を調整したりとチャレンジしたのですが、どうやっても起動せず。
Processing dependencies…
の状態で画面表示が永遠に「Your app is in the oven」のままとなることがあります。
自分がこのような症状に遭遇したとき、Community Cloudのコミュニティフォーラムを覗いてみたところ…直近の時間帯で「起動しない」「依存関係の段階から進まない」「スリープから起動しない」などの投稿が数多くみられました。(赤線)
おそらくアプリのデプロイに関して何らかの不具合・障害が発生していたのでしょう。
この後、「障害に対応していました、今では解決済みです」とのサービス側からのリプライがありました。5〜6時間程度、不安定な状態だったようです。(2024/11/04)
このような事態に遭遇したのは2, 3度目なので、可用性高く安定稼働させていきたいのならそもそもStreamlit Community Cloudはやめておいたほうが良さそうです…。
その場合、後述するDockerによる構築やVPS, 各種クラウドサービス上でのデプロイを検討するのが良いでしょう。
上記フォーラムでの不具合報告はアプリの「起動・再起動」に関わるもので、起動済・稼働中のアプリケーションに関しては問題なく動作していたのかもしれません。ただ、GitHub上の変更を検知して再起動というプロセスが行われる以上(CI・CDの仕組みがビルトインされている)、いずれにせよ可用性に関わる問題のように思います。
フォーラムで上記のような最新投稿がなされていない場合には、設定ミスや依存関係の可能性もあります。以下を確認しましょう。
デプロイ時、パッケージの依存関係でつまづく場合
requirements.txtに記載したパッケージについて、Streamlit Cloudでデプロイさせたときに依存関係で問題が生じることがあります。
Streamlit Cloudとローカル環境のPythonバージョンを合わせる
開発時ローカル環境とStreramlit CloudとのPythonバージョンが合っているか確認します。
Streamlit CloudはデフォルトではPython3.8が選択されていますが、アプリをデプロイさせるときにAdvanced Settingsからバージョンの選択が可能です。
一度デプロイしてしまったアプリについてはPythonのバージョンを変更させることはできないため、その場合には一度アプリ自体をDeleteしてから再度デプロイを行うなどしましょう。
コンソールのエラーメッセージを参照しつつ、requirements.txtを修正
Steamlit Cloudでデプロイに失敗する場合、アプリ画面にて右下の”Manage App”をクリックすると、コンソールに出力された内容が確認できます。
このコンソールに、「どのパッケージのインストール時にエラーが発生したか」「解決するにはどうすれば良いか」が吐き出されるので、確認して対応するようにしましょう。
たとえば私の場合、以下2つのエラーに遭遇しました。
ERROR: Cannot install langchain==0.0.262 and langchain==0.0.281 because these package versions have conflicting dependencies.
The conflict is caused by:
The user requested langchain==0.0.262
The user requested langchain==0.0.281
To fix this you could try to:
1. loosen the range of package versions you've specified
2. remove package versions to allow pip attempt to solve the dependency conflict
上記はlangchainについてのエラーです。指示にあるとおり、requirements.txtにて指定バージョンの範囲を緩くするか、バージョン指定自体を削除します。
Collecting sklearn==0.0.post7
Downloading sklearn-0.0.post7.tar.gz (3.6 kB)
Preparing metadata (setup.py): started
Preparing metadata (setup.py): finished with status 'error'
error: subprocess-exited-with-error
× python setup.py egg_info did not run successfully.
│ exit code: 1
╰─> [18 lines of output]
The 'sklearn' PyPI package is deprecated, use 'scikit-learn'
rather than 'sklearn' for pip commands.
Here is how to fix this error in the main use cases:
- use 'pip install scikit-learn' rather than 'pip install sklearn'
- replace 'sklearn' by 'scikit-learn' in your pip requirements files
(requirements.txt, setup.py, setup.cfg, Pipfile, etc ...)
- if the 'sklearn' package is used by one of your dependencies,
it would be great if you take some time to track which package uses
'sklearn' instead of 'scikit-learn' and report it to their issue tracker
- as a last resort, set the environment variable
上記はscikit learnライブラリについてのエラー。どうやら現在ではインストール時の名称が変更となり、sklearnではなくschikit-learnとの名称でインストールするように、とあります。
指示にしたがって、ローカル環境でインストールし直した後、ふたたびrequirements.txtを更新します。
$ pip3 uninstall sklearn
$ pip3 install schikit-learn
$ rm requirements.txt
$ pip3 freeze > requirements.txt
$ git add requirements.txt
$ git commit -m "Update requirements.txt"
$ git push origin main
GitHub上で更新したら、Streamlit CloudにおけるアプリをRebootさせて変更を反映させます。
余計なパッケージをrequirements.txtに記載しない
不要なパッケージまでrequirements.txtに記載しないようにしましょう。
フォーラムによると、Streamlitのパッケージ名自体、requiements.txtで記載は不要とのコメントがありました。
If you are getting any install errors prior to attempting to run your app, you may try minimizing your requirements file. Streamlit (and all its dependencies) are installed by default and don’t need to be in the Streamlit Cloud requirements file.
I am unable to deploy my project on streamlit cloud - Community Cloud - Streamlit
ただし、動作環境を安定させるという意味でStreamlitもrequirements.txtに含めたうえ、バージョン指定をするのが良いと思います。
mathやrandomなど、Pythonにビルトインされた標準ライブラリについてはrequirements.txtに記載する必要はありません。
また、ryeにおけるパッケージ管理ではrequirements.lockの先頭行に-e file:.の記載がされますが、Streamlitに認識させるrequirements.txtでは-e file:.の記載は消しておいたほうが良いでしょう。
requirements.txt記載のライブラリ・パッケージのバージョン指定を緩くする
streamlit==1.24.1 pandas>2.0 numpy<=1.25.1
App dependencies for your Community Cloud app - Streamlit Docs
上記requirements.txtでは、streamlitはバージョン1.24.1を厳密に指定していますが、pandasについてはバージョン2.0を超えるバージョン、numpyについては1.25.1以下、という範囲で指定をしています。
なお、具体的なバージョン指定や指定範囲を書かずにパッケージ名のみの記載とした場合には、アプリの起動・再起動時における最新バージョンのライブラリがダウンロードされます。
バージョン指定なしの場合には、コマンド実行時の最新バージョンのライブラリがインストールされてしまいます。そうなると、実際にどのバージョンがインストールされるか分かりません。
つまりプロジェクトの環境が実行のタイミングごとに不安定になって、以下のようなデメリットが生じる可能性が出てきます。
バージョン指定なしの場合の問題点 ・非互換性の問題 ライブラリのバージョンアップによって、書いたコードとの互換性がなくなる ・安定性の問題 ライブラリの最新バージョンが不安定な場合、予期せぬバグや問題が発生する ・再現性の問題 コマンドの実行時期によっては、同じ環境が再現できない
というわけで、バグや予期せぬ問題を回避するためにはバージョンまで指定するのがおすすめの運用方法になります。
【Python】requirements.txt を使ってライブラリを一括でインストールする方法【管理も簡単】 | CFXLOG
実際、私が運用したStreamlit CloudでAPIキーまわりを触っていないのに、アプリ再起動後にst.secrets(シークレット設定情報)に格納したAPIキーの読み取りができなくなる、というエラーに遭遇しました。
【Resolved】Can't access key on the st.secrets (OpenAI API key) - Community Cloud - Streamlit
上コミュニティのリンク先にも記載しましたが、本件はライブラリのバージョン指定を下記のように緩めることで解決しています。
streamlit>=1.39.0
openai>=1.42.0
tornado>=6.4.2
st.secretsについて参考: Streamlit Community CloudでWebアプリを公開する際の準備事項
uvからパッケージをダウンロードできるかローカルから確認する
Streamlit Community Cloudは、内部的にはuvによるパッケージのインストール・依存管理を行っているようです。
そこで、uvによるパッケージインストールでもrequirements.txtで指定したパッケージが問題なくインストールされるか、ローカル環境でチェックしてみましょう。
# Install uv first if not present
$ pip install uv
# Install requirements using uv
$ uv pip install -r requirements.txt
pythonコミュニティ以外からのインストールにはpackages.txtを利用する
pipなどのPythonコミュニティ以外からインストールする場合、たとえばapt-getコマンドなどでのパッケージインストールが必要な場合には、requirements.txtとは別にpackages.txtを用意する必要があります。
For many apps, a packages.txt file is not required. However, if your script requires any software to be installed that is not a Python package, you need a packages.txt file. Community Cloud is built on Debian Linux. Anything you want to apt-get install must go in your packages.txt file.
App dependencies for your Community Cloud app - Streamlit Docs
再起動を試みる
上記、さまざまな変更を加えた場合には必ず「Reboot」から再起動させるようにしましょう。
手動で再起動をさせないとパッケージ依存の問題は再試行されないことがあります。
secrets.tomlファイルと設定画面で同じ変数を2回宣言していないか確認する
こちらはアプリのデプロイに直接関係するかは微妙ですが、念のため。
Streamlit Community Cloudでは.streamlit/secrets.tomlにシークレット変数を格納させておくことが可能です。
同様に、Streamlit Community Cloudの管理画面上の設定からもシークレット変数を格納させることができます。
これらのシークレット変数は両場所に置いておくことができますが、同じ変数名を2回宣言するとエラーが出るようなので注意しましょう。
また、運用面からもシークレット変数はどちらか一箇所に格納しておくほうが好ましいです。
また、TOML記法に則っているかも注意が必要。
参考: Streamlit Community CloudでWebアプリを公開する際の準備事項
パッケージ依存関係のエラーが解消できない場合、Dockerコンテナ化して他プラットフォーム上で公開するのも手
上記諸々を試しても、うまくパッケージ依存関係のエラーが解消できない場合には、ローカル環境をDockerコンテナ化して他サービスでデプロイするのも一つの手です。
Streamlit CloudはDockerによるデプロイ・ホスティングには対応していませんが、他プラットフォーム上でDockerによってStreamlit製アプリをデプロイすることは可能です。
VPSでStreamlitをホスティングする方法
VPSでStreamlitをホスティングする方法について、動画で解説されている方がいたので最後にご紹介。(英語)
Deploy Streamlit on a VPS and Proxy to Cloudflare Tunnels
この記事の気になった箇所を読み返す:
- そもそもStreamlit Community Cloudはしばしば起動・再起動エラーになる。まずは公式フォーラムを確認
- デプロイ時、パッケージの依存関係でつまづく場合
- Streamlit Cloudとローカル環境のPythonバージョンを合わせる
- コンソールのエラーメッセージを参照しつつ、requirements.txtを修正
- 余計なパッケージをrequirements.txtに記載しない
- requirements.txt記載のライブラリ・パッケージのバージョン指定を緩くする
- uvからパッケージをダウンロードできるかローカルから確認する
- pythonコミュニティ以外からのインストールにはpackages.txtを利用する
- 再起動を試みる
- secrets.tomlファイルと設定画面で同じ変数を2回宣言していないか確認する
- パッケージ依存関係のエラーが解消できない場合、Dockerコンテナ化して他プラットフォーム上で公開するのも手
- VPSでStreamlitをホスティングする方法
Category: 開発・プログラミング | エンジニアリング