Como treinar com uma conta de serviço personalizada

É possível configurar o AI Platform Training para usar uma conta de serviço de sua escolha ao executar seu aplicativo de treinamento. Com uma conta de serviço personalizada, é possível personalizar quais recursos do Google Cloud seu código de treinamento pode acessar sem conceder permissões excessivamente amplas à conta de serviço que o AI Platform Training usa por padrão. Além disso, é possível usar uma conta de serviço personalizada para conceder ao seu código acesso a outros serviços do Google Cloud, como o Secret Manager.

O guia se concentra nas permissões dos recursos do AI Platform Training para acessar outros recursos do Google Cloud. Para saber mais sobre as permissões necessárias para acessar os recursos do AI Platform Training, leia Controle de acesso.

Noções básicas sobre o agente de serviço

Por padrão, o AI Platform Training usa agente de serviço para e executar jobs de treinamento. Esse agente de serviço é identificado por um endereço de e-mail com o formato:

service-PROJECT_NUMBER@cloud-ml.google.com.iam.gserviceaccount.com

PROJECT_NUMBER é substituído pelo número do projeto do seu projeto do Google Cloud.

Encontre a conta de serviço correspondente ao seu projeto no console do Google Cloud ou usando a Google Cloud CLI:

Console do Google Cloud

Acesse a página IAM no console Google do Cloud, selecione Incluir concessões de papéis fornecidas pelo Google e encontre o principal que corresponde ao endereço de e-mail descrito anteriormente nesta seção. A conta de serviço também tem o nome Google Cloud ML Engine Service Agent.

Acessar a página "IAM"

gcloud

Execute o seguinte comando em um ambiente Shell em que você inicializou a CLI gcloud:

gcloud projects get-iam-policy PROJECT_ID \
  --flatten="bindings[].members" \
  --format="table(bindings.members)" \
  --filter="bindings.role:roles/ml.serviceAgent" \
  | grep serviceAccount:

Substitua PROJECT_ID pelo ID do projeto do Google Cloud.

Esse comando gera o seguinte:

serviceAccount:GOOGLE_MANAGED_SERVICE_ACCOUNT

GOOGLE_MANAGED_SERVICE_ACCOUNT é o endereço de e-mail do agente de serviço do AI Platform do projeto.

Esse agente de serviço tem permissões apropriadas para a maioria dos jobs de treinamento. Por exemplo, ela pode ler e gravar em buckets do Cloud Storage no mesmo projeto do Google Cloud.

Se você precisar que seus aplicativos de treinamento sejam executados com outras permissões, atribua outros papéis de gerenciamento de identidade e acesso (IAM, na sigla em inglês) a essa conta de serviço. Por exemplo, é possível conceder acesso a buckets do Cloud Storage em outros projetos do Google Cloud.

Como usar uma conta de serviço personalizada

Se você quiser conceder ou limitar as permissões do Google Cloud para um job de treinamento específico, use uma conta de serviço personalizada em vez do agente de serviço.

Para fazer isso, primeiro configure uma conta de serviço personalizada. Em seguida, especifique a conta de serviço personalizada ao criar um job de treinamento.

Configurar uma conta de serviço personalizada

Para configurar uma conta de serviço personalizada, faça o seguinte:

  1. Crie uma conta de serviço gerenciada pelo usuário.

  2. Conceda os novos papéis do IAM da conta de serviço para fornecer ao aplicativo de treinamento as permissões necessárias quando for executado.

  3. Se a conta de serviço gerenciada pelo usuário estiver em um projeto diferente dos jobs de treinamento, configure a conta de serviço gerenciada pelo usuário para que seja possível anexá-la aos jobs de treinamento.

Especificar a conta de serviço personalizada para o job de treinamento

Para configurar o AI Platform Training para usar sua conta de serviço personalizada ao executar o aplicativo de treinamento, especifique o campo trainingInput.serviceAccount ao criar um job de treinamento.

Se você usar a CLI gcloud para criar um job de treinamento, vai precisar de um arquivo config.yaml para especificar esse campo. Exemplo:

trainingInput:
  serviceAccount: CUSTOM_SERVICE_ACCOUNT

Substitua CUSTOM_SERVICE_ACCOUNT pelo endereço de e-mail da conta de serviço gerenciada pelo usuário que você configurou em uma seção anterior deste guia.

Como acessar serviços do Google Cloud a partir do código de treinamento

No código de treinamento, se você quiser acessar outros serviços do Google Cloud no job de treinamento, use o Application Default Credentials (ADC). Muitas bibliotecas de cliente do Google Cloud autenticam com o ADC por padrão. Você não precisa configurar nenhuma variável de ambiente. O AI Platform Training configura automaticamente o ADC para se autenticar como a conta de serviço personalizada que você especificou na etapa anterior.

No entanto, quando você usa uma biblioteca de cliente do Google Cloud em seu código de treinamento, ela pode não se conectar ao projeto correto do Google Cloud por padrão. Se os registros de treinamento relatam erros de permissão, isso pode ser o problema. Quando você cria um job de treinamento, o AI Platform Training não executa o código de treinamento diretamente no projeto do Google Cloud; o AI Platform Training executa seu código em um projeto separado gerenciado pelo Google. O AI Platform Training usa esse projeto exclusivamente para operações relacionadas ao seu projeto. Portanto, não tente inferir um ID do projeto do ambiente no código de treinamento. Especifique os IDs do projeto explicitamente.

Se você não quiser fixar um ID de projeto no código de treinamento, consulte a variável de ambiente CLOUD_ML_PROJECT_ID. O AI Platform Training define essa variável de ambiente em cada contêiner de treinamento para conter o número do projeto em que você iniciou o treinamento personalizado. Muitas ferramentas do Google Cloud aceitam um número de projeto sempre que recebem um ID do projeto.

Por exemplo, considere executar um job de treinamento em um projeto do Google Cloud com o ID PROJECT_ID. Se você quiser usar o cliente Python para o Google BigQuery para acessar uma tabela do BigQuery no mesmo projeto, não tente inferir o projeto no código de treinamento:

Seleção de projeto implícita

from google.cloud import bigquery

client = bigquery.Client()

Em vez disso, use um código que selecione explicitamente um projeto:

Seleção explícita do projeto

from google.cloud import bigquery

project_number = os.environ["CLOUD_ML_PROJECT_ID"]

client = bigquery.Client(project=project_number)

A seguir