voice_clone_v3 / transformers /docs /source /ko /perf_train_tpu_tf.md
ahassoun's picture
Upload 3018 files
ee6e328
|
raw
history blame
No virus
16.6 kB

TensorFlow๋กœ TPU์—์„œ ํ›ˆ๋ จํ•˜๊ธฐ[[training-on-tpu-with-tensorflow]]

์ž์„ธํ•œ ์„ค๋ช…์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ TPU ์ƒ˜ํ”Œ ์ฝ”๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์šฐ๋ฆฌ์˜ TPU ์˜ˆ์ œ ๋…ธํŠธ๋ถ!์„ ํ™•์ธํ•˜์„ธ์š”.

TPU๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์š”?[[what-is-a-tpu]]

TPU๋Š” ํ…์„œ ์ฒ˜๋ฆฌ ์žฅ์น˜์ž…๋‹ˆ๋‹ค. Google์—์„œ ์„ค๊ณ„ํ•œ ํ•˜๋“œ์›จ์–ด๋กœ, GPU์ฒ˜๋Ÿผ ์‹ ๊ฒฝ๋ง ๋‚ด์—์„œ ํ…์„œ ์—ฐ์‚ฐ์„ ๋”์šฑ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ํ›ˆ๋ จ๊ณผ ์ถ”๋ก  ๋ชจ๋‘์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Google์˜ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ์ด์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, Google Colab๊ณผ Kaggle Kernel์„ ํ†ตํ•ด ์†Œ๊ทœ๋ชจ TPU๋ฅผ ๋ฌด๋ฃŒ๋กœ ์ง์ ‘ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค— Transformers์˜ ๋ชจ๋“  Tensorflow ๋ชจ๋ธ์€ Keras ๋ชจ๋ธ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ด ๋ฌธ์„œ์—์„œ ๋‹ค๋ฃจ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฉ”์†Œ๋“œ๋Š” ๋Œ€์ฒด๋กœ ๋ชจ๋“  Keras ๋ชจ๋ธ์„ ์œ„ํ•œ TPU ํ›ˆ๋ จ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ํ•˜์ง€๋งŒ Transformer์™€ ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ HuggingFace ์ƒํƒœ๊ณ„(hug-o-system?)์— ํŠนํ™”๋œ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ์–ธ๊ธ‰ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์ข…๋ฅ˜์˜ TPU๊ฐ€ ์žˆ๋‚˜์š”?[[what-kinds-of-tpu-are-available]]

์‹ ๊ทœ ์‚ฌ์šฉ์ž๋Š” TPU์˜ ๋ฒ”์œ„์™€ ๋‹ค์–‘ํ•œ ์ด์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋งค์šฐ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. TPU ๋…ธ๋“œ์™€ TPU VM์˜ ์ฐจ์ด์ ์€ ๊ฐ€์žฅ ๋จผ์ € ์ดํ•ดํ•ด์•ผ ํ•  ํ•ต์‹ฌ์ ์ธ ๊ตฌ๋ถ„ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

TPU ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์‹ค์ œ๋กœ๋Š” ์›๊ฒฉ TPU๋ฅผ ๊ฐ„์ ‘์ ์œผ๋กœ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ์™€ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ดˆ๊ธฐํ™”ํ•œ ๋‹ค์Œ, ์ด๋ฅผ ์›๊ฒฉ ๋…ธ๋“œ๋กœ ์ „๋‹ฌํ•  ๋ณ„๋„์˜ VM์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Google Colab์—์„œ TPU๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, TPU ๋…ธ๋“œ ๋ฐฉ์‹์œผ๋กœ ์ด์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

