Path: blob/master/site/ja/tutorials/distribute/input.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
åæ£å ¥å
tf.distribute API ã¯ã1 å°ã®ã³ã³ãã¥ãŒã¿ããè€æ°ã®ã³ã³ãã¥ãŒã¿ã«ãã¬ãŒãã³ã°ãç°¡åã«ã¹ã±ãŒãªã³ã°ããæ¹æ³ãæäŸããŸããã¢ãã«ãã¹ã±ãŒãªã³ã°ããéã«ã¯ããŠãŒã¶ãŒã¯å
¥åãè€æ°ã®ããã€ã¹ã«åæ£ããå¿
èŠããããŸãããtf.distribute
ã¯ãå
¥åãèªåçã«ããã€ã¹ã«åæ£ã§ãã API ãæäŸããŸãã
ãã®ã¬ã€ãã¯ãtf.distribute
API ã䜿çšããŠã忣ããŒã¿ã»ãããšã€ãã¬ãŒã¿ãäœæããããã®ããŸããŸãªæ¹æ³ãèŠãŠãããŸããããã«ã次ã®ãããã¯ã«ã€ããŠã説æããŠããŸãã
tf.distribute.Strategy.experimental_distribute_dataset
ãštf.distribute.Strategy.distribute_datasets_from_function
ã®äœ¿ç𿹿³ãããã³ãããã䜿çšããã·ã£ãŒãã£ã³ã°ãšããããªãã·ã§ã³åæ£ããŒã¿ã»ããã®ããŸããŸãªã€ãã¬ãŒã·ã§ã³æ¹æ³
tf.distribute.Strategy.experimental_distribute_dataset
/tf.distribute.Strategy.distribute_datasets_from_function
API ãštf.data
API ã®éããããã³äœ¿çšæã®å¶é
ãã®ã¬ã€ãã§ã¯ãKeras API ã䜿çšããåæ£å ¥åã®äœ¿ç𿹿³ã¯èª¬æãããŠããŸããã
忣ããŒã¿ã»ãã
tf.distribute
API ã䜿çšããŠã¹ã±ãŒãªã³ã°ããã«ã¯ãtf.data.Dataset
ã䜿ã£ãŠå
¥åã衚çŸããŸããtf.distribute
ã¯ãããã©ãŒãã³ã¹æé©åã宿çã«å®è£
ã«çµ±åããªãããtf.data.Dataset
ãšå¹ççã«åäœããŸã (åã¢ã¯ã»ã©ã¬ãŒã¿ããã€ã¹ãžã®ããŒã¿ã®èªåããªãã§ããæ©èœã宿çãªããã©ãŒãã³ã¹ã®æŽæ°ãªã©)ãtf.data.Dataset
以å€ã䜿çšãããŠãŒã¹ã±ãŒã¹ãããå Žåã¯ããã®ã¬ã€ãã® Tensor å
¥åã»ã¯ã·ã§ã³ãåç
§ããŠãã ãããé忣åãã¬ãŒãã³ã°ã«ãŒãã§ã¯ãtf.data.Dataset
ã€ã³ã¹ã¿ã³ã¹ãäœæããŠããèŠçŽ ãã€ãã¬ãŒãããŸããæ¬¡ã«äŸã瀺ããŸãã
ãŠãŒã¶ãŒã®æ¢åã®ã³ãŒããžã®å€æŽãæå°éã«æã㊠tf.distribute
ã¹ãã©ããžãŒã䜿çšã§ããããã«ãtf.data.Dataset
ã€ã³ã¹ã¿ã³ã¹ã忣ãã忣åãããããŒã¿ã»ããã€ã³ã¹ã¿ã³ã¹ãè¿ãã2 ã€ã® API ãå°å
¥ãããŠããŸãããã®åæ£åãããããŒã¿ã»ããã€ã³ã¹ã¿ã³ã¹ã以åãšåæ§ã«ã€ãã¬ãŒãããŠãã¢ãã«ããã¬ãŒãã³ã°ããããšãã§ããŸããã§ã¯ãããã 2 ã€ã® API ã詳ããèŠãŠã¿ãŸããããtf.distribute.Strategy.experimental_distribute_dataset
API ãš tf.distribute.Strategy.distribute_datasets_from_function
API ã§ãã
tf.distribute.Strategy.experimental_distribute_dataset
äœ¿ãæ¹
ãã® API ã¯tf.data.Dataset
ã€ã³ã¹ã¿ã³ã¹ãå
¥åãšããŠåããtf.distribute.DistributedDataset
ã€ã³ã¹ã¿ã³ã¹ãè¿ããŸãããã®å
¥åããŒã¿ã»ããããã°ããŒãã«ããããµã€ãºãšåãå€ã§ãããåããŸãããã®ã°ããŒãã«ããããµã€ãºã¯ã1 ã€ã®ã¹ãããã§åŠçããå
šããã€ã¹ã®ãµã³ãã«æ°ã§ãããã®åæ£ããŒã¿ã»ããã®ã€ãã¬ãŒã·ã§ã³ã Python åŒã«è¡ãããiter
ã䜿çšããŠã€ãã¬ãŒã¿ãäœæããŸããè¿ããããªããžã§ã¯ãã¯tf.data.Dataset
ã€ã³ã¹ã¿ã³ã¹ã§ã¯ãªãããŸãããŒã¿ã»ããã倿ãããæ€æ»ãããããã»ãã® API ããŸã£ãããµããŒãããŠããŸãããããã¯ãå
¥åãããŸããŸãªã¬ããªã«ã«ã·ã£ãŒãã£ã³ã°ããããã®ç¹å®ã®æ¹æ³ããªãå Žåã«æšå¥šããã API ã§ãã
ããããã£
ãããåŠç
tf.distribute
ã¯ãã°ããŒãã«ããããµã€ãºãåæäžã®ã¬ããªã«ã®æ°ã§é€ç®ããå€ã«çããæ°ããããããµã€ãºã§ãå
¥å tf.data.Dataset
ã€ã³ã¹ã¿ã³ã¹ã®ããããåäœæããŸããåæäžã®ã¬ããªã«ã®æ°ã¯ããã¬ãŒãã³ã°äžã®åŸé
ã® allreduce ã«åå ããŠããããã€ã¹ã®æ°ãšåçã§ãããŠãŒã¶ãŒã忣ã€ãã¬ãŒã¿ã§ next
ãåŒã³åºããšãã¬ããªã«åœããã®ããŒã¿ãµã€ãºãåã¬ããªã«ã«è¿ãããŸããåããããããããŒã¿ã»ããã®ã«ãŒãã£ããªãã£ã¯ãå¿
ãã¬ããªã«æ°ã®åæ°ã«ãªããŸããæ¬¡ã«ããã€ãã®äŸã瀺ããŸãã
tf.data.Dataset.range(6).batch(4, drop_remainder=False)
忣ç¡ã:
ããã 1: [0, 1, 2, 3]
ããã 2: [4, 5]
2 ã€ã®ã¬ããªã«ã§åæ£ãæåŸã®ãããïŒ[4, 5]ïŒã¯ã2ã€ã®ã¬ããªã«éã§åå²ã
ããã 1:
ã¬ããªã« 1: [0, 1]
ã¬ããªã« 2: [2, 3]
ããã 2:
ã¬ããªã« 1: [4]
ã¬ããªã« 2: [5]
tf.data.Dataset.range(4).batch(4)
忣ç¡ã:
ããã 1: [0, 1, 2, 3]
5 ã€ã®ã¬ããªã«ã§åæ£:
ããã 1:
ã¬ããªã« 1: [0]
ã¬ããªã« 2: [1]
ã¬ããªã« 3: [2]
ã¬ããªã« 4: [3]
ã¬ããªã« 5: []
tf.data.Dataset.range(8).batch(4)
忣ç¡ã:
ããã 1: [0, 1, 2, 3]
ããã 2: [4, 5, 6, 7]
3 ã€ã®ã¬ããªã«ã§åæ£:
ããã 1:
ã¬ããªã« 1: [0, 1]
ã¬ããªã« 2: [2, 3]
ã¬ããªã« 3: []
ããã 2:
ã¬ããªã« 1: [4, 5]
ã¬ããªã« 2: [6, 7]
ã¬ããªã« 3: []
泚æ: äžèšã®äŸã¯ãç°ãªãã¬ããªã«ã§ã°ããŒãã«ããããã©ã®ããã«åå²ããããã®ã¿ã説æããŠããŸããå®è£ ã«ãã£ãŠå®éã®å€ãç°ãªãå¯èœæ§ããããããåã¬ããªã«ã§æçµçã«åŸãããå¯èœæ§ã®ããå®éã®å€ã«äŸåããããšã¯ãå§ãã§ããŸããã
ããŒã¿ã»ããã®ãããã®åäœæã«ã¯ãã¬ããªã«ã®æ°ãšãšãã«çŽç·çã«å¢å ãã空éçã³ã¹ãããããŸããã€ãŸãããã«ãã¯ãŒã«ãŒãã¬ãŒãã³ã°ã®ãŠãŒã¹ã±ãŒã¹ã§èšãã°ãå ¥åãã€ãã©ã€ã³ã§ OOM ãšã©ãŒãçºçããå¯èœæ§ããããŸãã
ã·ã£ãŒãã£ã³ã°
tf.distribute
ã¯ãMultiWorkerMirroredStrategy
ãš TPUStrategy
ã®ãã«ãã¯ãŒã«ãŒãã¬ãŒãã³ã°ã§å
¥åããŒã¿ã»ããã®èªåã·ã£ãŒãã£ã³ã°ãè¡ããŸããåããŒã¿ã»ããã¯ã¯ãŒã«ãŒã® CPU ããã€ã¹äžã«äœæãããŸããããŒã¿ã»ãããäžé£ã®ã¯ãŒã«ãŒã§èªåã·ã£ãŒãã£ã³ã°ãããšãåã¯ãŒã«ãŒã«ããŒã¿ã»ããå
šäœã®ãµãã»ãããå²ãåœãŠãããããšã«ãªããŸãïŒé©å㪠tf.data.experimental.AutoShardPolicy
ãèšå®ãããŠããå ŽåïŒãããã¯ãåã¹ãããã«ãããŠããªãŒããŒã©ããããŠããªãããŒã¿ã»ããèŠçŽ ã®ã°ããŒãã«ããããµã€ãºãåã¯ãŒã«ãŒã§åŠçãããããã«ããããã§ããèªåã·ã£ãŒãã£ã³ã°ã«ã¯ãtf.data.experimental.DistributeOptions
ã§æå®ã§ãã 2 ã€ã®ãªãã·ã§ã³ããããŸããParameterServerStrategy
ã®ãã«ãã¯ãŒã«ãŒã§ã¯èªåã·ã£ãŒãã£ã³ã°ã¯è¡ãããŸããããã®ã¹ãã©ããžãŒã§ã®ããŒã¿ã»ããäœæã®è©³çްã«ã€ããŠã¯ãParameterServerStrategy ã®ãã¥ãŒããªã¢ã«ãã芧ãã ããã
tf.data.experimental.AutoShardPolicy
ã«èšå®ã§ãããªãã·ã§ã³ã«ã¯ 3 ã€ãããŸãã
AUTO: ããã©ã«ãã®ãªãã·ã§ã³ã§ãããã¡ã€ã«ããšã«ã·ã£ãŒãã£ã³ã°ããããšããŸãããã¡ã€ã«ããŒã¹ã®ããŒã¿ã»ãããæ€åºãããªãå Žåããã¡ã€ã«ããšã®ã·ã£ãŒãã£ã³ã°ã¯å€±æãã
tf.distribute
ã¯ããŒã¿ããšã®ã·ã£ãŒãã£ã³ã°ã«åãæ¿ããŸããå ¥åããŒã¿ã»ããããã¡ã€ã«ããŒã¹ã§ãã£ãŠãããã¡ã€ã«æ°ãã¯ãŒã«ãŒæ°ããå°ãªãå Žåã¯ãInvalidArgumentError
ãçºçããŸãããããçºçããå Žåã¯ãããªã·ãŒãæç€ºçã«AutoShardPolicy.DATA
ã«èšå®ããããå ¥åãœãŒã¹ãå°ããªãã¡ã€ã«ã«åå²ããŠããã¡ã€ã«æ°ãã¯ãŒã«ãŒæ°ãããå€ããªãããã«ããŸããFILE: ãã¹ãŠã®ã¯ãŒã«ãŒã§å ¥åãã·ã£ãŒãã£ã³ã°ããå Žåã®ãªãã·ã§ã³ã§ããå ¥åãã¡ã€ã«ã®æ°ãã¯ãŒã«ãŒæ°ã倧ããäžåãããã¡ã€ã«å ã®ããŒã¿ãåçã«åæ£ãããŠããå Žåã¯ããã®ãªãã·ã§ã³ã䜿çšããŸãããã®ãªãã·ã§ã³ã®æ¬ ç¹ã¯ããã¡ã€ã«å ã®ããŒã¿ãåçã«åæ£ãããŠããªãå Žåã«ã¢ã€ãã«ç¶æ ã®ã¯ãŒã«ãŒãååšããããšã«ãããŸãããã¡ã€ã«æ°ãã¯ãŒã«ãŒæ°ããå°ãªãå Žåã
InvalidArgumentError
ãçºçããŸãã ãããçºçããå Žåã¯ãããªã·ãŒãæç€ºçã«AutoShardPolicy.DATA
ã«èšå®ããŠãã ãããäŸãšããŠã2 ã€ã®ãã¡ã€ã«ãããããã« 1 ã€ã®ã¬ããªã«ãæã€ 2 ã€ã®ã¯ãŒã«ãŒã«åæ£ããŸãããã¡ã€ã« 1 ã«ã¯ [0, 1, 2, 3, 4, 5]ããã¡ã€ã« 2 ã«ã¯ [6, 7, 8, 9, 10, 11] ãå«ãŸããŸããåæäžã®ã¬ããªã«ã®åèšæ°ã 2 ãã°ããŒãã«ããããµã€ãºã 4 ãšããŸããã¯ãŒã«ãŒ 0:
ããã 1 = ã¬ããªã« 1: [0, 1]
ããã 2 = ã¬ããªã« 1: [2, 3]
ããã 3 = ã¬ããªã« 1: [4]
ããã 4 = ã¬ããªã« 1: [5]
ã¯ãŒã«ãŒ 1:
ããã 1 = ã¬ããªã« 2: [6, 7]
ããã 2 = ã¬ããªã« 2: [8, 9]
ããã 3 = ã¬ããªã« 2: [10]
ããã 4 = ã¬ããªã« 2: [11]
DATA: ãã¹ãŠã®ã¯ãŒã«ãŒã§èŠçŽ ãèªåã·ã£ãŒãã£ã³ã°ããŸããåã¯ãŒã«ãŒã¯ããŒã¿ã»ããå šäœãèªã¿åã£ãŠãããã«å²ãåœãŠãããã·ã£ãŒãã®ã¿ãåŠçãããã®ä»ãã¹ãŠã®ã·ã£ãŒãã¯ç Žæ£ãããŸããããã¯éåžžãå ¥åãã¡ã€ã«ã®æ°ãã¯ãŒã«ãŒæ°ããå°ãªãããã¹ãŠã®ã¯ãŒã«ãŒéã§ããŒã¿ã®ã·ã£ãŒãã£ã³ã°ãããæé©ã«è¡ãå Žåã«äœ¿çšãããŸããæ¬ ç¹ã¯ãåã¯ãŒã«ãŒã§ããŒã¿ã»ããå šäœãèªã¿åãããããšã§ããäŸãšããŠã1 ã€ã®ãã¡ã€ã«ã 2 ã€ã®ã¯ãŒã«ãŒã§åæ£ããŸãããã¡ã€ã« 1 ã«ã¯ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] ãå«ãŸããŸããåæäžã®ã¬ããªã«ã®åèšæ°ã 2 ãšããŸãã
ã¯ãŒã«ãŒ 0:
ããã 1 = ã¬ããªã« 1: [0, 1]
ããã 2 = ã¬ããªã« 1: [4, 5]
ããã 3 = ã¬ããªã« 1: [8, 9]
ã¯ãŒã«ãŒ 1:
ããã 1 = ã¬ããªã« 2: [2, 3]
ããã 2 = ã¬ããªã« 2: [6, 7]
ããã 3 = ã¬ããªã« 2: [10, 11]
OFF: èªåã·ã£ãŒãã£ã³ã°ããªãã«ãããšãåã¯ãŒã«ãŒã¯ãã¹ãŠã®ããŒã¿ãåŠçããŸããäŸãšããŠã1 ã€ã®ãã¡ã€ã«ã 2 ã€ã®ã¯ãŒã«ãŒã§åæ£ããŸãããã¡ã€ã« 1 ã«ã¯ã[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] ãå«ãŸããŸããåæäžã®ã¬ããªã«ã®åèšæ°ã 2 ãšããŸããåã¯ãŒã«ãŒã¯ã次ã®ãããªåæ£ã«ãªããŸãã
ã¯ãŒã«ãŒ 0:
ããã 1 = ã¬ããªã« 1: [0, 1]
ããã 2 = ã¬ããªã« 1: [2, 3]
ããã 3 = ã¬ããªã« 1: [4, 5]
ããã 4 = ã¬ããªã« 1: [6, 7]
ããã 5 = ã¬ããªã« 1: [8, 9]
ããã 6 = ã¬ããªã« 1: [10, 11]
ã¯ãŒã«ãŒ 1:
ããã 1 = ã¬ããªã« 2: [0, 1]
ããã 2 = ã¬ããªã« 2: [2, 3]
ããã 3 = ã¬ããªã« 2: [4, 5]
ããã 4 = ã¬ããªã« 2: [6, 7]
ããã 5 = ã¬ããªã« 2: [8, 9]
ããã 6 = ã¬ããªã« 2: [10, 11]
ããªãã§ãã
ããã©ã«ãã§ã¯ãtf.distribute
ã¯ãŠãŒã¶ãŒãæäŸããtf.data.Dataset
ã€ã³ã¹ã¿ã³ã¹ã«ããªãã§ãã倿ã远å ããŸããããªãã§ãã倿ã«å¯ŸããåŒæ°buffer_size
ã¯åæäžã®ã¬ããªã«ã®æ°ãšåçã§ãã
tf.distribute.Strategy.distribute_datasets_from_function
äœ¿ãæ¹
ãã® API ã¯ãå
¥å颿°ãåã£ãŠ tf.distribute.DistributedDataset
ã€ã³ã¹ã¿ã³ã¹ãè¿ããŸãããŠãŒã¶ãŒãæž¡ãå
¥å颿°ã«ã¯ tf.distribute.InputContext
åŒæ°ããããtf.data.Dataset
ã€ã³ã¹ã¿ã³ã¹ãè¿ããŸãããã® API ã䜿çšãããšãtf.distribute
ã¯ãå
¥å颿°ããè¿ããããŠãŒã¶ãŒã® tf.data.Dataset
ã€ã³ã¹ã¿ã³ã¹ã«ãã以éã®å€æŽãé©çšããŸããããã®ããããŠãŒã¶ãŒãããŒã¿ã»ããããããåŠçããŠã·ã£ãŒãã£ã³ã°ããå¿
èŠããããŸããtf.distribute
ã¯åã¯ãŒã«ãŒã® CPU ããã€ã¹ã§å
¥å颿°ãåŒã³åºããŸãããŠãŒã¶ãŒãç¬èªã®ãããã³ã°ãšã·ã£ãŒãã£ã³ã°ã®ããžãã¯ãæå®ã§ããã»ãããã® API ã¯ããã«ãã¯ãŒã«ãŒãã¬ãŒãã³ã°ã«äœ¿çšãããå Žåã«ãtf.distribute.Strategy.experimental_distribute_dataset
ãããåªããã¹ã±ãŒã©ããªãã£ãšããã©ãŒãã³ã¹ã瀺ããŸãã
ããããã£
ãããåŠç
å
¥å颿°ã®æ»ãå€ã§ããtf.data.Dataset
ã€ã³ã¹ã¿ã³ã¹ã¯ãã¬ããªã«ããšã®ããããµã€ãºã䜿çšããŠãããåŠçããå¿
èŠããããŸããã¬ããªã«ããšã®ããããµã€ãºã¯ãã°ããŒãã«ããããµã€ãºãåæåãã¬ãŒãã³ã°ã«åå ããŠããã¬ããªã«ã®æ°ã§é€ç®ããå€ã§ããããã¯ãtf.distribute
ãåã¯ãŒã«ãŒã® CPU ããã€ã¹ã§å
¥å颿°ãåŒã³åºãããã§ããããã¯ãŒã«ãŒã§äœæãããããŒã¿ã»ããã¯ããã®ã¯ãŒã«ãŒã®ãã¹ãŠã®ã¬ããªã«ã§äœ¿çšããæºåãæŽããŠããŸãã
ã·ã£ãŒãã£ã³ã°
ãŠãŒã¶ãŒã®å
¥å颿°ãžã®åŒæ°ãšããŠæé»çã«æž¡ãããtf.distribute.InputContext
ãªããžã§ã¯ãã¯ãå
éšçã«tf.distribute
ãã£ãŠäœæãããŸãããã®ãªããžã§ã¯ãã«ã¯ãã¯ãŒã«ãŒæ°ãçŸåšã®ã¯ãŒã«ãŒ ID ãªã©ã®æ
å ±ãå«ãŸããŸãããã®å
¥å颿°ã¯ãtf.distribute.InputContext
ãªããžã§ã¯ãã®äžéšã§ããããããã£ã䜿çšãããŠãŒã¶ãŒãèšå®ããããªã·ãŒã«åŸã£ãŠãã·ã£ãŒãã£ã³ã°ãåŠçããããšãã§ããŸãã
ããªãã§ãã
tf.distribute
ã¯ããŠãŒã¶ãŒãæäŸããå
¥å颿°ã«ãã£ãŠè¿ããã tf.data.Dataset
ã®æåŸã«ãããªãã§ãã倿ã远å ããŸããããããã£ãŠãäžèšã®äŸã§ã¯æç€ºçã« Dataset.prefetch
ãåŒã³åºããŸãã
泚æ:tf.distribute.Strategy.experimental_distribute_dataset
ãš tf.distribute.Strategy.distribute_datasets_from_function
ã¯äž¡æ¹ãšããtf.data.Dataset
åã§ã¯ãªã tf.distribute.DistributedDataset
ã€ã³ã¹ã¿ã³ã¹ãè¿ããŸãããããã®ã€ã³ã¹ã¿ã³ã¹ãã€ãã¬ãŒããïŒã忣ã€ãã¬ãŒã¿ããåç
§ïŒãelement_spec
ããããã£ã䜿çšããããšãã§ããŸãã
忣ã€ãã¬ãŒã¿
é忣åtf.data.Dataset
ã€ã³ã¹ã¿ã³ã¹ãšåæ§ã«ãtf.distribute.DistributedDataset
ã€ã³ã¹ã¿ã³ã¹ãäœæããŠã€ãã¬ãŒãããtf.distribute.DistributedDataset
ã®èŠçŽ ã«ã¢ã¯ã»ã¹ããå¿
èŠããããŸããæ¬¡ã«ãtf.distribute.DistributedIterator
ãäœæããŠããããã¢ãã«ã®ãã¬ãŒãã³ã°ã«äœ¿çšããæ¹æ³ã瀺ããŸãã
äœ¿çšæ¹æ³
Python åŒã® for ã«ãŒãã³ã³ã¹ãã©ã¯ãã䜿çšãã
ãŠãŒã¶ãŒãã¬ã³ããªãŒãª Python åŒã®ã«ãŒãã䜿çšããŠãtf.distribute.DistributedDataset
ãã€ãã¬ãŒãããããšãã§ããŸããtf.distribute.DistributedIterator
ããè¿ãããèŠçŽ ã¯ãåäžã®tf.Tensor
ããã¬ããªã«ãããã®å€ãå«ã tf.distribute.DistributedValues
ã§ããtf.function
ã«ã«ãŒããé
眮ãããšãããã©ãŒãã³ã¹ã¯äžæããŸãããbreak
ãšreturn
ã¯ãçŸåšãtf.function
å
ã«é
眮ããã tf.distribute.DistributedDataset
ã®ã«ãŒãã§ã¯ãµããŒããããŠããŸããã
iter
ã䜿çšããŠæç€ºçãªã€ãã¬ãŒã¿ãäœæãã
tf.distribute.DistributedDataset
ã€ã³ã¹ã¿ã³ã¹ã®èŠçŽ ãã€ãã¬ãŒãããã«ã¯ãiter
API ã䜿ã£ãŠtf.distribute.DistributedIterator
ãäœæããããšãã§ããŸããæç€ºçãªã€ãã¬ãŒã¿ã䜿çšãããšãäžå®ã®ã¹ãããæ°ãã€ãã¬ãŒãããããšãã§ããŸããtf.distribute.DistributedIterator
ã€ã³ã¹ã¿ã³ã¹ã® dist_iterator
ããæ¬¡ã®èŠçŽ ãååŸããã«ã¯ãnext(dist_iterator)
ãdist_iterator.get_next()
ããŸã㯠dist_iterator.get_next_as_optional()
ãåŒã³åºãããšãã§ããŸããæåã® 2 ã€ã¯åºæ¬çã«åãã§ãã
next
ãŸã㯠tf.distribute.DistributedIterator.get_next
ã䜿çšãããšãtf.distribute.DistributedIterator
ãæåŸã«å°éããå Žåã«ãOutOfRange ãšã©ãŒãçºçããŸããã¯ã©ã€ã¢ã³ã㯠Python åŽã§ãã®ãšã©ãŒããã£ãããããã§ãã¯ãã€ã³ãäœæãè©äŸ¡ãšãã£ãä»ã®äœæ¥ãç¶ç¶ããããšãã§ããŸãããã ããæ¬¡ã«ç€ºããããªãã¹ããã¬ãŒãã³ã°ã«ãŒã (tf.function
ããšã«è€æ°ã®ã¹ããããå®è¡ãã) ã䜿çšããŠããå Žåã¯æ©èœããŸããã
train_fn
ã«ã¯ãtf.range
å
ã«ã¹ãããæ¬æãã©ããã³ã°ããããšã§ãè€æ°ã®ã¹ããããå«ãŸããŠããŸãããã®å Žåãã«ãŒãã§ã®äŸåé¢ä¿ã®ãªãå¥ã®ã€ãã¬ãŒã·ã§ã³ã䞊è¡ããŠéå§ããå¯èœæ§ããããããåã®ã€ãã¬ãŒã·ã§ã³ã®èšç®ãçµäºããåã®åŸã®æ¹ã®ã€ãã¬ãŒã·ã§ã³ã§ãOutOfRange ãšã©ãŒãçºçããããšããããŸããOutOfRange ãšã©ãŒãçºçããŠããŸãã°ã颿°å
ã®ãã¹ãŠã®æŒç®ã¯å³åº§ã«çµäºãããŠããŸããŸãããã®ç¶æ³ãé¿ããå Žåã¯ãOutOfRange ãšã©ãŒãçºçããªãå¥ã®æ¹æ³ãšããŠãtf.distribute.DistributedIterator.get_next_as_optional
ãæããããŸããget_next_as_optional
ã¯ã次ã®èŠçŽ ãå«ã tf.experimental.Optional
ãè¿ãããtf.distribute.DistributedIterator
ãæåŸã«éããŠããå Žåã¯äœã®å€ãè¿ããŸããã
element_spec
ããããã£ã䜿çšãã
忣ããŒã¿ã»ããã®èŠçŽ ã tf.function
ã«æž¡ããtf.TypeSpec
ã®ä¿èšŒãå¿
èŠãšããŠããå Žåã¯ãtf.function
ã® input_signature
åŒæ°ãæå®ããããšãã§ããŸãã忣ããŒã¿ã»ããã®åºåã¯ãåäžã®ããã€ã¹ãŸãã¯è€æ°ã®ããã€ã¹ãžã®å
¥åã衚ãã tf.distribute.DistributedValues
ã§ãããã®åæ£å€ã«å¯Ÿå¿ãã tf.TypeSpec
ãååŸããã«ã¯ãtf.distribute.DistributedDataset.element_spec
ãŸã㯠tf.distribute.DistributedIterator.element_spec
ã䜿çšããããšãã§ããŸãã
ããŒã¿ã®ååŠçããã
以äžãtf.data.Dataset
ã忣ããæ¹æ³ãèŠãŠããŸããããããŒã¿ãã¢ãã«ã«äœ¿çšããåã«ãããŒã¿ã®ã¯ã¬ã³ãžã³ã°ãå€æãæ¡åŒµãªã©ã®ååŠçãè¡ãå¿
èŠããããŸãã æ¬¡ã® 2 ã€ã®äŸ¿å©ãªããŒã«ãå©çšã§ããŸãã
Keras ååŠçã¬ã€ã€ãŒ: éçºè ã Keras ãã€ãã£ãã®å ¥ååŠçãã€ãã©ã€ã³ãæ§ç¯ã§ããããã«ããäžé£ã® Keras ã¬ã€ã€ãŒã§ããäžéšã® Keras ååŠçã¬ã€ã€ãŒã«ã¯ãåæåãŸãã¯
adapt
æã«èšå®ã§ãããã¬ãŒãã³ã°äžå¯èœãªç¶æ ãå«ãŸããŠããŸã (Keras ååŠçã¬ã€ã€ãŒ ã¬ã€ãã®adapt
ã»ã¯ã·ã§ã³ãåç §ããŠãã ãã)ã ã¹ããŒããã«ãªååŠçã¬ã€ã€ãŒã忣ããå Žåãç¶æ ããã¹ãŠã®ã¯ãŒã«ãŒã«è€è£œããå¿ èŠããããŸãããããã®ã¬ã€ã€ãŒã䜿çšããã«ã¯ãããããã¢ãã«ã®äžéšã«ããããããŒã¿ã»ããã«é©çšããŸããTensorFlow Transform (tf.Transform): ããŒã¿ååŠçãã€ãã©ã€ã³ãä»ããŠã€ã³ã¹ã¿ã³ã¹ã¬ãã«ãšãã«ãã¹ã®äž¡æ¹ã®ããŒã¿å€æãå®çŸ©ããããã® TensorFlow ã®ã©ã€ãã©ãªã§ããTensorflow Transform ã«ã¯ 2 ã€ã®ãã§ãŒãºããããŸãã 1 ã€ç®ã¯åæãã§ãŒãºã§ããããã§ã¯ãçã®ãã¬ãŒãã³ã°ããŒã¿ããã«ãã¹ããã»ã¹ã§åæããã倿ã«å¿ èŠãªçµ±èšãèšç®ããã倿ããžãã¯ãã€ã³ã¹ã¿ã³ã¹ã¬ãã«ã®æŒç®ãšããŠçæãããŸãã2 ã€ç®ã¯å€æãã§ãŒãºã§ãçã®ãã¬ãŒãã³ã°ããŒã¿ãã€ã³ã¹ã¿ã³ã¹ã¬ãã«ã®ããã»ã¹ã§å€æãããŸãã
Keras ååŠçã¬ã€ã€ãŒãš Tensorflow Transform ã®æ¯èŒ
Tensorflow Transform ãš Keras ã®ååŠçã¬ã€ã€ãŒã¯ã©ã¡ããããã¬ãŒãã³ã°æã®ååŠçãåå²ããæšè«äžã«ååŠçãã¢ãã«ã«ãã³ãã«ããŠããã¬ãŒãã³ã°/ãµãŒã ã¹ãã¥ãŒãæžããæ¹æ³ãæäŸããŸãã
TFX ãšå¯ã«çµ±åããã Tensorflow Transform ã¯ããã¬ãŒãã³ã°ãã€ãã©ã€ã³ãšã¯å¥ã®ãžã§ãã§ããããããµã€ãºã®ããŒã¿ã»ãããåæããã³å€æããã¹ã±ãŒã©ãã«ãª map-reduce ãœãªã¥ãŒã·ã§ã³ãæäŸããŸããåäžã®ãã·ã³ã«åãŸããªãããŒã¿ã»ããã§åæãå®è¡ããå¿ èŠãããå Žåã¯ãTensorflow Transform ãæåã®éžæè¢ã«ãªããŸãã
Keras ååŠçã¬ã€ã€ãŒã¯ããã£ã¹ã¯ããããŒã¿ãèªã¿åã£ãåŸããã¬ãŒãã³ã°æã«ååŠçãé©çšããå Žåã«æé©ã§ãããããã¯ãKeras ã©ã€ãã©ãªã®ã¢ãã«éçºã«ã·ãŒã ã¬ã¹ã«é©åããadapt
ã«ããå°èŠæš¡ãªããŒã¿ã»ããã®åæããµããŒãããŸããKeras ååŠçã¬ã€ã€ãŒã¯ãç»åããŒã¿ã®æ¡åŒµãªã©ã®ãŠãŒã¹ã±ãŒã¹ããµããŒãããå
¥åããŒã¿ã»ãããééãããã³ã«ããã¬ãŒãã³ã°çšã®ããŸããŸãªäŸãçæãããŸãã
2 ã€ã®ã©ã€ãã©ãªãæ··åšãããããšãã§ããŸãããã®å ŽåãTensorflow Transform ã¯å ¥åããŒã¿ã®åæãšéç倿ã«ãKeras ååŠçã¬ã€ã€ãŒã¯ãã¬ãŒãã³ã°æã®å€æïŒOne-Hot ãšã³ã³ãŒãã£ã³ã°ãããŒã¿æ¡åŒµãªã©ïŒã«äœ¿çšãããŸãã
tf.distribute ã®ãã¹ã ãã©ã¯ãã£ã¹
äž¡æ¹ã®ããŒã«ã䜿çšããå Žåã倿ããžãã¯ãåæåããŠããŒã¿ã«é©çšããå¿
èŠããããŸããããã«ãã Tensorflow ãªãœãŒã¹ãäœæãããå ŽåããããŸãããããã®ãªãœãŒã¹ãŸãã¯ç¶æ
ã¯ãã¯ãŒã«ãŒéãŸãã¯ã¯ãŒã«ãŒãšã³ãŒãã£ããŒã¿ãŒéã®éä¿¡ãç¯çŽããããã«ããã¹ãŠã®ã¯ãŒã«ãŒã«è€è£œããå¿
èŠããããŸãããã®ããã«ã¯ãä»ã® Keras ã¬ã€ã€ãŒãšåãããã« Keras ååŠçã¬ã€ã€ãŒãtft.TFTransformOutput.transform_features_layer
ããŸã㯠tft.TransformFeaturesLayer
ã tf.distribute.Strategy.scope
ã®äžã«äœæããããšããå§ãããŸãã
次ã®äŸã¯ãtf.distribute.Strategy
API ãé«ã¬ãã«ã® Keras Model.fit
API ããã³ã«ã¹ã¿ã ãã¬ãŒãã³ã°ã«ãŒããšå¥ã«äœ¿çšããæ¹æ³ã瀺ããŠããŸãã
Keras ååŠçã¬ã€ã€ãŒã®ãŠãŒã¶ãŒåãã®æ³šæäºé :
ååŠçã¬ã€ã€ãŒãšå€§ããªèªåœ
ãã«ãã¯ãŒã«ãŒèšå®ã§å€§ããªèªåœ (1 ã®ã¬ãã€ã以äž) ãæ±ãå Žå (tf.distribute.MultiWorkerMirroredStrategy
ãtf.distribute.experimental.ParameterServerStrategy
ãtf.distribute.TPUStrategy
ãªã©)ããã¹ãŠã®ã¯ãŒã«ãŒããã¢ã¯ã»ã¹å¯èœãªéçãã¡ã€ã« (Cloud Storage ãªã©ã䜿çšãã) ã«èªåœãä¿åããããšããå§ãããŸããããã«ããããã¬ãŒãã³ã°æã«èªåœããã¹ãŠã®ã¯ãŒã«ãŒã«è€è£œããã®ã«ãããæéãççž®ã§ããŸãã
tf.data
ãã€ãã©ã€ã³ã§ã®ååŠçãšã¢ãã«ã§ã®ååŠçã®æ¯èŒ
Keras ã®ååŠçã¬ã€ã€ãŒã¯ã¢ãã«ã®äžéšãšããŠé©çšããããšããtf.data.Dataset
ã«çŽæ¥é©çšããããšãã§ããŸãããããããå©ç¹ããããŸãã
ã¢ãã«å ã«ååŠçã¬ã€ã€ãŒãé©çšãããšãã¢ãã«ãç§»æ€å¯èœã«ãªãããã¬ãŒãã³ã°/ãµãŒãã³ã° ã¹ãã¥ãŒãäœæžããã®ã«åœ¹ç«ã¡ãŸãã(詳现ã«ã€ããŠã¯ãååŠçã¬ã€ã€ãŒã®äœ¿çšã¬ã€ãã®æšè«æã«ã¢ãã«å ã§ååŠçãè¡ãå©ç¹ã»ã¯ã·ã§ã³ãåç §ããŠãã ãã)ã
tf.data
ãã€ãã©ã€ã³å ã§é©çšãããšãããªãã§ãããŸã㯠CPU ãžã®ãªãããŒããå¯èœã«ãªããã¢ã¯ã»ã©ã¬ãŒã¿ã䜿çšããéã®ããã©ãŒãã³ã¹ãåäžããŸãã
1 ã€ä»¥äžã® TPU ã§å®è¡ããå Žåãã»ãšãã©ã®å ŽåããŠãŒã¶ãŒã¯ Keras ååŠçã¬ã€ã€ãŒã tf.data
ãã€ãã©ã€ã³ã«é
眮ããå¿
èŠããããŸãããã¹ãŠã®ã¬ã€ã€ãŒã¯ TPU ããµããŒãããŠããªãã®ã§ãæååæŒç®ã¯ TPU ã§ã¯å®è¡ãããŸããã(2 ã€ã®äŸå€ã¯ãtf.keras.layers.Normalization
ãš tf.keras.layers.Rescaling
ã§ããããã㯠TPU ã§æ£åžžã«åäœããäžè¬çã«ç»åã¢ãã«ã®æåã®ã¬ã€ã€ãŒãšããŠäœ¿çšãããŸãã)
Model.fit
ã§ååŠçãã
Keras Model.fit
ã䜿çšããå Žåãtf.distribute.Strategy.experimental_distribute_dataset
ã tf.distribute.Strategy.distribute_datasets_from_function
ã§ããŒã¿ã忣ããå¿
èŠã¯ãããŸããã詳现ã«ã€ããŠã¯ãååŠçã¬ã€ã€ãŒã®äœ¿çšã¬ã€ããš Keras ã䜿çšãã忣ãã¬ãŒãã³ã°ã¬ã€ããåç
§ããŠãã ãããæ¬¡ã«ç°¡åãªäŸã瀺ããŸãã
Model.fit
API ã䜿çšãã tf.distribute.experimental.ParameterServerStrategy
ã®ãŠãŒã¶ãŒã¯ãtf.keras.utils.experimental.DatasetCreator
ãå
¥åãšããŠäœ¿çšããå¿
èŠããããŸãã(詳现ã«ã€ããŠã¯ããã©ã¡ãŒã¿ãµãŒããŒãã¬ãŒãã³ã°ã¬ã€ããåç
§ããŠãã ãã)
ã«ã¹ã¿ã ãã¬ãŒãã³ã°ã«ãŒãã䜿ã£ãååŠç
ã«ã¹ã¿ã ãã¬ãŒãã³ã°ã«ãŒããäœæããå Žåãtf.distribute.Strategy.experimental_distribute_dataset
API ãŸã㯠tf.distribute.Strategy.distribute_datasets_from_function
API ã®ããããã䜿çšããŠããŒã¿ã忣ããŸããtf.distribute.Strategy.experimental_distribute_dataset
ãä»ããŠããŒã¿ã»ããã忣ããå Žåããããã®ååŠç API ãããŒã¿ãã€ãã©ã€ã³ã«é©çšãããšããªãœãŒã¹ãèªåçã«ããŒã¿ãã€ãã©ã€ã³ãšåãå Žæã«é
眮ããããªã¢ãŒããªãœãŒã¹ã¢ã¯ã»ã¹ãåé¿ã§ããŸãããããã£ãŠãããã§ã®äŸã¯ãã¹ãŠ tf.distribute.Strategy.distribute_datasets_from_function
ã䜿çšããŸãããã®å Žåããããã® API ã®åæåã strategy.scope()
ã®äžã«é
眮ããŠå¹çåããããšãéèŠã§ãã
tf.distribute.experimental.ParameterServerStrategy
ã§ãã¬ãŒãã³ã°ããŠããå Žåã¯ãtf.distribute.experimental.coordinator.ClusterCoordinator.create_per_worker_dataset
ãåŒã³åºãããšã«æ³šæããŠãã ããã
Tensorflow Transform ã®å Žåãåè¿°ã®ããã«ãåææ®µéã¯ãã¬ãŒãã³ã°ãšã¯å¥ã«è¡ããããããããã§ã¯è§ŠããŸããã詳现ã«ã€ããŠã¯ããã¥ãŒããªã¢ã«ãåç
§ããŠãã ãããéåžžããã®æ®µéã§ã¯ãtf.Transform
ååŠç颿°ãäœæãããã®ååŠç颿°ã䜿çšã㊠Apache Beam ãã€ãã©ã€ã³ã§ããŒã¿ã倿ããŸããåææ®µéã®æåŸã«ããã¬ãŒãã³ã°ãšãµãŒãã³ã°ã®äž¡æ¹ã«äœ¿çšã§ãã TensorFlow ã°ã©ããšããŠåºåããšã¯ã¹ããŒãã§ããŸãããã®äŸã§ã¯ããã¬ãŒãã³ã°ãã€ãã©ã€ã³ã®éšåã®ã¿ãæ±ããŸãã
éšåããã
1ïŒãŠãŒã¶ãŒãäœæãã tf.data.Dataset
ã€ã³ã¹ã¿ã³ã¹ã«ãã¬ããªã«ã®æ°ã§åçã«é€ç®ã§ããªãããããµã€ãºãå«ãŸããŠããªãå ŽåããŸã㯠2ïŒããŒã¿ã»ããã€ã³ã¹ã¿ã³ã¹ã®ã«ãŒãã£ããªãã£ãããããµã€ãºã§é€ç®ã§ããªãå Žåã«ãéšåããããçºçããŸããã€ãŸããããŒã¿ã»ãããè€æ°ã®ã¬ããªã«ã«åæ£ãããå Žåãäžéšã®ã€ãã¬ãŒã¿ã§ã® next
åŒã³åºãããtf.errors.OutOfRangeError
ã«ãªããŸãããã®ãŠãŒã¹ã±ãŒã¹ã«å¯Ÿå¿ããããã«ãtf.distribute
ã¯ãåŠçããããŒã¿ãæ®ã£ãŠããªãã¬ããªã«ã§ãããããµã€ãº 0
ã®ãããŒããããè¿ããŸãã
åäžã®ã¯ãŒã«ãŒã®å ŽåãããŒã¿ãã€ãã¬ãŒã¿ã® next
åŒã³åºãã§è¿ãããªãå Žåã«ãããããµã€ãº 0 ã®ãããŒããããäœæãããããŒã¿ã»ããã®å®éã®ããŒã¿ãšãšãã«äœ¿çšãããŸããéšåãããã®å ŽåãããŒã¿ã®æåŸã®ã°ããŒãã«ãããã«ã¯ãããŒã¿ã®ãããŒããããšãšãã«å®éã®ããŒã¿ãå«ãŸããŸããããŒã¿åŠçã«äœ¿çšããææ¢æ¡ä»¶ã§ã¯ãã¬ããªã«ã«ããŒã¿ãååšãããã©ããã確èªããããã«ãªã£ãŠããŸããããŒã¿ãååšããªãã¬ããªã«ãæ€åºããããšãtf.errors.OutOfRangeError
ãšã©ãŒãçºçããŸãã
äžæ¹ãè€æ°ã®ã¯ãŒã«ãŒã®å Žåã¯ãã¯ãã¹ã¬ããªã«éä¿¡ã䜿çšããŠåã¯ãŒã«ãŒã®ããŒã¿ã®ååšã衚ãããŒã«å€ãéèšãããŸããããã¯ããã¹ãŠã®ã¯ãŒã«ãŒã忣ããŒã¿ã»ããã®åŠçãçµäºããããšãèå¥ããããã«äœ¿çšãããŸããããã«ã¯ã¯ãã¹ã¯ãŒã«ãŒéä¿¡ã䌎ããããããã©ãŒãã³ã¹ã«äœããã®æªåœ±é¿ãåã³ãŸãã
泚æäºé
ãã«ãã¯ãŒã«ãŒã»ããã¢ããã§
tf.distribute.Strategy.experimental_distribute_dataset
API ã䜿çšããå ŽåããŠãŒã¶ãŒã¯ãã¡ã€ã«ããèªã¿åãtf.data.Dataset
ãæž¡ããŸããtf.data.experimental.AutoShardPolicy
ãAUTO
ãŸãã¯FILE
ã«èšå®ãããŠããå Žåãã¹ãããããšã®å®éã®ããããµã€ãºããŠãŒã¶ãŒå®çŸ©ã®ã°ããŒãã«ããããµã€ãºããå°ãããªãå¯èœæ§ããããŸããããã¯ããã¡ã€ã«ã®æ®ãã®èŠçŽ ãã°ããŒãã«ããããµã€ãºããå°ãªããªãå Žåã«çºçããããšããããŸãããŠãŒã¶ãŒã¯ãå®è¡ããã¹ãããæ°ã«äŸåããã«ããŒã¿ã»ããã䜿ãæããããtf.data.experimental.AutoShardPolicy
ãDATA
ã«èšå®ããŠãããåé¿ããããšãã§ããŸããã¹ããŒããã«ããŒã¿ã»ãã倿ã¯ãçŸåš
tf.distribute
ã§ãµããŒããããŠããŸãããããŒã¿ã»ããã«ããã¹ããŒããã«æŒç®ã¯ãçŸåšã®ãšããç¡èŠãããŸããããšãã°ãããŒã¿ã»ããã«tf.random.uniform
ã䜿ã£ãŠç»åãå転ãããmap_fn
ãããå ŽåãPython ããã»ã¹ãå®è¡ãããŠããããŒã«ã«ãã·ã³äžã®ç¶æ (ã©ã³ãã ã·ãŒã) ã«äŸåããããŒã¿ã»ããã°ã©ãããããŸããããã©ã«ãã§ç¡å¹åãããŠããå®éšçãª
tf.data.experimental.OptimizationOptions
ã¯ãtf.distribute
ãšäœµããŠäœ¿çšãããŠããå Žåãªã©ã§ã¯ãããã©ãŒãã³ã¹ã®äœäžãçããå¯èœæ§ããããŸãã忣ç°å¢ã«ãããŠã¯ãŒã¯ããŒãã®ããã©ãŒãã³ã¹ã«æçã§ããããšã確èªãããŠãããæå¹åããããã«ããŠãã ãããäžè¬çã«
tf.data
ã䜿çšããŠå ¥åãã€ãã©ã€ã³ãæé©åããæ¹æ³ã«ã€ããŠã¯ããã®ã¬ã€ããåç §ããŠãã ããããŸãã以äžã®ãã³ããã芧ãã ãããè€æ°ã®ã¯ãŒã«ãŒãããã
tf.data.Dataset.list_files
ã䜿çšããŠã1 ã€ä»¥äžã® glob ãã¿ãŒã³ã«äžèŽãããã¹ãŠã®ãã¡ã€ã«ããããŒã¿ã»ãããäœæããŠããå Žåã¯ãå¿ ãseed
åŒæ°ãèšå®ããããshuffle=False
ãèšå®ããŠãåã¯ãŒã«ãŒãäžè²«ããŠãã¡ã€ã«ãåå²ããããã«ããŸãã
å ¥åãã€ãã©ã€ã³ã«ã¬ã³ãŒãã¬ãã«ã§ã®ããŒã¿ã®ã·ã£ããã«ãšããŒã¿ã®è§£æã®äž¡æ¹ãå«ãŸããŠããå Žåãè§£æãããŠããªãããŒã¿ãè§£æãããããŒã¿ãããå€§å¹ ã«å€§ãããªãéã (éåžžã¯ããã§ã¯ãããŸãã)ãæ¬¡ã®äŸã«ç€ºãããã«ãæåã«ã·ã£ããã«ããŠããè§£æããŸããããã«ãããã¡ã¢ãªäœ¿çšéãšããã©ãŒãã³ã¹ãåäžããããšããããŸãã
tf.data.Dataset.shuffle(buffer_size, seed=None, reshuffle_each_iteration=None)
ã¯ãbuffer_size
èŠçŽ ã®å éšãããã¡ãç¶æããbuffer_size
ãåæžããŸããããã«ãããOOM ã®åé¡ã軜æžãããå¯èœæ§ããããŸãã
tf.distribute.experimental_distribute_dataset
ãŸãã¯tf.distribute.distribute_datasets_from_function
ã䜿çšããŠããå Žåãã¯ãŒã«ãŒãããŒã¿ãåŠçããé çªã¯ä¿èšŒãããŠããŸãããããã¯éåžžãtf.distribute
ã䜿çšããŠäºæž¬ãã¹ã±ãŒãªã³ã°ããå Žåã«å¿ èŠã§ãããã ãããããã®åèŠçŽ ã«å¯Ÿããã€ã³ããã¯ã¹ãæ¿å ¥ããããã«åŸã£ãŠåºåãé åºä»ããããšãã§ããŸããæ¬¡ã®ã¹ããããã¯ãåºåãé åºä»ããæ¹æ³ã瀺ããŸãã
泚æ: ããã§ã¯äŸ¿å®äžãtf.distribute.MirroredStrategy
ã䜿çšãããŠããŸãããè€æ°ã®ã¯ãŒã«ãŒã䜿çšããŠãããåäžã¯ãŒã«ãŒãžã®åæ£ã« tf.distribute.MirroredStrategy
ã䜿çšãããŠããå Žåã«ã¯ãå
¥åã®é çªã®ã¿ã倿Žããå¿
èŠããããŸãã
å
¥åã衚çŸããtf.data.Dataset
ãšãäžèšã«ç€ºãããè€æ°ã®ããã€ã¹ã«ããŒã¿ã»ããã忣ããåŸç¶ã® API ã䜿çšã§ããªãããšããããŸãããã®ãããªå Žåã¯ãçã®ãã³ãœã«ã䜿çšãããããžã§ãã¬ãŒã¿ã®å
¥åã䜿çšããããšãã§ããŸãã
ä»»æã®ãã³ãœã«å ¥åã« experimental_distribute_values_from_function ã䜿çšãã
strategy.run
ã¯ãnext(iterator)
ã®åºåã§ãã tf.distribute.DistributedValues
ãåãå
¥ããŸãããã³ãœã«å€ãæž¡ãã«ã¯ãtf.distribute.Strategy.experimental_distribute_values_from_function
ã䜿çšããŠçã®ãã³ãœã«ãã tf.distribute.DistributedValues
ãæ§ç¯ããŸãããŠãŒã¶ãŒã¯ãtf.distribute.experimental.ValueContext
å
¥åãªããžã§ã¯ãã䜿çšããŠããã®ãªãã·ã§ã³ã䜿çšããŠå
¥å颿°ã§ç¬èªã®ãããåŠçããã³ã·ã£ãŒãã£ã³ã°ããžãã¯ãæå®ããå¿
èŠããããŸãã
ãžã§ãã¬ãŒã¿ããã®å ¥åã§ããå Žåã« tf.data.Dataset.from_generator ã䜿çšãã
䜿çšãæ€èšããŠãããžã§ãã¬ãŒã¿é¢æ°ãããå Žåã¯ãfrom_generator
API ã䜿çšããŠtf.data.Dataset
ã€ã³ã¹ã¿ã³ã¹ãäœæã§ããŸãã
泚æ: çŸåšã®ãšãããtf.distribute.TPUStrategy
ã§ã¯ãµããŒããããŠããŸããã