Como usar o TensorFlow e o JupyterHub em salas de aula

Neste tutorial, descrevemos como ativar o JupyterHub para gerenciar várias instâncias do TensorFlow no Kubernetes Engine no Google Cloud Platform (GCP).

Neste exemplo, um grupo de estudantes universitários de arte está fazendo experiências com algoritmos do DeepDream para renderizar obras de arte digitais usando inteligência de máquina. Usando o Kubernetes Engine, a autenticação do Google Cloud Platform e o Cloud Shell, você configurará um ambiente do TensorFlow para cada aluno usando o JupyterHub.

TensorFlow é uma biblioteca de aprendizado de máquina que o Google transformou em código aberto em 2015. Uma das maneiras mais fáceis de dar os primeiros passos no TensorFlow é usar as instruções na documentação do TensorFlow para executar o contêiner do Docker. A imagem do Docker vem acompanhada de um notebook do Jupyter para você colocar em ação os experimentos de aprendizado de máquina rapidamente.

Jupyter é uma ferramenta conhecida para cientistas de dados criarem e executarem experimentos usando Python e outros tempos de execução. O Jupyter expõe um diretório de notebooks, que são arquivos individuais contendo um mashup de código executável, gráficos incorporados, imagens e texto, tudo em um editor estilo wiki. O pacote do Python para Google Datalab é uma extensão do Jupyter que permite uma ampla integração com as ferramentas de Big Data do Google Cloud Platform, incluindo o Google BigQuery.

Com a ampla experiência de notebooks on-line do Jupyter e as imagens de fácil acesso do Docker, esta é uma escolha natural para projetos de equipe, sessões de treinamento corporativas e salas de aula universitárias. No entanto, pode ser difícil provisionar e gerenciar várias instâncias. Na maioria dos cenários, é necessário o aprovisionamento de uma instância do Jupyter para cada aluno, porque os scripts em execução a partir de um único notebook podem exigir uma quantidade significativa de CPU e memória. A natureza complexa do tempo de execução do TensorFlow pode aumentar ainda mais a necessidade de recursos de computação dedicados.

Os fabricantes do Jupyter criaram uma ferramenta adicional, JupyterHub, que permite o gerenciamento de vários ambientes do Jupyter. Esse sistema administra o ciclo de vida de novas instâncias do Jupyter para usuários individuais e fornece um gateway de acesso comum com autenticação segura. A ativação do JupyterHub facilitará o gerenciamento de usuários, permitirá a criação automática de instâncias e acelerará o provisionamento dos recursos de computação necessários para fazer tudo funcionar. Neste tutorial, orientamos você no processo de implantação de tudo no Kubernetes Engine usando um script de automação fácil de usar encontrado no GitHub.

O Kubernetes Engine, um serviço gerenciado criado no Kubernetes, é o sistema de orquestração de contêineres de código aberto do Google. O Kubernetes Engine permite provisionar rapidamente contêineres do Docker por meio da execução dos componentes necessários do JupyterHub e do proxy SSL seguro. Quando novos usuários fazem login no sistema JupyterHub, o Kubernetes é direcionado para criar automaticamente novos contêineres do Jupyter especificamente para eles.

Diagrama de arquitetura

Este diagrama mostra a arquitetura completa da interação dos contêineres do Jupyter no Kubernetes Engine com o Datalab e o TensorFlow.

diagrama de arquitetura

Objetivos

  • Configurar as instâncias do TensorFlow com o Jupyter no Kubernetes Engine
  • Gerenciar usuários no JupyterHub
  • Gerar obras de arte originais por meio de algoritmos do DeepDream

Custos

Neste tutorial, usamos componentes faturáveis do GCP, inclusive este:

  • Kubernetes Engine

Use a Calculadora de preços para gerar uma estimativa de custo com base no uso previsto. Os novos usuários do GCP podem estar qualificados para uma avaliação gratuita.

Antes de começar

  1. Faça login na sua Conta do Google.

    Se você ainda não tiver uma, inscreva-se.

  2. Selecione ou crie um projeto do GCP.

    Acessar a página Gerenciar recursos

  3. Verifique se o faturamento foi ativado para o projeto.

    Saiba como ativar o faturamento

  4. Ative a Compute Engine API do projeto que você selecionou ou criou na etapa anterior.
    Ativar a Compute Engine API

