
本教程探讨了如何在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。
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模型的高效缓存管理与自动更新策略的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号