Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tensorflow
GitHub Repository: tensorflow/docs-l10n
Path: blob/master/site/ko/guide/gpu_performance_analysis.md
25115 views

TensorFlow Profiler๋กœ TensorFlow GPU ์„ฑ๋Šฅ ์ตœ์ ํ™”

Overview

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” TensorBoard์™€ ํ•จ๊ป˜ TensorFlow Profiler๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GPU์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์–ป๊ณ  ์ตœ๋Œ€ ์„ฑ๋Šฅ์„ ์–ป๊ณ , ํ•˜๋‚˜ ์ด์ƒ์˜ GPU๊ฐ€ ์ถฉ๋ถ„ํžˆ ํ™œ์šฉ๋˜์ง€ ์•Š์„ ๋•Œ ๋””๋ฒ„๊ทธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:

  • TensorFlow Profiler: Keras ์˜ˆ์ œ ๋ฐ TensorBoard๊ฐ€ ํฌํ•จ๋œ ํ”„๋กœํ•„ ๋ชจ๋ธ ์„ฑ๋Šฅ ๋…ธํŠธ๋ถ์œผ๋กœ ์‹œ์ž‘ํ•˜์„ธ์š”.

  • ํ”„๋กœํŒŒ์ผ๋Ÿฌ ๊ฐ€์ด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ TensorFlow ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฅผ ํ†ตํ•ด ํ˜ธ์ŠคํŠธ(CPU)์—์„œ TensorFlow ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ ๋ฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์„ธ์š”.

GPU๋กœ ๊ณ„์‚ฐ์„ ์˜คํ”„๋กœ๋”ฉํ•˜๋Š” ๊ฒƒ์ด ํŠนํžˆ ์ž‘์€ ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ ํ•ญ์ƒ ์œ ์ตํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ์—ผ๋‘์— ๋‘์‹ญ์‹œ์˜ค. ๋‹ค์Œ์œผ๋กœ ์ธํ•ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ˜ธ์ŠคํŠธ(CPU)์™€ ์žฅ์น˜(GPU) ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „์†ก ๊ทธ๋ฆฌ๊ณ 

  • ํ˜ธ์ŠคํŠธ๊ฐ€ GPU ์ปค๋„์„ ์‹œ์ž‘ํ•  ๋•Œ ๊ด€๋ จ๋œ ๋Œ€๊ธฐ ์‹œ๊ฐ„์œผ๋กœ ์ธํ•ด.

์„ฑ๋Šฅ ์ตœ์ ํ™” ์›Œํฌํ”Œ๋กœ

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ๋‹จ์ผ GPU์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ์—ฌ๋Ÿฌ GPU๊ฐ€ ์žˆ๋Š” ๋‹จ์ผ ํ˜ธ์ŠคํŠธ๋กœ ์ด๋™ํ•˜๋Š” ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊ทธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ˆœ์„œ๋กœ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊ทธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  1. ํ•˜๋‚˜์˜ GPU์—์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ๋””๋ฒ„๊ทธ:

    1. ์ž…๋ ฅ ํŒŒ์ดํ”„๋ผ์ธ์ด ๋ณ‘๋ชฉ ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    2. ํ•œ GPU์˜ ์„ฑ๋Šฅ์„ ๋””๋ฒ„๊ทธํ•ฉ๋‹ˆ๋‹ค.

    3. ํ˜ผํ•ฉ ์ •๋ฐ€๋„( fp16 (float16) ์‚ฌ์šฉ)๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  ์„ ํƒ์ ์œผ๋กœ XLA๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

  2. ๋‹ค์ค‘ GPU ๋‹จ์ผ ํ˜ธ์ŠคํŠธ์—์„œ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ณ  ๋””๋ฒ„๊ทธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด TensorFlow ๋ฐฐํฌ ์ „๋žต ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ GPU๊ฐ€ ์žˆ๋Š” ๋‹จ์ผ ํ˜ธ์ŠคํŠธ์—์„œ ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•˜๊ณ  ์ตœ์ ์ด ์•„๋‹Œ GPU ์‚ฌ์šฉ๋ฅ ์„ ํ™•์ธํ•œ ๊ฒฝ์šฐ ๋‹ค์ค‘ GPU ์‹œ์Šคํ…œ์„ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์ „์— ๋จผ์ € ํ•˜๋‚˜์˜ GPU์— ๋Œ€ํ•œ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ณ  ๋””๋ฒ„๊ทธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

GPU์—์„œ ๊ณ ์„ฑ๋Šฅ ์ฝ”๋“œ๋ฅผ ์–ป๊ธฐ ์œ„ํ•œ ๊ธฐ์ค€์œผ๋กœ ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ์ด๋ฏธ tf.function์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. Keras Model.compile ๋ฐ Model.fit API๋Š” ๋‚ด๋ถ€์—์„œ tf.function์„ ์ž๋™์œผ๋กœ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. tf.GradientTape๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ํ›ˆ๋ จ ๋ฃจํ”„๋ฅผ ์ž‘์„ฑํ•  ๋•Œ tf.function์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ tf.function์œผ๋กœ ์„ฑ๋Šฅ ํ–ฅ์ƒํ•˜๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์‹๋ณ„ํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋„๋ก ์œ„์˜ ๊ฐ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•ด ์ œ์•ˆ๋œ ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

1. ํ•˜๋‚˜์˜ GPU์—์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™”

์ด์ƒ์ ์ธ ๊ฒฝ์šฐ ํ”„๋กœ๊ทธ๋žจ์€ GPU ์‚ฌ์šฉ๋ฅ ์ด ๋†’๊ณ  CPU(ํ˜ธ์ŠคํŠธ)์™€ GPU(์žฅ์น˜) ๊ฐ„์˜ ํ†ต์‹ ์ด ์ตœ์†Œํ™”๋˜์–ด์•ผ ํ•˜๋ฉฐ ์ž…๋ ฅ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ๋ถ„์„์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ํ•˜๋‚˜์˜ GPU๋กœ ์‹คํ–‰๋˜๋Š” ๋ชจ๋ธ์˜ ํ”„๋กœํ•„์„ ์–ป๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TensorBoard์˜ Profiler ๊ฐœ์š” ํŽ˜์ด์ง€( ํ”„๋กœํ•„ ์‹คํ–‰ ์ค‘์— ๋ชจ๋ธ์ด ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰๋˜์—ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ตœ์ƒ์œ„ ๋ณด๊ธฐ๋ฅผ ๋ณด์—ฌ์คŒ)๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ด์ƒ์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TensorFlow Profiler Overview Page

