้กน็›ฎๆ–‡ไปถๅคน

ๆ–‡ไปถ
wehub-resource-sync e06fe8e8c6
Secret Leaks / trufflehog (push) Failing after 1s
Build documentation / build (push) Failing after 1s
Build documentation / build_other_lang (push) Failing after 0s
CodeQL Security Analysis / CodeQL Analysis (push) Failing after 0s
PR CI / pr-ci (push) Failing after 1s
Slow tests on important models (on Push - A10) / Get all modified files (push) Failing after 1s
Slow tests on important models (on Push - A10) / Model CI (push) Has been skipped
Self-hosted runner (benchmark) / Benchmark (aws-g5-4xlarge-cache) (push) Has been cancelled
New model PR merged notification / Notify new model (push) Has been cancelled
Update Transformers metadata / build_and_package (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 11:57:37 +08:00

15 KiB

๋””๋ฒ„๊น… debugging

Multi-GPU ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ ๋””๋ฒ„๊ทธ multigpu-network-issues-debug

DistributedDataParallel ๋ฐ ๋‹ค์ค‘ GPU๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ›ˆ๋ จํ•˜๊ฑฐ๋‚˜ ์ถ”๋ก ํ•  ๋•Œ, ํ”„๋กœ์„ธ์Šค ๋ฐ/๋˜๋Š” ๋…ธ๋“œ ๊ฐ„์˜ ์ƒํ˜ธ ํ†ต์‹  ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ, ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

wget https://raw.githubusercontent.com/huggingface/transformers/main/scripts/distributed/torch-distributed-gpu-test.py

์˜ˆ๋ฅผ ๋“ค์–ด, 2๊ฐœ์˜ GPU๊ฐ€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•˜์„ธ์š”:

python -m torch.distributed.run --nproc_per_node 2 --nnodes 1 torch-distributed-gpu-test.py

๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์„œ๋กœ ํ†ต์‹ ํ•˜๊ณ  GPU ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ, ๊ฐ๊ฐ "OK" ์ƒํƒœ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋” ๋งŽ์€ GPU ๋˜๋Š” ๋…ธ๋“œ์˜ ๊ฒฝ์šฐ ์Šคํฌ๋ฆฝํŠธ์˜ ์ธ์ˆ˜๋ฅผ ์กฐ์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ง„๋‹จ ์Šคํฌ๋ฆฝํŠธ ๋‚ด์—์„œ ๋” ๋งŽ์€ ์„ธ๋ถ€ ์ •๋ณด์™€ SLURM ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ ˆ์‹œํ”ผ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ ๋””๋ฒ„๊ทธ ์ˆ˜์ค€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด NCCL_DEBUG=INFO ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค:

NCCL_DEBUG=INFO python -m torch.distributed.run --nproc_per_node 2 --nnodes 1 torch-distributed-gpu-test.py

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด NCCL ๊ด€๋ จ ๋””๋ฒ„๊ทธ ์ •๋ณด๊ฐ€ ๋งŽ์ด ์ถœ๋ ฅ๋˜๋ฉฐ, ๋ฌธ์ œ๊ฐ€ ๋ณด๊ณ ๋œ ๊ฒฝ์šฐ์—๋Š” ์ธํ„ฐ๋„ท์—์„œ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์ถœ๋ ฅ์„ ํ•ด์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ ๋กœ๊ทธ ํŒŒ์ผ์„ ์ด์Šˆ์— ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ธ๋”ํ”Œ๋กœ ๋ฐ ์˜ค๋ฒ„ํ”Œ๋กœ ๊ฐ์ง€ underflow-and-overflow-detection

์ด ๊ธฐ๋Šฅ์€ ํ˜„์žฌ PyTorch์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์ค‘ GPU ํ›ˆ๋ จ์„ ์œ„ํ•ด์„œ๋Š” DDP (torch.distributed.launch)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ nn.Module์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋ชจ๋ธ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

loss=NaN์ด ๋‚˜ํƒ€๋‚˜๊ฑฐ๋‚˜ ๋ชจ๋ธ์ด inf ๋˜๋Š” nan์œผ๋กœ ์ธํ•ด ๋‹ค๋ฅธ ์ด์ƒํ•œ ๋™์ž‘์„ ํ•˜๋Š” ๊ฒฝ์šฐ, ์–ธ๋”ํ”Œ๋กœ ๋˜๋Š” ์˜ค๋ฒ„ํ”Œ๋กœ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐœ์ƒ ์œ„์น˜์™€ ๊ทธ ์›์ธ์„ ํŒŒ์•…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ๋„ ์ด๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๋Š” ํŠน์ˆ˜ ๋ชจ๋“ˆ์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์‰ฝ๊ฒŒ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[Trainer]๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๋‹ค์Œ์„ ๊ธฐ์กด์˜ ๋ช…๋ น์ค„ ์ธ์ˆ˜์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

--debug underflow_overflow

๋˜๋Š” [TrainingArguments] ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ debug="underflow_overflow"๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์ž์ฒด ํ›ˆ๋ จ ๋ฃจํ”„๋‚˜ ๋‹ค๋ฅธ Trainer๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from transformers.debug_utils import DebugUnderflowOverflow

debug_overflow = DebugUnderflowOverflow(model)

[~debug_utils.DebugUnderflowOverflow]๋Š” ๋ชจ๋ธ์— ํ›„ํฌ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๊ฐ forward ํ˜ธ์ถœ ์งํ›„์— ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ๋ณ€์ˆ˜ ๋ฐ ํ•ด๋‹น ๋ชจ๋“ˆ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”๋‚˜ ๊ฐ€์ค‘์น˜์˜ ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ์š”์†Œ์—์„œ inf ๋˜๋Š” nan์ด ๊ฐ์ง€๋˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์–ด์„คํŠธ๋˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณด๊ณ ์„œ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. (์ด ์˜ˆ์ œ๋Š” fp16 ํ˜ผํ•ฉ ์ •๋ฐ€๋„์—์„œ google/mt5-small์—์„œ ์บก์ฒ˜๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค):

Detected inf/nan during batch_number=0
Last 21 forward frames:
abs min  abs max  metadata
                  encoder.block.1.layer.1.DenseReluDense.dropout Dropout
0.00e+00 2.57e+02 input[0]
0.00e+00 2.85e+02 output
[...]
                  encoder.block.2.layer.0 T5LayerSelfAttention
6.78e-04 3.15e+03 input[0]
2.65e-04 3.42e+03 output[0]
             None output[1]
2.25e-01 1.00e+04 output[2]
                  encoder.block.2.layer.1.layer_norm T5LayerNorm
8.69e-02 4.18e-01 weight
2.65e-04 3.42e+03 input[0]
1.79e-06 4.65e+00 output
                  encoder.block.2.layer.1.DenseReluDense.wi_0 Linear
2.17e-07 4.50e+00 weight
1.79e-06 4.65e+00 input[0]
2.68e-06 3.70e+01 output
                  encoder.block.2.layer.1.DenseReluDense.wi_1 Linear
8.08e-07 2.66e+01 weight
1.79e-06 4.65e+00 input[0]
1.27e-04 2.37e+02 output
                  encoder.block.2.layer.1.DenseReluDense.dropout Dropout
0.00e+00 8.76e+03 input[0]
0.00e+00 9.74e+03 output
                  encoder.block.2.layer.1.DenseReluDense.wo Linear
1.01e-06 6.44e+00 weight
0.00e+00 9.74e+03 input[0]
3.18e-04 6.27e+04 output
                  encoder.block.2.layer.1.DenseReluDense T5DenseGatedGeluDense
1.79e-06 4.65e+00 input[0]
3.18e-04 6.27e+04 output
                  encoder.block.2.layer.1.dropout Dropout
3.18e-04 6.27e+04 input[0]
0.00e+00      inf output

์˜ˆ์ œ ์ถœ๋ ฅ์€ ๊ฐ„๋žต์„ฑ์„ ์œ„ํ•ด ์ค‘๊ฐ„ ๋ถ€๋ถ„์ด ์ž˜๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์—ด์€ ์ ˆ๋Œ€์ ์œผ๋กœ ๊ฐ€์žฅ ํฐ ์š”์†Œ์˜ ๊ฐ’์ด๋ฉฐ, ๋”ฐ๋ผ์„œ ๋งˆ์ง€๋ง‰ ๋ช‡ ๊ฐœ์˜ ํ”„๋ ˆ์ž„์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์ด 1e4 ๋ฒ”์œ„์— ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ํ›ˆ๋ จ์€ fp16 ํ˜ผํ•ฉ ์ •๋ฐ€๋„๋กœ ์ˆ˜ํ–‰๋  ๋•Œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์—์„œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค (fp16์—์„œ inf ์ด์ „์˜ ๊ฐ€์žฅ ํฐ ์ˆซ์ž๋Š” 64e3์ž…๋‹ˆ๋‹ค). fp16 ์•„๋ž˜์—์„œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ™œ์„ฑํ™”๋Š” 1e4๋ณด๋‹ค ํ›จ์”ฌ ์ž‘์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด 1e4 * 1e4 = 1e8์ด๊ธฐ ๋•Œ๋ฌธ์— ํฐ ํ™œ์„ฑํ™”์™€์˜ ํ–‰๋ ฌ ๊ณฑ์€ ์ˆ˜์น˜์ ์ธ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์กฐ๊ฑด์œผ๋กœ ์ด์–ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถ”์ ์˜ ๋งจ ์ฒ˜์Œ์—์„œ ์–ด๋А ๋ฐฐ์น˜ ๋ฒˆํ˜ธ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์—ฌ๊ธฐ์„œ Detected inf/nan during batch_number=0์€ ๋ฌธ์ œ๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๋ฐฐ์น˜์—์„œ ๋ฐœ์ƒํ–ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค).

