a Vertex AI cria um notebook seguro gerenciado pelo usuário

1. Introdução

Com as instâncias de notebooks gerenciados pelo usuário do Vertex AI Workbench, é possível criar e gerenciar instâncias de máquina virtual (VM) de aprendizado profundo pré-empacotadas com o JupyterLab.

As instâncias de notebooks gerenciados pelo usuário têm um conjunto pré-instalado de pacotes de aprendizado profundo, incluindo suporte para os frameworks TensorFlow e PyTorch. É possível configurar instâncias ativadas para GPU ou somente CPU.

O que você vai criar

Este tutorial descreve o processo de implantação de um notebook gerenciado pelo usuário seguro com base nas práticas recomendadas de rede e segurança. As etapas envolvidas são:

  1. Criar uma VPC
  2. Criar um Cloud Router e o Cloud NAT
  3. Configure a instância de notebook com as configurações de segurança adequadas

Este tutorial fornece instruções detalhadas para cada etapa. Ele também inclui dicas e práticas recomendadas para proteger notebooks gerenciados pelo usuário. A Figura 1 é uma ilustração da implantação usando uma VPC independente.

Figura 1.

2292244ba0b11f71.png

O que você vai aprender

  • Como determinar se uma VPC compartilhada ou independente é adequada para sua organização
  • Como criar uma VPC independente
  • Como criar um Cloud Router e o Cloud NAT
  • Como criar um notebook gerenciado pelo usuário
  • Como acessar um notebook gerenciado pelo usuário
  • Como monitorar a integridade dos notebooks gerenciados pelo usuário
  • Como criar e aplicar uma programação de instâncias

O que é necessário

  • Projeto do Google Cloud

Permissões IAM

2. Rede VPC

Pense em uma rede VPC da mesma forma que pensaria em uma rede física, só que virtualizada no Google Cloud. Uma rede VPC é um recurso global que consiste em sub-redes regionais. As redes VPC são isoladas logicamente umas das outras no Google Cloud.

VPC independente

A Figura 2 é um exemplo de uma VPC global independente que consiste em uma sub-rede regional (us-central1), além do Cloud Router e do Cloud NAT usados para permitir que o notebook gerenciado pelo usuário estabeleça conectividade com a Internet de maneira segura.

Figura 2.

2292244ba0b11f71.png

VPC compartilhada

A VPC compartilhada permite exportar sub-redes de uma rede VPC em um projeto host para projetos de serviço na mesma organização. O projeto host contém recursos de rede compartilhados com o projeto de serviço, como sub-redes, Cloud NAT e regras de firewall. O projeto de serviço contém recursos no nível do aplicativo que aproveitam os recursos de rede no projeto host.

A Figura 3 é uma ilustração de uma VPC compartilhada global, em que a infraestrutura de rede e segurança é implantada no projeto host, enquanto as cargas de trabalho são implantadas no projeto de serviço.

Figura 3.

1354a9323c8e5787.png

VPC independente x VPC compartilhada

Uma única rede VPC é suficiente para muitos casos de uso simples, já que é mais fácil de criar, manter e entender do que alternativas mais complexas. A VPC compartilhada é uma ferramenta eficaz para organizações com várias equipes, já que permite estender a simplicidade arquitetônica de uma única rede VPC em vários grupos de trabalho usando projetos de serviço.

Prática recomendada de VPC usada no tutorial

  • Ative o Cloud NAT para acessar o notebook.
  • Ative o Acesso privado do Google ao criar sub-redes.
  • Crie regras de firewall prescritivas para reduzir o tráfego não solicitado. Por exemplo, não use 0.0.0.0/0 tcp. Em vez disso, defina os endereços IP exatos de sub-redes ou hosts.
  • Use políticas de firewall para ampliar o escopo das regras de entrada, por exemplo, geolocalizações, listas de inteligência contra ameaças, nomes de domínio de origem etc.

3. Práticas recomendadas para notebooks

Dimensionar as instâncias corretamente

  • Parar e/ou excluir instâncias não utilizadas
  • Use uma instância inicial menor e itere com dados de amostra menores
  • Escalonar verticalmente as instâncias conforme necessário
  • Teste com conjuntos de dados menores

Selecionar os tipos de máquina certos

  • VMs otimizadas para custo
  • Faça melhor uso dos recursos de hardware para reduzir custos
  • Economia de até 31% em comparação com o N1
  • Economia adicional (20 a 50%) para compromissos de 1 ou 3 anos
  • Aumentar o tamanho da máquina ou adicionar GPUs pode ajudar no desempenho e na superação de erros de limitações de memória.

