Notebooks no Container Runtime para ML

Visão geral

Você pode executar o Snowflake Notebooks no Container Runtime for ML. O Container Runtime for ML é fornecido pelo Snowpark Container Services, oferecendo uma infraestrutura de contêiner flexível que oferece suporte à criação e operacionalização de uma ampla variedade de fluxos de trabalho inteiramente dentro do Snowflake. O Container Runtime for ML fornece opções de software e hardware para dar suporte a cargas de trabalho avançadas de ciência de dados e machine learning (aprendizado de máquina). Comparado aos warehouses virtuais, o Container Runtime for ML fornece um ambiente de computação mais flexível, onde você pode instalar pacotes de várias fontes e selecionar recursos de computação, incluindo tipos de máquina de GPU, enquanto ainda executa consultas SQL em warehouses para um desempenho ideal.

Este documento descreve algumas considerações para usar notebooks no Container Runtime for ML. Você também pode experimentar o guia de início rápido Introdução ao Snowflake Notebook Container Runtime para saber mais sobre como usar o Container Runtime for ML no seu desenvolvimento.

Pré-requisitos

Antes de começar a usar o Snowflake Notebooks no Container Runtime for ML, a função ACCOUNTADMIN deve concluir as etapas de configuração do notebook para criar os recursos necessários e conceder privilégios a esses recursos. Para obter etapas detalhadas, consulte Instruções de configuração do usuário para Snowflake Notebooks.

Criar um notebook no Container Runtime for ML

Ao criar um notebook no Container Runtime for ML, você escolhe um warehouse, um tempo de execução e um pool de computação para fornecer os recursos para executar seu notebook. O tempo de execução escolhido lhe dará acesso a diferentes pacotes Python com base no seu caso de uso. Diferentes tamanhos de warehouse ou pools de computação têm diferentes implicações de custo e desempenho. Todas essas configurações podem ser alteradas posteriormente, se necessário.

Nota

Um usuário com as funções ACCOUNTADMIN, ORGADMIN ou SECURITYADMIN não pode criar ou possuir diretamente um notebook no Container Runtime for ML. Os Notebooks criados ou de propriedade direta dessas funções não serão executados. No entanto, se um notebook for de propriedade de uma função da qual as funções ACCOUNTADMIN, ORGADMIN ou SECURITYADMIN herdam privilégios, como a função PUBLIC, você poderá usar essas funções para executar esse notebook.

Para criar um Snowflake Notebook para execução no Container Runtime for ML, siga estas etapas:

  1. Faça login no Snowsight.

  2. Selecione Notebooks.

  3. Selecione + Notebook.

  4. Insira um nome para seu notebook.

  5. Selecione um banco de dados e um esquema para armazenar seu notebook. Este parâmetro não pode ser alterado após a criação do notebook.

    Nota

    O banco de dados e o esquema são necessários apenas para armazenar seus notebooks. Você pode consultar qualquer banco de dados e esquema aos quais sua função tenha acesso a partir do seu notebook.

  6. Selecione o Run on container como seu ambiente Python.

  7. Selecione o tipo de Runtime: CPU ou GPU.

  8. Selecione um Compute pool.

  9. Altere o warehouse selecionado a ser usado para executar consultas SQL e Snowpark.

    Para obter orientação sobre o tamanho do warehouse a ser usado, consulte Recomendações de warehouse para execução dos notebooks Snowflake.

  10. Para criar e abrir seu notebook, selecione Create.

Runtime:

Essa visualização fornece dois tipos de tempos de execução: CPU e GPU. Cada imagem de tempo de execução contém um conjunto base de versões e pacotes Python verificados e integrados pelo Snowflake. Todas as imagens de tempo de execução oferecem suporte à análise de dados, modelagem e treinamento com o Snowpark Python, Snowflake ML e Streamlit.

Para instalar pacotes adicionais de um repositório público, você pode usar o pip. Uma integração de acesso externo (EAI) é necessária para que o Snowflake Notebooks instale pacotes de pontos de extremidade externos. Para configurar EAIs, consulte Configurar acesso externo para o Snowflake Notebooks. Entretanto, se um pacote já fizer parte da imagem base, você não poderá alterar a versão do pacote instalando uma versão diferente com pip install. Para uma lista dos pacotes pré-instalados, consulte Container Runtime para ML.

