{"version":"1.1","schema_version":"1.1.0","plugin_version":"1.1.2","url":"https://tutos-gameserver.fr/2020/08/18/amazon-ecs-prend-desormais-en-charge-les-instances-ec2-inf1-idk-dev-serveur-dimpression/","llm_html_url":"https://tutos-gameserver.fr/2020/08/18/amazon-ecs-prend-desormais-en-charge-les-instances-ec2-inf1-idk-dev-serveur-dimpression/llm","llm_json_url":"https://tutos-gameserver.fr/2020/08/18/amazon-ecs-prend-desormais-en-charge-les-instances-ec2-inf1-idk-dev-serveur-dimpression/llm.json","manifest_url":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","language":"fr-FR","locale":"fr_FR","title":"Amazon ECS prend désormais en charge les instances EC2 Inf1: idk.dev\n\n &#8211; Serveur d&rsquo;impression","site":{"name":"Tutos GameServer","url":"https://tutos-gameserver.fr/"},"author":{"id":1,"name":"Titanfall","url":"https://tutos-gameserver.fr/author/titanfall/"},"published_at":"2020-08-18T21:23:19+00:00","modified_at":"2020-08-18T21:23:19+00:00","word_count":2000,"reading_time_seconds":600,"summary":"[bzkshopping keyword= »Minecraft » count= »8&Prime; template= »grid »] À mesure que les modèles d&#39;apprentissage automatique et d&#39;apprentissage en profondeur deviennent plus sophistiqués, une accélération matérielle est de plus en plus nécessaire pour fournir des prédictions rapides à haut débit. Aujourd&#39;hui, nous sommes très heureux d&#39;annoncer que les clients AWS peuvent désormais utiliser les instances Amazon EC2 Inf1 sur Amazon [&hellip;]","summary_points":["[bzkshopping keyword= »Minecraft » count= »8&Prime; template= »grid »]\n\n\n\n\n\n\n \n\n\n\n\nÀ mesure que les modèles d&#39;apprentissage automatique et d&#39;apprentissage en profondeur deviennent plus sophistiqués, une accélération matérielle est de plus en plus nécessaire pour fournir des prédictions rapides à haut débit.","Aujourd&#39;hui, nous sommes très heureux d&#39;annoncer que les clients AWS peuvent désormais utiliser les instances Amazon EC2 Inf1 sur Amazon ECS, pour des performances élevées et le coût de prédiction le plus bas dans le cloud.","Depuis quelques semaines maintenant, ces instances sont également disponibles sur Amazon Elastic Kubernetes Service.","Présentation des instances EC2 Inf1Les instances Inf1 ont été lancées à AWS re: Invent 2019."],"topics":["Serveur d'impression"],"entities":[],"entities_metadata":[{"id":10,"name":"Serveur d'impression","slug":"serveur-dimpression","taxonomy":"category","count":3907,"url":"https://tutos-gameserver.fr/category/serveur-dimpression/"}],"tags":["Serveur d'impression"],"content_hash":"a9ff869f88e3385dfb7f96d2462024bc","plain_text":"[bzkshopping keyword= »Minecraft » count= »8&Prime; template= »grid »]\n\n\n\n\n\n\n \n\n\n\n\nÀ mesure que les modèles d&#39;apprentissage automatique et d&#39;apprentissage en profondeur deviennent plus sophistiqués, une accélération matérielle est de plus en plus nécessaire pour fournir des prédictions rapides à haut débit. Aujourd&#39;hui, nous sommes très heureux d&#39;annoncer que les clients AWS peuvent désormais utiliser les instances Amazon EC2 Inf1 sur Amazon ECS, pour des performances élevées et le coût de prédiction le plus bas dans le cloud. Depuis quelques semaines maintenant, ces instances sont également disponibles sur Amazon Elastic Kubernetes Service.\nPrésentation des instances EC2 Inf1Les instances Inf1 ont été lancées à AWS re: Invent 2019. Elles sont alimentées par AWS Inferentia, une puce personnalisée conçue à partir de zéro par AWS pour accélérer les charges de travail d&#39;inférence de machine learning.\nLes instances Inf1 sont disponibles en plusieurs tailles, avec 1, 4 ou 16 puces AWS Inferentia, avec une bande passante réseau jusqu&#39;à 100 Gbit / s et une bande passante EBS jusqu&#39;à 19 Gbit / s. Une puce AWS Inferentia contient quatre NeuronCores. Chacun implémente un moteur de multiplication matricielle systolique haute performance, qui accélère massivement les opérations typiques d&#39;apprentissage en profondeur telles que la convolution et les transformateurs. Les NeuronCores sont également équipés d&#39;un grand cache sur puce, ce qui permet de réduire les accès à la mémoire externe, économisant ainsi du temps d&#39;E / S dans le processus. Lorsque plusieurs puces AWS Inferentia sont disponibles sur une instance Inf1, vous pouvez partitionner un modèle entre elles et le stocker entièrement dans la mémoire cache. Alternativement, pour diffuser des prédictions multi-modèles à partir d&#39;une seule instance Inf1, vous pouvez partitionner les NeuronCores d&#39;une puce AWS Inferentia sur plusieurs modèles.\nCompilation de modèles pour les instances EC2 Inf1Pour exécuter des modèles de machine learning sur des instances Inf1, vous devez les compiler en une représentation optimisée pour le matériel à l&#39;aide du kit SDK AWS Neuron. Tous les outils sont facilement disponibles sur l&#39;AMI AWS Deep Learning et vous pouvez également les installer sur vos propres instances. Vous trouverez des instructions dans la documentation AMI Deep Learning, ainsi que des didacticiels pour TensorFlow, PyTorch et Apache MXNet dans le référentiel AWS Neuron SDK.\nDans la démo ci-dessous, je vais vous montrer comment déployer un modèle optimisé pour Neuron sur un cluster ECS d&#39;instances Inf1 et comment servir des prédictions avec TensorFlow Serving. Le modèle en question est BERT, un modèle de pointe pour les tâches de traitement du langage naturel. C&#39;est un modèle énorme avec des centaines de millions de paramètres, ce qui en fait un excellent candidat pour l&#39;accélération matérielle.\nCréation d&#39;un cluster Amazon ECSCréer un cluster est la chose la plus simple: il suffit d&#39;un appel au CreateCluster API.\n$ aws ecs create-cluster - nom-cluster ecs-inf1-demo\nImmédiatement, je vois le nouveau cluster dans la console.\n\n\nPlusieurs prérequis sont nécessaires avant de pouvoir ajouter des instances à ce cluster:\n\nUn rôle AWS Identity and Access Management (IAM) pour les instances ECS: si vous n&#39;en avez pas déjà, vous pouvez trouver des instructions dans la documentation. Ici, mon rôle est nommé ecsInstanceRole.\nUne Amazon Machine Image (AMI) contenant l&#39;agent ECS et prenant en charge les instances Inf1. Vous pouvez créer la vôtre ou utiliser l&#39;AMI optimisée pour ECS pour Inferentia. Dans la région us-east-1, son identifiant est ami-04450f16e0cd20356.\nUn groupe de sécurité, ouvrant des ports réseau pour TensorFlow Serving (8500 pour gRPC, 8501 pour HTTP). L&#39;identifiant du mien est sg-0994f5c7ebbb48270.\nSi vous souhaitez avoir un accès ssh, votre groupe de sécurité doit également ouvrir le port 22 et vous devez transmettre le nom d&#39;une paire de clés SSH. Le mien s&#39;appelle admin.\n\nNous devons également créer un petit fichier de données utilisateur afin de permettre aux instances de rejoindre notre cluster. Ceci est réalisé en stockant le nom du cluster dans une variable d&#39;environnement, elle-même écrite dans le fichier de configuration de l&#39;agent ECS.\n#! / bin / bashecho ECS_CLUSTER = ecs-inf1-demo &gt;&gt; /etc/ecs/ecs.config\nNous sommes tous prêts. Ajoutons quelques instances Inf1 avec le RunInstances API. Pour minimiser les coûts, nous demanderons des instances Spot.\nInstances d&#39;exécution $ aws ec2 --image-id ami-04450f16e0cd20356 --compte 2 --instance-type inf1.xlarge --instance-market-options &#39;&quot;MarketType&quot;: &quot;spot&quot;&#39; --tag-specs &#39;ResourceType = instance, Tags =[Key=Name,Value=ecs-inf1-demo]&#39; - nom-clé admin --security-group-ids sg-0994f5c7ebbb48270 --iam-instance-profile Nom = ecsInstanceRole - fichier de données utilisateur: // données-utilisateur.txt\nLes deux instances apparaissent immédiatement dans la console EC2.\n\n\nQuelques minutes plus tard, ils sont prêts à exécuter des tâches sur le cluster.\n\n\nNotre infrastructure est prête. Maintenant, construisons un conteneur stockant notre modèle BERT.\nCréation d&#39;un conteneur pour les instances Inf1le Dockerfile est assez simple:\n\nÀ partir d&#39;une image Amazon Linux 2, nous ouvrons les ports 8500 et 8501 pour le service TensorFlow.\nEnsuite, nous ajoutons le référentiel Neuron SDK à la liste des référentiels, et nous installons une version de TensorFlow Serving qui prend en charge AWS Inferentia.\nEnfin, nous copions notre modèle BERT à l&#39;intérieur du conteneur, et nous le chargeons au démarrage.\n\nVoici le dossier complet.\nDE AMAZONLINUX: 2EXPOSE 8500 8501RUN echo $ &#39;[neuron] nname = Dépôt Neuron YUM nbaseurl = https: //yum.repos.neuron.amazonaws.com nenabled = 1 &#39;&gt; /etc/yum.repos.d/neuron.repoRUN rpm - import https://yum.repos.neuron.amazonaws.com/GPG-PUB-KEY-AMAZON-AWS-NEURON.PUBRUN yum install -y tensorflow-model-server-neuronCOPIER bert / bertCMD [\"/bin/sh\", \"-c\", \"/usr/local/bin/tensorflow_model_server_neuron --port=8500 --rest_api_port=8501 --model_name=bert --model_base_path=/bert/\"]\nEnsuite, je crée et pousse le conteneur vers un référentiel hébergé dans Amazon Elastic Container Registry. Affaires comme d&#39;habitude.\n$ docker build -t neuron-tensorflow-inference.\n$ aws ecr create-repository - nom du référentiel ecs-inf1-demo\n$ aws ecr get-login-password | connexion docker --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com\n$ balise docker neuron-tensorflow-inference 123456789012.dkr.ecr.us-east-1.amazonaws.com/ecs-inf1-demo:latest\n$ docker push\nMaintenant, nous devons créer une définition de tâche afin d&#39;exécuter ce conteneur sur notre cluster.\nCréation d&#39;une définition de tâche pour les instances Inf1Si vous n&#39;en avez pas déjà, vous devez d&#39;abord créer un rôle d&#39;exécution, c&#39;est-à-dire un rôle permettant à l&#39;agent ECS d&#39;effectuer des appels d&#39;API en votre nom. Vous pouvez trouver plus d&#39;informations dans la documentation. Le mien s&#39;appelle ecsTaskExecutionRole.\nLa définition complète de la tâche est visible ci-dessous. Comme vous pouvez le voir, il contient deux conteneurs:\n\nLe conteneur BERT que j&#39;ai construit,\nUn conteneur side-car appelé neurone-rtd, qui permet au conteneur BERT d&#39;accéder aux NeuronCores présents sur l&#39;instance Inf1. le AWS_NEURON_VISIBLE_DEVICES La variable d&#39;environnement vous permet de contrôler ceux qui peuvent être utilisés par le conteneur. Vous pouvez l&#39;utiliser pour épingler un conteneur sur un ou plusieurs NeuronCores spécifiques.\n\n\r\n  &quot;famille&quot;: &quot;ecs-neuron&quot;,\r\n  &quot;executionRoleArn&quot;: &quot;arn: aws: iam :: 123456789012: role / ecsTaskExecutionRole&quot;,\r\n  &quot;containerDefinitions&quot;: [\r\n    \r\n      \"entryPoint\": [\r\n        \"sh\",\r\n        \"-c\"\r\n      ],\r\n      &quot;portMappings&quot;: [\r\n        \r\n          \"hostPort\": 8500,\r\n          \"protocol\": \"tcp\",\r\n          \"containerPort\": 8500\r\n        ,\r\n        \r\n          \"hostPort\": 8501,\r\n          \"protocol\": \"tcp\",\r\n          \"containerPort\": 8501\r\n        ,\r\n        \r\n          \"hostPort\": 0,\r\n          \"protocol\": \"tcp\",\r\n          \"containerPort\": 80\r\n        \r\n      ],\r\n      &quot;commander&quot;: [\r\n        \"tensorflow_model_server_neuron --port=8500 --rest_api_port=8501 --model_name=bert --model_base_path=/bert\"\r\n      ],\r\n      &quot;cpu&quot;: 0,\r\n      &quot;environnement&quot;: [\r\n        \r\n          \"name\": \"NEURON_RTD_ADDRESS\",\r\n          \"value\": \"unix:/sock/neuron-rtd.sock\"\r\n        \r\n      ],\r\n      &quot;mountPoints&quot;: [\r\n        \r\n          \"containerPath\": \"/sock\",\r\n          \"sourceVolume\": \"sock\"\r\n        \r\n      ],\r\n      &quot;memoryReservation&quot;: 1 000,\r\n      &quot;image&quot;: &quot;123456789012.dkr.ecr.us-east-1.amazonaws.com/ecs-inf1-demo:latest&quot;,\r\n      &quot;essentiel&quot;: vrai,\r\n      &quot;nom&quot;: &quot;bert&quot;\r\n    ,\r\n    \r\n      &quot;point d&#39;accès&quot;: [\r\n        \"sh\",\r\n        \"-c\"\r\n      ],\r\n      &quot;portMappings&quot;: [],\r\n      &quot;commander&quot;: [\r\n        \"neuron-rtd -g unix:/sock/neuron-rtd.sock\"\r\n      ],\r\n      &quot;cpu&quot;: 0,\r\n      &quot;environnement&quot;: [\r\n        \r\n          \"name\": \"AWS_NEURON_VISIBLE_DEVICES\",\r\n          \"value\": \"ALL\"\r\n        \r\n      ],\r\n      &quot;mountPoints&quot;: [\r\n        \r\n          \"containerPath\": \"/sock\",\r\n          \"sourceVolume\": \"sock\"\r\n        \r\n      ],\r\n      &quot;memoryReservation&quot;: 1 000,\r\n      &quot;image&quot;: &quot;790709498068.dkr.ecr.us-east-1.amazonaws.com/neuron-rtd:latest&quot;,\r\n      &quot;essentiel&quot;: vrai,\r\n      &quot;linuxParameters&quot;: &quot;capabilities&quot;: &quot;add&quot;: [\"SYS_ADMIN\", \"IPC_LOCK\"] ,\r\n      &quot;nom&quot;: &quot;neuron-rtd&quot;\r\n    \r\n  ],\r\n  &quot;volumes&quot;: [\r\n    \r\n      \"name\": \"sock\",\r\n      \"host\": \r\n        \"sourcePath\": \"/tmp/sock\"\r\n      \r\n    \r\n  ]\r\n\nEnfin, j&#39;appelle le RegisterTaskDefinition API pour en informer le backend ECS.\n$ aws ecs register-task-definition --cli-input-json file: //inf1-task-definition.json\nNous sommes maintenant prêts à exécuter notre conteneur et à prévoir avec lui.\nExécution d&#39;un conteneur sur des instances Inf1Étant donné qu&#39;il s&#39;agit d&#39;un service de prédiction, je souhaite m&#39;assurer qu&#39;il est toujours disponible sur le cluster. Au lieu d&#39;exécuter simplement une tâche, je crée un service ECS qui s&#39;assurera que le nombre requis de copies de conteneurs est en cours d&#39;exécution, en les relançant en cas de panne.\n$ aws ecs create-service --cluster ecs-inf1-demo --service-name bert-inf1 --task-definition ecs-neuron: 1 - nombre souhaité 1\nUne minute plus tard, je vois que les deux conteneurs de tâches s&#39;exécutent sur le cluster.\n\n\nPrédire avec BERT sur ECS et Inf1Le fonctionnement interne de BERT dépasse le cadre de cet article. Ce modèle particulier attend une séquence de 128 jetons, codant les mots de deux phrases que nous aimerions comparer pour l’équivalence sémantique.\nIci, je ne suis intéressé que par la mesure de la latence de prédiction, donc les données factices conviennent. Je construis 100 requêtes de prédiction stockant une séquence de 128 zéros. En utilisant l&#39;adresse IP du conteneur BERT, je les envoie au point de terminaison TensorFlow Serving via grpc, et je calcule le temps de prédiction moyen.\nVoici le code complet.\nimporter numpy comme np\r\nimporter grpc\r\nimporter tensorflow en tant que tf\r\ndepuis tensorflow_serving.apis import predict_pb2\r\ndepuis tensorflow_serving.apis import prediction_service_pb2_grpc\r\ntemps d&#39;importation\r\n\r\nsi __name__ == &#39;__main__&#39;:\r\n    canal = grpc.insecure_channel (&#39;18 .234.61.31: 8500 &#39;)\r\n    stub = prediction_service_pb2_grpc.PredictionServiceStub (canal)\r\n    request = predict_pb2.PredictRequest ()\r\n    request.model_spec.name = &#39;bert&#39;\r\n    i = np.zeros ([1, 128], dtype = np.int32)\r\n    request.inputs['input_ids'].CopyFrom (tf.contrib.util.make_tensor_proto (i, shape = i.shape))\r\n    request.inputs['input_mask'].CopyFrom (tf.contrib.util.make_tensor_proto (i, shape = i.shape))\r\n    request.inputs['segment_ids'].CopyFrom (tf.contrib.util.make_tensor_proto (i, shape = i.shape))\r\n\r\n    latences = []\r\n    pour i dans la plage (100):\r\n        start = time.time ()\r\n        result = stub.Predict (demande)\r\n        latencies.append (time.time () - start)\r\n        print (&quot;Inférence réussie: &quot;. format (i))\r\n    print (&quot;Ran  inférences réussies. Latence moyenne = &quot;. format (len (latences), np.average (latences)))\nPour plus de commodité, j&#39;exécute ce code sur une instance EC2 basée sur l&#39;AMI Deep Learning. Il est livré pré-installé avec un environnement Conda pour TensorFlow et TensorFlow Serving, ce qui m&#39;évite d&#39;installer des dépendances.\n$ source activate tensorflow_p36$ python predict.py\nEn moyenne, la prédiction a pris 56,5 ms. En ce qui concerne BERT, c&#39;est plutôt bien!\nRan 100 inférences avec succès. Latence moyenne = 0,05647835493087769\nCommencerVous pouvez maintenant déployer Amazon Elastic Compute Cloud (EC2) Instances Inf1 sur Amazon ECS aujourd&#39;hui dans le USA Est (Virginie du Nord) et USA Ouest (Oregon) Régions. Au fur et à mesure que le déploiement d&#39;Inf1 progresse, vous pourrez les utiliser avec Amazon ECS dans plus de régions.\nEssayez-le et envoyez-nous vos commentaires via vos contacts AWS Support habituels, sur le forum AWS pour Amazon ECS ou sur la feuille de route du conteneur sur Github.\n    &#8211; Julien\n\nClick to rate this post!\r\n                                   \r\n                               [Total: 0  Average: 0]","paragraphs":["[bzkshopping keyword= »Minecraft » count= »8&Prime; template= »grid »]","À mesure que les modèles d&#39;apprentissage automatique et d&#39;apprentissage en profondeur deviennent plus sophistiqués, une accélération matérielle est de plus en plus nécessaire pour fournir des prédictions rapides à haut débit. Aujourd&#39;hui, nous sommes très heureux d&#39;annoncer que les clients AWS peuvent désormais utiliser les instances Amazon EC2 Inf1 sur Amazon ECS, pour des performances élevées et le coût de prédiction le plus bas dans le cloud. Depuis quelques semaines maintenant, ces instances sont également disponibles sur Amazon Elastic Kubernetes Service.\nPrésentation des instances EC2 Inf1Les instances Inf1 ont été lancées à AWS re: Invent 2019. Elles sont alimentées par AWS Inferentia, une puce personnalisée conçue à partir de zéro par AWS pour accélérer les charges de travail d&#39;inférence de machine learning.\nLes instances Inf1 sont disponibles en plusieurs tailles, avec 1, 4 ou 16 puces AWS Inferentia, avec une bande passante réseau jusqu&#39;à 100 Gbit / s et une bande passante EBS jusqu&#39;à 19 Gbit / s. Une puce AWS Inferentia contient quatre NeuronCores. Chacun implémente un moteur de multiplication matricielle systolique haute performance, qui accélère massivement les opérations typiques d&#39;apprentissage en profondeur telles que la convolution et les transformateurs. Les NeuronCores sont également équipés d&#39;un grand cache sur puce, ce qui permet de réduire les accès à la mémoire externe, économisant ainsi du temps d&#39;E / S dans le processus. Lorsque plusieurs puces AWS Inferentia sont disponibles sur une instance Inf1, vous pouvez partitionner un modèle entre elles et le stocker entièrement dans la mémoire cache. Alternativement, pour diffuser des prédictions multi-modèles à partir d&#39;une seule instance Inf1, vous pouvez partitionner les NeuronCores d&#39;une puce AWS Inferentia sur plusieurs modèles.\nCompilation de modèles pour les instances EC2 Inf1Pour exécuter des modèles de machine learning sur des instances Inf1, vous devez les compiler en une représentation optimisée pour le matériel à l&#39;aide du kit SDK AWS Neuron. Tous les outils sont facilement disponibles sur l&#39;AMI AWS Deep Learning et vous pouvez également les installer sur vos propres instances. Vous trouverez des instructions dans la documentation AMI Deep Learning, ainsi que des didacticiels pour TensorFlow, PyTorch et Apache MXNet dans le référentiel AWS Neuron SDK.\nDans la démo ci-dessous, je vais vous montrer comment déployer un modèle optimisé pour Neuron sur un cluster ECS d&#39;instances Inf1 et comment servir des prédictions avec TensorFlow Serving. Le modèle en question est BERT, un modèle de pointe pour les tâches de traitement du langage naturel. C&#39;est un modèle énorme avec des centaines de millions de paramètres, ce qui en fait un excellent candidat pour l&#39;accélération matérielle.\nCréation d&#39;un cluster Amazon ECSCréer un cluster est la chose la plus simple: il suffit d&#39;un appel au CreateCluster API.\n$ aws ecs create-cluster - nom-cluster ecs-inf1-demo\nImmédiatement, je vois le nouveau cluster dans la console.","Plusieurs prérequis sont nécessaires avant de pouvoir ajouter des instances à ce cluster:","Un rôle AWS Identity and Access Management (IAM) pour les instances ECS: si vous n&#39;en avez pas déjà, vous pouvez trouver des instructions dans la documentation. Ici, mon rôle est nommé ecsInstanceRole.\nUne Amazon Machine Image (AMI) contenant l&#39;agent ECS et prenant en charge les instances Inf1. Vous pouvez créer la vôtre ou utiliser l&#39;AMI optimisée pour ECS pour Inferentia. Dans la région us-east-1, son identifiant est ami-04450f16e0cd20356.\nUn groupe de sécurité, ouvrant des ports réseau pour TensorFlow Serving (8500 pour gRPC, 8501 pour HTTP). L&#39;identifiant du mien est sg-0994f5c7ebbb48270.\nSi vous souhaitez avoir un accès ssh, votre groupe de sécurité doit également ouvrir le port 22 et vous devez transmettre le nom d&#39;une paire de clés SSH. Le mien s&#39;appelle admin.","Nous devons également créer un petit fichier de données utilisateur afin de permettre aux instances de rejoindre notre cluster. Ceci est réalisé en stockant le nom du cluster dans une variable d&#39;environnement, elle-même écrite dans le fichier de configuration de l&#39;agent ECS.\n#! / bin / bashecho ECS_CLUSTER = ecs-inf1-demo &gt;&gt; /etc/ecs/ecs.config\nNous sommes tous prêts. Ajoutons quelques instances Inf1 avec le RunInstances API. Pour minimiser les coûts, nous demanderons des instances Spot.\nInstances d&#39;exécution $ aws ec2 --image-id ami-04450f16e0cd20356 --compte 2 --instance-type inf1.xlarge --instance-market-options &#39;&quot;MarketType&quot;: &quot;spot&quot;&#39; --tag-specs &#39;ResourceType = instance, Tags =[Key=Name,Value=ecs-inf1-demo]&#39; - nom-clé admin --security-group-ids sg-0994f5c7ebbb48270 --iam-instance-profile Nom = ecsInstanceRole - fichier de données utilisateur: // données-utilisateur.txt\nLes deux instances apparaissent immédiatement dans la console EC2.","Quelques minutes plus tard, ils sont prêts à exécuter des tâches sur le cluster.","Notre infrastructure est prête. Maintenant, construisons un conteneur stockant notre modèle BERT.\nCréation d&#39;un conteneur pour les instances Inf1le Dockerfile est assez simple:","À partir d&#39;une image Amazon Linux 2, nous ouvrons les ports 8500 et 8501 pour le service TensorFlow.\nEnsuite, nous ajoutons le référentiel Neuron SDK à la liste des référentiels, et nous installons une version de TensorFlow Serving qui prend en charge AWS Inferentia.\nEnfin, nous copions notre modèle BERT à l&#39;intérieur du conteneur, et nous le chargeons au démarrage.","Voici le dossier complet.\nDE AMAZONLINUX: 2EXPOSE 8500 8501RUN echo $ &#39;[neuron] nname = Dépôt Neuron YUM nbaseurl = https: //yum.repos.neuron.amazonaws.com nenabled = 1 &#39;&gt; /etc/yum.repos.d/neuron.repoRUN rpm - import https://yum.repos.neuron.amazonaws.com/GPG-PUB-KEY-AMAZON-AWS-NEURON.PUBRUN yum install -y tensorflow-model-server-neuronCOPIER bert / bertCMD [\"/bin/sh\", \"-c\", \"/usr/local/bin/tensorflow_model_server_neuron --port=8500 --rest_api_port=8501 --model_name=bert --model_base_path=/bert/\"]\nEnsuite, je crée et pousse le conteneur vers un référentiel hébergé dans Amazon Elastic Container Registry. Affaires comme d&#39;habitude.\n$ docker build -t neuron-tensorflow-inference.\n$ aws ecr create-repository - nom du référentiel ecs-inf1-demo\n$ aws ecr get-login-password | connexion docker --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com\n$ balise docker neuron-tensorflow-inference 123456789012.dkr.ecr.us-east-1.amazonaws.com/ecs-inf1-demo:latest\n$ docker push\nMaintenant, nous devons créer une définition de tâche afin d&#39;exécuter ce conteneur sur notre cluster.\nCréation d&#39;une définition de tâche pour les instances Inf1Si vous n&#39;en avez pas déjà, vous devez d&#39;abord créer un rôle d&#39;exécution, c&#39;est-à-dire un rôle permettant à l&#39;agent ECS d&#39;effectuer des appels d&#39;API en votre nom. Vous pouvez trouver plus d&#39;informations dans la documentation. Le mien s&#39;appelle ecsTaskExecutionRole.\nLa définition complète de la tâche est visible ci-dessous. Comme vous pouvez le voir, il contient deux conteneurs:","Le conteneur BERT que j&#39;ai construit,\nUn conteneur side-car appelé neurone-rtd, qui permet au conteneur BERT d&#39;accéder aux NeuronCores présents sur l&#39;instance Inf1. le AWS_NEURON_VISIBLE_DEVICES La variable d&#39;environnement vous permet de contrôler ceux qui peuvent être utilisés par le conteneur. Vous pouvez l&#39;utiliser pour épingler un conteneur sur un ou plusieurs NeuronCores spécifiques.","&quot;famille&quot;: &quot;ecs-neuron&quot;,\n  &quot;executionRoleArn&quot;: &quot;arn: aws: iam :: 123456789012: role / ecsTaskExecutionRole&quot;,\n  &quot;containerDefinitions&quot;: [\n    \n      \"entryPoint\": [\n        \"sh\",\n        \"-c\"\n      ],\n      &quot;portMappings&quot;: [\n        \n          \"hostPort\": 8500,\n          \"protocol\": \"tcp\",\n          \"containerPort\": 8500\n        ,\n        \n          \"hostPort\": 8501,\n          \"protocol\": \"tcp\",\n          \"containerPort\": 8501\n        ,\n        \n          \"hostPort\": 0,\n          \"protocol\": \"tcp\",\n          \"containerPort\": 80\n        \n      ],\n      &quot;commander&quot;: [\n        \"tensorflow_model_server_neuron --port=8500 --rest_api_port=8501 --model_name=bert --model_base_path=/bert\"\n      ],\n      &quot;cpu&quot;: 0,\n      &quot;environnement&quot;: [\n        \n          \"name\": \"NEURON_RTD_ADDRESS\",\n          \"value\": \"unix:/sock/neuron-rtd.sock\"\n        \n      ],\n      &quot;mountPoints&quot;: [\n        \n          \"containerPath\": \"/sock\",\n          \"sourceVolume\": \"sock\"\n        \n      ],\n      &quot;memoryReservation&quot;: 1 000,\n      &quot;image&quot;: &quot;123456789012.dkr.ecr.us-east-1.amazonaws.com/ecs-inf1-demo:latest&quot;,\n      &quot;essentiel&quot;: vrai,\n      &quot;nom&quot;: &quot;bert&quot;\n    ,\n    \n      &quot;point d&#39;accès&quot;: [\n        \"sh\",\n        \"-c\"\n      ],\n      &quot;portMappings&quot;: [],\n      &quot;commander&quot;: [\n        \"neuron-rtd -g unix:/sock/neuron-rtd.sock\"\n      ],\n      &quot;cpu&quot;: 0,\n      &quot;environnement&quot;: [\n        \n          \"name\": \"AWS_NEURON_VISIBLE_DEVICES\",\n          \"value\": \"ALL\"\n        \n      ],\n      &quot;mountPoints&quot;: [\n        \n          \"containerPath\": \"/sock\",\n          \"sourceVolume\": \"sock\"\n        \n      ],\n      &quot;memoryReservation&quot;: 1 000,\n      &quot;image&quot;: &quot;790709498068.dkr.ecr.us-east-1.amazonaws.com/neuron-rtd:latest&quot;,\n      &quot;essentiel&quot;: vrai,\n      &quot;linuxParameters&quot;: &quot;capabilities&quot;: &quot;add&quot;: [\"SYS_ADMIN\", \"IPC_LOCK\"] ,\n      &quot;nom&quot;: &quot;neuron-rtd&quot;\n    \n  ],\n  &quot;volumes&quot;: [\n    \n      \"name\": \"sock\",\n      \"host\": \n        \"sourcePath\": \"/tmp/sock\"\n      \n    \n  ]","Enfin, j&#39;appelle le RegisterTaskDefinition API pour en informer le backend ECS.\n$ aws ecs register-task-definition --cli-input-json file: //inf1-task-definition.json\nNous sommes maintenant prêts à exécuter notre conteneur et à prévoir avec lui.\nExécution d&#39;un conteneur sur des instances Inf1Étant donné qu&#39;il s&#39;agit d&#39;un service de prédiction, je souhaite m&#39;assurer qu&#39;il est toujours disponible sur le cluster. Au lieu d&#39;exécuter simplement une tâche, je crée un service ECS qui s&#39;assurera que le nombre requis de copies de conteneurs est en cours d&#39;exécution, en les relançant en cas de panne.\n$ aws ecs create-service --cluster ecs-inf1-demo --service-name bert-inf1 --task-definition ecs-neuron: 1 - nombre souhaité 1\nUne minute plus tard, je vois que les deux conteneurs de tâches s&#39;exécutent sur le cluster.","Prédire avec BERT sur ECS et Inf1Le fonctionnement interne de BERT dépasse le cadre de cet article. Ce modèle particulier attend une séquence de 128 jetons, codant les mots de deux phrases que nous aimerions comparer pour l’équivalence sémantique.\nIci, je ne suis intéressé que par la mesure de la latence de prédiction, donc les données factices conviennent. Je construis 100 requêtes de prédiction stockant une séquence de 128 zéros. En utilisant l&#39;adresse IP du conteneur BERT, je les envoie au point de terminaison TensorFlow Serving via grpc, et je calcule le temps de prédiction moyen.\nVoici le code complet.\nimporter numpy comme np\nimporter grpc\nimporter tensorflow en tant que tf\ndepuis tensorflow_serving.apis import predict_pb2\ndepuis tensorflow_serving.apis import prediction_service_pb2_grpc\ntemps d&#39;importation","si __name__ == &#39;__main__&#39;:\n    canal = grpc.insecure_channel (&#39;18 .234.61.31: 8500 &#39;)\n    stub = prediction_service_pb2_grpc.PredictionServiceStub (canal)\n    request = predict_pb2.PredictRequest ()\n    request.model_spec.name = &#39;bert&#39;\n    i = np.zeros ([1, 128], dtype = np.int32)\n    request.inputs['input_ids'].CopyFrom (tf.contrib.util.make_tensor_proto (i, shape = i.shape))\n    request.inputs['input_mask'].CopyFrom (tf.contrib.util.make_tensor_proto (i, shape = i.shape))\n    request.inputs['segment_ids'].CopyFrom (tf.contrib.util.make_tensor_proto (i, shape = i.shape))","latences = []\n    pour i dans la plage (100):\n        start = time.time ()\n        result = stub.Predict (demande)\n        latencies.append (time.time () - start)\n        print (&quot;Inférence réussie: &quot;. format (i))\n    print (&quot;Ran  inférences réussies. Latence moyenne = &quot;. format (len (latences), np.average (latences)))\nPour plus de commodité, j&#39;exécute ce code sur une instance EC2 basée sur l&#39;AMI Deep Learning. Il est livré pré-installé avec un environnement Conda pour TensorFlow et TensorFlow Serving, ce qui m&#39;évite d&#39;installer des dépendances.\n$ source activate tensorflow_p36$ python predict.py\nEn moyenne, la prédiction a pris 56,5 ms. En ce qui concerne BERT, c&#39;est plutôt bien!\nRan 100 inférences avec succès. Latence moyenne = 0,05647835493087769\nCommencerVous pouvez maintenant déployer Amazon Elastic Compute Cloud (EC2) Instances Inf1 sur Amazon ECS aujourd&#39;hui dans le USA Est (Virginie du Nord) et USA Ouest (Oregon) Régions. Au fur et à mesure que le déploiement d&#39;Inf1 progresse, vous pourrez les utiliser avec Amazon ECS dans plus de régions.\nEssayez-le et envoyez-nous vos commentaires via vos contacts AWS Support habituels, sur le forum AWS pour Amazon ECS ou sur la feuille de route du conteneur sur Github.\n    &#8211; Julien","Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"],"content_blocks":[{"id":"text-1","type":"text","heading":"","plain_text":"[bzkshopping keyword= »Minecraft » count= »8&Prime; template= »grid »]","html":"<p>[bzkshopping keyword= »Minecraft » count= »8&Prime; template= »grid »]</p>"},{"id":"text-2","type":"text","heading":"","plain_text":"À mesure que les modèles d&#39;apprentissage automatique et d&#39;apprentissage en profondeur deviennent plus sophistiqués, une accélération matérielle est de plus en plus nécessaire pour fournir des prédictions rapides à haut débit. Aujourd&#39;hui, nous sommes très heureux d&#39;annoncer que les clients AWS peuvent désormais utiliser les instances Amazon EC2 Inf1 sur Amazon ECS, pour des performances élevées et le coût de prédiction le plus bas dans le cloud. Depuis quelques semaines maintenant, ces instances sont également disponibles sur Amazon Elastic Kubernetes Service.\nPrésentation des instances EC2 Inf1Les instances Inf1 ont été lancées à AWS re: Invent 2019. Elles sont alimentées par AWS Inferentia, une puce personnalisée conçue à partir de zéro par AWS pour accélérer les charges de travail d&#39;inférence de machine learning.\nLes instances Inf1 sont disponibles en plusieurs tailles, avec 1, 4 ou 16 puces AWS Inferentia, avec une bande passante réseau jusqu&#39;à 100 Gbit / s et une bande passante EBS jusqu&#39;à 19 Gbit / s. Une puce AWS Inferentia contient quatre NeuronCores. Chacun implémente un moteur de multiplication matricielle systolique haute performance, qui accélère massivement les opérations typiques d&#39;apprentissage en profondeur telles que la convolution et les transformateurs. Les NeuronCores sont également équipés d&#39;un grand cache sur puce, ce qui permet de réduire les accès à la mémoire externe, économisant ainsi du temps d&#39;E / S dans le processus. Lorsque plusieurs puces AWS Inferentia sont disponibles sur une instance Inf1, vous pouvez partitionner un modèle entre elles et le stocker entièrement dans la mémoire cache. Alternativement, pour diffuser des prédictions multi-modèles à partir d&#39;une seule instance Inf1, vous pouvez partitionner les NeuronCores d&#39;une puce AWS Inferentia sur plusieurs modèles.\nCompilation de modèles pour les instances EC2 Inf1Pour exécuter des modèles de machine learning sur des instances Inf1, vous devez les compiler en une représentation optimisée pour le matériel à l&#39;aide du kit SDK AWS Neuron. Tous les outils sont facilement disponibles sur l&#39;AMI AWS Deep Learning et vous pouvez également les installer sur vos propres instances. Vous trouverez des instructions dans la documentation AMI Deep Learning, ainsi que des didacticiels pour TensorFlow, PyTorch et Apache MXNet dans le référentiel AWS Neuron SDK.\nDans la démo ci-dessous, je vais vous montrer comment déployer un modèle optimisé pour Neuron sur un cluster ECS d&#39;instances Inf1 et comment servir des prédictions avec TensorFlow Serving. Le modèle en question est BERT, un modèle de pointe pour les tâches de traitement du langage naturel. C&#39;est un modèle énorme avec des centaines de millions de paramètres, ce qui en fait un excellent candidat pour l&#39;accélération matérielle.\nCréation d&#39;un cluster Amazon ECSCréer un cluster est la chose la plus simple: il suffit d&#39;un appel au CreateCluster API.\n$ aws ecs create-cluster - nom-cluster ecs-inf1-demo\nImmédiatement, je vois le nouveau cluster dans la console.","html":"<p>À mesure que les modèles d&#039;apprentissage automatique et d&#039;apprentissage en profondeur deviennent plus sophistiqués, une accélération matérielle est de plus en plus nécessaire pour fournir des prédictions rapides à haut débit. Aujourd&#039;hui, nous sommes très heureux d&#039;annoncer que les clients AWS peuvent désormais utiliser les instances Amazon EC2 Inf1 sur Amazon ECS, pour des performances élevées et le coût de prédiction le plus bas dans le cloud. Depuis quelques semaines maintenant, ces instances sont également disponibles sur Amazon Elastic Kubernetes Service.\nPrésentation des instances EC2 Inf1Les instances Inf1 ont été lancées à AWS re: Invent 2019. Elles sont alimentées par AWS Inferentia, une puce personnalisée conçue à partir de zéro par AWS pour accélérer les charges de travail d&#039;inférence de machine learning.\nLes instances Inf1 sont disponibles en plusieurs tailles, avec 1, 4 ou 16 puces AWS Inferentia, avec une bande passante réseau jusqu&#039;à 100 Gbit / s et une bande passante EBS jusqu&#039;à 19 Gbit / s. Une puce AWS Inferentia contient quatre NeuronCores. Chacun implémente un moteur de multiplication matricielle systolique haute performance, qui accélère massivement les opérations typiques d&#039;apprentissage en profondeur telles que la convolution et les transformateurs. Les NeuronCores sont également équipés d&#039;un grand cache sur puce, ce qui permet de réduire les accès à la mémoire externe, économisant ainsi du temps d&#039;E / S dans le processus. Lorsque plusieurs puces AWS Inferentia sont disponibles sur une instance Inf1, vous pouvez partitionner un modèle entre elles et le stocker entièrement dans la mémoire cache. Alternativement, pour diffuser des prédictions multi-modèles à partir d&#039;une seule instance Inf1, vous pouvez partitionner les NeuronCores d&#039;une puce AWS Inferentia sur plusieurs modèles.\nCompilation de modèles pour les instances EC2 Inf1Pour exécuter des modèles de machine learning sur des instances Inf1, vous devez les compiler en une représentation optimisée pour le matériel à l&#039;aide du kit SDK AWS Neuron. Tous les outils sont facilement disponibles sur l&#039;AMI AWS Deep Learning et vous pouvez également les installer sur vos propres instances. Vous trouverez des instructions dans la documentation AMI Deep Learning, ainsi que des didacticiels pour TensorFlow, PyTorch et Apache MXNet dans le référentiel AWS Neuron SDK.\nDans la démo ci-dessous, je vais vous montrer comment déployer un modèle optimisé pour Neuron sur un cluster ECS d&#039;instances Inf1 et comment servir des prédictions avec TensorFlow Serving. Le modèle en question est BERT, un modèle de pointe pour les tâches de traitement du langage naturel. C&#039;est un modèle énorme avec des centaines de millions de paramètres, ce qui en fait un excellent candidat pour l&#039;accélération matérielle.\nCréation d&#039;un cluster Amazon ECSCréer un cluster est la chose la plus simple: il suffit d&#039;un appel au CreateCluster API.\n$ aws ecs create-cluster - nom-cluster ecs-inf1-demo\nImmédiatement, je vois le nouveau cluster dans la console.</p>"},{"id":"text-3","type":"text","heading":"","plain_text":"Plusieurs prérequis sont nécessaires avant de pouvoir ajouter des instances à ce cluster:","html":"<p>Plusieurs prérequis sont nécessaires avant de pouvoir ajouter des instances à ce cluster:</p>"},{"id":"text-4","type":"text","heading":"","plain_text":"Un rôle AWS Identity and Access Management (IAM) pour les instances ECS: si vous n&#39;en avez pas déjà, vous pouvez trouver des instructions dans la documentation. Ici, mon rôle est nommé ecsInstanceRole.\nUne Amazon Machine Image (AMI) contenant l&#39;agent ECS et prenant en charge les instances Inf1. Vous pouvez créer la vôtre ou utiliser l&#39;AMI optimisée pour ECS pour Inferentia. Dans la région us-east-1, son identifiant est ami-04450f16e0cd20356.\nUn groupe de sécurité, ouvrant des ports réseau pour TensorFlow Serving (8500 pour gRPC, 8501 pour HTTP). L&#39;identifiant du mien est sg-0994f5c7ebbb48270.\nSi vous souhaitez avoir un accès ssh, votre groupe de sécurité doit également ouvrir le port 22 et vous devez transmettre le nom d&#39;une paire de clés SSH. Le mien s&#39;appelle admin.","html":"<p>Un rôle AWS Identity and Access Management (IAM) pour les instances ECS: si vous n&#039;en avez pas déjà, vous pouvez trouver des instructions dans la documentation. Ici, mon rôle est nommé ecsInstanceRole.\nUne Amazon Machine Image (AMI) contenant l&#039;agent ECS et prenant en charge les instances Inf1. Vous pouvez créer la vôtre ou utiliser l&#039;AMI optimisée pour ECS pour Inferentia. Dans la région us-east-1, son identifiant est ami-04450f16e0cd20356.\nUn groupe de sécurité, ouvrant des ports réseau pour TensorFlow Serving (8500 pour gRPC, 8501 pour HTTP). L&#039;identifiant du mien est sg-0994f5c7ebbb48270.\nSi vous souhaitez avoir un accès ssh, votre groupe de sécurité doit également ouvrir le port 22 et vous devez transmettre le nom d&#039;une paire de clés SSH. Le mien s&#039;appelle admin.</p>"},{"id":"text-5","type":"text","heading":"","plain_text":"Nous devons également créer un petit fichier de données utilisateur afin de permettre aux instances de rejoindre notre cluster. Ceci est réalisé en stockant le nom du cluster dans une variable d&#39;environnement, elle-même écrite dans le fichier de configuration de l&#39;agent ECS.\n#! / bin / bashecho ECS_CLUSTER = ecs-inf1-demo &gt;&gt; /etc/ecs/ecs.config\nNous sommes tous prêts. Ajoutons quelques instances Inf1 avec le RunInstances API. Pour minimiser les coûts, nous demanderons des instances Spot.\nInstances d&#39;exécution $ aws ec2 --image-id ami-04450f16e0cd20356 --compte 2 --instance-type inf1.xlarge --instance-market-options &#39;&quot;MarketType&quot;: &quot;spot&quot;&#39; --tag-specs &#39;ResourceType = instance, Tags =[Key=Name,Value=ecs-inf1-demo]&#39; - nom-clé admin --security-group-ids sg-0994f5c7ebbb48270 --iam-instance-profile Nom = ecsInstanceRole - fichier de données utilisateur: // données-utilisateur.txt\nLes deux instances apparaissent immédiatement dans la console EC2.","html":"<p>Nous devons également créer un petit fichier de données utilisateur afin de permettre aux instances de rejoindre notre cluster. Ceci est réalisé en stockant le nom du cluster dans une variable d&#039;environnement, elle-même écrite dans le fichier de configuration de l&#039;agent ECS.\n#! / bin / bashecho ECS_CLUSTER = ecs-inf1-demo &gt;&gt; /etc/ecs/ecs.config\nNous sommes tous prêts. Ajoutons quelques instances Inf1 avec le RunInstances API. Pour minimiser les coûts, nous demanderons des instances Spot.\nInstances d&#039;exécution $ aws ec2 --image-id ami-04450f16e0cd20356 --compte 2 --instance-type inf1.xlarge --instance-market-options &#039;&quot;MarketType&quot;: &quot;spot&quot;&#039; --tag-specs &#039;ResourceType = instance, Tags =[Key=Name,Value=ecs-inf1-demo]&#039; - nom-clé admin --security-group-ids sg-0994f5c7ebbb48270 --iam-instance-profile Nom = ecsInstanceRole - fichier de données utilisateur: // données-utilisateur.txt\nLes deux instances apparaissent immédiatement dans la console EC2.</p>"},{"id":"text-6","type":"text","heading":"","plain_text":"Quelques minutes plus tard, ils sont prêts à exécuter des tâches sur le cluster.","html":"<p>Quelques minutes plus tard, ils sont prêts à exécuter des tâches sur le cluster.</p>"},{"id":"text-7","type":"text","heading":"","plain_text":"Notre infrastructure est prête. Maintenant, construisons un conteneur stockant notre modèle BERT.\nCréation d&#39;un conteneur pour les instances Inf1le Dockerfile est assez simple:","html":"<p>Notre infrastructure est prête. Maintenant, construisons un conteneur stockant notre modèle BERT.\nCréation d&#039;un conteneur pour les instances Inf1le Dockerfile est assez simple:</p>"},{"id":"text-8","type":"text","heading":"","plain_text":"À partir d&#39;une image Amazon Linux 2, nous ouvrons les ports 8500 et 8501 pour le service TensorFlow.\nEnsuite, nous ajoutons le référentiel Neuron SDK à la liste des référentiels, et nous installons une version de TensorFlow Serving qui prend en charge AWS Inferentia.\nEnfin, nous copions notre modèle BERT à l&#39;intérieur du conteneur, et nous le chargeons au démarrage.","html":"<p>À partir d&#039;une image Amazon Linux 2, nous ouvrons les ports 8500 et 8501 pour le service TensorFlow.\nEnsuite, nous ajoutons le référentiel Neuron SDK à la liste des référentiels, et nous installons une version de TensorFlow Serving qui prend en charge AWS Inferentia.\nEnfin, nous copions notre modèle BERT à l&#039;intérieur du conteneur, et nous le chargeons au démarrage.</p>"},{"id":"text-9","type":"text","heading":"","plain_text":"Voici le dossier complet.\nDE AMAZONLINUX: 2EXPOSE 8500 8501RUN echo $ &#39;[neuron] nname = Dépôt Neuron YUM nbaseurl = https: //yum.repos.neuron.amazonaws.com nenabled = 1 &#39;&gt; /etc/yum.repos.d/neuron.repoRUN rpm - import https://yum.repos.neuron.amazonaws.com/GPG-PUB-KEY-AMAZON-AWS-NEURON.PUBRUN yum install -y tensorflow-model-server-neuronCOPIER bert / bertCMD [\"/bin/sh\", \"-c\", \"/usr/local/bin/tensorflow_model_server_neuron --port=8500 --rest_api_port=8501 --model_name=bert --model_base_path=/bert/\"]\nEnsuite, je crée et pousse le conteneur vers un référentiel hébergé dans Amazon Elastic Container Registry. Affaires comme d&#39;habitude.\n$ docker build -t neuron-tensorflow-inference.\n$ aws ecr create-repository - nom du référentiel ecs-inf1-demo\n$ aws ecr get-login-password | connexion docker --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com\n$ balise docker neuron-tensorflow-inference 123456789012.dkr.ecr.us-east-1.amazonaws.com/ecs-inf1-demo:latest\n$ docker push\nMaintenant, nous devons créer une définition de tâche afin d&#39;exécuter ce conteneur sur notre cluster.\nCréation d&#39;une définition de tâche pour les instances Inf1Si vous n&#39;en avez pas déjà, vous devez d&#39;abord créer un rôle d&#39;exécution, c&#39;est-à-dire un rôle permettant à l&#39;agent ECS d&#39;effectuer des appels d&#39;API en votre nom. Vous pouvez trouver plus d&#39;informations dans la documentation. Le mien s&#39;appelle ecsTaskExecutionRole.\nLa définition complète de la tâche est visible ci-dessous. Comme vous pouvez le voir, il contient deux conteneurs:","html":"<p>Voici le dossier complet.\nDE AMAZONLINUX: 2EXPOSE 8500 8501RUN echo $ &#039;[neuron] nname = Dépôt Neuron YUM nbaseurl = https: //yum.repos.neuron.amazonaws.com nenabled = 1 &#039;&gt; /etc/yum.repos.d/neuron.repoRUN rpm - import https://yum.repos.neuron.amazonaws.com/GPG-PUB-KEY-AMAZON-AWS-NEURON.PUBRUN yum install -y tensorflow-model-server-neuronCOPIER bert / bertCMD [&quot;/bin/sh&quot;, &quot;-c&quot;, &quot;/usr/local/bin/tensorflow_model_server_neuron --port=8500 --rest_api_port=8501 --model_name=bert --model_base_path=/bert/&quot;]\nEnsuite, je crée et pousse le conteneur vers un référentiel hébergé dans Amazon Elastic Container Registry. Affaires comme d&#039;habitude.\n$ docker build -t neuron-tensorflow-inference.\n$ aws ecr create-repository - nom du référentiel ecs-inf1-demo\n$ aws ecr get-login-password | connexion docker --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com\n$ balise docker neuron-tensorflow-inference 123456789012.dkr.ecr.us-east-1.amazonaws.com/ecs-inf1-demo:latest\n$ docker push\nMaintenant, nous devons créer une définition de tâche afin d&#039;exécuter ce conteneur sur notre cluster.\nCréation d&#039;une définition de tâche pour les instances Inf1Si vous n&#039;en avez pas déjà, vous devez d&#039;abord créer un rôle d&#039;exécution, c&#039;est-à-dire un rôle permettant à l&#039;agent ECS d&#039;effectuer des appels d&#039;API en votre nom. Vous pouvez trouver plus d&#039;informations dans la documentation. Le mien s&#039;appelle ecsTaskExecutionRole.\nLa définition complète de la tâche est visible ci-dessous. Comme vous pouvez le voir, il contient deux conteneurs:</p>"},{"id":"text-10","type":"text","heading":"","plain_text":"Le conteneur BERT que j&#39;ai construit,\nUn conteneur side-car appelé neurone-rtd, qui permet au conteneur BERT d&#39;accéder aux NeuronCores présents sur l&#39;instance Inf1. le AWS_NEURON_VISIBLE_DEVICES La variable d&#39;environnement vous permet de contrôler ceux qui peuvent être utilisés par le conteneur. Vous pouvez l&#39;utiliser pour épingler un conteneur sur un ou plusieurs NeuronCores spécifiques.","html":"<p>Le conteneur BERT que j&#039;ai construit,\nUn conteneur side-car appelé neurone-rtd, qui permet au conteneur BERT d&#039;accéder aux NeuronCores présents sur l&#039;instance Inf1. le AWS_NEURON_VISIBLE_DEVICES La variable d&#039;environnement vous permet de contrôler ceux qui peuvent être utilisés par le conteneur. Vous pouvez l&#039;utiliser pour épingler un conteneur sur un ou plusieurs NeuronCores spécifiques.</p>"},{"id":"text-11","type":"text","heading":"","plain_text":"&quot;famille&quot;: &quot;ecs-neuron&quot;,\n  &quot;executionRoleArn&quot;: &quot;arn: aws: iam :: 123456789012: role / ecsTaskExecutionRole&quot;,\n  &quot;containerDefinitions&quot;: [\n    \n      \"entryPoint\": [\n        \"sh\",\n        \"-c\"\n      ],\n      &quot;portMappings&quot;: [\n        \n          \"hostPort\": 8500,\n          \"protocol\": \"tcp\",\n          \"containerPort\": 8500\n        ,\n        \n          \"hostPort\": 8501,\n          \"protocol\": \"tcp\",\n          \"containerPort\": 8501\n        ,\n        \n          \"hostPort\": 0,\n          \"protocol\": \"tcp\",\n          \"containerPort\": 80\n        \n      ],\n      &quot;commander&quot;: [\n        \"tensorflow_model_server_neuron --port=8500 --rest_api_port=8501 --model_name=bert --model_base_path=/bert\"\n      ],\n      &quot;cpu&quot;: 0,\n      &quot;environnement&quot;: [\n        \n          \"name\": \"NEURON_RTD_ADDRESS\",\n          \"value\": \"unix:/sock/neuron-rtd.sock\"\n        \n      ],\n      &quot;mountPoints&quot;: [\n        \n          \"containerPath\": \"/sock\",\n          \"sourceVolume\": \"sock\"\n        \n      ],\n      &quot;memoryReservation&quot;: 1 000,\n      &quot;image&quot;: &quot;123456789012.dkr.ecr.us-east-1.amazonaws.com/ecs-inf1-demo:latest&quot;,\n      &quot;essentiel&quot;: vrai,\n      &quot;nom&quot;: &quot;bert&quot;\n    ,\n    \n      &quot;point d&#39;accès&quot;: [\n        \"sh\",\n        \"-c\"\n      ],\n      &quot;portMappings&quot;: [],\n      &quot;commander&quot;: [\n        \"neuron-rtd -g unix:/sock/neuron-rtd.sock\"\n      ],\n      &quot;cpu&quot;: 0,\n      &quot;environnement&quot;: [\n        \n          \"name\": \"AWS_NEURON_VISIBLE_DEVICES\",\n          \"value\": \"ALL\"\n        \n      ],\n      &quot;mountPoints&quot;: [\n        \n          \"containerPath\": \"/sock\",\n          \"sourceVolume\": \"sock\"\n        \n      ],\n      &quot;memoryReservation&quot;: 1 000,\n      &quot;image&quot;: &quot;790709498068.dkr.ecr.us-east-1.amazonaws.com/neuron-rtd:latest&quot;,\n      &quot;essentiel&quot;: vrai,\n      &quot;linuxParameters&quot;: &quot;capabilities&quot;: &quot;add&quot;: [\"SYS_ADMIN\", \"IPC_LOCK\"] ,\n      &quot;nom&quot;: &quot;neuron-rtd&quot;\n    \n  ],\n  &quot;volumes&quot;: [\n    \n      \"name\": \"sock\",\n      \"host\": \n        \"sourcePath\": \"/tmp/sock\"\n      \n    \n  ]","html":"<p>&quot;famille&quot;: &quot;ecs-neuron&quot;,\n  &quot;executionRoleArn&quot;: &quot;arn: aws: iam :: 123456789012: role / ecsTaskExecutionRole&quot;,\n  &quot;containerDefinitions&quot;: [\n    \n      &quot;entryPoint&quot;: [\n        &quot;sh&quot;,\n        &quot;-c&quot;\n      ],\n      &quot;portMappings&quot;: [\n        \n          &quot;hostPort&quot;: 8500,\n          &quot;protocol&quot;: &quot;tcp&quot;,\n          &quot;containerPort&quot;: 8500\n        ,\n        \n          &quot;hostPort&quot;: 8501,\n          &quot;protocol&quot;: &quot;tcp&quot;,\n          &quot;containerPort&quot;: 8501\n        ,\n        \n          &quot;hostPort&quot;: 0,\n          &quot;protocol&quot;: &quot;tcp&quot;,\n          &quot;containerPort&quot;: 80\n        \n      ],\n      &quot;commander&quot;: [\n        &quot;tensorflow_model_server_neuron --port=8500 --rest_api_port=8501 --model_name=bert --model_base_path=/bert&quot;\n      ],\n      &quot;cpu&quot;: 0,\n      &quot;environnement&quot;: [\n        \n          &quot;name&quot;: &quot;NEURON_RTD_ADDRESS&quot;,\n          &quot;value&quot;: &quot;unix:/sock/neuron-rtd.sock&quot;\n        \n      ],\n      &quot;mountPoints&quot;: [\n        \n          &quot;containerPath&quot;: &quot;/sock&quot;,\n          &quot;sourceVolume&quot;: &quot;sock&quot;\n        \n      ],\n      &quot;memoryReservation&quot;: 1 000,\n      &quot;image&quot;: &quot;123456789012.dkr.ecr.us-east-1.amazonaws.com/ecs-inf1-demo:latest&quot;,\n      &quot;essentiel&quot;: vrai,\n      &quot;nom&quot;: &quot;bert&quot;\n    ,\n    \n      &quot;point d&#039;accès&quot;: [\n        &quot;sh&quot;,\n        &quot;-c&quot;\n      ],\n      &quot;portMappings&quot;: [],\n      &quot;commander&quot;: [\n        &quot;neuron-rtd -g unix:/sock/neuron-rtd.sock&quot;\n      ],\n      &quot;cpu&quot;: 0,\n      &quot;environnement&quot;: [\n        \n          &quot;name&quot;: &quot;AWS_NEURON_VISIBLE_DEVICES&quot;,\n          &quot;value&quot;: &quot;ALL&quot;\n        \n      ],\n      &quot;mountPoints&quot;: [\n        \n          &quot;containerPath&quot;: &quot;/sock&quot;,\n          &quot;sourceVolume&quot;: &quot;sock&quot;\n        \n      ],\n      &quot;memoryReservation&quot;: 1 000,\n      &quot;image&quot;: &quot;790709498068.dkr.ecr.us-east-1.amazonaws.com/neuron-rtd:latest&quot;,\n      &quot;essentiel&quot;: vrai,\n      &quot;linuxParameters&quot;: &quot;capabilities&quot;: &quot;add&quot;: [&quot;SYS_ADMIN&quot;, &quot;IPC_LOCK&quot;] ,\n      &quot;nom&quot;: &quot;neuron-rtd&quot;\n    \n  ],\n  &quot;volumes&quot;: [\n    \n      &quot;name&quot;: &quot;sock&quot;,\n      &quot;host&quot;: \n        &quot;sourcePath&quot;: &quot;/tmp/sock&quot;\n      \n    \n  ]</p>"},{"id":"text-12","type":"text","heading":"","plain_text":"Enfin, j&#39;appelle le RegisterTaskDefinition API pour en informer le backend ECS.\n$ aws ecs register-task-definition --cli-input-json file: //inf1-task-definition.json\nNous sommes maintenant prêts à exécuter notre conteneur et à prévoir avec lui.\nExécution d&#39;un conteneur sur des instances Inf1Étant donné qu&#39;il s&#39;agit d&#39;un service de prédiction, je souhaite m&#39;assurer qu&#39;il est toujours disponible sur le cluster. Au lieu d&#39;exécuter simplement une tâche, je crée un service ECS qui s&#39;assurera que le nombre requis de copies de conteneurs est en cours d&#39;exécution, en les relançant en cas de panne.\n$ aws ecs create-service --cluster ecs-inf1-demo --service-name bert-inf1 --task-definition ecs-neuron: 1 - nombre souhaité 1\nUne minute plus tard, je vois que les deux conteneurs de tâches s&#39;exécutent sur le cluster.","html":"<p>Enfin, j&#039;appelle le RegisterTaskDefinition API pour en informer le backend ECS.\n$ aws ecs register-task-definition --cli-input-json file: //inf1-task-definition.json\nNous sommes maintenant prêts à exécuter notre conteneur et à prévoir avec lui.\nExécution d&#039;un conteneur sur des instances Inf1Étant donné qu&#039;il s&#039;agit d&#039;un service de prédiction, je souhaite m&#039;assurer qu&#039;il est toujours disponible sur le cluster. Au lieu d&#039;exécuter simplement une tâche, je crée un service ECS qui s&#039;assurera que le nombre requis de copies de conteneurs est en cours d&#039;exécution, en les relançant en cas de panne.\n$ aws ecs create-service --cluster ecs-inf1-demo --service-name bert-inf1 --task-definition ecs-neuron: 1 - nombre souhaité 1\nUne minute plus tard, je vois que les deux conteneurs de tâches s&#039;exécutent sur le cluster.</p>"},{"id":"text-13","type":"text","heading":"","plain_text":"Prédire avec BERT sur ECS et Inf1Le fonctionnement interne de BERT dépasse le cadre de cet article. Ce modèle particulier attend une séquence de 128 jetons, codant les mots de deux phrases que nous aimerions comparer pour l’équivalence sémantique.\nIci, je ne suis intéressé que par la mesure de la latence de prédiction, donc les données factices conviennent. Je construis 100 requêtes de prédiction stockant une séquence de 128 zéros. En utilisant l&#39;adresse IP du conteneur BERT, je les envoie au point de terminaison TensorFlow Serving via grpc, et je calcule le temps de prédiction moyen.\nVoici le code complet.\nimporter numpy comme np\nimporter grpc\nimporter tensorflow en tant que tf\ndepuis tensorflow_serving.apis import predict_pb2\ndepuis tensorflow_serving.apis import prediction_service_pb2_grpc\ntemps d&#39;importation","html":"<p>Prédire avec BERT sur ECS et Inf1Le fonctionnement interne de BERT dépasse le cadre de cet article. Ce modèle particulier attend une séquence de 128 jetons, codant les mots de deux phrases que nous aimerions comparer pour l’équivalence sémantique.\nIci, je ne suis intéressé que par la mesure de la latence de prédiction, donc les données factices conviennent. Je construis 100 requêtes de prédiction stockant une séquence de 128 zéros. En utilisant l&#039;adresse IP du conteneur BERT, je les envoie au point de terminaison TensorFlow Serving via grpc, et je calcule le temps de prédiction moyen.\nVoici le code complet.\nimporter numpy comme np\nimporter grpc\nimporter tensorflow en tant que tf\ndepuis tensorflow_serving.apis import predict_pb2\ndepuis tensorflow_serving.apis import prediction_service_pb2_grpc\ntemps d&#039;importation</p>"},{"id":"text-14","type":"text","heading":"","plain_text":"si __name__ == &#39;__main__&#39;:\n    canal = grpc.insecure_channel (&#39;18 .234.61.31: 8500 &#39;)\n    stub = prediction_service_pb2_grpc.PredictionServiceStub (canal)\n    request = predict_pb2.PredictRequest ()\n    request.model_spec.name = &#39;bert&#39;\n    i = np.zeros ([1, 128], dtype = np.int32)\n    request.inputs['input_ids'].CopyFrom (tf.contrib.util.make_tensor_proto (i, shape = i.shape))\n    request.inputs['input_mask'].CopyFrom (tf.contrib.util.make_tensor_proto (i, shape = i.shape))\n    request.inputs['segment_ids'].CopyFrom (tf.contrib.util.make_tensor_proto (i, shape = i.shape))","html":"<p>si __name__ == &#039;__main__&#039;:\n    canal = grpc.insecure_channel (&#039;18 .234.61.31: 8500 &#039;)\n    stub = prediction_service_pb2_grpc.PredictionServiceStub (canal)\n    request = predict_pb2.PredictRequest ()\n    request.model_spec.name = &#039;bert&#039;\n    i = np.zeros ([1, 128], dtype = np.int32)\n    request.inputs[&#039;input_ids&#039;].CopyFrom (tf.contrib.util.make_tensor_proto (i, shape = i.shape))\n    request.inputs[&#039;input_mask&#039;].CopyFrom (tf.contrib.util.make_tensor_proto (i, shape = i.shape))\n    request.inputs[&#039;segment_ids&#039;].CopyFrom (tf.contrib.util.make_tensor_proto (i, shape = i.shape))</p>"},{"id":"text-15","type":"text","heading":"","plain_text":"latences = []\n    pour i dans la plage (100):\n        start = time.time ()\n        result = stub.Predict (demande)\n        latencies.append (time.time () - start)\n        print (&quot;Inférence réussie: &quot;. format (i))\n    print (&quot;Ran  inférences réussies. Latence moyenne = &quot;. format (len (latences), np.average (latences)))\nPour plus de commodité, j&#39;exécute ce code sur une instance EC2 basée sur l&#39;AMI Deep Learning. Il est livré pré-installé avec un environnement Conda pour TensorFlow et TensorFlow Serving, ce qui m&#39;évite d&#39;installer des dépendances.\n$ source activate tensorflow_p36$ python predict.py\nEn moyenne, la prédiction a pris 56,5 ms. En ce qui concerne BERT, c&#39;est plutôt bien!\nRan 100 inférences avec succès. Latence moyenne = 0,05647835493087769\nCommencerVous pouvez maintenant déployer Amazon Elastic Compute Cloud (EC2) Instances Inf1 sur Amazon ECS aujourd&#39;hui dans le USA Est (Virginie du Nord) et USA Ouest (Oregon) Régions. Au fur et à mesure que le déploiement d&#39;Inf1 progresse, vous pourrez les utiliser avec Amazon ECS dans plus de régions.\nEssayez-le et envoyez-nous vos commentaires via vos contacts AWS Support habituels, sur le forum AWS pour Amazon ECS ou sur la feuille de route du conteneur sur Github.\n    &#8211; Julien","html":"<p>latences = []\n    pour i dans la plage (100):\n        start = time.time ()\n        result = stub.Predict (demande)\n        latencies.append (time.time () - start)\n        print (&quot;Inférence réussie: &quot;. format (i))\n    print (&quot;Ran  inférences réussies. Latence moyenne = &quot;. format (len (latences), np.average (latences)))\nPour plus de commodité, j&#039;exécute ce code sur une instance EC2 basée sur l&#039;AMI Deep Learning. Il est livré pré-installé avec un environnement Conda pour TensorFlow et TensorFlow Serving, ce qui m&#039;évite d&#039;installer des dépendances.\n$ source activate tensorflow_p36$ python predict.py\nEn moyenne, la prédiction a pris 56,5 ms. En ce qui concerne BERT, c&#039;est plutôt bien!\nRan 100 inférences avec succès. Latence moyenne = 0,05647835493087769\nCommencerVous pouvez maintenant déployer Amazon Elastic Compute Cloud (EC2) Instances Inf1 sur Amazon ECS aujourd&#039;hui dans le USA Est (Virginie du Nord) et USA Ouest (Oregon) Régions. Au fur et à mesure que le déploiement d&#039;Inf1 progresse, vous pourrez les utiliser avec Amazon ECS dans plus de régions.\nEssayez-le et envoyez-nous vos commentaires via vos contacts AWS Support habituels, sur le forum AWS pour Amazon ECS ou sur la feuille de route du conteneur sur Github.\n    &#8211; Julien</p>"},{"id":"text-16","type":"text","heading":"","plain_text":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]","html":"<p>Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]</p>"}],"sections":[{"id":"text-1","heading":"Text","content":"[bzkshopping keyword= »Minecraft » count= »8&Prime; template= »grid »]"},{"id":"text-2","heading":"Text","content":"À mesure que les modèles d&#39;apprentissage automatique et d&#39;apprentissage en profondeur deviennent plus sophistiqués, une accélération matérielle est de plus en plus nécessaire pour fournir des prédictions rapides à haut débit. Aujourd&#39;hui, nous sommes très heureux d&#39;annoncer que les clients AWS peuvent désormais utiliser les instances Amazon EC2 Inf1 sur Amazon ECS, pour des performances élevées et le coût de prédiction le plus bas dans le cloud. Depuis quelques semaines maintenant, ces instances sont également disponibles sur Amazon Elastic Kubernetes Service.\nPrésentation des instances EC2 Inf1Les instances Inf1 ont été lancées à AWS re: Invent 2019. Elles sont alimentées par AWS Inferentia, une puce personnalisée conçue à partir de zéro par AWS pour accélérer les charges de travail d&#39;inférence de machine learning.\nLes instances Inf1 sont disponibles en plusieurs tailles, avec 1, 4 ou 16 puces AWS Inferentia, avec une bande passante réseau jusqu&#39;à 100 Gbit / s et une bande passante EBS jusqu&#39;à 19 Gbit / s. Une puce AWS Inferentia contient quatre NeuronCores. Chacun implémente un moteur de multiplication matricielle systolique haute performance, qui accélère massivement les opérations typiques d&#39;apprentissage en profondeur telles que la convolution et les transformateurs. Les NeuronCores sont également équipés d&#39;un grand cache sur puce, ce qui permet de réduire les accès à la mémoire externe, économisant ainsi du temps d&#39;E / S dans le processus. Lorsque plusieurs puces AWS Inferentia sont disponibles sur une instance Inf1, vous pouvez partitionner un modèle entre elles et le stocker entièrement dans la mémoire cache. Alternativement, pour diffuser des prédictions multi-modèles à partir d&#39;une seule instance Inf1, vous pouvez partitionner les NeuronCores d&#39;une puce AWS Inferentia sur plusieurs modèles.\nCompilation de modèles pour les instances EC2 Inf1Pour exécuter des modèles de machine learning sur des instances Inf1, vous devez les compiler en une représentation optimisée pour le matériel à l&#39;aide du kit SDK AWS Neuron. Tous les outils sont facilement disponibles sur l&#39;AMI AWS Deep Learning et vous pouvez également les installer sur vos propres instances. Vous trouverez des instructions dans la documentation AMI Deep Learning, ainsi que des didacticiels pour TensorFlow, PyTorch et Apache MXNet dans le référentiel AWS Neuron SDK.\nDans la démo ci-dessous, je vais vous montrer comment déployer un modèle optimisé pour Neuron sur un cluster ECS d&#39;instances Inf1 et comment servir des prédictions avec TensorFlow Serving. Le modèle en question est BERT, un modèle de pointe pour les tâches de traitement du langage naturel. C&#39;est un modèle énorme avec des centaines de millions de paramètres, ce qui en fait un excellent candidat pour l&#39;accélération matérielle.\nCréation d&#39;un cluster Amazon ECSCréer un cluster est la chose la plus simple: il suffit d&#39;un appel au CreateCluster API.\n$ aws ecs create-cluster - nom-cluster ecs-inf1-demo\nImmédiatement, je vois le nouveau cluster dans la console."},{"id":"text-3","heading":"Text","content":"Plusieurs prérequis sont nécessaires avant de pouvoir ajouter des instances à ce cluster:"},{"id":"text-4","heading":"Text","content":"Un rôle AWS Identity and Access Management (IAM) pour les instances ECS: si vous n&#39;en avez pas déjà, vous pouvez trouver des instructions dans la documentation. Ici, mon rôle est nommé ecsInstanceRole.\nUne Amazon Machine Image (AMI) contenant l&#39;agent ECS et prenant en charge les instances Inf1. Vous pouvez créer la vôtre ou utiliser l&#39;AMI optimisée pour ECS pour Inferentia. Dans la région us-east-1, son identifiant est ami-04450f16e0cd20356.\nUn groupe de sécurité, ouvrant des ports réseau pour TensorFlow Serving (8500 pour gRPC, 8501 pour HTTP). L&#39;identifiant du mien est sg-0994f5c7ebbb48270.\nSi vous souhaitez avoir un accès ssh, votre groupe de sécurité doit également ouvrir le port 22 et vous devez transmettre le nom d&#39;une paire de clés SSH. Le mien s&#39;appelle admin."},{"id":"text-5","heading":"Text","content":"Nous devons également créer un petit fichier de données utilisateur afin de permettre aux instances de rejoindre notre cluster. Ceci est réalisé en stockant le nom du cluster dans une variable d&#39;environnement, elle-même écrite dans le fichier de configuration de l&#39;agent ECS.\n#! / bin / bashecho ECS_CLUSTER = ecs-inf1-demo &gt;&gt; /etc/ecs/ecs.config\nNous sommes tous prêts. Ajoutons quelques instances Inf1 avec le RunInstances API. Pour minimiser les coûts, nous demanderons des instances Spot.\nInstances d&#39;exécution $ aws ec2 --image-id ami-04450f16e0cd20356 --compte 2 --instance-type inf1.xlarge --instance-market-options &#39;&quot;MarketType&quot;: &quot;spot&quot;&#39; --tag-specs &#39;ResourceType = instance, Tags =[Key=Name,Value=ecs-inf1-demo]&#39; - nom-clé admin --security-group-ids sg-0994f5c7ebbb48270 --iam-instance-profile Nom = ecsInstanceRole - fichier de données utilisateur: // données-utilisateur.txt\nLes deux instances apparaissent immédiatement dans la console EC2."},{"id":"text-6","heading":"Text","content":"Quelques minutes plus tard, ils sont prêts à exécuter des tâches sur le cluster."},{"id":"text-7","heading":"Text","content":"Notre infrastructure est prête. Maintenant, construisons un conteneur stockant notre modèle BERT.\nCréation d&#39;un conteneur pour les instances Inf1le Dockerfile est assez simple:"},{"id":"text-8","heading":"Text","content":"À partir d&#39;une image Amazon Linux 2, nous ouvrons les ports 8500 et 8501 pour le service TensorFlow.\nEnsuite, nous ajoutons le référentiel Neuron SDK à la liste des référentiels, et nous installons une version de TensorFlow Serving qui prend en charge AWS Inferentia.\nEnfin, nous copions notre modèle BERT à l&#39;intérieur du conteneur, et nous le chargeons au démarrage."},{"id":"text-9","heading":"Text","content":"Voici le dossier complet.\nDE AMAZONLINUX: 2EXPOSE 8500 8501RUN echo $ &#39;[neuron] nname = Dépôt Neuron YUM nbaseurl = https: //yum.repos.neuron.amazonaws.com nenabled = 1 &#39;&gt; /etc/yum.repos.d/neuron.repoRUN rpm - import https://yum.repos.neuron.amazonaws.com/GPG-PUB-KEY-AMAZON-AWS-NEURON.PUBRUN yum install -y tensorflow-model-server-neuronCOPIER bert / bertCMD [\"/bin/sh\", \"-c\", \"/usr/local/bin/tensorflow_model_server_neuron --port=8500 --rest_api_port=8501 --model_name=bert --model_base_path=/bert/\"]\nEnsuite, je crée et pousse le conteneur vers un référentiel hébergé dans Amazon Elastic Container Registry. Affaires comme d&#39;habitude.\n$ docker build -t neuron-tensorflow-inference.\n$ aws ecr create-repository - nom du référentiel ecs-inf1-demo\n$ aws ecr get-login-password | connexion docker --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com\n$ balise docker neuron-tensorflow-inference 123456789012.dkr.ecr.us-east-1.amazonaws.com/ecs-inf1-demo:latest\n$ docker push\nMaintenant, nous devons créer une définition de tâche afin d&#39;exécuter ce conteneur sur notre cluster.\nCréation d&#39;une définition de tâche pour les instances Inf1Si vous n&#39;en avez pas déjà, vous devez d&#39;abord créer un rôle d&#39;exécution, c&#39;est-à-dire un rôle permettant à l&#39;agent ECS d&#39;effectuer des appels d&#39;API en votre nom. Vous pouvez trouver plus d&#39;informations dans la documentation. Le mien s&#39;appelle ecsTaskExecutionRole.\nLa définition complète de la tâche est visible ci-dessous. Comme vous pouvez le voir, il contient deux conteneurs:"},{"id":"text-10","heading":"Text","content":"Le conteneur BERT que j&#39;ai construit,\nUn conteneur side-car appelé neurone-rtd, qui permet au conteneur BERT d&#39;accéder aux NeuronCores présents sur l&#39;instance Inf1. le AWS_NEURON_VISIBLE_DEVICES La variable d&#39;environnement vous permet de contrôler ceux qui peuvent être utilisés par le conteneur. Vous pouvez l&#39;utiliser pour épingler un conteneur sur un ou plusieurs NeuronCores spécifiques."},{"id":"text-11","heading":"Text","content":"&quot;famille&quot;: &quot;ecs-neuron&quot;,\n  &quot;executionRoleArn&quot;: &quot;arn: aws: iam :: 123456789012: role / ecsTaskExecutionRole&quot;,\n  &quot;containerDefinitions&quot;: [\n    \n      \"entryPoint\": [\n        \"sh\",\n        \"-c\"\n      ],\n      &quot;portMappings&quot;: [\n        \n          \"hostPort\": 8500,\n          \"protocol\": \"tcp\",\n          \"containerPort\": 8500\n        ,\n        \n          \"hostPort\": 8501,\n          \"protocol\": \"tcp\",\n          \"containerPort\": 8501\n        ,\n        \n          \"hostPort\": 0,\n          \"protocol\": \"tcp\",\n          \"containerPort\": 80\n        \n      ],\n      &quot;commander&quot;: [\n        \"tensorflow_model_server_neuron --port=8500 --rest_api_port=8501 --model_name=bert --model_base_path=/bert\"\n      ],\n      &quot;cpu&quot;: 0,\n      &quot;environnement&quot;: [\n        \n          \"name\": \"NEURON_RTD_ADDRESS\",\n          \"value\": \"unix:/sock/neuron-rtd.sock\"\n        \n      ],\n      &quot;mountPoints&quot;: [\n        \n          \"containerPath\": \"/sock\",\n          \"sourceVolume\": \"sock\"\n        \n      ],\n      &quot;memoryReservation&quot;: 1 000,\n      &quot;image&quot;: &quot;123456789012.dkr.ecr.us-east-1.amazonaws.com/ecs-inf1-demo:latest&quot;,\n      &quot;essentiel&quot;: vrai,\n      &quot;nom&quot;: &quot;bert&quot;\n    ,\n    \n      &quot;point d&#39;accès&quot;: [\n        \"sh\",\n        \"-c\"\n      ],\n      &quot;portMappings&quot;: [],\n      &quot;commander&quot;: [\n        \"neuron-rtd -g unix:/sock/neuron-rtd.sock\"\n      ],\n      &quot;cpu&quot;: 0,\n      &quot;environnement&quot;: [\n        \n          \"name\": \"AWS_NEURON_VISIBLE_DEVICES\",\n          \"value\": \"ALL\"\n        \n      ],\n      &quot;mountPoints&quot;: [\n        \n          \"containerPath\": \"/sock\",\n          \"sourceVolume\": \"sock\"\n        \n      ],\n      &quot;memoryReservation&quot;: 1 000,\n      &quot;image&quot;: &quot;790709498068.dkr.ecr.us-east-1.amazonaws.com/neuron-rtd:latest&quot;,\n      &quot;essentiel&quot;: vrai,\n      &quot;linuxParameters&quot;: &quot;capabilities&quot;: &quot;add&quot;: [\"SYS_ADMIN\", \"IPC_LOCK\"] ,\n      &quot;nom&quot;: &quot;neuron-rtd&quot;\n    \n  ],\n  &quot;volumes&quot;: [\n    \n      \"name\": \"sock\",\n      \"host\": \n        \"sourcePath\": \"/tmp/sock\"\n      \n    \n  ]"},{"id":"text-12","heading":"Text","content":"Enfin, j&#39;appelle le RegisterTaskDefinition API pour en informer le backend ECS.\n$ aws ecs register-task-definition --cli-input-json file: //inf1-task-definition.json\nNous sommes maintenant prêts à exécuter notre conteneur et à prévoir avec lui.\nExécution d&#39;un conteneur sur des instances Inf1Étant donné qu&#39;il s&#39;agit d&#39;un service de prédiction, je souhaite m&#39;assurer qu&#39;il est toujours disponible sur le cluster. Au lieu d&#39;exécuter simplement une tâche, je crée un service ECS qui s&#39;assurera que le nombre requis de copies de conteneurs est en cours d&#39;exécution, en les relançant en cas de panne.\n$ aws ecs create-service --cluster ecs-inf1-demo --service-name bert-inf1 --task-definition ecs-neuron: 1 - nombre souhaité 1\nUne minute plus tard, je vois que les deux conteneurs de tâches s&#39;exécutent sur le cluster."},{"id":"text-13","heading":"Text","content":"Prédire avec BERT sur ECS et Inf1Le fonctionnement interne de BERT dépasse le cadre de cet article. Ce modèle particulier attend une séquence de 128 jetons, codant les mots de deux phrases que nous aimerions comparer pour l’équivalence sémantique.\nIci, je ne suis intéressé que par la mesure de la latence de prédiction, donc les données factices conviennent. Je construis 100 requêtes de prédiction stockant une séquence de 128 zéros. En utilisant l&#39;adresse IP du conteneur BERT, je les envoie au point de terminaison TensorFlow Serving via grpc, et je calcule le temps de prédiction moyen.\nVoici le code complet.\nimporter numpy comme np\nimporter grpc\nimporter tensorflow en tant que tf\ndepuis tensorflow_serving.apis import predict_pb2\ndepuis tensorflow_serving.apis import prediction_service_pb2_grpc\ntemps d&#39;importation"},{"id":"text-14","heading":"Text","content":"si __name__ == &#39;__main__&#39;:\n    canal = grpc.insecure_channel (&#39;18 .234.61.31: 8500 &#39;)\n    stub = prediction_service_pb2_grpc.PredictionServiceStub (canal)\n    request = predict_pb2.PredictRequest ()\n    request.model_spec.name = &#39;bert&#39;\n    i = np.zeros ([1, 128], dtype = np.int32)\n    request.inputs['input_ids'].CopyFrom (tf.contrib.util.make_tensor_proto (i, shape = i.shape))\n    request.inputs['input_mask'].CopyFrom (tf.contrib.util.make_tensor_proto (i, shape = i.shape))\n    request.inputs['segment_ids'].CopyFrom (tf.contrib.util.make_tensor_proto (i, shape = i.shape))"},{"id":"text-15","heading":"Text","content":"latences = []\n    pour i dans la plage (100):\n        start = time.time ()\n        result = stub.Predict (demande)\n        latencies.append (time.time () - start)\n        print (&quot;Inférence réussie: &quot;. format (i))\n    print (&quot;Ran  inférences réussies. Latence moyenne = &quot;. format (len (latences), np.average (latences)))\nPour plus de commodité, j&#39;exécute ce code sur une instance EC2 basée sur l&#39;AMI Deep Learning. Il est livré pré-installé avec un environnement Conda pour TensorFlow et TensorFlow Serving, ce qui m&#39;évite d&#39;installer des dépendances.\n$ source activate tensorflow_p36$ python predict.py\nEn moyenne, la prédiction a pris 56,5 ms. En ce qui concerne BERT, c&#39;est plutôt bien!\nRan 100 inférences avec succès. Latence moyenne = 0,05647835493087769\nCommencerVous pouvez maintenant déployer Amazon Elastic Compute Cloud (EC2) Instances Inf1 sur Amazon ECS aujourd&#39;hui dans le USA Est (Virginie du Nord) et USA Ouest (Oregon) Régions. Au fur et à mesure que le déploiement d&#39;Inf1 progresse, vous pourrez les utiliser avec Amazon ECS dans plus de régions.\nEssayez-le et envoyez-nous vos commentaires via vos contacts AWS Support habituels, sur le forum AWS pour Amazon ECS ou sur la feuille de route du conteneur sur Github.\n    &#8211; Julien"},{"id":"text-16","heading":"Text","content":"Click to rate this post!\n                                   \n                               [Total: 0  Average: 0]"}],"media":{"primary_image":"https://tutos-gameserver.fr/wp-content/uploads/2020/08/Amazon-ECS-Now-Supports-EC2-Inf1-Instances.png"},"relations":[{"rel":"canonical","href":"https://tutos-gameserver.fr/2020/08/18/amazon-ecs-prend-desormais-en-charge-les-instances-ec2-inf1-idk-dev-serveur-dimpression/"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2020/08/18/amazon-ecs-prend-desormais-en-charge-les-instances-ec2-inf1-idk-dev-serveur-dimpression/llm","type":"text/html"},{"rel":"alternate","href":"https://tutos-gameserver.fr/2020/08/18/amazon-ecs-prend-desormais-en-charge-les-instances-ec2-inf1-idk-dev-serveur-dimpression/llm.json","type":"application/json"},{"rel":"llm-manifest","href":"https://tutos-gameserver.fr/llm-endpoints-manifest.json","type":"application/json"}],"http_headers":{"X-LLM-Friendly":"1","X-LLM-Schema":"1.1.0","Content-Security-Policy":"default-src 'none'; img-src * data:; style-src 'unsafe-inline'"},"license":"CC BY-ND 4.0","attribution_required":true,"allow_cors":false}