本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 TensorFlow 訓練指令碼中使用SMDDP程式庫 (已棄用)
重要
SMDDP 程式庫已停止支援 TensorFlow ,且不再於 中提供 2.11.0 版 TensorFlow 之後DLCs的版本。若要尋找已安裝程式SMDDP庫的先前 TensorFlow DLCs ,請參閱 支援的架構。
下列步驟說明如何修改 TensorFlow 訓練指令碼,以使用 SageMaker的分散式資料平行程式庫。
程式庫APIs的設計類似於 Horovod APIs。如需有關API程式庫為 提供的每個詳細資訊 TensorFlow,請參閱SageMaker 分散式資料平行 TensorFlow API文件
注意
SageMaker 分散式資料平行處理適用於tf
核心模組以外的 TensorFlow 訓練指令碼tf.keras
。 SageMaker 分散式資料平行處理不支援 TensorFlow Keras 實作。
注意
SageMaker 分散式資料平行處理程式庫支援開箱即用的自動混合精確度 (AMP)。除了訓練指令碼的架構層級修改AMP之外,不需要額外的動作即可啟用。如果漸層位於 中FP16, SageMaker 資料平行處理程式庫會在 中執行其AllReduce
操作FP16。如需AMPAPIs實作訓練指令碼的詳細資訊,請參閱下列資源:
-
架構 - TensorFlow
在NVIDIA深度學習效能文件中 -
NVIDIA 開發人員文件中適用於深度學習的自動混合精確度
-
TensorFlow 文件中的TensorFlow 混合精確度 APIs
-
匯入程式庫的 TensorFlow 用戶端並初始化。
import smdistributed.dataparallel.tensorflow as sdp sdp.init()
-
使用 將每個 釘選GPU到單一
smdistributed.dataparallel
程序local_rank
— 這是指指定節點內程序的相對排名。sdp.tensorflow.local_rank()
API 為您提供裝置的本機排名。領導節點是等級 0,工作者節點是等級 1、2、3,依此類推。這在下列程式碼區塊中調用為sdp.local_rank()
。set_memory_growth
與 SageMaker 分散式沒有直接關聯,但必須使用 設定分散式訓練 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')
-
按工作者數量調整學習速率。
sdp.tensorflow.size()
API 為您提供叢集中的工作者數量。這在下列程式碼區塊中調用為sdp.size()
。learning_rate = learning_rate * sdp.size()
-
使用程式庫的
DistributedGradientTape
,在訓練期間最佳化AllReduce
操作。這包含tf.GradientTape
。with tf.GradientTape() as tape: output = model(input) loss_value = loss(label, output) # SageMaker data parallel: Wrap tf.GradientTape with the library's DistributedGradientTape tape = sdp.DistributedGradientTape(tape)
-
廣播從領導節點 (排名 0) 到所有工作者節點 (排名 1 到 n) 的初始模型變數。為了確保所有工作者排名初始化一致,必須這麼做。在模型和最佳化工具變數初始化
sdp.tensorflow.broadcast_variables
API後使用 。這會在下列程式碼區塊中叫用為sdp.broadcast_variables()
。sdp.broadcast_variables(model.variables, root_rank=0) sdp.broadcast_variables(opt.variables(), root_rank=0)
-
最後,修改指令碼,僅在領導節點保存檢查點。領導節點有同步化的模型。這也可避免工作者節點覆寫檢查點,以及可能損壞檢查點。
if sdp.rank() == 0: checkpoint.save(checkpoint_dir)
以下是使用 程式庫進行分散式 TensorFlow 訓練的範例訓練指令碼。
import tensorflow as tf # SageMaker data parallel: Import the library TF API import smdistributed.dataparallel.tensorflow as sdp # SageMaker 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 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 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 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 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 data parallel: Save checkpoints only from master node. if sdp.rank() == 0: checkpoint.save(checkpoint_dir)
完成訓練指令碼的調整後,請繼續前往 SMDDP 使用 SageMaker Python 啟動分散式訓練任務 SDK。