

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.

# Utilisation de PyTorch -Neuron et du compilateur Neuron AWS
<a name="tutorial-inferentia-pytorch-neuron"></a>

L'API de compilation PyTorch -Neuron fournit une méthode pour compiler un modèle de graphe que vous pouvez exécuter sur un appareil AWS Inferentia. 

Un modèle formé doit être compilé sur une cible Inferentia avant de pouvoir être déployé sur des instances Inf1. Le didacticiel suivant compile le modèle torchvision ResNet 50 et l'exporte en tant que module enregistré. TorchScript Ce modèle est ensuite utilisé pour exécuter l'inférence.

Pour plus de commodité, ce didacticiel utilise une instance Inf1 pour la compilation et l'inférence. En pratique, vous pouvez compiler votre modèle à l'aide d'un autre type d'instance, par exemple la famille d'instances c5. Vous devez ensuite déployer votre modèle compilé sur le serveur d'inférence Inf1. Pour plus d'informations, consultez la documentation du [ PyTorch SDK AWS Neuron](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/neuron-guide/neuron-frameworks/pytorch-neuron/index.html).

**Topics**
+ [Conditions préalables](#tutorial-inferentia-pytorch-neuron-prerequisites)
+ [Activation de l'environnement Conda](#tutorial-inferentia-pytorch-neuron-activate)
+ [Compilation Resnet50](#tutorial-inferentia-pytorch-neuron-compilation)
+ [ResNet50 Inférence](#tutorial-inferentia-pytorch-neuron-inference)

## Conditions préalables
<a name="tutorial-inferentia-pytorch-neuron-prerequisites"></a>

Avant d'utiliser ce didacticiel, vous devez avoir terminé les étapes de configuration figurant dans [Lancement d'une instance DLAMI avec Neuron AWS](tutorial-inferentia-launching.md). Vous devez également être familiarisé avec le deep learning et l'utilisation du DLAMI. 

## Activation de l'environnement Conda
<a name="tutorial-inferentia-pytorch-neuron-activate"></a>

Activez l'environnement PyTorch -Neuron conda à l'aide de la commande suivante : 

```
source activate aws_neuron_pytorch_p36
```

Pour quitter l'environnement Conda actuel, exécutez : 

```
source deactivate
```

## Compilation Resnet50
<a name="tutorial-inferentia-pytorch-neuron-compilation"></a>

Créez un script Python appelé **pytorch\_trace\_resnet50.py** avec le contenu suivant. Ce script utilise l'API Python de compilation PyTorch -Neuron pour compiler un modèle ResNet -50. 

**Note**  
Il existe une dépendance entre les versions de Torchvision et le package Torch dont vous devez tenir compte lorsque vous compilez des modèles Torchvision. Ces règles de dépendance peuvent être gérées via pip. Torchvision==0.6.1 correspond à la version torch==1.5.1, tandis que torchvision==0.8.2 correspond à la version torch==1.7.1.

```
import torch
import numpy as np
import os
import torch_neuron
from torchvision import models

image = torch.zeros([1, 3, 224, 224], dtype=torch.float32)

## Load a pretrained ResNet50 model
model = models.resnet50(pretrained=True)

## Tell the model we are using it for evaluation (not training)
model.eval()
model_neuron = torch.neuron.trace(model, example_inputs=[image])

## Export to saved model
model_neuron.save("resnet50_neuron.pt")
```

Exécutez le script de compilation.

```
python pytorch_trace_resnet50.py
```

La compilation prendra quelques minutes. Lorsque la compilation est terminée, le modèle compilé est enregistré `resnet50_neuron.pt` dans le répertoire local.

## ResNet50 Inférence
<a name="tutorial-inferentia-pytorch-neuron-inference"></a>

Créez un script Python appelé **pytorch\_infer\_resnet50.py** avec le contenu suivant. Ce script télécharge un exemple d'image qu’il utilise pour exécuter l'inférence avec le modèle compilé. 

```
import os
import time
import torch
import torch_neuron
import json
import numpy as np

from urllib import request

from torchvision import models, transforms, datasets

## Create an image directory containing a small kitten
os.makedirs("./torch_neuron_test/images", exist_ok=True)
request.urlretrieve("https://raw.githubusercontent.com/awslabs/mxnet-model-server/master/docs/images/kitten_small.jpg",
                    "./torch_neuron_test/images/kitten_small.jpg")


## Fetch labels to output the top classifications
request.urlretrieve("https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json","imagenet_class_index.json")
idx2label = []

with open("imagenet_class_index.json", "r") as read_file:
    class_idx = json.load(read_file)
    idx2label = [class_idx[str(k)][1] for k in range(len(class_idx))]

## Import a sample image and normalize it into a tensor
normalize = transforms.Normalize(
    mean=[0.485, 0.456, 0.406],
    std=[0.229, 0.224, 0.225])

eval_dataset = datasets.ImageFolder(
    os.path.dirname("./torch_neuron_test/"),
    transforms.Compose([
    transforms.Resize([224, 224]),
    transforms.ToTensor(),
    normalize,
    ])
)

image, _ = eval_dataset[0]
image = torch.tensor(image.numpy()[np.newaxis, ...])

## Load model
model_neuron = torch.jit.load( 'resnet50_neuron.pt' )

## Predict
results = model_neuron( image )

# Get the top 5 results
top5_idx = results[0].sort()[1][-5:]

# Lookup and print the top 5 labels
top5_labels = [idx2label[idx] for idx in top5_idx]

print("Top 5 labels:\n {}".format(top5_labels) )
```

Exécutez l'inférence avec le modèle compilé à l'aide de la commande suivante : 

```
python pytorch_infer_resnet50.py
```

Le résultat doit être similaire à ce qui suit : 

```
Top 5 labels:
 ['tiger', 'lynx', 'tiger_cat', 'Egyptian_cat', 'tabby']
```