Programar o encerramento das instâncias

  • Desativar instâncias quando elas estiverem ociosas (pagar apenas pelo armazenamento em disco)
  • Programar instâncias de VM de notebook para serem desligadas e iniciadas automaticamente em horários específicos

Monitorar o status de integridade do notebook

Considerações sobre segurança

Estas são as considerações de segurança recomendadas ao criar um notebook gerenciado pelo usuário:

  • Selecione a opção de acesso ao notebook "somente para um usuário". Se o usuário especificado não for o criador da instância, conceda a ele o papel de usuário da conta de serviço (roles/iam.serviceAccountUser) na conta de serviço da instância.
  • Desative as seguintes opções:
  • acesso root
  • nbconvert
  • download de arquivos da interface do JupyterLab
  • O Cloud NAT será usado em vez de atribuir um endereço IP externo ao notebook gerenciado pelo usuário.
  • Selecione as seguintes opções de computação:
  • Inicialização segura
  • Módulo de plataforma confiável e virtual (vTPM)
  • Monitoramento da integridade

4. Antes de começar

Atualizar o projeto para oferecer suporte ao tutorial

Este tutorial usa $variables para ajudar na implementação da configuração do gcloud no Cloud Shell.

No Cloud Shell, faça o seguinte:

gcloud config list project
gcloud config set project [your-project-name]
projectid=your-project-name
echo $projectid

5. Configuração da VPC

Criar a VPC independente

No Cloud Shell, faça o seguinte:

gcloud compute networks create securevertex-vpc --project=$projectid --subnet-mode=custom

Criar a sub-rede de notebooks gerenciados pelo usuário

No Cloud Shell, faça o seguinte:

gcloud compute networks subnets create securevertex-subnet-a --project=$projectid --range=10.10.10.0/28 --network=securevertex-vpc --region=us-central1 --enable-private-ip-google-access

Configuração do Cloud Router e do NAT

O Cloud NAT é usado no tutorial para downloads de pacotes de software de notebook porque a instância de notebook gerenciada pelo usuário não tem um endereço IP externo. O Cloud NAT também oferece recursos de NAT de saída, o que significa que os hosts da Internet não podem iniciar a comunicação com um notebook gerenciado pelo usuário, tornando-o mais seguro.

No Cloud Shell, crie o Cloud Router regional.

gcloud compute routers create cloud-router-us-central1 --network securevertex-vpc --region us-central1

No Cloud Shell, crie o gateway regional do Cloud NAT.

gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-us-central1 --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1

6. Criar um bucket de armazenamento

Os buckets de armazenamento oferecem upload/recuperação segura de arquivos. No tutorial, o armazenamento em nuvem vai conter um script de pós-inicialização para instalar pacotes de IA generativa nos notebooks gerenciados pelo usuário.

Crie um bucket do Cloud Storage e substitua BUCKET_NAME por um nome globalmente exclusivo de sua preferência.

No Cloud Shell, crie um bucket de armazenamento exclusivo.

gsutil mb -l us-central1 -b on gs://BUCKET_NAME

Armazene "BUCKET_NAME" durante o laboratório.

BUCKET_NAME=YOUR BUCKET NAME
echo $BUCKET_NAME

7. Criar um script pós-inicialização

Para ativar o download dos pacotes de IA generativa, crie um script de pós-inicialização no Cloud Shell usando o editor vi ou nano e salve-o como poststartup.sh.

#! /bin/bash
echo "Current user: id" >> /tmp/notebook_config.log 2>&1
echo "Changing dir to /home/jupyter" >> /tmp/notebook_config.log 2>&1
cd /home/jupyter
echo "Cloning generative-ai from github" >> /tmp/notebook_config.log 2>&1
su - jupyter -c "git clone https://github.com/GoogleCloudPlatform/generative-ai.git" >> /tmp/notebook_config.log 2>&1
echo "Current user: id" >> /tmp/notebook_config.log 2>&1
echo "Installing python packages" >> /tmp/notebook_config.log 2&1
su - jupyter -c "pip install --upgrade --no-warn-conflicts --no-warn-script-location --user \
     google-cloud-bigquery \
     google-cloud-pipeline-components \
     google-cloud-aiplatform \
     seaborn \
     kfp" >> /tmp/notebook_config.log 2>&1

Exemplo:

