Criar um aplicativo de treinamento em Python para um contêiner pré-criado

Antes de realizar o treinamento personalizado com um contêiner pré-criado, é necessário criar uma Distribuição de origem em Python que contém o aplicativo de treinamento e fazer upload dele em um bucket do Cloud Storage que o projeto do Google Cloud possa acessar.

Alternativas à criação de uma distribuição de origem

Neste guia, você verá como criar manualmente uma distribuição de origem e fazer o upload dela para o Cloud Storage. Antes de seguir o guia, considere os fluxos de trabalho alternativos a seguir, que podem ser mais convenientes para alguns casos:

Se nenhuma das opções anteriores for adequada ao seu caso de uso ou se você quiser empacotar manualmente o aplicativo de treinamento como distribuição de origem, siga o restante deste guia.

Antes de começar

Antes de preparar o aplicativo de treinamento para ser executado na nuvem, conclua as etapas a seguir:

  1. Desenvolva um aplicativo de treinamento usando um framework de machine learning (ML) disponível em um dos contêineres de treinamento pré-criados da Vertex AI. Certifique-se de que o aplicativo de treinamento atenda aos requisitos de código de treinamento.

    Se você estiver programando o aplicativo de treinamento do zero, recomendamos organizar a programação de acordo com a estrutura do aplicativo descrita em uma seção posterior deste documento.

  2. Crie um bucket do Cloud Storage no mesmo projeto do Google Cloud em que você pretende usar a Vertex AI. Seu aplicativo de treinamento será armazenado nesse bucket. Embora seja possível usar um bucket em outro bucket do Google Cloud, isso exige configuração adicional fora do escopo deste guia.

    Para ter o melhor desempenho, verifique se o bucket do Cloud Storage está no local em que você pretende usar a Vertex AI.

  3. Conheça todas as bibliotecas de Python de que seu aplicativo de treinamento depende, sejam elas dependências personalizadas ou disponíveis gratuitamente por meio do PyPI.

Estrutura do aplicativo

Ao executar um treinamento personalizado usando um contêiner pré-criado, é preciso especificar seu código de treinamento de acordo com os seguintes requisitos:

  • Forneça o código como uma ou mais distribuições de origem do Python.

    Se você usar a API Vertex AI para iniciar o treinamento personalizado, especifique-a no campo packageUris.

  • Crie um módulo em uma dessas distribuições de origem que atue como o ponto de entrada para treinamento.

    Se você usar a API Vertex AI para iniciar o treinamento personalizado, especifique-a no campo pythonModule.

Enquanto atender a esses requisitos, você poderá estruturar seu aplicativo de treinamento da maneira que preferir. No entanto, recomendamos que você crie uma única distribuição de fonte do Python organizando o código na seguinte estrutura (usada com frequência em amostras da Vertex AI):

  • Use um diretório principal do projeto, contendo o arquivo setup.py. Consulte a seção a seguir para ver orientações sobre o conteúdo desse arquivo.

  • No diretório principal do projeto, crie um subdiretório chamado trainer/ que sirva como o pacote principal para o código de treinamento.

  • Em trainer/, crie um módulo chamado task.py que serve como ponto de entrada para seu código de treinamento.

  • Para oferecer suporte a trainer/task.py, crie quaisquer módulos Python adicionais que você quiser no pacote trainer/ e crie qualquer subdiretório adicional com esse código adicional que você quer no diretório principal do projeto.

  • Crie um arquivo __init__.py em cada subdiretório para torná-lo um pacote.

No restante deste guia, consideramos que seu código está organizado de acordo com essa estrutura.

Criar uma distribuição de origem

A criação de distribuições de origem em Python é um assunto amplo que ultrapassa muito o escopo desta documentação. Nesta seção, você encontra uma visão geral do uso do Setuptools (em inglês) para criar uma distribuição de origem para uso com a Vertex AI. Há outras bibliotecas que podem ser usadas para fazer o mesmo.

  1. Crie um arquivo setup.py que diga ao Setuptools como criar a distribuição de origem. Um setup.py básico inclui:

    • Importe instruções para setuptools.find_packages e setuptools.setup.

    • uma chamada a setuptools.setup com, no mínimo, estes parâmetros definidos:

      • name é definido como o nome da sua distribuição de origem.

      • version definido como o número da versão deste build da distribuição de origem.

      • install_requires definido como uma lista de dependências exigidas pelo aplicativo, com requisitos de versão, como 'docutils>=0.3';

      • packages definido como find_packages(). Isso informa ao Setuptools para incluir todos os subdiretórios do diretório pai que contêm um arquivo __init__.py como pacotes.

      • include_package_data definido como True.

    No exemplo a seguir, mostramos um arquivo setup.py básico para um aplicativo de treinamento:

    from setuptools import find_packages
    from setuptools import setup
    
    setup(
        name='trainer',
        version='0.1',
        packages=find_packages(),
        include_package_data=True,
        description='My training application.'
    )
    
  2. Execute o seguinte comando para criar uma distribuição de origem, dist/trainer-0.1.tar.gz:

    python setup.py sdist --formats=gztar
    