Compute pool:

Um pool de computação fornece os recursos de computação para o kernel do seu notebook e o código Python. Use pools de computação menores e baseados em CPU para começar e selecione pools de computação com mais memória e baseados em GPU para otimizar cenários de uso intensivo de GPU, como visão computacional ou LLMs/VLMs.

Observe que cada nó de computação está limitado a executar um notebook por usuário por vez. Você deve definir o parâmetro MAX_NODES com um valor maior que um ao criar pools de computação para notebooks. Para obter um exemplo, consulte Criar recursos de computação. Para mais detalhes sobre pools de computação do Snowpark Container Services, consulte Snowpark Container Services: como trabalhar com pools de computação.

Quando um notebook não estiver sendo usado, considere desligá-lo para liberar recursos do nó. Você pode desligar um notebook selecionando End session no botão suspenso de conexão.

Executar um notebook no Container Runtime for ML

Depois de criar seu notebook, você pode começar a executar o código imediatamente adicionando e executando células. Para obter mais informações sobre como adicionar células, consulte Desenvolvimento e execução de código nos Snowflake Notebooks.

Importação de mais pacotes

Além dos pacotes pré-instalados para colocar seu notebook em funcionamento, você pode instalar pacotes de fontes públicas às quais tenha acesso externo definido. Você também pode usar pacotes armazenados em um estágio ou em um repositório privado. Você precisa usar a função ACCOUNTADMIN ou uma função que possa criar integrações de acesso externo (EAIs) para definir e conceder acesso para visitar pontos de extremidade externos específicos. Use o comando ALTER NOTEBOOK para habilitar o acesso externo no seu notebook. Uma vez concedido, você verá EAIs em Notebook settings. Ative as EAIs antes de começar a instalar a partir de canais externos. Para obter instruções, consulte Provisão de integração de acesso externo.

O exemplo a seguir instala um pacote externo usando pip install em uma célula de código:

!pip install transformers scipy ftfy accelerate
Copy

Atualizar configurações do notebook

Você pode atualizar configurações, como quais pools de computação ou warehouse usar, a qualquer momento em Notebook settings, que podem ser acessadas pelo menu mais ações para planilha Ações do Notebook no canto superior direito.

Uma das configurações que você pode atualizar em Notebook settings é a configuração de tempo limite de inatividade. O tempo limite de inatividade padrão é 1 hora, e você pode defini-lo para até 72 horas. Para definir isso em SQL, use o comando CREATE NOTEBOOK ou ALTER NOTEBOOK para definir a propriedade IDLE_AUTO_SHUTDOWN_TIME_SECONDS do notebook.

Execução de cargas de trabalho ML

Os Notebooks no Container Runtime for ML são adequados para executar cargas de trabalho ML, como treinamento de modelos e ajuste de parâmetros. Os tempos de execução vêm pré-instalados com pacotes ML comuns. Com a EAI definida, você pode instalar quaisquer outros pacotes necessários usando !pip install.

Nota

O processo Python armazena em cache os módulos carregados. Altere as versões dos pacotes instalados antes de importá-los no código. Caso contrário, talvez seja necessário desconectar-se e reconectar-se à sessão do notebook para atualizar a sessão.

Os exemplos a seguir mostram como usar algumas das bibliotecas disponíveis para sua carga de trabalho ML.

Usar bibliotecas OSS ML

O exemplo a seguir usa uma biblioteca OSS ML, xgboost, com uma sessão Snowpark ativa para buscar dados diretamente na memória para treinamento:

from snowflake.snowpark.context import get_active_session
import pandas as pd
import xgboost as xgb
from sklearn.model_selection import train_test_split