TPU ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค! ํŠนํžˆ, TPU๋Š” ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ธฐ๊ธฐ(machine)์™€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋กœ์ปฌ ๊ธฐ๊ธฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ปดํ“จํ„ฐ์˜ ๋‚ด๋ถ€ ์ €์žฅ์†Œ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์€ ์ ˆ๋Œ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ๋กœ์ปฌ ๊ธฐ๊ธฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋Œ€์‹ ์—, ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์ด ์›๊ฒฉ TPU ๋…ธ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ผ ๋•Œ์—๋„ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์ด ๊ณ„์† ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” Google Cloud Storage์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ np.ndarray ๋˜๋Š” tf.Tensor๋กœ ๋งž์ถœ ์ˆ˜ ์žˆ๋‹ค๋ฉด, Google Cloud Storage์— ์—…๋กœ๋“œํ•  ํ•„์š” ์—†์ด, Colab ๋˜๋Š” TPU ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— fit() ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿค—ํŠน์ˆ˜ํ•œ Hugging Face ํŒ๐Ÿค—: TF ์ฝ”๋“œ ์˜ˆ์ œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” Dataset.to_tf_dataset() ๋ฉ”์†Œ๋“œ์™€ ๊ทธ ์ƒ์œ„ ๋ž˜ํผ(wrapper)์ธ model.prepare_tf_dataset()๋Š” ๋ชจ๋‘ TPU ๋…ธ๋“œ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” tf.data.Dataset์„ ์ƒ์„ฑํ•˜๋”๋ผ๋„ โ€œ์ˆœ์ˆ˜ํ•œโ€ tf.data ํŒŒ์ดํ”„๋ผ์ธ์ด ์•„๋‹ˆ๋ฉฐ tf.numpy_function ๋˜๋Š” Dataset.from_generator()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ HuggingFace Dataset์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด HuggingFace Dataset๋Š” ๋กœ์ปฌ ๋””์Šคํฌ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋กœ ์ง€์›๋˜๋ฉฐ ์›๊ฒฉ TPU ๋…ธ๋“œ๊ฐ€ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

TPU๋ฅผ ์ด์šฉํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ TPU VM์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. TPU VM์„ ์‚ฌ์šฉํ•  ๋•Œ, GPU VM์—์„œ ํ›ˆ๋ จํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด TPU๊ฐ€ ์žฅ์ฐฉ๋œ ๊ธฐ๊ธฐ์— ์ง์ ‘ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๊ด€๋ จํ•˜์—ฌ, TPU VM์€ ๋Œ€์ฒด๋กœ ์ž‘์—…ํ•˜๊ธฐ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๋ชจ๋“  ๊ฒฝ๊ณ ๋Š” TPU VM์—๋Š” ํ•ด๋‹น๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!

์ด ๋ฌธ์„œ๋Š” ์˜๊ฒฌ์ด ํฌํ•จ๋œ ๋ฌธ์„œ์ด๋ฉฐ, ์ €ํฌ์˜ ์˜๊ฒฌ์ด ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค: ๊ฐ€๋Šฅํ•˜๋ฉด TPU ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. TPU ๋…ธ๋“œ๋Š” TPU VM๋ณด๋‹ค ๋” ๋ณต์žกํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ–ฅํ›„์—๋Š” ์ง€์›๋˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. Google์˜ ์ตœ์‹  TPU์ธ TPUv4๋Š” TPU VM์œผ๋กœ๋งŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, TPU ๋…ธ๋“œ๋Š” ์ ์  ๋” "๊ตฌ์‹" ์ด์šฉ ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์œผ๋กœ ์ „๋ง๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ TPU ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Colab๊ณผ Kaggle Kernel์—์„œ๋งŒ ๋ฌด๋ฃŒ TPU ์ด์šฉ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜์–ด, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค! ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์ด ๋‹ด๊ธด ์ฝ”๋“œ ์ƒ˜ํ”Œ์€ TPU ์˜ˆ์ œ ๋…ธํŠธ๋ถ์—์„œ ํ™•์ธํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์–ด๋–ค ํฌ๊ธฐ์˜ TPU๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‚˜์š”?[[what-sizes-of-tpu-are-available]]