vpc_admin@cloudshell$ more poststartup.sh 
#! /bin/bash
echo "Current user: id" >> /tmp/notebook_config.log 2>&1
echo "Changing dir to /home/jupyter" >> /tmp/notebook_config.log 2>&1
cd /home/jupyter
echo "Cloning generative-ai from github" >> /tmp/notebook_config.log 2>&1
su - jupyter -c "git clone https://github.com/GoogleCloudPlatform/generative-ai.git" >> /tmp/notebook_config.log 2>&1
echo "Current user: id" >> /tmp/notebook_config.log 2>&1
echo "Installing python packages" >> /tmp/notebook_config.log 2&1
su - jupyter -c "pip install --upgrade --no-warn-conflicts --no-warn-script-location --user \
     google-cloud-bigquery \
     google-cloud-pipeline-components \
     google-cloud-aiplatform \
     seaborn \
     kfp" >> /tmp/notebook_config.log 2>&1

Faça upload do script pós-inicialização para o bucket de armazenamento do Cloud Shell usando gsutil.

gsutil cp poststartup.sh gs://$BUCKET_NAME

8. Criar uma conta de serviço

Para oferecer um controle refinado do notebook gerenciado pelo usuário, é necessária uma conta de serviço. Depois de geradas, as permissões da conta de serviço podem ser modificadas com base nos requisitos comerciais. No tutorial, a conta de serviço terá as seguintes regras aplicadas:

É necessário a API Service Account antes de continuar.

No Cloud Shell, crie a conta de serviço.

gcloud iam service-accounts create user-managed-notebook-sa \
    --display-name="user-managed-notebook-sa"

No Cloud Shell, atualize a conta de serviço com o papel Leitor de objetos do Storage.

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:user-managed-notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.objectViewer"

No Cloud Shell, atualize a conta de serviço com a função de usuário da Vertex AI.

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:user-managed-notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/aiplatform.user"

No Cloud Shell, liste a conta de serviço e anote o endereço de e-mail que será usado ao criar o notebook gerenciado pelo usuário.

gcloud iam service-accounts list

Exemplo:

$ gcloud iam service-accounts list
DISPLAY NAME: user-managed-notebook-sa
EMAIL: user-managed-notebook-sa@my-project-id.iam.gserviceaccount.com
DISABLED: False

9. Criar um notebook gerenciado pelo usuário seguro

Uma instância de notebooks gerenciados pelo usuário é uma instância de máquina virtual de aprendizado profundo com as mais recentes bibliotecas de aprendizado de máquina e ciência de dados pré-instaladas. Como opção, é possível incluir GPUs Nvidia para aceleração de hardware.

Ativar APIs de consumidor

a API Notebooks

Criar o notebook gerenciado pelo usuário

  1. Acesse Workbench
  2. Selecione "Notebooks gerenciados pelo usuário" e depois "Criar notebook". A página "Criar um notebook gerenciado pelo usuário" é aberta.
  3. Se um notebook já estiver implantado, selecione "Notebooks gerenciados pelo usuário" → "Novo notebook" → "Personalizar".
  4. Na página "Criar um notebook gerenciado pelo usuário", na seção "Detalhes", forneça as seguintes informações para a nova instância:
  • Nome: forneça um nome para a nova instância.
  • Região e zona: o tutorial usa a região us-central1 e a zona us-central1-a.

Escolha a opção Continuar.

  1. Na seção Ambiente, forneça as seguintes informações:
  • Sistema operacional: selecione o sistema operacional que você quer usar.
  • Selecione o ambiente que você quer usar.
  • Versão: selecione a versão que você quer usar.
  • Script de pós-inicialização (opcional,use o script de IA generativa criado anteriormente): clique em "Procurar" para selecionar um script a ser executado após a inicialização da instância.
  • Metadados: opcional: forneça chaves de metadados personalizadas para a instância.

Escolha a opção Continuar.

  1. Na seção "Tipo de máquina", forneça as seguintes informações:
  • Tipo de máquina: selecione o número de CPUs e a quantidade de RAM para a nova instância. O Vertex AI Workbench fornece estimativas de custo mensais para cada tipo de máquina selecionada.
  • Tipo de GPU: selecione o tipo e o número de GPUs para a nova instância. Para informações sobre as diferentes GPUs, consulte GPUs no Compute Engine.
  • Marque a caixa de seleção "Instalar automaticamente o driver da GPU NVIDIA".

VM protegida

  • Ativar a inicialização segura
  • Ativar o vTPM
  • Ativar o monitoramento de integridade

