

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á.

# Use a biblioteca SMDDP em seu script de TensorFlow treinamento (obsoleto)
<a name="data-parallel-modify-sdp-tf2"></a>

**Importante**  
A biblioteca SMDDP interrompeu o suporte TensorFlow e não está mais disponível para versões TensorFlow posteriores à DLCs v2.11.0. Para saber mais sobre TensorFlow DLCs a biblioteca SMDDP instalada, consulte. [Frameworks compatíveis](distributed-data-parallel-support.md#distributed-data-parallel-supported-frameworks)

As etapas a seguir mostram como modificar um script de TensorFlow treinamento para utilizar a biblioteca paralela de dados distribuídos da SageMaker AI.  

A biblioteca APIs foi projetada para ser semelhante à Horovod APIs. Para obter detalhes adicionais sobre cada API que a biblioteca oferece TensorFlow, consulte a [documentação da TensorFlow API SageMaker AI distributed data parallel](https://sagemaker.readthedocs.io/en/stable/api/training/smd_data_parallel.html#api-documentation).

**nota**  
SageMaker O AI Distributed Data Parallel é adaptável a scripts de TensorFlow treinamento compostos por módulos `tf` principais, exceto `tf.keras` módulos. SageMaker O AI Distributed Data Parallel não é compatível TensorFlow com a implementação do Keras.

**nota**  
A biblioteca de paralelismo de dados distribuídos de SageMaker IA oferece suporte à Precisão Mista Automática (AMP) pronta para uso. Nenhuma ação adicional é necessária para habilitar o AMP, além das modificações no nível do framework no seu script de treinamento. Se houver gradientes FP16, a biblioteca de paralelismo de dados de SageMaker IA executa sua operação em. `AllReduce` FP16 Para obter mais informações sobre como implementar APIs o AMP em seu script de treinamento, consulte os seguintes recursos:  
[Frameworks - TensorFlow](https://docs.nvidia.com/deeplearning/performance/mixed-precision-training/index.html#tensorflow) na documentação de desempenho do *NVIDIA Deep Learning*
[Precisão mista automática para aprendizado profundo](https://developer.nvidia.com/automatic-mixed-precision) nos *documentos de desenvolvedores da NVIDIA*
[TensorFlow precisão mista APIs](https://www.tensorflow.org/guide/mixed_precision) na *TensorFlowdocumentação*

1. Importe o TensorFlow cliente da biblioteca e inicialize-o.

   ```
   import smdistributed.dataparallel.tensorflow as sdp 
   sdp.init()
   ```

1. Fixe cada GPU em um único `smdistributed.dataparallel` processo com `local_rank`: isso se refere à classificação relativa do processo em um determinado nó. A API `sdp.tensorflow.local_rank()` fornece a classificação local do dispositivo para você. A classificação do nó líder é 0 e as classificações dos nós de processamento são 1, 2, 3 e assim por diante. Isso é invocado no seguinte bloco de código como`sdp.local_rank()`. `set_memory_growth`não está diretamente relacionado à SageMaker IA distribuída, mas deve ser configurado para treinamento distribuído com TensorFlow. 

   ```
   gpus = tf.config.experimental.list_physical_devices('GPU')
   for gpu in gpus:
       tf.config.experimental.set_memory_growth(gpu, True)
   if gpus:
       tf.config.experimental.set_visible_devices(gpus[sdp.local_rank()], 'GPU')
   ```

1. Escale a taxa de aprendizado pelo número de operadores. A API `sdp.tensorflow.size()` fornece o número de operadores no cluster. Isso é invocado no bloco de código a seguir como `sdp.size()`. 

   ```
   learning_rate = learning_rate * sdp.size()
   ```

1. Use a biblioteca `DistributedGradientTape` para otimizar as operações `AllReduce` durante o treinamento. Isso envolve `tf.GradientTape`.  

   ```
   with tf.GradientTape() as tape:
         output = model(input)
         loss_value = loss(label, output)
       
   # SageMaker AI data parallel: Wrap tf.GradientTape with the library's DistributedGradientTape
   tape = sdp.DistributedGradientTape(tape)
   ```

1. Transmita as variáveis iniciais do modelo do nó líder (classificação 0) para todos os nós de processamento (classificações de 1 a n). Isso é necessário para garantir uma inicialização consistente em todas as categorias de operadores. Use a API `sdp.tensorflow.broadcast_variables` depois que as variáveis do modelo e do otimizador forem inicializadas. Isso é invocado no bloco de código a seguir como `sdp.broadcast_variables()`. 

   ```
   sdp.broadcast_variables(model.variables, root_rank=0)
   sdp.broadcast_variables(opt.variables(), root_rank=0)
   ```

1. Por fim, modifique seu script para salvar pontos de verificação somente no nó líder. O nó líder tem um modelo sincronizado. Isso também evita que os nós de processamento sobrescrevam os pontos de verificação e possivelmente os corrompam. 

   ```
   if sdp.rank() == 0:
       checkpoint.save(checkpoint_dir)
   ```

Veja a seguir um exemplo de script de TensorFlow treinamento para treinamento distribuído com a biblioteca.

```
import tensorflow as tf

# SageMaker AI data parallel: Import the library TF API
import smdistributed.dataparallel.tensorflow as sdp

# SageMaker AI data parallel: Initialize the library
sdp.init()

gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
    tf.config.experimental.set_memory_growth(gpu, True)
if gpus:
    # SageMaker AI data parallel: Pin GPUs to a single library process
    tf.config.experimental.set_visible_devices(gpus[sdp.local_rank()], 'GPU')

# Prepare Dataset
dataset = tf.data.Dataset.from_tensor_slices(...)

# Define Model
mnist_model = tf.keras.Sequential(...)
loss = tf.losses.SparseCategoricalCrossentropy()

# SageMaker AI data parallel: Scale Learning Rate
# LR for 8 node run : 0.000125
# LR for single node run : 0.001
opt = tf.optimizers.Adam(0.000125 * sdp.size())

@tf.function
def training_step(images, labels, first_batch):
    with tf.GradientTape() as tape:
        probs = mnist_model(images, training=True)
        loss_value = loss(labels, probs)

    # SageMaker AI data parallel: Wrap tf.GradientTape with the library's DistributedGradientTape
    tape = sdp.DistributedGradientTape(tape)

    grads = tape.gradient(loss_value, mnist_model.trainable_variables)
    opt.apply_gradients(zip(grads, mnist_model.trainable_variables))

    if first_batch:
       # SageMaker AI data parallel: Broadcast model and optimizer variables
       sdp.broadcast_variables(mnist_model.variables, root_rank=0)
       sdp.broadcast_variables(opt.variables(), root_rank=0)

    return loss_value

...

# SageMaker AI data parallel: Save checkpoints only from master node.
if sdp.rank() == 0:
    checkpoint.save(checkpoint_dir)
```

Depois de concluir a adaptação do seu script de treinamento, prossiga para [Lançamento de trabalhos de treinamento distribuídos com SMDDP usando o Python SDK SageMaker](data-parallel-use-api.md). 