Streamlit 应用程序的运行时环境¶
Streamlit in Snowflake 为 Streamlit 应用程序提供两种类型的运行时环境:
容器运行时(预览版):将应用程序作为长期运行的服务提供,并创建在所有查看者之间共享的专用应用程序实例。
仓库运行时:按需运行,并为每个查看者创建应用程序的个人实例。
备注
如果您使用 CREATE STREAMLIT 命令与 ROOT_LOCATION 参数,您的应用程序只能使用仓库运行时,并且受到其他限制。本页涵盖使用 FROM 参数创建的应用程序。有关更多信息,请参阅 了解不同类型的 Streamlit 对象。
以下表格对比了仓库运行时和容器运行时在 Streamlit in Snowflake 应用程序中所支持的功能。
支持的功能 |
仓库运行时 |
容器运行时 |
|---|---|---|
计算 |
用于应用程序代码和内部查询的虚拟仓库。 |
应用程序代码的 计算池 节点。用于内部查询的虚拟仓库。 |
基础镜像 |
Python 存储过程中的 Linux。 |
Snowpark 容器中的 Linux。 |
Python 版本 |
3.9、3.10、3.11 |
3.11 |
Streamlit 版本 |
1.22+(有限选择)。 |
1.49+(任何版本,包括 |
依赖关系 |
通过 |
通过 |
使用 |
使用 |
|
使用 |
使用 |
|
入口点位置 |
来源目录的根目录。 |
来源目录中的根目录或子目录。 |
Streamlit 服务器 |
为每个查看者会话提供临时、独立的 Streamlit 服务器实例。 |
为所有查看者会话提供持久共享的服务器实例。 |
不在查看者会话之间共享磁盘、计算和内存资源。 |
在查看者会话之间共享磁盘、计算和内存资源。 |
|
不支持会话之间的缓存。 |
完全支持 Streamlit 的缓存功能。 |
|
启动时间 |
由于按需创建应用程序,每个查看者会话的速度较慢。 |
每个查看者会话的速度更快,但由于容器启动,部署速度较慢。 |
访问 |
需要所有权才能编辑。 |
与仓库运行时相同。 |
使用所有者权限进行查询,其限制类似于所有者权限存储过程。 |
对查询使用所有者权限,并可选择对部分或所有查询使用调用方权限。 |
容器运行时¶
容器运行时提供 Streamlit 应用程序的专用实例,该实例在所有查看者之间共享。每个查看者都连接到应用程序的同一个实例,这意味着查看者可以快速连接到已经上线的应用程序。容器的每分钟成本明显低于仓库,通常是一种更具成本效益的托管解决方案,特别是对于频繁使用的应用程序。
容器运行时在查看者会话之间共享磁盘、计算和内存资源。这意味着您可以充分利用 Streamlit 的缓存功能来提高性能。高效的应用程序设计对于容器运行时非常重要,可以确保所有查看者都有良好的体验。
通过外部访问集成,您可以从 PyPI 或其他支持 简单存储库 API (https://peps.python.org/pep-0503/) 的包索引安装 Python 包。这使得容器运行时更加灵活。您将始终可以访问最新版本的 Streamlit,包括 streamlit-nightly 版本。
仓库运行时¶
仓库运行时为每个查看者提供 Streamlit 应用程序的按需个人实例。当查看者打开应用程序时,系统会为该查看者创建应用程序的新实例。每个查看者都有独立的隔离环境,这会增加用户加载时间。尽管这两种运行时都使用所有者权限执行 SQL 查询,但使用仓库运行时的应用程序受到与所有者权限存储过程类似的限制。有关更多信息,请参阅 所有者权限存储过程。
选择 Streamlit in Snowflake 资源的准则¶
在 Streamlit in Snowflake 内运行 Streamlit 应用程序时,多种因素可能会影响性能,包括 Streamlit 应用程序的复杂性、仓库的可用性和延迟。以下部分提供了在 Streamlit in Snowflake 中使用虚拟仓库和计算池的一般准则。
创建计算池¶
当使用容器运行时,必须选择一个计算池来运行 Streamlit 应用程序。每个 Streamlit 应用程序都在单个计算池节点上运行。计算池节点的大小会影响应用程序的性能。如果应用程序需要更多内存,则可以使用更大的节点大小。但是,由于 Streamlit 作为单个进程运行,因此您的应用程序不太可能从多个 CPUs 中受益。有关更多信息,请参阅 创建计算池。
小技巧
要减少将来添加更多应用程序时的麻烦,请设置 MAX_NODES 以考虑未来的 Streamlit 应用程序。
为确保快速创建应用程序,创建计算池时将 MIN_NODES 设置为您打算同时运行的应用数量,包括测试和实验。
要降低成本,请使用较小的节点大小。
节点数量和节点大小都会影响成本。有关更多信息,请参阅 计算池成本。
例如,以下命令创建一个计算池,以同时运行两到五个 Streamlit 应用程序:
CREATE COMPUTE POOL streamlit_compute_pool
MIN_NODES = 2
MAX_NODES = 5
INSTANCE_FAMILY = CPU_X64_XS;
选择虚拟仓库¶
要优化成本、性能和监控,请使用单独的计算资源来运行应用程序并在应用程序中执行查询。如果您使用容器运行时,您的计算资源会自动分离,因为您的应用程序代码在计算池节点上运行,其查询在虚拟仓库上运行。如果您使用仓库运行时,您的应用程序将使用相同的仓库来运行应用程序代码和执行查询,除非您在应用程序代码中激活不同的查询仓库。
例如,在使用数据仓库运行时,您可能会使用一个 X-小仓库来运行 Python 代码,并在应用程序中激活一个大查询仓库来运行复杂的查询。
备注
在 CREATE STREAMLIT 和 ALTER STREAMLIT 命令中,QUERY_WAREHOUSE 参数的使用方式应根据运行时类型而有所不同:
对于容器运行时,QUERY_WAREHOUSE 设置用于执行应用程序内查询的查询仓库。
对于仓库运行时,QUERY_WAREHOUSE 设置用于运行应用程序代码的代码仓库。如果您没有在应用程序代码中激活其他仓库,则将使用同一个仓库来执行查询。
查询仓库的最佳实践¶
在 Streamlit 应用程序中,要选择查询仓库,请遵循与选择任何其他 Snowflake 工作负载相同的一般准则。在选择仓库规模时,请考虑查询的复杂性、所查询数据的大小以及预期的并发性。
如果应用程序使用容器运行时,请在创建或修改 Streamlit 应用程序时使用 QUERY_WAREHOUSE 参数来设置查询仓库。但是,如果应用程序使用仓库运行时,请使用 QUERY_WAREHOUSE 参数来设置代码仓库。通常应使用较小的专用仓库来运行应用程序代码,并在应用程序代码中手动切换到不同的查询仓库。
示例:容器运行时
使用容器运行时时,请设置足够大的查询仓库来运行应用程序的内部查询:
CREATE STREAMLIT my_app
FROM '@my_stage/app_folder'
MAIN_FILE = 'streamlit_app.py'
RUNTIME_NAME = 'SYSTEM$ST_CONTAINER_RUNTIME_PY3_11'
COMPUTE_POOL = streamlit_compute_pool
QUERY_WAREHOUSE = my_large_warehouse
;
示例:仓库运行时
当使用仓库运行时,请设置一个小型专用代码仓库来运行 Streamlit 应用程序:
CREATE STREAMLIT my_app
FROM '@my_stage/app_folder'
MAIN_FILE = 'streamlit_app.py'
QUERY_WAREHOUSE = my_small_warehouse;
在应用程序代码中,切换到不同的仓库进行查询:
import streamlit as st
conn = st.connection("snowflake")
session = conn.session()
session.use_warehouse("my_large_warehouse")
代码仓库的最佳实践¶
当在 Streamlit in Snowflake 使用仓库运行时,选择最小的仓库来运行应用程序代码。
仓库会缓存 Streamlit 应用程序使用的 Python 包,从而提高后续应用程序加载的性能。仓库暂停时会移除缓存,这可能会减慢仓库恢复后的初始应用程序加载速度。如果恢复后的仓库运行更多应用程序,包缓存会重新构建,并改善加载性能。
每秒计费和自动暂停提供了灵活性,可以从较小的仓库开始,并根据需要调整规模。您可以随时增大仓库规模。有关更多信息,请参阅 更改 Streamlit 应用程序的仓库。
Snowflake 建议为 Streamlit 应用程序使用专用仓库,以隔离成本,并通过避免其他工作负载来潜在地缩短加载时间。在应用程序代码中,根据需要为查询激活不同的仓库。
有关更多信息,请参阅 仓库注意事项。
小技巧
将自动暂停时间设置为至少 30 秒,以避免仓库在初始化期间暂停。
为 Streamlit 应用程序配置休眠时间和 WebSocket 超时,以降低成本。有关更多信息,请参阅 为 Streamlit 应用程序自定义睡眠计时器。