session = get_active_session()
df = session.table("my_dataset")
# Pull data into local memory
df_pd = df.to_pandas()
X = df_pd[['feature1', 'feature2']]
y = df_pd['label']
# Split data into test and train in memory
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15, random_state=34)
# Train in memory
model = xgb.XGBClassifier()
model.fit(X_train, y_train)
# Predict
y_pred = model.predict(X_test)
Copy

Use APIs de modelagem de ML do Snowflake

Quando as APIs de modelagem de ML do Snowflake são usadas no Container Runtime for ML, toda a execução (incluindo treinamento e previsão) acontece diretamente no Container Runtime em vez de no warehouse de consulta. O Snowflake ML no Container Runtime pode extrair dados mais rapidamente e é recomendado para treinamento em larga escala. Com o tempo de execução de GPU, o Snowflake ML usará por padrão todas as GPUs para acelerar o treinamento.

O exemplo de bloco de código a seguir usa XGBoost para modelagem:

from snowflake.snowpark.context import get_active_session
from snowflake.ml.modeling.xgboost import XGBClassifier
from snowflake.ml.modeling.metrics import accuracy_score

session = get_active_session()
df = session.table("my_dataset")
feature_cols=['FEATURE1', 'FEATURE2']
label_col = 'LABEL'
predicted_col = [PREDICTED_LABEL]
df = df[features_cols + [label_col]]
# Split is pushed down to associated warehouse
train_df, test_df = df.random_split(weights=[0.85, 0.15], seed=34)

model = XGBClassifier(
    input_cols=feature_cols,
    label_cols=label_col,
    output_cols=predicted_col,
    # This will enable leveraging all GPUs on the node
    tree_method="gpu_hist",
)
# Train
model.fit(train_df)
# Predict
result = model.predict(test_df)

accuracy = accuracy_score(
df=result,
y_true_col_names=label_cols,
y_pred_col_names=predicted_col)
Copy

O seguinte é um exemplo usando a Light Gradient Boosting Machine (LightGBM):

from snowflake.snowpark.context import get_active_session
from snowflake.ml.modeling.lightgbm import LGBMClassifier
from snowflake.ml.modeling.metrics import accuracy_score

session = get_active_session()
df = session.table("my_dataset")
feature_cols=['FEATURE1', 'FEATURE2']
label_col = 'LABEL'
predicted_col = [PREDICTED_LABEL]

df = df[features_cols + [label_col]]
# Split is pushed down to associated warehouse
train_df, test_df = df.random_split(weights=[0.85, 0.15], seed=34)

model = LGBMClassifier(
    input_cols=feature_cols,
    label_cols=label_col,
    ouput_cols=predicted_col,
    # This will enable leveraging all GPUs on the node
    device_type="gpu",
)

# Train
model.fit(train_df)
# Predict
result = model.predict(test_df)

accuracy = accuracy_score(
df=result,
y_true_col_names=label_cols,
y_pred_col_names=predicted_col)
Copy

Usar novas bibliotecas otimizadas para contêineres

O Container Runtime for ML pré-instala APIs novas e adaptadas especificamente para treinamento ML no ambiente de contêiner.

APIs de conectores de dados

APIs de conectores de dados fornecem uma interface única para conectar fontes de dados do Snowflake (incluindo tabelas, DataFrames e conjuntos de dados) a estruturas de ML populares (como PyTorch e TensorFlow). Essas APIs são encontradas no namespace snowflake.ml.data.

snowflake.ml.data.data_connector.DataConnector

Conecta Snowpark DataFrames ou Conjuntos de dados de ML do Snowflake a TensorFlow ou PyTorch DataSets ou Pandas DataFrames. Instancie um conector usando um dos seguintes métodos de classe:

  • DataConnector.from_dataframe: Aceita um Snowpark DataFrame.

  • DataConnector.from_dataset: aceita um conjunto de dados de ML do Snowflake, especificado por nome e versão.

  • DataConnector.from_sources: aceita uma lista de fontes, cada uma das quais pode ser um DataFrame ou um conjunto de dados.

Depois de instanciar o conector (chamando a instância, por exemplo, data_connector), chame os métodos a seguir para produzir o tipo desejado de saída.

  • data_connector.to_tf_dataset: retorna um conjunto de dados TensorFlow adequado para uso com TensorFlow.

  • data_connector.to_torch_dataset: retorna um conjunto de dados PyTorch adequado para uso com PyTorch.

