
本教程探讨了如何在streamlit应用中高效管理机器学习模型的缓存,特别是针对每月更新的需求。我们将详细介绍streamlit原生st.cache_resource装饰器的ttl(time-to-live)参数,作为替代手动线程清除缓存的更优解决方案,从而确保数据和模型的及时刷新,同时优化性能和代码结构。
Streamlit以其简洁高效的特性,成为快速构建交互式数据应用的利器。在许多实际场景中,尤其是涉及机器学习模型的仪表板,数据和模型并非一成不变。例如,一个用于预测营收和交易量的模型可能需要每月进行训练和更新。为了确保Streamlit应用始终使用最新的模型进行预测,同时避免每次用户访问都重新加载耗时的大型模型,高效的缓存管理变得至关重要。
原始的解决方案可能涉及使用后台线程来定时清除Streamlit的缓存。虽然这种方法在一定程度上可以实现缓存刷新,但它引入了额外的复杂性,包括线程管理、精确的时间计算以及与Streamlit内部机制的非原生交互,可能导致性能问题或难以预料的行为。本教程将介绍Streamlit提供的更优雅、更高效的原生解决方案。
Streamlit提供了两种主要的缓存装饰器:st.cache_data用于缓存数据(如Pandas DataFrame、API响应),而st.cache_resource则专门用于缓存资源(如机器学习模型、数据库连接、自定义类实例)。对于加载机器学习模型这种通常耗时且占用内存的操作,st.cache_resource是更合适的选择。
st.cache_resource(以及st.cache_data)提供了一个名为ttl(time-to-live)的参数,允许开发者指定缓存项的过期时间(以秒为单位)。一旦缓存项的生命周期超过ttl设置的时间,它将自动失效,并在下一次函数调用时强制重新执行函数并更新缓存。这为按时间周期性更新模型提供了一个极其简洁且强大的机制。
示例代码:使用ttl实现自动过期
假设我们的ML模型每月10号上午7点更新。我们可以编写一个辅助函数来动态计算从当前时间到下个月10号上午7点之间的秒数,并将其作为ttl参数传递给st.cache_resource。
芦笋演示
一键出成片的录屏演示软件,专为制作产品演示、教学课程和使用教程而设计。
227
查看详情
import streamlit as st
from datetime import datetime
from dateutil.relativedelta import relativedelta
import logging
# 假设 mlflow_manager 是一个自定义模块,用于与MLflow交互
# from mlflow_manager import MLFlowManager
# 配置日志
logging.getLogger().setLevel(logging.INFO)
# 辅助函数:计算到下个月10号上午7点的秒数
def calculate_ttl_until_next_model_update():
"""
计算从当前时间到下个月10号上午7点之间的秒数。
如果当前时间已过本月10号上午7点,则计算到再下个月的10号。
"""
now = datetime.now()
# 设定目标日期为下个月的10号7点
target_date = (now.replace(day=1) + relativedelta(months=1)).replace(
day=10, hour=7, minute=0, second=0, microsecond=0
)
# 如果当前时间已经超过了本月10号7点,那么目标应该是再下个月的10号7点
if now >= now.replace(day=10, hour=7, minute=0, second=0, microsecond=0):
target_date = (now.replace(day=1) + relativedelta(months=2)).replace(
day=10, hour=7, minute=0, second=0, microsecond=0
)
time_difference = target_date - now
# 确保 ttl 至少为1秒,避免负值或0
return max(1, int(time_difference.total_seconds()))
# 使用 st.cache_resource 缓存模型加载函数
@st.cache_resource(ttl=calculate_ttl_until_next_model_update())
def load_ml_models(experiment_id, bucket_name, mlflow_url):
"""
加载并缓存机器学习模型。
该函数只会在缓存过期时(即每月10号7点后首次调用时)重新执行。
"""
logging.info("正在加载ML模型...")
# 假设 mlflow_manager.MLFlowManager 是一个自定义的MLflow客户端封装
# 替换为您的实际MLflow客户端初始化和模型加载逻辑
# mlflow_client = mlflow_manager.MLFlowManager(experiment_id, bucket_name, mlflow_url)
# mlflow_client.download_artifacts(sub_experiment="atv", destination_folder="data")
# model_tx = mlflow_client.get_model("ps_monthly_forecast_num_txs")
# model_atv = mlflow_client.get_model("ps_monthly_forecast_atv")
# 模拟模型加载过程
import time
time.sleep(5) # 模拟耗时操作
model_atv = "Simulated ATV Model"
model_tx = "Simulated Txs Model"
logging.info(f"ML模型加载完成,下次刷新时间:{datetime.now() + relativedelta(seconds=calculate_ttl_until_next_model_update())}")
return model_atv, model_tx
# 在Streamlit应用的主函数中调用
def main_app():
st.title("营收与交易预测仪表板")
# 假设这些是配置参数
experiment_id = "your_experiment_id"
bucket_name = "your_bucket_name"
mlflow_url = "http://localhost:5000"
model_atv, model_tx = load_ml_models(experiment_id, bucket_name, mlflow_url)
st.write(f"当前使用的ATV模型: {model_atv}")
st.write(f"当前使用的交易模型: {model_tx}")
st.write(f"模型加载时间 (缓存): {datetime.now()}")
# 您的预测逻辑将在这里使用 model_atv 和 model_tx
# ...
if __name__ == "__main__":
main_app()通过这种方式,load_ml_models函数将只在缓存过期时(即每月10号7点后第一次用户访问时)重新执行,从而自动拉取最新的模型,而无需任何手动清除或后台线程。
原始方案中,通过后台线程定时调用st.cache_data.clear()来清除缓存,存在以下局限性:
相比之下,使用st.cache_resource的ttl参数具有显著优势:
虽然ttl参数完美解决了Streamlit应用内部的模型缓存刷新问题,但我们还可以从更宏观的角度优化整个MLOps流程。
# 假设您有一个自定义的MLflowManager类
# from mlflow_manager import MLFlowManager
class MLModelService:
"""
封装MLflow模型加载和管理逻辑的服务类。
"""
def __init__(self, experiment_id: str, bucket_name: str, mlflow_url: str):
self.experiment_id = experiment_id
self.bucket_name = bucket_name
self.mlflow_url = mlflow_url
# 初始化您的MLflow客户端封装
# self.mlflow_client_wrapper = MLFlowManager(experiment_id, bucket_name, mlflow_url)
logging.info(f"MLModelService initialized for MLflow URL: {mlflow_url}")
def load_and_prepare_prediction_models(self):
"""
从MLflow加载ATV和交易量预测模型。
"""
logging.info("开始通过MLModelService加载模型...")
try:
# 模拟MLflow下载和加载过程
# self.mlflow_client_wrapper.download以上就是Streamlit应用中ML模型的高效缓存管理与自动更新策略的详细内容,更多请关注其它相关文章!
# 上午
# SEO外链软件下载
# 银川企业网站优化
# 设计网站建设批发
# 永康网站建设课程评价表
# 品牌营销策划及推广论文
# 语音网站建设路推荐
# 辛集营销网站建设
# 佛山环保seo优化排名
# 美业营销号怎么做推广
# 高明定制化营销推广公司
# 客户端
# 下个月
# 官网
# git
# 仪表板
# 自定义
# 面向对象
# 您的
# 是一个
# 加载
# red
# 面向对象编程
# stream
# ai
# 工具
# app
# github
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
哈尔滨城市通昵称修改方法
使用VS Code调试Python代码:从入门到精通
火狐浏览器如何刷新修复浏览器 火狐浏览器“重置Firefox”功能详解
悟空浏览器网页版链接 悟空浏览器网页版最新有效地址
《浙里办》电子发票开具方法
Google Drive API 认证:服务账户与OAuth 2.0的选择与实践
AO3官方镜像链接 | 最新防走失网址永久收藏
汽水音乐官网网页版入口 汽水音乐官网网页版在线入口
谷歌浏览器官方镜像获取方法_谷歌浏览器网页版入口极速直达
猫眼app抢票快还是小程序快
海外搜索引擎推广效果怎么样,怎么分析效果!
win11如何开启单声道音频 Win11为听障用户合并左右声道【辅助】
青橙手机语音助手怎么唤醒_青橙手机语音助手设置与唤醒方法
画质怪兽120帧安卓和平精英免费版
win11怎么启用或禁用休眠 Win11 powercfg命令管理休眠文件【技巧】
mysql怎么导入sql文件_mysql导入sql文件的方法与技巧
抖音手机分身两个账号怎么切换?分身两个系统是一样的吗?
使用TinyButStrong生成HTML并结合Dompdf创建PDF教程
顺丰官方查单号入口 顺丰快递单号查询官网入口
Yandex世界探索 最新官方免登录入口全知道
《via浏览器》强制缩放网页设置方法
CodeIgniter 3 中基于 MySQL 数据高效生成动态图表教程
解决CSS布局中意外顶部空白问题的教程
百度识图图像分析 百度识图识别平台
composer 提示 "requires ext-soap" 缺少 SOAP 扩展怎么办?
荣耀Magic7拍照夜景噪点处理_荣耀Magic7相机优化
Lar*el如何创建自定义的辅助函数(Helpers)_Lar*el全局函数定义与加载方法
《环球网校》设置报考省市方法
Windows 11怎么删除恢复分区_Windows 11使用Diskpart命令强行删除分区
哔哩哔哩的|直播|间怎么送礼物_哔哩哔哩|直播|送礼操作指南
在J*a里什么是行为抽象_抽象行为对代码复用的提升作用
疯狂小鸟微信小游戏入口 疯狂小鸟网页版秒玩
Win11如何分屏操作_Win11多窗口分屏技巧
厨房地面防滑垫的油污怎么洗? 机洗和手洗防滑垫的注意事项
Python模块化编程:避免循环导入与共享函数的最佳实践
Composer reinstall命令重装损坏的包
J*a中导出MySQL表为SQL脚本的两种方法
如何解决Casbin日志与应用日志不统一的问题,使用casbin/psr3-bridge实现无缝集成
51漫画网实时入口 51漫画网页版官方免费漫画入口
《金山词霸》语音翻译方法
《i莞家》修改昵称方法
百度网盘如何设置上传限额
深入理解随机递归函数的确定性:内部节点、叶节点与时间复杂度分析
C++ optional用法详解_C++17处理可能为空的返回值
惠普电脑BIOS界面看不懂怎么办_HP电脑BIOS功能选项解读与设置
OPPO A3 WiFi频繁断开怎么办 OPPO A3网络优化技巧
J*aScript深度克隆:实现高效、健壮与安全的复杂对象复制
cad加载的线型看不见怎么办_cad线型不可见问题解决方法
CodeIgniter 3 连接 SQL Server:正确获取查询结果的教程
怎么恢复删除的电脑文件_数据恢复软件使用教程
2025-12-05
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。