๊ฐ ๋ณด๊ณ ๋œ ํ”„๋ ˆ์ž„์€ ํ•ด๋‹น ํ”„๋ ˆ์ž„์ด ๋ณด๊ณ ํ•˜๋Š” ํ•ด๋‹น ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์™„์ „ํ•œ ํ•ญ๋ชฉ์„ ์„ ์–ธํ•˜๋ฉฐ, ์ด ํ”„๋ ˆ์ž„๋งŒ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

                  encoder.block.2.layer.1.layer_norm T5LayerNorm
8.69e-02 4.18e-01 weight
2.65e-04 3.42e+03 input[0]
1.79e-06 4.65e+00 output

์—ฌ๊ธฐ์„œ encoder.block.2.layer.1.layer_norm์€ ์ธ์ฝ”๋”์˜ ๋‘ ๋ฒˆ์งธ ๋ธ”๋ก์˜ ์ฒซ ๋ฒˆ์งธ ๋ ˆ์ด์–ด์— ๋Œ€ํ•œ ๋ ˆ์ด์–ด ์ •๊ทœํ™”๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, forward์˜ ํŠน์ • ํ˜ธ์ถœ์€ T5LayerNorm์ž…๋‹ˆ๋‹ค.

์ด ๋ณด๊ณ ์„œ์˜ ๋งˆ์ง€๋ง‰ ๋ช‡ ๊ฐœ ํ”„๋ ˆ์ž„์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

