Aidez à améliorer cette page
Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Vous souhaitez contribuer à ce guide de l'utilisateur ? Faites défiler cette page vers le bas et sélectionnez Modifier cette page sur GitHub. Vos contributions contribueront à améliorer notre guide de l'utilisateur pour tous.
Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Utilisez des instances AWS Inferentia avec votre EKS cluster pour le Machine Learning
Cette rubrique décrit comment créer un EKS cluster Amazon avec des nœuds exécutant des instances Amazon EC2 Inf1
Note
La logique du dispositif neuronal IDs doit être contiguë. Si un Pod la demande de plusieurs appareils Neuron est planifiée sur un type d'inf1.24xlarge
instance inf1.6xlarge
ou (qui possède plusieurs appareils Neuron), qui Pod ne démarrera pas si le Kubernetes le planificateur sélectionne un périphérique non contigu. IDs Pour plus d'informations, voir Device logical IDs must be contiguous on
Prérequis
-
Installez
eksctl
sur votre ordinateur. Si ce n'est pas le cas, consultez la section Installationdans la eksctl
documentation. -
Installez
kubectl
sur votre ordinateur. Pour de plus amples informations, veuillez consulter Configurer kubectl et eksctl. -
(Facultatif) Installez
python3
sur votre ordinateur. Si vous ne l'avez pas installé, consultez les téléchargements de Pythonpour les instructions d'installation.
Créer un cluster
-
Créez un cluster avec des nœuds d'EC2instance Amazon Inf1. Vous pouvez remplacer
inf1.2xlarge
par n'importe quel type d'instance Inf1. L' eksctl
utilitaire détecte que vous lancez un groupe de nœuds avec un type d'Inf1
instance et démarrera vos nœuds en utilisant l'un des systèmes accélérés EKS optimisés d'Amazon Linux pour AmazonAMIs.Note
Vous ne pouvez pas utiliser de IAMrôles pour les comptes de service avec TensorFlow Serving.
eksctl create cluster \ --name inferentia \ --region region-code \ --nodegroup-name ng-inf1 \ --node-type inf1.2xlarge \ --nodes 2 \ --nodes-min 1 \ --nodes-max 4 \ --ssh-access \ --ssh-public-key your-key \ --with-oidc
Note
Notez la valeur de la ligne suivante de la sortie. Il est utilisé dans une étape ultérieure (facultative).
[9] adding identity "arn:aws: iam::111122223333:role/eksctl-inferentia-nodegroup-ng-in-NodeInstanceRole-FI7HIYS3BS09" to auth ConfigMap
Lors du lancement d'un groupe de nœuds avec
Inf1
des instances, installeeksctl
automatiquement le AWS Neuron Kubernetes plugin pour appareil. Ce plugin fait la promotion des appareils Neuron en tant que ressource système auprès du Kubernetes planificateur, qui peut être demandé par un conteneur. Outre les IAM politiques de EKS nœud Amazon par défaut, la politique d'accès en lecture seule d'Amazon S3 est ajoutée afin que l'exemple d'application, abordé dans une étape ultérieure, puisse charger un modèle entraîné depuis Amazon S3. -
Assurez-vous que tous Pods ont démarré correctement.
kubectl get pods -n kube-system
Sortie abrégée :
NAME READY STATUS RESTARTS AGE [...] neuron-device-plugin-daemonset-6djhp 1/1 Running 0 5m neuron-device-plugin-daemonset-hwjsj 1/1 Running 0 5m
(Facultatif) Déployez une image d'application TensorFlow Serving
Un modèle formé doit être compilé sur une cible Inferentia avant de pouvoir être déployé sur des instances Inferentia. Pour continuer, vous aurez besoin d'un TensorFlow modèle optimisé pour Neuron
L'exemple de manifeste de déploiement gère un conteneur de service d'inférence prédéfini TensorFlow fourni par AWS Deep Learning Containers. À l'intérieur du conteneur se trouvent le AWS Neuron Runtime et l'application TensorFlow Serving. Une liste complète des Deep Learning Containers prédéfinis optimisés pour Neuron est disponible sur GitHub sous Images disponibles
Le nombre d'appareils Neuron alloués à votre application de service peut être ajusté en changeant la ressource aws.amazon.com/neuron
dans le yaml de déploiement. Veuillez noter que la communication entre TensorFlow Serving et le runtime Neuron est interrompueGRPC, ce qui nécessite de transmettre la IPC_LOCK
capacité au conteneur.
-
Ajoutez la
AmazonS3ReadOnlyAccess
IAM politique au rôle d'instance de nœud créé à l'étape 1 de la section Créer un cluster. Ceci est nécessaire pour que l'application exemple puisse charger un modèle formé à partir de Amazon S3.aws iam attach-role-policy \ --policy-arn arn:aws: iam::aws:policy/AmazonS3ReadOnlyAccess \ --role-name eksctl-inferentia-nodegroup-ng-in-NodeInstanceRole-FI7HIYS3BS09
-
Créez un fichier nommé
rn50_deployment.yaml
avec les contenus suivants. Mettez à jour le code régional et le chemin du modèle pour correspondre aux paramètres souhaités. Le nom du modèle est utilisé à des fins d'identification lorsqu'un client fait une demande au TensorFlow serveur. Cet exemple utilise un nom de modèle correspondant à un exemple de ResNet 50 scripts client qui sera utilisé ultérieurement pour envoyer des demandes de prédiction.aws ecr list-images --repository-name neuron-rtd --registry-id 790709498068 --region us-west-2
kind: Deployment apiVersion: apps/v1 metadata: name: eks-neuron-test labels: app: eks-neuron-test role: master spec: replicas: 2 selector: matchLabels: app: eks-neuron-test role: master template: metadata: labels: app: eks-neuron-test role: master spec: containers: - name: eks-neuron-test image: 763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-inference-neuron:1.15.4-neuron-py37-ubuntu18.04 command: - /usr/local/bin/entrypoint.sh args: - --port=8500 - --rest_api_port=9000 - --model_name=resnet50_neuron - --model_base_path=s3://your-bucket-of-models/resnet50_neuron/ ports: - containerPort: 8500 - containerPort: 9000 imagePullPolicy: IfNotPresent env: - name: AWS_REGION value: "us-east-1" - name: S3_USE_HTTPS value: "1" - name: S3_VERIFY_SSL value: "0" - name: S3_ENDPOINT value: s3.us-east-1.amazonaws.com - name: AWS_LOG_LEVEL value: "3" resources: limits: cpu: 4 memory: 4Gi aws.amazon.com/neuron: 1 requests: cpu: "1" memory: 1Gi securityContext: capabilities: add: - IPC_LOCK
-
Déployez le modèle.
kubectl apply -f rn50_deployment.yaml
-
Créez un fichier nommé
rn50_service.yaml
avec les contenus suivants. Les RPC ports HTTP et g sont ouverts pour accepter les demandes de prédiction.kind: Service apiVersion: v1 metadata: name: eks-neuron-test labels: app: eks-neuron-test spec: type: ClusterIP ports: - name: http-tf-serving port: 8500 targetPort: 8500 - name: grpc-tf-serving port: 9000 targetPort: 9000 selector: app: eks-neuron-test role: master
-
Créez un Kubernetes service pour votre application de service TensorFlow modèle.
kubectl apply -f rn50_service.yaml
(Facultatif) Faites des prédictions par rapport à votre TensorFlow service de service
-
Pour effectuer un test local, transférez le RPC port g vers le
eks-neuron-test
service.kubectl port-forward service/eks-neuron-test 8500:8500 &
-
Créez un script Python appelé
tensorflow-model-server-infer.py
avec le contenu suivant. Ce script exécute l'inférence via gRPC, qui est un framework de service.import numpy as np import grpc import tensorflow as tf from tensorflow.keras.preprocessing import image from tensorflow.keras.applications.resnet50 import preprocess_input from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2_grpc from tensorflow.keras.applications.resnet50 import decode_predictions if __name__ == '__main__': channel = grpc.insecure_channel('localhost:8500') stub = prediction_service_pb2_grpc.PredictionServiceStub(channel) img_file = tf.keras.utils.get_file( "./kitten_small.jpg", "https://raw.githubusercontent.com/awslabs/mxnet-model-server/master/docs/images/kitten_small.jpg") img = image.load_img(img_file, target_size=(224, 224)) img_array = preprocess_input(image.img_to_array(img)[None, ...]) request = predict_pb2.PredictRequest() request.model_spec.name = 'resnet50_inf1' request.inputs['input'].CopyFrom( tf.make_tensor_proto(img_array, shape=img_array.shape)) result = stub.Predict(request) prediction = tf.make_ndarray(result.outputs['output']) print(decode_predictions(prediction))
-
Exécutez le script pour soumettre des prédictions à votre service.
python3 tensorflow-model-server-infer.py
L'exemple qui suit illustre un résultat.
[[(u'n02123045', u'tabby', 0.68817204), (u'n02127052', u'lynx', 0.12701613), (u'n02123159', u'tiger_cat', 0.08736559), (u'n02124075', u'Egyptian_cat', 0.063844085), (u'n02128757', u'snow_leopard', 0.009240591)]]
📝 Modifiez cette page sur GitHub