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

TensorBoard Debugger V2๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ TensorFlow ํ”„๋กœ๊ทธ๋žจ์˜ ์ˆ˜์น˜ ๋ฌธ์ œ ๋””๋ฒ„๊น…ํ•˜๊ธฐ

์ฐธ๊ณ : tf.debugging.experimental.enable_dump_debug_info()๋Š” ์‹คํ—˜์šฉ API์ด๋ฉฐ ํ–ฅํ›„ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋•Œ๋•Œ๋กœ TensorFlow ํ”„๋กœ๊ทธ๋žจ ์ค‘์— NaN๊ณผ ๊ด€๋ จ๋œ ์น˜๋ช…์ ์ธ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋ชจ๋ธ ํ›ˆ๋ จ ํ”„๋กœ์„ธ์Šค๋ฅผ ์†์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ์˜ ๊ทผ๋ณธ ์›์ธ์€ ๋น„๊ต์  ํฌ๊ณ  ๋ณต์žกํ•œ ๋ชจ๋ธ์ผ์ˆ˜๋ก ๋ช…๋ฃŒํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ˜•์‹์˜ ๋ชจ๋ธ ๋ฒ„๊ทธ๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ๋””๋ฒ„๊น… ํ•  ์ˆ˜ ์žˆ๋„๋ก TensorBoard 2.3+๋Š” (TensorFlow 2.3+์™€ ํ•จ๊ป˜) Debugger V2๋ผ๋Š” ํŠน์ˆ˜ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” TensorFlow๋กœ ์ž‘์„ฑ๋œ ์‹ ๊ฒฝ๋ง์—์„œ NaN๊ณผ ๊ด€๋ จ๋œ ์‹ค์ œ ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์„ ์žฌํ˜„ํ•˜์—ฌ ์ด ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

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

๋ฒ„๊ทธ ๊ด€์ฐฐํ•˜๊ธฐ

๋””๋ฒ„๊น…ํ•  TF2 ํ”„๋กœ๊ทธ๋žจ์˜ ์†Œ์Šค ์ฝ”๋“œ๋Š” GitHub์—์„œ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์€ ๋˜ํ•œ tensorflow pip ํŒจํ‚ค์ง€(๋ฒ„์ „ 2.3+)๋กœ ํŒจํ‚ค์ง•๋˜๋ฉฐ ๋‹ค์Œ์„ ํ†ตํ•ด ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

python -m tensorflow.python.debug.examples.v2.debug_mnist_v2

์ด TF2 ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์ค‘ ๋ ˆ์ด์–ด ์ธ์‹(MLP)์„ ์ƒ์„ฑํ•˜๊ณ  MNIST ์ด๋ฏธ์ง€๋ฅผ ์ธ์‹ํ•˜๋„๋ก ํ›ˆ๋ จํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ๋Š” ์˜๋„์ ์œผ๋กœ TF2์˜ ์ƒ์œ„ ์ˆ˜์ค€์˜ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ๋ ˆ์ด์–ด ๊ตฌ์กฐ, ์†์‹ค ํ•จ์ˆ˜ ๋ฐ ํ›ˆ๋ จ ๋ฃจํ”„๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋” ์œ ์—ฐํ•˜๊ณ  ์—๋Ÿฌ ๋ฐœ์ƒ์œจ์ด ๋†’์€ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด tf.keras์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ๋Š” ๋” ์‰ฝ์ง€๋งŒ, ์•ฝ๊ฐ„ ๋œ ์œ ์—ฐํ•œ ์ƒ์œ„ ์ˆ˜์ค€์˜ API๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋ณด๋‹ค NaN ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋” ๋†’๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ํ”„๋กœ๊ทธ๋žจ์€ ๊ฐ ํ›ˆ๋ จ ๋‹จ๊ณ„ ํ›„์— ํ…Œ์ŠคํŠธ ์ •ํ™•์„ฑ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ฝ˜์†”์„ ๋ณด๋ฉด ํ…Œ์ŠคํŠธ ์ •ํ™•์„ฑ์ด ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„ ์ดํ›„์— ์šฐ์—ฐ์— ๊ฐ€๊นŒ์šด ์ˆ˜์ค€ (~0.1)์—์„œ ๋ฉˆ์ถ˜ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฒฐ์ฝ” ์˜ˆ์ƒ๋œ ๋ชจ๋ธ ํ›ˆ๋ จ ๋™์ž‘์ด ์•„๋‹ˆ๋ฉฐ, ์˜ˆ์ƒ๋Œ€๋กœ๋ผ๋ฉด ๋‹จ๊ณ„๊ฐ€ ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์ •ํ™•์„ฑ์ด ์ ์ฐจ 1.0(100 %)์— ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Accuracy at step 0: 0.216 Accuracy at step 1: 0.098 Accuracy at step 2: 0.098 Accuracy at step 3: 0.098 ...

