O blog da AWS
Criando um workflow de rotulamento, treinamento e deploy de machine learning utilizando o Amazon SageMaker, PyTorch e Amazon SageMaker Ground Truth
Por Evandro Franco, Arquiteto de Soluções em Startups na AWS
O Amazon SageMaker é um serviço totalmente gerenciado de machine learning (ML), no qual cientistas de dados e desenvolvedores podem criar e treinar modelos de machine learning com rapidez e facilidade, e depois implantá-los em um ambiente gerenciado pronto para produção.
Para treinar um modelo de machine learning, é necessário que você possua uma grande quantidade de dados (dataset), com boa definição e que estejam corretamente rotulados. O Amazon SageMaker Ground Truth ajuda na tarefa de construção desse dataset de alta qualidade. Através dele é possível utilizar colaboradores de uma empresa terceira, do Amazon Mechanical Turk, ou de uma força de trabalho da própria empresa.
Um dos frameworks de machine learning open source mais utilizados do mercado é o PyTorch. Ele permite acelerar o desenvolvimento, desde a prototipação até a produção. Iremos utilizar o PyTorch neste exemplo de hoje para mostrar também a flexibilidade e facilidade da integração deste framework com o Amazon SageMaker.
Visão Geral da Solução
Inicialmente, para esta demonstração, iremos treinar um modelo para classificar imagens de objetos. Estas imagens foram selecionadas a partir do dataset público da Caltech 256, que é composto por mais de 30 mil imagens rotuladas em 256 categorias (classes) distintas. A partir deste dataset iremos trabalhar com uma amostra das seguintes 4 classes:
- Beer Mug (caneca de cerveja);
- Coffee Mug (caneca de café);
- Teapot (bule de chá);
- Wine Bottle (garrafa de vinho);
Obs.: Para demonstrar o fluxo de desenvolvimento de modelos de machine learning, desde o rotulamento no SageMaker Ground Truth, preparação dos dados até a implementação do modelo, vocês podem selecionar 20 imagens de cada categoria acima, totalizando 80 imagens. Em um cenário real, provavelmente seria necessário de um dataset maior para melhorar o desempenho do modelo.
Criando os recursos necessários (pré-requisitos)
Para começar, será necessário criar um bucket no Amazon S3 (ou utilizar um já existente). O tutorial “Create a Bucket” possui o passo a passo de como criar um bucket.
Em seguida, selecione vinte imagens aleatórias do dataset citado na etapa anterior, considerando apenas as quatro categorias mencionadas (010.beer-mug, 041.coffee-mug, 212.teapot e 246.wine-bottle) e faça o upload dessas imagens para o S3, utilizando apenas um único diretório, pois iremos utilizar o Amazon SageMaker Ground Truth para o rotulamento.
Criando o job de rotulamento no SageMaker Ground Truth
Agora que já criamos um Bucket no S3 e carregamos as imagens, iremos utilizar o Amazon SageMaker Ground Truth para que as imagens não rotuladas possam ser categorizadas antes do processo de treinamento.
Para iniciar, acesse o SageMaker no console da AWS e no menu da esquerda clique em Labeling Jobs, na seção Ground Truth.
Defina os seguintes atributos no trecho Job Overview:
- Job name: labeling-demo
- Input data setup: selecione a opção “Automated data setup”
- Data setup:
- S3 location for input datasets: Navegue pelo S3 até o diretório com as imagens.
- S3 location for output datasets: Navegue pelo S3 até o diretório vazio ou mantenha a mesma localidade.
- Data type: Image
- IAM Role: Especifique uma role com permissão AmazonSageMakerFullAccess.
- Clique no botão “Complete data setup”. Esta etapa irá criar um arquivo de manifesto para as imagens, que será utilizado pelo Ground Truth.
No trecho Task Type, selecione:
- Image: Pois nosso dataset é composto por imagens.
- Image Classification (Single Label): pois cada imagem possui apenas um único objeto ou rótulo.
Clique em Next para a próxima etapa.
Obs.: Será considerado neste exemplo o primeiro acesso ao Ground Truth. Caso esse acesso já tenha sido realizado, será possível visualizar os times que foram criados anteriormente.
No trecho Workers:
- Worker types: selecione a opção Private
- Team name: my-private-team
- Invite private annotators: lista de e-mails, separados por vírgula
- Organization: demo-org
- Contact: e-mail de contato para os workers
- Task timeout: 5 minutes (tempo máximo para uma única tarefa. Uma única tarefa corresponde a uma única imagem).
- Task expiration time: 10 days (este timeout considera o job como um todo, ou seja, o conjunto de imagens).
No trecho Image classification (Single Label) labeling tool, será possível definir o modelo que as imagens aparecerão para serem rotuladas:
- Coloque uma descrição para as imagens, para que o anotador saiba o que preencher, por exemplo:
- Please classify images into one of four classes:
- Preencha as opções de rotulamento:
- 01.beer-mug
- 02.coffee-mug
- 03.teapot
- 04.wine-bottle
É possível clicar no botão preview para abrir uma página de exemplo de como será exibido para os trabalhadores.
Clique em create para concluir e criar o job.
Após alguns minutos, os usuários cadastrados receberão um e-mail com o acesso para o portal onde poderão iniciar o rotulamento.
Após o rotulamento ser concluído, alguns metadados ficarão disponíveis na pasta de output do S3. Dentro desta estrutura de pastas, duas são importantes:
- manifests: contém os arquivos de manifesto de output do job.
- annotations:
- worker-response: contém a resposta individual de cada trabalhador.
- consolidated-annotation: contém as anotações desejadas.
Para saber mais sobre, visualize essa documentação sobre os outputs do Ground Truth.
Criando um notebook:
Também utilizaremos uma instância de notebook do SageMaker. O tutorial “Create a notebook instance” demonstra como criar um notebook Jupyter do SageMaker. Como o propósito deste blog é para teste, pode ser utilizada uma instância do tipo ml.t3.medium.
Com a instância de notebook criada, crie um notebook utilizando o kernel conda_pytorch_p36:
Em seguida, execute o seguinte trecho de código com as bibliotecas, o Bucket s3 e outras referências que serão utilizadas pelo SageMaker:
Explorando os dados do Amazon SageMaker Ground Truth
Para explorar os dados gerados pelo Ground Truth, iremos criar um novo Notebook. Neste notebook, importe as dependências:
Na variável prefix, utilize o caminho utilizado para o output do job do Ground Truth.
Utilize o exemplo de código abaixo para baixar o output para o notebook, para avaliar o que foi gerado:
sagemaker_session.download_data('<local_path>', bucket , prefix)
O trecho a seguir, irá ler o manifesto gerado com os dados dos trabalhadores que rotularam as imagens:
Por fim, o seguinte trecho irá reorganizar as imagens rotuladas no S3, já em uma estrutura de pastas que utilizaremos nos próximos passos:
Obs.: O valor <JOB-NAME> deve ser alterado pelo nome do job utilizado no Ground Truth. Neste exemplo utilizamos um fator randômico para separar o dataset em treino e test, apenas para o propósito demonstrativo.
Treinando o modelo no SageMaker
Iremos utilizar uma técnica de Machine Learning chamada Transfer Learning. Na prática, nem sempre é necessário treinar uma rede neural convolucional do zero, porque é difícil possuir um dataset com tamanho suficiente, além de demandar um tempo de treinamento muito grande. Ao invés disto, é comum utilizar um grande dataset, pré-treinar uma rede com esse dataset e depois utilizar este modelo pré-treinado como ponto de início para desenvolver o novo modelo com o novo dataset para outro domínio específico, acelerando consideravelmente o tempo de treinamento e sem a necessidade de tantas imagens. Neste exemplo, utilizamos a rede ResNet18, pré-treinada com o dataset ImageNet.
A seguir utilizaremos o script transfer_learning.py com o código completo empregando a técnica de transfer learning e o framework PyTorch. Esse script será o ponto de entrada para o treinamento e deploy do nosso modelo:
Neste script, é importante estar atento aos seguintes trechos:
if__name__ == '__main__'
: o ponto de entrada do código, onde os argumentos são tratados e o método de treinamentotrain()
é chamado;def train(args)
: possui toda a lógica de treinamento do modelo;def model_fn(model_dir)
: executada apenas para inferência, é responsável por carregar o modelo na inicialização do container de inferência do SageMaker.
Após analisar este script, ele pode ser criado no mesmo diretório onde está o notebook. Voltando ao notebook iremos criar um estimator do SageMaker, que possuirá as instruções necessárias para o processo de treinamento, sendo os principais parâmetros indicados:
- O script
transfer_learning.py
criado na etapa anterior como entrada; - A role (IAM) com as permissões necessárias;
- O tipo da instância de treinamento (neste caso, como é um exemplo, pode ser utilizada a instância m5.large);
- Número de instâncias (neste caso, apenas uma).
Este trecho pega o caminho para as imagens no S3 e passa como parâmetro para o processo de treinamento do SageMaker. Durante este treinamento o SageMaker irá lançar as instâncias necessárias (definidas no passo anterior), executar o treinamento, salvar o modelo treinado no S3 e encerrar as instâncias.
Após isto, para iniciar o processo de treinamento, basta executar o seguinte trecho de código:
Inferindo o resultado no SageMaker
Após a conclusão do processo de treinamento, é possível fazer o deploy do modelo em uma instância de inferência do SageMaker. Esta instância é otimizada e preparada com as dependências necessárias para reduzir a necessidade de gerenciamento de infraestrutura. Esta instância já possui um endpoint HTTPS para que o modelo seja acessado e retorne uma predição. Para conhecer mais, visite a página Implantar um modelo nos serviços de hospedagem do SageMaker.
Através do seguinte comando é possível criar uma instância de inferência para testar o modelo:
Assim como no treinamento, aqui também definimos a quantidade e o tipo de instância.
Para testar, utilize o script abaixo, que irá utilizar uma imagem qualquer (pode ser utilizada qualquer imagem do dataset original, de preferência uma que não tenha sido utilizada no processo de treinamento):
O resultado será algo parecido com o output abaixo:
Result --> label: 02-coffee-mug | probability: tensor(0.6101, dtype=torch.float64)
Como o proposito aqui é apenas demonstrativo, o pre-processamento para redimensionar tamanho das imagens e normalizar os canais RGB da imagem antes de enviar ao modelo e também o pós-processamento para a conversão para escala entre 0 e 1 da probabilidade foi feito diretamente no notebook. Contudo, essa lógica poderia ser inclusa em funções input_fn, predict_fn e output_fn, dentro do script python (transfer_learning.py) que seria utilizado tanto no treinamento e como na inferência. Mais detalhes de como customizar a lógica de inferência podem ser encontrados aqui.
Limpando os recursos
Para evitar custos não desejados, o endpoint criado para a inferência do modelo pode ser deletado ao término, através do comando:
predictor.delete_endpoint()
Conclusão
Nesta publicação, demonstramos como criar um workflow de Machine Learning, desde a etapa de rotulamento das imagens, passando pelo treinamento, utilizando um script PyTorch no SageMaker e finalizando com a criação de uma instância de inferência para realizar inferências em tempo real.
Sobre o autor
Evandro Franco é um arquiteto de soluções do time de Startups na Amazon Web Services. Em sua função, ele ajuda as Startups a superar os desafios de negócio utilizando a plataforma da AWS. Ele tem mais de 15 anos de experiência na área de tecnologia. Em seu tempo livre, gosta de correr e passar tempo com sua família.