Como processar imagens de satélite do Landsat com GPUs

Neste tutorial, mostramos como usar GPUs no Dataflow para processar imagens de satélite do Landsat 8 e renderizá-las como arquivos JPEG.

Objetivos

  • Criar uma imagem do Docker para o Dataflow que tenha compatibilidade do TensorFlow com GPU.
  • Executar um job do Dataflow com GPUs

Custos

Neste tutorial, há componentes faturáveis do Google Cloud, entre eles:

  • Cloud Storage
  • Dataflow
  • Container Registry

Use a calculadora de preços para gerar uma estimativa de custos baseada na projeção de uso.

Antes de começar

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

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

  2. No Console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar a página do seletor de projetos

  3. Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como confirmar se o faturamento está ativado para o projeto.

  4. Ative as APIs Dataflow and Cloud Build.

    Ative as APIs

  5. Configurar a autenticação:
    1. No Console do Cloud, acesse a página Criar chave da conta de serviço.

      Acessar página "Criar chave da conta de serviço"
    2. Na lista Conta de serviço, selecione Nova conta de serviço.
    3. No campo Nome da conta de serviço, insira um nome.
    4. Na lista Papel, selecione Projeto > Proprietário.

    5. Clique em Criar. O download de um arquivo JSON que contém sua chave é feito no seu computador.
  6. Defina a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS como o caminho do arquivo JSON que contém a chave da conta de serviço. Essa variável só se aplica à sessão de shell atual. Dessa maneira, se você abrir uma nova sessão, defina a variável novamente.

  7. Para armazenar os arquivos de imagem JPEG de saída deste tutorial, crie um bucket do Cloud Storage:
    1. No Console do Cloud, acesse a página Navegador do Cloud Storage.

      Acessar a página "Navegador do Cloud Storage"

    2. Clique em Criar bucket.
    3. Na caixa de diálogo Criar bucket, especifique os seguintes atributos.
      • Nome: um nome de bucket exclusivo. Não inclua informações confidenciais no nome do bucket: o namespace é global e visível ao público.
      • Classe de armazenamento padrão: Standard
      • Um local onde os dados do bucket serão armazenados.
    4. Clique em Criar.

Como preparar o ambiente de trabalho

Antes de seguir este tutorial, você precisa configurar o ambiente de desenvolvimento e fazer o download dos arquivos iniciais.

  1. Clone o repositório python-docs-samples.

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
    
  2. Navegue até o diretório do código de amostra.

    cd python-docs-samples/dataflow/gpu-workers
    
  3. Configure o ambiente virtual do Python 3.6.

    Este exemplo requer o Python 3.6. A versão do Python que você usa precisa corresponder à versão do Python usada na imagem de contêiner personalizada criada com a base do Dockerfile.

    • Se você já tiver o Python 3.6 instalado, crie um ambiente virtual Python 3.6 e ative-o.

      python3.6 -m venv env
      source env/bin/activate
      
    • Se você não tem o Python 3.6 instalado, é possível instalá-lo com o Miniconda.

      a. Instale o Miniconda seguindo as instruções do sistema operacional (em inglês).

      b. (Opcional) Configure o conda para que não ative o ambiente base por padrão.

      conda config --set auto_activate_base false
      

      c. Crie e ative um ambiente virtual Python 3.6.

      conda create --name dataflow-gpu-env python=3.6
      conda activate dataflow-gpu-env
      

    Quando terminar este tutorial, execute deactivate para sair do virtualenv.

  4. Instale os requisitos de amostra.

    pip install -U pip
    pip install -r requirements.txt
    

Crie a imagem do Docker

O Cloud Build permite criar uma imagem do Docker usando um Dockerfile e salvá-la no Container Registry, em que a imagem é acessível a outros produtos do Google Cloud.

export PROJECT=PROJECT_NAME
export BUCKET=BUCKET
export IMAGE="gcr.io/$PROJECT/samples/dataflow/tensorflow-gpu:latest"
gcloud --project $PROJECT builds submit -t $IMAGE . --timeout 20m

Substitua:

  • PROJECT: o nome do projeto do Google Cloud.
  • BUCKET: o bucket do Cloud Storage.

Como executar o job do Dataflow com GPUs

O bloco de código a seguir demonstra como iniciar esse pipeline do Dataflow com GPUs.

export REGION="us-central1"
export WORKER_ZONE="us-central1-f"
export GPU_TYPE="nvidia-tesla-t4"

python landsat_view.py \
    --output-path-prefix "gs://$BUCKET/samples/dataflow/landsat/" \
    --runner "DataflowRunner" \
    --project "$PROJECT" \
    --region "$REGION" \
    --worker_machine_type "custom-1-13312-ext" \
    --worker_harness_container_image "$IMAGE" \
    --worker_zone "$WORKER_ZONE" \
    --experiment "worker_accelerator=type:$GPU_TYPE;count:1;install-nvidia-driver" \
    --experiment "use_runner_v2"

Depois de executar o pipeline, aguarde a conclusão do comando. Se você sair do shell, perderá as variáveis de ambiente que definiu.

Para evitar o compartilhamento da GPU entre vários processos de worker, esta amostra usa um tipo de máquina com uma vCPU. Os requisitos de memória do pipeline são tratados usando 13 GB de memória estendida.

Como ver os resultados

O pipeline em landsat_view.py processa imagens de satélite do Landsat 8 e as renderiza como arquivos JPEG. Siga estas etapas para ver esses arquivos.

  1. Liste os arquivos JPEG de saída com detalhes usando a gsutil.

    gsutil ls -lh "gs://$BUCKET/samples/dataflow/landsat/"
    
  2. Copie os arquivos para o diretório local.

    mkdir outputs
    gsutil -m cp "gs://$BUCKET/samples/dataflow/landsat/*" outputs/
    
  3. Abra esses arquivos de imagem com o visualizador de imagens que você preferir.

Limpeza

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados neste tutorial, exclua o projeto que contém os recursos ou mantenha o projeto e exclua os recursos individuais.

Excluir o projeto

O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para o tutorial.

Para excluir o projeto:

  1. No Console do Cloud, acesse a página Gerenciar recursos:

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

A seguir