Le déploiement de modèles à grande échelle peut être une tâche fastidieuse pour de nombreux data scientists et ingénieurs en machine learning. Cependant, les points de terminaison Amazon SageMaker fournissent une solution simple pour déployer et mettre à l'échelle les inférences de votre modèle d'apprentissage automatique (ML). Notre dernier blog récents ainsi que GitHub repo sur l'hébergement d'un YOLOv5 TensorFlowModel
on Amazon Sage Maker Endpoints suscité beaucoup d'intérêt chez nos lecteurs. De nombreux lecteurs souhaitaient également apprendre à héberger le modèle YOLOv5 à l'aide de PyTorch
. Pour résoudre ce problème et avec la récente publication du YOLOv8 modèle de Ultralytiques, nous présentons ce post sur comment héberger un YOLOv8 PyTorchModel
sur les terminaux SageMaker. Le modèle YOLOv8, distribué sous la licence GNU GPL3, est un modèle de détection d'objets populaire connu pour son efficacité d'exécution ainsi que sa précision de détection. Les points de terminaison Amazon SageMaker fournissent une solution facilement évolutive et à coût optimisé pour le déploiement de modèles.
Vue d'ensemble de la solution
L'image suivante décrit les services AWS utilisés pour héberger le modèle YOLOv8 à l'aide d'un point de terminaison SageMaker et appeler le point de terminaison en tant qu'utilisateur. La solution utilise AWS CloudFormation pour automatiser la création d'une instance SageMaker et cloner notre GitHub référentiel à l'instance. Le bloc-notes SageMaker accède et télécharge un modèle YOLOv8 PyTorch et stocke le code d'inférence personnalisé avec le modèle dans un Service de stockage simple Amazon (Amazon S3). Les étapes du bloc-notes mettent en évidence la création du point de terminaison SageMaker qui héberge le modèle YOLOv8 PyTorch et le code d'inférence personnalisé. Le bloc-notes montre également comment tester le point de terminaison et tracer les résultats. La solution consiste en les étapes suivantes :
- Nous avons créé un référentiel GitHub avec deux notebooks
1_DeployEndpoint.ipynb
ainsi que2_TestEndpoint.ipynb
, sous lasm-notebook/
répertoire. - Le modèle AWS CloudFormation s'exécute, crée une instance SageMaker Notebook, puis clone le référentiel GitHub.
- Le cahier
1_DeployEndpoint.ipynb
est utilisé pour télécharger le modèle YOLOv8. - Le modèle YOLOv8 et le code d'inférence sont stockés en tant que
model.tar.gz
dans Amazon S3. - Un point de terminaison SageMaker est créé en hébergeant le
model.tar.gz
. - Le cahier
2_TestEndpoint.ipynb
est utilisé pour tester le point de terminaison et recueillir les résultats.
Pré-requis
Compte AWS avec Rôles AWS Identity and Access Management (IAM) qui donne accès à :
- AWS CloudFormation
- Amazon Sage Maker
- Amazon S3
1. Héberger YOLOv8 sur un terminal SageMaker
Ultralytics a plusieurs modèles YOLOv8 avec différentes capacités. Ils sont subdivisés en :
- Détection d'objet (
yolov8l.pt, yolov8m.pt, yolov8n.pt, yolov8s.pt, yolov8x.pt, yolov8x6.pt
) - Segmentation (
yolov8l-seg.pt, yolov8m-seg.pt, yolov8n-seg.pt, yolov8s-seg.pt, yolov8x-seg.pt
) - Classification (
yolov8l-cls.pt, yolov8m-cls.pt, yolov8n-cls.pt, yolov8s-cls.pt, yolov8x-cls.pt
)
Dans ce blog, nous nous concentrons sur la détection d'objets à l'aide de yolov8l.pt
Modèle PyTorch. Afin d'héberger le modèle YOLOv8 et le code d'inférence personnalisé sur le point de terminaison SageMaker, ils doivent être compressés ensemble en un seul model.tar.gz
avec la structure suivante :
model.tar.gz ├─ code/ │ ├── inference.py │ └── requirements.txt └── yolov8l.pt
Le modèle pèse yolov8l.pt
le fichier doit être en dehors du code/
répertoire et le script python d'inférence principal inference.py
, qui contient les fonctions nécessaires au chargement du modèle, à l'analyse de l'entrée, à l'exécution de l'inférence et au post-traitement de la sortie, doit résider sous code/
annuaire. Plus de détails sur inference.py
sont présentés dans la section suivante.
1.1. Code d'inférence personnalisé
En fonction de votre pipeline et de votre flux de travail de code, les entrées et les sorties des points de terminaison SageMaker peuvent varier. Dans cet article, nous présentons un workflow pour passer un numpy
tableau au point de terminaison et traitement. Cependant, les entrées du point de terminaison peuvent être json
ou du texte aussi. En fonction de votre flux de travail, vous devez modifier les fonctions dans inference.py
pour accueillir différentes entrées et sorties. De plus, avec la récente version de YOLOv8, l'équipe Ultralytics a publié son API Python, qui nous permet d'installer la bibliothèque YOLO directement via requirements.txt
et importer le modèle dans inference.py
.
1.1.1. Contenu 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. Contenu de code/requirements.txt
:
Une fois que tout le contenu du fichier pour model.tar.gz
sont finalisés, exécutez la commande suivante pour créer une archive tar :
$ tar -czvf model.tar.gz code/ yolov8l.pt
1.2. Hôte model.tar.gz
au point de terminaison SageMaker :
Cela implique quelques étapes dans lesquelles le model.tar.gz
est d'abord chargé dans le compartiment S3. L'artefact téléchargé est utilisé pour créer un SageMaker PyTorchModel. Et enfin, ce PyTorchModel est utilisé pour déployer le modèle sur un point de terminaison SageMaker.
1.2.1. Importez le modèle et le code d'inférence dans 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. Créez le modèle SageMaker PyTorch :
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. Compilez et hébergez le modèle sur un point de terminaison :
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. Testez le point de terminaison SageMaker
Une fois que le point de terminaison est hébergé avec succès, il peut être utilisé pour exécuter l'inférence. Dans cette étape, nous allons d'abord lire une image, la convertir en octets et exécuter l'inférence en transmettant les octets en entrée au point de terminaison. Les résultats générés auraient soit des cadres de délimitation, soit des masques, soit des scores de confiance basés sur le type de modèle YOLOv8 utilisé pour l'hébergement. La sortie peut être tracée en conséquence.
2.1.1. Générez des résultats d'inférence et tracez la sortie :
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. Résultats:
La sortie des modèles de détection et de segmentation d'objets YOLOv8 est illustrée dans les images suivantes :
3. Nettoyer
Suppression de la pile CloudFormation supprimerait toutes les ressources créées à l'origine. Cependant, CloudFormation n'est actuellement pas configuré pour supprimer automatiquement le point de terminaison, la configuration du point de terminaison et le modèle. Si le point de terminaison hébergé n'est pas utilisé, il est recommandé de le supprimer pour réduire les coûts. Cela peut être fait comme suit :
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)
Conclusion
Dans cet article, nous avons montré comment héberger un YOLOv8 pré-formé PyTorchModel
sur un point de terminaison SageMaker et testez les résultats d'inférence en appelant le point de terminaison. Le code détaillé est disponible sur GitHub, et le modèle de pile CloudFormation est également disponible sur GitHub.
Pour en savoir plus sur les terminaux SageMaker, veuillez consulter Créez votre endpoint et déployez votre modèle ainsi que Utiliser PyTorch avec Amazon SageMaker, qui met en évidence à l'aide PyTorchModel
sur Sage Maker. Le processus peut être automatisé en utilisant Prise en charge de CloudFormation pour SageMaker.
À propos des auteurs
Kévin chanson est Data Scientist chez AWS Professional Services. Il est titulaire d'un doctorat en biophysique et possède plus de cinq ans d'expérience dans l'industrie dans la création de solutions de vision par ordinateur et d'apprentissage automatique.
Romil Shah est un scientifique des données IoT Edge chez AWS Professional Services. Romil a plus de six ans d'expérience dans l'industrie de la vision par ordinateur, de l'apprentissage automatique et des appareils de périphérie IoT. Il aide les clients à optimiser et à déployer leurs modèles d'apprentissage automatique pour les appareils de pointe dans une configuration industrielle.
- Contenu propulsé par le référencement et distribution de relations publiques. Soyez amplifié aujourd'hui.
- Platoblockchain. Intelligence métaverse Web3. Connaissance Amplifiée. Accéder ici.
- La source: https://aws.amazon.com/blogs/machine-learning/hosting-yolov8-pytorch-model-on-amazon-sagemaker-endpoints/
- :est
- 1
- 10
- 100
- 7
- a
- A Propos
- accès
- accommoder
- en conséquence
- Compte
- précision
- ajout
- propos
- Tous
- permet
- Amazon
- Amazon Sage Maker
- ainsi que
- api
- SONT
- tableau
- AS
- At
- automatiser
- Automatisation
- automatiquement
- disponibles
- AWS
- Services professionnels AWS
- balle
- basé
- BE
- va
- Biophysique
- Blog
- boîtes
- Développement
- bus
- by
- CAN
- capacités
- vérifier
- classe
- code
- Couleur
- COM
- ordinateur
- Vision par ordinateur
- confiance
- configuration
- contient
- contenu
- contenu
- convertir
- Costs
- engendrent
- créée
- crée des
- création
- Lecture
- Customiser
- Clients
- données
- Data Scientist
- datetime
- démontré
- démontre
- Selon
- déployer
- déployer
- déploiement
- détaillé
- détails
- Détection
- dispositif
- Compatibles
- différent
- directement
- distribué
- download
- téléchargements
- dessiner
- même
- Edge
- efficace
- non plus
- Endpoint
- Les ingénieurs
- exécution
- d'experience
- few
- Déposez votre dernière attestation
- Finalisé
- finalement
- Trouvez
- Prénom
- Focus
- Abonnement
- suit
- Pour
- De
- fonctions
- plus
- générer
- généré
- GitHub
- Bien
- Vous avez
- aider
- Souligner
- Faits saillants
- détient
- hôte
- organisé
- hébergement
- hôtes
- Comment
- How To
- Cependant
- HTML
- HTTPS
- Identite
- IDX
- image
- satellite
- importer
- in
- industriel
- industrie
- contribution
- installer
- instance
- intérêt
- intéressé
- impliqué
- IOT
- aide
- IT
- SES
- jpg
- json
- connu
- Nom de famille
- APPRENTISSAGE
- apprentissage
- Bibliothèque
- Licence
- chargement
- Lot
- click
- machine learning
- Entrée
- gestion
- de nombreuses
- masque
- Masques
- matplotlib
- ML
- modèle
- numériques jumeaux (digital twin models)
- modifier
- PLUS
- plusieurs
- Besoin
- cahier
- numpy
- objet
- Détection d'objet
- of
- on
- Optimiser
- de commander
- initialement
- OS
- grandes lignes
- sortie
- au contrôle
- En passant
- pipeline
- Platon
- Intelligence des données Platon
- PlatonDonnées
- veuillez cliquer
- Populaire
- Post
- pratique
- Predictor
- représentent
- présenté
- processus
- traitement
- professionels
- fournir
- fournit
- Python
- pytorch
- augmenter
- aléatoire
- Lire
- lecteurs
- récent
- libérer
- libéré
- supprimez
- dépôt
- Exigences
- Resources
- réponse
- résultat
- Résultats
- retourner
- Courir
- pour le running
- sagemaker
- Épargnez
- évolutive
- Escaliers intérieurs
- mise à l'échelle
- Scientifique
- scientifiques
- seaborn
- Section
- segmentation
- Services
- installation
- Forme
- devrait
- montré
- étapes
- unique
- SIX
- sur mesure
- Solutions
- empiler
- étapes
- Étapes
- storage
- stockée
- STORES
- structure
- Avec succès
- Support
- Tâche
- équipe
- modèle
- tester
- qui
- La
- leur
- fiable
- à
- ensemble
- torche
- Vision de la torche
- sous
- téléchargé
- us
- Utilisateur
- vision
- WELL
- qui
- sera
- comprenant
- dans les
- pourra
- années
- Yolo
- Vous n'avez
- Votre
- zéphyrnet