Clonar o código de amostra por meio do Cloud Shell

O repositório gke-jupyter-classroom do GitHub contém o código e a configuração completos. Para executar todos os comandos de inicialização, você usa o Cloud Shell, um shell completo do Linux que pode ser acessado diretamente do console do Google Cloud Platform.

  1. Inicie o Cloud Shell.

  2. Defina a zona de computação padrão. No Cloud Shell, insira o seguinte comando:

    gcloud config set compute/zone us-east1-d

  3. Clone o repositório de laboratório:

    git clone https://github.com/GoogleCloudPlatform/gke-jupyter-classroom

  4. Insira o novo diretório do projeto:

    cd gke-jupyter-classroom
    

Iniciar o servidor de arquivos

Como os contêineres do Docker são efêmeros, o armazenamento local deles desaparece quando falham ou são reiniciados. Para evitar a possibilidade de perder os notebooks do Jupyter e os arquivos de configuração do JupyterHub, use o Google Cloud Launcher para provisionar um servidor de arquivos de node único, que é um sistema de arquivos de rede (NFS, na sigla em inglês) remoto instalado em uma única instância de máquina virtual do Compute Engine. Depois de implantar o servidor de arquivos, você pode usá-lo como destino de armazenamento para a implantação do JupyterHub.

  1. Use o console do GCP para provisionar o servidor de arquivos.

    Provisionar o servidor de arquivos

  2. Escolha o projeto do GCP em que será iniciado o servidor de arquivos.

  3. Escolha os seguintes parâmetros de dimensões do servidor de arquivos:

    Dimensão Parâmetro/instrução
    Nome da implantação jupyterhub-filer
    Zona us-east1-d
    Tipo de máquina n1-standard-1
    Nome do armazenamento data
    Ativar compartilhamento SMB Desmarque a caixa de seleção
    Tamanho do disco de armazenamento 10 GB
    Para este tutorial, você pode escolher um disco de 10 GB, por não precisar de alta capacidade,
    e IOPS, a menos que esta configuração seja destinada a um projeto de Big Data.
  4. Clique em Implantar e aguarde o Console do GCP indicar que está em execução.

  5. Anote o endereço IP interno da nova máquina. Esse valor será necessário em uma etapa posterior. Para encontrá-lo, execute este comando no Cloud Shell:

    gcloud compute instances list
    

Como analisar o script e as configurações

Navegue até o diretório que contém o repositório clonado do GitHub e liste os arquivos. Observe os seguintes arquivos e diretórios:

  • O gke-jupyter-classroom.sh implanta a configuração e oferece várias opções para personalizar a implantação.
  • O diretório proxy contém uma definição genérica de contêiner do Nginx e um manifesto do Kubernetes. O manifesto do Kubernetes carrega o arquivo nginx.conf partir de um volume ConfigMap do Kubernetes. O arquivo docker-entrypoint.sh substitui as variáveis de ambiente que encontra em nginx.conf.
  • O diretório jupyterhub/custom_manifests contém vários arquivos JSON de exemplo que o contêiner do JupyterHub pode carregar e apresentar ao usuário, permitindo que ele escolha uma instância específica do Jupyter que você pode definir. Os arquivos de exemplo usam substituição de parâmetro estilo Python para inserir variáveis do JupyterHub no manifesto antes que ele seja enviado ao Kubernetes.
  • O diretório jupyter contém duas definições de contêiner. Uma é a imagem básica do TensorFlow Jupyter estendida para incluir o notebook de exemplo do DeepDream. A outra é a imagem do TensorFlow Jupyter estendida para incluir a extensão Python Notebook para Cloud Datalab, o SDK do Cloud Dataflow para Python e várias outras bibliotecas de ciência de dados.

Como implantar o JupyterHub

