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+)๋ก ํจํค์ง๋๋ฉฐ ๋ค์์ ํตํด ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค.
์ด TF2 ํ๋ก๊ทธ๋จ์ ๋ค์ค ๋ ์ด์ด ์ธ์(MLP)์ ์์ฑํ๊ณ MNIST ์ด๋ฏธ์ง๋ฅผ ์ธ์ํ๋๋ก ํ๋ จํฉ๋๋ค. ์ด ์์ ๋ ์๋์ ์ผ๋ก TF2์ ์์ ์์ค์ API๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ์ ๋ ์ด์ด ๊ตฌ์กฐ, ์์ค ํจ์ ๋ฐ ํ๋ จ ๋ฃจํ๋ฅผ ์ ์ํฉ๋๋ค. ๋ ์ ์ฐํ๊ณ ์๋ฌ ๋ฐ์์จ์ด ๋์ API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด tf.keras์ฒ๋ผ ์ฌ์ฉํ๊ธฐ๋ ๋ ์ฝ์ง๋ง, ์ฝ๊ฐ ๋ ์ ์ฐํ ์์ ์์ค์ API๋ฅผ ์ฌ์ฉํ ๋๋ณด๋ค NaN ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋ ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด ํ๋ก๊ทธ๋จ์ ๊ฐ ํ๋ จ ๋จ๊ณ ํ์ ํ ์คํธ ์ ํ์ฑ์ ์ถ๋ ฅํฉ๋๋ค. ์ฝ์์ ๋ณด๋ฉด ํ ์คํธ ์ ํ์ฑ์ด ์ฒซ ๋ฒ์งธ ๋จ๊ณ ์ดํ์ ์ฐ์ฐ์ ๊ฐ๊น์ด ์์ค (~0.1)์์ ๋ฉ์ถ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๊ฒฐ์ฝ ์์๋ ๋ชจ๋ธ ํ๋ จ ๋์์ด ์๋๋ฉฐ, ์์๋๋ก๋ผ๋ฉด ๋จ๊ณ๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ ํ์ฑ์ด ์ ์ฐจ 1.0(100 %)์ ์ ๊ทผํด์ผ ํฉ๋๋ค.
์ด ๋ฌธ์ ๋ 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 ์คํ ์ถ์ )๊ฐ ํฌํจ๋ฉ๋๋ค. ํ๋ถํ ๋๋ฒ๊ทธ ์ ๋ณด๋ฅผ ํตํด ์ฌ์ฉ์๋ ๋ชจํธํ ๋ฒ๊ทธ์ ๋ฒ์๋ฅผ ์ขํ ์ ์์ต๋๋ค.
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 ํ๋ก๊ทธ๋จ์ ๋ค์ ์คํํ๋ ค๋ฉด ๋ค์์ ์ํํ์ธ์.
TensorBoard์์ Debugger V2 GUI ์์ํ๊ธฐ
๋๋ฒ๊ฑฐ ๊ณ์ธก์ผ๋ก ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด /tmp/tfdbg2_logdir์ logdir์ด ์์ฑ๋ฉ๋๋ค. TensorBoard๋ฅผ ์์ํ๊ณ ๋ค์์ ์ฌ์ฉํ์ฌ logdir์ ์ง์ ํ ์ ์์ต๋๋ค.
์น ๋ธ๋ผ์ฐ์ ์์ TensorBoard์ ํ์ด์ง(http://localhost:6006)๋ก ์ด๋ํฉ๋๋ค. "Debugger V2" ํ๋ฌ๊ทธ์ธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋์ด ์์ผ๋ฏ๋ก ์ค๋ฅธ์ชฝ ์๋จ์ "๋นํ์ฑ ํ๋ฌ๊ทธ์ธ" ๋ฉ๋ด์์ ์ ํํฉ๋๋ค. ์ ํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ชจ์ต์ด ๋ฉ๋๋ค.
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 ํ๋ก๊ทธ๋จ์ ์์น์ ๋ถ์์ ์ฑ์ ์์ธ์ด๋ผ๋ ๊ฐ๋ ฅํ ํํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด Log
op๋ ์ -โ๋ฅผ ๋ฑ์ด๋ผ๊น์? ์ด ์ง๋ฌธ์ ๋ตํ๋ ค๋ฉด op์ ๋ํ ์
๋ ฅ์ ๊ฒํ ํด์ผ ํฉ๋๋ค. ํ
์์ ์ด๋ฆ(Log:0
)์ ํด๋ฆญํ๋ฉด ๊ทธ๋ํ ๊ตฌ์กฐ ์น์
์ TensorFlow ๊ทธ๋ํ์์ Log
op์ ์ฃผ๋ณ์ ๋ํ ๊ฐ๋จํ์ง๋ง ์ ์ตํ ์๊ฐํ ์๋ฃ๊ฐ ํ์๋ฉ๋๋ค. ์ ๋ณด๋ ์์ชฝ์์ ์๋์ชฝ ๋ฐฉํฅ์ผ๋ก ํ๋ฅด๋๋ก ๋์ด ์์ผ๋ฉฐ, op ์์ฒด๋ ์ค๊ฐ์ ๋ณผ๋์ฒด๋ก ํ์๋ฉ๋๋ค. ๋ฐ๋ก ์์ Placeholder op๊ฐ Log
op์ ๋ํ ์ ์ผํ ์
๋ ฅ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ํ ์คํ ๋ชฉ๋ก์์ ์ด probs
Placeholder์ ์ํด ์์ฑ๋ ํ
์๋ ์ด๋์ ์์๊น์? ๋
ธ๋์ ๋ฐฐ๊ฒฝ์์ ์๊ฐ ์๋ฃ๋ก ์ฌ์ฉํ๋ฉด probs:0
ํ
์๊ฐ Log:0
ํ
์๋ณด๋ค ๋ ํ ์, ์ฆ 85ํ์ ์์์ ์ ์ ์์ต๋๋ค.
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'๋ฅผ ํด๋ฆญํ๋ฉด ์์ค ์ฝ๋ ์น์
์ ํด๋นํ๋ ์ฝ๋ ์ค์ด ํ์๋ฉ๋๋ค.
๋๋์ด probs
์
๋ ฅ์์ ๋ฌธ์ ๊ฐ ์๋ Log
op๋ฅผ ์์ฑํ ์์ค ์ฝ๋๋ก ์ด์ด์ง๋๋ค. ์ด๊ฒ์ @tf.function
์ผ๋ก ๋ฐ์ฝ๋ ์ดํ
๋ ์ฌ์ฉ์ ์ ์ ๋ฒ์ฃผํ ๊ต์ฐจ ์ํธ๋กํผ ์์ค ํจ์์ด๋ฏ๋ก, TensorFlow ๊ทธ๋ํ๋ก ๋ณํ๋ฉ๋๋ค. Placeholder op probs
๋ ์์ค ํจ์์ ์ฒซ ๋ฒ์งธ ์
๋ ฅ ์ธ์์ ํด๋นํฉ๋๋ค. Log
op๋ tf.math.log() API ํธ์ถ๋ก ์์ฑ๋ฉ๋๋ค.
์ด ๋ฒ๊ทธ์ ๋ํ ๊ฐ ํด๋ฆฌํ ์์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด TF2 ํ๋ก๊ทธ๋จ์ ์์น์ ๋ถ์์ ์ฑ์ ํด๊ฒฐํ๊ณ MLP๊ฐ ์ฑ๊ณต์ ์ผ๋ก ํ๋ จ๋๋๋ก ํฉ๋๋ค. ์์น์ ๋ถ์์ ์ฑ์ ์์ ํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ tf.keras.losses.CategoricalCrossentropy
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
์ด๊ฒ์ผ๋ก TF2 ๋ชจ๋ธ ๋ฒ๊ทธ ๊ด์ฐฐ์์ ๋ฒ๊ทธ๋ฅผ ์์ ํ๋ ์ฝ๋ ๋ณ๊ฒฝ์ ์ด๋ฅด๋ ์ฌ์ ์ ๋ง๋ฌด๋ฆฌํฉ๋๋ค. ์ด ๊ณผ์ ์์ ํ ์๊ฐ์ ์์น ์์ฝ ๋ฐ ops, ํ ์, ์๋ ์์ค ์ฝ๋ ๊ฐ์ ๊ด๋ จ์ฑ์ ํฌํจํ์ฌ ๊ณ์ธก๋ TF2 ํ๋ก๊ทธ๋จ์ eager ๋ฐ ๊ทธ๋ํ ์คํ ๊ธฐ๋ก์ ๋ํ ์์ ํ ๊ฐ์์ฑ์ ์ ๊ณตํ๋ Debugger V2 ๋๊ตฌ์ ๋์์ ๋ฐ์์ต๋๋ค.
Debugger V2์ ํ๋์จ์ด ํธํ์ฑ
Debugger V2๋ CPU ๋ฐ GPU๋ฅผ ํฌํจํ ์ฃผ๋ฅ ํ๋ จ ํ๋์จ์ด๋ฅผ ์ง์ํฉ๋๋ค. tf.distributed.MirroredStrategy๋ฅผ ์ฌ์ฉํ ๋ค์ค GPU ํ๋ จ๋ ์ง์๋ฉ๋๋ค. TPU ์ง์์ ์์ง ์ด๊ธฐ ๋จ๊ณ์ด๋ฉฐ, ๋ค์ ์ฝ๋๋ฅผ ํธ์ถํ ๋ค์,
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()
๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ํธ๋ฆฌํฉ๋๋ค.
์ถ๋ ฅํ ํ ์๋ฅผ ์ ํํ ์๊ณ ์๋ค.
tf.print()
๋ฌธ์ ์ฝ์ ํ ์์ค ์ฝ๋์ ์ ํํ ์์น๋ฅผ ์๊ณ ์๋ค.๊ทธ๋ฌํ ํ ์์ ์๊ฐ ๋๋ฌด ํฌ์ง ์๋ค.
์ฌ๋ฌ ๊ฐ์ ํ
์๊ฐ ๊ฒ์ฌํ๊ธฐ, 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์ ๊ฐ์ ๊ทธ๋ํฝ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ํจ๊ป ์ ๊ณต๋์ง ์์ต๋๋ค.