์ด ๋ฌธ์ œ๋Š” NaN ๋˜๋Š” ๋ฌดํ•œ๋Œ€์™€ ๊ฐ™์€ ์ˆ˜์น˜์  ๋ถˆ์•ˆ์ •์„ฑ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถ”์ธก๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ์‚ฌ์‹ค์ž„์„ ํ™•์ธํ•˜๊ณ  ์ˆ˜์น˜์  ๋ถˆ์•ˆ์ •์„ฑ์„ ์ƒ์„ฑํ•˜๋Š” TensorFlow ์—ฐ์‚ฐ์„ ์ฐพ๊ธฐ ์œ„ํ•ด Debugger V2๋กœ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๊ณ„์ธกํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Debugger V2๋กœ TensorFlow ์ฝ”๋“œ ๊ณ„์ธกํ•˜๊ธฐ

tf.debugging.experimental.enable_dump_debug_info()๋Š” Debugger V2์˜ API ์ง„์ž…์ ์ž…๋‹ˆ๋‹ค. ํ•œ ์ค„์˜ ์ฝ”๋“œ๋กœ TF2 ํ”„๋กœ๊ทธ๋žจ์„ ๊ณ„์ธกํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ ๋ถ€๋ถ„์— ๋‹ค์Œ ์ค„์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋””๋ฒ„๊ทธ ์ •๋ณด๊ฐ€ /tmp/tfdbg2_logdir์˜ ๋กœ๊ทธ ๋””๋ ‰ํ„ฐ๋ฆฌ(logdir)์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ๋””๋ฒ„๊ทธ ์ •๋ณด๋Š” TensorFlow ๋Ÿฐํƒ€์ž„์˜ ๋‹ค์–‘ํ•œ ์ธก๋ฉด์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. TF2์—๋Š” eager ์‹คํ–‰์˜ ์ „์ฒด ๋‚ด์—ญ, @tf.function์— ์˜ํ•ด ์ˆ˜ํ–‰๋œ ๊ทธ๋ž˜ํ”„ ์ž‘์„ฑ, ๊ทธ๋ž˜ํ”„ ์‹คํ–‰, ์‹คํ–‰ ์ด๋ฒคํŠธ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ํ…์„œ๊ฐ’ ๋ฐ ํ•ด๋‹น ์ด๋ฒคํŠธ์˜ ์ฝ”๋“œ ์œ„์น˜(Python ์Šคํƒ ์ถ”์ )๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ’๋ถ€ํ•œ ๋””๋ฒ„๊ทธ ์ •๋ณด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ๋ชจํ˜ธํ•œ ๋ฒ„๊ทธ์˜ ๋ฒ”์œ„๋ฅผ ์ขํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

tf.debugging.experimental.enable_dump_debug_info( "/tmp/tfdbg2_logdir", tensor_debug_mode="FULL_HEALTH", circular_buffer_size=-1)

tensor_debug_mode ์ธ์ˆ˜๋Š” Debugger V2๊ฐ€ ๊ฐ eager ๋˜๋Š” in-graph ํ…์„œ์—์„œ ์ถ”์ถœํ•˜๋Š” ์ •๋ณด๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. 'FULL_HEALTH'๋Š” ๊ฐ ๋ถ€๋™ ํ˜•์‹ ํ…์„œ์— ๋Œ€ํ•œ ๋‹ค์Œ ์ •๋ณด๋ฅผ ์บก์ฒ˜ํ•˜๋Š” ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค(์˜ˆ: ์ผ๋ฐ˜์ ์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” float32 ๋ฐ ๋œ ์ผ๋ฐ˜์ ์ธ bfloat16 dtype).

  • DType

  • ์ˆœ์œ„(Rank)

  • ์ด ์š”์†Œ ์ˆ˜

  • ๋ถ€๋™ ํ˜•์‹ ์š”์†Œ๋ฅผ ์Œ์˜ ์œ ํ•œ (-), ์˜ (0), ์–‘์˜ ์œ ํ•œ (+), ์Œ์˜ ๋ฌดํ•œ (-โˆž), ์–‘์˜ ๋ฌดํ•œ (+โˆž) ๋ฐ NaN ๋ฒ”์ฃผ๋กœ ๋ถ„๋ฅ˜