Nesta seção, você usa os arquivos que clonou do GitHub para criar e implantar todas as configurações necessárias. O script gke-jupyter-classroom.sh simplifica o processo de implantação de tudo, mas você deve analisá-lo. O script divide cada etapa em uma função para criar o pod do JupyterHub, o pod de proxy do Nginx, bem como configmaps, segredos, serviços, certificados SSL, regras de firewall e o balanceador de carga de entrada. Depois de ser executado com êxito, o script imprime o novo nome de domínio para abrir no navegador. O serviço DNS que o script usa é chamado de xip.io. Trata-se de um serviço gratuito que usa habilmente o endereço IP como parte do nome de domínio para retornar automaticamente a solicitação de DNS para esse IP.

Para implantar o JupyterHub:

  1. A partir do Cloud Shell, navegue até o diretório clonado do repositório Git, gke-jupyter-classroom, e execute o seguinte comando para mostrar todas as opções do script:

    ./gke-jupyter-classroom.sh -h
    

    O console imprime todas as ações disponíveis no script, incluindo a implantação da solução, a execução de uma simulação, a desmontagem de toda a solução e a criação das imagens do Docker que acompanham essa solução.

  2. Em seguida, execute a ação de implantação para criar toda a configuração:

    ./gke-jupyter-classroom.sh -v --cluster-name jupytercluster1 --admin-user <your-gmail-address> --filer-ip <your filer ip> --zone <defaults to us-east1-d> --autoscale-nodes 6 deploy
    
  3. Aguarde o script solicitar a criação de credenciais do OAuth:

    #User Action Required: Please follow the instructions to create a Web Application OAuth configuration
    #: use the Cloud Console to access the API Manager credentials section
    #: https://console.cloud.google.com/apis/credentials
    #: use these values origins field:
    https://jhub.10.12.34.56.xip.io callback url:
    https://jhub.10.12.34.56.xip.io/hub/oauth_callback
    

  4. Acesse a página "Criar ID do cliente" no Console do GCP.

    Acessar a página "Criar ID do cliente"

  5. Configure o ID do cliente do OAuth registrando o novo site como um aplicativo que aceita o login do Google.

    1. Em Tipo de aplicativo, escolha Aplicativo da Web.
    2. Em Nome, insira o nome de um ID do cliente.
    3. Em Restrições, defina as restrições da seguinte maneira:
      • Defina Origens JavaScript autorizadas com o nome do domínio.
      • Defina URIs de redirecionamento autorizados com o URL de retorno de chamada proveniente da saída do console.
    4. Clique em Criar.
    5. Copie o ID do cliente e insira-o no Cloud Shell.
    6. Copie a chave secreta do cliente e insira-a no Cloud Shell.
  6. Aguarde o script concluir a geração dos arquivos de certificado SSL, o que pode demorar um pouco dependendo da entropia disponível na instância do Cloud Shell. O certificado não será assinado por uma autoridade de certificação. Portanto, o navegador emitirá um aviso durante o primeiro acesso ao site. É seguro ignorar o aviso dessa demonstração. Para saber sobre o uso de certificados confiáveis, leia a seção Considerações sobre a implantação de produção abaixo.

    Quando o script for concluído, aparecerá uma mensagem com o IP e o URL do novo site do JupyterHub. Visite o URL no navegador.

    -----------COMPLETED------------
    Static IP created: 10.12.34.56 using xip.io : https://jhub.10.12.34.56.xip.io
    

Fazer login no JupyterHub

Parabéns, você passou da parte difícil e abriu o navegador para o novo site do JupyterHub.

  1. Clique em Fazer login com o Google para fazer login no site do JupyterHub.
  2. Clique em Start My Server.
  3. Escolha uma imagem do Jupyter:
    • A imagem padrão contém o TensorFlow e o notebook de exemplo do DeepDream.
    • A imagem GCP-Tools permite que você execute o Datalab e o Dataflow SDK junto com o TensorFlow.

Gerenciar usuários

No JupyterHub, no canto superior direito, clique em Control Panel. O painel de controle permite criar usuários, parar e iniciar as instâncias deles ou excluir os usuários e as respectivas instâncias.