๋‹จ์ผ TPU(v2-8/v3-8/v4-8)๋Š” 8๊ฐœ์˜ ๋ณต์ œ๋ณธ(replicas)์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. TPU๋Š” ์ˆ˜๋ฐฑ ๋˜๋Š” ์ˆ˜์ฒœ ๊ฐœ์˜ ๋ณต์ œ๋ณธ์„ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” pod๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ TPU๋ฅผ ํ•˜๋‚˜ ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ „์ฒด Pod๋ณด๋‹ค ์ ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ(์˜ˆ๋ฅผ ๋“ค๋ฉด, v3-32), TPU ๊ตฌ์„ฑ์„ pod ์Šฌ๋ผ์ด์Šค๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Colab์„ ํ†ตํ•ด ๋ฌด๋ฃŒ TPU์— ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹จ์ผ v2-8 TPU๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.

XLA์— ๋Œ€ํ•ด ๋“ค์–ด๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. XLA๋ž€ ๋ฌด์—‡์ด๊ณ  TPU์™€ ์–ด๋–ค ๊ด€๋ จ์ด ์žˆ๋‚˜์š”?[[i-keep-hearing-about-this-xla-thing-whats-xla-and-how-does-it-relate-to-tpus]]

XLA๋Š” ์ตœ์ ํ™” ์ปดํŒŒ์ผ๋Ÿฌ๋กœ, TensorFlow์™€ JAX์—์„œ ๋ชจ๋‘ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. JAX์—์„œ๋Š” ์œ ์ผํ•œ ์ปดํŒŒ์ผ๋Ÿฌ์ด์ง€๋งŒ, TensorFlow์—์„œ๋Š” ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค(ํ•˜์ง€๋งŒ TPU์—์„œ๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค!). Keras ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•  ๋•Œ ์ด๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ jit_compile=True ์ธ์ˆ˜๋ฅผ model.compile()์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ์—†๊ณ  ์„ฑ๋Šฅ์ด ์–‘ํ˜ธํ•˜๋‹ค๋ฉด, TPU๋กœ ์ „ํ™˜ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๋Š” ์ข‹์€ ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค!

TPU์—์„œ ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฒƒ์€ ๋Œ€๊ฐœ CPU/GPU๋ณด๋‹ค ์กฐ๊ธˆ ๋” ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์—, TPU์—์„œ ์‹œ๋„ํ•˜๊ธฐ ์ „์— ๋จผ์ € XLA๋กœ CPU/GPU์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์˜ค๋ž˜ ํ•™์Šตํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋ธ๊ณผ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๋‹จ๊ณ„๋งŒ ๊ฑฐ์น˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

XLA๋กœ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋Š” ๋Œ€์ฒด๋กœ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ TPU์—์„œ ์‹คํ–‰ํ•  ๊ณ„ํš์ด ์—†๋”๋ผ๋„, jit_compile=True๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ XLA ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•œ ์•„๋ž˜ ์ฃผ์˜ ์‚ฌํ•ญ์„ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•˜์„ธ์š”!

๋ผˆ์•„ํ”ˆ ๊ฒฝํ—˜์—์„œ ์–ป์€ ํŒ: jit_compile=True๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์†๋„๋ฅผ ๋†’์ด๊ณ  CPU/GPU ์ฝ”๋“œ๊ฐ€ XLA์™€ ํ˜ธํ™˜๋˜๋Š”์ง€ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ, ์‹ค์ œ TPU์—์„œ ํ›ˆ๋ จํ•  ๋•Œ ๊ทธ๋Œ€๋กœ ๋‚จ๊ฒจ๋‘๋ฉด ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. XLA ์ปดํŒŒ์ผ์€ TPU์—์„œ ์•”์‹œ์ ์œผ๋กœ ์ด๋ค„์ง€๋ฏ€๋กœ, ์‹ค์ œ TPU์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ํ•ด๋‹น ์ค„์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”!

