Snowflake ML Jobs¶
Use o Snowflake ML Jobs para executar fluxos de trabalho de aprendizado de máquina (ML) dentro dos tempos de execução do contêiner do Snowflake ML. Você pode executá-los em qualquer ambiente de desenvolvimento. Você não precisa executar o código em uma planilha ou notebook do Snowflake. Use os trabalhos para aproveitar a infraestrutura do Snowflake para executar tarefas com uso intensivo de recursos no seu fluxo de trabalho de desenvolvimento. Para obter informações sobre como configurar o Snowflake ML localmente, consulte Como usar o Snowflake ML localmente.
Importante
Os trabalhos de ML do Snowflake estão disponíveis em snowflake-ml-python versão 1.9.2 e posterior.
O Snowflake ML Jobs permite que você faça o seguinte:
Executar cargas de trabalho de ML no Snowflake Compute Pools, incluindo instâncias da GPU e de alta memória da CPU.
Usar seu ambiente de desenvolvimento preferido, como VS Code ou Jupyter notebooks.
Instale e use pacotes Python personalizados em seu ambiente de tempo de execução.
Usar APIs distribuídas do Snowflake para otimizar o carregamento de dados, o treinamento e o ajuste de hiperparâmetros.
Integre-se com ferramentas de orquestração, como o Apache Airflow.
Monitorar e gerenciar trabalhos por meio de APIs do Snowflake.
Você pode usar esses recursos para fazer o seguinte:
Executar treinamento com uso intensivo de recursos em grandes conjuntos de dados que exigem aceleração de GPU ou recursos de computação significativos.
Produzir os fluxos de trabalho de ML movendo o código de ML do desenvolvimento para a produção com execução programática por meio de pipelines.
Manter seu ambiente de desenvolvimento existente e usar os recursos de computação do Snowflake.
Suspender e mudar os fluxos de trabalho de OSS ML com alterações mínimas no código.
Trabalhar diretamente com grandes conjuntos de dados do Snowflake para reduzir a movimentação de dados e evitar transferências de dados de alto custo.
Pré-requisitos¶
Instale o pacote Snowflake ML Python em seu ambiente Python 3.10.
O tamanho padrão do pool de computação usa a família de instâncias CPU_X64_S. O número mínimo de nós é 1 e o máximo é 25. Você pode usar o seguinte comando SQL para criar um pool de computação personalizado:
O Snowflake ML Jobs requer uma sessão do Snowpark. Use o código a seguir para criá-la:
Para obter informações sobre como criar uma sessão, consulte Como criar uma sessão.
Executar um trabalho do Snowflake ML Job¶
Você pode executar um Snowflake ML Job de uma das seguintes maneiras:
Usando um decorador de função no seu código.
Enviando arquivos ou diretórios inteiros usando a Python API.
Execução de uma função Python como trabalho de ML do Snowflake¶
Use o Function Dispatch para executar funções Python individuais remotamente nos recursos de computação do Snowflake com o decorador @remote.
Usando @remote, você pode:
Serializar a função e suas dependências.
Carregá-lo em um estágio específico do Snowflake.
Executá-lo em um Container Runtime específico.
O código Python de exemplo a seguir usa o decorador @remote para carregar uma chamada de função como um trabalho de ML do Snowflake:
Nota
O envio de um trabalho requer um Snowpark Session existente; consulte Pré-requisitos para obter detalhes.
Invocar uma função decorada @remote retorna um objeto Snowflake MLJob que pode ser usado para gerenciar e monitorar a execução do trabalho. Para obter mais informações, consulte Gerenciamento de trabalhos de ML.
Executar um arquivo Python como um Snowflake ML Job¶
Execute arquivos Python ou diretórios de projeto nos recursos de computação do Snowflake. Isso é útil quando:
Você tem projetos de ML complexos com vários módulos e dependências.
Você deseja manter a separação entre o desenvolvimento local e o código de produção.
Você precisa executar scripts que usam argumentos de linha de comando.
Você está trabalhando com projetos existentes de ML que não foram projetados especificamente para execução na computação do Snowflake.
A API de trabalho do Snowflake oferece três métodos principais para enviar cargas úteis baseadas em arquivos:
submit_file(): para executar arquivos Python individuaissubmit_directory(): para executar projetos Python que abrangem vários arquivos e recursossubmit_from_stage(): para executar projetos Python salvos em uma área de preparação do Snowflake
Ambos os métodos são compatíveis com:
Passagem de argumentos na linha de comando
Configuração de variáveis de ambiente
Especificação de dependências personalizadas
Gerenciamento de ativos de projeto por meio dos estágios do Snowflake
O File Dispatch é particularmente útil para a produção de fluxos de trabalho de ML existentes e para manter uma separação clara entre os ambientes de desenvolvimento e de execução.
O seguinte código Python envia um arquivo como trabalho de ML do Snowflake:
O seguinte código Python envia um diretório como um trabalho de ML do Snowflake:
O seguinte código Python envia um diretório de um estágio Snowflake como um trabalho de ML do Snowflake:
O envio de um arquivo ou diretório retorna um objeto do Snowflake MLJob que pode ser usado para gerenciar e monitorar a execução do trabalho. Para obter mais informações, consulte Gerenciamento de trabalhos de ML.
Execute um trabalho de ML do Snowflake em um tempo de execução de contêiner específico¶
O decorador @remote, bem como as funções submit_directory(), submit_from_stage() e submit_file(), são compatíveis com a palavra-chave runtime_environment. Quando você não fornece essa palavra-chave no decorador ou na chamada de função, o Snowflake usa automaticamente a versão mais recente disponível do Snowflake Container Runtime em seu pool de computação.
Para especificar um tempo de execução de contêiner para seu trabalho de ML, use a palavra-chave runtime_environment com um valor de cadeia de caracteres da versão do Container Runtime a ser utilizada. Consulte as versões do Container Runtime para obter a lista completa de versões disponíveis e o que está contido nesses ambientes por padrão.
O exemplo a seguir mostra como fixar uma função com o decorador @remote na versão 2.3 do Snowflake Container Runtime:
Suporte a cargas úteis adicionais em envios¶
Ao enviar um arquivo, diretório ou de um estágio, cargas úteis adicionais são suportadas para uso durante a execução do trabalho. O caminho de importação pode ser especificado explicitamente; caso contrário, ele será inferido a partir do local da carga útil adicional.
Importante
Você só pode carregar arquivos Python individuais de uma área de preparação.
Acesso à Sessão de Snowpark em trabalhos de ML¶
Ao executar trabalhos de ML no Snowflake, uma Sessão de Snowpark fica automaticamente disponível no contexto de execução. Você pode acessar o objeto da sessão a partir da carga útil do seu trabalho de ML usando as seguintes abordagens:
A Sessão de Snowpark pode ser usada para acessar tabelas, estágios e outros objetos de banco de dados do Snowflake dentro do seu trabalho de ML.
Retorno de resultados de trabalhos de ML¶
Os trabalhos de ML do Snowflake oferecem suporte ao retorno dos resultados da execução ao ambiente do cliente. Isso permite que você recupere valores computados, modelos treinados ou quaisquer outros artefatos produzidos pelas cargas de trabalho.
Para despacho de função, basta retornar um valor de sua função decorada. O valor retornado será serializado e disponibilizado por meio do método result().
Para trabalhos baseados em arquivos, use a variável especial __return__ para especificar o valor de retorno.
Você pode recuperar o resultado da execução do trabalho usando a API MLJob.result(). A API bloqueia o thread de chamada até que o trabalho atinja um estado terminal, depois retorna o valor de retorno da carga útil ou, se a execução falhar, gera uma exceção. Se a carga útil não definir um valor de retorno, o resultado será None em caso de sucesso.
Definições de trabalhos de ML¶
Uma definição de trabalho de ML captura os componentes reutilizáveis de um trabalho de ML: localização da carga útil, pool de computação e configurações relacionadas. Isso permite que você envie vários trabalhos da mesma carga útil com argumentos diferentes sem precisar carregar a carga útil novamente.
Nota
As definições de trabalho de ML estão disponíveis na versão 1.26 e posteriores do snowflake-ml-python.
Para criar uma definição de trabalho de ML, use a classe MLJobDefinition.
A função register() aceita runtime_environment como um argumento de palavra-chave opcional para selecionar a imagem do contêiner que será executada no pool de computação selecionado. Por padrão, a definição do trabalho usa a versão mais recente disponível do Snowflake Container Runtime.
Para especificar um tempo de execução de contêiner para seu trabalho de ML, use a palavra-chave runtime_environment com um valor de cadeia de caracteres da versão do Container Runtime a ser utilizada. Consulte as versões do Container Runtime para obter a lista completa de versões disponíveis e o que está contido nesses ambientes por padrão.
Gerenciamento de trabalhos de ML¶
Quando você envia um trabalho de ML do Snowflake, a API cria uma instância MLJob. Você pode usá-la para fazer o seguinte:
Acompanhar o progresso do trabalho por meio de atualizações de status
Depurar problemas usando logs de execução detalhados
Recuperar o resultado da execução (se houver)
Você pode usar a API get_job() para recuperar um objeto MLJob pelo ID. O código Python a seguir mostra como recuperar um objeto MLJob:
Gerenciamento de dependências¶
A API de trabalho de ML do Snowflake executa payloads dentro do ambiente Snowflake Container Runtime. O ambiente tem os pacotes Python mais utilizados para machine learning e ciência de dados. A maioria dos casos de uso deve funcionar «pronta para uso», sem configuração adicional. Se você precisar de dependências personalizadas, poderá usar o pip_requirements para instalá-las.
Para instalar dependências personalizadas, você deve habilitar o acesso à rede externa usando uma Integração de acesso externo. Você pode usar o seguinte comando de exemplo SQL para fornecer acesso:
Para obter mais informações sobre integrações de acesso externo, consulte Criação e uso de uma integração de acesso externo.
Depois de fornecer acesso à rede externa, você pode usar os parâmetros pip_requirements e external_access_integrations para configurar dependências personalizadas. Você pode usar pacotes que não estão disponíveis no ambiente do Container Runtime ou se tiver versões específicas dos pacotes.
O código Python a seguir mostra como especificar dependências personalizadas para o decorador remote:
O código Python a seguir mostra como especificar dependências personalizadas para o método submit_file():
Feeds de pacotes privados¶
O Snowflake ML Jobs também oferece suporte ao carregamento de pacotes de feeds privados, como o JFrog Artifactory e o Sonatype Nexus Repository. Esses feeds são normalmente usados para distribuir pacotes internos e proprietários, manter o controle sobre as versões de dependência e garantir a segurança/conformidade.
Para instalar pacotes de um feed privado, você deve fazer o seguinte:
Criar uma regra de rede para permitir o acesso ao URL do feed privado.
Para fontes que usam autenticação básica, você pode simplesmente criar uma regra de rede.
Para configurar o acesso a uma fonte usando conectividade privada (ou seja, Private Link), siga as etapas em Saída da rede usando conectividade privada.
Criar uma integração de acesso externo usando a regra de rede. Conceder permissão para usar EAI à função que enviará os trabalhos.
Especificar o URL do feed privado, a Integração de acesso externo e o(s) pacote(s) ao enviar o trabalho
Se seu feed URL privado contém informações confidenciais como tokens de autenticação, gerencie o URL criando um segredo do Snowflake. Execute CREATE SECRET para criar um segredo. Configuração de segredos durante o envio do trabalho com o argumento spec_overrides.
Para obter mais informações sobre o container.secrets, consulte Campo containers.secrets.
Exemplos¶
Consulte `Amostras de código de trabalho de ML<https://github.com/Snowflake-Labs/sf-samples/tree/main/samples/ml/ml_jobs>`_ para exemplos de como usar trabalhos de ML do Snowflake.
Considerações sobre custo¶
Os Snowflake ML Jobs são executados no Snowpark Container Services e são cobrados com base no uso. Para obter informações sobre os custos de computação, consulte Custos do Snowpark Container Services.
As cargas úteis do trabalho são carregadas no estágio especificado com o argumento stage_name. Para evitar cobranças adicionais, você deve limpá-las. Para obter mais informações, consulte Explicação do custo de armazenamento e Exploração do custo de armazenamento para saber mais sobre os custos associados ao armazenamento em estágios.