'FULL_HEALTH' ๋ชจ๋“œ๋Š” NaN ๋ฐ ๋ฌดํ•œ๋Œ€์™€ ๊ด€๋ จ๋œ ๋ฒ„๊ทธ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” ๋‹ค๋ฅธ tensor_debug_mode์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

circular_buffer_size ์ธ์ˆ˜๋Š” logdir์— ์ €์žฅ๋˜๋Š” ํ…์„œ ์ด๋ฒคํŠธ์˜ ์ˆ˜๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 1000์œผ๋กœ, ๊ณ„์ธก๋œ TF2 ํ”„๋กœ๊ทธ๋žจ์ด ๋๋‚˜๊ธฐ ์ „์— ๋งˆ์ง€๋ง‰ 1000๊ฐœ์˜ ํ…์„œ๋งŒ ๋””์Šคํฌ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋ณธ ๋™์ž‘์€ ๋””๋ฒ„๊ทธ ๋ฐ์ดํ„ฐ์˜ ์™„์ „์„ฑ์„ ํฌ์ƒํ•˜์—ฌ ๋””๋ฒ„๊ฑฐ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ์™„์ „์„ฑ์ด ์„ ํ˜ธ๋˜๋Š” ๊ฒฝ์šฐ, ์ธ์ˆ˜๋ฅผ ์Œ์ˆ˜๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ์ˆœํ™˜ ๋ฒ„ํผ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์—ฌ๊ธฐ์„œ -1).

debug_mnist_v2 ์˜ˆ์ œ๋Š” ๋ช…๋ น์ค„ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ enable_dump_debug_info()๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค. ์ด ๋””๋ฒ„๊น… ๊ณ„์ธก์„ ํ™œ์„ฑํ™”ํ•œ ์ƒํƒœ์—์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” TF2 ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์„ธ์š”.

python -m tensorflow.python.debug.examples.v2.debug_mnist_v2 \ --dump_dir /tmp/tfdbg2_logdir --dump_tensor_debug_mode FULL_HEALTH

TensorBoard์—์„œ Debugger V2 GUI ์‹œ์ž‘ํ•˜๊ธฐ

๋””๋ฒ„๊ฑฐ ๊ณ„์ธก์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด /tmp/tfdbg2_logdir์— logdir์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. TensorBoard๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ logdir์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

tensorboard --logdir /tmp/tfdbg2_logdir