Dependências de aplicativos Python

Dependências são pacotes que você importa no código. O aplicativo pode precisar de muitas dependências para funcionar.

Para cada réplica no job de treinamento personalizado, o código é executado em um contêiner com muitas dependências comuns do Python já instaladas. Verifique as dependências incluídas no contêiner pré-criado que você planeja usar para treinamento e observe quais dependências ainda não estão instaladas. Você só precisa concluir as etapas a seguir para as dependências que ainda não estiverem instaladas no contêiner pré-criado.

Há dois tipos de dependências que talvez seja necessário adicionar:

  • Dependências padrão, pacotes comuns em distribuições disponíveis PyPI (em inglês).
  • Dependências personalizadas, como as que você desenvolve ou que são internas de uma organização.

Nas seções abaixo, descrevemos os procedimentos para cada tipo.

Dependências padrão (PyPI)

É possível especificar as dependências padrão do pacote como parte do script setup.py correspondente. A Vertex AI usa pip para instalar o aplicativo de treinamento nas réplicas alocadas para o job. O comando pip install procura e instala dependências configuradas.

O exemplo a seguir mostra um setup.py semelhante ao de uma seção anterior. No entanto, esse setup.py orienta a Vertex AI a instalar some_PyPI_package ao instalar o aplicativo de treinamento:

from setuptools import find_packages
from setuptools import setup

REQUIRED_PACKAGES = ['some_PyPI_package>=1.0']

setup(
    name='trainer',
    version='0.1',
    install_requires=REQUIRED_PACKAGES,
    packages=find_packages(),
    include_package_data=True,
    description='My training application.'
)

Dependências personalizadas

Para especificar as dependências personalizadas do aplicativo, passe os caminhos correspondentes como parte da configuração do job. Você precisa do URI da distribuição de origem de cada dependência. As dependências personalizadas precisam estar em um local do Cloud Storage. A Vertex AI usa pip install para instalar dependências personalizadas. Assim, elas podem ter dependências padrão próprias nos scripts setup.py.

Cada URI incluído é o caminho para uma distribuição de origem, formatado como um tarball (.tar.gz) ou como uma roda (.whl). A Vertex AI instala cada dependência usando pip install em cada réplica alocada para o job de treinamento.

Se você usar a API Vertex AI para iniciar o treinamento personalizado, especifique os URIs do Cloud Storage para essas dependências junto do aplicativo de treinamento no campo packageUris.

Módulos Python

O aplicativo pode conter vários módulos (arquivos Python). É preciso identificar aquele que contém o ponto de entrada do aplicativo. O serviço de treinamento executa esse módulo invocando o Python, do mesmo modo que você o executaria localmente.

Por exemplo, se você seguir a estrutura recomendada de uma seção anterior, seu módulo principal será task.py. Como ele está dentro de um pacote de importação (diretório com um arquivo __init__.py) denominado trainer, o nome totalmente qualificado deste módulo é trainer.task. Se você usar a API Vertex AI para iniciar o treinamento personalizado, defina o campo moduleName como trainer.task.

Consulte o Guia Python para pacotes (em inglês) para ver mais informações sobre módulos.

Fazer upload da distribuição de origem para o Cloud Storage

Você pode usar a CLI gcloud para fazer upload da origem e das dependências personalizadas para um bucket do Cloud Storage. Exemplo:

gcloud storage cp dist/trainer-0.1.tar.gz CLOUD_STORAGE_DIRECTORY

Substitua CLOUD_STORAGE_DIRECTORY pelo URI (começando com gs:// e terminando por /) de um diretório do Cloud Storage em um bucket que seu projeto do Google Cloud possa acessar.

Para saber mais sobre outras maneiras de fazer upload da distribuição de origem para o Cloud Storage, leia Como fazer upload de objetos na documentação do Cloud Storage.

A seguir