Path: blob/master/site/ko/tutorials/distribute/parameter_server_training.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
ParameterServerStrategyλ₯Ό μ¬μ©ν λ§€κ°λ³μ μλ² νλ ¨
κ°μ
λ§€κ°λ³μ μλ² νλ ¨μ μ¬λ¬ λ¨Έμ μμ λͺ¨λΈ νλ ¨μ νμ₯νλ μΌλ°μ μΈ λ°μ΄ν° λ³λ ¬ λ°©λ²μ λλ€.
λ§€κ°λ³μ μλ² νλ ¨ ν΄λ¬μ€ν°λ μμ μμ λ§€κ°λ³μ μλ²λ‘ ꡬμ±λ©λλ€. λ³μλ λ§€κ°λ³μ μλ²μμ μμ±λλ©° κ° λ¨κ³μμ μμ μκ° μ½κ³ μ λ°μ΄νΈν©λλ€. κΈ°λ³Έμ μΌλ‘ μμ μλ μ΄λ¬ν λ³μλ₯Ό μλ‘ λκΈ°ννμ§ μκ³ λ 립μ μΌλ‘ μ½κ³ μ λ°μ΄νΈν©λλ€. μ΄ λλ¬Έμ λλ‘ λ§€κ°λ³μ μλ² ννμ νλ ¨μ λΉλκΈ° νλ ¨μ΄λΌκ³ λΆλ¦ λλ€.
TensorFlow 2μμ λ§€κ°λ³μ μλ² νλ ¨μ tf.distribute.ParameterServerStrategy
ν΄λμ€λ₯Ό κΈ°λ°μΌλ‘ νλλ°, μ΄ ν΄λμ€λ νλ ¨ λ¨κ³λ₯Ό μ΅λ μμ² κ°μ μμ
μ(λ§€κ°λ³μ μλ²μ ν¨κ»)λ‘ νμ₯λλ ν΄λ¬μ€ν°μ λ°°ν¬ν©λλ€.
μ§μλλ νλ ¨ λ°©λ²
μ§μλλ νλ ¨ λ°©λ²μλ ν¬κ² λ κ°μ§κ° μμ΅λλ€.
Keras
Model.fit
API: λμ μμ€μ μΆμν λ° νλ ¨ μ²λ¦¬λ₯Ό μνλ κ²½μ°μ μ¬μ©ν©λλ€. μΌλ°μ μΌλ‘tf.keras.Model
μ νλ ¨νλ κ²½μ° κΆμ₯λ©λλ€.μ¬μ©μ μ μ νλ ¨ 루ν: νλ ¨ 루νμ μΈλΆ μ¬νμ μ μνλ €λ κ²½μ°μ μ¬μ©ν©λλ€. μμΈν λ΄μ©μ μ¬μ©μ μ μ νλ ¨, μ²μλΆν° νλ ¨ 루ν μμ±νκΈ° λ° Keras λ° MultiWorkerMirroredStrategyλ₯Ό μ¬μ©ν μ¬μ©μ μ μ νλ ¨ 루ν κ°μ΄λλ₯Ό μ°Έμ‘°νμΈμ.
μμ λ° νμ€ν¬κ° μλ ν΄λ¬μ€ν°
μ νν API(Model.fit
λλ μ¬μ©μ μ μ νλ ¨ 루ν)μ κ΄κ³μμ΄ TensorFlow 2μ λΆμ° νλ ¨μλ μ¬λ¬ 'jobs'
μ΄ μλ 'cluster'
κ° ν¬ν¨λλ©° κ° μμ
μλ νλ μ΄μμ 'tasks'
μ΄ μμ μ μμ΅λλ€.
λ§€κ°λ³μ μλ² νλ ¨μ μ¬μ©ν λ λ€μμ΄ μλ κ²μ΄ μ’μ΅λλ€.
νλμ μ½λλ€μ΄ν° μμ (μμ μ΄λ¦μ΄
chief
)μ¬λ¬ μμ μ μμ (μμ μ΄λ¦
worker
)λ€μ€ λ§€κ°λ³μ μλ² μμ (μμ μ΄λ¦
ps
)
μ½λλ€μ΄ν°λ 리μμ€λ₯Ό μμ±νκ³ , νλ ¨ μμ
μ μ λ¬νκ³ , 체ν¬ν¬μΈνΈλ₯Ό μμ±νκ³ , μμ
μ€ν¨λ₯Ό μ²λ¦¬ν©λλ€. μμ
μμ λ§€κ°λ³μ μλ²λ μ½λλ€μ΄ν°μ μμ²μ μμ λκΈ°νλ tf.distribute.Server
μΈμ€ν΄μ€λ₯Ό μ€νν©λλ€.
Model.fit
APIλ₯Ό μ¬μ©ν λ§€κ°λ³μ μλ² νλ ¨
Model.fit
APIλ₯Ό μ¬μ©ν λ§€κ°λ³μ μλ² νλ ¨μ μν΄μλ μ½λλ€μ΄ν°κ° tf.distribute.ParameterServerStrategy
κ°μ²΄λ₯Ό μ¬μ©ν΄μΌ ν©λλ€. μ λ΅μ΄ μκ±°λ λ€λ₯Έ μ λ΅μ΄ μλ Model.fit
μ¬μ©κ³Ό μ μ¬νκ² μν¬νλ‘μλ λͺ¨λΈ μμ±κ³Ό μ»΄νμΌ, μ½λ°± μ€λΉ, λ° Model.fit
νΈμΆμ΄ ν¬ν¨λ©λλ€.
μ¬μ©μ μ μ νλ ¨ 루νλ₯Ό μ¬μ©ν λ§€κ°λ³μ μλ² νλ ¨
μ¬μ©μ μ μ νλ ¨ 루νμμ tf.distribute.coordinator.ClusterCoordinator
ν΄λμ€λ μ½λλ€μ΄ν°μ μ¬μ©λλ ν΅μ¬ κ΅¬μ± μμμ
λλ€.
ClusterCoordinator
ν΄λμ€λtf.distribute.Strategy
κ°μ²΄μ ν¨κ» μλν΄μΌ ν©λλ€.μ΄
tf.distribute.Strategy
κ°μ²΄λ ν΄λ¬μ€ν°μ μ 보λ₯Ό μ 곡νλ λ° νμνλ©° tf.distribute.Strategyλ₯Ό μ¬μ©ν μ¬μ©μ μ μ νλ ¨μ μ€λͺ λ λ°μ κ°μ΄ νλ ¨ λ¨κ³λ₯Ό μ μνλ λ° μ¬μ©λ©λλ€.κ·Έλ° λ€μ
ClusterCoordinator
κ°μ²΄λ μ΄λ¬ν νλ ¨ λ¨κ³μ μ€νμ μ격 μμ μμκ² μ λ¬ν©λλ€.λ§€κ°λ³μ μλ² νλ ¨μ μν΄
ClusterCoordinator
λtf.distribute.ParameterServerStrategy
μ ν¨κ» μλν΄μΌ ν©λλ€.
ClusterCoordinator
κ°μ²΄κ° μ 곡νλ κ°μ₯ μ€μν APIλ schedule
μ
λλ€.
schedule
APIλtf.function
μ λκΈ°μ΄μ λ£κ³ λ―Έλμ κ°μRemoteValue
λ₯Ό μ¦μ λ°νν©λλ€.λκΈ° μ€μΈ ν¨μλ λ°±κ·ΈλΌμ΄λ μ€λ λμ μ격 μμ μμκ² μ λ¬λκ³ ν΄λΉ
RemoteValue
λ λΉλκΈ°μμΌλ‘ μ±μμ§λλ€.schedule
μλ μμ μ ν λΉμ΄ νμνμ§ μμΌλ―λ‘ μ λ¬λtf.function
μ μ¬μ© κ°λ₯ν λͺ¨λ μμ μμμ μ€νν μ μμ΅λλ€.μ€νλ μμ μκ° μλ£λκΈ° μ μ μ¬μ©ν μ μκ² λλ©΄ μ¬μ© κ°λ₯ν λ€λ₯Έ μμ μμμ ν¨μκ° μ¬μλλ©λλ€.
μ΄κ²κ³Ό ν¨κ» ν¨μ μ€νμ΄ μμμ μ΄μ§ μλ€λ μ¬μ€ λλ¬Έμ λ¨μΌ ν¨μ νΈμΆμ΄ λ λ² μ΄μ μ€νλ μ μμ΅λλ€.
μ격 ν¨μλ₯Ό μ λ¬νλ μΈμλ ClusterCoordinator
λ λͺ¨λ μμ
μμ λν λ°μ΄ν°μΈνΈλ₯Ό μμ±νκ³ μμ
μκ° μ₯μ μμ 볡ꡬλ λ μ΄λ¬ν λ°μ΄ν°μΈνΈλ₯Ό μ¬κ΅¬μΆνλ λμμ μ€λλ€.
νν λ¦¬μΌ μ€μ
μ΄ νν 리μΌμ Model.fit
λ° μ¬μ©μ μ μ νλ ¨ 루ν κ²½λ‘λ‘ λΆκΈ°λλ©° νμμ λ§λ κ²½λ‘λ₯Ό μ νν μ μμ΅λλ€. "Xλ₯Ό μ΄μ©ν νλ ¨" μ΄μΈμ μΉμ
μ λ κ²½λ‘ λͺ¨λμ μ μ©ν μ μμ΅λλ€.
ν΄λ¬μ€ν° μ€μ
μμμ μΈκΈνλ―μ΄ λ§€κ°λ³μ μλ² νλ ¨ ν΄λ¬μ€ν°μλ νλ ¨ νλ‘κ·Έλ¨μ μ€ννλ μ½λλ€μ΄ν° μμ
, TensorFlow μλ² tf.distribute.Server
λ₯Ό μ€ννλ νλ μ΄μμ μμ
μ λ° λ§€κ°λ³μ μλ² μμ
, κ·Έλ¦¬κ³ μ¬μ΄λμΉ΄ νκ°λ₯Ό μ€ννλ μΆκ° νκ° μμ
μ΄ νμν©λλ€(μλ μ¬μ΄λμΉ΄ νκ° μΉμ
μ°Έμ‘°). μ€μ μꡬ μ¬νμ λ€μκ³Ό κ°μ΅λλ€.
μ½λλ€μ΄ν° μμ μ νκ°μλ₯Ό μ μΈν λ€λ₯Έ λͺ¨λ TensorFlow μλ²μ μ£Όμμ ν¬νΈλ₯Ό μμμΌ ν©λλ€.
μμ μμ λ§€κ°λ³μ μλ²λ μμ λκΈ°ν΄μΌ νλ ν¬νΈλ₯Ό μμμΌ ν©λλ€. λ¨μνκ² νκΈ° μν΄ μΌλ°μ μΌλ‘ μ΄λ¬ν μμ μμ TensorFlow μλ²λ₯Ό μμ±ν λ μ 체 ν΄λ¬μ€ν° μ 보λ₯Ό μ λ¬ν μ μμ΅λλ€.
νκ°μ μμ μ νλ ¨ ν΄λ¬μ€ν°μ μ€μ μ μ νμκ° μμ΅λλ€. μκ³ μλ€λ©΄ νλ ¨ ν΄λ¬μ€ν°μ μ°κ²°μ μλν΄μλ μ λ©λλ€.
μμ μ λ° λ§€κ°λ³μ μλ²λ κ°κ°
"worker"
λ°"ps"
μ μμ μ νμ κ°μ ΈμΌ ν©λλ€. μ½λλ€μ΄ν°λ λ κ±°μ λ¬Έμ λ‘ μΈν΄ μμ μ νμΌλ‘"chief"
λ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
μ΄ νν 리μΌμμλ μ 체 λ§€κ°λ³μ μλ² νλ ¨μ Colabμμ μ€νν μ μλλ‘ in-process ν΄λ¬μ€ν°λ₯Ό μμ±ν©λλ€. μ΄ν μΉμ μμ μ€μ ν΄λ¬μ€ν°λ₯Ό μ€μ νλ λ°©λ²μ λ°°μλλ€.
In-process ν΄λ¬μ€ν°
λ¨Όμ λͺ κ°μ TensorFlow μλ²λ₯Ό λ§λ€κ³ λμ€μ μ°κ²°ν κ²μ
λλ€. μ΄κ²μ μ΄ νν 리μΌμμ μμ°μ νκΈ° μν κ²μ΄λ©° μ€μ νλ ¨μμ μλ²λ "worker"
λ° "ps"
λ¨Έμ μμ μμλ©λλ€.
In-process ν΄λ¬μ€ν° μ€μ μ μ¬κΈ°μμμ κ°μ λ¨μ ν μ€νΈμ μμ£Ό μ¬μ©λ©λλ€.
λ‘컬 ν μ€νΈλ₯Ό μν λ λ€λ₯Έ μ΅μ μ λ‘컬 λ¨Έμ μμ νλ‘μΈμ€λ₯Ό μμνλ κ²μ λλ€. μ΄ μ κ·Ό λ°©μμ μλ₯Ό λ³΄λ €λ©΄ Kerasλ₯Ό μ¬μ©ν λ€μ€ μμ μ νλ ¨μ νμΈνμΈμ.
ParameterServerStrategy μΈμ€ν΄μ€ν
νλ ¨ μ½λλ₯Ό μ΄ν΄λ³΄κΈ° μ μ tf.distribute.ParameterServerStrategy
κ°μ²΄λ₯Ό μΈμ€ν΄μ€ννκ² μ΅λλ€. μ΄ μμ
μ Model.fit
λλ μ¬μ©μ μ μ νλ ¨ 루νλ₯Ό μ§ννλμ§ μ¬λΆμ κ΄κ³μμ΄ νμν©λλ€. variable_partitioner
μΈμλ λ³μ μ€λ© μΉμ
μμ μ€λͺ
ν©λλ€.
νλ ¨μ GPUλ₯Ό μ¬μ©νλ €λ©΄ κ° μμ
μμ νμλλ GPUλ₯Ό ν λΉν©λλ€. ParameterServerStrategy
λ κ° μμ
μμμ μ¬μ© κ°λ₯ν λͺ¨λ GPUλ₯Ό μ¬μ©νλ©° λͺ¨λ μμ
μκ° λμΌν μμ GPUλ₯Ό μ¬μ©ν μ μμ΄μΌ νλ€λ μ νμ΄ μμ΅λλ€.
κ°λ³ μ€λ©
λ³μ μ€λ©μ λ³μλ₯Ό μ€λλΌκ³ νλ μ¬λ¬ κ°μ μμ λ³μλ‘ λλλ κ²μ λ§ν©λλ€. λ³μ μ€λ©μ μ΄λ¬ν μ€λμ μ‘μΈμ€ν λ λ€νΈμν¬ λΆνλ₯Ό λΆμ°νλ λ° μ μ©ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ λ¨μΌ λ¨Έμ μ λ©λͺ¨λ¦¬μ λ§μ§ μμ μ μλ λ§€μ° ν° μλ² λ©μ μ¬μ©ν λ μΌλ° λ³μμ κ³μ°κ³Ό μ μ₯μ μ¬λ¬ λ§€κ°λ³μ μλ²μ λΆμ°νλ λ°λ μ μ©ν©λλ€.
λ³μ μ€λ©μ μ¬μ©νλ €λ©΄ ParameterServerStrategy
κ°μ²΄λ₯Ό μμ±ν λ variable_partitioner
λ₯Ό μ λ¬ν μ μμ΅λλ€. variable_partitioner
λ λ³μκ° μμ±λ λλ§λ€ νΈμΆλλ©° λ³μμ κ° μ°¨μμ λ°λΌ μ€λ μλ₯Ό λ°νν κ²μΌλ‘ μμλ©λλ€. tf.distribute.experimental.partitioners.MinSizePartitioner
μ κ°μ λͺ κ°μ§ κΈ°λ³Έ variable_partitioner
κ° μ 곡λ©λλ€. tf.distribute.experimental.partitioners.MinSizePartitioner
μ κ°μ ν¬κΈ° κΈ°λ° νν°μ
λλ₯Ό μ¬μ©νμ¬ λͺ¨λΈ νλ ¨ μλμ λΆμ μ μΈ μν₯μ μ€ μ μλ μμ λ³μμ λΆν μ λ°©μ§νλ κ²μ΄ μ’μ΅λλ€.
variable_partitioner
κ° μ λ¬λκ³ Strategy.scope
λ°λ‘ μλμ λ³μλ₯Ό μμ±νλ©΄ λ³μλ μ€λ λͺ©λ‘μ λν μ‘μΈμ€λ₯Ό μ 곡νλ variables
μμ±μ΄ μλ 컨ν
μ΄λ μ νμ΄ λ©λλ€. λλΆλΆμ κ²½μ° μ΄ μ»¨ν
μ΄λλ λͺ¨λ μ€λλ₯Ό μ°κ²°νμ¬ μλμΌλ‘ ν
μλ‘ λ³νλ©λλ€. κ²°κ³Όμ μΌλ‘ μΌλ° λ³μλ‘ μ¬μ©ν μ μμ΅λλ€. λ°λ©΄μ tf.nn.embedding_lookup
κ³Ό κ°μ μΌλΆ TensorFlow λ©μλλ μ΄ μ»¨ν
μ΄λ μ νμ λν ν¨μ¨μ μΈ κ΅¬νμ μ 곡νλ©° μ΄λ¬ν λ©μλμμλ μλ μ°κ²°μ΄ λ°©μ§λ©λλ€.
μμΈν λ΄μ©μ tf.distribute.ParameterServerStrategy
μ API λ¬Έμλ₯Ό μ°Έμ‘°νμΈμ.
Model.fit
μΌλ‘ νλ ¨νκΈ°
Kerasλ μ¬μ μ κ°λ₯ν train_step
μ μ μ°μ±, κ·Έλ¦¬κ³ TensorBoardμ λν 체ν¬ν¬μΈνΈ μ μ₯ λλ μμ½ μ μ₯κ³Ό κ°μ κΈ°λ₯μ μ 곡νλ μ½λ°±κ³Ό ν¨κ» λ§νμμ νλ ¨ 루νλ₯Ό μ²λ¦¬νλ Model.fit
μ ν΅ν΄ μ¬μ©νκΈ° μ¬μ΄ νλ ¨ APIλ₯Ό μ 곡ν©λλ€. Model.fit
μ μ¬μ©νλ©΄ κ°λ¨ν μ λ΅ κ°μ²΄λ§ κ΅μ²΄νμ¬ λ€λ₯Έ μ λ΅μμ λμΌν νλ ¨ μ½λλ₯Ό μ¬μ©ν μ μμ΅λλ€.
μ λ ₯ λ°μ΄ν°
Model.fit
μ ν¬ν¨ν tf.distribute.ParameterServerStrategy
μ tf.data.Dataset
, tf.distribute.DistributedDataset
λλ tf.keras.utils.experimental.DatasetCreator
νμμΌλ‘ μ
λ ₯ λ°μ΄ν°λ₯Ό λ°μ μ μμΌλ©° Dataset
μ μ¬μ© νΈλ¦¬μ±μ μν΄ κΆμ₯λλ μ΅μ
μ
λλ€. κ·Έλ¬λ Dataset
μ μ¬μ©νμ¬ λ©λͺ¨λ¦¬ λ¬Έμ κ° λ°μνλ©΄ νΈμΆ κ°λ₯ν dataset_fn
μΈμμ ν¨κ» DatasetCreator
λ₯Ό μ¬μ©ν΄μΌ ν μλ μμ΅λλ€(μμΈν λ΄μ©μ tf.keras.utils.experimental.DatasetCreator
API μ€λͺ
μ μ°Έμ‘°).
λ°μ΄ν°μΈνΈλ₯Ό tf.data.Dataset
μΌλ‘ λ³ννλ κ²½μ° μλ μ½λ μμ μ κ°μ΄ Dataset.shuffle
λ° Dataset.repeat
λ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
λ§€κ°λ³μ μλ² νλ ¨μ΄ ν¬ν¨λ
Model.fit
μ λ€λ₯΄κ² μμΈ κ²½μ°λ₯Ό μ μΈνκ³ κ° μμ μκ° λμΌν λ°μ΄ν°μΈνΈλ₯Ό λ°λλ€κ³ κ°μ ν©λλ€. λ°λΌμDataset.shuffle
μ νΈμΆνμ¬ λ°μ΄ν°μ λν΄ λ κ· μΌν λ°λ³΅μ 보μ₯ν μ μμ΅λλ€.μμ μλ λκΈ°ννμ§ μκΈ° λλ¬Έμ μλ‘ λ€λ₯Έ μκ°μ λ°μ΄ν°μΈνΈ μ²λ¦¬λ₯Ό μλ£ν μ μμ΅λλ€. λ°λΌμ λ§€κ°λ³μ μλ² νλ ¨μΌλ‘ epochλ₯Ό μ μνλ κ°μ₯ μ¬μ΄ λ°©λ²μ
Dataset.repeat
(μΈμ μμ΄ νΈμΆλ λ λ°μ΄ν°μΈνΈλ₯Ό 무νν λ°λ³΅ν¨)λ₯Ό μ¬μ©νκ³Model.fit
νΈμΆμμsteps_per_epoch
μΈμλ₯Ό μ§μ νλ κ²μ λλ€.
shuffle
λ° repeat
μ λν μμΈν λ΄μ©μ tf.data κ°μ΄λμ "νλ ¨ μν¬νλ‘" μΉμ
μ μ°Έμ‘°νμΈμ.
λμ tf.keras.utils.experimental.DatasetCreator
λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°μΈνΈλ₯Ό μμ±νλ©΄ κ° μμ
μ λ¨Έμ μ μ
λ ₯ μ₯μΉ(μΌλ°μ μΌλ‘ CPU)μμ dataset_fn
μ μ½λκ° νΈμΆλ©λλ€.
λͺ¨λΈ κ΅¬μ± λ° μ»΄νμΌ
μ΄μ λ°λͺ¨ λͺ©μ μ κ°λ¨ν tf.keras.models.Sequential
λͺ¨λΈμΈ tf.keras.Model
μ λ§λ λ€μ μ΅ν°λ§μ΄μ μ κ°μ κ΅¬μ± μμ λ° steps_per_execution
κ³Ό κ°μ κΈ°ν λ§€κ°λ³μλ₯Ό λμ
νκΈ° μν Model.compile
νΈμΆμ΄ μ΄λ£¨μ΄μ§λλ€.
μ½λ°± λ° νλ ¨
μ€μ νλ ¨μ μν΄ Keras Model.fit
μ νΈμΆνκΈ° μ μ λ€μκ³Ό κ°μ μΌλ°μ μΈ μμ
μ νμν μ½λ°±μ μ€λΉν©λλ€.
tf.keras.callbacks.ModelCheckpoint
: λ§€ epoch νμ κ°μ΄ νΉμ λΉλλ‘ λͺ¨λΈμ μ μ₯ν©λλ€.tf.keras.callbacks.BackupAndRestore
: ν΄λ¬μ€ν°μ μ¬μ© λΆκ°λ₯ν μν©(μ€λ¨ λλ μ μ λ±)μ΄ λ°μνλ κ²½μ° λͺ¨λΈκ³Ό νμ¬ epoch λ²νΈλ₯Ό λ°±μ νμ¬ λ΄κ²°ν¨μ±μ μ 곡ν©λλ€. κ·Έλ° λ€μ μμ μ€ν¨ ν λ€μ μμν λ νλ ¨ μνλ₯Ό 볡μνκ³ μ€λ¨λ epochμ μμ λΆλΆλΆν° νλ ¨μ κ³μν μ μμ΅λλ€.tf.keras.callbacks.TensorBoard
: μμ½ νμΌμ TensorBoard λꡬμμ μκ°νν μ μλ λͺ¨λΈ λ‘κ·Έλ₯Ό μ£ΌκΈ°μ μΌλ‘ μμ±ν©λλ€.
μ°Έκ³ : μ±λ₯ κ³ λ € μ¬νμΌλ‘ μΈν΄ μ¬μ©μ μ μ μ½λ°±μ ParameterServerStrategy
μ ν¨κ» μ¬μ©λ λ μΌκ΄ μ²λ¦¬ μμ€ μ½λ°±μ μ¬μ μν μ μμ΅λλ€. μ¬μ©μ μ μ μ½λ°±μ μμ νμ¬ epoch μμ€ νΈμΆμ΄ λλλ‘ νκ³ steps_per_epoch
λ₯Ό μ μ ν κ°μΌλ‘ μ‘°μ ν©λλ€. λν steps_per_epoch
λ ParameterServerStrategy
μ ν¨κ» μ¬μ©ν λ Model.fit
μ λν νμ μΈμμ
λλ€.
ClusterCoordinator
λ‘ μ§μ μ¬μ©(μ ν μ¬ν)
Model.fit
νλ ¨ κ²½λ‘λ₯Ό μ ννλλΌλ tf.distribute.coordinator.ClusterCoordinator
κ°μ²΄λ₯Ό μ νμ μΌλ‘ μΈμ€ν΄μ€ννμ¬ μμ
μμμ μ€ννλ €λ λ€λ₯Έ ν¨μλ₯Ό μμ½ν μ μμ΅λλ€. μμΈν λ΄μ©κ³Ό μμ λ μ¬μ©μ μ μ νλ ¨ 루νλ₯Ό μ¬μ©ν νλ ¨ μΉμ
μ μ°Έμ‘°νμΈμ.
μ¬μ©μ μ μ νλ ¨ 루νλ₯Ό μ¬μ©ν νλ ¨
tf.distribute.Strategy
μ ν¨κ» μ¬μ©μ μ μ νλ ¨ 루νλ₯Ό μ¬μ©νλ©΄ νλ ¨ 루νλ₯Ό μ μνλ ν° μ μ°μ±μ΄ μκΉλλ€. μμμ μ μν ParameterServerStrategy
(strategy
)λ‘ tf.distribute.coordinator.ClusterCoordinator
λ₯Ό μ¬μ©νμ¬ νλ ¨ λ¨κ³ μ€νμ μ격 μμ
μμκ² μ λ¬ν©λλ€.
κ·Έλ° λ€μ λ€λ₯Έ tf.distribute.Strategy
λ₯Ό μ¬μ©νμ¬ νλ ¨ 루νμμ μνν κ²μ²λΌ λͺ¨λΈμ μμ±νκ³ , λ°μ΄ν°μΈνΈλ₯Ό μ μνκ³ , λ¨κ³ ν¨μλ₯Ό μ μν©λλ€. tf.distribute.Strategyλ₯Ό μ¬μ©ν μ¬μ©μ μ μ νλ ¨ νν 리μΌμμ μμΈν λ΄μ©μ μ°Ύμ μ μμ΅λλ€.
ν¨μ¨μ μΈ λ°μ΄ν°μΈνΈ 미리 κ°μ Έμ€κΈ°λ₯Ό μν΄ μλ μ격 μμ
μμκ² νλ ¨ λ¨κ³ μ λ¬νκΈ° μΉμ
μ μΈκΈλ κΆμ₯ λΆμ° λ°μ΄ν°μΈνΈ μμ± APIλ₯Ό μ¬μ©νμΈμ. λν μμ
μμκ² ν λΉλ GPUλ₯Ό μ΅λν νμ©νλ €λ©΄ worker_fn
λ΄μμ Strategy.run
μ νΈμΆν΄μΌ ν©λλ€. λλ¨Έμ§ λ¨κ³λ GPUκ° μκ±°λ μλ νλ ¨μ λν΄ λμΌν©λλ€.
λ€μ λ¨κ³μμ μ΄λ¬ν κ΅¬μ± μμλ₯Ό λ§λ€μ΄ λ³΄κ² μ΅λλ€.
λ°μ΄ν° μ€μ νκΈ°
λ¨Όμ λ°μ΄ν°μΈνΈλ₯Ό μμ±νλ ν¨μλ₯Ό μμ±ν©λλ€.
Keras μ μ²λ¦¬ λ μ΄μ΄ λλ Tensorflow Transform λ μ΄μ΄λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό μ μ²λ¦¬νλ €λ©΄ λ€λ₯Έ Keras λ μ΄μ΄μ κ²½μ°μ λ§μ°¬κ°μ§λ‘ dataset_fn
μΈλΆμ Strategy.scope
μλμ μ΄λ¬ν λ μ΄μ΄λ₯Ό μμ±ν©λλ€. μ΄λ dataset_fn
μ΄ tf.function
μΌλ‘ λνλ λ€μ κ° μμ
μμμ μ€νλμ΄ λ°μ΄ν° νμ΄νλΌμΈμ μμ±νκΈ° λλ¬Έμ
λλ€.
μμ μ μ°¨λ₯Ό λ°λ₯΄μ§ μμΌλ©΄ λ μ΄μ΄λ₯Ό μμ±ν λ tf.function
μμ μ½λλ€μ΄ν°λ‘ ν΄μ λλ Tensorflow μνκ° μμ±λ μ μμ΅λλ€. λ°λΌμ μμ
μμμ μ¬κΈ°μ μ‘μΈμ€νλ©΄ μ½λλ€μ΄ν°μ μμ
μ κ°μ λ°λ³΅μ μΈ RPC νΈμΆμ΄ λ°μνκ³ μλΉν μλ μ νκ° λ°μν©λλ€.
Strategy.scope
μλμ λ μ΄μ΄λ₯Ό λ°°μΉνλ©΄ λμ λͺ¨λ μμ
μμμ λ μ΄μ΄κ° μμ±λ©λλ€. κ·Έλ¬λ©΄ tf.data.Dataset.map
μ ν΅ν΄ dataset_fn
λ΄μ λ³νμ μ μ©ν©λλ€. λΆμ° μ
λ ₯μ μ¬μ©ν λ°μ΄ν° μ μ²λ¦¬μ λν μμΈν λ΄μ©μ λΆμ° μ
λ ₯ νν 리μΌμ λ°μ΄ν° μ μ²λ¦¬λ₯Ό μ°Έμ‘°νμΈμ.
λ°μ΄ν°μΈνΈμμ μ₯λκ° μμ μμ±:
κ·Έλ° λ€μ dataset_fn
μ λνλ νλ ¨ λ°μ΄ν°μΈνΈλ₯Ό μμ±ν©λλ€.
λͺ¨λΈ ꡬμΆνκΈ°
λ€μμΌλ‘ λͺ¨λΈ λ° κΈ°ν κ°μ²΄λ₯Ό λ§λλλ€. Strategy.scope
μλμ λͺ¨λ λ³μλ₯Ό μμ±ν΄μΌ ν©λλ€.
FixedShardsPartitioner
μ μ¬μ©μΌλ‘ λͺ¨λ λ³μκ° λ κ°μ μ€λλ‘ λΆν λκ³ κ° μ€λκ° λ€λ₯Έ λ§€κ°λ³μ μλ²μ ν λΉλμλμ§ νμΈνκ² μ΅λλ€.
νλ ¨ λ¨κ³ μ μνκΈ°
μ
μ§Έ, tf.function
μ λνλ νλ ¨ λ¨κ³λ₯Ό μμ±ν©λλ€.
μμ νλ ¨ λ¨κ³ ν¨μμμ step_fn
μμ Strategy.run
λ° Strategy.reduce
λ₯Ό νΈμΆνλ©΄ μμ
μλΉ μ¬λ¬ GPUλ₯Ό μ§μν μ μμ΅λλ€. μμ
μμκ² GPUκ° ν λΉλ κ²½μ° Strategy.run
μ λ°μ΄ν°μΈνΈλ₯Ό μ¬λ¬ 볡μ λ³Έμ λ°°ν¬ν©λλ€.
μ격 μμ μμκ² κ΅μ‘ λ¨κ³ μ λ¬νκΈ°
λͺ¨λ κ³μ°μ΄ ParameterServerStrategy
μ μν΄ μ μλ ν tf.distribute.coordinator.ClusterCoordinator
ν΄λμ€λ₯Ό μ¬μ©νμ¬ λ¦¬μμ€λ₯Ό μμ±νκ³ νλ ¨ λ¨κ³λ₯Ό μ격 μμ
μμκ² λ°°ν¬ν©λλ€.
λ¨Όμ ClusterCoordinator
κ°μ²΄λ₯Ό λ§λ€κ³ μ λ΅ κ°μ²΄λ₯Ό μ λ¬ν΄ λ³΄κ² μ΅λλ€.
κ·Έλ° λ€μ λͺ¨λ μμ
μμκ² λ°μ΄ν°μΈνΈλ₯Ό 볡μ νλ ClusterCoordinator.create_per_worker_dataset
APIλ₯Ό μ¬μ©νμ¬ μμ
μλ³ λ°μ΄ν°μΈνΈμ λ°λ³΅μλ₯Ό λ§λλλ€. GPUλ‘ λ―Έλ¦¬ κ°μ Έμ€κΈ°κ° μννκ³ ν¨μ¨μ μΌλ‘ μνλλλ‘ μλ per_worker_dataset_fn
μμ dataset_fn
μ strategy.distribute_datasets_from_function
μΌλ‘ λννλ κ²μ΄ μ’μ΅λλ€.
λ§μ§λ§ λ¨κ³λ ClusterCoordinator.schedule
μ μ¬μ©νμ¬ μ격 μμ
μμκ² κ³μ°μ λ°°ν¬νλ κ²μ
λλ€.
schedule
λ©μλλtf.function
μ λκΈ°μ΄μ λ£κ³ λ―Έλμ κ°μRemoteValue
λ₯Ό μ¦μ λ°νν©λλ€. λκΈ°μ΄μ λμΈ ν¨μλ λ°±κ·ΈλΌμ΄λ μ€λ λμ μ격 μμ μμκ² μ λ¬λκ³RemoteValue
λ λΉλκΈ°μμΌλ‘ μ±μμ§λλ€.join
λ©μλ(ClusterCoordinator.join
)λ μμ½λ λͺ¨λ ν¨μκ° μ€νλ λκΉμ§ λκΈ°νλ λ° μ¬μ©ν μ μμ΅λλ€.
λ€μμ RemoteValue
μ κ²°κ³Όλ₯Ό κ°μ Έμ€λ λ°©λ²μ
λλ€.
λλ λͺ¨λ λ¨κ³λ₯Ό μμνκ³ μλ£λ₯Ό κΈ°λ€λ¦¬λ λμ μμ μ μνν μ μμ΅λλ€.
μ΄ νΉμ μμ μ λν μ 체 νλ ¨ λ° μ 곡 μν¬νλ‘λ μ΄ ν μ€νΈλ₯Ό νμΈνμΈμ.
λ°μ΄ν°μΈνΈ μμ±μ λν μΆκ° μ¬ν
μ μ½λμ λ°μ΄ν°μΈνΈλ ClusterCoordinator.create_per_worker_dataset
APIλ₯Ό μ¬μ©νμ¬ μμ±λ©λλ€. μμ
μλΉ νλμ λ°μ΄ν°μΈνΈλ₯Ό μμ±νκ³ μ»¨ν
μ΄λ κ°μ²΄λ₯Ό λ°νν©λλ€. μ¬κΈ°μ iter
λ©μλλ₯Ό νΈμΆνμ¬ μμ
μλ³ λ°λ³΅μλ₯Ό λ§λ€ μ μμ΅λλ€. μμ
μλ³ λ°λ³΅μλ μμ
μλΉ νλμ λ°λ³΅μλ₯Ό ν¬ν¨νκ³ μμ
μμ ν΄λΉ μ¬λΌμ΄μ€λ νΉμ μμ
μμμ ν¨μκ° μ€νλκΈ° μ μ ClusterCoordinator.schedule
λ©μλμ μ λ¬λ ν¨μμ μ
λ ₯ μΈμμμ λ체λ©λλ€.
ClusterCoordinator.schedule
λ©μλλ μμ
μκ° λλ±νλ€κ³ κ°μ νλ―λ‘ μλ‘ λ€λ₯Έ μμ
μμ λ°μ΄ν°μΈνΈκ° λμΌνλ€κ³ κ°μ ν©λλ€(λ€λ₯΄κ² μμΌ μ μλ€λ μ μ μ μΈ). μ΄ λλ¬Έμ λ°μ΄ν°μΈνΈλ₯Ό λ°λ³΅νκ³ , λ°μ΄ν°μΈνΈμμ OutOfRangeError
λ₯Ό μμ νλ λμ μ νν μμ λ¨κ³λ₯Ό μμ½νλ κ²μ΄ μ’μ΅λλ€.
λ λ€λ₯Έ μ€μν μ μ tf.data
λ°μ΄ν°μΈνΈκ° μμ
κ²½κ³λ₯Ό λμ΄ μμμ μ§λ ¬ν λ° μμ§λ ¬νλ₯Ό μ§μνμ§ μλλ€λ κ²μ
λλ€. λ°λΌμ ClusterCoordinator.create_per_worker_dataset
μ μ λ¬λ ν¨μ λ΄λΆμ μ 체 λ°μ΄ν°μΈνΈλ₯Ό μμ±νλ κ²μ΄ μ€μν©λλ€. create_per_worker_dataset
APIλ tf.data.Dataset
λλ tf.distribute.DistributedDataset
μ μ§μ μ
λ ₯μΌλ‘ μ¬μ©ν μλ μμ΅λλ€.
νκ°
tf.distribute.ParameterServerStrategy
νλ ¨μΌλ‘ νκ°λ₯Ό μννλ λ κ°μ§ μ£Όμ μ κ·Ό λ°©μμ μΈλΌμΈ νκ°μ μ¬μ΄λμΉ΄ νκ°μ
λλ€. κ°κ°μ μλμ κ°μ΄ μ₯λ¨μ μ΄ μμ΅λλ€. νΉλ³ν μ νΈλκ° μλ€λ©΄ μΈλΌμΈ νκ° λ°©λ²μ κΆμ₯ν©λλ€.
μΈλΌμΈ νκ°
μ΄ λ°©λ²μμ μ½λλ€μ΄ν°λ νλ ¨κ³Ό νκ°λ₯Ό λ²κ°μ κ°λ©° μννλ―λ‘ μΈλΌμΈ νκ°λΌκ³ ν©λλ€.
μΈλΌμΈ νκ°μλ λ€μκ³Ό κ°μ λͺ κ°μ§ μ΄μ μ΄ μμ΅λλ€.
λ¨μΌ μμ μΌλ‘ 보μ ν μ μλ λκ·λͺ¨ νκ° λͺ¨λΈ λ° νκ° λ°μ΄ν°μΈνΈλ₯Ό μ§μν μ μμ΅λλ€.
νκ° κ²°κ³Όλ μλ₯Ό λ€μ΄ νλ ¨μ μ‘°κΈ°μ μ€λ¨ν μ§ μ¬λΆμ κ°μ΄ λ€μ epochλ₯Ό νλ ¨νκΈ° μν κ²°μ μ λ΄λ¦¬λ λ° μ¬μ©ν μ μμ΅λλ€.
μΈλΌμΈ νκ°λ₯Ό ꡬννλ λ°©λ²μλ μ§μ νκ°μ λΆμ° νκ°μ λ κ°μ§κ° μμ΅λλ€.
μ§μ νκ°: μκ·λͺ¨ λͺ¨λΈ λ° νκ° λ°μ΄ν°μΈνΈμ κ²½μ° μ½λλ€μ΄ν°λ μ½λλ€μ΄ν°μ νκ° λ°μ΄ν°μΈνΈλ₯Ό μ¬μ©νμ¬ λΆμ° λͺ¨λΈμμ μ§μ νκ°λ₯Ό μ€νν μ μμ΅λλ€.
λΆμ° νκ°: μ½λλ€μ΄ν°μμ μ§μ μ€νν μ μλ λκ·λͺ¨ λͺ¨λΈ λλ λ°μ΄ν°μΈνΈμ κ²½μ°, μ½λλ€μ΄ν° μμ μΌλ‘
ClusterCoordinator.schedule
/ClusterCoordinator.join
λ©μλλ₯Ό ν΅ν΄ μμ μμκ² νκ° μμ μ λ°°ν¬ν μ μμ΅λλ€.
μ°Έκ³ : tf.distribute.coordinator.ClusterCoordinator
μ schedule
λ° join
λ©μλλ λ°©λ¬Έ 보μ₯ λλ μ νν ν λ²μ μλ―Έ 체κ³λ₯Ό μ§μνμ§ μμ΅λλ€. μ¦, λ°μ΄ν°μΈνΈμ λͺ¨λ νκ° μμ κ° μ νν ν λ² νκ°λλ€λ 보μ₯μ μμ΅λλ€. μΌλΆλ λ°©λ¬Έλμ§ μμ μ μκ³ μΌλΆλ μ¬λ¬ λ² νκ°λ μ μμ΅λλ€. tf.data
μλΉμ€ APIλ ParameterServerStrategy
λ₯Ό μ¬μ©ν λ νκ°λ₯Ό μν΄ μ νν ν λ² λ°©λ¬Έμ μ 곡νλ λ° μ¬μ©ν μ μμ΅λλ€(tf.data.experimental.service
API λ¬Έμμ λμ μ€λ© μΉμ
μ°Έμ‘°).
μ¬μ΄λμΉ΄ νκ°
tf.distribute.ParameterServerStrategy
νλ ¨μμ νκ° λ£¨νλ₯Ό μ μνκ³ μ€ννλ λ λ€λ₯Έ λ°©λ²μ 체ν¬ν¬μΈνΈλ₯Ό λ°λ³΅μ μΌλ‘ μ½κ³ μ΅μ 체ν¬ν¬μΈνΈμμ νκ°λ₯Ό μ€ννλ μ μ© νκ°μ μμ
μ μμ±νλ μ¬μ΄λμΉ΄ νκ°μ
λλ€(체ν¬ν¬μΈνΈμ λν μμΈν λ΄μ©μ μ΄ κ°μ΄λ μ°Έμ‘°). μμ λ° μμ
μ μμ
μ νκ°μ μκ°μ λ€μ΄μ§ μμΌλ―λ‘ κ³ μ λ λ°λ³΅ νμμ λν΄ μ 체 νλ ¨ μκ°μ λ€λ₯Έ νκ° λ°©λ²μ μ¬μ©νλ κ²λ³΄λ€ μ§§μ΅λλ€. κ·Έλ¬λ νκ°λ₯Ό νΈλ¦¬κ±°νλ €λ©΄ μΆκ°μ μΈ νκ°μ μμ
κ³Ό μ£ΌκΈ°μ μΈ μ²΄ν¬ν¬μΈνΈ μ μ°¨κ° νμν©λλ€.
μ¬μ΄λμΉ΄ νκ°λ₯Ό μν νκ° λ£¨νλ₯Ό μμ±ν λ λ κ°μ§ μ΅μ μ΄ μμ΅λλ€.
tf.keras.utils.SidecarEvaluator
APIλ₯Ό μ¬μ©ν©λλ€.μ¬μ©μ μ μ νκ° λ£¨νλ₯Ό λ§λλλ€.
μ΅μ
1μ λν μμΈν λ΄μ©μ tf.keras.utils.SidecarEvaluator
API λ¬Έμλ₯Ό μ°Έμ‘°νμΈμ.
μ¬μ΄λμΉ΄ νκ°λ λ¨μΌ μμ μμλ§ μ§μλ©λλ€. μ΄κ²μ λ€μμ μλ―Έν©λλ€.
κ° μμ λ νμ€νκ² ν λ²λ§ νκ°λ©λλ€. νκ°μκ° μ μ λκ±°λ λ€μ μμλλ κ²½μ° μ΅κ·Ό 체ν¬ν¬μΈνΈμμ νκ° λ£¨νλ₯Ό λ€μ μμνκ³ λ€μ μμνκΈ° μ μ μ΄λ£¨μ΄μ§ νκ° μ§ν λΆλΆμ νκΈ°λ©λλ€.
κ·Έλ¬λ λ¨μΌ μμ μ λν΄ νκ°λ₯Ό μ€ννλ©΄ μ 체 νκ°μ μκ°μ΄ μ€λ 걸릴 μ μμ΅λλ€.
λͺ¨λΈμ ν¬κΈ°κ° λ무 컀μ νκ°μμ λ©λͺ¨λ¦¬μ λ§μ§ μλ κ²½μ° λ¨μΌ μ¬μ΄λμΉ΄ νκ°κ° μ μ©λμ§ μμ΅λλ€.
λ λ€λ₯Έ μ£Όμ μ¬νμ tf.keras.utils.SidecarEvaluator
ꡬνκ³Ό μλμ μ¬μ©μ μ μ νκ° λ£¨νκ° νμ μ¬μ© κ°λ₯ν μ΅μ 체ν¬ν¬μΈνΈλ₯Ό μ ννκ³ νκ° epoch λμ νλ ¨ ν΄λ¬μ€ν°μμ μ¬λ¬ 체ν¬ν¬μΈνΈλ₯Ό μμ±ν μ μκΈ° λλ¬Έμ μΌλΆ 체ν¬ν¬μΈνΈλ₯Ό 건λλΈ μ μλ€λ κ²μ
λλ€. λͺ¨λ 체ν¬ν¬μΈνΈλ₯Ό νκ°νλ μ¬μ©μ μ μ νκ° λ£¨νλ₯Ό μμ±ν μ μμ§λ§ μ΄ νν 리μΌμμλ λ€λ£¨μ§ μμ΅λλ€. λ°λ©΄μ 체ν¬ν¬μΈνΈκ° νκ°λ₯Ό μ€ννλ λ° κ±Έλ¦¬λ μκ°λ³΄λ€ λ μμ£Ό μμ±λλ©΄ μ ν΄ μνλ‘ μμ μ μμ΅λλ€.
μ¬μ©μ μ μ νκ° λ£¨νλ νκ°ν 체ν¬ν¬μΈνΈλ₯Ό μ ννκ±°λ νκ°μ ν¨κ» μ€νν μΆκ° λ Όλ¦¬λ₯Ό μ 곡νλ λ± μΈλΆ μ¬νμ λν λ λ§μ ν΅μ λ ₯μ μ 곡ν©λλ€. λ€μμ κ°λ₯ν μ¬μ©μ μ μ μ¬μ΄λμΉ΄ νκ° λ£¨νμ λλ€.
μ€μ μν©μμ ν΄λ¬μ€ν°
μ°Έκ³ : μ΄ μΉμ μ μ΄ νμ΄μ§μ νν λ¦¬μΌ μ½λλ₯Ό μ€ννλ λ° νμνμ§ μμ΅λλ€.
μ€μ νλ‘λμ
νκ²½μμλ μλ‘ λ€λ₯Έ λ¨Έμ μ μλ‘ λ€λ₯Έ νλ‘μΈμ€μμ λͺ¨λ μμ
μ μ€νν©λλ€. κ° μμ
μ λν ν΄λ¬μ€ν° μ 보λ₯Ό ꡬμ±νλ κ°μ₯ κ°λ¨ν λ°©λ²μ "TF_CONFIG"
νκ²½ λ³μλ₯Ό μ€μ νκ³ tf.distribute.cluster_resolver.TFConfigClusterResolver
λ₯Ό μ¬μ©νμ¬ "TF_CONFIG"
λ₯Ό ꡬ문 λΆμνλ κ²μ
λλ€.
"TF_CONFIG"
νκ²½ λ³μμ λν μΌλ°μ μΈ μ€λͺ
μ λΆμ° νλ ¨ κ°μ΄λμ "TF_CONFIG
νκ²½ λ³μ μ€μ "μ μ°Έμ‘°νμΈμ.
Kubernetes λλ κΈ°ν κ΅¬μ± ν
νλ¦Ώμ μ¬μ©νμ¬ νλ ¨ μμ
μ μμνλ κ²½μ° μ΄λ¬ν ν
νλ¦Ώμ΄ μ΄λ―Έ βTF_CONFIG"
λ₯Ό μ€μ νμ κ°λ₯μ±μ΄ λμ΅λλ€.
"TF_CONFIG"
νκ²½ λ³μ μ€μ νκΈ°
3κ°μ μμ
μμ 2κ°μ λ§€κ°λ³μ μλ²κ° μλ€κ³ κ°μ ν©λλ€. κ·Έλ¬λ©΄ μμ
μ 1μ "TF_CONFIG"
λ λ€μκ³Ό κ°μ μ μμ΅λλ€.
νκ°μμ "TF_CONFIG"
λ λ€μκ³Ό κ°μ μ μμ΅λλ€.
μμ νκ°μμ λν "TF_CONFIG"
λ¬Έμμ΄ μ€ "cluster"
λΆλΆμ μ ν μ¬νμ
λλ€.
λͺ¨λ μμ μ λμΌν λ°μ΄λ리λ₯Ό μ¬μ©νλ κ²½μ°
λ¨μΌ λ°μ΄λ리λ₯Ό μ¬μ©νμ¬ μ΄λ¬ν λͺ¨λ μμ μ μ€ννλ €λ©΄ μ²μμ νλ‘κ·Έλ¨μ΄ μ¬λ¬ μν λ‘ λΆκΈ°λλλ‘ ν΄μΌ ν©λλ€.
TensorFlow μλ²λ₯Ό μμνκ³ λκΈ°νλ λ€μ μ½λλ "worker"
λ° "ps"
μν μ μ μ©ν©λλ€.
μμ μ€λ₯ μ²λ¦¬νκΈ°
μμ μ μ€λ₯
tf.distribute.coordinator.ClusterCoordinator
μ¬μ©μ μ μ νλ ¨ 루νμ Model.fit
μ κ·Ό λ°©μμ λͺ¨λ μμ
μ μ€λ₯μ λν λ΄κ²°ν¨μ±μ κΈ°λ³Έμ μΌλ‘ μ 곡ν©λλ€. μμ
μ 볡ꡬ μ ClusterCoordinator
λ μμ
μμ λν λ°μ΄ν°μΈνΈ μ¬μμ±μ νΈμΆν©λλ€.
λ§€κ°λ³μ μλ² λλ μ½λλ€μ΄ν° μ€λ₯
κ·Έλ¬λ μ½λλ€μ΄ν°λ λ§€κ°λ³μ μλ² μ€λ₯λ₯Ό λ°κ²¬νλ©΄ μ¦μ UnavailableError
λλ AbortedError
λ₯Ό λ°μμν΅λλ€. μ΄ κ²½μ° μ½λλ€μ΄ν°λ₯Ό λ€μ μμν μ μμ΅λλ€. μ½λλ€μ΄ν° μ체λ μ¬μ©ν μ μκ² λ μ μμ΅λλ€. λ°λΌμ νλ ¨ μ§ν μν©μ μμ§ μκΈ° μν΄ νΉμ λꡬλ₯Ό μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
Model.fit
μ κ²½μ° μ§νλ₯ μ μ₯ λ° λ³΅μμ μλμΌλ‘ μ²λ¦¬νλBackupAndRestore
μ½λ°±μ μ¬μ©ν΄μΌ ν©λλ€. μμ λ μμ μ½λ°± λ° νλ ¨ μΉμ μ μ°Έμ‘°νμΈμ.
μ¬μ©μ μ μ νλ ¨ 루νμ κ²½μ° νλ ¨μ΄ μμλκΈ° μ μ μ£ΌκΈ°μ μΌλ‘ λͺ¨λΈ λ³μλ₯Ό 체ν¬ν¬μΈνΈνκ³ μ²΄ν¬ν¬μΈνΈμμ λͺ¨λΈ λ³μλ₯Ό λ‘λν΄μΌ ν©λλ€(μλ κ²½μ°). μ΅ν°λ§μ΄μ κ° μ²΄ν¬ν¬μΈνΈλ κ²½μ° νλ ¨ μ§ν μν©μ
optimizer.iterations
μμ λλ΅μ μΌλ‘ μΆλ‘ ν μ μμ΅λλ€.
RemoteValue
κ°μ Έμ€κΈ°
ν¨μκ° μ±κ³΅μ μΌλ‘ μ€νλλ©΄ RemoteValue
κ°μ Έμ€κΈ°μ μ±κ³΅μ΄ 보μ₯λ©λλ€. νμ¬λ ν¨μκ° μ€νλ ν λ°ν κ°μ΄ μ¦μ μ½λλ€μ΄ν°μ 볡μ¬λκΈ° λλ¬Έμ
λλ€. 볡μ¬νλ λμ μμ
μ μ€λ₯κ° λ°μνλ©΄ μ¬μ© κ°λ₯ν λ€λ₯Έ μμ
μμμ ν¨μκ° μ¬μλλ©λλ€. λ°λΌμ μ±λ₯μ μ΅μ ννλ €λ©΄ λ°ν κ° μμ΄ ν¨μλ₯Ό μμ½ν μ μμ΅λλ€.
μ€λ₯ 보κ³
μ½λλ€μ΄ν°κ° λ§€κ°λ³μ μλ²μ UnavailableError
μ κ°μ μ€λ₯ λλ tf.debugging.check_numerics
μ InvalidArgument
μ κ°μ κΈ°ν μ ν리μΌμ΄μ
μ€λ₯λ₯Ό νμΈνλ©΄ μ€λ₯λ₯Ό λ°μμν€κΈ° μ μ 보λ₯ μ€ λ° λκΈ°μ΄μ μλ λͺ¨λ ν¨μλ₯Ό μ·¨μν©λλ€. ν΄λΉ RemoteValue
λ₯Ό κ°μ Έμ€λ©΄ CancelledError
κ° λ°μν©λλ€.
μ€λ₯κ° λ°μν ν μ½λλ€μ΄ν°λ λμΌν μ€λ₯ λλ μ·¨μλ ν¨μμ μ€λ₯λ₯Ό λ°μμν€μ§ μμ΅λλ€.
μ±λ₯ ν₯μ
tf.distribute.ParameterServerStrategy
λ° tf.distribute.coordinator.ClusterCoordinator
λ‘ νλ ¨ν λ μ±λ₯ λ¬Έμ κ° λ°μν μ μλ λͺ κ°μ§ κ°λ₯ν μ΄μ κ° μμ΅λλ€.
ν κ°μ§ μΌλ°μ μΈ μ΄μ λ λ§€κ°λ³μ μλ²μ λ‘λ κ· νμ΄ λ§μ§ μκ³ λ‘λκ° μ¬ν μΌλΆ λ§€κ°λ³μ μλ²κ° μ©λμ λλ¬νκΈ° λλ¬Έμ λλ€. λν μ¬λ¬ κ·Όλ³Έ μμΈμ΄ μμ μ μμ΅λλ€. λ€μκ³Ό κ°μ λͺ κ°μ§ κ°λ¨ν λ°©λ²μΌλ‘ μ΄ λ¬Έμ λ₯Ό μνν μ μμ΅λλ€.
ParameterServerStrategy
λ₯Ό ꡬμ±ν λvariable_partitioner
λ₯Ό μ§μ νμ¬ ν° λͺ¨λΈ λ³μλ₯Ό λΆν ν©λλ€.κ°λ₯νλ©΄ λͺ¨λ λ§€κ°λ³μ μλ²μ νμν ν«μ€ν λ³μλ₯Ό λ¨μΌ λ¨κ³λ‘ μμ±νμ§ μμ΅λλ€. μλ₯Ό λ€μ΄, μ΅ν°λ§μ΄μ μμ μΌμ ν νμ΅λ₯ λλ νμ ν΄λμ€
tf.keras.optimizers.schedules.LearningRateSchedule
μ μ¬μ©ν©λλ€. νμ΅λ₯ μ΄ νΉμ λ§€κ°λ³μ μλ²μ λ°°μΉλκ³ κ° λ¨κ³μμ λ€λ₯Έ λͺ¨λ λ§€κ°λ³μ μλ²μμ μμ²νλ λ³μκ° λλ κ²μ΄ κΈ°λ³Έ λμμ΄κΈ° λλ¬Έμ λλ€.Keras μ μ²λ¦¬ λ μ΄μ΄μ μ λ¬νκΈ° μ μ ν° μ΄νλ₯Ό μμ΅λλ€.
μ±λ₯ λ¬Έμ μ λ λ€λ₯Έ κ°λ₯ν μ΄μ λ μ½λλ€μ΄ν°μ μμ΅λλ€. schedule
/join
μ ꡬνμ Python κΈ°λ°μ΄λ―λ‘ μ€λ λ© μ€λ²ν€λκ° μμ μ μμ΅λλ€. λν μ½λλ€μ΄ν°μ μμ
μ κ°μ λκΈ° μκ°μ΄ ν΄ μ μμ΅λλ€. μ΄λ¬ν κ²½μ°λΌλ©΄ λ€μκ³Ό κ°μ΄ ν μ μμ΅λλ€.
Model.fit
μ κ²½μ°Model.compile
μ μ 곡λsteps_per_execution
μΈμλ₯Ό 1λ³΄λ€ ν° κ°μΌλ‘ μ€μ ν μ μμ΅λλ€.μ¬μ©μ μ μ νλ ¨ 루νμ κ²½μ° μ¬λ¬ λ¨κ³λ₯Ό λ¨μΌ
tf.function
μΌλ‘ λ¬Άμ μ μμ΅λλ€.
λΌμ΄λΈλ¬λ¦¬κ° λμ± μ΅μ νλ¨μ λ°λΌ μμΌλ‘ λλΆλΆμ μ¬μ©μκ° μλμΌλ‘ λ¨κ³λ₯Ό λ¬Άμ νμκ° μκ² λκΈ°λ₯Ό λ°λλλ€.
λν μ±λ₯ ν₯μμ μν μ½κ°μ μλ Ήμ μμ μμ μ€λ₯ μ²λ¦¬νκΈ° μΉμ μμ μ€λͺ ν λλ‘ λ°ν κ° μμ΄ ν¨μλ₯Ό μμ½νλ κ²μ λλ€.
μλ €μ§ μ ν μ¬ν
μλ €μ§ λλΆλΆμ μ ν μ¬νμ μ΄λ―Έ μ μΉμ μμ λ€λ£¨μμ΅λλ€. μ΄ μΉμ μμλ μμ½μ μ 곡ν©λλ€.
ParameterServerStrategy
μΌλ°
λ΄κ²°ν¨μ±μ΄ μ λλ‘ μλνλ €λ©΄ μ½λλ€μ΄ν°λ₯Ό ν¬ν¨ν λͺ¨λ μμ μ
os.environment["grpc_fail_fast"]="use_caller"
κ° νμν©λλ€.λκΈ° λ§€κ°λ³μ μλ² νλ ¨μ μ§μλμ§ μμ΅λλ€.
μ΅μ μ μ±λ₯μ μ»μΌλ €λ©΄ μΌλ°μ μΌλ‘ μ¬λ¬ λ¨κ³λ₯Ό λ¨μΌ ν¨μλ‘ μμΆν΄μΌ ν©λλ€.
μ€λ©λ λ³μλ₯Ό ν¬ν¨νλ
tf.saved_model.load
λ₯Ό ν΅ν΄ saved_modelμ λ‘λνλ κ²μ μ§μλμ§ μμ΅λλ€. TensorFlow Servingμ μ¬μ©νμ¬ μ΄λ¬ν stored_modelμ λ‘λνλ κ²μ μλν κ²μΌλ‘ μμλ©λλ€(μμΈν λ΄μ©μ μ 곡 νν λ¦¬μΌ μ°Έμ‘°).μ½λλ€μ΄ν° μμ μ λ€μ μμνμ§ μκ³ λ§€κ°λ³μ μλ² μ€λ₯μμ 볡ꡬνλ κ²μ μ§μλμ§ μμ΅λλ€.
tf.keras.layers.IntegerLookup
,tf.keras.layers.StringLookup
λ°tf.keras.layers.TextVectorization
κ³Ό κ°μ μΌλΆ Keras μ μ²λ¦¬ λ μ΄μ΄μμ μΌλ°μ μΌλ‘ μ¬μ©λλtf.lookup.StaticHashTable
μ μμ±μStrategy.scope
μλμ λ°°μΉν΄μΌ ν©λλ€. κ·Έλ μ§ μμΌλ©΄ 리μμ€κ° μ½λλ€μ΄ν°μ λ°°μΉλκ³ μμ μμμ μ½λλ€μ΄ν°λ‘μ μ‘°ν RPCκ° μ±λ₯μ μν₯μ λ―ΈμΉ©λλ€.
Model.fit
νΉμ΄ μ¬ν
steps_per_epoch
μΈμλModel.fit
μ νμν©λλ€. Epochμμ μ μ ν κ°κ²©μ μ 곡νλ κ°μ μ νν μ μμ΅λλ€.ParameterServerStrategy
λ μ±λ₯μμ μ΄μ λ‘ λ°°μΉ μμ€ νΈμΆμ΄ μλ μ¬μ©μ μ μ μ½λ°±μ μ§μνμ§ μμ΅λλ€. μ΄λ¬ν νΈμΆμ μ μ νκ² μ νλsteps_per_epoch
λ₯Ό μ΄μ©ν΄ epoch μμ€ νΈμΆλ‘ λ³ννμ¬steps_per_epoch
λ¨κ³ μλ§λ€ νΈμΆλλλ‘ ν΄μΌ ν©λλ€. λ΄μ₯ μ½λ°±μ μν₯μ λ°μ§ μμ΅λλ€(ν΄λΉ λ°°μΉ μμ€ νΈμΆμ΄ μ±λ₯μ λ°ννλλ‘ μμ λμμ).ParameterServerStrategy
μ λν λ°°μΉ μμ€ νΈμΆμ μ§μν κ³νμ μμ΅λλ€.κ°μ μ΄μ λ‘, λ€λ₯Έ μ λ΅κ³Ό λ¬λ¦¬ μ§νλ₯ νμμ€κ³Ό λ©νΈλ¦μ epoch κ²½κ³μμλ§ κΈ°λ‘λ©λλ€.
run_eagerly
λ μ§μλμ§ μμ΅λλ€.
μ¬μ©μ μ μ νλ ¨ 루ν νΉμ΄ μ¬ν
ClusterCoordinator.schedule
μ λ°μ΄ν°μΈνΈμ λν λ°©λ¬Έ 보μ₯μ μ§μνμ§ μμ΅λλ€.ClusterCoordinator.create_per_worker_dataset
μ΄ μ½λ¬λΈμ μ λ ₯μΌλ‘ μ¬μ©νλ κ²½μ° μ λ¬λ ν¨μ λ΄μμ μ 체 λ°μ΄ν°μΈνΈλ₯Ό μμ±ν΄μΌ ν©λλ€.tf.data.Options
λClusterCoordinator.create_per_worker_dataset
μ μν΄ μμ±λ λ°μ΄ν°μΈνΈμμ 무μλ©λλ€.