

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Usando PyTorch -Neuron e o compilador Neuron AWS
<a name="tutorial-inferentia-pytorch-neuron"></a>

A API de compilação PyTorch -Neuron fornece um método para compilar um gráfico de modelo que você pode executar em um dispositivo Inferentia. AWS 

Um modelo treinado deve ser compilado para um destino Inferentia antes que ele possa ser implantado em instâncias Inf1. O tutorial a seguir compila o modelo torchvision ResNet 50 e o exporta como um módulo salvo. TorchScript Esse modelo é, assim sendo, usado para executar inferência.

Por conveniência, este tutorial usa uma instância Inf1 para compilação e inferência. Na prática, você pode compilar o modelo usando outro tipo de instância, como a família de instâncias c5. Depois, você deve implantar o modelo compilado no servidor de inferência Inf1. Para obter mais informações, consulte a documentação do [AWS Neuron PyTorch SDK.](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/neuron-guide/neuron-frameworks/pytorch-neuron/index.html)

**Topics**
+ [Pré-requisitos](#tutorial-inferentia-pytorch-neuron-prerequisites)
+ [Ative o ambiente Conda](#tutorial-inferentia-pytorch-neuron-activate)
+ [Compilação ResNet50](#tutorial-inferentia-pytorch-neuron-compilation)
+ [ResNet50 Inferência](#tutorial-inferentia-pytorch-neuron-inference)

## Pré-requisitos
<a name="tutorial-inferentia-pytorch-neuron-prerequisites"></a>

Antes de usar este tutorial, você precisa ter concluído os passos da configuração em [Lançamento de uma instância DLAMI com Neuron AWS](tutorial-inferentia-launching.md). Também é necessário conhecer a aprendizagem profunda e o uso da DLAMI. 

## Ative o ambiente Conda
<a name="tutorial-inferentia-pytorch-neuron-activate"></a>

Ative o ambiente PyTorch -Neuron conda usando o seguinte comando: 

```
source activate aws_neuron_pytorch_p36
```

Para sair do ambiente Conda atual, execute: 

```
source deactivate
```

## Compilação ResNet50
<a name="tutorial-inferentia-pytorch-neuron-compilation"></a>

Crie um script Python chamado **pytorch\_trace\_resnet50.py** com o conteúdo a seguir. Esse script usa a API Python de compilação PyTorch -Neuron para compilar um modelo -50. ResNet 

**nota**  
Há uma dependência entre as versões do torchvision e do pacote torch que você deve conhecer ao compilar os modelos do torchvision. Essas regras de dependência podem ser gerenciadas por meio do pip. Torchvision==0.6.1 corresponde à versão torch==1.5.1, enquanto torchvision==0.8.2 corresponde à versão 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")
```

Execute o script de compilação.

```
python pytorch_trace_resnet50.py
```

A compilação demora alguns minutos. Quando terminar, o modelo compilado será salvo como `resnet50_neuron.pt` no diretório local.

## ResNet50 Inferência
<a name="tutorial-inferentia-pytorch-neuron-inference"></a>

Crie um script Python chamado **pytorch\_infer\_resnet50.py** com o conteúdo a seguir. Esse script faz download de uma imagem de amostra e a usa para executar a inferência com o modelo compilado. 

```
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) )
```

Execute a inferência com o modelo compilado usando o seguinte comando: 

```
python pytorch_infer_resnet50.py
```

A saída será semelhante a: 

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