A implantação de modelos em escala pode ser uma tarefa complicada para muitos cientistas de dados e engenheiros de aprendizado de máquina. No entanto, os endpoints do Amazon SageMaker fornecem uma solução simples para implantar e dimensionar suas inferências de modelo de machine learning (ML). Nosso último no blog e GitHub repo em hospedar um YOLOv5 TensorFlowModel
on Amazon Sage Maker Pontos finais despertou muito interesse de nossos leitores. Muitos leitores também estavam interessados em aprender como hospedar o modelo YOLOv5 usando PyTorch
. Para resolver esse problema e com o recente lançamento do YOLOv8 modelo de Ultralíticos, apresentamos este post sobre como hospedar um YOLOv8 PyTorchModel
nos terminais do SageMaker. O modelo YOLOv8, distribuído sob a licença GNU GPL3, é um modelo popular de detecção de objetos conhecido por sua eficiência de tempo de execução e precisão de detecção. Os endpoints do Amazon SageMaker fornecem uma solução facilmente escalável e com custo otimizado para implantação de modelo.
Visão geral da solução
A imagem a seguir descreve os serviços da AWS usados para hospedar o modelo YOLOv8 usando um endpoint SageMaker e invocar o endpoint como um usuário. A solução usa Formação da Nuvem AWS para automatizar a criação de uma instância do SageMaker e clonar nosso GitHub repositório para a instância. O notebook SageMaker acessa e baixa um modelo YOLOv8 PyTorch e armazena o código de inferência personalizado junto com o modelo em um Serviço de armazenamento simples da Amazon (Amazon S3). As etapas no notebook destacam a criação do terminal SageMaker que hospeda o modelo YOLOv8 PyTorch e o código de inferência personalizado. O notebook também demonstra como testar o endpoint e plotar os resultados. A solução consiste nos seguintes passos:
- Criamos um repositório GitHub com dois notebooks
1_DeployEndpoint.ipynb
e2_TestEndpoint.ipynb
, sob a políticasm-notebook/
diretório. - O modelo do AWS CloudFormation é executado, cria uma instância do SageMaker Notebook e, em seguida, clona o repositório GitHub.
- O caderno
1_DeployEndpoint.ipynb
é usado para baixar o modelo YOLOv8. - O modelo YOLOv8 e o código de inferência são armazenados como
model.tar.gz
no Amazon S3. - Um endpoint do SageMaker é criado hospedando o
model.tar.gz
. - O caderno
2_TestEndpoint.ipynb
é usado para testar o endpoint e coletar resultados.
Pré-requisitos
Conta da AWS com Funções do AWS Identity and Access Management (IAM) que dá acesso a:
- Formação da Nuvem AWS
- Amazon Sage Maker
- Amazon S3
1. Hospede YOLOv8 em um terminal SageMaker
A Ultralytics possui vários modelos YOLOv8 com diferentes recursos. Eles são subdivididos no seguinte:
- Detecção de Objetos (
yolov8l.pt, yolov8m.pt, yolov8n.pt, yolov8s.pt, yolov8x.pt, yolov8x6.pt
) - Segmentação (
yolov8l-seg.pt, yolov8m-seg.pt, yolov8n-seg.pt, yolov8s-seg.pt, yolov8x-seg.pt
) - Classificação (
yolov8l-cls.pt, yolov8m-cls.pt, yolov8n-cls.pt, yolov8s-cls.pt, yolov8x-cls.pt
)
Neste blog, nos concentramos na detecção de objetos usando yolov8l.pt
Modelo PyTorch. Para hospedar o modelo YOLOv8 e o código de inferência personalizado no terminal SageMaker, eles precisam ser compactados em um único model.tar.gz
com a seguinte estrutura:
model.tar.gz ├─ code/ │ ├── inference.py │ └── requirements.txt └── yolov8l.pt
Os pesos do modelo yolov8l.pt
arquivo deve estar fora do code/
diretório e o script python de inferência principal inference.py
, que contém as funções necessárias para carregar o modelo, analisar a entrada, executar a inferência e pós-processar a saída, deve residir em code/
diretório. Mais detalhes sobre inference.py
são apresentados na seção a seguir.
1.1. Código de inferência personalizado
Dependendo do pipeline e do fluxo de trabalho do código, as entradas e saídas dos endpoints do SageMaker podem variar. Nesta postagem, apresentamos um fluxo de trabalho para passar um numpy
array para o endpoint e processamento. No entanto, as entradas para o terminal podem ser json
ou texto também. Dependendo do seu fluxo de trabalho, você deve modificar as funções em inference.py
para acomodar diferentes entradas e saídas. Além disso, com o recente lançamento do YOLOv8, a equipe Ultralytics lançou sua API Python, que nos permite instalar a biblioteca YOLO diretamente através requirements.txt
e importar o modelo em inference.py
.
1.1.1. Conteúdo de code/inference.py
:
import numpy as np
import torch, os, json, io, cv2, time
from ultralytics import YOLO def model_fn(model_dir): print("Executing model_fn from inference.py ...") env = os.environ model = YOLO("/opt/ml/model/code/" + env['YOLOV8_MODEL']) return model def input_fn(request_body, request_content_type): print("Executing input_fn from inference.py ...") if request_content_type: jpg_original = np.load(io.BytesIO(request_body), allow_pickle=True) jpg_as_np = np.frombuffer(jpg_original, dtype=np.uint8) img = cv2.imdecode(jpg_as_np, flags=-1) else: raise Exception("Unsupported content type: " + request_content_type) return img def predict_fn(input_data, model): print("Executing predict_fn from inference.py ...") device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model.to(device) with torch.no_grad(): result = model(input_data) return result def output_fn(prediction_output, content_type): print("Executing output_fn from inference.py ...") infer = {} for result in prediction_output: if result.boxes: infer['boxes'] = result.boxes.numpy().data.tolist() if result.masks: infer['masks'] = result.masks.numpy().data.tolist() if result.probs: infer['probs'] = result.probs.numpy().data.tolist() return json.dumps(infer)
1.1.2. Conteúdo de code/requirements.txt
:
Uma vez que todo o conteúdo do arquivo para model.tar.gz
forem finalizados, execute o seguinte comando para criar uma tar ball:
$ tar -czvf model.tar.gz code/ yolov8l.pt
1.2. Anfitrião model.tar.gz
para o terminal do SageMaker:
Isso envolve algumas etapas em que o model.tar.gz
é carregado primeiro no bucket do S3. O artefato carregado é usado para criar um SageMaker PyTorchModel. E, finalmente, este PyTorchModel é usado para implantar o modelo em um SageMaker Endpoint.
1.2.1. Carregue o modelo e o código de inferência para o S3:
from sagemaker import s3 bucket = "s3://NAME_OF_BUCKET"
prefix = "yolov8/demo-custom-endpoint"
model_data = s3.S3Uploader.upload("model.tar.gz", bucket + "/" + prefix)
1.2.2. Criar SageMaker PyTorchModel:
from sagemaker.pytorch import PyTorchModel model_name = 'yolov8l.pt' model = PyTorchModel(entry_point='inference.py', model_data=model_data, framework_version='1.12', py_version='py38', role=role, env={'TS_MAX_RESPONSE_SIZE':'20000000', 'YOLOV8_MODEL': model_name}, sagemaker_session=sess)
1.2.3. Compile e hospede o modelo em um endpoint:
from sagemaker.deserializers import JSONDeserializer INSTANCE_TYPE = 'ml.m5.4xlarge'
ENDPOINT_NAME = 'yolov8-pytorch-' + str(datetime.utcnow().strftime('%Y-%m-%d-%H-%M-%S-%f')) predictor = model.deploy(initial_instance_count=1, instance_type=INSTANCE_TYPE, deserializer=JSONDeserializer(), endpoint_name=ENDPOINT_NAME)
2. Teste o endpoint do SageMaker
Depois que o ponto de extremidade for hospedado com êxito, ele poderá ser usado para executar a inferência. Nesta etapa, vamos primeiro ler uma imagem, convertê-la em bytes e executar a inferência passando os bytes como uma entrada para o endpoint. Os resultados gerados teriam caixas delimitadoras ou máscaras ou pontuações de confiança com base no tipo de modelo YOLOv8 usado para hospedagem. A saída pode ser plotada de acordo.
2.1.1. Gere resultados de inferência e plote a saída:
import cv2, random
import numpy as np
import matplotlib.pyplot as plt orig_image = cv2.imread('bus.jpg') image_height, image_width, _ = orig_image.shape
model_height, model_width = 300, 300
x_ratio = image_width/model_width
y_ratio = image_height/model_height resized_image = cv2.resize(orig_image, (model_height, model_width))
payload = cv2.imencode('.jpg', resized_image)[1].tobytes()
result = predictor.predict(payload) if 'boxes' in result: for idx,(x1,y1,x2,y2,conf,lbl) in enumerate(result['boxes']): # Draw Bounding Boxes x1, x2 = int(x_ratio*x1), int(x_ratio*x2) y1, y2 = int(y_ratio*y1), int(y_ratio*y2) color = (random.randint(10,255), random.randint(10,255), random.randint(10,255)) cv2.rectangle(orig_image, (x1,y1), (x2,y2), color, 4) cv2.putText(orig_image, f"Class: {int(lbl)}", (x1,y1-40), cv2.FONT_HERSHEY_SIMPLEX, 1, color, 2, cv2.LINE_AA) cv2.putText(orig_image, f"Conf: {int(conf*100)}", (x1,y1-10), cv2.FONT_HERSHEY_SIMPLEX, 1, color, 2, cv2.LINE_AA) if 'masks' in result: # Draw Masks mask = cv2.resize(np.asarray(result['masks'][idx]), dsize=(image_width, image_height), interpolation=cv2.INTER_CUBIC) for c in range(3): orig_image[:,:,c] = np.where(mask>0.5, orig_image[:,:,c]*(0.5)+0.5*color[c], orig_image[:,:,c]) if 'probs' in result: # Find Class lbl = result['probs'].index(max(result['probs'])) color = (random.randint(10,255), random.randint(10,255), random.randint(10,255)) cv2.putText(orig_image, f"Class: {int(lbl)}", (20,20), cv2.FONT_HERSHEY_SIMPLEX, 1, color, 2, cv2.LINE_AA) plt.imshow(cv2.cvtColor(orig_image, cv2.COLOR_BGR2RGB))
plt.show()
2.1.2. Resultados:
A saída dos modelos YOLOv8 de detecção e segmentação de objetos é mostrada nas seguintes imagens:
3. Limpar
Excluindo a pilha do CloudFormation removeria todos os recursos que foram originalmente criados. No entanto, o CloudFormation não está configurado atualmente para remover automaticamente o terminal, a configuração do terminal e o modelo. Se o endpoint hospedado não estiver sendo usado, é uma boa prática removê-lo para economizar custos. Pode ser feito da seguinte forma:
import boto3 sm_client = boto3.client(service_name="sagemaker") response = sm_client.describe_endpoint_config(EndpointConfigName=endpoint_name)
print(response)
endpoint_config_name = response['EndpointConfigName'] # Delete Endpoint
sm_client.delete_endpoint(EndpointName=endpoint_name) # Delete Endpoint Configuration
sm_client.delete_endpoint_config(EndpointConfigName=endpoint_config_name) # Delete Model
for prod_var in response['ProductionVariants']: model_name = prod_var['ModelName'] sm_client.delete_model(ModelName=model_name)
Conclusão
Nesta postagem, demonstramos como hospedar um YOLOv8 pré-treinado PyTorchModel
em um endpoint do SageMaker e teste os resultados da inferência invocando o endpoint. O código detalhado está disponível em GitHub, e a pilha de modelo do CloudFormation também está disponível no GitHub.
Para saber mais sobre os endpoints do SageMaker, confira Crie seu endpoint e implante seu modelo e Use o PyTorch com o Amazon SageMaker, que destaca o uso PyTorchModel
no SageMaker. O processo pode ser automatizado usando Suporte CloudFormation para SageMaker.
Sobre os autores
Canção de Kevin é cientista de dados na AWS Professional Services. Ele é PhD em Biofísica e tem mais de cinco anos de experiência na indústria na construção de soluções de visão computacional e aprendizado de máquina.
Romil Xá é um cientista de dados IoT Edge no AWS Professional Services. A Romil tem mais de seis anos de experiência no setor de visão computacional, aprendizado de máquina e dispositivos de ponta IoT. Ele está envolvido em ajudar os clientes a otimizar e implantar seus modelos de aprendizado de máquina para dispositivos de ponta em uma configuração industrial.
- Conteúdo com tecnologia de SEO e distribuição de relações públicas. Seja amplificado hoje.
- Platoblockchain. Inteligência Metaverso Web3. Conhecimento Ampliado. Acesse aqui.
- Fonte: https://aws.amazon.com/blogs/machine-learning/hosting-yolov8-pytorch-model-on-amazon-sagemaker-endpoints/
- :é
- 1
- 10
- 100
- 7
- a
- Sobre
- Acesso
- acomodar
- conformemente
- Conta
- precisão
- Adição
- endereço
- Todos os Produtos
- permite
- Amazon
- Amazon Sage Maker
- e
- api
- SOMOS
- Ordem
- AS
- At
- automatizar
- Automatizado
- automaticamente
- disponível
- AWS
- Serviços Profissionais AWS
- bola
- baseado
- BE
- ser
- Biofísica
- Blog
- caixas
- Prédio
- ônibus
- by
- CAN
- capacidades
- verificar
- classe
- código
- cor
- COM
- computador
- Visão de Computador
- confiança
- Configuração
- contém
- conteúdo
- conteúdo
- converter
- custos
- crio
- criado
- cria
- criação
- Atualmente
- personalizadas
- Clientes
- dados,
- cientista de dados
- datetime
- demonstraram
- demonstra
- Dependendo
- implantar
- Implantação
- desenvolvimento
- detalhado
- detalhes
- Detecção
- dispositivo
- Dispositivos/Instrumentos
- diferente
- diretamente
- distribuído
- download
- de downloads
- desenhar
- facilmente
- borda
- eficiência
- ou
- Ponto final
- Engenheiros
- executando
- vasta experiência
- poucos
- Envie o
- finalizado
- Finalmente
- Encontre
- Primeiro nome
- Foco
- seguinte
- segue
- Escolha
- da
- funções
- mais distante
- gerar
- gerado
- GitHub
- Bom estado, com sinais de uso
- Ter
- ajuda
- Destaques
- destaques
- detém
- hospedeiro
- hospedado
- hospedagem
- anfitriões
- Como funciona o dobrador de carta de canal
- Como Negociar
- Contudo
- HTML
- HTTPS
- Identidade
- IDX
- imagem
- imagens
- importar
- in
- industrial
- indústria
- entrada
- instalar
- instância
- interesse
- interessado
- envolvido
- iot
- emitem
- IT
- ESTÁ
- jpg
- json
- conhecido
- Sobrenome
- APRENDER
- aprendizagem
- Biblioteca
- Licença
- carregamento
- lote
- máquina
- aprendizado de máquina
- a Principal
- de grupos
- muitos
- máscara
- Máscaras
- matplotlib
- ML
- modelo
- modelos
- modificar
- mais
- múltiplo
- você merece...
- caderno
- numpy
- objeto
- Detecção de Objetos
- of
- on
- Otimize
- ordem
- originalmente
- OS
- contornos
- saída
- lado de fora
- Passagem
- oleoduto
- platão
- Inteligência de Dados Platão
- PlatãoData
- por favor
- Popular
- Publique
- prática
- Predictor
- presente
- apresentado
- processo
- em processamento
- profissional
- fornecer
- fornece
- Python
- pytorch
- aumentar
- acaso
- Leia
- leitores
- recentemente
- liberar
- liberado
- remover
- repositório
- Requisitos
- Recursos
- resposta
- resultar
- Resultados
- retorno
- Execute
- corrida
- sábio
- Salvar
- escalável
- Escala
- dimensionamento
- Cientista
- cientistas
- seaborn
- Seção
- segmentação
- Serviços
- instalação
- Shape
- rede de apoio social
- mostrando
- simples
- solteiro
- SIX
- solução
- Soluções
- pilha
- Passo
- Passos
- armazenamento
- armazenadas
- lojas
- estrutura
- entraram com sucesso
- ajuda
- Tarefa
- Profissionais
- modelo
- teste
- que
- A
- deles
- tempo
- para
- juntos
- tocha
- Visão da tocha
- para
- carregado
- us
- Utilizador
- visão
- BEM
- qual
- precisarão
- de
- dentro
- seria
- anos
- Yolo
- Vocês
- investimentos
- zefirnet