Detected inf/nan during batch_number=0
Last 21 forward frames:
abs min  abs max  metadata
[...]
                  encoder.block.2.layer.1.DenseReluDense.wi_0 Linear
2.17e-07 4.50e+00 weight
1.79e-06 4.65e+00 input[0]
2.68e-06 3.70e+01 output
                  encoder.block.2.layer.1.DenseReluDense.wi_1 Linear
8.08e-07 2.66e+01 weight
1.79e-06 4.65e+00 input[0]
1.27e-04 2.37e+02 output
                  encoder.block.2.layer.1.DenseReluDense.wo Linear
1.01e-06 6.44e+00 weight
0.00e+00 9.74e+03 input[0]
3.18e-04 6.27e+04 output
                  encoder.block.2.layer.1.DenseReluDense T5DenseGatedGeluDense
1.79e-06 4.65e+00 input[0]
3.18e-04 6.27e+04 output
                  encoder.block.2.layer.1.dropout Dropout
3.18e-04 6.27e+04 input[0]
0.00e+00      inf output

๋งˆ์ง€๋ง‰ ํ”„๋ ˆ์ž„์€ Dropout.forward ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋ณด๊ณ ์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์€ ์œ ์ผํ•œ ์ž…๋ ฅ์„ ๋‚˜ํƒ€๋‚ด๊ณ  ๋‘ ๋ฒˆ์งธ ํ•ญ๋ชฉ์€ ์œ ์ผํ•œ ์ถœ๋ ฅ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๊ฐ€ DenseReluDense ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ dropout ์†์„ฑ์—์„œ ํ˜ธ์ถœ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฒซ ๋ฒˆ์งธ ๋ ˆ์ด์–ด์˜ ๋‘ ๋ฒˆ์งธ ๋ธ”๋ก์—์„œ ์ฒซ ๋ฒˆ์งธ ๋ฐฐ์น˜ ์ค‘์— ๋ฐœ์ƒํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ, ์ ˆ๋Œ€์ ์œผ๋กœ ๊ฐ€์žฅ ํฐ ์ž…๋ ฅ ์š”์†Œ๋Š” 6.27e+04์ด๊ณ  ์ถœ๋ ฅ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ inf์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ๋Š” T5DenseGatedGeluDense.forward๊ฐ€ ์ถœ๋ ฅ ํ™œ์„ฑํ™”๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ, ์ ˆ๋Œ€์ ์œผ๋กœ ๊ฐ€์žฅ ํฐ ๊ฐ’์ด ์•ฝ 62.7K์ธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ fp16์˜ ์ตœ๋Œ€ ์ œํ•œ์ธ 64K์— ๋งค์šฐ ๊ทผ์ ‘ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ํ”„๋ ˆ์ž„์—์„œ๋Š” ์ผ๋ถ€ ์š”์†Œ๋ฅผ 0์œผ๋กœ ๋งŒ๋“  ํ›„ ๊ฐ€์ค‘์น˜๋ฅผ ์žฌ์ •๊ทœํ™”ํ•˜๋Š” Dropout์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์ ˆ๋Œ€ ์ตœ๋Œ€๊ฐ’์ด 64K๋ฅผ ์ดˆ๊ณผํ•˜๊ณ  ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ(inf)๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ณด์‹œ๋‹ค์‹œํ”ผ, fp16 ์ˆซ์ž์˜ ๊ฒฝ์šฐ ์ˆซ์ž๊ฐ€ ๋งค์šฐ ์ปค์งˆ ๋•Œ ์ด์ „ ํ”„๋ ˆ์ž„์„ ์‚ดํŽด๋ณด์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ณด๊ณ ์„œ๋ฅผ models/t5/modeling_t5.py์˜ ์ฝ”๋“œ์™€ ์ผ์น˜์‹œ์ผœ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

