TensorFlow.org에서보기 | Google Colab에서 실행하기 | GitHub에서 소스 보기 | 노트북 다운로드하기 |
이 가이드는 TensorFlow 1에서 TensorFlow 2로 멀티 작업자 분산 훈련 워크플로를 마이그레이션하는 방법을 설명합니다.
CPU/GPU로 멀티 작업자 훈련은 다음과 같이 수행할 수 있습니다.
- TensorFlow 1에서는 일반적으로
tf.estimator.train_and_evaluate
및tf.estimator.Estimator
API를 사용합니다. - TensorFlow 2에서는 Keras API를 사용하여 모델, 손실 함수, 옵티마이저 및 메트릭을 작성합니다. 그런 다음
tf.distribute.experimental.ParameterServerStrategy
또는tf.distribute.MultiWorkerMirroredStrategy
을 사용하여 KerasModel.fit
API 또는 사용자 정의 훈련 루프(tf.GradientTape
포함)를 사용하여 여러 작업자에게 훈련을 배포합니다. 자세한 내용은 다음 튜토리얼을 참조하세요.
설치하기
데모를 위해 몇 가지 가져오기 및 간단한 데이터세트로 시작해 보겠습니다.
# The notebook uses a dataset instance for `Model.fit` with
# `ParameterServerStrategy`, which depends on symbols in TF 2.7.
# Install a utility needed for this demonstration
!pip install portpicker
import tensorflow as tf
import tensorflow.compat.v1 as tf1
2022-12-14 20:40:34.509143: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer.so.7'; dlerror: libnvinfer.so.7: cannot open shared object file: No such file or directory 2022-12-14 20:40:34.509259: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer_plugin.so.7'; dlerror: libnvinfer_plugin.so.7: cannot open shared object file: No such file or directory 2022-12-14 20:40:34.509271: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.
features = [[1., 1.5], [2., 2.5], [3., 3.5]]
labels = [[0.3], [0.5], [0.7]]
eval_features = [[4., 4.5], [5., 5.5], [6., 6.5]]
eval_labels = [[0.8], [0.9], [1.]]
TensorFlow의 여러 머신에서 학습하려면 'TF_CONFIG'
구성 환경 변수가 필요합니다. 'TF_CONFIG'
를 사용하여 'cluster'
및 'task'
의 주소를 지정합니다. (자세한 내용은 Distributed_training 가이드에서
import json
import os
tf_config = {
'cluster': {
'chief': ['localhost:11111'],
'worker': ['localhost:12345', 'localhost:23456', 'localhost:21212'],
'ps': ['localhost:12121', 'localhost:13131'],
},
'task': {'type': 'chief', 'index': 0}
}
os.environ['TF_CONFIG'] = json.dumps(tf_config)
참고: 안타깝게도 TensorFlow 1은 tf.estimator
API를 사용한 멀티 작업자 훈련에 멀티 클라이언트를 요구하므로(이 Colab 노트북에서 수행하기에는 특히 까다로울 수 있음) 'TF_CONFIG'
환경 변수없이 노트북을 실행할 수 있게 만들어야 하며 이는 로컬 훈련을 대체하게 됩니다(자세한 내용은 TensorFlow를 사용한 분산 훈련 가이드의 'TF_CONFIG'
환경 변수 설정하기 섹션 참조).
del
문을 사용하여 변수를 제거합니다(단, TensorFlow 1의 실제 멀티 작업자 훈련에서는 이렇게 할 필요가 없음).
del os.environ['TF_CONFIG']
TensorFlow 1: tf.estimator API를 사용한 멀티 작업자 분산 훈련
다음 코드 스니펫은 TF1에서 멀티 작업자 훈련의 정식 워크플로를 보여줍니다. tf.estimator.Estimator
, tf.estimator.TrainSpec
, tf.estimator.EvalSpec 및 <code data-md-type="codespan">tf.estimator.train_and_evaluate
API를 사용하여 훈련을 배포합니다.
def _input_fn():
return tf1.data.Dataset.from_tensor_slices((features, labels)).batch(1)
def _eval_input_fn():
return tf1.data.Dataset.from_tensor_slices(
(eval_features, eval_labels)).batch(1)
def _model_fn(features, labels, mode):
logits = tf1.layers.Dense(1)(features)
loss = tf1.losses.mean_squared_error(labels=labels, predictions=logits)
optimizer = tf1.train.AdagradOptimizer(0.05)
train_op = optimizer.minimize(loss, global_step=tf1.train.get_global_step())
return tf1.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op)
estimator = tf1.estimator.Estimator(model_fn=_model_fn)
train_spec = tf1.estimator.TrainSpec(input_fn=_input_fn)
eval_spec = tf1.estimator.EvalSpec(input_fn=_eval_input_fn)
tf1.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
INFO:tensorflow:Using default config. WARNING:tensorflow:Using temporary folder as model directory: /tmpfs/tmp/tmpk3fx8wmg INFO:tensorflow:Using config: {'_model_dir': '/tmpfs/tmp/tmpk3fx8wmg', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} INFO:tensorflow:Not using Distribute Coordinator. INFO:tensorflow:Running training and evaluation locally (non-distributed). INFO:tensorflow:Start train and evaluate loop. The evaluate will happen after every checkpoint. Checkpoint frequency is determined based on RunConfig arguments: save_checkpoints_steps None or save_checkpoints_secs 600. WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.9/site-packages/tensorflow/python/training/training_util.py:396: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version. Instructions for updating: Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts. INFO:tensorflow:Calling model_fn. WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.9/site-packages/tensorflow/python/training/adagrad.py:138: calling Constant.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version. Instructions for updating: Call initializer instance with the dtype argument instead of passing it to the constructor INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Saving checkpoints for 0 into /tmpfs/tmp/tmpk3fx8wmg/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:loss = 0.54712325, step = 0 INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 3... INFO:tensorflow:Saving checkpoints for 3 into /tmpfs/tmp/tmpk3fx8wmg/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 3... INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2022-12-14T20:40:40 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from /tmpfs/tmp/tmpk3fx8wmg/model.ckpt-3 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Inference Time : 0.15712s INFO:tensorflow:Finished evaluation at 2022-12-14-20:40:40 INFO:tensorflow:Saving dict for global step 3: global_step = 3, loss = 3.553758 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 3: /tmpfs/tmp/tmpk3fx8wmg/model.ckpt-3 INFO:tensorflow:Loss for final step: 2.188079. ({'loss': 3.553758, 'global_step': 3}, [])
TensorFlow 2: 배포 전략을 사용한 멀티 작업자 훈련
TensorFlow 2에서는 CPU, GPU, TPU를 사용하는 멀티 작업자 사이에서 분산 훈련이 tf.distribute.Strategy
를 통해 수행됩니다.
다음 예제는 tf.distribute.experimental.ParameterServerStrategy
및 tf.distribute.MultiWorkerMirroredStrategy
와 같은 두 가지 전략을 사용하는 방법을 보여줍니다. 이 두 전략은 멀티 작업자를 사용하는 CPU/GPU 훈련용으로 설계되었습니다.
ParameterServerStrategy
는 코디네이터('chief'
)를 사용하여 이 Colab 노트북 환경이 낯설지 않게 만들어 줍니다. 여기에서 몇 가지 유틸리티를 사용하여 실행 가능한 환경에 필수적인 지원 요소를 설정하게 됩니다. 여기서 스레드는 매개변수 서버(' ps'
) 및 작업자('worker'
) 시뮬레이션에 사용됩니다. 매개변수 서버 훈련에 대한 자세한 내용은 ParameterServerStrategy를 사용한 매개변수 서버 훈련 튜토리얼을 참조하세요.
이 예제에서는 먼저 tf.distribute.cluster_resolver.TFConfigClusterResolver
를 사용하여 'TF_CONFIG'
환경 변수를 정의하여 클러스터 정보를 제공합니다. 분산 훈련에 클러스터 관리 시스템을 사용하는 경우 이미 'TF_CONFIG'
를 제공하는지 확인합니다. 이 경우 이 환경 변수를 명시적으로 설정할 필요가 없습니다(자세한 내용은 TensorFlow를 사용한 분산 훈련 가이드의 'TF_CONFIG'
환경 변수 설정하기 섹션 참조).
# Find ports that are available for the `'chief'` (the coordinator),
# `'worker'`s, and `'ps'` (parameter servers).
import portpicker
chief_port = portpicker.pick_unused_port()
worker_ports = [portpicker.pick_unused_port() for _ in range(3)]
ps_ports = [portpicker.pick_unused_port() for _ in range(2)]
# Dump the cluster information to `'TF_CONFIG'`.
tf_config = {
'cluster': {
'chief': ["localhost:%s" % chief_port],
'worker': ["localhost:%s" % port for port in worker_ports],
'ps': ["localhost:%s" % port for port in ps_ports],
},
'task': {'type': 'chief', 'index': 0}
}
os.environ['TF_CONFIG'] = json.dumps(tf_config)
# Use a cluster resolver to bridge the information to the strategy created below.
cluster_resolver = tf.distribute.cluster_resolver.TFConfigClusterResolver()
그런 다음 작업자 및 매개변수 서버에 대해 tf.distribute.Server
를 하나씩 생성합니다.
# Workers need some inter_ops threads to work properly.
# This is only needed for this notebook to demo. Real servers
# should not need this.
worker_config = tf.compat.v1.ConfigProto()
worker_config.inter_op_parallelism_threads = 4
for i in range(3):
tf.distribute.Server(
cluster_resolver.cluster_spec(),
job_name="worker",
task_index=i,
config=worker_config)
for i in range(2):
tf.distribute.Server(
cluster_resolver.cluster_spec(),
job_name="ps",
task_index=i)
실제 분산 훈련에서는 코디네이터에서 모든 tf.distribute.Server
를 시작하는 대신 여러 머신을 사용하고, "worker"
및 "ps"
(매개변수 서버)로 지정된 머신은 각각 tf.distribute.Server
를 실행합니다. 자세한 내용은 매개변수 서버 훈련 튜토리얼의 실제 클러스터 섹션을 참조하세요.
모든 것이 준비되면 ParameterServerStrategy
객체를 생성합니다.
strategy = tf.distribute.experimental.ParameterServerStrategy(cluster_resolver)
INFO:tensorflow:`tf.distribute.experimental.ParameterServerStrategy` is initialized with cluster_spec: ClusterSpec({'chief': ['localhost:41645'], 'ps': ['localhost:34367', 'localhost:40111'], 'worker': ['localhost:44027', 'localhost:41339', 'localhost:39813']}) INFO:tensorflow:ParameterServerStrategyV2 is now connecting to cluster with cluster_spec: ClusterSpec({'chief': ['localhost:41645'], 'ps': ['localhost:34367', 'localhost:40111'], 'worker': ['localhost:44027', 'localhost:41339', 'localhost:39813']}) INFO:tensorflow:ParameterServerStrategy (CentralStorageStrategy if you are using a single machine) with compute_devices = ['/job:chief/replica:0/task:0/device:GPU:0', '/job:chief/replica:0/task:0/device:GPU:1', '/job:chief/replica:0/task:0/device:GPU:2', '/job:chief/replica:0/task:0/device:GPU:3'], variable_device = '/device:CPU:0' INFO:tensorflow:Number of GPUs on workers: 4
전략 개체를 생성한 후에는 모델, 옵티마이저 및 기타 변수를 정의하고 Strategy.scope
API 내에서 Keras Model.compile
을 호출하여 훈련을 배포합니다.(자세한 내용은 Strategy.scope
API 문서 참조).
예를 들어, 순방향 및 역방향 전달을 정의하여 훈련을 사용자 정의하려면 매개변수 서버 훈련 튜토리얼의 사용자 정의 훈련 루프를 사용한 훈련 섹션을 참조하세요.
dataset = tf.data.Dataset.from_tensor_slices(
(features, labels)).shuffle(10).repeat().batch(64)
eval_dataset = tf.data.Dataset.from_tensor_slices(
(eval_features, eval_labels)).repeat().batch(1)
with strategy.scope():
model = tf.keras.models.Sequential([tf.keras.layers.Dense(1)])
optimizer = tf.keras.optimizers.legacy.Adagrad(learning_rate=0.05)
model.compile(optimizer, "mse")
model.fit(dataset, epochs=5, steps_per_epoch=10)
Epoch 1/5 /tmpfs/src/tf_docs_env/lib/python3.9/site-packages/tensorflow/python/data/ops/dataset_ops.py:461: UserWarning: To make it possible to preserve tf.data options across serialization boundaries, their implementation has moved to be part of the TensorFlow graph. As a consequence, the options value is in general no longer known at graph construction time. Invoking this method in graph mode retains the legacy behavior of the original implementation, but note that the returned value might not reflect the actual value of the options. warnings.warn("To make it possible to preserve tf.data options across " 2022-12-14 20:40:41.035125: W tensorflow/core/grappler/optimizers/data/auto_shard.cc:784] AUTO sharding policy will apply DATA sharding policy as it failed to apply FILE sharding policy because of the following reason: Found an unshardable source dataset: name: "TensorSliceDataset/_2" op: "TensorSliceDataset" input: "Placeholder/_0" input: "Placeholder/_1" attr { key: "Toutput_types" value { list { type: DT_FLOAT type: DT_FLOAT } } } attr { key: "_cardinality" value { i: 3 } } attr { key: "is_files" value { b: false } } attr { key: "metadata" value { s: "\n\024TensorSliceDataset:6" } } attr { key: "output_shapes" value { list { shape { dim { size: 2 } } shape { dim { size: 1 } } } } } attr { key: "replicate_on_split" value { b: false } } experimental_type { type_id: TFT_PRODUCT args { type_id: TFT_DATASET args { type_id: TFT_PRODUCT args { type_id: TFT_TENSOR args { type_id: TFT_FLOAT } } args { type_id: TFT_TENSOR args { type_id: TFT_FLOAT } } } } } 2022-12-14 20:40:41.035254: W tensorflow/core/grappler/optimizers/data/auto_shard.cc:784] AUTO sharding policy will apply DATA sharding policy as it failed to apply FILE sharding policy because of the following reason: Found an unshardable source dataset: name: "TensorSliceDataset/_2" op: "TensorSliceDataset" input: "Placeholder/_0" input: "Placeholder/_1" attr { key: "Toutput_types" value { list { type: DT_FLOAT type: DT_FLOAT } } } attr { key: "_cardinality" value { i: 3 } } attr { key: "is_files" value { b: false } } attr { key: "metadata" value { s: "\n\024TensorSliceDataset:6" } } attr { key: "output_shapes" value { list { shape { dim { size: 2 } } shape { dim { size: 1 } } } } } attr { key: "replicate_on_split" value { b: false } } experimental_type { type_id: TFT_PRODUCT args { type_id: TFT_DATASET args { type_id: TFT_PRODUCT args { type_id: TFT_TENSOR args { type_id: TFT_FLOAT } } args { type_id: TFT_TENSOR args { type_id: TFT_FLOAT } } } } } 2022-12-14 20:40:41.035427: W tensorflow/core/grappler/optimizers/data/auto_shard.cc:784] AUTO sharding policy will apply DATA sharding policy as it failed to apply FILE sharding policy because of the following reason: Found an unshardable source dataset: name: "TensorSliceDataset/_2" op: "TensorSliceDataset" input: "Placeholder/_0" input: "Placeholder/_1" attr { key: "Toutput_types" value { list { type: DT_FLOAT type: DT_FLOAT } } } attr { key: "_cardinality" value { i: 3 } } attr { key: "is_files" value { b: false } } attr { key: "metadata" value { s: "\n\024TensorSliceDataset:6" } } attr { key: "output_shapes" value { list { shape { dim { size: 2 } } shape { dim { size: 1 } } } } } attr { key: "replicate_on_split" value { b: false } } experimental_type { type_id: TFT_PRODUCT args { type_id: TFT_DATASET args { type_id: TFT_PRODUCT args { type_id: TFT_TENSOR args { type_id: TFT_FLOAT } } args { type_id: TFT_TENSOR args { type_id: TFT_FLOAT } } } } } INFO:tensorflow:Reduce to /device:CPU:0 then broadcast to ('/replica:0/device:CPU:0',). INFO:tensorflow:Reduce to /device:CPU:0 then broadcast to ('/replica:0/device:CPU:0',). INFO:tensorflow:Reduce to /device:CPU:0 then broadcast to ('/replica:0/device:CPU:0',). INFO:tensorflow:Reduce to /device:CPU:0 then broadcast to ('/replica:0/device:CPU:0',). INFO:tensorflow:Reduce to /device:CPU:0 then broadcast to ('/replica:0/device:CPU:0',). INFO:tensorflow:Reduce to /device:CPU:0 then broadcast to ('/replica:0/device:CPU:0',). INFO:tensorflow:Reduce to /device:CPU:0 then broadcast to ('/replica:0/device:CPU:0',). INFO:tensorflow:Reduce to /device:CPU:0 then broadcast to ('/replica:0/device:CPU:0',). INFO:tensorflow:Waiting for all global closures to be finished. 10/10 - 4s - loss: 1.6077 - 4s/epoch - 413ms/step Epoch 2/5 INFO:tensorflow:Waiting for all global closures to be finished. 10/10 - 0s - loss: 0.2548 - 68ms/epoch - 7ms/step Epoch 3/5 INFO:tensorflow:Waiting for all global closures to be finished. 10/10 - 0s - loss: 0.0635 - 66ms/epoch - 7ms/step Epoch 4/5 INFO:tensorflow:Waiting for all global closures to be finished. 10/10 - 0s - loss: 0.0167 - 64ms/epoch - 6ms/step Epoch 5/5 INFO:tensorflow:Waiting for all global closures to be finished. 10/10 - 0s - loss: 0.0046 - 64ms/epoch - 6ms/step <keras.callbacks.History at 0x7f4350140e20>
model.evaluate(eval_dataset, steps=10, return_dict=True)
2022-12-14 20:40:45.531437: W tensorflow/core/grappler/optimizers/data/auto_shard.cc:784] AUTO sharding policy will apply DATA sharding policy as it failed to apply FILE sharding policy because of the following reason: Found an unshardable source dataset: name: "TensorSliceDataset/_2" op: "TensorSliceDataset" input: "Placeholder/_0" input: "Placeholder/_1" attr { key: "Toutput_types" value { list { type: DT_FLOAT type: DT_FLOAT } } } attr { key: "_cardinality" value { i: 3 } } attr { key: "is_files" value { b: false } } attr { key: "metadata" value { s: "\n\025TensorSliceDataset:10" } } attr { key: "output_shapes" value { list { shape { dim { size: 2 } } shape { dim { size: 1 } } } } } attr { key: "replicate_on_split" value { b: false } } experimental_type { type_id: TFT_PRODUCT args { type_id: TFT_DATASET args { type_id: TFT_PRODUCT args { type_id: TFT_TENSOR args { type_id: TFT_FLOAT } } args { type_id: TFT_TENSOR args { type_id: TFT_FLOAT } } } } } 2022-12-14 20:40:45.532766: W tensorflow/core/grappler/optimizers/data/auto_shard.cc:784] AUTO sharding policy will apply DATA sharding policy as it failed to apply FILE sharding policy because of the following reason: Found an unshardable source dataset: name: "TensorSliceDataset/_2" op: "TensorSliceDataset" input: "Placeholder/_0" input: "Placeholder/_1" attr { key: "Toutput_types" value { list { type: DT_FLOAT type: DT_FLOAT } } } attr { key: "_cardinality" value { i: 3 } } attr { key: "is_files" value { b: false } } attr { key: "metadata" value { s: "\n\025TensorSliceDataset:10" } } attr { key: "output_shapes" value { list { shape { dim { size: 2 } } shape { dim { size: 1 } } } } } attr { key: "replicate_on_split" value { b: false } } experimental_type { type_id: TFT_PRODUCT args { type_id: TFT_DATASET args { type_id: TFT_PRODUCT args { type_id: TFT_TENSOR args { type_id: TFT_FLOAT } } args { type_id: TFT_TENSOR args { type_id: TFT_FLOAT } } } } } 2022-12-14 20:40:45.533207: W tensorflow/core/grappler/optimizers/data/auto_shard.cc:784] AUTO sharding policy will apply DATA sharding policy as it failed to apply FILE sharding policy because of the following reason: Found an unshardable source dataset: name: "TensorSliceDataset/_2" op: "TensorSliceDataset" input: "Placeholder/_0" input: "Placeholder/_1" attr { key: "Toutput_types" value { list { type: DT_FLOAT type: DT_FLOAT } } } attr { key: "_cardinality" value { i: 3 } } attr { key: "is_files" value { b: false } } attr { key: "metadata" value { s: "\n\025TensorSliceDataset:10" } } attr { key: "output_shapes" value { list { shape { dim { size: 2 } } shape { dim { size: 1 } } } } } attr { key: "replicate_on_split" value { b: false } } experimental_type { type_id: TFT_PRODUCT args { type_id: TFT_DATASET args { type_id: TFT_PRODUCT args { type_id: TFT_TENSOR args { type_id: TFT_FLOAT } } args { type_id: TFT_TENSOR args { type_id: TFT_FLOAT } } } } } INFO:tensorflow:Reduce to /device:CPU:0 then broadcast to ('/replica:0/device:CPU:0',). INFO:tensorflow:Reduce to /device:CPU:0 then broadcast to ('/replica:0/device:CPU:0',). INFO:tensorflow:Waiting for all global closures to be finished. 10/10 - 1s - loss: 0.1067 - 1s/epoch - 121ms/step {'loss': 0.1067156195640564}
파티셔너({code 0}tf.distribute.experimental.practitioners)
TensorFlow 2의
ParameterServerStrategy
는 변수 파티셔닝을 지원하고 TensorFlow 1과 동일한 파티셔너를 덜 혼란스러운 이름으로 제공합니다.
tf.compat.v1.variable_axis_size_partitioner
->tf.distribute.experimental.partitioners.MaxSizePartitioner
: 샤드를 최대 크기 미만으로 유지하는 파티셔너입니다.tf.compat.v1.min_max_variable_partitioner
->tf.distribute.experimental.partitioners.MinSizePartitioner
: 샤드당 최소 크기를 할당하는 파티셔너입니다.tf.compat.v1.fixed_size_partitioner
->tf.distribute.experimental.partitioners.FixedShardsPartitioner
: 고정된 수의 샤드를 할당하는 파티셔너입니다.
또는, MultiWorkerMirroredStrategy
객체를 사용할 수 있습니다.
# To clean up the `TF_CONFIG` used for `ParameterServerStrategy`.
del os.environ['TF_CONFIG']
strategy = tf.distribute.MultiWorkerMirroredStrategy()
WARNING:tensorflow:Collective ops is not configured at program startup. Some performance features may not be enabled. INFO:tensorflow:Single-worker MultiWorkerMirroredStrategy with local_devices = ('/device:GPU:0', '/device:GPU:1', '/device:GPU:2', '/device:GPU:3'), communication = CommunicationImplementation.AUTO
위에서 사용한 전략을 MultiWorkerMirroredStrategy
객체로 대체하고 이 전략으로 훈련을 수행할 수 있습니다.
tf.estimator
API와 마찬가지로 MultiWorkerMirroredStrategy
는 멀티 클라이언트 전략이므로 이 Colab 노트북에서 분산 훈련을 쉽게 실행할 수 있는 방법은 없습니다. 따라서 위의 코드를 이 전략으로 바꾸면 결국 로컬에서 실행됩니다. Keras Model.fit/사용자 정의 훈련 루프를 사용한 멀티 작업자 훈련 튜토리얼은 Colab의 로컬 호스트에 두 명의 작업자가 있을 때 'TF_CONFIG'
변수로 멀티 작업자 훈련을 실행하는 방법을 보여줍니다. 실제로는 외부 IP 주소/포트에 여러 작업자를 생성하고 'TF_CONFIG'
변수를 사용하여 각 작업자의 클러스터 구성을 지정하게 될 수도 있습니다.
다음 단계
TensorFlow 2의 tf.distribute.experimental.ParameterServerStrategy
및 tf.distribute.MultiWorkerMirroredStrategy
를 사용한 멀티 작업자 분산 훈련에 대한 자세한 내용은 다음 리소스를 참조하세요.
- 튜토리얼: ParameterServerStrategy 및 Keras Model.fit/a 사용자 정의 훈련 루프를 사용한 매개변수 서버 훈련
- 튜토리얼: MultiWorkerMirroredStrategy 및 Keras Model.fit을 사용한 멀티 작업자 훈련
- 튜토리얼: MultiWorkerMirroredStrategy 및 사용자 정의 훈련 루프를 사용한 멀티 작업자 훈련
- 가이드: TensorFlow를 사용하여 분산 훈련하기
- 가이드: TensorFlow Profiler로 TensorFlow GPU 성능 최적화하기
- 가이드: GPU 사용(여러 GPU 사용하기 섹션)