在运行时环境之间迁移¶
您可以通过更新应用程序的 RUNTIME_NAME 和 COMPUTE_POOL 属性,在仓库运行时与容器运行时之间迁移 Streamlit 应用。但是,某些功能仅受一种运行时环境支持,因此在不同运行时环境之间迁移应用程序时需要注意相关限制。
本页提供了一份从仓库运行时迁移到容器运行时的检查清单。每一项都包含简要说明,并在需要时提供指向详细信息的链接。
先决条件¶
在开始之前,请先在原位置调整您的仓库运行时应用程序,为迁移做好准备。
- 可选:备份应用程序代码
如果您的应用程序源代码尚未存储在版本控制系统、外部仓库或本地目录中,请先进行备份,以避免在迁移过程中发生潜在的数据丢失。
- 确保您的应用程序不是使用 ROOT_LOCATION 创建的
使用 ROOT_LOCATION 参数创建的应用程序只能运行在仓库运行时中。如果您的应用程序是使用 ROOT_LOCATION 创建的,请将其升级为使用 FROM 参数。
- 将应用程序升级到 Streamlit 1.50 及以上版本
请确保您的应用程序及其所有依赖项与 Streamlit 1.50 及以上版本兼容。
- 仅将应用程序更新至 Python 3.11
容器运行时仅支持 Python 3.11,而仓库运行时支持 Python 3.9、3.10 和 3.11。请确保您的应用程序及其所有依赖项与 Python 3.11 兼容。
- 可选:在本地安装 Snowflake CLI 3.14.0 及更高版本
如果您使用 Snowflake CLI 部署应用程序,则需要 3.14.0 或更高版本,以支持容器运行时的部署语法。您可以使用
snow --version检查当前版本。(可选)如果使用--experimental标志,也可以使用 3.12.0 至 3.13.1 版本。
资源与权限¶
您的应用程序可以继续使用现有的查询仓库,但需要为容器运行时配置一个计算池。
- 创建计算池并授予访问权限
应用程序所有者需要在运行容器运行时的计算池上拥有 USAGE 权限。应用程序查看者无需任何计算池权限。
- 创建并授予外部访问集成的访问权限
容器运行时仅附带最少量的预安装包。如果应用程序需要额外的包或预安装包的不同版本,则必须使用外部包索引,例如 PyPI。要允许应用程序访问外部包索引,必须创建外部访问集成 (EAI),并将 EAI 的 USAGE 权限授予应用程序所有者。
依赖关系管理¶
- 将
environment.yml替换为pyproject.toml或requirements.txt 如果需要锁定依赖项版本或指定其他依赖项,必须在项目根目录中添加
pyproject.toml或requirements.txt文件。Conda 和 PyPI 中的包名称可能不同,因此请确保在工件存储库中使用正确的包名称。- 修改应用程序以配置外部访问集成
如果依赖项包含版本说明符,或安装了其他包,必须为应用程序分配外部访问集成。这样应用程序才能访问依赖文件中指定的包索引。PyPI 是默认包索引。
代码更改¶
- 将
get_active_session()替换为st.connection("snowflake").session() 使用容器运行时时,Streamlit 服务器会同时处理多个查看者。
get_active_session()不是线程安全的,因此必须改用st.connection("snowflake")管理连接。- 检查代码并实现缓存
由于容器运行时在查看者会话之间共享磁盘、计算和内存资源,应使用
st.cache_resource或st.cache_data缓存计算量大或不常变化的数据。请参阅:请参阅 Streamlit 文档中的 了解 Streamlit 客户端-服务器架构 (https://docs.streamlit.io/develop/concepts/architecture/architecture) 和 缓存概述 (https://docs.streamlit.io/develop/concepts/architecture/caching)。
- 确保线程安全
使用容器运行时时,应用程序代码必须线程安全,以便同时处理多个查看者。虽然每个查看者都会获得应用程序脚本的独立实例,但应检查导入代码中是否存在共享状态或全局变量,以避免竞态条件或行为不一致。如果在 Streamlit 应用中引入新线程,请查看 Streamlit 架构,并避免在自定义线程中使用 Streamlit 命令。
请参阅:请参阅 Streamlit 文档中的 Streamlit 多线程 (https://docs.streamlit.io/develop/concepts/design/multithreading)。
- 将
_snowflake的用法替换为原生 Python 等效项 _snowflake是一个私有模块,仅在用户定义函数 (UDFs) 和存储过程中可用。仓库运行时可继承_snowflake的访问权限,而容器运行时则不行。如果应用程序使用_snowflake,请将其替换为原生 Python 等效项,例如 Snowflake Python Connector。如果需要,请使用存储过程来访问密钥。- 更新文件路径和目录结构
源代码位置的根目录即应用程序的工作目录。对于大多数 Python 库,应用程序需使用源代码根目录的相对路径。但某些 Streamlit 命令需要相对于入口文件的路径。如果入口文件位于子目录,请相应检查代码中的路径。
验证
secrets.toml和config.toml的位置。
应用程序配置变更¶
- 修改应用程序以设置计算池、查询仓库和运行时环境
当您准备切换应用程序的运行时类型时,可使用 Snowsight 或 SQL。
登录 Snowsight。
在导航菜单中选择 Projects » Streamlit,然后选择应用程序。
对于 Python environment,选择 Run on container。
在 Compute pool 下拉列表中选择您的计算池。
在 Query warehouse 下拉列表中选择您的查询仓库。
要保存更改并关闭对话框,请选择 Save。
ALTER STREAMLIT my_app COMPUTE_POOL = my_compute_pool QUERY_WAREHOUSE = my_warehouse RUNTIME_NAME = SYSTEM$ST_CONTAINER_RUNTIME_PY3_11;
应用程序将用几分钟时间重新启动并构建新容器。