Para mais informações sobre essas APIs, consulte a referência API de ML do Snowflake.

APIs de modelagem distribuída

As APIs de modelagem distribuída fornecem versões paralelas do LightGBM, PyTorch eXGBoost que aproveitam ao máximo os recursos disponíveis no ambiente de contêiner. Elas são encontradas no namespace snowflake.ml.modeling.distributors. As APIs das classes distribuídas são semelhantes às das versões padrão.

Para mais informações sobre essas APIs, consulte a Referência de API.

XGBoost

A classe primária do XGBoost é snowflake.ml.modeling.distributors.xgboost.XGBEstimator. As classes relacionadas incluem:

  • snowflake.ml.modeling.distributors.xgboost.XGBScalingConfig

Para um exemplo de como trabalhar com essa API, consulte o notebook de exemplo XGBoost em GPU no repositório GitHub do Snowflake Container Runtime for ML.

LightGBM

A classe primária do LightGBM é snowflake.ml.modeling.distributors.lightgbm.LightGBMEstimator. As classes relacionadas incluem:

  • snowflake.ml.modeling.distributors.lightgbm.LightGBMScalingConfig

Para um exemplo de como trabalhar com essa API, consulte o notebook de exemplo LightGBM em GPU no repositório GitHub do Snowflake Container Runtime for ML.

PyTorch

A classe primária do PyTorch é snowflake.ml.modeling.distributors.pytorch.PyTorchDistributor. As classes relacionadas incluem:

  • snowflake.ml.modeling.distributors.pytorch.WorkerResourceConfig

  • snowflake.ml.modeling.distributors.pytorch.PyTorchScalingConfig

  • snowflake.ml.modeling.distributors.pytorch.Context

  • snowflake.ml.modeling.distributors.pytorch.get_context

Para um exemplo de como trabalhar com essa API, consulte o notebook de exemplo PyTorch em GPU no repositório GitHub do Snowflake Container Runtime for ML.

Limitações

  • A API Snowflake ML Modeling aceita apenas métodos de inferência predict, predict_proba, predict_log_proba no Container Runtime for ML. Outros métodos são executados no warehouse de consulta.

  • A API Snowflake ML Modeling aceita apenas pipelines compatíveis com sklearn no Container Runtime.

  • A API Snowflake ML Modeling não aceita as classes preprocessing ou metrics no Container Runtime for ML. Elas são executadas no warehouse de consulta.

  • Os métodos fit, predict e score são executados no Container Runtime for ML. Outros métodos de ML do Snowflake são executados no warehouse de consulta.

  • sample_weight_cols não é aceito para modelos do XGBoost ou LightGBM.

Considerações sobre custos/faturamento

Ao executar notebooks no Container Runtime for ML, você pode incorrer em custos de computação de warehouse e computação do SPCS.

O Snowflake Notebooks exige um warehouse virtual para executar consultas SQL e do Snowpark para um desempenho otimizado. Portanto, você também pode incorrer em custos de computação de warehouse virtual se usar SQL em células SQL e consultas push-down do Snowpark executadas em células Python. O diagrama a seguir mostra onde a computação acontece para cada tipo de célula.

Diagrama mostrando a distribuição de computação das células do notebook.

Por exemplo, o exemplo Python a seguir usa a biblioteca xgboost Os dados são puxados para o contêiner e a computação ocorre no Snowpark Container Services:

from snowflake.snowpark.context import get_active_session
import pandas as pd
import xgboost as xgb
from sklearn.model_selection import train_test_split

session = get_active_session()
df = session.table("my_dataset")
# Pull data into local memory
df_pd = df.to_pandas()
X = df_pd[['feature1', 'feature2']]
y = df_pd['label']
# Split data into test and train in memory
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15, random_state=34)
Copy

Para saber mais sobre custos de warehouse, consulte Visão geral de warehouses e Recomendações de warehouse para execução dos notebooks Snowflake.