翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
TensorFlow トレーニングスクリプトで SMDDP ライブラリを使用する (非推奨)
重要
SMDDP ライブラリは TensorFlow のサポートを終了し、v2.11.0 より新しい TensorFlow の DLC では使用できなくなりました。SMDDP ライブラリがインストールされている以前の TensorFlow DLC を調べるには、「サポートされるフレームワーク」を参照してください。
次のステップは、TensorFlow トレーニングスクリプトを変更して SageMaker AI の分散データ並列ライブラリを利用する方法を示しています。
ライブラリの API は Horovod の API と同様になるように設計されています。ライブラリが TensorFlow に提供する各 API の詳細については、SageMaker AI 分散データ並列 TensorFlow API ドキュメント
注記
SageMaker AI 分散データ並列は、tf.keras モジュールを除く tf コアモジュールで構成される TensorFlow トレーニングスクリプトに適応可能です。SageMaker AI 分散データ並列は、Keras 実装を使った TensorFlow はサポートしていません。
注記
SageMaker AI の分散データ並列処理ライブラリは、Automatic Mixed Precision (AMP) に標準対応しています。AMP を有効にするには、トレーニングスクリプトにフレームワークレベルの変更を加える以外、特別なアクションは必要ありません。勾配が FP16 の場合、SageMaker AI データ並列処理ライブラリは、FP16 で AllReduce オペレーションを実行します。トレーニングスクリプトへの AMP API の実装に関する詳細は、次のリソースを参照してください。
-
「Frameworks - TensorFlow
」(「NVIDIA Deep Learning Performance ドキュメント」) -
深層学習の自動混合精度
(NVIDIA デベロッパードキュメント) -
TensorFlow 混合精度 API
(TensorFlow ドキュメント)
-
ライブラリの TensorFlow クライアントをインポートし、初期化します。
import smdistributed.dataparallel.tensorflow as sdp sdp.init() -
各 GPU を 1 つの
smdistributed.dataparallelプロセスにlocal_rankを付けて固定します。これは、特定のノード内のプロセスの相対ランクを参照します。sdp.tensorflow.local_rank()API により、デバイスのローカルランクを取得できます。リーダーノードはランク 0 で、ワーカーノードはランク 1、2、3 などとなります。これは、次のコードブロックでsdp.local_rank()として呼び出されます。set_memory_growthは SageMaker AI 分散とは直接関係ありませんが、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 AI data parallel: Wrap tf.GradientTape with the library's DistributedGradientTape tape = sdp.DistributedGradientTape(tape) -
初期モデル変数をリーダーノード (ランク 0) からすべてのワーカーノード (ランク 1~n) にブロードキャストします。これは、すべてのワーカーランクにわたる一貫した初期化を保証するために必要です。モデル変数とオプティマイザ変数が初期化された後、
sdp.tensorflow.broadcast_variablesAPI を使用します。これは、次のコードブロックで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 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)
トレーニングスクリプトの調整が完了したら、「SageMaker Python SDK を使用して SMDDP で分散トレーニングジョブを開始する」に進みます。