Cache em web apps Python
O cache é crucial para web apps Python, especialmente quando eles são alimentados por modelos de inteligência artificial (IA). Cache reduz o trabalho do lado do servidor, faz economia de largura de banda de internet e até garante alguma funcionalidade offline.
Modelos de IA e machine learning, particularmente modelos de redes neurais, costumam ser grandes. Para uma aplicação web com IA funcionar eficientemente, é importante que, uma vez que o modelo está carregado no app, ele seja preservado no cache até o final da sessão.
Web apps Python com Streamlit
Streamlit é uma biblioteca e API Python ideal para implementar web apps de maneira simples e rápida. Ele é muito popular para a criação de apps de análise e visualização de dados e também aplicações alimentadas com modelos de IA.
Mas o Streamlit tem uma pequena limitação em seus apps padrões. Ele executa o script do seu aplicativo web de cima para baixo a cada interação do usuário ou a cada alteração de código. Este modelo de execução torna o desenvolvimento super fácil. Mas isso causa um problema: as funções de longa execução são executadas repetidamente, tornando os apps lentos. A cada mudança no estado de um app, os objetos são recriados repetidamente e os dados são recarregados… Se seu dado é um arquivo CSV de 15 linhas, não tem problemas. Mas se você precisa usar uma rede neural com milhares de parâmetros, essa limitação é séria. Felizmente, o Streamlit pensou nesses casos!
Streamlit com cache
Apps Streamlit podem armazenar recursos e dados em cache. O cache armazena os resultados de chamadas de função lentas. Com isso, elas só precisam ser executadas uma vez durante uma mesma sessão.
Uma sessão é uma única instância de exibição de um aplicativo. Cada usuário de um aplicativo tem um estado de sessão vinculado à sua exibição específica enquanto ela está ativa. O Streamlit mantém essa sessão à medida que o usuário interage com o aplicativo.
O cache de recursos e dados durante uma sessão possibilita que funções lentas sejam executadas apenas uma vez. Você pode armazenar em cache recursos como modelos de machine learning e IA e dados.
Cache de dados e de recursos
O Streamlit possui dois tipos de cache: cache_data e cache_resource. Em código, ambos são definidos como decoradores Python.
O cache_data é o comando ideal para todas as funções que retornam dados. Na primeira execução de uma dessas funções, ela é executada normalmente, e o Streamlit baixa seus dados. O dado baixado é serializado (convertido em bytes) via pickle e armazenado no cache. Nas execuções posteriores, o mecanismo de cache está ativo. Veja um exemplo ilustrativo de como usar o decorador cache_data abaixo:
import streamlit as st
@st.cache_data # cache para armazenar dados
def load_data(url):
df = pd.read_csv(url)
return df
O comando st.cache_resource é o ideal para armazenar em cache recursos que devem estar disponíveis globalmente para todos os usuários, sessões e reexecuções de um app. Ele é o comando certo para armazenar modelos de machine learning. Veja como usá-lo no exemplo abaixo:
@st.cache_resource # cache para armazenar recursos como modelos de machine learning
def load_model():
model = pipeline("sentiment-analysis") # exemplo de modelo
return model
model = load_model() # carrega modelo