๊ฐœ์š” ํŽ˜์ด์ง€์— ์ฃผ์˜ํ•ด์•ผ ํ•  ์ฃผ์š” ๋ฒˆํ˜ธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์‹ค์ œ ์žฅ์น˜ ์‹คํ–‰์—์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋‹จ๊ณ„ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋Š”์ง€

  2. ์žฅ์น˜ ๋Œ€ ํ˜ธ์ŠคํŠธ์— ๋ฐฐ์น˜๋œ ์ž‘์—…์˜ ๋น„์œจ

  3. ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ปค๋„์ด fp16

์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์„ธ ๊ฐ€์ง€ ๊ฒฝ์šฐ ๋ชจ๋‘์—์„œ ์ด๋Ÿฌํ•œ ์ˆ˜์น˜๋ฅผ ์ตœ๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์„ ์‹ฌ์ธต์ ์œผ๋กœ ์ดํ•ดํ•˜๋ ค๋ฉด TensorBoard์˜ Profiler ์ถ”์  ๋ทฐ์–ด์— ์ต์ˆ™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์„น์…˜์—์„œ๋Š” ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ง„๋‹จํ•  ๋•Œ ์ฐพ์•„์•ผ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ์ถ”์  ๋ทฐ์–ด ํŒจํ„ด์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” ํ•˜๋‚˜์˜ GPU์—์„œ ์‹คํ–‰๋˜๋Š” ๋ชจ๋ธ ์ถ”์  ๋ณด๊ธฐ์˜ ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค. TensorFlow Name Scope ๋ฐ TensorFlow Ops ์„น์…˜์—์„œ ์ •๋ฐฉํ–ฅ ํ†ต๊ณผ, ์†์‹ค ํ•จ์ˆ˜, ์—ญ๋ฐฉํ–ฅ ํ†ต๊ณผ/๊ธฐ์šธ๊ธฐ ๊ณ„์‚ฐ, ์ตœ์ ํ™”๊ธฐ ๊ฐ€์ค‘์น˜ ์—…๋ฐ์ดํŠธ์™€ ๊ฐ™์€ ๋ชจ๋ธ์˜ ๋‹ค์–‘ํ•œ ๋ถ€๋ถ„์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CUDA ์ŠคํŠธ๋ฆผ์„ ์ฐธ์กฐํ•˜๋Š” ๊ฐ Stream ์˜†์˜ GPU์—์„œ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ŠคํŠธ๋ฆผ์€ ํŠน์ • ์ž‘์—…์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ์ถ”์ ์—์„œ Stream#118 ์€ ์ปดํ“จํŒ… ์ปค๋„ ๋ฐ ์žฅ์น˜ ๊ฐ„ ๋ณต์‚ฌ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Stream#119 ๋Š” ํ˜ธ์ŠคํŠธ ๋Œ€ ์žฅ์น˜ ๋ณต์‚ฌ์— ์‚ฌ์šฉ๋˜๋ฉฐ Stream#120 ์€ ์žฅ์น˜ ๋Œ€ ํ˜ธ์ŠคํŠธ ๋ณต์‚ฌ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์ถ”์ ์€ ์„ฑ๋Šฅ ๋ชจ๋ธ์˜ ์ผ๋ฐ˜์ ์ธ ํŠน์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

image