Como verificar o sistema

  1. Teste se o sistema permite o upload de um novo arquivo, então clique em Upload na parte superior direita da tela. Selecione, no computador, uma foto JPG colorida que seja divertida ou interessante. Depois que você abre a foto pela caixa de diálogo de arquivo, o arquivo deve aparecer na lista de arquivos.
  2. Clique no nome e renomeie-o como input.jpg, depois clique em Fazer upload no lado direito do novo arquivo. Você pode testar a configuração do Jupyter e do TensorFlow selecionando o notebook deepdream.ipynb para iniciá-lo.

    Lista de arquivos do Jupyter

    Role para baixo até o fim do notebook e altere

    img0 = PIL.Image.open('pilatus800.jpg')
    

    para

    img0 = PIL.Image.open('input.jpg')
    
  3. Para executar todo o notebook, abra o menu Cell na parte superior e clique em Run All.

  4. Após a conclusão dos scripts, você verá algumas variações diferentes da imagem de entrada no fim do notebook.

Parabéns, você usou com sucesso a inteligência da máquina para criar uma obra de arte única no cluster do Kubernetes Engine.

Considerações sobre a implantação de produção

Se quiser alocar mais memória para uma instância do Jupyter ou usar domínio ou certificados próprios, você precisa ajustar determinados valores antes de implantar o script.

Adicionar recursos

Para alguns projetos, a quantidade padrão de memória e CPU alocada para a instância do Jupyter de um único usuário será muito baixa. Para ajustar esses valores, você pode abrir jupyterhub.yaml.tmp e editar os valores de KUBESPAWN_CPU_LIMIT e KUBESPAWN_MEMORY_LIMIT antes de executar o script. Se você já criou o ambiente, pode modificar os mesmos parâmetros de limite no arquivo jupyterhub.yaml que é gerado no diretório base da instância do Cloud Shell, depois executar kubectl delete -f jupyterhub.yaml e kubectl apply -f jupyterhub.yaml. Nos dois casos, a alteração desses valores recria a instância do JupyterHub com novas configurações de limite de CPU e memória. Se a instância de um usuário já foi criada, você pode excluir o usuário no painel de controle do JupyterHub e, em seguida, criá-lo novamente e fazer com que ele se autentique novamente.

Como usar o próprio domínio

Se você tem um servidor DNS público próprio, pode usá-lo em vez de xip.io. Siga as etapas de criação de credenciais do OAuth descritas na seção Como implantar o JupyterHub, especificando o nome do domínio. Depois de criar as credenciais, execute o script de implantação com a sinalização --domain para especificar o domínio de nível superior. O script usará jhub.<yourdomain>.com para configurar o site e criar um endereço IP público e efêmero que você pode alterar manualmente para um IP estático no {{console_name_short}}. Registre um novo CNAME no servidor DNS ou jhub.<yourdomain>.com com esse endereço IP.

Como usar o proxy SSL do Google Cloud

O GCP fornece uma solução de proxy SSL do Cloud nativa que você pode usar no lugar do proxy Nginx de terceiros. Esse recurso está atualmente na versão beta. Para usá-lo, defina a sinalização --use-ssl-proxy ao executar o script de implantação.

Como usar certificados próprios

Se você quiser usar certificados confiáveis próprios, confira Let’s Encrypt ou, se já tiver um certificado *, siga estas etapas com o script de implantação:

  1. Antes de executar o script, retire a marca de comentário desta linha do arquivo proxy/nginx.conf:

    #ssl_trusted_certificate /mnt/secure/trusted.crt
    
  2. Copie os arquivos cert para a instância do Cloud Shell:

    /tmp/tls.crt
    /tmp/tls.key
    /tmp/dhparam.pem
    /tmp/trusted.crt
    

  3. Execute o script de implantação com estas duas sinalizações adicionais:

    --skip-certs --signed-cert

Como fazer a limpeza

Para evitar que os recursos usados neste tutorial sejam cobrados na conta do GCP, execute o mesmo script com as seguintes opções:

./gke-jupyter-classroom.sh --cluster-name jupytercluster1 teardown

O script imprime um script para excluir manualmente o cluster do Kubernetes Engine. Também convém excluir o servidor de arquivos.

Próximas etapas

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…