์ œ XLA ๋ชจ๋ธ๊ณผ ํ˜ธํ™˜ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”?[[how-do-i-make-my-model-xla-compatible]]

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ, ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๋Š” ์ด๋ฏธ XLA์™€ ํ˜ธํ™˜๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค! ๊ทธ๋Ÿฌ๋‚˜ ํ‘œ์ค€ TensorFlow์—์„œ ์ž‘๋™ํ•˜์ง€๋งŒ, XLA์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์•„๋ž˜ ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ๊ทœ์น™์œผ๋กœ ๊ฐ„์ถ”๋ ธ์Šต๋‹ˆ๋‹ค:

ํŠน์ˆ˜ํ•œ HuggingFace ํŒ๐Ÿค—: ์ €ํฌ๋Š” TensorFlow ๋ชจ๋ธ๊ณผ ์†์‹ค ํ•จ์ˆ˜๋ฅผ XLA์™€ ํ˜ธํ™˜๋˜๋„๋ก ์žฌ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€์Šต๋‹ˆ๋‹ค. ์ €ํฌ์˜ ๋ชจ๋ธ๊ณผ ์†์‹ค ํ•จ์ˆ˜๋Š” ๋Œ€๊ฐœ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทœ์น™ #1๊ณผ #2๋ฅผ ๋”ฐ๋ฅด๋ฏ€๋กœ transformers ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์ด๋ฅผ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž์ฒด ๋ชจ๋ธ๊ณผ ์†์‹ค ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋Š” ์ด๋Ÿฌํ•œ ๊ทœ์น™์„ ์žŠ์ง€ ๋งˆ์„ธ์š”!

XLA ๊ทœ์น™ #1: ์ฝ”๋“œ์—์„œ โ€œ๋ฐ์ดํ„ฐ ์ข…์† ์กฐ๊ฑด๋ฌธโ€์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค[[xla-rule-1-your-code-cannot-have-datadependent-conditionals]]

์–ด๋–ค if๋ฌธ๋„ tf.Tensor ๋‚ด๋ถ€์˜ ๊ฐ’์— ์ข…์†๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด ์ฝ”๋“œ ๋ธ”๋ก์€ XLA๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!

if tf.reduce_sum(tensor) > 10:
    tensor = tensor / 2.0

์ฒ˜์Œ์—๋Š” ๋งค์šฐ ์ œํ•œ์ ์œผ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ์‹ ๊ฒฝ๋ง ์ฝ”๋“œ์—์„œ๋Š” ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. tf.cond๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜(์—ฌ๊ธฐ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐ), ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์กฐ๊ฑด๋ฌธ์„ ์ œ๊ฑฐํ•˜๊ณ  ๋Œ€์‹  ์ง€ํ‘œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜๋ฆฌํ•œ ์ˆ˜ํ•™ ํŠธ๋ฆญ์„ ์ฐพ์•„๋‚ด์–ด ์ด ์ œํ•œ์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

sum_over_10 = tf.cast(tf.reduce_sum(tensor) > 10, tf.float32)
tensor = tensor / (1.0 + sum_over_10)

์ด ์ฝ”๋“œ๋Š” ์œ„์˜ ์ฝ”๋“œ์™€ ์ •ํ™•ํžˆ ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€๋งŒ, ์กฐ๊ฑด๋ฌธ์„ ์ œ๊ฑฐํ•˜์—ฌ ๋ฌธ์ œ ์—†์ด XLA๋กœ ์ปดํŒŒ์ผ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค!

XLA ๊ทœ์น™ #2: ์ฝ”๋“œ์—์„œ "๋ฐ์ดํ„ฐ ์ข…์† ํฌ๊ธฐ"๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค[[xla-rule-2-your-code-cannot-have-datadependent-shapes]]

