Ambientes de tempo de execução para apps Streamlit¶
O Streamlit in Snowflake oferece dois tipos de ambientes de tempo de execução para apps Streamlit:
Tempo de execução de contêiner (versão preliminar): serve um app como um serviço de longa duração e cria uma instância dedicada do aplicativo que é compartilhada entre todos os visualizadores.
Tempo de execução de warehouse: executa sob demanda e cria uma instância pessoal do app para cada visualizador.
Nota
Se você usar o comando CREATE STREAMLIT com o parâmetro ROOT_LOCATION, seu app só poderá usar um tempo de execução de warehouse e estará sujeito a limitações adicionais. Esta página aborda os apps criados com o parâmetro FROM. Para obter mais informações, consulte Explicação dos diferentes tipos de objetos Streamlit.
A tabela a seguir compara os recursos compatíveis com tempos de execução de warehouse e tempos de execução do contêiner para apps do Streamlit in Snowflake.
Recursos aceitos |
Tempo de execução de warehouse |
Tempo de execução de contêiner |
|---|---|---|
Computação |
Warehouse virtual para código do app e consultas internas. |
Nó do pool de computação para código do app. Warehouse virtual para consultas internas. |
Imagem base |
Linux em um procedimento armazenado Python. |
Linux em um contêiner Snowpark. |
Versões Python |
3.9, 3.10, 3.11 |
3,11 |
Versões do Streamlit |
1.22+ (seleção limitada). |
1.49+ (qualquer versão, incluindo versões |
Dependências |
Pacotes do canal Conda do Snowflake via |
Pacotes de um índice de pacotes externo como PyPI via |
Fixar versões com o operador |
Fixar versões com o operador |
|
Usar intervalos de versões com o curinga |
Usar intervalos de versões com |
|
Localização do ponto de entrada |
Raiz do seu diretório de origem. |
Raiz ou subdiretório dentro do seu diretório de origem. |
Servidor Streamlit |
Instância temporária e individual do servidor Streamlit para cada sessão do visualizador. |
Instância de servidor persistente e compartilhada para todas as sessões do visualizador. |
Não compartilha recursos de disco, computação e memória entre as sessões do visualizador. |
Compartilha recursos de disco, computação e memória entre as sessões do visualizador. |
|
Não é compatível com cache entre sessões. |
É totalmente compatível com os recursos de cache do Streamlit. |
|
Tempos de inicialização |
Mais lento por sessão do visualizador devido à criação de apps sob demanda. |
Mais rápido por sessão do visualizador, mas implantação mais lenta devido à inicialização do contêiner. |
Acesso |
Requer propriedade para edição. |
O Igual ao tempo de execução de warehouse. |
Usa direitos de proprietário para consultas, limitados de forma semelhante aos procedimentos armazenados com direitos de proprietário. |
Utiliza os direitos do proprietário para consultas, com a opção de usar os direitos do autor da chamada em algumas ou todas as consultas. |
Tempos de execução de contêiner¶
Um tempo de execução de contêiner fornece uma instância dedicada do seu app Streamlit que é compartilhada entre todos os visualizadores. Cada visualizador se conecta à mesma instância do aplicativo, o que significa que os visualizadores se conectam rapidamente a um app já em execução. Os contêineres custam significativamente menos por minuto do que os warehouses e geralmente são uma solução de hospedagem mais econômica, especialmente para apps com uso frequente.
Os tempos de execução de contêiner compartilham recursos de disco, computação e memória entre as sessões do visualizador. Isso significa que você pode aproveitar ao máximo os recursos de cache do Streamlit para melhorar o desempenho. Um design de app eficiente é importante com os tempos de execução de contêiner para garantir que todos os visualizadores tenham uma boa experiência.
Com uma integração de acesso externo, você pode instalar pacotes Python de PyPI ou outros índices de pacotes que são compatíveis com a API de repositório simples. Isso torna os tempos de execução de contêiner mais flexíveis. Você sempre terá acesso à versão mais recente do Streamlit, incluindo as versões streamlit-nightly.
Tempos de execução de warehouse¶
Os tempos de execução de warehouse fornecem uma instância pessoal e sob demanda do app Streamlit para cada visualizador. Quando um visualizador abre o app, uma nova instância do app é criada para esse visualizador. Cada visualizador tem o próprio ambiente isolado, o que aumenta os tempos de carregamento do usuário. Embora ambos os tempos de execução executem consultas SQL usando os privilégios do proprietário, os apps que usam tempos de execução de warehouse estão sujeitos a restrições semelhantes às dos procedimentos armazenados com direitos do proprietário. Para obter mais informações, consulte Procedimentos armazenados de direitos do proprietário.
Diretrizes para seleção de recursos no Streamlit in Snowflake¶
Ao executar um app Streamlit no Streamlit in Snowflake, vários fatores podem afetar o desempenho, incluindo a complexidade do app Streamlit, a disponibilidade de warehouses e a latência. As seções a seguir fornecem diretrizes gerais para usar warehouses virtuais e pools de computação no Streamlit in Snowflake.
Seleção de um pool de computação¶
Ao usar um tempo de execução de contêiner, você deve selecionar um pool de computação para executar o app Streamlit. Cada app Streamlit é executado em um único nó do pool de computação. O tamanho do nó do pool de computação afeta o desempenho do app. Tamanhos de nó maiores poderão ser utilizados se o seu app exigir mais memória. No entanto, como o Streamlit é executado como um único processo, é improvável que seu app se beneficie de várias CPUs. Para obter mais informações, consulte Criação de um pool de computação.
Dica
Para reduzir complicações ao adicionar mais apps no futuro, defina MAX_NODES para contabilizar os futuros apps Streamlit.
Para garantir que a criação de apps seja rápida, crie seu pool de computação com MIN_NODES igual ao número de apps que você pretende executar simultaneamente, incluindo testes e experimentos.
Para reduzir custos, use tamanhos de nó menores.
Tanto a quantidade quanto o tamanho dos nós impactam os custos. Para obter mais informações, consulte Custo do pool de computação.
Por exemplo, o comando a seguir cria um pool de computação para executar de dois a cinco apps Streamlit simultaneamente:
CREATE COMPUTE POOL streamlit_compute_pool
MIN_NODES = 2
MAX_NODES = 5
INSTANCE_FAMILY = CPU_X64_XS;
Seleção de um warehouse virtual¶
Para otimizar custos, desempenho e monitoramento, use recursos de computação separados para executar seu app e executar consultas dentro dele. Se você usar um tempo de execução de contêiner, seus recursos de computação serão separados automaticamente, pois o código do seu app é executado em um nó do pool de computação e as consultas são executadas em um warehouse virtual. Se você usar um tempo de execução de warehouse, seu app usará o mesmo warehouse para executar o código e as consultas, a menos que você ative um warehouse de consultas diferente dentro do código do seu app.
Por exemplo, com um tempo de execução de warehouse, você pode usar um warehouse X-Small para executar seu código Python e ativar um warehouse de consultas Large em seu app para executar consultas complexas.
Nota
Nos comandos CREATE STREAMLIT e ALTER STREAMLIT, o parâmetro QUERY_WAREHOUSE deve ser utilizado de forma diferente dependendo do tipo de tempo de execução:
Para tempos de execução de contêiner, QUERY_WAREHOUSE define o warehouse de consultas para executar consultas dentro do app.
Para tempos de execução de warehouse, QUERY_WAREHOUSE define o warehouse de código para executar o código do app. Se você não ativar um warehouse diferente no código do seu app, o mesmo warehouse será utilizado para executar consultas.
Práticas recomendadas para warehouses de consulta¶
Em um app Streamlit, para selecionar um warehouse de consultas, siga as mesmas diretrizes gerais que você seguiria para qualquer outra carga de trabalho do Snowflake. Considere a complexidade das consultas, o tamanho dos dados consultados e a simultaneidade esperada ao selecionar o tamanho do warehouse.
Se o seu app usa um tempo de execução de contêiner, use o parâmetro QUERY_WAREHOUSE para definir o warehouse de consultas ao criar ou alterar o app Streamlit. No entanto, se o seu app utiliza um tempo de execução de warehouse, use o parâmetro QUERY_WAREHOUSE para definir o warehouse de código. Em geral, você deve usar um warehouse menor e dedicado para executar o código do app e alternar manualmente para um warehouse de consultas diferente dentro do código do seu app.
Exemplo: tempo de execução de contêiner
Ao usar um tempo de execução de contêiner, defina um warehouse de consultas suficientemente grande para executar as consultas internas do seu app:
CREATE STREAMLIT my_app
FROM '@my_stage/app_folder'
MAIN_FILE = 'streamlit_app.py'
RUNTIME_NAME = 'SYSTEM$ST_CONTAINER_RUNTIME_PY3_11'
COMPUTE_POOL = streamlit_compute_pool
QUERY_WAREHOUSE = my_large_warehouse
;
Exemplo: tempo de execução de warehouse
Ao usar um tempo de execução de warehouse, defina um warehouse de código pequeno e dedicado para executar apps Streamlit:
CREATE STREAMLIT my_app
FROM '@my_stage/app_folder'
MAIN_FILE = 'streamlit_app.py'
QUERY_WAREHOUSE = my_small_warehouse;
Dentro do código do seu app, alterne para um warehouse diferente para consultas:
import streamlit as st
conn = st.connection("snowflake")
session = conn.session()
session.use_warehouse("my_large_warehouse")
Práticas recomendadas para warehouses de código¶
Ao usar um tempo de execução de warehouse no Streamlit in Snowflake, selecione o menor warehouse possível para executar o código do seu app.
Os warehouses armazenam em cache os pacotes Python utilizados pelos apps Streamlit, melhorando o desempenho para carregamentos subsequentes do app. O cache é removido quando o warehouse é suspenso, o que pode deixar o carregamento inicial do app mais lento após a retomada do warehouse. Se o warehouse retomado executar mais apps, o cache de pacotes será reconstruído e o desempenho de carregamento será melhorado.
A cobrança por segundo e a suspensão automática oferecem flexibilidade para começar com warehouses menores e ajustar os tamanhos conforme necessário. Você pode aumentar o tamanho do warehouse a qualquer momento. Para obter mais informações, consulte Alteração do warehouse de um aplicativo Streamlit.
A Snowflake recomenda o uso de um warehouse dedicado para apps Streamlit para isolar custos e potencialmente melhorar os tempos de carregamento, evitando outras cargas de trabalho. No código do seu app, ative um warehouse diferente para consultas conforme necessário.
Para obter mais informações, consulte Considerações sobre warehouses.
Dica
Defina a suspensão automática para pelo menos 30 segundos para evitar a suspensão do warehouse durante a inicialização.
Configure os tempos de espera e os tempos limite do WebSocket para seus apps Streamlit para reduzir custos. Para obter mais informações, consulte Temporizador de sono personalizado para um aplicativo Streamlit.