class T5DenseGatedGeluDense(nn.Module):
    def __init__(self, config):
        super().__init__()
        self.wi_0 = nn.Linear(config.d_model, config.d_ff, bias=False)
        self.wi_1 = nn.Linear(config.d_model, config.d_ff, bias=False)
        self.wo = nn.Linear(config.d_ff, config.d_model, bias=False)
        self.dropout = nn.Dropout(config.dropout_rate)
        self.gelu_act = ACT2FN["gelu_new"]

    def forward(self, hidden_states):
        hidden_gelu = self.gelu_act(self.wi_0(hidden_states))
        hidden_linear = self.wi_1(hidden_states)
        hidden_states = hidden_gelu * hidden_linear
        hidden_states = self.dropout(hidden_states)
        hidden_states = self.wo(hidden_states)
        return hidden_states

์ด์ œ dropout ํ˜ธ์ถœ๊ณผ ์ด์ „์˜ ๋ชจ๋“  ํ˜ธ์ถœ์„ ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์ง€๋Š” forward ํ›„ํฌ์—์„œ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ, ์ด๋Ÿฌํ•œ ๋ณด๊ณ ์„œ๋Š” ๊ฐ forward๊ฐ€ ๋ฐ˜ํ™˜๋œ ์งํ›„์— ์ฆ‰์‹œ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

์ „์ฒด ๋ณด๊ณ ์„œ๋กœ ๋Œ์•„๊ฐ€์„œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์กฐ์น˜ ๋ฐ ์ˆ˜์ •์„ ํ•˜๋ ค๋ฉด, ์ˆซ์ž๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ๋ช‡ ๊ฐœ์˜ ํ”„๋ ˆ์ž„ ์œ„๋กœ ์ด๋™ํ•ด์„œ ์—ฌ๊ธฐ์„œ fp32 ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด์•ผ ์ˆซ์ž๊ฐ€ ๊ณฑํ•ด์ง€๊ฑฐ๋‚˜ ํ•ฉ์ณ์งˆ ๋•Œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…๋„ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, amp๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ ์ผ์‹œ์ ์œผ๋กœ ๋„๊ณ  ์›๋ž˜์˜ forward๋ฅผ ๋„์šฐ๋ฏธ ๋ž˜ํผ๋กœ ์ด๋™ํ•œ ํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

def _forward(self, hidden_states):
    hidden_gelu = self.gelu_act(self.wi_0(hidden_states))
    hidden_linear = self.wi_1(hidden_states)
    hidden_states = hidden_gelu * hidden_linear
    hidden_states = self.dropout(hidden_states)
    hidden_states = self.wo(hidden_states)
    return hidden_states


import torch


def forward(self, hidden_states):
    device_type = hidden_states.device.type
    if torch.is_autocast_enabled(device_type):
        with torch.amp.autocast(device_type, enabled=False):
            return self._forward(hidden_states)
    else:
        return self._forward(hidden_states)