์ฝ”๋“œ์—์„œ ๋ชจ๋“  tf.Tensor ๊ฐ์ฒด์˜ ํฌ๊ธฐ๊ฐ€ ํ•ด๋‹น ๊ฐ’์— ์ข…์†๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, tf.unique ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ์—์„œ ๊ฐ ๊ณ ์œ  ๊ฐ’์˜ ์ธ์Šคํ„ด์Šค ํ•˜๋‚˜๋ฅผ ํฌํ•จํ•˜๋Š” tensor๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— XLA๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ์ถœ๋ ฅ์˜ ํฌ๊ธฐ๋Š” ์ž…๋ ฅ Tensor๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฐ˜๋ณต์ ์ธ์ง€์— ๋”ฐ๋ผ ๋ถ„๋ช…ํžˆ ๋‹ฌ๋ผ์งˆ ๊ฒƒ์ด๋ฏ€๋กœ, XLA๋Š” ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค!

์ผ๋ฐ˜์ ์œผ๋กœ, ๋Œ€๋ถ€๋ถ„์˜ ์‹ ๊ฒฝ๋ง ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ทœ์น™ 2๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋Œ€ํ‘œ์ ์ธ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํ”ํ•œ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜๋Š” ๋ ˆ์ด๋ธ” ๋งˆ์Šคํ‚น์„ ์‚ฌ์šฉํ•˜์—ฌ ์†์‹ค(loss)์„ ๊ณ„์‚ฐํ•  ๋•Œ, ํ•ด๋‹น ์œ„์น˜๋ฅผ ๋ฌด์‹œํ•˜๋„๋ก ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๋ ˆ์ด๋ธ”์„ ์Œ์ˆ˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋ ˆ์ด๋ธ” ๋งˆ์Šคํ‚น์„ ์ง€์›ํ•˜๋Š” NumPy๋‚˜ PyTorch ์†์‹ค ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด ๋ถˆ ์ธ๋ฑ์‹ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž์ฃผ ์ ‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

label_mask = labels >= 0
masked_outputs = outputs[label_mask]
masked_labels = labels[label_mask]
loss = compute_loss(masked_outputs, masked_labels)
mean_loss = torch.mean(loss)

์ด ์ฝ”๋“œ๋Š” NumPy๋‚˜ PyTorch์—์„œ๋Š” ๋ฌธ์ œ ์—†์ด ์ž‘๋™ํ•˜์ง€๋งŒ, XLA์—์„œ๋Š” ์†์ƒ๋ฉ๋‹ˆ๋‹ค! ์™œ ๊ทธ๋Ÿด๊นŒ์š”? ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์œ„์น˜๊ฐ€ ๋งˆ์Šคํ‚น๋˜๋Š”์ง€์— ๋”ฐ๋ผ masked_outputs์™€ masked_labels์˜ ํฌ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ ธ์„œ, ๋ฐ์ดํ„ฐ ์ข…์† ํฌ๊ธฐ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทœ์น™ #1๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์ด ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์ข…์†์  ๋ชจ์–‘ ํฌ๊ธฐ๊ฐ€ ์ •ํ™•ํžˆ ๋™์ผํ•œ ์ถœ๋ ฅ์„ ์‚ฐ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

label_mask = tf.cast(labels >= 0, tf.float32)
loss = compute_loss(outputs, labels)
loss = loss * label_mask  # Set negative label positions to 0
mean_loss = tf.reduce_sum(loss) / tf.reduce_sum(label_mask)

์—ฌ๊ธฐ์„œ, ๋ชจ๋“  ์œ„์น˜์— ๋Œ€ํ•œ ์†์‹ค์„ ๊ณ„์‚ฐํ•˜์ง€๋งŒ, ํ‰๊ท ์„ ๊ณ„์‚ฐํ•  ๋•Œ ๋ถ„์ž์™€ ๋ถ„๋ชจ ๋ชจ๋‘์—์„œ ๋งˆ์Šคํฌ๋œ ์œ„์น˜๋ฅผ 0์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ์ดํ„ฐ ์ข…์† ํฌ๊ธฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  XLA ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฒซ ๋ฒˆ์งธ ๋ธ”๋ก๊ณผ ์ •ํ™•ํžˆ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์‚ฐ์ถœํ•ฉ๋‹ˆ๋‹ค. ๊ทœ์น™ #1์—์„œ์™€ ๋™์ผํ•œ ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ tf.bool์„ tf.float32๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์ด๋ฅผ ์ง€ํ‘œ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํŠธ๋ฆญ์€ ๋งค์šฐ ์œ ์šฉํ•˜๋ฉฐ, ์ž์ฒด ์ฝ”๋“œ๋ฅผ XLA๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ๊ธฐ์–ตํ•ด ๋‘์„ธ์š”!