์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ TensorBoard์˜ ํŽ˜์ด์ง€(http://localhost:6006)๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. "Debugger V2" ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์˜ "๋น„ํ™œ์„ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ" ๋ฉ”๋‰ด์—์„œ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชจ์Šต์ด ๋ฉ๋‹ˆ๋‹ค.

Debugger V2 full view screenshot

Debugger V2 GUI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ NaN์˜ ๊ทผ๋ณธ ์›์ธ ์ฐพ๊ธฐ

TensorBoard์˜ Debugger V2 GUI๋Š” 6๊ฐœ ์„น์…˜์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ๊ฒฝ๊ณ : ์ด ์™ผ์ชฝ ์ƒ๋‹จ ์„น์…˜์—๋Š” ๊ณ„์ธก๋œ TensorFlow ํ”„๋กœ๊ทธ๋žจ์˜ ๋””๋ฒ„๊ทธ ๋ฐ์ดํ„ฐ์—์„œ ๋””๋ฒ„๊ฑฐ๊ฐ€ ๊ฐ์ง€ํ•œ '๊ฒฝ๊ณ ' ์ด๋ฒคํŠธ ๋ชฉ๋ก์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ฒฝ๊ณ ๋Š” ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•œ ํŠน์ • ์ด์ƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ, ์ด ์„น์…˜์— ๋ˆˆ์— ๋„๋Š” ์„ ํ™์ƒ‰์œผ๋กœ 499๊ฐœ์˜ NaN/โˆž ์ด๋ฒคํŠธ๊ฐ€ ๊ฐ•์กฐ ํ‘œ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๋ถ€ ํ…์„œ๊ฐ’์— NaN ๋ฐ/๋˜๋Š” ๋ฌดํ•œ๋Œ€๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋ธ์ด ํ•™์Šตํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ์ถ”์ธก์„ ํ™•์ธ์‹œ์ผœ์ฃผ๋Š” ์ฆ๊ฑฐ์ž…๋‹ˆ๋‹ค. ๊ณง ์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • Python ์‹คํ–‰ ํƒ€์ž„๋ผ์ธ: ์ƒ๋‹จ ์ค‘๊ฐ„ ์„น์…˜์˜ ์ƒ๋‹จ ์ ˆ๋ฐ˜์ž…๋‹ˆ๋‹ค. ops ๋ฐ ๊ทธ๋ž˜ํ”„์˜ eager ์‹คํ–‰์— ๋Œ€ํ•œ ์ „์ฒด ๊ธฐ๋ก์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ž„๋ผ์ธ์˜ ๊ฐ ์ƒ์ž๋Š” op ๋˜๋Š” ๊ทธ๋ž˜ํ”„ ์ด๋ฆ„์˜ ์ฒซ ๊ธ€์ž๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค(์˜ˆ: 'TensorSliceDataset' op์˜ ๊ฒฝ์šฐ 'T', '๋ชจ๋ธ' tf.function์˜ ๊ฒฝ์šฐ 'm'). ํƒ€์ž„๋ผ์ธ ์œ„์˜ ํƒ์ƒ‰ ๋ฒ„ํŠผ๊ณผ ์Šคํฌ๋กค๋ฐ”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ„ ํƒ€์ž„๋ผ์ธ์„ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ทธ๋ž˜ํ”„ ์‹คํ–‰: GUI์˜ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์— ์žˆ๋Š” ์ด ์„น์…˜์€ ๋””๋ฒ„๊น… ์ž‘์—…์˜ ์ค‘์‹ฌ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๊ทธ๋ž˜ํ”„ ๋‚ด์—์„œ ๊ณ„์‚ฐ๋œ ๋ชจ๋“  ๋ถ€๋™ dtype ํ…์„œ์˜ ๊ธฐ๋ก์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค(์˜ˆ: @tf-function์— ์˜ํ•ด ์ปดํŒŒ์ผ๋จ).

  • ๊ทธ๋ž˜ํ”„ ๊ตฌ์กฐ(์ค‘๊ฐ„ ์ƒ๋‹จ ์„น์…˜์˜ ํ•˜๋‹จ ์ ˆ๋ฐ˜), ์†Œ์Šค ์ฝ”๋“œ(์™ผ์ชฝ ํ•˜๋‹จ ์„น์…˜) ๋ฐ ์Šคํƒ ์ถ”์ (์˜ค๋ฅธ์ชฝ ํ•˜๋‹จ ์„น์…˜)์€ ์ฒ˜์Œ์— ๋น„์–ด ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ๋‚ด์šฉ์€ GUI์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ๋•Œ ์ฑ„์›Œ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด 3๊ฐœ์˜ ์„น์…˜์€ ๋””๋ฒ„๊น… ์ž‘์—…์—์„œ๋„ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

UI ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์œผ๋‹ˆ, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ NaN์ด ๋‚˜ํƒ€๋‚˜๋Š” ์ด์œ ๋ฅผ ํŒŒ์•…ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ๊ฒฝ๊ณ  ์„น์…˜์—์„œ NaN/โˆž ๊ฒฝ๊ณ ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ทธ๋ž˜ํ”„ ์‹คํ–‰ ์„น์…˜์—์„œ 600๊ฐœ์˜ ๊ทธ๋ž˜ํ”„ ํ…์„œ ๋ชฉ๋ก์ด ์ž๋™์œผ๋กœ ์Šคํฌ๋กค๋˜๊ณ  Log(์ž์—ฐ ๋กœ๊ทธ) op์— ์˜ํ•ด ์ƒ์„ฑ๋œ Log:0์ด๋ผ๋Š” ์ด๋ฆ„์˜ ํ…์„œ์ธ #88์— ์ดˆ์ ์ด ๋งž์ถฐ์ง‘๋‹ˆ๋‹ค. ๋šœ๋ ทํ•œ ์„ ํ™์ƒ‰์œผ๋กœ 2D float32 ํ…์„œ์˜ 1000๊ฐœ ์š”์†Œ ์ค‘ -โˆž ์š”์†Œ๊ฐ€ ๊ฐ•์กฐ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ NaN ๋˜๋Š” ๋ฌดํ•œ๋Œ€๋ฅผ ํฌํ•จํ•˜๋Š” TF2 ํ”„๋กœ๊ทธ๋žจ ๋Ÿฐํƒ€์ž„ ๊ธฐ๋ก์˜ ์ฒซ ๋ฒˆ์งธ ํ…์„œ๋กœ, ์ด ์ „์— ๊ณ„์‚ฐ๋œ ํ…์„œ๋Š” NaN ๋˜๋Š” โˆž๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋‚˜์ค‘์— ๊ณ„์‚ฐ๋œ ๋งŽ์€ (์‚ฌ์‹ค ๋Œ€๋ถ€๋ถ„์˜) ํ…์„œ๋Š” NaN์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„ ์‹คํ–‰ ๋ชฉ๋ก์„ ์œ„์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•˜์—ฌ ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ด€์ฐฐ์€ Log op๊ฐ€ TF2 ํ”„๋กœ๊ทธ๋žจ์˜ ์ˆ˜์น˜์  ๋ถˆ์•ˆ์ •์„ฑ์˜ ์›์ธ์ด๋ผ๋Š” ๊ฐ•๋ ฅํ•œ ํžŒํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋””๋ฒ„๊ฑฐ V2 : Nan / Infinity ๊ฒฝ๊ณ  ๋ฐ ๊ทธ๋ž˜ํ”„ ์‹คํ–‰ ๋ชฉ๋ก

์ด Log op๋Š” ์™œ -โˆž๋ฅผ ๋ฑ‰์–ด๋‚ผ๊นŒ์š”? ์ด ์งˆ๋ฌธ์— ๋‹ตํ•˜๋ ค๋ฉด op์— ๋Œ€ํ•œ ์ž…๋ ฅ์„ ๊ฒ€ํ† ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ…์„œ์˜ ์ด๋ฆ„(Log:0)์„ ํด๋ฆญํ•˜๋ฉด ๊ทธ๋ž˜ํ”„ ๊ตฌ์กฐ ์„น์…˜์˜ TensorFlow ๊ทธ๋ž˜ํ”„์—์„œ Log op์˜ ์ฃผ๋ณ€์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์œ ์ตํ•œ ์‹œ๊ฐํ™” ์ž๋ฃŒ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ •๋ณด๋Š” ์œ„์ชฝ์—์„œ ์•„๋ž˜์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ํ๋ฅด๋„๋ก ๋˜์–ด ์žˆ์œผ๋ฉฐ, op ์ž์ฒด๋Š” ์ค‘๊ฐ„์— ๋ณผ๋“œ์ฒด๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์œ„์— Placeholder op๊ฐ€ Log op์— ๋Œ€ํ•œ ์œ ์ผํ•œ ์ž…๋ ฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„ ์‹คํ–‰ ๋ชฉ๋ก์—์„œ ์ด probs Placeholder์— ์˜ํ•ด ์ƒ์„ฑ๋œ ํ…์„œ๋Š” ์–ด๋””์— ์žˆ์„๊นŒ์š”? ๋…ธ๋ž€์ƒ‰ ๋ฐฐ๊ฒฝ์ƒ‰์„ ์‹œ๊ฐ ์ž๋ฃŒ๋กœ ์‚ฌ์šฉํ•˜๋ฉด probs:0 ํ…์„œ๊ฐ€ Log:0 ํ…์„œ๋ณด๋‹ค ๋‘ ํ–‰ ์œ„, ์ฆ‰ 85ํ–‰์— ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Debugger V2: Graph structure view and tracing to input tensor

85ํ–‰์— ์žˆ๋Š” probs:0 ํ…์„œ์˜ ์ˆ˜์น˜ ๋ถ„์„์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด ์†Œ๋น„์ž Log:0๊ฐ€ -โˆž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. probs:0์˜ 1000๊ฐœ ์š”์†Œ ์ค‘ ๊ฐ’์ด 0์ธ ์š”์†Œ๋Š” ํ•œ ๊ฐœ์ž…๋‹ˆ๋‹ค. -โˆž๋Š” 0์˜ ์ž์—ฐ ๋กœ๊ทธ๋ฅผ ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ์ธ ๊ฒƒ์ด์ฃ ! Log op๊ฐ€ ์–‘์˜ ์ž…๋ ฅ์—๋งŒ ๋…ธ์ถœ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด NaN/โˆž์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Placeholder probs ํ…์„œ์— ํด๋ฆฌํ•‘(์˜ˆ: tf.clip_by_value() ์‚ฌ์šฉ)์„ ์ ์šฉํ•˜์—ฌ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„๊ทธ ํ•ด๊ฒฐ์— ๊ฐ€๊นŒ์›Œ์ง€๊ณ  ์žˆ์ง€๋งŒ ์•„์ง ๋‚จ์€ ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋ ค๋ฉด Python ์†Œ์Šค ์ฝ”๋“œ์—์„œ Log op ๋ฐ ํ•ด๋‹น Placeholder ์ž…๋ ฅ์ด ์‹œ์ž‘๋œ ์œ„์น˜๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. Debugger V2๋Š” ๊ทธ๋ž˜ํ”„ ops ๋ฐ ์‹คํ–‰ ์ด๋ฒคํŠธ์˜ ์†Œ์Šค๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•œ ์ตœ๊ณ  ์ˆ˜์ค€์˜ ์ง€์›์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜ํ”„ ์‹คํ–‰์—์„œ Log:0 ํ…์„œ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ์Šคํƒ ์ถ”์  ์„น์…˜์ด Log op ์ƒ์„ฑ์˜ ์›๋ž˜ ์Šคํƒ ์ถ”์ ์œผ๋กœ ์ฑ„์›Œ์กŒ์Šต๋‹ˆ๋‹ค. ์Šคํƒ ์ถ”์ ์€ TensorFlow ๋‚ด๋ถ€ ์ฝ”๋“œ(์˜ˆ: gen_math_ops.py ๋ฐ dumping_callback.py)์˜ ๋งŽ์€ ํ”„๋ ˆ์ž„์„ ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์†Œ ํฌ๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ๋””๋ฒ„๊น… ์ž‘์—…์—์„œ๋Š” ๋ฌด์‹œํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฃผ๋ชฉํ•  ํ”„๋ ˆ์ž„์€ debug_mnist_v2.py์˜ 216ํ–‰์ž…๋‹ˆ๋‹ค(์ฆ‰, ์‹ค์ œ๋กœ ๋””๋ฒ„๊น…ํ•˜๋ ค๋Š” Python ํŒŒ์ผ). 'Line 204'๋ฅผ ํด๋ฆญํ•˜๋ฉด ์†Œ์Šค ์ฝ”๋“œ ์„น์…˜์— ํ•ด๋‹นํ•˜๋Š” ์ฝ”๋“œ ์ค„์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Debugger V2: Source code and stack trace

๋“œ๋””์–ด probs ์ž…๋ ฅ์—์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” Log op๋ฅผ ์ƒ์„ฑํ•œ ์†Œ์Šค ์ฝ”๋“œ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ @tf.function์œผ๋กœ ๋ฐ์ฝ”๋ ˆ์ดํŒ…๋œ ์‚ฌ์šฉ์ž ์ •์˜ ๋ฒ”์ฃผํ˜• ๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์†์‹ค ํ•จ์ˆ˜์ด๋ฏ€๋กœ, TensorFlow ๊ทธ๋ž˜ํ”„๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. Placeholder op probs๋Š” ์†์‹ค ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ์ž…๋ ฅ ์ธ์ˆ˜์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. Log op๋Š” tf.math.log() API ํ˜ธ์ถœ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ๊ฐ’ ํด๋ฆฌํ•‘ ์ˆ˜์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

diff = -(labels * tf.math.log(tf.clip_by_value(probs), 1e-6, 1.))

์ด TF2 ํ”„๋กœ๊ทธ๋žจ์˜ ์ˆ˜์น˜์  ๋ถˆ์•ˆ์ •์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ณ  MLP๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ํ›ˆ๋ จ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์น˜์  ๋ถˆ์•ˆ์ •์„ฑ์„ ์ˆ˜์ •ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ tf.keras.losses.CategoricalCrossentropy๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์œผ๋กœ TF2 ๋ชจ๋ธ ๋ฒ„๊ทธ ๊ด€์ฐฐ์—์„œ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ฝ”๋“œ ๋ณ€๊ฒฝ์— ์ด๋ฅด๋Š” ์—ฌ์ •์„ ๋งˆ๋ฌด๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ํ…์„œ๊ฐ’์˜ ์ˆ˜์น˜ ์š”์•ฝ ๋ฐ ops, ํ…์„œ, ์›๋ž˜ ์†Œ์Šค ์ฝ”๋“œ ๊ฐ„์˜ ๊ด€๋ จ์„ฑ์„ ํฌํ•จํ•˜์—ฌ ๊ณ„์ธก๋œ TF2 ํ”„๋กœ๊ทธ๋žจ์˜ eager ๋ฐ ๊ทธ๋ž˜ํ”„ ์‹คํ–‰ ๊ธฐ๋ก์— ๋Œ€ํ•œ ์™„์ „ํ•œ ๊ฐ€์‹œ์„ฑ์„ ์ œ๊ณตํ•˜๋Š” Debugger V2 ๋„๊ตฌ์˜ ๋„์›€์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

Debugger V2์˜ ํ•˜๋“œ์›จ์–ด ํ˜ธํ™˜์„ฑ

Debugger V2๋Š” CPU ๋ฐ GPU๋ฅผ ํฌํ•จํ•œ ์ฃผ๋ฅ˜ ํ›ˆ๋ จ ํ•˜๋“œ์›จ์–ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. tf.distributed.MirroredStrategy๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์ค‘ GPU ํ›ˆ๋ จ๋„ ์ง€์›๋ฉ๋‹ˆ๋‹ค. TPU ์ง€์›์€ ์•„์ง ์ดˆ๊ธฐ ๋‹จ๊ณ„์ด๋ฉฐ, ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ,

tf.config.set_soft_device_placement(True)

enable_dump_debug_info()๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. TPU์—๋„ ๋‹ค๋ฅธ ์ œํ•œ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Debugger V2 ์‚ฌ์šฉ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด GitHub ๋ฌธ์ œ ํŽ˜์ด์ง€์—์„œ ๋ฒ„๊ทธ๋ฅผ ์‹ ๊ณ ํ•ด ์ฃผ์„ธ์š”.

Debugger V2์˜ API ํ˜ธํ™˜์„ฑ

Debugger V2๋Š” ๋น„๊ต์  ๋‚ฎ์€ ์ˆ˜์ค€์˜ TensorFlow ์†Œํ”„ํŠธ์›จ์–ด ์Šคํƒ์—์„œ ์ ์šฉ๋˜๋ฏ€๋กœ tf.keras, tf.data ๋ฐ TensorFlow์˜ ๋น„๊ต์  ๋‚ฎ์€ ์ˆ˜์ค€ ์œ„์— ๋นŒ๋“œ๋œ ๊ธฐํƒ€ API์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. Debugger V2๋Š” ๋˜ํ•œ TF1๊ณผ ์—ญํ˜ธํ™˜๋˜์ง€๋งŒ TF1 ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๋””๋ฒ„๊ทธ logdir์— ๋Œ€ํ•œ Eager ์‹คํ–‰ ํƒ€์ž„๋ผ์ธ์€ ๋น„์–ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

API ์‚ฌ์šฉ ํŒ

์ด ๋””๋ฒ„๊น… API์— ๊ด€ํ•ด ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ ์ค‘ ํ•˜๋‚˜๋Š” TensorFlow ์ฝ”๋“œ์—์„œ enable_dump_debug_info()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ค„์„ ์–ด๋””์— ์‚ฝ์ž…ํ•ด์•ผ ํ•˜๋Š”์ง€์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ API๋Š” TF2 ํ”„๋กœ๊ทธ๋žจ์—์„œ ๊ฐ€๋Šฅํ•œ ๋นจ๋ฆฌ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋ฉฐ, ๊ฐ€๊ธ‰์ ์ด๋ฉด Python ๊ฐ€์ ธ์˜ค๊ธฐ ์ค„ ์ดํ›„์™€ ๊ทธ๋ž˜ํ”„ ๋นŒ๋“œ ๋ฐ ์‹คํ–‰์ด ์‹œ์ž‘๋˜๊ธฐ ์ „์— ๋ถˆ๋Ÿฌ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋ธ๊ณผ ํ›ˆ๋ จ์„ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ops ๋ฐ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ชจ๋‘ ํฌ๊ด„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ง€์›๋˜๋Š” tensor_debug_mode๋Š” NO_TENSOR, CURT_HEALTH, CONCISE_HEALTH, FULL_HEALTH ๋ฐ SHAPE์ž…๋‹ˆ๋‹ค. ๊ฐ ํ…์„œ์—์„œ ์ถ”์ถœ๋œ ์ •๋ณด์˜ ์–‘๊ณผ ๋””๋ฒ„๊น…๋œ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. enable_dump_debug_info() ์„ค๋ช…์„œ์˜ args ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ

๋””๋ฒ„๊น… API๋Š” ๊ณ„์ธก๋œ TensorFlow ํ”„๋กœ๊ทธ๋žจ์— ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฒ„ํ—ค๋“œ๋Š” tensor_debug_mode, ํ•˜๋“œ์›จ์–ด ํ˜•์‹, ๊ณ„์ธก๋œ TensorFlow ํ”„๋กœ๊ทธ๋žจ์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ฐธ์กฐ ์‚ฌํ•ญ์œผ๋กœ, GPU์—์„œ NO_TENSOR ๋ชจ๋“œ๋Š” ๋ฐฐ์น˜ ํฌ๊ธฐ 64์—์„œ Transformer ๋ชจ๋ธ์„ ํ›ˆ๋ จํ•˜๋Š” ๋™์•ˆ 15%์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ tensor_debug_mode์˜ ์˜ค๋ฒ„ํ—ค๋“œ ๋น„์œจ์€ ๋” ๋†’์Šต๋‹ˆ๋‹ค. CURT_HEALTH, CONCISE_HEALTH, FULL_HEALTH ๋ฐ SHAPE ๋ชจ๋“œ์˜ ๊ฒฝ์šฐ๋Š” ์•ฝ 50%์ž…๋‹ˆ๋‹ค. CPU์—์„œ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์•ฝ๊ฐ„ ๋” ๋‚ฎ์Šต๋‹ˆ๋‹ค. TPU์—์„œ๋Š” ํ˜„์žฌ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋” ๋†’์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ TensorFlow ๋””๋ฒ„๊น… API์™€์˜ ๊ด€๊ณ„

TensorFlow๋Š” ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ๊ธฐํƒ€ ๋„๊ตฌ์™€ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. API ๋ฌธ์„œ ํŽ˜์ด์ง€์˜ tf.debugging.* ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ์ด๋Ÿฌํ•œ API๋ฅผ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ API ์ค‘์—์„œ ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์€ tf.print()์ž…๋‹ˆ๋‹ค. ์–ธ์ œ Debugger V2๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ณ  tf.print()๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”? tf.print()๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  1. ์ถœ๋ ฅํ•  ํ…์„œ๋ฅผ ์ •ํ™•ํžˆ ์•Œ๊ณ  ์žˆ๋‹ค.

  2. tf.print()๋ฌธ์„ ์‚ฝ์ž…ํ•  ์†Œ์Šค ์ฝ”๋“œ์˜ ์ •ํ™•ํ•œ ์œ„์น˜๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค.

  3. ๊ทธ๋Ÿฌํ•œ ํ…์„œ์˜ ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ํฌ์ง€ ์•Š๋‹ค.

์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…์„œ๊ฐ’ ๊ฒ€์‚ฌํ•˜๊ธฐ, TensorFlow์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ํ…์„œ๊ฐ’ ๊ฒ€์‚ฌํ•˜๊ธฐ, ์ƒ๊ธฐ ์ˆ˜์น˜ ๋ถˆ์•ˆ์ •์„ฑ์˜ ์›์ธ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ๋“ฑ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” Debugger V2๊ฐ€ ๋” ๋น ๋ฅธ ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Debugger V2๋Š” eager ๋ฐ ๊ทธ๋ž˜ํ”„ ํ…์„œ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ํš์ผํ™”๋œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ tf.print() ์˜ ๊ธฐ๋Šฅ์„ ๋„˜์–ด์„œ๋Š” ๊ทธ๋ž˜ํ”„ ๊ตฌ์กฐ ๋ฐ ์ฝ”๋“œ ์œ„์น˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

โˆž ๋ฐ NaN๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ API๋Š” tf.debugging.enable_check_numerics()์ž…๋‹ˆ๋‹ค. enable_dump_debug_info()์™€ ๋‹ฌ๋ฆฌ enable_check_numerics()๋Š” ๋””์Šคํฌ์— ๋””๋ฒ„๊ทธ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  TensorFlow ๋Ÿฐํƒ€์ž„ ์ค‘์— โˆž ๋ฐ NaN์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์–ด๋–ค op๋“  ์ด๋Ÿฌํ•œ ์ž˜๋ชป๋œ ์ˆซ์ž ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” ์ฆ‰์‹œ ์›๋ณธ ์ฝ”๋“œ ์œ„์น˜์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. enable_dump_debug_info()์— ๋น„ํ•ด ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋‚ฎ์ง€๋งŒ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ๊ธฐ๋ก์˜ ์ „์ฒด ์ถ”์ ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ Debugger V2์™€ ๊ฐ™์€ ๊ทธ๋ž˜ํ”ฝ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.