Escolha a opção Continuar.

  1. Na seção "Discos", forneça as seguintes informações:
  • Discos: opcional: para mudar as configurações padrão de inicialização ou disco de dados, selecione o tipo de disco de inicialização, o tamanho do disco de inicialização em GB, o tipo de disco de dados e o tamanho do disco de dados em GB que você quer. Para mais informações sobre tipos de disco, consulte Opções de armazenamento.
  • Excluir para a lixeira: opcional. Marque essa caixa de seleção para usar o comportamento padrão da lixeira do sistema operacional. Se você usar o comportamento padrão, os arquivos excluídos usando a interface do usuário do JupyterLab serão recuperados, mas os arquivos excluídos usarão o espaço em disco.
  • Backup (opcional): para sincronizar um local do Cloud Storage com o disco de dados da instância, selecione "Procurar" e especifique o local do Cloud Storage. Para saber mais sobre os custos de armazenamento, consulte Preços do Cloud Storage.
  • Criptografia: chave de criptografia gerenciada pelo Google

Escolha a opção Continuar.

  1. Na seção "Rede", forneça as seguintes informações:
  • Rede: selecione "Redes neste projeto" ou "Redes compartilhadas comigo". Se você estiver usando uma VPC compartilhada no projeto host, também será necessário conceder o papel de Usuário da rede do Compute (roles/compute.networkUser) ao Agente de serviço de notebooks no projeto de serviço.
  • No campo "Rede", selecione a rede desejada. O tutorial usa a rede securevertex-vpc. É possível selecionar uma rede VPC, desde que ela tenha o Acesso privado do Google ativado ou possa acessar a Internet. No campo "Sub-rede", selecione a sub-rede desejada. No tutorial, a sub-rede securevertex-subnet-a é usada.
  • Desmarque a opção "Atribuir endereço IP externo"
  • Selecione "Permitir acesso por proxy"

Escolha a opção Continuar.

81bb7dbe31fbf587.png

  1. Na seção "IAM e segurança", forneça o seguinte:
  • Selecione Usuário único e, no campo "E-mail do usuário", insira a conta de usuário a que você quer conceder acesso. Se o usuário especificado não for o criador da instância, conceda a ele o papel de usuário da conta de serviço (roles/iam.serviceAccountUser) na conta de serviço da instância.
  • Desmarque "Usar a conta de serviço padrão do Compute Engine na VM para chamar as APIs do Google Cloud".
  • Insira o endereço de e-mail da conta de serviço recém-criada. Exemplo: user-managed-notebook-sa@my-project-id.iam.gserviceaccount.com

Opções de segurança

  • Desmarque a opção "Ativar acesso raiz à instância"
  • Desmarque a opção "Ativar nbconvert"
  • Desmarque a opção "Ativar o download de arquivos pela interface do JupyterLab".
  • Ativar terminal (desmarque para ambientes de produção)

Escolha a opção Continuar.

e19f3cd05a2c1b7f.png

  1. Na seção "Integridade do sistema", forneça as seguintes informações:

Upgrade do ambiente e integridade do sistema

  • Marque a caixa de seleção "Ativar upgrade automático do ambiente".
  • Escolha se você quer fazer upgrade do notebook semanal ou mensal.

Em "Integridade e relatórios do sistema", marque ou desmarque as seguintes caixas de seleção:

  • Ativar relatório de integridade do sistema
  • Relatar métricas personalizadas para o Cloud Monitoring
  • Instalar agente do Cloud Monitoring

Selecione Criar.

10. Validação

O Vertex AI Workbench cria uma instância de notebooks gerenciados pelo usuário com base nas propriedades especificadas e a inicia automaticamente. Quando a instância estiver pronta para uso, o Vertex AI Workbench vai ativar um link Abrir JupyterLab que permite o acesso do usuário final ao notebook.

11. Observabilidade

Monitorar as métricas do sistema e do aplicativo com o Monitoring

Para instâncias de notebooks gerenciadas pelo usuário que têm o Monitoring instalado, é possível monitorar as métricas do sistema e do aplicativo usando o console do Google Cloud:

  1. No console do Google Cloud, acesse a página Notebooks gerenciados pelo usuário.
  2. Clique no nome da instância em que você quer ver as métricas do sistema e do aplicativo.
  3. Na página Detalhes do notebook, clique na guia Monitoramento. Analise as métricas do sistema e do aplicativo para a instância.

12. Criar uma programação de notebook

As programações de instâncias permitem iniciar e interromper instâncias de máquina virtual (VM) automaticamente. O uso de programações de instâncias para automatizar a implantação de instâncias de VM pode ajudar você a otimizar custos e gerenciar instâncias de VM com mais eficiência. É possível usar programações de instâncias para cargas de trabalho recorrentes e únicas. Por exemplo, use programações de instâncias para executar somente instâncias de VM durante o horário de trabalho ou para fornecer capacidade para um evento de uso único.