์˜ˆ๋ฅผ ๋“ค์–ด GPU ์ปดํ“จํŒ… ํƒ€์ž„๋ผ์ธ( Stream#118 )์€ ๊ฐ„๊ฒฉ์ด ๊ฑฐ์˜ ์—†๋Š” "๋ฐ”์œ" ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ์—์„œ ์žฅ์น˜๋กœ( Stream #119 ) ๋ฐ ์žฅ์น˜์—์„œ ํ˜ธ์ŠคํŠธ๋กœ( Stream #120 ) ์ตœ์†Œํ•œ์˜ ๋ณต์‚ฌ๋ณธ์ด ์žˆ์œผ๋ฉฐ ๋‹จ๊ณ„ ๊ฐ„์˜ ๊ฐ„๊ฒฉ๋„ ์ตœ์†Œํ™”๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ถ”์  ๋ณด๊ธฐ์—์„œ ์ด๋Ÿฌํ•œ ์ด์ƒ์ ์ธ ํŠน์„ฑ์„ ์‹๋ณ„ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์—์„œ๋Š” ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

1. ์ž…๋ ฅ ํŒŒ์ดํ”„๋ผ์ธ ๋””๋ฒ„๊ทธ

GPU ์„ฑ๋Šฅ ๋””๋ฒ„๊น…์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ž…๋ ฅ ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ์ž…๋ ฅ ํŒŒ์ดํ”„๋ผ์ธ์— ์†Œ์š”๋œ ์‹œ๊ฐ„์— ๋Œ€ํ•œ ๊ฐœ์š”๋ฅผ ์ œ๊ณตํ•˜๋Š” TensorBoard ์—์„œ Profiler์˜ ์ž…๋ ฅ ํŒŒ์ดํ”„๋ผ์ธ ๋ถ„์„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

image

์ž…๋ ฅ ํŒŒ์ดํ”„๋ผ์ธ์ด ๋‹จ๊ณ„ ์‹œ๊ฐ„์— ํฌ๊ฒŒ ๊ธฐ์—ฌํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž ์žฌ์  ์กฐ์น˜๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • tf.data ๊ด€๋ จ ๊ฐ€์ด๋“œ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋””๋ฒ„๊ทธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ž…๋ ฅ ํŒŒ์ดํ”„๋ผ์ธ์ด ๋ณ‘๋ชฉ ํ˜„์ƒ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์€ ์‚ฌ์ „ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฌด์ž‘์œ„๋กœ ์ƒ์„ฑ๋œ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ResNet ๋ชจ๋ธ์— ์ด ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅ ํŒŒ์ดํ”„๋ผ์ธ์ด ์ตœ์ ์ธ ๊ฒฝ์šฐ ์‹ค์ œ ๋ฐ์ดํ„ฐ์™€ ์ƒ์„ฑ๋œ ์ž„์˜/ํ•ฉ์„ฑ ๋ฐ์ดํ„ฐ์—์„œ ์œ ์‚ฌํ•œ ์„ฑ๋Šฅ์„ ๊ฒฝํ—˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ฉ์„ฑ ๋ฐ์ดํ„ฐ ๊ฒฝ์šฐ์˜ ์œ ์ผํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ๋‹ค์‹œ ํ”„๋ฆฌํŽ˜์น˜ ๋ฐ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ๋กœ ์ธํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

2. ํ•˜๋‚˜์˜ GPU ์„ฑ๋Šฅ ๋””๋ฒ„๊ทธ

GPU ์‚ฌ์šฉ๋ฅ ์„ ๋‚ฎ์ถ”๋Š” ๋ฐ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์š”์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ถ”์  ๋ทฐ์–ด ๋ฐ ์ž ์žฌ์  ์†”๋ฃจ์…˜์„ ๋ณผ ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ด€์ฐฐ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์‹œ๋‚˜๋ฆฌ์˜ค์ž…๋‹ˆ๋‹ค.

1. ๋‹จ๊ณ„ ๊ฐ„ ๊ฒฉ์ฐจ ๋ถ„์„

ํ”„๋กœ๊ทธ๋žจ์ด ์ตœ์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์„ ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ด€์ฐฐ๋˜๋Š” ๊ฒƒ์€ ํ›ˆ๋ จ ๋‹จ๊ณ„ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ํŠธ๋ ˆ์ด์Šค ๋ณด๊ธฐ ์ด๋ฏธ์ง€์—์„œ 8๋‹จ๊ณ„์™€ 9๋‹จ๊ณ„ ์‚ฌ์ด์— ํฐ ๊ฐ„๊ฒฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ•ด๋‹น ์‹œ๊ฐ„ ๋™์•ˆ GPU๊ฐ€ ์œ ํœด ์ƒํƒœ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

image

์ถ”์  ๋ทฐ์–ด์—์„œ ๋‹จ๊ณ„ ์‚ฌ์ด์— ํฐ ๊ฐ„๊ฒฉ์ด ํ‘œ์‹œ๋˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ž…๋ ฅ ๋ฐ”์ธ๋”ฉ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์•„์ง ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ž…๋ ฅ ํŒŒ์ดํ”„๋ผ์ธ ๋””๋ฒ„๊น…์— ๋Œ€ํ•œ ์ด์ „ ์„น์…˜์„ ์ฐธ์กฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ตœ์ ํ™”๋œ ์ž…๋ ฅ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ CPU ์Šค๋ ˆ๋“œ ๊ฒฝํ•ฉ์œผ๋กœ ์ธํ•ด ํ•œ ๋‹จ๊ณ„์˜ ๋๊ณผ ๋‹ค๋ฅธ ๋‹จ๊ณ„์˜ ์‹œ์ž‘ ์‚ฌ์ด์— ์—ฌ์ „ํžˆ ๊ฐ„๊ฒฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. tf.data ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ ์ฒ˜๋ฆฌ๋ฅผ ๋ณ‘๋ ฌํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์Šค๋ ˆ๋“œ๋Š” ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ ๋˜๋Š” GPU ์ž‘์—… ์˜ˆ์•ฝ๊ณผ ๊ฐ™์ด ๊ฐ ๋‹จ๊ณ„ ์‹œ์ž‘ ์‹œ ๋ฐœ์ƒํ•˜๋Š” GPU ํ˜ธ์ŠคํŠธ ์ธก ํ™œ๋™์„ ๋ฐฉํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GPU์—์„œ ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์˜ˆ์•ฝํ•˜๋Š” ํ˜ธ์ŠคํŠธ ์ธก์—์„œ ํฐ ๊ฐ„๊ฒฉ์„ ๋ฐœ๊ฒฌํ•˜๋ฉด ํ™˜๊ฒฝ ๋ณ€์ˆ˜ TF_GPU_THREAD_MODE=gpu_private ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด GPU ์ปค๋„์ด ์ž์ฒด ์ „์šฉ ์Šค๋ ˆ๋“œ์—์„œ ์‹œ์ž‘๋˜๊ณ  tf.data ์ž‘์—… ๋’ค์— ๋Œ€๊ธฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹จ๊ณ„ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์€ ๋ฉ”ํŠธ๋ฆญ ๊ณ„์‚ฐ, Keras ์ฝœ๋ฐฑ ๋˜๋Š” ํ˜ธ์ŠคํŠธ์—์„œ ์‹คํ–‰๋˜๋Š” tf.function ์ด๋Ÿฌํ•œ ์ž‘์—…์€ TensorFlow ๊ทธ๋ž˜ํ”„ ๋‚ด๋ถ€์˜ ์ž‘์—…๋งŒํผ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋Ÿฌํ•œ ์ž‘์—… ์ค‘ ์ผ๋ถ€๋Š” CPU์—์„œ ์‹คํ–‰๋˜๊ณ  GPU์—์„œ ์•ž๋’ค๋กœ ํ…์„œ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ž…๋ ฅ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ตœ์ ํ™”ํ•œ ์ดํ›„์—๋„ ์ถ”์  ๋ทฐ์–ด์—์„œ ๋‹จ๊ณ„ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์ด ๊ณ„์† ๋ณด์ด๋ฉด ๋‹จ๊ณ„ ์‚ฌ์ด์˜ ๋ชจ๋ธ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์ฝœ๋ฐฑ/๋ฉ”ํŠธ๋ฆญ์„ ๋น„ํ™œ์„ฑํ™”ํ•  ๊ฒฝ์šฐ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์˜ ์ผ๋ถ€ ์„ธ๋ถ€ ์ •๋ณด๋Š” ์ถ”์  ๋ทฐ์–ด(์žฅ์น˜ ๋ฐ ํ˜ธ์ŠคํŠธ ์ธก ๋ชจ๋‘)์—๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ๋ชจ๋“  ๋‹จ๊ณ„๋งˆ๋‹ค ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ๊ณ ์ •๋œ ์ˆ˜์˜ ๋‹จ๊ณ„ ์ดํ›„์— ์‹คํ–‰ํ•˜๋ฉฐ ์—ฐ์‚ฐ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. tf.keras API์—์„œ Model.compile ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ steps_per_execution ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜๋ฉด ์ด ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ํ›ˆ๋ จ ๋ฃจํ”„์—๋Š” tf.while_loop๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

2. ๋” ๋†’์€ ์žฅ์น˜ ํ™œ์šฉ๋„ ๋‹ฌ์„ฑ

1. ์ž‘์€ GPU ์ปค๋„ ๋ฐ ํ˜ธ์ŠคํŠธ ์ปค๋„ ์‹คํ–‰ ์ง€์—ฐ

ํ˜ธ์ŠคํŠธ๋Š” GPU์—์„œ ์‹คํ–‰ํ•  ์ปค๋„์„ ๋Œ€๊ธฐ์—ด์— ๋„ฃ์ง€๋งŒ ์ปค๋„์ด ์‹ค์ œ๋กœ GPU์—์„œ ์‹คํ–‰๋˜๊ธฐ ์ „์— ๊ด€๋ จ๋œ ์ง€์—ฐ ์‹œ๊ฐ„(์•ฝ 20-40ฮผs)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ƒ์ ์ธ ๊ฒฝ์šฐ ํ˜ธ์ŠคํŠธ๋Š” ํ˜ธ์ŠคํŠธ๊ฐ€ ๋” ๋งŽ์€ ์ปค๋„์„ ๋Œ€๊ธฐ์—ด์— ๋„ฃ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  GPU๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜๋„๋ก ์ถฉ๋ถ„ํ•œ ์ปค๋„์„ GPU์— ๋Œ€๊ธฐ์—ด์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

TensorBoard์˜ Profiler ๊ฐœ์š” ํŽ˜์ด์ง€ ๋Š” ํ˜ธ์ŠคํŠธ๊ฐ€ ์ปค๋„์„ ์‹œ์ž‘ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ GPU๊ฐ€ ์œ ํœด ์ƒํƒœ์˜€๋˜ ์‹œ๊ฐ„์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์•„๋ž˜ ์ด๋ฏธ์ง€์—์„œ GPU๋Š” ์ปค๋„ ์‹คํ–‰์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‹จ๊ณ„ ์‹œ๊ฐ„์˜ ์•ฝ 10% ๋™์•ˆ ์œ ํœด ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

image

์ด ๋™์ผํ•œ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์ถ”์  ๋ทฐ์–ด ๋Š” ํ˜ธ์ŠคํŠธ๊ฐ€ GPU์—์„œ ์ปค๋„์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ๋ฐ”์œ ์ปค๋„ ์‚ฌ์ด์˜ ์ž‘์€ ๊ฐ„๊ฒฉ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

image

GPU์—์„œ ๋งŽ์€ ์ž‘์€ ์ž‘์—…(์˜ˆ: ์Šค์นผ๋ผ ์ถ”๊ฐ€)์„ ์‹œ์ž‘ํ•˜๋ฉด ํ˜ธ์ŠคํŠธ๊ฐ€ GPU๋ฅผ ๋”ฐ๋ผ๊ฐ€์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ํ”„๋กœํ•„์— ๋Œ€ํ•œ TensorBoard์˜ TensorFlow Stats ๋„๊ตฌ๋Š” 2.77์ดˆ๊ฐ€ ์†Œ์š”๋˜๋Š” 126,224 Mul ์ž‘์—…์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ ์ปค๋„์€ ์•ฝ 21.9ฮผs๋กœ ๋งค์šฐ ์ž‘๊ณ (์‹œ์ž‘ ๋Œ€๊ธฐ ์‹œ๊ฐ„๊ณผ ๊ฑฐ์˜ ๊ฐ™์€ ์‹œ๊ฐ„) ์ž ์žฌ์ ์œผ๋กœ ํ˜ธ์ŠคํŠธ ์ปค๋„ ์‹œ์ž‘ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image

์ถ”์  ๋ทฐ์–ด์— ์œ„์˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด GPU์˜ ์ž‘์—… ๊ฐ„์— ๋งŽ์€ ์ž‘์€ ๊ฐ„๊ฒฉ์ด ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ž‘์€ ํ…์„œ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ๋ฒกํ„ฐํ™”๋œ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋” ํฐ ๋ฐฐ์น˜ ํฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰๋œ ๊ฐ ์ปค๋„์ด ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋ฉด GPU๊ฐ€ ๋” ์˜ค๋ž˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ์ˆœ์ˆ˜ ์—ด๋ง ๋ชจ๋“œ์—์„œ ์ž‘์—…์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๋„๋ก tf.function ์„ ์‚ฌ์šฉํ•˜์—ฌ TensorFlow ๊ทธ๋ž˜ํ”„๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. Model.fit ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ( tf.GradientTape ๊ฐ€ ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ๊ต์œก ๋ฃจํ”„์™€ tf.GradientTape ), tf.keras.Model.compile ์ด ์ž๋™์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • tf.function(jit_compile=True) ๋˜๋Š” ์ž๋™ ํด๋Ÿฌ์Šคํ„ฐ๋ง๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋„์„ ์œตํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜์˜ ํ˜ผํ•ฉ ์ •๋ฐ€๋„ ๋ฐ XLA ํ™œ์„ฑํ™” ์„น์…˜์œผ๋กœ ์ด๋™ํ•˜์—ฌ XLA๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ๋” ๋†’์€ ์„ฑ๋Šฅ์„ ์–ป๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”. ์ด ๊ธฐ๋Šฅ์€ ๋†’์€ ์žฅ์น˜ ํ™œ์šฉ๋„๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. TensorFlow ์—ฐ์‚ฐ ๋ฐฐ์น˜

ํ”„๋กœํŒŒ์ผ๋Ÿฌ ๊ฐœ์š” ํŽ˜์ด์ง€ ๋Š” ํ˜ธ์ŠคํŠธ์— ๋ฐฐ์น˜๋œ ์ž‘์—… ๋Œ€ ์žฅ์น˜์˜ ๋ฐฑ๋ถ„์œจ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค( ์ถ”์  ๋ทฐ์–ด ๋ฅผ ๋ณด๊ณ  ํŠน์ • ์ž‘์—…์˜ ๋ฐฐ์น˜๋ฅผ ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ํ˜ธ์ŠคํŠธ์— ์žˆ๋Š” ์ž‘์—…์˜ ๋ฐฑ๋ถ„์œจ์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ์žฅ์น˜์— ๋น„ํ•ด ๋งค์šฐ ์ž‘์Šต๋‹ˆ๋‹ค.

image

์ด์ƒ์ ์œผ๋กœ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ปดํ“จํŒ… ์ง‘์•ฝ์  ์ž‘์—…์„ GPU์— ๋ฐฐ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ธ์˜ ์ž‘์—…๊ณผ ํ…์„œ๊ฐ€ ํ• ๋‹น๋œ ์žฅ์น˜๋ฅผ ์ฐพ์œผ๋ ค๋ฉด tf.debugging.set_log_device_placement(True) ๋ฅผ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฒซ ๋ฒˆ์งธ ๋ช…๋ น๋ฌธ์œผ๋กœ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค.

๊ฒฝ์šฐ์— ๋”ฐ๋ผ ํŠน์ • ์žฅ์น˜์— ๋ฐฐ์น˜ํ•  ์ž‘์—…์„ ์ง€์ •ํ•˜๋”๋ผ๋„ ํ•ด๋‹น ๊ตฌํ˜„์ด ์ด ์กฐ๊ฑด์„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: tf.unique ). tf.distribute.OneDeviceStrategy ์™€ ๊ฐ™์€ ๋ฐฐํฌ ์ „๋žต์„ ์ง€์ •ํ•˜๋ฉด ์žฅ์น˜์— ์ž‘์—…์„ ๋” ๊ฒฐ์ •์ ์œผ๋กœ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์—ฐ์‚ฐ์„ GPU์— ๋ฐฐ์น˜ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ์ด์œ ๋Š” ํ˜ธ์ŠคํŠธ์™€ ์žฅ์น˜ ๊ฐ„์˜ ๊ณผ๋„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค(ํ˜ธ์ŠคํŠธ์™€ ์žฅ์น˜ ๊ฐ„์˜ ๋ชจ๋ธ ์ž…๋ ฅ/์ถœ๋ ฅ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ๊ฐ€ ์˜ˆ์ƒ๋จ). ๊ณผ๋„ํ•œ ๋ณต์‚ฌ์˜ ์˜ˆ๋Š” GPU ์ŠคํŠธ๋ฆผ #167 , #168 ๋ฐ #169 ์— ๋Œ€ํ•œ ์•„๋ž˜์˜ ์ถ”์  ๋ณด๊ธฐ์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

image

์ด๋Ÿฌํ•œ ๋ณต์‚ฌ๋ณธ์€ GPU ์ปค๋„์˜ ์‹คํ–‰์„ ์ฐจ๋‹จํ•˜๋Š” ๊ฒฝ์šฐ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”์  ๋ทฐ์–ด ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ ์ž‘์—…์—๋Š” ์ด๋Ÿฌํ•œ ๋ณต์‚ฌ๋œ ํ…์„œ์˜ ์†Œ์Šค์ธ ์ž‘์—…์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ์žˆ์ง€๋งŒ memCopy๋ฅผ ์ž‘์—…๊ณผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ์‰ฌ์šด ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ๋ชจ๋“  ๋‹จ๊ณ„์—์„œ ๋™์ผํ•œ ์œ„์น˜์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ๋ณ€์˜ ์ž‘์—…์„ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

3. GPU์—์„œ ๋ณด๋‹ค ํšจ์œจ์ ์ธ ์ปค๋„

ํ”„๋กœ๊ทธ๋žจ์˜ GPU ์‚ฌ์šฉ๋ฅ ์ด ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ์ˆ˜์ค€์ด๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋Š” Tensor Core ๋˜๋Š” ์œตํ•ฉ ์ž‘์—…์„ ํ™œ์šฉํ•˜์—ฌ GPU ์ปค๋„์˜ ํšจ์œจ์„ฑ์„ ๋†’์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

1. ํ…์„œ ์ฝ”์–ด ํ™œ์šฉ

์ตœ์‹  NVIDIAยฎ GPU์—๋Š” ์ ๊ฒฉ ์ปค๋„์˜ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ํŠน์ˆ˜ Tensor ์ฝ”์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

TensorBoard์˜ GPU ์ปค๋„ ํ†ต๊ณ„ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค GPU ์ปค๋„์ด Tensor Core์— ์ ํ•ฉํ•˜๊ณ  ์–ด๋–ค ์ปค๋„์ด Tensor Core๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. fp16 ํ™œ์„ฑํ™”(์•„๋ž˜์˜ ํ˜ผํ•ฉ ์ •๋ฐ€๋„ ํ™œ์„ฑํ™” ์„น์…˜ ์ฐธ์กฐ)๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ GEMM(General Matrix Multiply) ์ปค๋„(matmul ops)์ด ํ…์„œ ์ฝ”์–ด๋ฅผ ํ™œ์šฉํ•˜๋„๋ก ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. GPU ์ปค๋„์€ ์ •๋ฐ€๋„๊ฐ€ fp16์ด๊ณ  ์ž…๋ ฅ/์ถœ๋ ฅ ํ…์„œ ์ฐจ์›์ด 8 ๋˜๋Š” 16( int8 )์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ Tensor Core๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : cuDNN v7.6.3 ์ด์ƒ์—์„œ๋Š” Tensor Core๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ปจ๋ณผ๋ฃจ์…˜ ์ฐจ์›์ด ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค.

GPU์—์„œ ์ปค๋„์„ ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ธฐํƒ€ ์ž์„ธํ•œ ๊ถŒ์žฅ ์‚ฌํ•ญ์€ NVIDIAยฎ ๋”ฅ ๋Ÿฌ๋‹ ์„ฑ๋Šฅ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

2. ํ“จ์ฆˆ ์ž‘์—…

tf.function(jit_compile=True) ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋” ์ž‘์€ ์—ฐ์‚ฐ์„ ์œตํ•ฉํ•˜์—ฌ ๋” ํฐ ์ปค๋„์„ ํ˜•์„ฑํ•˜์—ฌ ์ƒ๋‹นํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ XLA ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

3. ํ˜ผํ•ฉ ์ •๋ฐ€๋„ ๋ฐ XLA ์‚ฌ์šฉ

์œ„์˜ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„ ํ˜ผํ•ฉ ์ •๋ฐ€๋„์™€ XLA๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์„ฑ๋Šฅ์„ ๋”์šฑ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์„ ํƒ์  ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ์ œ์•ˆ๋œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ด๋ฅผ ํ•˜๋‚˜์”ฉ ํ™œ์„ฑํ™”ํ•˜๊ณ  ์„ฑ๋Šฅ ์ด์ ์ด ์˜ˆ์ƒ๋Œ€๋กœ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

1. ํ˜ผํ•ฉ ์ •๋ฐ€๋„ ์‚ฌ์šฉ

TensorFlow ํ˜ผํ•ฉ ์ •๋ฐ€๋„ ๊ฐ€์ด๋“œ๋Š” GPU์—์„œ fp16 ์ •๋ฐ€๋„๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. NVIDIAยฎ GPU์—์„œ AMP ๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ Tensor ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  Volta ๋ฐ ์ตœ์‹  GPU ์•„ํ‚คํ…์ฒ˜์—์„œ fp32 (float32) ์ •๋ฐ€๋„๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•  ๋•Œ ์ „์ฒด ์†๋„๊ฐ€ ์ตœ๋Œ€ 3๋ฐฐ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

ํ–‰๋ ฌ/ํ…์„œ ์ฐจ์›์ด ํ…์„œ ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปค๋„ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. GPU ์ปค๋„์€ ์ •๋ฐ€๋„๊ฐ€ fp16์ด๊ณ  ์ž…๋ ฅ/์ถœ๋ ฅ ์ฐจ์›์ด 8 ๋˜๋Š” 16(int8์˜ ๊ฒฝ์šฐ)์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ Tensor Core๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

cuDNN v7.6.3 ์ด์ƒ์—์„œ๋Š” Tensor Core๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ปจ๋ณผ๋ฃจ์…˜ ์ฐจ์›์ด ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค.

fp16 ์ •๋ฐ€๋„์˜ ์„ฑ๋Šฅ ์ด์ ์„ ์ตœ๋Œ€ํ™”ํ•˜๋ ค๋ฉด ์•„๋ž˜ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค.

1. ์ตœ์ ์˜ fp16 ์ปค๋„ ์‚ฌ์šฉ

fp16 ํ™œ์„ฑํ™”๋˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ GEMM(ํ–‰๋ ฌ ๊ณฑ์…ˆ) ์ปค๋„์€ Tensor Core๋ฅผ ํ™œ์šฉ fp16 ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์ด๋Ÿฌํ•œ ์ผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ํ”„๋กœ๊ทธ๋žจ์ด ๋Œ€์‹  ๋น„ํšจ์œจ์ ์ธ ๊ตฌํ˜„์œผ๋กœ ๋Œ€์ฒด๋˜๊ธฐ ๋•Œ๋ฌธ์— fp16 ์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์˜ˆ์ƒ๋˜๋Š” ์†๋„ ํ–ฅ์ƒ์„ ๊ฒฝํ—˜ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

image

GPU ์ปค๋„ ํ†ต๊ณ„ ํŽ˜์ด์ง€๋Š” ์–ด๋–ค ์ž‘์—…์ด Tensor Core์— ์ ํ•ฉํ•˜๊ณ  ์–ด๋–ค ์ปค๋„์ด ์‹ค์ œ๋กœ ํšจ์œจ์ ์ธ Tensor Core๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋”ฅ ๋Ÿฌ๋‹ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ NVIDIAยฎ ๊ฐ€์ด๋“œ์—๋Š” Tensor Core๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ œ์•ˆ ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. fp16 ์‚ฌ์šฉ์˜ ์ด์ ์€ ์ด์ „์— ๋ฉ”๋ชจ๋ฆฌ ๋ฐ”์ธ๋”ฉ๋œ ์ปค๋„์—์„œ๋„ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ž‘์—…์— ์ ˆ๋ฐ˜์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

2. ๋™์  ๋Œ€ ์ •์  ์†์‹ค ์Šค์ผ€์ผ๋ง

fp16 ์„ ์‚ฌ์šฉํ•  ๋•Œ ๋‚ฎ์€ ์ •๋ฐ€๋„๋กœ ์ธํ•œ ์–ธ๋”ํ”Œ๋กœ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Loss scaling์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์†์‹ค ์Šค์ผ€์ผ๋ง์—๋Š” ๋™์  ๋ฐ ์ •์ ์˜ ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์ด ์žˆ์œผ๋ฉฐ, ๋‘˜ ๋‹ค ํ˜ผํ•ฉ ์ •๋ฐ€๋„ ๊ฐ€์ด๋“œ ์— ์ž์„ธํžˆ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. mixed_float16 ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜์—ฌ Keras ์˜ตํ‹ฐ๋งˆ์ด์ € ๋‚ด์—์„œ ์†์‹ค ์กฐ์ •์„ ์ž๋™์œผ๋กœ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : Keras ํ˜ผํ•ฉ ์ •๋ฐ€๋„ API๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋…๋ฆฝํ˜• softmax ์—ฐ์‚ฐ(Keras ์†์‹ค ํ•จ์ˆ˜์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ์—ฐ์‚ฐ)์„ fp16์œผ๋กœ ํ‰๊ฐ€ํ•˜์—ฌ ์ˆ˜์น˜ ๋ฌธ์ œ์™€ ์ˆ˜๋ ด ๋ถˆ๋Ÿ‰์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ์ž‘์—…์„ fp32๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋™์  ์†์‹ค ํฌ๊ธฐ ์กฐ์ •์€ ํ˜ธ์ŠคํŠธ์—์„œ ์‹คํ–‰๋˜๋Š” ์ถ”๊ฐ€ ์กฐ๊ฑด๋ถ€ ์ž‘์—…์„ ๋„์ž…ํ•  ์ˆ˜ ์žˆ๊ณ  ์ถ”์  ๋ทฐ์–ด์˜ ๋‹จ๊ณ„ ๊ฐ„์— ํ‘œ์‹œ๋  ๊ฐ„๊ฒฉ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Œ์„ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ์ •์  ์†์‹ค ์Šค์ผ€์ผ๋ง์€ ์ด๋Ÿฌํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†์œผ๋ฉฐ ์˜ฌ๋ฐ”๋ฅธ ์ •์  ์†์‹ค ์Šค์ผ€์ผ ๊ฐ’์„ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š” ์บ์น˜๋กœ ์„ฑ๋Šฅ ๋ฉด์—์„œ ๋” ๋‚˜์€ ์˜ต์…˜์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. tf.function(jit_compile=True) ๋˜๋Š” ์ž๋™ ํด๋Ÿฌ์Šคํ„ฐ๋ง์œผ๋กœ XLA ํ™œ์„ฑํ™”

๋‹จ์ผ GPU๋กœ ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์„ ์–ป๊ธฐ ์œ„ํ•œ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋กœ XLA๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์ž‘์—…์„ ํ†ตํ•ฉํ•˜๊ณ  ์žฅ์น˜ ํ™œ์šฉ๋„๋ฅผ ๋†’์ด๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๊ณต๊ฐ„์„ ๋‚ฎ์ถ”๋Š” ์‹คํ—˜์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. tf.function(jit_compile=True) ๋˜๋Š” ์ž๋™ ํด๋Ÿฌ์Šคํ„ฐ๋ง์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์—์„œ XLA๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ ์€ XLA ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ „์—ญ JIT ์ˆ˜์ค€์„ -1 (ํ•ด์ œ), 1 ๋˜๋Š” 2 ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋†’์€ ์ˆ˜์ค€์€ ๋” ๊ณต๊ฒฉ์ ์ด๋ฉฐ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์ค„์ด๊ณ  ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฐ’์„ 1 XLA ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ƒˆ๋กœ์šด ๋ชจ์–‘์„ ๋งŒ๋‚  ๋•Œ๋งˆ๋‹ค ์ปค๋„์„ ๊ณ„์† ์ปดํŒŒ์ผํ•ด์•ผ ํ•˜๋ฏ€๋กœ XLA๋Š” ๊ฐ€๋ณ€ ์ž…๋ ฅ ํ…์„œ ๋ชจ์–‘์ด ์žˆ๋Š” ๋ชจ๋ธ์— ๋Œ€ํ•ด ์ž˜ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2. ๋‹ค์ค‘ GPU ๋‹จ์ผ ํ˜ธ์ŠคํŠธ์—์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™”

tf.distribute.MirroredStrategy API๋Š” ๋‹จ์ผ ํ˜ธ์ŠคํŠธ์—์„œ ํ•˜๋‚˜์˜ GPU์—์„œ ์—ฌ๋Ÿฌ GPU๋กœ ๋ชจ๋ธ ํ›ˆ๋ จ์„ ํ™•์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (TensorFlow๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„์‚ฐ ๊ต์œก์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด TensorFlow๋ฅผ ์‚ฌ์šฉํ•œ ๋ถ„์‚ฐ ๊ต์œก , GPU ์‚ฌ์šฉ, TPU ์‚ฌ์šฉ ๊ฐ€์ด๋“œ ๋ฐ Keras๋ฅผ ์‚ฌ์šฉํ•œ ๋ถ„์‚ฐ ๊ต์œก ์ž์Šต์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.)

ํ•˜๋‚˜์˜ GPU์—์„œ ์—ฌ๋Ÿฌ GPU๋กœ์˜ ์ „ํ™˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด์ƒ์ ์œผ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜์ง€๋งŒ ๋•Œ๋•Œ๋กœ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ผ GPU๋ฅผ ์‚ฌ์šฉํ•œ ํ›ˆ๋ จ์—์„œ ๋™์ผํ•œ ํ˜ธ์ŠคํŠธ์˜ ์—ฌ๋Ÿฌ GPU๋กœ ์ด๋™ํ•  ๋•Œ ์ด์ƒ์ ์œผ๋กœ๋Š” ๊ทธ๋ž˜๋””์–ธํŠธ ํ†ต์‹ ์˜ ์ถ”๊ฐ€ ์˜ค๋ฒ„ํ—ค๋“œ์™€ ํ˜ธ์ŠคํŠธ ์Šค๋ ˆ๋“œ ํ™œ์šฉ๋„ ์ฆ๊ฐ€๋งŒ์œผ๋กœ ์„ฑ๋Šฅ ํ™•์žฅ์„ ๊ฒฝํ—˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์ธํ•ด ์˜ˆ๋ฅผ ๋“ค์–ด 1๊ฐœ์—์„œ 2๊ฐœ์˜ GPU๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ ์ •ํ™•ํ•œ 2๋ฐฐ ์†๋„ ํ–ฅ์ƒ์„ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์˜ ์ถ”์  ๋ณด๊ธฐ๋Š” ์—ฌ๋Ÿฌ GPU์—์„œ ํ›ˆ๋ จํ•  ๋•Œ ์ถ”๊ฐ€ ํ†ต์‹  ์˜ค๋ฒ„ํ—ค๋“œ์˜ ์˜ˆ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ทธ๋ผ๋””์–ธํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ , ๋ณต์ œ๋ณธ ๊ฐ„์— ํ†ต์‹ ํ•˜๊ณ , ๊ฐ€์ค‘์น˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ๋ถ„ํ• ํ•˜๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

image

๋‹ค์Œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋Š” ๋‹ค์ค‘ GPU ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ๋•Œ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

  1. ๋ฐฐ์น˜ ํฌ๊ธฐ๋ฅผ ์ตœ๋Œ€ํ™”ํ•˜์—ฌ ์žฅ์น˜ ํ™œ์šฉ๋„๋ฅผ ๋†’์ด๊ณ  ์—ฌ๋Ÿฌ GPU์—์„œ ํ†ต์‹  ๋น„์šฉ์„ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์— ์–ผ๋งˆ๋‚˜ ๊ทผ์ ‘ํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐ์น˜ ํฌ๊ธฐ๊ฐ€ ํด์ˆ˜๋ก ์ˆ˜๋ ด์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์„ฑ๋Šฅ ์ด์ ์ด ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

  2. ๋‹จ์ผ GPU์—์„œ ์—ฌ๋Ÿฌ GPU๋กœ ์ด๋™ํ•  ๋•Œ ์ด์ œ ๋™์ผํ•œ ํ˜ธ์ŠคํŠธ์—์„œ ํ›จ์”ฌ ๋” ๋งŽ์€ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ (1) ์ดํ›„์—๋Š” ์ž…๋ ฅ ํŒŒ์ดํ”„๋ผ์ธ ์„ฑ๋Šฅ์„ ๋‹ค์‹œ ํ™•์ธํ•˜์—ฌ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ์—†๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  3. ๋ถˆํ•„์š”ํ•œ AllReduce ํ˜ธ์ถœ์ด ์žˆ๋Š”์ง€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ถ”์  ๋ณด๊ธฐ์—์„œ GPU ํƒ€์ž„๋ผ์ธ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ์žฅ์น˜์—์„œ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ์œ„์— ํ‘œ์‹œ๋œ ์ถ”์  ๋ณด๊ธฐ์—์„œ AllReduce๋Š” NCCL ์ปค๋„์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋˜๋ฉฐ ๊ฐ ๋‹จ๊ณ„์˜ ๊ทธ๋ผ๋””์–ธํŠธ์— ๋Œ€ํ•ด ๊ฐ GPU์—์„œ ํ•˜๋‚˜์˜ NCCL ํ˜ธ์ถœ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถˆํ•„์š”ํ•œ D2H, H2D ๋ฐ D2D ๋ณต์‚ฌ ์ž‘์—…์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  5. ๊ฐ ๋ณต์ œ๋ณธ์ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ๋‹จ๊ณ„ ์‹œ๊ฐ„์„ ํ™•์ธํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด ํ˜ธ์ŠคํŠธ๊ฐ€ ์‹ค์ˆ˜๋กœ ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜์–ด GPU ํ•˜๋‚˜(์ผ๋ฐ˜์ ์œผ๋กœ GPU0)๊ฐ€ ์ดˆ๊ณผ ๊ตฌ๋…๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  6. ๋งˆ์ง€๋ง‰์œผ๋กœ, ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ž‘์—…์— ๋Œ€ํ•œ ์ถ”์  ๋ณด๊ธฐ์˜ ๋ชจ๋“  GPU์— ๋Œ€ํ•œ ๊ต์œก ๋‹จ๊ณ„๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์— ํ•œ GPU์—์„œ ๋‹ค๋ฅธ GPU๋กœ์˜ ์ œ์–ด ์ข…์†์„ฑ์ด ํฌํ•จ๋  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ์„ฑ๋Šฅ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฒƒ์ด ์‚ฌ๋ก€๋ณ„๋กœ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด ๋™์ž‘์„ ๊ด€์ฐฐํ•˜๋ฉด ์ถ”์  ๋ณด๊ธฐ์˜ ์ด๋ฏธ์ง€์™€ ํ•จ๊ป˜ GitHub ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜์‹ญ์‹œ์˜ค.

1. ๊ทธ๋ผ๋””์–ธํŠธ AllReduce ์ตœ์ ํ™”

๋™๊ธฐ์‹ ์ „๋žต์œผ๋กœ ํ›ˆ๋ จํ•  ๋•Œ ๊ฐ ์žฅ์น˜๋Š” ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

๋ชจ๋ธ์„ ํ†ตํ•ด ์ •๋ฐฉํ–ฅ ๋ฐ ์—ญ๋ฐฉํ–ฅ ํ†ต๊ณผ๋ฅผ ๊ณ„์‚ฐํ•œ ํ›„ ๊ฐ ์žฅ์น˜์—์„œ ๊ณ„์‚ฐ๋œ ๊ธฐ์šธ๊ธฐ๋ฅผ ์ง‘๊ณ„ํ•˜๊ณ  ์ค„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ทธ๋ž˜๋””์–ธํŠธ AllReduce ๋Š” ๊ฐ ์žฅ์น˜์—์„œ ๊ทธ๋ž˜๋””์–ธํŠธ ๊ณ„์‚ฐ ํ›„, ๊ทธ๋ฆฌ๊ณ  ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ์ด ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์ „์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ฐ GPU๋Š” ๋จผ์ € ๋ชจ๋ธ ๋ ˆ์ด์–ด์˜ ๊ทธ๋ผ๋””์–ธํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  tf.distribute.CrossDeviceOps ( tf.distribute.NcclAllReduce ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ž„)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GPU ๊ฐ„์— ์ „๋‹ฌํ•œ ๋‹ค์Œ ๋ ˆ์ด์–ด๋ณ„๋กœ ์ถ•์†Œํ•œ ํ›„ ๊ทธ๋ผ๋””์–ธํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์ด๋Ÿฌํ•œ ๊ฐ์†Œ๋œ ๊ทธ๋ผ๋””์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ชจ๋“  GPU์—์„œ ๋™์‹œ์— ๋ฐœ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

AllReduce์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

(number of parameters * 4bytes)/ (communication bandwidth)

์ด ๊ณ„์‚ฐ์€ ๋ถ„์‚ฐ ๊ต์œก ์ž‘์—…์„ ์‹คํ–‰ํ•  ๋•Œ์˜ ์„ฑ๋Šฅ์ด ์˜ˆ์ƒ๋Œ€๋กœ์ธ์ง€ ๋˜๋Š” ์ถ”๊ฐ€ ์„ฑ๋Šฅ ๋””๋ฒ„๊น…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. Model.summary ์—์„œ ๋ชจ๋ธ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TensorFlow๋Š” fp32(float32)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ž˜๋””์–ธํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋ฏ€๋กœ ๊ฐ ๋ชจ๋ธ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํฌ๊ธฐ๋Š” 4๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค. fp16์„ ์‚ฌ์šฉ ์„ค์ •ํ•œ ๊ฒฝ์šฐ์—๋„ NCCL AllReduce๋Š” fp32 ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์Šค์ผ€์ผ๋ง์˜ ์ด์ ์„ ์–ป์œผ๋ ค๋ฉด ์ด๋Ÿฌํ•œ ์˜ค๋ฒ„ํ—ค๋“œ์— ๋น„ํ•ด ๋‹จ๊ณ„ ์‹œ๊ฐ„์ด ํ›จ์”ฌ ๋†’์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๋ฐฐ์น˜ ํฌ๊ธฐ๊ฐ€ ๋‹จ๊ณ„ ์‹œ๊ฐ„์— ์˜ํ–ฅ์„ ์ฃผ์ง€๋งŒ ํ†ต์‹  ์˜ค๋ฒ„ํ—ค๋“œ์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋” ๋†’์€ ๋ฐฐ์น˜ ํฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2. GPU ํ˜ธ์ŠคํŠธ ์Šค๋ ˆ๋“œ ๊ฒฝํ•ฉ

์—ฌ๋Ÿฌ GPU๋ฅผ ์‹คํ–‰ํ•  ๋•Œ CPU์˜ ์—ญํ• ์€ ์žฅ์น˜ ์ „์ฒด์—์„œ GPU ์ปค๋„์„ ํšจ์œจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ ๋ชจ๋“  ์žฅ์น˜๋ฅผ ๋ฐ”์˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ CPU๊ฐ€ ํ•˜๋‚˜์˜ GPU์—์„œ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๋…๋ฆฝ์ ์ธ ์ž‘์—…์ด ์žˆ๋Š” ๊ฒฝ์šฐ CPU๋Š” ๋งŽ์€ ํ˜ธ์ŠคํŠธ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋‚˜์˜ GPU๋ฅผ ์‚ฌ์šฉ ์ค‘์ธ ์ƒํƒœ๋กœ ์œ ์ง€ํ•œ ๋‹ค์Œ ๋น„๊ฒฐ์ •์  ์ˆœ์„œ๋กœ ๋‹ค๋ฅธ GPU์—์„œ ์ปค๋„์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. . ์ด๋กœ ์ธํ•ด ์„ฑ๋Šฅ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์™œ๊ณก ๋˜๋Š” ์Œ์˜ ํฌ๊ธฐ ์กฐ์ •์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์˜ ์ถ”์  ๋ทฐ์–ด GPU1 GPU2 ๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ์ž‘์—… ์‹คํ–‰์„ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— CPU๊ฐ€ GPU ์ปค๋„์„ ๋น„ํšจ์œจ์ ์œผ๋กœ ์‹œ์ž‘ํ•  ๋•Œ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

image

ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•œ ์ถ”์  ๋ณด๊ธฐ๋Š” ํ˜ธ์ŠคํŠธ๊ฐ€ GPU1 ์—์„œ ์ปค๋„์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— GPU2 ์ปค๋„์„ ์‹œ์ž‘ํ•˜๊ณ  ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค(์•„๋ž˜ tf_Compute* ์ž‘์—…์€ CPU ์Šค๋ ˆ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด์ง€ ์•Š์Œ).

image

ํ”„๋กœ๊ทธ๋žจ์˜ ์ถ”์  ๋ณด๊ธฐ์—์„œ GPU ์ปค๋„์˜ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋น„ํ‹€๋ฆผ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ๊ถŒ์žฅ๋˜๋Š” ์กฐ์น˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • TensorFlow ํ™˜๊ฒฝ ๋ณ€์ˆ˜ TF_GPU_THREAD_MODE ๋ฅผ gpu_private ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” GPU์— ๋Œ€ํ•œ ์Šค๋ ˆ๋“œ๋ฅผ ๋น„๊ณต๊ฐœ๋กœ ์œ ์ง€ํ•˜๋„๋ก ํ˜ธ์ŠคํŠธ์— ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ์ ์œผ๋กœ TF_GPU_THREAD_MODE=gpu_private ๋Š” ์Šค๋ ˆ๋“œ ์ˆ˜๋ฅผ 2๋กœ ์„ค์ •ํ•˜๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์ˆซ์ž๋Š” TensorFlow ํ™˜๊ฒฝ ๋ณ€์ˆ˜ TF_GPU_THREAD_COUNT ๋ฅผ ์›ํ•˜๋Š” ์Šค๋ ˆ๋“œ ์ˆ˜๋กœ ์„ค์ •ํ•˜์—ฌ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.