在运行时环境之间迁移

您可以通过更新应用程序的 RUNTIME_NAME 和 COMPUTE_POOL 属性,在仓库运行时与容器运行时之间迁移 Streamlit 应用。但是,某些功能仅受一种运行时环境支持,因此在不同运行时环境之间迁移应用程序时需要注意相关限制。

本页提供了一份从仓库运行时迁移到容器运行时的检查清单。每一项都包含简要说明,并在需要时提供指向详细信息的链接。

先决条件

在开始之前,请先在原位置调整您的仓库运行时应用程序,为迁移做好准备。

可选:备份应用程序代码

如果您的应用程序源代码尚未存储在版本控制系统、外部仓库或本地目录中,请先进行备份,以避免在迁移过程中发生潜在的数据丢失。

确保您的应用程序不是使用 ROOT_LOCATION 创建的

使用 ROOT_LOCATION 参数创建的应用程序只能运行在仓库运行时中。如果您的应用程序是使用 ROOT_LOCATION 创建的,请将其升级为使用 FROM 参数。

请参阅 了解不同类型的 Streamlit 对象

将应用程序升级到 Streamlit 1.50 及以上版本

请确保您的应用程序及其所有依赖项与 Streamlit 1.50 及以上版本兼容。

请参阅 管理 Streamlit 应用程序的依赖项

仅将应用程序更新至 Python 3.11

容器运行时仅支持 Python 3.11,而仓库运行时支持 Python 3.9、3.10 和 3.11。请确保您的应用程序及其所有依赖项与 Python 3.11 兼容。

请参阅 管理 Streamlit 应用程序的依赖项

可选:在本地安装 Snowflake CLI 3.14.0 及更高版本

如果您使用 Snowflake CLI 部署应用程序,则需要 3.14.0 或更高版本,以支持容器运行时的部署语法。您可以使用 snow --version 检查当前版本。(可选)如果使用 --experimental 标志,也可以使用 3.12.0 至 3.13.1 版本。

请参阅 使用 Snowflake CLI 创建和部署 Streamlit 应用程序

资源与权限

您的应用程序可以继续使用现有的查询仓库,但需要为容器运行时配置一个计算池。

创建计算池并授予访问权限

应用程序所有者需要在运行容器运行时的计算池上拥有 USAGE 权限。应用程序查看者无需任何计算池权限。

请参阅 创建和使用 Streamlit 应用程序所需的权限

创建并授予外部访问集成的访问权限

容器运行时仅附带最少量的预安装包。如果应用程序需要额外的包或预安装包的不同版本,则必须使用外部包索引,例如 PyPI。要允许应用程序访问外部包索引,必须创建外部访问集成 (EAI),并将 EAI 的 USAGE 权限授予应用程序所有者。

请参阅 Streamlit in Snowflake 中的外部网络访问

依赖关系管理

environment.yml 替换为 pyproject.tomlrequirements.txt

如果需要锁定依赖项版本或指定其他依赖项,必须在项目根目录中添加 pyproject.tomlrequirements.txt 文件。Conda 和 PyPI 中的包名称可能不同,因此请确保在工件存储库中使用正确的包名称。

请参阅 管理 Streamlit 应用程序的依赖项

修改应用程序以配置外部访问集成

如果依赖项包含版本说明符,或安装了其他包,必须为应用程序分配外部访问集成。这样应用程序才能访问依赖文件中指定的包索引。PyPI 是默认包索引。

请参阅 管理 Streamlit 应用程序的依赖项

代码更改

get_active_session() 替换为 st.connection("snowflake").session()

使用容器运行时时,Streamlit 服务器会同时处理多个查看者。get_active_session() 不是线程安全的,因此必须改用 st.connection("snowflake") 管理连接。

请参阅 管理密钥并配置 Streamlit 应用程序

检查代码并实现缓存

由于容器运行时在查看者会话之间共享磁盘、计算和内存资源,应使用 st.cache_resourcest.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。如果需要,请使用存储过程来访问密钥。

请参阅 管理密钥并配置 Streamlit 应用程序

更新文件路径和目录结构

源代码位置的根目录即应用程序的工作目录。对于大多数 Python 库,应用程序需使用源代码根目录的相对路径。但某些 Streamlit 命令需要相对于入口文件的路径。如果入口文件位于子目录,请相应检查代码中的路径。

验证 secrets.tomlconfig.toml 的位置。

请参阅 整理 Streamlit 应用程序文件

应用程序配置变更

修改应用程序以设置计算池、查询仓库和运行时环境

当您准备切换应用程序的运行时类型时,可使用 Snowsight 或 SQL。

  1. 登录 Snowsight

  2. 在导航菜单中选择 Projects » Streamlit,然后选择应用程序。

  3. 在右上角,点击垂直省略号 工作表的更多操作 菜单,然后选择 App settings

  4. 对于 Python environment,选择 Run on container

  5. Compute pool 下拉列表中选择您的计算池。

  6. Query warehouse 下拉列表中选择您的查询仓库。

  7. 要保存更改并关闭对话框,请选择 Save

应用程序将用几分钟时间重新启动并构建新容器。

请参阅 Streamlit 应用程序的运行时环境

语言: 中文