Para usar programações de instâncias, crie uma política de recursos que descreva o comportamento de início e parada e, em seguida, anexe a política a uma ou mais instâncias de VM.

O tutorial mostra como criar uma programação de instância que liga o notebook às 7h e desliga às 18h.

Para criar o cronograma de instâncias, você precisa das permissões compute.instances.start e compute.instances.stop. Por isso, recomendamos um papel personalizado criado pelo administrador concedido a você.

Depois de criado, o papel personalizado será atribuído à conta de serviço padrão do Compute Engine no projeto, o que permitirá que o cronograma de instâncias inicie e pare o notebook.

Criar uma função personalizada

No Cloud Shell, crie um papel personalizado, VmScheduler, e inclua as permissões necessárias.

gcloud iam roles create Vm_Scheduler --project=$projectid \
    --title=vm-scheduler-notebooks \
    --permissions="compute.instances.start,compute.instances.stop" --stage=ga

Descreva o papel personalizado no Cloud Shell.

gcloud iam roles describe Vm_Scheduler --project=$projectid

Exemplo:

$ gcloud iam roles describe Vm_Scheduler --project=$projectid
etag: BwX991B0_kg=
includedPermissions:
- compute.instances.start
- compute.instances.stop
name: projects/$projectid/roles/Vm_Scheduler
stage: GA
title: vm-scheduler-notebooks

Atualizar a conta de serviço padrão

Na seção a seguir, você vai identificar e atualizar a conta de serviço padrão, que tem o formato: PROJECT_NUMBER-compute@developer.gserviceaccount.com

No Cloud Shell, identifique o número do projeto atual.

gcloud projects list --filter=$projectid

No Cloud Shell, armazene o número do projeto como uma variável.

project_number=your_project_number
echo $project_number

No Cloud Shell, atualize a conta de serviço padrão do Compute com o papel personalizado, VM_Scheduler.

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:$project_number-compute@developer.gserviceaccount.com" --role="projects/$projectid/roles/Vm_Scheduler"

Criar a programação de instância

No Cloud Shell, crie o cronograma de início e interrupção.

gcloud compute resource-policies create instance-schedule optimize-notebooks \
    --region=us-central1 \
    --vm-start-schedule='0 7 * * *' \
    --vm-stop-schedule='0 18 * * *' \
        --timezone=America/Chicago

No Cloud Shell, armazene o nome do notebook.

gcloud compute instances list
notebook_vm=your_notebookvm_name
echo $notebook_vm

É possível anexar uma programação de instância a qualquer instância de VM atual localizada na mesma região da programação.

No Cloud Shell, associe a programação ao notebook.

gcloud compute instances add-resource-policies $notebook_vm \
--resource-policies=optimize-notebooks \
--zone=us-central1-a

13. Limpar

Exclua o notebook gerenciado pelo usuário do console. Para isso, acesse Vertex AI → Workbench, selecione e exclua o notebook.

No Cloud Shell, exclua os componentes da VPC.

gcloud compute routers delete cloud-router-us-central1 --region=us-central1 --quiet

gcloud compute routers nats delete cloud-nat-us-central1 --region=us-central1 --router=cloud-router-us-central1 --quiet

gcloud compute instances remove-resource-policies $notebook_vm \
--resource-policies=optimize-notebooks \
--zone=us-central1-a --quiet

gcloud compute resource-policies delete optimize-notebooks --region=us-central1 --quiet

gcloud compute instances delete $notebook_vm --zone=us-central1-a --quiet

gcloud compute networks subnets delete securevertex-subnet-a --region=us-central1 --quiet 

gcloud iam service-accounts delete user-managed-notebook-sa@$projectid.iam.gserviceaccount.com --quiet 

gcloud projects remove-iam-policy-binding $projectid --member="serviceAccount:$project_number-compute@developer.gserviceaccount.com" --role="projects/$projectid/roles/Vm_Scheduler"

gcloud iam roles delete Vm_Scheduler --project=$projectid

gcloud compute networks delete securevertex-vpc --quiet 

14. Parabéns

Muito bem! Você configurou e validou um notebook gerenciado pelo usuário seguro criando uma VPC independente personalizada usando as práticas recomendadas de reforço de segurança para notebooks gerenciados e implementou uma programação de instância para otimizar os gastos.

Qual é a próxima etapa?

Confira alguns destes tutoriais:

Leituras e vídeos complementares

Documentos de referência