์ž๋™ ๊ฐ์ง€๊ธฐ๋Š” ์ „์ฒด ํ”„๋ ˆ์ž„์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์— ๋Œ€ํ•ด์„œ๋งŒ ๋ณด๊ณ ํ•˜๋ฏ€๋กœ, ์–ด๋””๋ฅผ ์‚ดํŽด๋ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๋ฉด ํŠน์ • forward ํ•จ์ˆ˜์˜ ์ค‘๊ฐ„ ๋‹จ๊ณ„๋„ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” detect_overflow ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ์œ„์น˜์— ๊ฐ์ง€๊ธฐ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

from debug_utils import detect_overflow


class T5LayerFF(nn.Module):
    [...]

    def forward(self, hidden_states):
        forwarded_states = self.layer_norm(hidden_states)
        detect_overflow(forwarded_states, "after layer_norm")
        forwarded_states = self.DenseReluDense(forwarded_states)
        detect_overflow(forwarded_states, "after DenseReluDense")
        return hidden_states + self.dropout(forwarded_states)

์—ฌ๊ธฐ์„œ๋Š” ์ด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ 2๊ฐœ์˜ ๊ฒƒ์„ ์ถ”์ ํ•˜๊ณ  ์ด์ œ forwarded_states์˜ inf ๋˜๋Š” nan์ด ์ค‘๊ฐ„์— ๊ฐ์ง€๋˜์—ˆ๋Š”์ง€๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.

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

๋˜ํ•œ, ์ž์ฒด ์ฝ”๋“œ์—์„œ ๋””๋ฒ„๊ฑฐ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์—์„œ ์ถœ๋ ฅ๋˜๋Š” ํ”„๋ ˆ์ž„ ์ˆ˜๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

from transformers.debug_utils import DebugUnderflowOverflow

debug_overflow = DebugUnderflowOverflow(model, max_frames_to_save=100)

ํŠน์ • ๋ฐฐ์น˜์˜ ์ ˆ๋Œ“๊ฐ’ ์ตœ์†Œ ๋ฐ ์ตœ๋Œ€ ๊ฐ’ ์ถ”์  specific-batch-absolute-min-and-max-value-tracing

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

์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ๋ฐฐ์น˜์˜ ๊ฐ forward ํ˜ธ์ถœ์˜ ๋ชจ๋“  ๊ตฌ์„ฑ ์„ฑ๋ถ„์— ๋Œ€ํ•œ ์ ˆ๋Œ€ ์ตœ์†Ÿ๊ฐ’๊ณผ ์ตœ๋Œ“๊ฐ’์„ ํ™•์ธํ•˜๊ณ , ์ด๋ฅผ ๋ฐฐ์น˜ 1๊ณผ 3์— ๋Œ€ํ•ด์„œ๋งŒ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด ํด๋ž˜์Šค๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•ฉ๋‹ˆ๋‹ค:

debug_overflow = DebugUnderflowOverflow(model, trace_batch_nums=[1, 3])

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ๋ฐฐ์น˜ 1๊ณผ 3 ์ „์ฒด๊ฐ€ ์–ธ๋”ํ”Œ๋กœ์šฐ/์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๊ฐ์ง€๊ธฐ์™€ ๋™์ผํ•œ ํ˜•์‹์œผ๋กœ ์ถ”์ ๋ฉ๋‹ˆ๋‹ค.

๋ฐฐ์น˜๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ํŠน์ • ๋ฐฐ์น˜ ๋ฒˆํ˜ธ ์ดํ›„์— ์˜ค์ž‘๋™ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์˜์—ญ์œผ๋กœ ๋ฐ”๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ƒ˜ํ”Œ ์ถ•์†Œ๋œ ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

                  *** Starting batch number=1 ***
abs min  abs max  metadata
                  shared Embedding
1.01e-06 7.92e+02 weight
0.00e+00 2.47e+04 input[0]
5.36e-05 7.92e+02 output
[...]
                  decoder.dropout Dropout
1.60e-07 2.27e+01 input[0]
0.00e+00 2.52e+01 output
                  decoder T5Stack
     not a tensor output
                  lm_head Linear
1.01e-06 7.92e+02 weight
0.00e+00 1.11e+00 input[0]
6.06e-02 8.39e+01 output
                   T5ForConditionalGeneration
     not a tensor output

                  *** Starting batch number=3 ***
abs min  abs max  metadata
                  shared Embedding
1.01e-06 7.92e+02 weight
0.00e+00 2.78e+04 input[0]
5.36e-05 7.92e+02 output
[...]

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

๋˜ํ•œ, ํ›ˆ๋ จ์„ ์ค‘์ง€ํ•  ๋ฐฐ์น˜ ๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

debug_overflow = DebugUnderflowOverflow(model, trace_batch_nums=[1, 3], abort_after_batch_num=3)