XLA ๊ทœ์น™ #3: XLA๋Š” ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ๋งˆ๋‹ค ๋ชจ๋ธ์„ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค[[xla-rule-3-xla-will-need-to-recompile-your-model-for-every-different-input-shape-it-sees]]

์ด๊ฒƒ์€ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ ๋งค์šฐ ๊ฐ€๋ณ€์ ์ธ ๊ฒฝ์šฐ, XLA๋Š” ๋ชจ๋ธ์„ ๋ฐ˜๋ณตํ•ด์„œ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์— ํฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ํ† ํฐํ™” ํ›„ ์ž…๋ ฅ ํ…์ŠคํŠธ์˜ ๊ธธ์ด๊ฐ€ ๊ฐ€๋ณ€์ ์ธ NLP ๋ชจ๋ธ์—์„œ ์ฃผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋‹ฌ๋ฆฌํ‹ฐ์—์„œ๋Š” ์ •์  ํฌ๊ธฐ๊ฐ€ ๋” ํ”ํ•˜๋ฉฐ, ํ•ด๋‹น ๊ทœ์น™์ด ํ›จ์”ฌ ๋œ ๋ฌธ์ œ์‹œ ๋ฉ๋‹ˆ๋‹ค.

๊ทœ์น™ #3์„ ์–ด๋–ป๊ฒŒ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ํ•ต์‹ฌ์€ ํŒจ๋”ฉ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ž…๋ ฅ์„ ๋™์ผํ•œ ๊ธธ์ด๋กœ ํŒจ๋”ฉํ•œ ๋‹ค์Œ, attention_mask๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค XLA ๋ฌธ์ œ๋„ ์—†์ด ๊ฐ€๋ณ€ ํฌ๊ธฐ์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณผ๋„ํ•œ ํŒจ๋”ฉ์€ ์‹ฌ๊ฐํ•œ ์†๋„ ์ €ํ•˜๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ƒ˜ํ”Œ์„ ์ „์ฒด ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ์ตœ๋Œ€ ๊ธธ์ด๋กœ ํŒจ๋”ฉํ•˜๋ฉด, ๋ฌดํ•œํ•œ ํŒจ๋”ฉ ํ† ํฐ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐฐ์น˜๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋งŽ์€ ์—ฐ์‚ฐ๊ณผ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‚ญ๋น„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์™„๋ฒฝํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋ช‡ ๊ฐ€์ง€ ํŠธ๋ฆญ์„ ์‹œ๋„ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์œ ์šฉํ•œ ํŠธ๋ฆญ์€ ์ƒ˜ํ”Œ ๋ฐฐ์น˜๋ฅผ 32 ๋˜๋Š” 64 ํ† ํฐ๊ณผ ๊ฐ™์€ ์ˆซ์ž์˜ ๋ฐฐ์ˆ˜๊นŒ์ง€ ํŒจ๋”ฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ† ํฐ ์ˆ˜๊ฐ€ ์†Œํญ ์ฆ๊ฐ€ํ•˜์ง€๋งŒ, ๋ชจ๋“  ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ 32 ๋˜๋Š” 64์˜ ๋ฐฐ์ˆ˜์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์œ ํ•œ ์ž…๋ ฅ ํฌ๊ธฐ์˜ ์ˆ˜๊ฐ€ ๋Œ€ํญ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ๊ณ ์œ ํ•œ ์ž…๋ ฅ ํฌ๊ธฐ๊ฐ€ ์ ๋‹ค๋Š” ๊ฒƒ์€ XLA ์ปดํŒŒ์ผ ํšŸ์ˆ˜๊ฐ€ ์ ์–ด์ง„๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค!

