

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Utilice la biblioteca SMDDP en su script de TensorFlow entrenamiento (obsoleta)
<a name="data-parallel-modify-sdp-tf2"></a>

**importante**  
La biblioteca SMDDP dejó de ofrecer soporte para la versión TensorFlow 2.11.0 y ya no estará disponible a partir DLCs de TensorFlow esa fecha. Para encontrar versiones anteriores TensorFlow DLCs con la biblioteca SMDDP instalada, consulte. [Marcos admitidos](distributed-data-parallel-support.md#distributed-data-parallel-supported-frameworks)

Los siguientes pasos le muestran cómo modificar un script de TensorFlow entrenamiento para utilizar la biblioteca paralela de datos distribuidos de SageMaker AI.  

La biblioteca APIs está diseñada para ser similar a Horovod APIs. Para obtener información adicional sobre cada API que ofrece la biblioteca TensorFlow, consulta la [documentación de la TensorFlow API paralela de datos distribuidos de SageMaker IA](https://sagemaker.readthedocs.io/en/stable/api/training/smd_data_parallel.html#api-documentation).

**nota**  
SageMaker AI distributed data parallel se adapta a guiones de TensorFlow entrenamiento compuestos por módulos `tf` principales, excepto `tf.keras` módulos. SageMaker Los datos distribuidos paralelos de IA no son compatibles TensorFlow con la implementación de Keras.

**nota**  
La biblioteca de paralelismo de datos distribuidos mediante SageMaker IA es compatible con la precisión mixta automática (AMP) desde el primer momento. No se necesita ninguna acción adicional para habilitar AMP que no sean las modificaciones a nivel de marco de su script de entrenamiento. Si los gradientes están activados FP16, la biblioteca de paralelismo de datos de SageMaker IA ejecuta su operación en ella. `AllReduce` FP16 Para obtener más información sobre cómo implementar AMP APIs en tu guion de entrenamiento, consulta los siguientes recursos:  
[Marcos: TensorFlow](https://docs.nvidia.com/deeplearning/performance/mixed-precision-training/index.html#tensorflow) en la *documentación de rendimiento del aprendizaje profundo de NVIDIA*
[Precisión mixta automática para aprendizaje profundo](https://developer.nvidia.com/automatic-mixed-precision) en los *Documentos para desarrolladores de NVIDIA*
[TensorFlow precisión mixta APIs](https://www.tensorflow.org/guide/mixed_precision) en la *TensorFlowdocumentación*

1. Importa el TensorFlow cliente de la biblioteca e inicialízalo.

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

1. Fijar cada GPU a un único proceso de `smdistributed.dataparallel` con `local_rank`: esto se refiere a la clasificación relativa del proceso dentro de un nodo determinado. La API `sdp.tensorflow.local_rank()` proporciona la clasificación local del dispositivo. El nodo principal es el rango 0 y los nodos de trabajo son de rango 1, 2, 3, etc. Esto se invoca en el siguiente bloque de código como`sdp.local_rank()`. `set_memory_growth`no está directamente relacionado con la SageMaker IA distribuida, pero debe configurarse para el entrenamiento distribuido con ella 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 la tasa de aprendizaje según el número de trabajadores. La API `sdp.tensorflow.size()` le proporciona el número de trabajadores del clúster. Esto se invoca en el siguiente código como `sdp.size()`. 

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

1. Utilice el `DistributedGradientTape` de la biblioteca para optimizar las operaciones `AllReduce`durante el entrenamiento. Esto envuelve `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. Transmite las variables de modelo iniciales desde el nodo principal (rango 0) a todos los nodos de trabajo (rangos 1 a n). Esto es necesario para garantizar una inicialización coherente en todos los rangos de trabajo. Utilice la API `sdp.tensorflow.broadcast_variables` después de inicializar el modelo y las variables del optimizador. Esto se invoca en el siguiente bloque de código como `sdp.broadcast_variables()`. 

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

1. Por último, modifique su script para guardar los puntos de control solo en el nodo principal. El nodo principal tiene un modelo sincronizado. Esto también evita que los nodos de trabajo sobrescriban los puntos de control y, posiblemente, corrompa los puntos de control. 

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

El siguiente es un ejemplo de guion de TensorFlow entrenamiento para un entrenamiento distribuido con la 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)
```

Cuando haya terminado de adaptar su script de entrenamiento, pase a [Lanzamiento de trabajos de formación distribuidos con SMDDP mediante el SDK de Python SageMaker](data-parallel-use-api.md). 