๐Ÿค—ํŠน์ˆ˜ํ•œ HuggingFace ํŒ๐Ÿค—: ํ† ํฌ๋‚˜์ด์ €์™€ ๋ฐ์ดํ„ฐ ์ฝœ๋ ˆ์ดํ„ฐ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ† ํฌ๋‚˜์ด์ €๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ padding="max_length" ๋˜๋Š” padding="longest"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒจ๋”ฉ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ† ํฌ๋‚˜์ด์ €์™€ ๋ฐ์ดํ„ฐ ์ฝœ๋ ˆ์ดํ„ฐ๋Š” ๋‚˜ํƒ€๋‚˜๋Š” ๊ณ ์œ ํ•œ ์ž…๋ ฅ ํฌ๊ธฐ์˜ ์ˆ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” pad_to_multiple_of ์ธ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค!

์‹ค์ œ TPU๋กœ ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”?[[how-do-i-actually-train-my-model-on-tpu]]

ํ›ˆ๋ จ์ด XLA์™€ ํ˜ธํ™˜๋˜๊ณ  (TPU ๋…ธ๋“œ/Colab์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ) ๋ฐ์ดํ„ฐ ์„ธํŠธ๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ์ค€๋น„๋˜์—ˆ๋‹ค๋ฉด, TPU์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋†€๋ž๋„๋ก ์‰ฝ์Šต๋‹ˆ๋‹ค! ์ฝ”๋“œ์—์„œ ๋ช‡ ์ค„๋งŒ ์ถ”๊ฐ€ํ•˜์—ฌ, TPU๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๋ชจ๋ธ๊ณผ ๋ฐ์ดํ„ฐ ์„ธํŠธ๊ฐ€ TPUStrategy ๋ฒ”์œ„ ๋‚ด์— ์ƒ์„ฑ๋˜๋„๋ก ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ TPU ์˜ˆ์ œ ๋…ธํŠธ๋ถ์„ ์ฐธ์กฐํ•˜์—ฌ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š” ๋ชจ์Šต์„ ํ™•์ธํ•ด ๋ณด์„ธ์š”!

์š”์•ฝ[[summary]]

์—ฌ๊ธฐ์— ๋งŽ์€ ๋‚ด์šฉ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, TPU ํ›ˆ๋ จ์„ ์œ„ํ•œ ๋ชจ๋ธ์„ ์ค€๋น„ํ•  ๋•Œ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋žตํ•œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋กœ ์š”์•ฝํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

  • ์ฝ”๋“œ๊ฐ€ XLA์˜ ์„ธ ๊ฐ€์ง€ ๊ทœ์น™์„ ๋”ฐ๋ฅด๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • CPU/GPU์—์„œ jit_compile=True๋กœ ๋ชจ๋ธ์„ ์ปดํŒŒ์ผํ•˜๊ณ  XLA๋กœ ํ›ˆ๋ จํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ TPU ํ˜ธํ™˜ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(๋…ธํŠธ๋ถ ์ฐธ์กฐ)
  • ์ฝ”๋“œ๋ฅผ Colab(accelerator๊ฐ€ โ€œTPUโ€๋กœ ์„ค์ •๋จ) ๋˜๋Š” Google Cloud์˜ TPU VM์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.
  • TPU ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(๋…ธํŠธ๋ถ ์ฐธ์กฐ)
  • TPUStrategy๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๊ณผ ๋ชจ๋ธ ์ƒ์„ฑ์ด strategy.scope() ๋‚ด์— ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค(๋…ธํŠธ๋ถ ์ฐธ์กฐ)
  • TPU๋กœ ์ด๋™ํ•  ๋•Œ jit_compile=True๋ฅผ ๋‹ค์‹œ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”!
  • ๐Ÿ™๐Ÿ™๐Ÿ™๐Ÿฅบ๐Ÿฅบ๐Ÿฅบ
  • model.fit()์„ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ๋ถ„์ด ํ•ด๋ƒˆ์Šต๋‹ˆ๋‹ค!