728x90

๋ฐฐ๊ฒฝ

Qwen2.5-VL-32B๋ฅผ vLLM์œผ๋กœ ์„œ๋น™ํ•˜๋ฉด์„œ ์˜์ƒ์„ ์ž…๋ ฅ์œผ๋กœ ๋„ฃ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์˜์ƒ ํ•˜๋‚˜๋ฅผ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„ ๋กœ๊ทธ๊ฐ€ ์œ ๋‚œํžˆ ์ง€์ €๋ถ„ํ•˜๋”๊ตฐ์š”. ๋ชจ๋ธ์ด ์ฃฝ์€ ๊ฒƒ๋„ ์•„๋‹ˆ๊ณ  ์‘๋‹ต์€ 200 OK๋กœ ์ž˜ ๋Œ์•„์˜ค๋Š”๋ฐ, ๊ทธ ์‚ฌ์ด์— ๊ฒฝ๊ณ ๊ฐ€ ์šฐ๋ฅด๋ฅด ์Ÿ์•„์กŒ์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ ์ฒ˜์Œ์—” ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€๋ ค ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทผ๋ฐ ์˜์ƒ์ด ์ข€ ๊ธธ๊ฑฐ๋‚˜ ์‚ด์ง ๊นจ์ ธ ์žˆ์œผ๋ฉด ๋กœ๊ทธ๊ฐ€ ํ™”๋ฉด์„ ๊ฐ€๋“ ์ฑ„์›Œ์„œ, ์ •์ž‘ ๋ด์•ผ ํ•  ์ค„์„ ๋ชป ์ฐพ๊ฒ ๋”๋ผ๊ณ ์š”. "์ด๊ฑฐ ํ•œ ๋ฒˆ ํŒŒ๋ณด์ž" ํ•˜๊ณ  ์‹œ์ž‘ํ•œ ๊ฒŒ ์ด๋ฒˆ PR์ž…๋‹ˆ๋‹ค.

๊นจ์ง„ ์˜์ƒ์„ ๋„ฃ์—ˆ์„ ๋•Œ ์‹ค์ œ๋กœ ์ฐํžŒ ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.

[h264 @ 0x7fbfa4089200] Invalid NAL unit size (0 > 1404).
[h264 @ 0x7fbfa4089200] Error splitting the input into NAL units.
[h264 @ 0x7fbfa4184c80] reference picture missing during reorder
[h264 @ 0x7fbfa4184c80] Missing reference picture, default is 65576
... (์ด๋Ÿฐ ์ค„์ด ์‹ญ์ˆ˜ ๊ฐœ) ...
(APIServer pid=1) WARNING [video.py:210] Failed to grab frame 17 during video loading. This frame will be skipped.
(APIServer pid=1) WARNING [video.py:232] Video loading completed with 1 broken/unreadable frames. Expected 26 frames but only loaded 25 frames.

์—ฌ๊ธฐ์„œ ์ค„๋“ค์˜ ์ถœ์ฒ˜๊ฐ€ ๋‘ ์ข…๋ฅ˜๋ผ๋Š” ๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

  • WARNING [video.py:...] — vLLM์ด ํŒŒ์ด์ฌ logger๋กœ ์ฐ๋Š” ์ค„
  • [h264 @ ...] — ๊ทธ ์œ„์— ์ž”๋œฉ ๊น”๋ฆฐ, ์ •์ฒด๋ถˆ๋ช…์˜ ์ค„๋“ค

์ผ๋‹จ vLLM์ด ์ฐ๋Š” ์ชฝ๋ถ€ํ„ฐ ์ถ”์ ํ•ด ๋ดค์Šต๋‹ˆ๋‹ค.

1์ฐจ ์ถ”์ : vLLM์ด ๊นจ์ง„ ํ”„๋ ˆ์ž„๋งˆ๋‹ค ๊ฒฝ๊ณ ๋ฅผ ์ถœ๋ ฅ

vLLM์˜ ์˜์ƒ ๋””์ฝ”๋”ฉ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ OpenCV ๋ฐฑ์—”๋“œ๋ฅผ ์”๋‹ˆ๋‹ค. vllm/multimodal/video.py์˜ ํ”„๋ ˆ์ž„ ์ฝ๊ธฐ ๋ฃจํ”„๋ฅผ ๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

for idx in range(max_frame_idx + 1):
    ok = cap.grab()
    if not ok:
        if idx in frame_indices:
            logger.warning(
                "Failed to grab frame %d during video loading. "
                "This frame will be skipped.",
                idx,
            )
        continue
    ...
# ๋ฃจํ”„๊ฐ€ ๋๋‚œ ๋’ค, ์š”์•ฝ ํ•œ ์ค„
logger.warning(
    "Video loading completed with %d broken/unreadable frames. "
    "Expected %d frames but only loaded %d frames.",
    ...
)

๋ฌธ์ œ๊ฐ€ ๋ณด์ด์‹œ๋‚˜์š”? ๊นจ์ง„ ํ”„๋ ˆ์ž„์„ ๋งŒ๋‚  ๋•Œ๋งˆ๋‹ค logger.warning์„ ํ•œ ์ค„์”ฉ ์ฐ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฃจํ”„๊ฐ€ ๋๋‚˜๋ฉด "์ด N๊ฐœ๊ฐ€ ๊นจ์กŒ๋‹ค"๋Š” ์š”์•ฝ ์ค„์ด ๋”ฐ๋กœ ๋˜ ์ฐํž™๋‹ˆ๋‹ค.

์ฆ‰, ํ”„๋ ˆ์ž„๋ณ„ ๊ฒฝ๊ณ ๋Š” ์š”์•ฝ ์ค„์— ์ด๋ฏธ ๋‹ค ๋‹ด๊ฒจ ์žˆ๋Š” ์ •๋ณด์˜ ์ค‘๋ณต์ž…๋‹ˆ๋‹ค. ๊นจ์ง„ ํ”„๋ ˆ์ž„์ด 1๊ฐœ๋ฉด ๋ณ„ ํ‹ฐ๊ฐ€ ์•ˆ ๋‚˜์ง€๋งŒ, ๋งŽ์œผ๋ฉด ๊ฐ™์€ ํŒจํ„ด์˜ ์ค„์ด ๊ทธ ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค.

"๊ทผ๋ฐ ์ด๊ฒŒ ์‹ค์ œ๋กœ ๋ช‡ ์ค„๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ?" ๊ฐ€ ๊ถ๊ธˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ ์˜์ƒ ๋””์ฝ”๋”ฉ์€ GPU๋„ ๋ชจ๋ธ๋„ ํ•„์š” ์—†๋Š”, ์ˆœ์ˆ˜ CPU(OpenCV) ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ vLLM์˜ ์ฝ๊ธฐ ๋ฃจํ”„๋ฅผ ๊ทธ๋Œ€๋กœ ํ‰๋‚ด ๋‚ด์„œ, ์ผ๋ถ€๋Ÿฌ ๊ผฌ๋ฆฌ๋ฅผ ์ž˜๋ผ๋‚ธ ์˜์ƒ์œผ๋กœ ์ธก์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊นจ์ง„ ํ”„๋ ˆ์ž„ ์ˆ˜์— ๊ฑฐ์˜ 1:1๋กœ ๋น„๋ก€ํ–ˆ์Šต๋‹ˆ๋‹ค.

vLLM์ด ์ƒ˜ํ”Œํ•œ ํ”„๋ ˆ์ž„ ์ฐํžˆ๋Š” Failed to grab frame ๊ฒฝ๊ณ 
32 21
128 121
256 243
512 486

Qwen2.5-VL์€ ๊ธด ์˜์ƒ์ด๋ฉด ์ˆ˜๋ฐฑ ํ”„๋ ˆ์ž„๊นŒ์ง€ ์ƒ˜ํ”Œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ๊ฑฐ์˜ ๋‹ค ๊นจ์ง„ ๊ธด ์˜์ƒ ํ•˜๋‚˜์— ๊ฒฝ๊ณ ๊ฐ€ ์ˆ˜๋ฐฑ ์ค„๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์š”์ฒญ ํ•œ ๋ฒˆ์—์š”.

๋ฌผ๋ก  "ํญ์ฆ"์ด๋ผ๊ณ  ๋ถ€๋ฅผ ์ •๋„์˜ ์žฅ์• ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋ˆˆ์— ๊ฑฐ์Šฌ๋ฆฌ๊ณ , ์ง„์งœ ๋ด์•ผ ํ•  ๋กœ๊ทธ๋ฅผ ๋ฌป์–ด๋ฒ„๋ฆฌ๋Š” ์ˆ˜์ค€์ด์ฃ . ๋”ฑ ๊ณ ์ณ์„œ ๊น”๋”ํ•˜๊ฒŒ ๋งŒ๋“ค ๋งŒํ•œ ํฌ๊ธฐ์˜€์Šต๋‹ˆ๋‹ค. sglang ์—์„œ ์ฒ˜๋Ÿผ base64 ์ด๋ฏธ์ง€๋ฅผ ๋ชจ๋‘ ๋‹ค ์ฐ๋Š” ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์˜€๋˜๊ฑฐ์ฃ 

๊ทผ๋ฐ ์—ฌ๊ธฐ์„œ ํ•œ ๊ฐ€์ง€ ์งš๊ณ  ๋„˜์–ด๊ฐ€์•ผ ํ•  ๋ถ€๋ถ„์€ ์ •์ž‘ ์ค„ ์ˆ˜๊ฐ€ ์ œ์ผ ๋งŽ์•˜๋˜ [h264 @ ...] ์ชฝ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊นจ์ง„ ํ”„๋ ˆ์ž„ 1๊ฐœ์งœ๋ฆฌ ์˜์ƒ์ธ๋ฐ๋„ ์‹ญ์ˆ˜ ์ค„์ด ์ฐํ˜”๊ฑฐ๋“ ์š”.

์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‹น์—ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์ค„๋“ค์€ vLLM์ด ์ฐ๋Š” ๊ฒŒ ์•„๋‹™๋‹ˆ๋‹ค. OpenCV๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์“ฐ๋Š” ffmpeg/libav(C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ) ๊ฐ€ ๋””์ฝ”๋”ฉ์— ์‹คํŒจํ•˜๋ฉด์„œ stderr๋กœ ์ง์ ‘ ํ† ํ•ด๋‚ด๋Š” ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ logger๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— VLLM_LOGGING_LEVEL๋กœ๋„ ์•ˆ ์žกํž™๋‹ˆ๋‹ค.

ํ™•์ธํ•ด ๋ณด๋‹ˆ vLLM์€ ์ด ffmpeg ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ๋”ฐ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š๋”๊ตฐ์š”. ์ด๊ฑด ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋”ฐ๋กœ ๋ˆŒ๋Ÿฌ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

# ์„œ๋ฒ„ ๋„์šฐ๊ธฐ ์ „์— ffmpeg ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ๋‚ฎ์ถ”๋ฉด [h264 @ ...] ์ค„์ด ์‚ฌ๋ผ์ง„๋‹ค
OPENCV_FFMPEG_LOGLEVEL=-8 vllm serve ...

๊ทธ๋ž˜์„œ ์ด๋ฒˆ PR์˜ ๋ฒ”์œ„๋ฅผ ๋ช…ํ™•ํžˆ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด PR์€ vLLM์ด ์ง์ ‘ ์ฐ๋Š” ์ค‘๋ณต ๊ฒฝ๊ณ ๋งŒ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ffmpeg ์ชฝ ๋…ธ์ด์ฆˆ๋Š” ๋ ˆ์ด์–ด๊ฐ€ ๋‹ค๋ฅธ ๋ณ„๊ฐœ ๋ฌธ์ œ๋ผ ์„ž์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. (๊ดœํžˆ ์š•์‹ฌ๋‚ด์„œ ํ•œ PR์— ๋‘ ๊ฐœ๋ฅผ ๋ฌถ์œผ๋ฉด ๋ฆฌ๋ทฐ๋งŒ ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.)

์ˆ˜์ •: ๋”ฑ 6์ค„

ํ•ด๋ฒ•์€ ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„๋ณ„ ๊ฒฝ๊ณ ๋ฅผ warning์—์„œ debug๋กœ ๋‚ด๋ฆฌ๊ณ , ์š”์•ฝ ์ค„์€ warning ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ •๋ณด ์†์‹ค์€ ์—†์Šต๋‹ˆ๋‹ค — ์ด ๋ช‡ ๊ฐœ๊ฐ€ ๊นจ์กŒ๋Š”์ง€๋Š” ์š”์•ฝ ์ค„์— ๊ทธ๋Œ€๋กœ ๋‚จ์œผ๋‹ˆ๊นŒ์š”.

-                    logger.warning(
+                    logger.debug(
                         "Failed to grab frame %d during video loading. "
                         "This frame will be skipped.",
                         idx,
                     )

์ด๋Ÿฐ ์‹์œผ๋กœ ํ”„๋ ˆ์ž„ ๋‹จ์œ„๋กœ ์ฐ๋˜ ์ค„ ๋‹ค์„ฏ ๊ตฐ๋ฐ๋ฅผ debug๋กœ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค. ๋กœ์ง์€ ํ•œ ๊ธ€์ž๋„ ์•ˆ ๊ฑด๋“œ๋ ธ๊ณ ์š”.

๊ทผ๋ฐ ์™œ debug๋กœ ๋ฐ”๊พธ๋ฉด ์ค„์–ด๋“œ๋Š” ๊ฑฐ์ฃ ?

์ด๊ฒŒ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๋ฅผ ์ง€์šด ๊ฒƒ๋„ ์•„๋‹Œ๋ฐ ์™œ ์•ˆ ๋ณด์ผ๊นŒ์š”? vLLM์˜ ๊ธฐ๋ณธ ๋กœ๊ทธ ๋ ˆ๋ฒจ์€ INFO์ž…๋‹ˆ๋‹ค. ๋กœ๊ฑฐ๋Š” ์ž๊ธฐ ๋ ˆ๋ฒจ ์ด์ƒ๋งŒ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

  • WARNING(30)์€ INFO(20)๋ณด๋‹ค ๋†’์Œ → ๋ณด์ž„
  • DEBUG(10)๋Š” INFO(20)๋ณด๋‹ค ๋‚ฎ์Œ → ๊ธฐ๋ณธ๊ฐ’์—์„  ๊ฑธ๋Ÿฌ์ ธ์„œ ์•ˆ ๋ณด์ž„

์ฆ‰ "์‚ญ์ œ"๊ฐ€ ์•„๋‹ˆ๋ผ "๊ธฐ์ค€์„  ์•„๋ž˜๋กœ ๋‚ด๋ฆฐ" ๊ฒ๋‹ˆ๋‹ค. ๋””๋ฒ„๊น…ํ•  ๋•Œ ํ”„๋ ˆ์ž„๋ณ„ ์ƒ์„ธ๊ฐ€ ํ•„์š”ํ•˜๋ฉด VLLM_LOGGING_LEVEL=DEBUG๋กœ ๋‹ค์‹œ ์ผœ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ง์ ‘ ์žฌํ˜„ํ•œ before/after๋Š” ์ด๋ ‡์Šต๋‹ˆ๋‹ค. (32ํ”„๋ ˆ์ž„ ์ƒ˜ํ”Œ, 21๊ฐœ ๊นจ์ง„ ์˜์ƒ)

[before] main ๋ธŒ๋žœ์น˜ (ํ”„๋ ˆ์ž„๋ณ„ = warning)
  WARNING Failed to grab frame 42 during video loading. This frame will be skipped.
  WARNING Failed to grab frame 46 during video loading. This frame will be skipped.
  ... (19์ค„ ๋”) ...
  WARNING Video loading completed with 21 broken/unreadable frames. Expected 32 frames but only loaded 11 frames.
  => WARNING 22์ค„

[after] PR ์ ์šฉ (ํ”„๋ ˆ์ž„๋ณ„ = debug)
  WARNING Video loading completed with 21 broken/unreadable frames. Expected 32 frames but only loaded 11 frames.
  => WARNING 1์ค„

22์ค„์ด 1์ค„๋กœ. ์•ž์„œ ๋ณธ ๊ธด ์˜์ƒ ์ผ€์ด์Šค(486์ค„)๋„ ๋˜‘๊ฐ™์ด 1์ค„๋กœ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

PR์„ ์˜ฌ๋ฆฌ๊ณ  ๋‚˜์„œ — DCO์™€์˜ ์‹ธ์›€

์ฝ”๋“œ๋Š” 6์ค„์ด์—ˆ๋Š”๋ฐ, ์ •์ž‘ ์‹œ๊ฐ„์„ ์žก์•„๋จน์€ ๊ฑด PR ์ ˆ์ฐจ์˜€์Šต๋‹ˆ๋‹ค. ์ด ์–˜๊ธฐ๊ฐ€ ์˜คํ”ˆ์†Œ์Šค ์ฒ˜์Œ ๊ธฐ์—ฌํ•˜๋Š” ๋ถ„๋“ค๊ป˜ ๋” ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™๋„ค์š”.

vLLM์€ ๋ชจ๋“  ์ปค๋ฐ‹์— DCO(Developer Certificate of Origin) ์„œ๋ช…์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๋์— ์ด๋Ÿฐ ์ค„์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Signed-off-by: ์ด๋ฆ„ <์ด๋ฉ”์ผ>

git commit -s๋ฅผ ๋ถ™์ด๋ฉด ์ž๋™์œผ๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ์ด๊ฒŒ ๋‹จ์ˆœ ๊ถŒ์žฅ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋ผ ๋ด‡์ด ๊ฒ€์‚ฌํ•˜๋Š” ๊ฐ•์ œ ์ฒดํฌ๋ผ, ์—†์œผ๋ฉด PR์ด ๋นจ๊ฐ„๋ถˆ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ์ฒ˜์Œ์— ์ด ์ค„์„ ๋นผ๊ณ  ์˜ฌ๋ ธ๋‹ค๊ฐ€ ๋ณด๊ธฐ ์ข‹๊ฒŒ ๋ง‰ํ˜”์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ GitHub ์›น์—์„œ "Update branch" ๋ฒ„ํŠผ์„ ๋‘ ๋ฒˆ ๋ˆŒ๋ €๋”๋‹ˆ, ์„œ๋ช… ์—†๋Š” ๋จธ์ง€ ์ปค๋ฐ‹ 2๊ฐœ๊ฐ€ ์ถ”๊ฐ€๋กœ ๋ผ์–ด๋“ค์–ด์„œ ๋” ๊ผฌ์˜€์ฃ . ๋ฉ”์ธํ…Œ์ด๋„ˆ ํ”ผ๋“œ๋ฐฑ๋„ ์ •ํ™•ํžˆ ๊ทธ ์ง€์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

"DCO won't pass even after a rerun. You didn't sign off your own commits. Create a new branch and cherry-pick your changes, then overwrite the old branch."

ํ•ด๊ฒฐ์€ ๊น”๋”ํ•˜๊ฒŒ ๋‹ค์‹œ ์Œ“๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋จธ์ง€ ์ปค๋ฐ‹๋“ค์„ ๋ฒ„๋ฆฌ๊ณ , ์ตœ์‹  main ์œ„์— ์„œ๋ช…๋œ ๋‹จ์ผ ์ปค๋ฐ‹์œผ๋กœ ์žฌ๊ตฌ์„ฑํ•œ ๋’ค force-push ํ–ˆ์Šต๋‹ˆ๋‹ค.

git fetch origin
git checkout -B fix/video-broken-frame-log-noise origin/main
git cherry-pick --signoff <์›๋ž˜_๋ณ€๊ฒฝ_์ปค๋ฐ‹>   # ๋ณ€๊ฒฝ ์žฌ์ ์šฉ + ์„œ๋ช… ์ถ”๊ฐ€
git push -f fork fix/video-broken-frame-log-noise

์—ฌ๊ธฐ์„œ ์•Œ์•„๋‘˜ ์  ํ•˜๋‚˜. force-pushํ•ด๋„ ์ƒˆ PR์„ ๋‹ค์‹œ ์—ด ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ๋ธŒ๋žœ์น˜๋ฅผ ๋ฎ์–ด์“ฐ๋ฉด ๊ธฐ์กด PR์ด ๊ทธ ์ปค๋ฐ‹์œผ๋กœ ๊ทธ๋Œ€๋กœ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค. ๋ฒˆํ˜ธ๋„, ๋ฆฌ๋ทฐ๋„, ๋Œ“๊ธ€๋„ ๋‹ค ์œ ์ง€๋ผ์š”. ๋ฉ”์ธํ…Œ์ด๋„ˆ๊ฐ€ ๋งํ•œ "overwrite the old branch"๊ฐ€ ๋ฐ”๋กœ ์ด๊ฒ๋‹ˆ๋‹ค.

์žฌ๊ตฌ์„ฑ ํ›„ DCO๋Š” ์ดˆ๋ก๋ถˆ์ด ๋๊ณ , ์Šน์ธ๋„ ํ’€๋ฆฌ์ง€ ์•Š๊ณ  ๋‚จ์•„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

PR์ด ready ๋ผ๋ฒจ์„ ๋ฐ›์œผ๋ฉด ๊ทธ์ œ์„œ์•ผ ํ’€ CI๊ฐ€ ๋•๋‹ˆ๋‹ค. ์žก์ด ์ˆ˜์‹ญ ๊ฐœ๋ผ ์‹œ๊ฐ„์ด ๊ฝค ๊ฑธ๋ฆฌ๊ณ , ์ค‘๊ฐ„์ค‘๊ฐ„ ์šฐ๋ฆฌ ๋ณ€๊ฒฝ๊ณผ ๋ฌด๊ด€ํ•œ ์žก์ด ๋นจ๊ฐ›๊ฒŒ ๋œจ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด๋ฒˆ์—๋„ ๋‘ ๊ฐœ๊ฐ€ ์‹คํŒจํ–ˆ๋Š”๋ฐ,

  • test_traces — ์ถ”์ (tracing) span 0๊ฐœ (flaky)
  • test_image_embedding_models[llava] — llava ๋ชจ๋ธ config ๋กœ๋”ฉ ์—๋Ÿฌ

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

๋งˆ์น˜๋ฉฐ

๊ฒจ์šฐ 6์ค„์งœ๋ฆฌ, ๊ทธ๊ฒƒ๋„ ๋กœ๊ทธ ๋ ˆ๋ฒจ๋งŒ ๋ฐ”๊พธ๋Š” PR์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ทธ 6์ค„์— ๋„๋‹ฌํ•˜๊ธฐ๊นŒ์ง€๊ฐ€ ๋” ๊ธธ์—ˆ๋„ค์š”.

  • ๊ฑฐ์Šฌ๋ฆฌ๋Š” ๋กœ๊ทธ๋ฅผ ๊ทธ๋ƒฅ ๋„˜๊ธฐ์ง€ ์•Š๊ณ  ์ถœ์ฒ˜๋ฅผ ๋๊นŒ์ง€ ์ชผ๊ฐœ๋ณธ ๊ฒƒ (vLLM vs ffmpeg)
  • "์‹ฌ๊ฐํ•œ๊ฐ€?"๋ฅผ ๊ฐ์ด ์•„๋‹ˆ๋ผ ์ˆซ์ž๋กœ ์žฌํ˜„ํ•ด ๋ณธ ๊ฒƒ
  • ์ž‘์€ ๋ณ€๊ฒฝ์ด๋ผ๋„ ์š”์•ฝ ์ค„์€ ๋‚จ๊ฒจ์„œ ์ •๋ณด ์†์‹ค์„ ์—†์•ค ๊ฒƒ
  • DCO/CI ๊ฐ™์€ ์ ˆ์ฐจ์—์„œ ๋ง‰ํžˆ๊ณ  ํ‘ธ๋Š” ๊ฒฝํ—˜

์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ๋ผ๊ณ  ๊ฑฐ์ฐฝํ•œ ๊ธฐ๋Šฅ์„ ๋„ฃ์„ ํ•„์š”๋Š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋งค์ผ ๋ณด๋˜ ๊ฑฐ์Šฌ๋ฆฌ๋Š” ๋กœ๊ทธ ํ•œ ์ค„๋„, ํŒŒ๊ณ ๋“ค๋ฉด ์ถฉ๋ถ„ํžˆ ๊น”๋”ํ•œ PR์ด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

728x90
728x90

 

 

OCR ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ์ง€๋‹ค๊ฐ€ SGLang์— ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ๋ž‘ PR๊นŒ์ง€ ์˜ฌ๋ฆฌ๊ฒŒ ๋œ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด๋ดค๋Š”๋ฐ์š”, ์ƒ๊ฐ๋ณด๋‹ค ์›์ธ์ด ์—ฌ๋Ÿฌ ๊ฒน์œผ๋กœ ์–ฝํ˜€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ฒซ์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ( Openwebui vLLM Usage )  ์ดํ›„ ๋‘๋ฒˆ์งธ ์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ์ธ๋ฐ, ์ง€๋‚œ๋ฒˆ์—๋Š” docs ์˜ usage ์ •๋„ ๊ธฐ์—ฌํ–ˆ์ง€๋งŒ ์ด๋ฒˆ์—๋Š” ๋ฒ„๊ทธ ํ•ด๊ฒฐ์„ ์ œ์•ˆํ•œ ๊ธฐ์—ฌ์—ฌ์„œ ๊ธฐ๋กํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

 

buf ๋กœ ์ด๋ฏธ์ง€ ๊ตฌํ˜„ํ•œ ๋ฐ์ดํ„ฐ ์ž…๋‹ˆ๋‹ค.

 

 

์‹œ์ž‘์€ ํ‰๋ฒ”ํ•œ OCR ์ž‘์—…์ด์—ˆ์Šต๋‹ˆ๋‹ค

Qwen3-VL-8B-Instruct๋ฅผ SGLang์œผ๋กœ ๋„์›Œ๋†“๊ณ  ๋ฌธ์„œ OCR์„ ๋Œ๋ฆฌ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ์š”. ๊ตฌ์„ฑ์€ ์ด๋žฌ์Šต๋‹ˆ๋‹ค.

docker run -d --restart unless-stopped --gpus all -p 1011:30000 \
  -v /models:/models --ipc=host \
  lmsysorg/sglang:v0.5.10.post1-cu130 python3 -m sglang.launch_server \
  --model-path /models/qwen3-vl-8b-instruct --host 0.0.0.0 --port 30000 \
  --tp 1 --mem-fraction-static 0.3 --max-running-requests 256

 

PDF๋ฅผ 300DPI๋กœ ๋ž˜์Šคํ„ฐํ™”ํ•ด์„œ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“  ๋‹ค์Œ ๋ชจ๋ธ์— ๋„ฃ๋Š”, ๊ทธ๋ƒฅ ํ”ํ•œ ํ๋ฆ„์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์›๋ณธ PDF๋Š” 10MB ๋‚จ์ง“์ด์—ˆ๊ณ ์š”.

 

๊ทธ๋Ÿฐ๋ฐ ์š”์ฒญ ํ•˜๋‚˜๋ฅผ ๋ณด๋ƒˆ๋”๋‹ˆ ์‘๋‹ต์ด 1๋ถ„ 50์ดˆ๊ฐ€ ๋„˜๊ฒŒ ๊ฑธ๋ฆฌ๋”๋ผ๊ณ ์š”. ๊ทธ๊ฒƒ๋„ ๋ชจ์ž๋ผ์„œ, ํ„ฐ๋ฏธ๋„ ๋กœ๊ทธ์ฐฝ์— base64 ์ธ์ฝ”๋”ฉ๋œ ์ด๋ฏธ์ง€ raw ๋ฐ์ดํ„ฐ๊ฐ€ ๋๋„ ์—†์ด ์ฃผ๋ฅด๋ฅต ์ฐํžˆ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. AAAAAA... ๊ฐ™์€ ๊ฒŒ ๋ช‡ ๋ถ„ ๋™์•ˆ ํ™”๋ฉด์„ ๊ฐ€๋“ ์ฑ„์šฐ๋Š”๋ฐ, ์†”์งํžˆ ์ฒ˜์Œ์—” ์„œ๋ฒ„๊ฐ€ ์ฃฝ์€ ์ค„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

์žฌ๋ฐŒ๋Š” ๊ฑด ๊ฐ™์€ ํŒŒ์ผ์„ vLLM์— ๋„ฃ์—ˆ์„ ๋•Œ์˜€๋Š”๋ฐ์š”. vLLM์€ PIL์ด "decompression bomb์ด ์˜์‹ฌ๋œ๋‹ค"๋Š” ๊ฒฝ๊ณ ๋ฅผ ๋„์šฐ๊ณ  ๊น”๋”ํ•˜๊ฒŒ ๋„˜์–ด๊ฐ”์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ raw๊ฐ€ ๋กœ๊ทธ์— ํ† ํ•ด์ง€๋Š” ์ผ๋„ ์—†์—ˆ๊ณ ์š”. ๊ฐ™์€ ์ž…๋ ฅ์ธ๋ฐ ๋‘ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ฐ˜์‘์ด ์ด๋ ‡๊ฒŒ ๋‹ค๋ฅธ ๊ฒŒ ์ด์ƒํ•ด์„œ, ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๊นŒ๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

1์ฐจ ์šฉ์˜์ž: ์™œ raw ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๊ทธ์— ์ฐํžˆ๋‚˜

๊ฐ€์žฅ ๋จผ์ € ์˜์‹ฌํ•œ ๊ฑด ์š”์ฒญ ๋กœ๊น…์ด์—ˆ์Šต๋‹ˆ๋‹ค. SGLang์—๋Š” --log-requests ์˜ต์…˜์ด ์žˆ์–ด์„œ ์š”์ฒญ ๋‚ด์šฉ์„ ๋กœ๊ทธ์— ๋‚จ๊ธธ ์ˆ˜ ์žˆ๊ฑฐ๋“ ์š”. ๊ทธ๋Ÿฐ๋ฐ ์ €๋Š” ๊ทธ ์˜ต์…˜์„ ์ผ  ์ ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ log_requests ๊ธฐ๋ณธ๊ฐ’์€ False์˜€๊ณ ์š”.

log_requests: bool = False

 

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

๊ฒฐ๊ตญ ๋‹ต์€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ชฝ์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋ฅผ ๋””์ฝ”๋”ฉํ•˜๋Š” base_processor.py์—์„œ, ์ œ๊ฐ€ ์“ฐ๋˜ v0.5.10.post1 ๋ฒ„์ „์€ ์ด๋ ‡๊ฒŒ ๋˜์–ด ์žˆ์—ˆ๊ฑฐ๋“ ์š”.

except Exception as e:
    raise RuntimeError(f"Error while loading data {data}: {e}")

 

์—ฌ๊ธฐ {data}๊ฐ€ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ๋กœ๋”ฉ์ด ์‹คํŒจํ•˜๋ฉด ๊ทธ ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€ ์•ˆ์— ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ์ „์ฒด, ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์ˆ˜์‹ญ~๋ฐฑ MB์งœ๋ฆฌ base64 ๋ฌธ์ž์—ด์ด ํ†ต์งธ๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด RuntimeError๊ฐ€ ์œ„๋กœ ์ „ํŒŒ๋˜๋ฉด์„œ serving_base.py์˜

 

except Exception as e:
    logger.exception(f"Error in request: {e}")

์—ฌ๊ธฐ์„œ ๊ทธ๋Œ€๋กœ ๋กœ๊ทธ๋กœ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. --log-requests์™€๋Š” ์•„๋ฌด ์ƒ๊ด€ ์—†๋Š” ๊ฒฝ๋กœ์˜€๋˜ ๊ฑฐ์ฃ . ๋””์ฝ”๋”ฉ์ด ์‹คํŒจํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฌด์กฐ๊ฑด ์ฐํž™๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•œ ๊ฐ€์ง€ ๋”. ์ œ๊ฐ€ 1๋ถ„ 50์ดˆ๋‚˜ ๊ธฐ๋‹ค๋ฆฐ ์ด์œ ๊ฐ€ ์‚ฌ์‹ค ์ด๋ฏธ์ง€ ๋””์ฝ”๋”ฉ์ด ์•„๋‹ˆ๋ผ ์ด ๋กœ๊น… ์ž์ฒด์˜€์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค. 100MB๊ฐ€ ๋„˜๋Š” ๋ฌธ์ž์—ด์„ f-string์œผ๋กœ ๋งŒ๋“ค๊ณ  stdout์œผ๋กœ ์Ÿ์•„๋‚ด๋Š” ๋™์•ˆ CPU ์ฝ”์–ด ํ•˜๋‚˜๊ฐ€ ๊ผฌ๋ฐ• 100%๋กœ ๋Œ๊ฑฐ๋“ ์š”. ์ถ”๋ก ์€ ์‹œ์ž‘๋„ ์•ˆ ํ–ˆ๋Š”๋ฐ ๋ง์ด์ฃ .

๊ทธ๋Ÿผ ์• ์ดˆ์— ์˜ˆ์™ธ๋Š” ์™œ ๋‚ฌ์„๊นŒ

์—ฌ๊ธฐ์„œ vLLM์ด ๋ณด์—ฌ์ค€ ๊ฒฝ๊ณ ๊ฐ€ ๊ฒฐ์ •์ ์ธ ํžŒํŠธ์˜€์Šต๋‹ˆ๋‹ค. "decompression bomb์ด ์˜์‹ฌ๋œ๋‹ค"๋Š” ๊ทธ ๋ฉ”์‹œ์ง€, ๋ฐ”๋กœ PIL ๋‚ด์žฅ ๋ณดํ˜ธ ์žฅ์น˜๊ฐ€ ๋„์šฐ๋Š” ๊ฒ๋‹ˆ๋‹ค.

PIL์€ ์ด๋ฏธ์ง€์˜ ํ”ฝ์…€ ์ˆ˜๊ฐ€ MAX_IMAGE_PIXELS(๊ธฐ๋ณธ๊ฐ’ 89,478,485)๋ฅผ ๋„˜์œผ๋ฉด ๊ฒฝ๊ณ ๋ฅผ, ๊ทธ 2๋ฐฐ์ธ 178,956,970์„ ๋„˜์œผ๋ฉด ์•„์˜ˆ DecompressionBombError๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค. ๋””์Šคํฌ์ƒ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์••์ถ•์„ ํ‘ผ ํ”ฝ์…€ ์ˆ˜ ๊ธฐ์ค€์ด๋ผ๋Š” ๊ฒŒ ํ•ต์‹ฌ์ธ๋ฐ์š”.

 

300DPI๋กœ ํ‚ค์šด PDF ํŽ˜์ด์ง€๋Š” ์ด ํ•œ๊ณ„๋ฅผ ๋„˜๊ธฐ๊ธฐ ๋”ฑ ์ข‹์Šต๋‹ˆ๋‹ค. ํฐ ์šฉ์ง€๋ฅผ ๊ณ ํ•ด์ƒ๋„๋กœ ๋ž˜์Šคํ„ฐํ™”ํ•˜๋ฉด 1์–ต~2์–ต ํ”ฝ์…€์€ ์šฐ์Šต๊ฒŒ ๋‚˜์˜ค๋‹ˆ๊นŒ์š”. ์›๋ณธ ํŒŒ์ผ์ด 10MB๋ผ๋„ ํ”ฝ์…€๋กœ ํŽผ์น˜๋ฉด ์ „ํ˜€ ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ •๋ฆฌํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

  1. ํฐ ์ด๋ฏธ์ง€๊ฐ€ ๋“ค์–ด์˜ด → PIL์ด ํ”ฝ์…€ ์ˆ˜ ํ•œ๊ณ„ ์ดˆ๊ณผ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  DecompressionBombError๋ฅผ ๋˜์ง
  2. SGLang์ด ๊ทธ ์˜ˆ์™ธ๋ฅผ ์žก์•„์„œ base64 ์›๋ฌธ๊ณผ ํ•จ๊ป˜ ๋‹ค์‹œ ๋˜์ง
  3. logger.exception์ด ๊ทธ 100MB์งœ๋ฆฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋กœ๊ทธ๋กœ ์ถœ๋ ฅ → CPU ์ ์œ , ๋กœ๊ทธ ํญ๋ฐœ

vLLM์€ 1๋ฒˆ์—์„œ PIL ๋ฉ”์‹œ์ง€๋งŒ ๋ณด์—ฌ์ฃผ๊ณ  ๋๋ƒˆ๋Š”๋ฐ, SGLang(ํ•ด๋‹น ๋ฒ„์ „)์€ ๊ฑฐ๊ธฐ์— raw ๋ฐ์ดํ„ฐ๊นŒ์ง€ ์–น์–ด์„œ ํ† ํ•ด๋‚ธ ์…ˆ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋” ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ: ๋ฉ”๋ชจ๋ฆฌ์™€ DoS

์—ฌ๊ธฐ๊นŒ์ง€๋„ ์ถฉ๋ถ„ํžˆ ๊ณจ์น˜ ์•„ํ”ˆ๋ฐ, ํ…Œ์ŠคํŠธํ•˜๋‹ค ๋ณด๋‹ˆ ๋” ์œ„ํ—˜ํ•œ ๊ฒŒ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ์š”์ฒญ ํ•˜๋‚˜ ์ฒ˜๋ฆฌํ•  ๋•Œ๋งˆ๋‹ค RSS๊ฐ€ 1GB์”ฉ ์น˜์†Ÿ์•˜๋‹ค๊ฐ€ ๋๋‚˜๋ฉด ํ’€๋ฆฌ๋”๋ผ๊ณ ์š”.

์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‹น์—ฐํ•ฉ๋‹ˆ๋‹ค. HTTP ๋ฐ”๋””(133MB) → UTF-8 ๋ฌธ์ž์—ด → base64 ๋””์ฝ”๋“œ → PIL ๋””์ฝ”๋”ฉ(1.4์–ต ํ”ฝ์…€ RGB๋ฉด ๊ทธ๊ฒƒ๋งŒ 430MB๊ฐ€ ๋„˜์Šต๋‹ˆ๋‹ค) → ๋ฆฌ์‚ฌ์ด์ฆˆ ๋ณต์‚ฌ๋ณธ… ๋‹จ๊ณ„๋งˆ๋‹ค ํฐ ๊ฐ์ฒด๊ฐ€ ์ƒˆ๋กœ ์ƒ๊ธฐ๋‹ˆ๊นŒ์š”.

๋ฌธ์ œ๋Š” ์ œ๊ฐ€ --max-running-requests 256์œผ๋กœ ๋„์›Œ๋†จ๋‹ค๋Š” ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์š”์ฒญ์ด ๋™์‹œ์— ๋ช‡ ๊ฐœ๋งŒ ๋“ค์–ด์™€๋„ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์„ ํ˜•์œผ๋กœ ๋ถˆ์–ด๋‚ฉ๋‹ˆ๋‹ค. 8๊ฐœ๋ฉด 8GB, 16๊ฐœ๋ฉด 16GB. GPU ์ถ”๋ก ์— ๋‹ฟ๊ธฐ๋„ ์ „์— ์„œ๋ฒ„๊ฐ€ OOM์œผ๋กœ ์ฃฝ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด์ฃ .

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

 

์ด๋ฏธ ๊ณ ์ณ์ง„ ๋ถ€๋ถ„๊ณผ ์•„์ง ์•ˆ ๊ณ ์ณ์ง„ ๋ถ€๋ถ„

์ด์Šˆ๋ฅผ ์ •๋ฆฌํ•˜๋‹ค๊ฐ€ ์•Œ๊ฒŒ ๋œ ๊ฑด๋ฐ์š”, ์œ„์—์„œ ๋ณธ ๊ทธ ๋ฌด์ œํ•œ {data} ๋กœ๊น…์€  PR #27451์—์„œ ์ด๋ฏธ ์†์„ ๋ดค๋”๋ผ๊ณ ์š”. ๋‹ค๋งŒ ์ œ๊ฐ€ ์“ฐ๋˜ v0.5.10.post1์—๋Š” ์•„์ง ์•ˆ ๋“ค์–ด๊ฐ„ ์ƒํƒœ์˜€์Šต๋‹ˆ๋‹ค. ์ตœ์‹  main์—์„œ๋Š” ์ด๋ ‡๊ฒŒ 100์ž๋กœ ์ž˜๋ฆฝ๋‹ˆ๋‹ค.

 

Classify malformed-multimodal rejects as invalid_request by merrymercy · Pull Request #27451 · sgl-project/sglang

Summary When a multimodal request fails validation (e.g. bad base64), return a structured error with type=invalid_request_error and code=400 instead of a bare error message. Detect client disconne...

github.com

 

except Exception as e:
    data_str = str(data)
    if len(data_str) > 100:
        data_str = data_str[:100] + "..."
    raise RuntimeError(f"Error while loading data {data_str}: {e}") from e

์ด๊ฑธ ๋ณด๊ณ  "์•„ ๊ทธ๋Ÿผ ํ•ด๊ฒฐ๋๋„ค" ํ•˜๊ณ  ๋„˜์–ด๊ฐˆ ๋ป”ํ–ˆ๋Š”๋ฐ, ๊ณฑ์”น์–ด๋ณด๋‹ˆ ์ด truncation์ด ๋ง‰๋Š” ๊ฑด ๊นจ์ง„ ์ž…๋ ฅ ์ผ€์ด์Šค๋ฟ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ Image.open์ด ์‹คํŒจํ•ด์„œ ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€์—๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค๋ฆฌ๋˜ ๊ฒฝ๋กœ์š”.

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

๊ทธ๋ž˜์„œ ์ด์Šˆ์— "#27451์ด ๊ณ ์นœ ๊ฒƒ๊ณผ ๋ชป ๊ณ ์นœ ๊ฒƒ"์„ ๋ช…ํ™•ํžˆ ๋‚˜๋ˆ ์„œ ์ ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ฐ€ ๋ด๋„ "์–ด ์ด๊ฑฐ ์ด๋ฏธ ๊ณ ์ณ์ง„ ๊ฑฐ ์•„๋‹ˆ์•ผ?"๋ผ๊ณ  ํ•  ๋งŒํ•œ ๋ถ€๋ถ„์ด๋ผ์„œ์š”.

์ œ์•ˆํ•œ ์ˆ˜์ •: ๋””์ฝ”๋”ฉ ์ „์— ๋ง‰์ž

ํ•ด๊ฒฐ ๋ฐฉํ–ฅ์€ ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. PIL์˜ Image.open์€ ํ—ค๋”๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ์ฆ‰ ์‹ค์ œ ํ”ฝ์…€์„ ๋””์ฝ”๋”ฉํ•˜๊ธฐ ์ „์— ์ด๋ฏธ์ง€์˜ ๊ฐ€๋กœ·์„ธ๋กœ ํฌ๊ธฐ๋ฅผ ์ด๋ฏธ ์•Œ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ์ฃ . ๊ทธ๋Ÿฌ๋‹ˆ ๋น„์‹ผ ๋””์ฝ”๋”ฉ์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ํ”ฝ์…€ ์ˆ˜๋ฅผ ๋จผ์ € ํ™•์ธํ•˜๊ณ , ํ•œ๊ณ„๋ฅผ ๋„˜์œผ๋ฉด ๊น”๋”ํ•˜๊ฒŒ ๊ฑฐ๋ถ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

def _check_image_pixels(width: int, height: int) -> None:
    max_pixels = envs.SGLANG_IMAGE_MAX_DECODE_PIXELS.get()
    num_pixels = width * height
    if max_pixels > 0 and num_pixels > max_pixels:
        raise ValueError(
            f"Image is too large to decode: {width}x{height} = {num_pixels} pixels "
            f"exceeds the limit of {max_pixels} pixels. Raise "
            f"SGLANG_IMAGE_MAX_DECODE_PIXELS to allow larger images."
        )

๊ทธ๋ฆฌ๊ณ  ์ด๋ฏธ์ง€๋ฅผ ์—ฌ๋Š” ์ง€์ ์—์„œ ๋””์ฝ”๋”ฉ(.convert())์ด ์ผ์–ด๋‚˜๊ธฐ ์ „์— ์ด ๊ฒ€์‚ฌ๋ฅผ ๋ผ์›Œ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.

image = Image.open(BytesIO(image_bytes))
_check_image_pixels(image.width, image.height)
return image

ํ•œ๊ณ„๊ฐ’์€ SGLANG_IMAGE_MAX_DECODE_PIXELS ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋นผ๋’€์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ PIL์˜ bomb ์ž„๊ณ„๊ฐ’๊ณผ ๋™์ผํ•œ 89,478,485๋กœ ์žก์•˜๊ณ ์š”. OCR์ฒ˜๋Ÿผ ์ •๋ง ํฐ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค๋ค„์•ผ ํ•˜๋Š” ๋ถ„๋“ค์€ ์ด ๊ฐ’์„ ์˜ฌ๋ฆฌ๋ฉด ๋˜๊ณ , 0์œผ๋กœ ๋‘๋ฉด ๊ฒ€์‚ฌ๋ฅผ ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฑฐ๋Œ€ํ•œ ์ด๋ฏธ์ง€๊ฐ€ ๋“ค์–ด์™€๋„ ๋””์ฝ”๋”ฉ ์ „์— ๋ช…ํ™•ํ•œ ValueError๋กœ ๋ง‰ํžˆ๋‹ˆ๊นŒ, 430MB์งœ๋ฆฌ ํ”ฝ์…€ ๋ฒ„ํผ๋ฅผ ๋งŒ๋“ค ์ผ๋„, raw ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๊ทธ์— ํ† ํ•  ์ผ๋„ ์—†์Šต๋‹ˆ๋‹ค. ๋А๋ ค์งˆ ์ผ๋„, ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ„ฐ์งˆ ์ผ๋„ ์—†๊ณ ์š”. vLLM์ด PIL ๊ฒฝ๊ณ ๋กœ ์งง๊ฒŒ ๋Š๊ณ  ๊ฐ€๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•œ ๋™์ž‘์ด ๋ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ํ•œ๊ณ„๋„ ์†”์งํžˆ ์ ์–ด๋’€์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ€๋“œ๋Š” ์œ ํšจํ•œ ํ—ค๋”๊ฐ€ ์žˆ์–ด์•ผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์•„์˜ˆ ๊นจ์ง„ base64๋Š” Image.open ์ž์ฒด๊ฐ€ ๋จผ์ € ํ„ฐ์ง€๋‹ˆ๊นŒ์š”. ๊ทธ์ชฝ์€ ์•ž์„œ ๋ณธ #27451์ด ๋‹ด๋‹นํ•˜๋Š” ์˜์—ญ์ด๊ณ , ์ œ PR์€ "๋ฉ€์ฉกํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ํฐ" ์ผ€์ด์Šค๋ฅผ ๋งก๋Š” ์‹์œผ๋กœ ์—ญํ• ์ด ๊ฐˆ๋ฆฝ๋‹ˆ๋‹ค.

๋งˆ์น˜๋ฉฐ

์ฒ˜์Œ์—” ๊ทธ๋ƒฅ "๋กœ๊ทธ๊ฐ€ ์ข€ ๋งŽ์ด ์ฐํžˆ๋„ค?" ์ •๋„๋กœ ๋ณด์˜€๋Š”๋ฐ, ํŒŒ๊ณ ๋“ค์ˆ˜๋ก ์„ฑ๋Šฅ ๋ฌธ์ œ → ์ •๋ณด ๋…ธ์ถœ → DoS ๊ฐ€๋Šฅ์„ฑ๊นŒ์ง€ ์„ธ ๊ฒน์œผ๋กœ ์—ฎ์—ฌ ์žˆ๋˜ ์‚ฌ๋ก€์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  "์ด๋ฏธ PR๋กœ ๊ณ ์ณ์ง„ ๊ฒƒ ๊ฐ™๋‹ค"๋Š” ์ง€์ ์—์„œ ํ•œ ๋ฒˆ ๋” ์˜์‹ฌํ•ด๋ณธ ๊ฒŒ ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋งž์•˜๊ณ ์š”. ๊ฒ‰๋ณด๊ธฐ ์ฆ์ƒ ํ•˜๋‚˜์— ์›์ธ์ด ํ•˜๋‚˜๋งŒ ์žˆ๋Š” ๊ฑด ์•„๋‹ˆ๋ผ๋Š” ๊ฑธ ๋‹ค์‹œ ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—…ํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜์— ์˜ฌ๋ ค๋’€์Šต๋‹ˆ๋‹ค.

 

Guard image decode against oversized (decompression-bomb) images by hhhhhhhhhhhhhhhhho · Pull Request #28588 · sgl-project/sgl

Motivation Closes #28587. _load_image (python/sglang/srt/utils/common.py) decodes images via Image.open(BytesIO(...)) with no pixel-count guard. The per-model cap (SGLANG_IMAGE_MAX_PIXELS, used by ...

github.com

 

 

[Bug] No pixel-count guard on image decode: oversized images cause ~1GB RSS + 100% CPU per request (pre-inference DoS risk) · I

Checklist I searched related issues but found no solution. The bug persists in the latest version. Issues without environment info and a minimal reproducible demo are hard to resolve and may receiv...

github.com

 

ํ˜น์‹œ ๋น„์Šทํ•˜๊ฒŒ VLM ์„œ๋น™์—์„œ ํฐ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค๋ฃจ์‹ ๋‹ค๋ฉด, ๋“ค์–ด์˜ค๋Š” ์ด๋ฏธ์ง€์˜ ํ”ฝ์…€ ์ˆ˜์— ์ƒํ•œ์„ ๊ฑธ์–ด๋‘์‹œ๋Š” ๊ฑธ ๊ถŒํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ํฌ๊ธฐ๋งŒ ๋ณด๋ฉด ์•ˆ ๋˜๊ณ ์š”, ์••์ถ•์„ ํ’€์—ˆ์„ ๋•Œ์˜ ํ”ฝ์…€ ์ˆ˜๊ฐ€ ์ง„์งœ ๋น„์šฉ์ด๋ผ๋Š” ์ ์„ ๊ผญ ๊ธฐ์–ตํ•˜์‹œ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

728x90
728x90

 

 

๋ฐฐ๊ฒฝ

 

Distilling the Knowledge in a Neural Network

A very simple way to improve the performance of almost any machine learning algorithm is to train many different models on the same data and then to average their predictions. Unfortunately, making predictions using a whole ensemble of models is cumbersome

arxiv.org

 

๋จธ์‹ ๋Ÿฌ๋‹ ๋””์ž์ธํŒจํ„ด์„ ์ฝ๋˜ ์ค‘ 4์žฅ distilling ์— ๊ด€ํ•œ ๊ธฐ๋ฒ•์ด ๋‚˜์™€ ์ฐพ์•„๋ณด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

์š”์•ฝ

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

๊ธฐ์กด์˜ hard label ์€ [1,0,0] ์ฒ˜๋Ÿผ ์ •ํ™•ํ•œ ํ™•๋ฅ ์„ ์•Œ๋ ค์ฃผ์—ˆ๋Š”๋ฐ, ์‹ค์ œ๋กœ๋Š” ๊ณ ์–‘์ด๋ฅผ ๋‹ฎ์€ ๊ฐœ๊ฐ€ ์žˆ์„์ˆ˜๋„ ์žˆ์œผ๋‹ˆ [0.6,0.4,0] ๊ฐ™์€ label ๋„ ์˜๋ฏธ์žˆ๋Š” ์ง€์‹์ผ ์ˆ˜ ์žˆ๋‹ค๋Š”๊ฒƒ์ด ์•„์ด๋””์–ด ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ •๋ฆฌํ•˜์ž๋ฉด ๊ฑฐ๋Œ€ํ•œ ๋ชจ๋ธ์—์„œ ์‚ฐ์ถœ๋œ ๋งˆ์ง€๋ง‰ ๋ ˆ์ด์–ด์˜ ๊ฐ’๋“ค์„ ํ•™์Šต์— ํ™œ์šฉํ•˜๋Š” soft target ์œผ๋กœ ํ™œ์šฉํ•˜์ž๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Distillation

๊ธฐ์กด์˜ ์‹ ๊ฒฝ๋ง์€ ํด๋ž˜์Šค ๋ถ„๋ฅ˜ ํƒœ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ output layer ์— softmax ๋ฅผ ์ทจํ•ด logit ์„ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ T ๋Š” 1๋กœ ์„ธํŒ…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. T๋ฅผ ๋†’๊ฒŒ ํ• ์ˆ˜๋ก ํด๋ž˜์Šค ํ™•๋ฅ ๊ฐ’์ด soft ํ•˜๊ฒŒ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

T ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ํด๋ž˜์Šค ๊ฐ’๋“ค์ด soft ํ•ด์ง€๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ผ๋ฌธ์—์„œ ์ œ์•ˆํ•œ “์ฆ๋ฅ˜” ์˜ ๋ฐฉ์‹์€ ๊ฑฐ๋Œ€ํ•œ ๋ชจ๋ธ์„ teacher model ๋กœ ํŠน์ˆ˜ํ•œ ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค ์ž‘์€ ๋ชจ๋ธ์„ Student(distilled model) ์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค.

t๋ฅผ ์ตœ๋Œ€๋กœ ํ•˜๊ณ , ๊ธฐ์กด์˜ transfer dataset ์„ teacher ๋ชจ๋ธ์— ๋„ฃ๊ณ  soft label (1) ์„ ์–ป์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  student ๋ชจ๋ธ์— inference ํ•ด์„œ soft prediction(2) ์„ ์–ป์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  student model ์—์„œ hard prediction(3)๊ฒฐ๊ณผ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  (1) ์™€ (2) ์˜ cross entropy , (2) ์™€ (3) ์˜ cross entropy ๋ฅผ ๊ฐ€์ค‘ํ•ฉ ํ•˜๋Š” ๋ฐฉ์‹์ด ์„ฑ๋Šฅ์ด ์ข‹๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

cross entropy gradient ์˜ ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ Vi ๋Š” ํฐ ๋ชจ๋ธ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๊ณ  pi ๋Š” soft label ์˜ ํ™•๋ฅ ๊ฐ’์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ qi ์™€ pi ์˜ cross entropy ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ logit ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ๊ทผ์‚ฌํ•˜๋Š” ๋ฌธ์ œ๋กœ ๋ณ€ํ™˜์‹œํ‚ค๊ณ  ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ฆ๋ฅ˜์—์„œ Teacher Model ๊ณผ Student ์˜ ๋ชจ๋ธ output ์ฐจ์ด๋ฅผ ํ™œ์šฉํ•ด gradient ๊ณ„์‚ฐ์„ ํ•˜๋ ค๋Š” ์›€์ง์ž„์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ T๊ฐ€ ์ถฉ๋ถ„ํžˆ ํฌ๋‹ค๋ฉด ํ…Œ์ผ๋Ÿฌ ๊ทผ์‚ฌ๋ฅผ ํ™œ์šฉํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

 

๊ทธ๋ฆฌ๊ณ  logit ์˜ ํ‰๊ท ์ด 0 ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด 0 ์œผ๋กœ ๋ณ€ํ™˜๋˜๋‹ˆ

student model output ์— ๋Œ€ํ•œ Cross entropy ๋ณ€ํ™”์œจ ์ฆ‰ gradient ๋Š” nt^1 ์— ๋ฐ˜๋น„๋ก€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฒฐ๋ก ์€ “T๊ฐ€ ์ถฉ๋ถ„ํžˆ ํฐ ์ƒํ™ฉ์—์„œ logit ๋“ค์˜ ํ‰๊ท ์ด 0 ์œผ๋กœ ์ฃผ์–ด์กŒ๋‹ค๋ฉด, Distillation ์€ 1/nt^2 ์„ ์ตœ์†Œํ™” ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ T ๊ฐ€ ๋‚ฎ๋‹ค๋ฉด gradient ๋ฅผ ์ตœ๋Œ€ํ™” ์‹œํ‚ค๋‹ˆ ๋ชจ๋ธ์ด ๋„ˆ๋ฌด ์ž‘๋‹ค๋ฉด ์ค‘๊ฐ„์ •๋„์˜ temperature ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค

 

 

 

 

๊ธฐ์—ฌ๋„

๋ณธ ๋…ผ๋ฌธ์˜ ๊ฐ€์žฅ ํฐ ๊ธฐ์—ฌ๋Š” ๋‹ค์Œ ์„ธ ๊ฐ€์ง€๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. Soft Target์„ ํ™œ์šฉํ•œ ์ง€์‹ ์ „๋‹ฌ ๋ฐฉ์‹์˜ ์ •์‹ํ™”

๊ธฐ์กด์˜ ๋ถ„๋ฅ˜ ๋ชจ๋ธ์€ ์ •๋‹ต ๋ ˆ์ด๋ธ”(one-hot ๋ฒกํ„ฐ)๋งŒ์„ ํ•™์Šต ์‹ ํ˜ธ๋กœ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณธ ๋…ผ๋ฌธ์€ ๋ชจ๋ธ์˜ ์ถœ๋ ฅ ํ™•๋ฅ  ๋ถ„ํฌ ์ „์ฒด๊ฐ€ ์ง€์‹์ด๋ผ๋Š” ๊ด€์ ์„ ์ œ์‹œํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ Teacher ๋ชจ๋ธ์ด ์ถœ๋ ฅํ•œ softmax ํ™•๋ฅ  ๋ถ„ํฌ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํด๋ž˜์Šค ๊ฐ„ ์œ ์‚ฌ๋„
  • ๋ชจ๋ธ์ด ํ—ท๊ฐˆ๋ฆฌ๋Š” ์ •๋„
  • ๋ฐ์ดํ„ฐ ๋ถ„ํฌ์— ๋Œ€ํ•œ ์•”๋ฌต์  ๊ตฌ์กฐ

์ด๋ฅผ Student ๋ชจ๋ธ์ด ํ•™์Šตํ•˜๋„๋ก ๋งŒ๋“ค๋ฉด, ๋‹จ์ˆœํžˆ ์ •๋‹ต์„ ๋งž์ถ”๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Teacher์˜ ํŒ๋‹จ ๊ตฌ์กฐ ์ž์ฒด๋ฅผ ๋ชจ๋ฐฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋Š” ์ดํ›„ ๋ชจ๋“  Knowledge Distillation ์—ฐ๊ตฌ์˜ ์ถœ๋ฐœ์ ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


2. Temperature ๊ธฐ๋ฐ˜ ํ™•๋ฅ  ๋ถ„ํฌ ์ œ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ œ์•ˆ

๋…ผ๋ฌธ์€ softmax ํ•จ์ˆ˜์— temperature TTT๋ฅผ ๋„์ž…ํ•˜์—ฌ ํ™•๋ฅ  ๋ถ„ํฌ๋ฅผ ์กฐ์ ˆํ•˜๋Š” ๋ฐฉ์‹์„ ์ œ์•ˆํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • T=1์ผ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์ธ softmax
  • T>1์ผ ๊ฒฝ์šฐ ๋ถ„ํฌ๊ฐ€ ํ‰ํƒ„ํ•ด์ง

Temperature๋ฅผ ๋†’์ด๋ฉด ๋ชจ๋ธ์˜ ํ™•์‹ (confidence)์ด ๋‚ฎ์•„์ง€๊ณ , ํด๋ž˜์Šค ๊ฐ„ ์ƒ๋Œ€์  ๊ด€๊ณ„ ์ •๋ณด๊ฐ€ ๋” ์ž˜ ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด Student ๋ชจ๋ธ์€ ๋‹จ์ˆœ ์ •๋‹ต์ด ์•„๋‹ˆ๋ผ ํ™•๋ฅ  ๊ตฌ์กฐ ์ž์ฒด๋ฅผ ํ•™์Šตํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ˆ˜ํ•™์  ๊ทผ์‚ฌ ๋ถ„์„์„ ํ†ตํ•ด, KD๊ฐ€ ๊ฒฐ๊ตญ logit ๊ฐ„ ์ฐจ์ด๋ฅผ ์ค„์ด๋Š” ๋ฌธ์ œ๋กœ ์ˆ˜๋ ดํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์ธ ์  ์—ญ์‹œ ์ค‘์š”ํ•œ ๊ธฐ์—ฌ์ž…๋‹ˆ๋‹ค.


3. ์•™์ƒ๋ธ” ๋ชจ๋ธ์˜ ์••์ถ• ๋ฐฉ๋ฒ• ์ œ์‹œ

๋…ผ๋ฌธ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ชจ๋ธ์„ ์•™์ƒ๋ธ”ํ•˜์—ฌ ์–ป์€ ๊ณ ์„ฑ๋Šฅ Teacher ๋ชจ๋ธ์„ ๋‹จ์ผ Student ๋ชจ๋ธ๋กœ ์••์ถ•ํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹ค์šฉ์  ์˜๋ฏธ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

  • ํ•™์Šต ๋‹จ๊ณ„์—์„œ๋Š” ๋Œ€๊ทœ๋ชจ ๋ชจ๋ธ ์‚ฌ์šฉ
  • ๋ฐฐํฌ ๋‹จ๊ณ„์—์„œ๋Š” ๊ฒฝ๋Ÿ‰ ๋ชจ๋ธ ์‚ฌ์šฉ
  • ์ถ”๋ก  ์†๋„ ํ–ฅ์ƒ ๋ฐ ๋ฆฌ์†Œ์Šค ์ ˆ๊ฐ

์ฆ‰, ํ•™์Šต๊ณผ ๋ฐฐํฌ์˜ ๊ตฌ์กฐ์  ๋ถ„๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ ๊ธฐ๋ฒ•์ด๋ผ๋Š” ์ ์—์„œ ์‚ฐ์—…์  ์˜๋ฏธ๊ฐ€ ๋งค์šฐ ํฝ๋‹ˆ๋‹ค.

์‹คํ—˜๊ฒฐ๊ณผ

MNIST

MNIST ์‹คํ—˜์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ค์ •์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • Teacher ๋ชจ๋ธ: ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ชจ๋ธ์„ ์•™์ƒ๋ธ”ํ•œ ๊ณ ์„ฑ๋Šฅ ๋„คํŠธ์›Œํฌ
  • Student ๋ชจ๋ธ: ์ƒ๋Œ€์ ์œผ๋กœ ์ž‘์€ ๋„คํŠธ์›Œํฌ

๊ฒฐ๊ณผ์ ์œผ๋กœ Student ๋ชจ๋ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

  1. ์ผ๋ฐ˜์ ์ธ hard label ํ•™์Šต ๋Œ€๋น„ ๋” ๋‚ฎ์€ error rate
  2. Teacher์˜ ์„ฑ๋Šฅ์— ๊ทผ์ ‘ํ•œ ์ •ํ™•๋„ ๋‹ฌ์„ฑ
  3. ๊ณผ์ ํ•ฉ ๊ฐ์†Œ ํšจ๊ณผ

ํŠนํžˆ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ๋„ soft target์„ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ฐ˜ํ™” ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋˜๋Š” ๊ฒฝํ–ฅ์„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

์ด๋Š” soft target์ด ์ผ์ข…์˜ regularizer ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.


Speech Recognition

์Œ์„ฑ ์ธ์‹ ์‹คํ—˜์—์„œ๋Š” ๋Œ€๊ทœ๋ชจ acoustic model์„ Teacher๋กœ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

Teacher๋Š” ๋งค์šฐ ๋ณต์žกํ•˜๊ณ  ํฐ ๋„คํŠธ์›Œํฌ์˜€์œผ๋ฉฐ, ์ง์ ‘ ๋ฐฐํฌํ•˜๊ธฐ์—๋Š” ๋น„ํšจ์œจ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

Distillation์„ ์ ์šฉํ•œ Student ๋ชจ๋ธ์€:

  • ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜ ๊ฐ์†Œ
  • ์ถ”๋ก  ์†๋„ ๊ฐœ์„ 
  • ์ •ํ™•๋„๋Š” Teacher์— ๊ทผ์ ‘

ํŠนํžˆ soft target ๊ธฐ๋ฐ˜ ํ•™์Šต์ด hard label ๊ธฐ๋ฐ˜ ํ•™์Šต๋ณด๋‹ค ์•ˆ์ •์ ์ธ ์ˆ˜๋ ด ํŠน์„ฑ์„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

์ด๋Š” KD๊ฐ€ classification๋ฟ ์•„๋‹ˆ๋ผ sequence ๊ธฐ๋ฐ˜ ๋ฌธ์ œ์—๋„ ์ ์šฉ ๊ฐ€๋Šฅํ•จ์„ ๋ณด์—ฌ์ฃผ๋Š” ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

์ฐธ๊ต์ž๋ฃŒ :

[๋…ผ๋ฌธ ๋ฆฌ๋ทฐ] Distilling the Knowledge in a Neural Networkโ€‹

728x90
728x90

๋ฐฐ๊ฒฝ


vllm ์„œ๋ฒ„ ์šด์˜์ค‘ 0.14.0 ๋ฏธ๋งŒ ๋ฒ„์ „์—์„œ RCE ์ทจ์•ฝ์ ์ด ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ํ•ด์„œ ๋ฒ„์ „ ํŒจ์น˜๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค. 
๊ทธ๋Ÿฐ๋ฐ ์ด์ „์— ๋‚˜์™€์žˆ๋˜ ์ทจ์•ฝ์  ์ค‘ ๋ชจ๋ธ ๋กœ๋“œ๋ฅผ ํ†ตํ•ด์„œ RCE ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ธ€์„ ๋ณด
๊ณ  ์ด๊ฒŒ ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ๊ฑด์ง€ ์ฐพ์•„๋ณด๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ์š”, 
๋ฐฐํฌํฌ๋งท์ด๋‚˜ ์ผ๋ถ€ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋ชจ๋ธ๋กœ๋“œ์—์„œ ๊ฐ€์ค‘์น˜๋งŒ ๋ถˆ๋Ÿฌ์˜ค๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ
ํŒŒ์ด์ฌ ์ฝ”๋“œ ๋กœ์ง์„ ํƒˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์–ด ์ •๋ฆฌํ•  ๊ฒธ ๊ธ€์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

 

CVE-2025-66448: vLLM Config Trust Bypass RCE | Miggo

The vulnerability lies in the __init__ method of the Nemotron_Nano_VL_Config class, located in the now-removed file vllm/transformers_utils/configs/nemotron_vl.py. The commit ffb08379d8870a1a81ba82b72797f196838d0c86 addresses the vulnerability by completel

www.miggo.io

 

๋ชจ๋ธ ๋ฐฐํฌ ํฌ๋งท

์ธ๊ณต์ง€๋Šฅ ๋ชจ๋ธ์„ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ํ•™์Šต ์ž์ฒด๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ง€์ ์ด ๋ฐ”๋กœ ๋ฐฐํฌ์ž…๋‹ˆ๋‹ค. ํ•™์Šต๋œ ๋ชจ๋ธ์€ ๋‹จ์ˆœํ•œ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ˆ˜๋ฐฑ MB์—์„œ ์ˆ˜์‹ญ GB์— ์ด๋ฅด๋Š” ๊ฐ€์ค‘์น˜ ๋ฐ์ดํ„ฐ์™€ ์‹คํ–‰ ๊ตฌ์กฐ๋ฅผ ํ•จ๊ป˜ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ ๋ชจ๋ธ์„ ์–ด๋–ค ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๊ณ  ์ „๋‹ฌํ•  ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐ”๋กœ ๋ชจ๋ธ ๋ฐฐํฌ ํฌ๋งท์˜ ์ถœ๋ฐœ์ ์ž…๋‹ˆ๋‹ค.

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

Pytorch .pt .pth

Pytorch ์˜ ๋ชจ๋ธ ์ €์žฅ ๋ฐฉ์‹์€ Python ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ธ๋ฐ ์ด๊ฒƒ์„ ์ง๋ ฌํ™”๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ํฌ๋งท๋„ ๋‹ค๋ฅธ ํฌ๋งท๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ชจ๋ธ ์žฌํ˜„์„ฑ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Research Level ์—์„œ๋Š” ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‚ด๋ถ€์ ์œผ๋กœ pickle ์„ ์‚ฌ์šฉํ•˜๊ณ , ์ฝ”๋“œ๋‚˜ ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ๋ชจ๋‘ ์ง๋ ฌํ™” ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ RCE๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

python ๊ณต์‹œ๋ฌธ์„œ์—์„œ pickle ์€ ์ง๋ ฌํ™”์™€ ์—ญ์ง๋ ฌํ™”๋ฅผ ์œ„ํ•œ ๋ชจ๋“ˆ์ด๋ผ๊ณ  ๋‚˜์™€์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์˜ˆ์‹œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ๋“ค๋„ ๋‚˜์ค‘์— ํ•œ๋ฒˆ ์ฐพ์•„๋ณผ๋ฒ• ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

pickle — Python object serialization

๊ทธ๋ž˜์„œ Pytorch ์˜ ๋ชจ๋ธ์€ ๋ฐฐํฌํ™˜๊ฒฝ์—์„œ๋Š” ์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

pytorch ๋Š” ๋ชจ๋ธ์˜ ํ˜•ํƒœ๋ฅผ ์ €์žฅํ•  ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ €์žฅํ•˜๋ฉด์„œ ์ง๋ ฌํ™”๋ฅผ ํ•˜๋Š”๋ฐ์š”, ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

import torch
#model ๊ฐ์ฒด ๊ทธ๋Œ€๋กœ ์ง๋ ฌํ™”
torch.save(model, 'model.pth')
torch.load('model.pth')

#model ํŒŒ๋ผ๋ฏธํ„ฐ ์ง๋ ฌํ™” 
torch.save(model.state_dict(), 'model.pth')
model.load_state_dict(torch.load('model.pth'))

๋ฐœ์ƒ๊ฐ€๋Šฅํ•œ ์ทจ์•ฝ์ 

# Define model
class TheModelClass(nn.Module):
    def __init__(self):
        super(TheModelClass, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

# Initialize model
model = TheModelClass()

๋งŒ์•ฝ ์œ„์™€ ๊ฐ™์€ ๋ชจ๋ธ์ด ์žˆ๋‹ค๋ฉด torch.save ํ•˜๋Š” ์‹œ์ ์—์„œ TheModelClass ๊ฐ€ ์ง๋ ฌํ™”๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ class ์•ˆ์— ์žˆ๋Š” ํ•จ์ˆ˜๋“ค์— ๋ญ”๊ฐ€ ๋‹ค๋ฅธ ๋ชฉ์ ์˜ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด torch.load() ํ•˜๋Š” ์‹œ์ ์—์„œ ๊ทธ๋Œ€๋กœ ์‹คํ–‰๋˜๊ฒ ์ง€์š”. ์ด๊ฒƒ์ด pytorch ์˜ model.state_dict() ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  save ํ–ˆ์„ ๋•Œ์˜ ๋ฌธ์ œ์  ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ pytorch ๊ถŒ์žฅ์‚ฌํ•ญ์€ ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ์ €์žฅ๋˜๊ฒŒ ํ•˜๋Š” torch.save(model.state_dict,’model.pth’) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Huggingface .safetensors

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

ํ—ค๋”๋Š” JSON ํ˜•์‹์œผ๋กœ ๋œ ํ…์„œ๋“ค์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์ด๊ณ , ๋ฐ์ดํ„ฐ๋ธ”๋ก์€ weight๋“ค์ด ์กด์žฌํ•˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ safetensors ๋ฅผ ์—ด์–ด์„œ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ์š”

https://huggingface.co/Qwen/Qwen3-ASR-1.7B/tree/main

 

Qwen/Qwen3-ASR-1.7B at main

We’re on a journey to advance and democratize artificial intelligence through open source and open science.

huggingface.co

 

์˜ ๋‘๋ฒˆ์งธ safetensors ๊ฐ€ ๋ฐœ๊ฒฌํ•œ๊ฒƒ์ค‘ ์šฉ๋Ÿ‰์ด ์ข€ ์ž‘๋„ค์š”, ์ด๊ฑฐ๋กœ ํ…Œ์ŠคํŠธ ํ•ด๋ณด์…”๋„ ์ข‹์„ ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค.

from safetensors import safe_open

safetensors_file = 
with safe_open(safetensors_file, framework="pt") as f:
  tensor_name = f.keys()
  print(f"tensor list {tensor_name}")

  for key in tensor_name:
    tensor = f.get_tensor(key)
    print(f"tensor name {key} ์˜ ๋ฐ์ดํ„ฐํƒ€์ž… : {tensor.dtype}")
    print(f"tensor name {key} ์˜ shape : {tensor.shape}")
tensor list ['thinker.model.layers.5.mlp.gate_proj.weight', 'thinker.model.layers.5.mlp.up_proj.weight', 'thinker.model.layers.5.post_attention_layernorm.weight', 'thinker.model.layers.5.self_attn.k_norm.weight', 'thinker.model.layers.5.self_attn.k_proj.weight', 'thinker.model.layers.5.self_attn.o_proj.weight', 'thinker.model.layers.5.self_attn.q_norm.weight', 'thinker.model.layers.5.self_attn.q_proj.weight', 'thinker.model.layers.5.self_attn.v_proj.weight', 'thinker.model.layers.6.input_layernorm.weight', 'thinker.model.layers.6.mlp.down_proj.weight', 'thinker.model.layers.6.mlp.gate_proj.weight', 'thinker.model.layers.6.mlp.up_proj.weight', 'thinker.model.layers.6.post_attention_layernorm.weight', 'thinker.model.layers.6.self_attn.k_norm.weight', 'thinker.model.layers.6.self_attn.k_proj.weight', 'thinker.model.layers.6.self_attn.o_proj.weight', 'thinker.model.layers.6.self_attn.q_norm.weight', 'thinker.model.layers.6.self_attn.q_proj.weight', 'thinker.model.layers.6.self_attn.v_proj.weight', 'thinker.model.layers.7.input_layernorm.weight', 'thinker.model.layers.7.mlp.down_proj.weight', 'thinker.model.layers.7.mlp.gate_proj.weight', 'thinker.model.layers.7.mlp.up_proj.weight', 'thinker.model.layers.7.post_attention_layernorm.weight', 'thinker.model.layers.7.self_attn.k_norm.weight', 'thinker.model.layers.7.self_attn.k_proj.weight', 'thinker.model.layers.7.self_attn.o_proj.weight', 'thinker.model.layers.7.self_attn.q_norm.weight', 'thinker.model.layers.7.self_attn.q_proj.weight', 'thinker.model.layers.7.self_attn.v_proj.weight', 'thinker.model.layers.8.input_layernorm.weight', 'thinker.model.layers.8.mlp.down_proj.weight', 'thinker.model.layers.8.mlp.gate_proj.weight', 'thinker.model.layers.8.mlp.up_proj.weight', 'thinker.model.layers.8.post_attention_layernorm.weight', 'thinker.model.layers.8.self_attn.k_norm.weight', 'thinker.model.layers.8.self_attn.k_proj.weight', 'thinker.model.layers.8.self_attn.o_proj.weight', 'thinker.model.layers.8.self_attn.q_norm.weight', 'thinker.model.layers.8.self_attn.q_proj.weight', 'thinker.model.layers.8.self_attn.v_proj.weight', 'thinker.model.layers.9.input_layernorm.weight', 'thinker.model.layers.9.mlp.down_proj.weight', 'thinker.model.layers.9.mlp.gate_proj.weight', 'thinker.model.layers.9.mlp.up_proj.weight', 'thinker.model.layers.9.post_attention_layernorm.weight', 'thinker.model.layers.9.self_attn.k_norm.weight', 'thinker.model.layers.9.self_attn.k_proj.weight', 'thinker.model.layers.9.self_attn.o_proj.weight', 'thinker.model.layers.9.self_attn.q_norm.weight', 'thinker.model.layers.9.self_attn.q_proj.weight', 'thinker.model.layers.9.self_attn.v_proj.weight', 'thinker.model.norm.weight']
tensor name thinker.model.layers.5.mlp.gate_proj.weight ์˜ ๋ฐ์ดํ„ฐํƒ€์ž… : torch.bfloat16
tensor name thinker.model.layers.5.mlp.gate_proj.weight ์˜ shape : torch.Size([6144, 2048])
tensor name thinker.model.layers.5.mlp.up_proj.weight ์˜ ๋ฐ์ดํ„ฐํƒ€์ž… : torch.bfloat16
tensor name thinker.model.layers.5.mlp.up_proj.weight ์˜ shape : torch.Size([6144, 2048])
tensor name thinker.model.layers.5.post_attention_layernorm.weight ์˜ ๋ฐ์ดํ„ฐํƒ€์ž… : torch.bfloat16
tensor name thinker.model.layers.5.post_attention_layernorm.weight ์˜ shape : torch.Size([2048])
tensor name thinker.model.layers.5.self_attn.k_norm.weight ์˜ ๋ฐ์ดํ„ฐํƒ€์ž… : torch.bfloat16
tensor name thinker.model.layers.5.self_attn.k_norm.weight ์˜ shape : torch.Size([128])
tensor name thinker.model.layers.5.self_attn.k_proj.weight ์˜ ๋ฐ์ดํ„ฐํƒ€์ž… : torch.bfloat16
tensor name thinker.model.layers.5.self_attn.k_proj.weight ์˜ shape : torch.Size([1024, 2048])
tensor name thinker.model.layers.5.self_attn.o_proj.weight ์˜ ๋ฐ์ดํ„ฐํƒ€์ž… : torch.bfloat16
tensor name thinker.model.layers.5.self_attn.o_proj.weight ์˜ shape : torch.Size([2048, 2048])
tensor name thinker.model.layers.5.self_attn.q_norm.weight ์˜ ๋ฐ์ดํ„ฐํƒ€์ž… : torch.bfloat16
tensor name thinker.model.layers.5.self_attn.q_norm.weight ์˜ shape : torch.Size([128])
tensor name thinker.model.layers.5.self_attn.q_proj.weight ์˜ ๋ฐ์ดํ„ฐํƒ€์ž… : torch.bfloat16
tensor name thinker.model.layers.5.self_attn.q_proj.weight ์˜ shape : torch.Size([2048, 2048])
tensor name thinker.model.layers.5.self_attn.v_proj.weight ์˜ ๋ฐ์ดํ„ฐํƒ€์ž… : torch.bfloat16
tensor name thinker.model.layers.5.self_attn.v_proj.weight ์˜ shape : torch.Size([1024, 2048])
tensor name thinker.model.layers.6.input_layernorm.weight ์˜ ๋ฐ์ดํ„ฐํƒ€์ž… : torch.bfloat16
tensor name thinker.model.layers.6.input_layernorm.weight ์˜ shape : torch.Size([2048])
tensor name thinker.model.layers.6.mlp.down_proj.weight ์˜ ๋ฐ์ดํ„ฐํƒ€์ž… : torch.bfloat16
tensor name thinker.model.layers.6.mlp.down_proj.weight ์˜ shape : torch.Size([2048, 6144])
tensor name thinker.model.layers.6.mlp.gate_proj.weight ์˜ ๋ฐ์ดํ„ฐํƒ€์ž… : torch.bfloat16
tensor name thinker.model.layers.6.mlp.gate_proj.weight ์˜ shape : torch.Size([6144, 2048])
tensor name thinker.model.layers.6.mlp.up_proj.weight ์˜ ๋ฐ์ดํ„ฐํƒ€์ž… : torch.bfloat16
tensor name thinker.model.layers.6.mlp.up_proj.weight ์˜ shape : torch.Size([6144, 2048])
tensor name thinker.model.layers.6.post_attention_layernorm.weight ์˜ ๋ฐ์ดํ„ฐํƒ€์ž… : torch.bfloat16

weight ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. RCE ๋ฅผ ์›์ฒœ์ ์œผ๋กœ ๋ง‰๊ธฐ ์œ„ํ•ด ์„ค๊ณ„ ๋œ ๋งŒํผ safetensors ๋ชจ๋ธ์ž์ฒด์— ๋Œ€ํ•ด์„œ๋Š” ๋ฐœ๊ฒฌ๋œ ์ทจ์•ฝ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

Microsoft ONNX(Open Neural Network Exchange)

ONNX ๋Š” ๋งŽ์€ ๋จธ์‹ ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ„์˜ ๋ชจ๋ธ์„ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ ์˜คํ”ˆ์†Œ์Šค ํฌ๋งท์ž…๋‹ˆ๋‹ค. ONNX ๋ฅผ ํ†ตํ•ด์„œ ๊ฐœ๋ฐœ์ž๋“ค์€ Pytorch ๋‚˜ Tensorflow ๋“ฑ ์ƒ์ดํ•œ ๋จธ์‹ ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๊ฐœ๋ฐœํ•ด๋„ ONNX ๋ฅผ ํ†ตํ•ด์„œ ์„œ๋กœ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์‰ฝ๊ฒŒ ์ „ํ™˜ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์—ญ์‹œ ๋ฐฐํฌ๋ฅผ ์›ํ™œํ•˜๊ฒŒ ํ•˜์ž๋Š” ์ •์‹ ์—์„œ ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

import torch
import torchvision.models as models
import onnx

# ์‚ฌ์ „ ํ›ˆ๋ จ๋œ PyTorch ๋ชจ๋ธ ๋กœ๋“œ
model = models.resnet18(pretrained=True)
model.eval()

# ๋”๋ฏธ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
x = torch.randn(1, 3, 224, 224, requires_grad=True)

# ๋ชจ๋ธ์„ ONNX ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜
torch.onnx.export(model,               # ์‹คํ–‰ํ•  ๋ชจ๋ธ
                  x,                   # ๋ชจ๋ธ ์ž…๋ ฅ๊ฐ’ (ํŠœํ”Œ ๋˜๋Š” ์—ฌ๋Ÿฌ ์ž…๋ ฅ๊ฐ’์„ ์œ„ํ•œ ํŠœํ”Œ๋„ ๊ฐ€๋Šฅ)
                  "resnet18.onnx",     # ์ €์žฅ๋  ๋ชจ๋ธ์˜ ์ด๋ฆ„
                  export_params=True,  # ๋ชจ๋ธ ํŒŒ์ผ ๋‚ด ํ•™์Šต๋œ ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๋ฅผ ์ €์žฅํ• ์ง€์˜ ์—ฌ๋ถ€
                  opset_version=10,    # ๋ชจ๋ธ์„ ๋ณ€ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉํ•  ONNX ๋ฒ„์ „
                  do_constant_folding=True,  # ์ตœ์ ํ™”: ์ƒ์ˆ˜ ํด๋”ฉ์„ ์ˆ˜ํ–‰ํ• ์ง€ ์—ฌ๋ถ€
                  input_names = ['input'],   # ๋ชจ๋ธ์˜ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ์ด๋ฆ„
                  output_names = ['output'], # ๋ชจ๋ธ์˜ ์ถœ๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ์ด๋ฆ„
                  dynamic_axes={'input' : {0 : 'batch_size'},    # ๋ฐฐ์น˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ์ž…๋ ฅ ์ฐจ์›
                                'output' : {0 : 'batch_size'}})  # ๋ฐฐ์น˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ์ถœ๋ ฅ ์ฐจ์›

ONNX ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ์ทจ์•ฝ์ 

์ตœ๊ทผ๊นŒ์ง€๋Š” ONNX ์˜ ๋ณด๊ณ ๋œ ์ทจ์•ฝ์ ๋“ค์—์„œ ONNX ์ž์ฒด์˜ ์ทจ์•ฝ์ ์€ ๊ฑฐ์˜ ์—†๋‹ค๊ณ  ํ•ด๋„ ๋ ์ •๋„๋กœ ์—†์—ˆ๊ณ , ๊ฒŒ๋‹ค๊ฐ€ RCE ๋Š” ์ „ํ˜€ ๋ณผ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋งˆ์ €๋„ C/C++ ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์œ ํ˜•์˜ ์ทจ์•ฝ์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค๋Š”๋ฐ์š”, ์ตœ๊ทผ ๋ฐœํ‘œ ๋œ Path Traveling ์ทจ์•ฝ์ ๋„ ONNX ํฌ๋งท์˜ ๋ฌธ์ œ๋ผ๊ธฐ๋ณด๋‹ค๋Š”, ONNX ๋ชจ๋ธ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌํ˜„์˜ ์ทจ์•ฝ์ ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

 

ONNX Path Traversal Vulnerability Exploited | Matt T.๋‹˜์ด ํ† ํ”ฝ์— ๋Œ€ํ•ด ์˜ฌ๋ฆผ | LinkedIn

CVE-2025-51480 Path Traversal vulnerability in onnx.external_data_helper.save_external_data in ONNX 1.17.0 allows attackers to overwrite arbitrary files by supplying crafted external_data.location paths containing traversal sequences, bypassing intended di

www.linkedin.com

 

GGUF / GGML

GGML (Georgi Gerganov Machine Learning Format)

GGML์€ Georgi Gerganov๊ฐ€ ๊ฐœ๋ฐœํ•œ ๊ฒฝ๋Ÿ‰ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ์„ ํฌํ•จํ•œ ์‹ ๊ฒฝ๋ง ๋ชจ๋ธ์„ CPU ํ™˜๊ฒฝ์—์„œ ํšจ์œจ์ ์œผ๋กœ ์ถ”๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ C/C++ ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. Hugging Face์˜ ์†Œ๊ฐœ ๊ธ€์—์„œ๋„ ๊ฐ•์กฐํ•˜๋“ฏ, GGML์€ ๊ธฐ์กด ๋”ฅ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ฐ–๋Š” ๋ณต์žก์„ฑ๊ณผ ๋ฌด๊ฑฐ์šด ์˜์กด์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๋จธ์‹ ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ์ธ PyTorch๋‚˜ TensorFlow๋Š” ๋งค์šฐ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ๋Œ€๊ทœ๋ชจ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ๊ณผ ๋ณต์žกํ•œ ๋นŒ๋“œ ํ™˜๊ฒฝ์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐœ์ธ PC๋‚˜ ๋‚ด๋ถ€๋ง, ์˜คํ”„๋ผ์ธ ํ™˜๊ฒฝ, ํ˜น์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ œํ•œ๋œ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋ถ€๋‹ด์œผ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค. GGML์€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€ ์˜์กด์„ฑ์„ ๊ฑฐ์˜ ๊ฐ–์ง€ ์•Š๋Š” ๊ตฌ์กฐ, ๊ทธ๋ฆฌ๊ณ  ๋‹จ์ˆœํ•œ C ์ฝ”๋“œ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

GGML์˜ ํ•ต์‹ฌ ์ฒ ํ•™์€ “์ž‘๊ณ , ๋‹จ์ˆœํ•˜๋ฉฐ, ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์‹คํ–‰”์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ GGML์€ ๋ช‡ ๊ฐœ์˜ ์†Œ์Šค ํŒŒ์ผ๋งŒ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ปดํŒŒ์ผ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๊ธฐ ์—ญ์‹œ ๋งค์šฐ ์ž‘์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ Python ๋Ÿฐํƒ€์ž„์ด๋‚˜ ๋Œ€ํ˜• ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด๋„ ๋ชจ๋ธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ™˜๊ฒฝ ์ด์‹์„ฑ์ด ๋งค์šฐ ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค. Linux, macOS, Windows๋Š” ๋ฌผ๋ก ์ด๊ณ  ARM ์•„ํ‚คํ…์ฒ˜๋‚˜ Apple Silicon ํ™˜๊ฒฝ์—์„œ๋„ ๋น„๊ต์  ์‰ฝ๊ฒŒ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ํ•˜๋‚˜์˜ ์ค‘์š”ํ•œ ํŠน์ง•์€ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์ž…๋‹ˆ๋‹ค. GGML์€ ํ…์„œ ํ‘œํ˜„๊ณผ ์—ฐ์‚ฐ์—์„œ ๋ถˆํ•„์š”ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , CPU ์บ์‹œ ์นœํ™”์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ GGML์ด ๋„๋ฆฌ ์ฃผ๋ชฉ๋ฐ›๊ฒŒ ๋œ ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ๊ฐ•๋ ฅํ•œ ์–‘์žํ™”(quantization) ์ง€์›์ž…๋‹ˆ๋‹ค. float32 ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์„ int8, int5, int4 ์ˆ˜์ค€์œผ๋กœ ์••์ถ•ํ•ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํฌ๊ฒŒ ์ค„์ด๋ฉด์„œ๋„, ์ถ”๋ก  ์„ฑ๋Šฅ์„ ์‹ค์šฉ์ ์ธ ์ˆ˜์ค€์œผ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํŠน์„ฑ ๋•๋ถ„์— GGML์€ ํ•™์Šต๋ณด๋‹ค๋Š” ์ถ”๋ก  ์ค‘์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ํ•™์Šต๋œ ๋ชจ๋ธ์„ ๊ฐ€๋Šฅํ•œ ํ•œ ์ ์€ ์ž์›์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋ฉฐ, ์‹ค์ œ๋กœ llama.cpp, whisper.cpp, GPT4All, LM Studio, Ollama์™€ ๊ฐ™์€ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋“ค์ด GGML์„ ์ €์ˆ˜์ค€ ์—ฐ์‚ฐ ์—”์ง„์œผ๋กœ ํ™œ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ GGML์€ ๋‹จ์ˆœํ•œ ๋ชจ๋ธ ํฌ๋งท์ด๋ผ๊ธฐ๋ณด๋‹ค๋Š”, ๋ชจ๋ธ ์‹คํ–‰์„ ๋‹ด๋‹นํ•˜๋Š” ์ €์ˆ˜์ค€ ๋Ÿฐํƒ€์ž„์— ๊ฐ€๊น๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์กฐ์ ์œผ๋กœ ๋ณด๋ฉด GGML์€ ๋‚ด๋ถ€์— ํ…์„œ์™€ ์—ฐ์‚ฐ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” context๋ฅผ ๋‘๊ณ , ์—ฐ์‚ฐ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ CPU, CUDA, Metal ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฑ์—”๋“œ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋ฐฑ์—”๋“œ๋ณ„๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ์—ฐ์‚ฐ ์Šค์ผ€์ค„๋ง์„ ๋ถ„๋ฆฌํ•ด ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ ๋•๋ถ„์— ๊ฐ€๋ณ์ง€๋งŒ ๋‹จ์ˆœํ•œ ์ˆ˜์ค€์„ ๋„˜๋Š” ์œ ์—ฐ์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ GGML์€ ์ด๋Ÿฌํ•œ ์žฅ์ ๊ณผ ํ•จ๊ป˜ ํ•œ๊ณ„๋„ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. C/C++ ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŠน์„ฑ์ƒ ์‚ฌ์šฉ ๋‚œ์ด๋„๊ฐ€ ๋†’๊ณ , Python ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ์— ์ต์ˆ™ํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์ง„์ž… ์žฅ๋ฒฝ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ชจ๋ธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ‘œํ˜„์ด ์ œํ•œ์ ์ด๊ณ , ํ† ํฌ๋‚˜์ด์ €๋‚˜ specia1 token, rope ์„ค์ •๊ณผ ๊ฐ™์€ ๋ถ€๊ฐ€ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์—๋Š” ๋ถˆํŽธํ•จ์ด ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•œ๊ณ„๋Š” ๋ชจ๋ธ์ด ๋ณต์žกํ•ด์งˆ์ˆ˜๋ก ์ ์  ๋” ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฐ๊ฒฝ ์†์—์„œ GGML์€ ์ ์ฐจ GGUF(GGML Unified Format)๋กœ ๋ฐœ์ „ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. GGUF๋Š” GGML์˜ ์ฒ ํ•™์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„, ๋ชจ๋ธ ์‹คํ–‰์— ํ•„์š”ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‹ค ๋ช…ํ™•ํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋‹ด๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ํฌ๋งท์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ llama.cpp ์ƒํƒœ๊ณ„์—์„œ๋„ GGML๋ณด๋‹ค๋Š” GGUF ์‚ฌ์šฉ์ด ๊ถŒ์žฅ๋˜๊ณ  ์žˆ์œผ๋ฉฐ, GGML์€ ์ ์ฐจ ๋ ˆ๊ฑฐ์‹œ ํฌ๋งท์˜ ์œ„์น˜๋กœ ์ด๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

GGUF (GGML Unified Format)

GGUF๋Š” GGML์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๊ฐœ์„ ๋œ ํฌ๋งท์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ 'ํ†ตํ•ฉ๋œ(Unified)' ํ˜•์‹์„ ์ง€ํ–ฅํ•˜๋ฉฐ, ๋” ๋งŽ์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๊ณ  ํ™•์žฅ์„ฑ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์„ ๋ถ™์ผ๋•Œ์—๋„

<BaseName><SizeLabel><FineTune><Version><Encoding><Type><Shard>.gguf ๋ผ๋Š” ๋„ค์ด๋ฐ ๊ทœ์น™์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๊ฒŒ ํŒŒ์ผ๊ตฌ์กฐ๊ฐ€ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

GGUF ๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ์ด์•ผ๊ธฐ๋“ค์ด ์žˆ๋Š”๋ฐ ๋”ฐ๋กœ ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๋ก ์€ GGML ์€ ํŠธ๋žœ์Šคํฌ๋จธ ๋ชจ๋ธ ์„œ๋น™ ํŠนํ™” ๋ฐฐํฌ ํฌ๋งท์ด๊ณ , GGUF ๋Š” ์—ฌ๊ธฐ์„œ ๊ด€๋ฆฌ์ ์ธ ์ธก๋ฉด์„ ๊ณ ๋„ํ™”ํ•œ ํฌ๋งท์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

GGML /GGUF ์˜ ์ทจ์•ฝ์  ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ

GGML ์ด๋‚˜ GGUF ๋‘˜๋‹ค Python ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๊ณ  ๊ฐ™์€ ์˜๋ฏธ๋กœ pickle ์ด๋‚˜ ์–ด๋–ค ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ชจ๋ธ ์ž์ฒด๊ฐ€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค๋˜์ง€์˜ ์ทจ์•ฝ์ ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

ํฌ๋งท / ํ˜•ํƒœ ์ฃผ ์‚ฌ์šฉ์ฒ˜ ํฌํ•จ ๋‚ด์šฉ ์ฝ”๋“œ ์‹คํ–‰ ๊ฐ€๋Šฅ์„ฑ ๋ณด์•ˆ ์œ„ํ—˜๋„ ์žฅ์  ๋‹จ์  ๊ถŒ์žฅ ์‚ฌ์šฉ ์—ฌ๋ถ€
safetensors HF, ๋‚ด๋ถ€๋ง, ๋ณด์•ˆ ํ™˜๊ฒฝ ์ˆœ์ˆ˜ ํ…์„œ ๊ฐ€์ค‘์น˜ โŒ ์—†์Œ โญ ๋งค์šฐ ๋‚ฎ์Œ pickle ๋ฏธ์‚ฌ์šฉ, fast mmap, ์•ˆ์ „ ๊ฐ€์ค‘์น˜๋งŒ ์ €์žฅ โœ… ๊ฐ•๋ ฅ ๊ถŒ์žฅ
PyTorch .pt / .pth ์—ฐ๊ตฌ/๊ฐœ๋ฐœ Python ๊ฐ์ฒด + ๊ฐ€์ค‘์น˜ ๐Ÿ”ฅ ๊ฐ€๋Šฅ ๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ ์ €์žฅ ์œ ์—ฐ์„ฑ pickle ๊ธฐ๋ฐ˜ RCE โŒ ๋ฐฐํฌ ๊ธˆ์ง€
HF .bin (pytorch_model.bin) HF ๊ตฌ๋ฒ„์ „ pickle ๊ฐ€์ค‘์น˜ ๐Ÿ”ฅ ๊ฐ€๋Šฅ ๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ ํ˜ธํ™˜์„ฑ ์‚ฌ์‹ค์ƒ .pt โŒ
ONNX .onnx ์ถ”๋ก /์„œ๋น™ ์ •์  ๊ทธ๋ž˜ํ”„ + ๊ฐ€์ค‘์น˜ โŒ โญ ๋‚ฎ์Œ ํ”„๋ ˆ์ž„์›Œํฌ ๋…๋ฆฝ, ๋น ๋ฆ„ ๋™์  ๊ตฌ์กฐ ์ œํ•œ โœ… ์ถ”๋ก ์šฉ
TorchScript .ts / .pt PyTorch ์„œ๋น™ IR ๊ทธ๋ž˜ํ”„ + ๊ฐ€์ค‘์น˜ โš ๏ธ ์ œํ•œ์  โš ๏ธ ์ค‘๊ฐ„ Python ์ œ๊ฑฐ ๋””๋ฒ„๊น… ์–ด๋ ค์›€ โš ๏ธ ์ œํ•œ์ 
TensorFlow SavedModel TF ์„œ๋น™ ๊ทธ๋ž˜ํ”„ + ๊ฐ€์ค‘์น˜ โŒ โญ ๋‚ฎ์Œ TF Serving ์ตœ์  TF ์ข…์† โš ๏ธ
HDF5 .h5 Keras ๊ฐ€์ค‘์น˜ + ๊ตฌ์กฐ โŒ โญ ๋‚ฎ์Œ ๋‹จ์ˆœ ๋Œ€๊ทœ๋ชจ ๋ชจ๋ธ ํ•œ๊ณ„ โš ๏ธ
GGUF / GGML llama.cpp ์–‘์žํ™” ๊ฐ€์ค‘์น˜ โŒ โญ ๋‚ฎ์Œ CPU ์นœํ™” ํ•™์Šต ๋ถˆ๊ฐ€ โœ… ๋กœ์ปฌ
MLflow model MLOps ๋ชจ๋ธ + ๋ฉ”ํƒ€ + ์ฝ”๋“œ ๐Ÿ”ฅ ๊ฐ€๋Šฅ ๐Ÿ”ฅ๐Ÿ”ฅ ๊ด€๋ฆฌ ํŽธํ•จ ์ฝ”๋“œ ํฌํ•จ โš ๏ธ ๊ฒ€์ฆ ํ•„์ˆ˜
Triton model repo NVIDIA Triton ๋ชจ๋ธ + config โŒ โญ ๋‚ฎ์Œ ๊ณ ์„ฑ๋Šฅ ์„œ๋น™ ์„ค์ • ๋ณต์žก โœ…
Docker image ๋ฐฐํฌ ๋ชจ๋ธ + ์ฝ”๋“œ + OS ๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ ๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ ์žฌํ˜„์„ฑ ๊ณต๊ฒฉ๋ฉด ํผ โš ๏ธ ๋‚ด๋ถ€๊ฒ€์ฆ
HF repo (์ „์ฒด) ๊ณต์œ  ๊ฐ€์ค‘์น˜ + Python ๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ ๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ ํŽธ์˜์„ฑ trust_remote_code โŒ ๋ฌด๊ฒ€์ฆ
LoRA / Adapter ํŒŒ์ธํŠœ๋‹ ๊ฐ€์ค‘์น˜ delta โŒ โญ ๋‚ฎ์Œ ๊ฒฝ๋Ÿ‰ base ํ•„์š” โœ…

๊ทธ๋ž˜์„œ ๊ฒฐ๋ก ์€ ๋ชจ๋ธ์€ ์—ฌ๋Ÿฌ ์š”๊ตฌ์‚ฌํ•ญ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ†ตํ•ฉ๋œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ , ๊ทธ๊ณณ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ทจ์•ฝ์ ์€ ๋Œ€์ฒด๋กœ pickle ์˜ ์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ธฐ๋Œ€๋˜๋Š” ๋ฌธ์ œ์ ๋“ค์ด์˜€์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ pickle ์˜ ์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, RCE ๊ฐ™์€ ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๋“ค์€ ๋ชจ๋ธ ์ž์ฒด์—์„œ ์ƒ๊ธฐ์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋ชจ๋ธ ๋Ÿฐํƒ€์ž„ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ทจ์•ฝ์ ๋“ค์€ ์ „ํ˜€ ๋‹ค๋ฅธ ์˜์—ญ์ด๋‹ˆ ์‚ฌ์šฉ์— ์ฐธ๊ณ ํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ‹€๋ฆฐ ์ •๋ณด๊ฐ€ ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”!

728x90
728x90

 

 

 

 

 

Learning data driven discretizations for partial differential equations

The numerical solution of partial differential equations (PDEs) is challenging because of the need to resolve spatiotemporal features over wide length and timescales. Often, it is computationally intractable to resolve the finest features in the solution.

arxiv.org

 

๋ฐฐ๊ฒฝ

 

๋จธ์‹ ๋Ÿฌ๋‹ ๋””์ž์ธํŒจํ„ด 4์žฅ ๋ชจ๋ธ ํ•™์Šต ๋””์ž์ธํŒจํ„ด ์ฝ๋˜ ์ค‘ ๊ณผ์ ํ•ฉ์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋ก€์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ซํžŒ ํ•ด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์ฆ‰ ๋ฐ์ดํ„ฐ๊ฐ€ ํ˜„์‹ค์„ 100% ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ณ„์‚ฐ overhead ๊ทน๋ณต์„ ์œ„ํ•ด ML ์„ค๊ณ„๊ฐ€ ๋„์›€์ด ๋˜๋Š”๋ฐ, ์ด๋•Œ ๊ณผ์ ํ•ฉ์ด ๋” ์ ํ•ฉํ•˜๋‹ค๋Š” ๋‚ด์šฉ์„ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ uniform approximation theorem ์—์„œ ํ•˜๋‚˜์˜ hidden layer ์™€ activation function ์ด ์žˆ๋Š” Network ์— ์˜ํ•ด ๊ทผ์‚ฌ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‹คํ—˜์ด ๋งŽ์ด ์ฆ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์˜ ์—ฐ์žฅ์„ ์œผ๋กœ ์กฐ๊ธˆ ๋’ค ํ˜„์‹ค์„ธ๊ณ„์—์„œ๋Š” ๋ชจ๋“  ์ž…๋ ฅ์„ ํ…Œ์ด๋ธ”๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋‹ˆ ์ž…๋ ฅ ๊ณต๊ฐ„์„ ์ƒ˜ํ”Œ๋งํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๋ชฌํ…Œ์นด๋ฅผ๋กœ ์ ‘๊ทผ๋ฐฉ์‹์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

 

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

 

๊ทธ๋ฆฌ๊ณ  ๋ณธ ํฌ์ŠคํŒ…์—์„œ ๋ฆฌ๋ทฐํ•  ๋…ผ๋ฌธ์ด ๋ฐ”๋กœ ์ด์— ๋Œ€ํ•œ ํšจ๊ณผ๋ฅผ ์ž˜ ๋ณด์—ฌ์ค€ Learning data driven discretization for partial differential equations ์ž…๋‹ˆ๋‹ค. 

 

์š”์•ฝ

PDE ์˜ ์ˆ˜์น˜์  ์†”๋ฃจ์…˜์€ ๋‹ค์ฐจ์›์˜ ์‹œ๊ณต๊ฐ„์  ํ”ผ์ฒ˜๋“ค์„ ์ž˜ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ( ์ฐจ์›์˜ ์ €์ฃผ ) ์ด๊ฑธ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋„ˆ๋ฌด ๋งŽ์€ ์–‘์˜ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ์š”. ๊ธฐ์กด์˜ ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์ข€ ์ œ๋Œ€๋กœํ•˜์ง€ ๋ชปํ• ์ง€๋ผ๋„ ๊ทผ์‚ฌ์‹œํ‚ค๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๊ทผ๋ฐ ๋ฌผ๋ก  ๊ทธ๊ฒƒ๋„ ์–ด๋งˆ์–ด๋งˆํ•˜๊ฒŒ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•ด๋‹น ๋…ผ๋ฌธ์—์„œ๋Š” ํ˜„์ƒ์— PDE ๋ฅผ ๊ทผ์‚ฌ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ data driven ๋ฐฉ์ •์‹์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. PDE๋ฅผ ์ผ๋ฐ˜์ ์œผ๋กœ ์•Œ๋ ค์ง„ ๋ฐฉ์ •์‹์— ๊ธฐ๋ฐ˜ํ•ด์„œ neural network ๋ฅผ ์‚ฌ์šฉํ•ด ์ฐจ์›์˜ ์ €์ฃผ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋‹ค์‹œ ์ •๋ฆฌํ•˜์ž๋ฉด ๊ธฐ์กด PDE ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ ์ ‘๊ทผ์€ ์ž˜ ์ •์˜๋œ PDE๋ฅผ ์–ผ๋งˆ๋‚˜ ์ •ํ™•ํ•˜๊ฒŒ ๊ทผ์‚ฌ์‹œํ‚ฌ ๊ฒƒ์ธ์ง€ ์˜€์ง€๋งŒ, ์ด์ œ๋Š” PDE๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ๊ทผ์‚ฌํ•˜์ง€ ์•Š๊ณ  ์ด์‚ฐํ™”๋œ ์—ฐ์‚ฐ์ž๋ฅผ ๋ฐ์ดํ„ฐ์— ๊ธฐ๋ฐ˜ํ•ด ํ•™์Šต์‹œํ‚ค์ž๋Š” ๊ด€์ ์ž…๋‹ˆ๋‹ค.

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

 

 

์ปดํ“จํ„ฐ๋Š” ์—ฐ์†์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋‹ค๋ฃฐ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” grid ์œ„์— ์ด์‚ฐ์ ์œผ๋กœ ํ‘œ์‹œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ๋Œ€ํ•œ ์—ฐ์†์ ์œผ๋กœ ๋‹ค๋ฃจ๋ ค๊ณ  ๋…ธ๋ ฅํ•˜์ง€์š”. ์ด๋•Œ ์œ ํ•œ์ฐจ๋ถ„ (FD) ์„ ํ†ตํ•ด์„œ ์‹œ๊ฐ„์— ๋Œ€ํ•œ ODE Form ์œผ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

์—ฌ๊ธฐ์„œ F ๋Š” ์ด์ œ ์ด๊ฒƒ๋“ค์„ gird ์ฃผ๋ณ€์˜ ๊ฐ’๋“ค๋กœ ๊ทผ์‚ฌํ•ด์•ผ ํ•˜๋Š”๋ฐ,

์—ฌ๊ธฐ์„œ a(i)^n ์„ ์‹ ๊ฒฝ๋ง์œผ๋กœ ํ•™์Šตํ•ด์„œ ๊ตญ์†Œ์  ๊ตฌ์กฐ์— ๋”ฐ๋ผ ํ˜„์‹ค์— ๋‹ค๊ฐ€๊ฐ€๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๊ณ ํ•ด์ƒ๋„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฐ์ดํ„ฐ๋กœ ํ•™์Šต ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ์‹์— ๋“ฑ์žฅํ•˜๋Š” ๋ฏธ๋ถ„ํ•ญ๋“ค์˜ ์ด์‚ฐ๊ทผ์‚ฌ์‹( ์—ฌ๊ธฐ์„œ๋Š” sigma alpha ^ n v(i) ) ์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์ด ๊ณ„์‚ฐ๋น„์šฉ ์ธก๋ฉด์—์„œ์˜ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ์ด๊ฑด ์ „์ฒด ํ•„๋“œ๊ฐ€ ์•„๋‹Œ ์ž‘์€ ๋ถ€๋ถ„์—์„œ ๊ณ ํ•ด์ƒ๋„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•ด ์™„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ›จ์”ฌ ํฐ ์‹œ์Šคํ…œ์—[์„œ๋„ ๋‚ฎ์€ ๊ณต๊ฐ„์—์„œ ์–ป์€ ๋ฐ์ดํ„ฐ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

→ ์ž‘์€ ์ง€์—ญ์—์„œ solution manifold ์œ„์˜ ์‹ค์ œ ํ˜„์ƒ์„ ์ž˜ ๊ทผ์‚ฌํ•˜๋ฉด , ๊ทธ ๊ตญ์†Œ์  ์ด์‚ฐํ™” ๊ทœ์น™(ML ๋ชจ๋ธ)์ด ๋” ํฐ ์‹œ์Šคํ…œ์—์„œ๋„ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์™„๋ฒฝํ•œ ์ ํ•ฉ์ด ์•„๋‹ˆ๋ผ ๊ตญ์†Œ ์˜์—ญ์—์„œ ์‹ค์ œ ๋ฌผ๋ฆฌ๊ณ„์˜ ์—ญํ•™ ์ƒํƒœ๋ฅผ ์ž˜ ํฌ์ฐฉ(๊ทผ์‚ฌ)ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์‹ ๊ฒฝ๋ง์„ ํ™œ์šฉํ•ด ์‹ค์ œ ํ˜„์ƒ์— ๊ธฐ์—ฌํ•˜๋Š” ๋น„๊ต๋ฅผ ํ•ด๋ณด๋ฉด ๋ฐฉ์ •์‹์œผ๋กœ ๊ทผ์‚ฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋” ์ข‹๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

 

๊ธฐ์—ฌ๋„

์ด ๋…ผ๋ฌธ์˜ ๊ฐ€์žฅ ํฐ ๊ธฐ์—ฌ๋Š” PDE ํ•ด๋ฒ• ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ, PDE ์ด์‚ฐํ™”๋ฅผ ํ•™์Šต์˜ ๋Œ€์ƒ์œผ๋กœ ์žฌ์ •์˜ํ–ˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด ์ˆ˜์น˜ํ•ด์„์€ ๋ฏธ๋ถ„ ์—ฐ์‚ฐ์ž๋ฅผ ๋ณดํŽธ์ ์œผ๋กœ ๊ทผ์‚ฌํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ๋Š”๋ฐ์š”, ๋ณธ ์—ฐ๊ตฌ๋Š” ํ•ด๊ฐ€ ์‹ค์ œ๋กœ ์กด์žฌํ•˜๋Š” solution manifold ์œ„์—์„œ๋งŒ ์œ ํšจํ•œ ๊ตญ์†Œ ์ด์‚ฐํ™” ๊ทœ์น™์„ ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ์—ฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒซ์งธ, equation-specific discretization์ด๋ผ๋Š” ๊ฐœ๋…์„ ๋ช…ํ™•ํžˆ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์œ ํ•œ์ฐจ๋ถ„ ๊ณ„์ˆ˜๋Š” ๋ณดํŽธ์ ์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ธฐ์กด ๊ด€์ ์—์„œ ๋ฒ—์–ด๋‚˜, ๋ฐฉ์ •์‹๊ณผ ๊ตญ์†Œ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ์ด์‚ฐํ™” ๊ณ„์ˆ˜๋ฅผ ํ—ˆ์šฉํ•จ์œผ๋กœ์จ under-resolved ์กฐ๊ฑด์—์„œ๋„ ๋†’์€ ์ •ํ™•๋„๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋‘˜์งธ, solution manifold ๊ธฐ๋ฐ˜ ํ•™์Šต ๊ด€์ ์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์‹ ๊ฒฝ๋ง์€ ์ „์ฒด ํ•จ์ˆ˜ ๊ณต๊ฐ„์„ ๊ทผ์‚ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•œ ํ•ด๊ฐ€ ๋†“์ด๋Š” ์ €์ฐจ์› ๋‹ค์–‘์ฒด(manifold)๋งŒ์„ ํŒŒ๋ผ๋ฏธํ„ฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๊ฒฉ์ž ํ•ด์ƒ๋„๋ฅผ ๋‚ฎ์ถ”๋”๋ผ๋„ ์‹ค์ œ ๋ฌผ๋ฆฌ์  ๋™์—ญํ•™์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์ž…๋‹ˆ๋‹ค.

์‹คํ—˜๊ฒฐ๊ณผ

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

burger’s equation ์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์“ฐ์ž…๋‹ˆ๋‹ค.

 

burger’s equation ์€ ํ•ด์ƒ๋„๋ฅผ ๋งŽ์ด ๋‚ฎ์ถ˜ ๊ฒฝ์šฐ์—๋„ ๋ฐœ์‚ฐํ•˜์ง€ ์•Š๊ณ  ์˜ค์ฐจ๊ฐ€ ์ค„์–ด๋“ค์—ˆ์œผ๋ฉฐ ์ถฉ๊ฒฉํŒŒ์˜ ์œ„์น˜ํ™” ํ˜•ํƒœ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ ๊ฒฝ๋ง์ด ์ถฉ๊ฒฉํŒŒ์™€ ๊ฐ™์€ ๋น„์„ ํ˜•์ ์ด๊ณ  ์˜ˆ์ธกํ•˜๊ธฐ ํž˜๋“ค๋ณด์ด๋Š” ๋น„์„ ํ˜•PDE์—์„œ๋„ ๊ทธ ๊ตฌ์กฐ๋ฅผ ์ž˜ ๋ฐ˜์˜ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ์‹คํ—˜์œผ๋กœ ์ถ”๊ฐ€์ ์œผ๋กœ ํ•™์Šต ๋„๋ฉ”์ธ๋ณด๋‹ค ํ›จ์”ฌ ํฐ ๋„๋ฉ”์ธ์—์„œ๋„ ์ž˜ ์ž‘๋™ํ•จ์„ ์ฆ๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋…ผ๋ฌธ์„ ์ฝ์œผ๋ฉฐ ์ดˆ๋ฐ˜์— ๊ตญ์†Œ์  ์˜์—ญ์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋กœ๋งŒ ํ•™์Šต์‹œ์ผฐ๋Š”๋ฐ, ๊ณผ์—ฐ ๋ชจ๋“  ์˜์—ญ์—์„œ ์ž˜ ์ž‘๋™ํ• ๊นŒ? ๊ฑฑ์ •ํ–ˆ์ง€๋งŒ, trainig domain ๋ณด๋‹ค 10๋ฐฐ ๋” ํฐ ๊ณต๊ฐ„์—์„œ๋„ burger’s equation ์„ ํ’€์–ด๋ณด์•˜์Œ์—๋„ ์ž˜ ์ž‘๋™ํ•˜์—ฌ ์ผ๋ฐ˜ํ™” ํ–ˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์€ ์‹คํ—˜๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์ด์‚ฐํ™”๊ฐ€ ์ „ํ†ต์  ์ˆ˜์น˜ํ•ด๋ฒ•๋ณด๋‹ค ์ •๊ตํ•˜๊ณ  ์‰ฌ์šฐ๋ฉฐ ์•ˆ์ •์ ์ด๋ผ๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

 

 

ํ–ฅํ›„ ์—ฐ๊ตฌ ๋ฐฉํ–ฅ 

์—ฐ๊ตฌ์—์„œ๋Š” ๋‘๊ฐ€์ง€ ์ฑŒ๋ฆฐ์ง€๊ฐ€ ๋‚จ์•„์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ๋ฒˆ์งธ๋กœ, ์†๋„์ž…๋‹ˆ๋‹ค. FD ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋งŽ์€ convolution ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ €์ž๋“ค์€ ์ด๊ฒƒ๋ณด๋‹ค ๋‹ค๋ฅธ ๋จธ์‹ ๋Ÿฌ๋‹ ์ ‘๊ทผ๋ฒ•์ด ํ›จ์”ฌ ๋” ๋น ๋ฅผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์žˆ๊ณ , pre-trained linear filter ๊ฐ€ ์ˆ˜์‹ญ๋ฐฐ ์ด์ƒ์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๋ณด์ธ๋ฐ”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘๋ฒˆ์งธ๋Š” ๊ณ ์ฐจ์› ๋ฌธ์ œ์™€ higher dimensional problem ์ž…๋‹ˆ๋‹ค. 2,3์ฐจ์›์—์„œ๋Š” dimension ์ด ์ œ๊ณฑ, ์„ธ์ œ๊ณฑ์œผ๋กœ ์ปค์ง€๋‹ˆ ์—ฐ์‚ฐ overhead ๋ฅผ ๋”์šฑ ์ค„์—ฌ ์ด๋“์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

728x90

'Dev,AI > ๋…ผ๋ฌธ๋ฆฌ๋ทฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋…ผ๋ฌธ๋ฆฌ๋ทฐ) Distilling the Knowledge in a Neural Network  (0) 2026.02.09
728x90

 

 

 

Batch Normalization

https://arxiv.org/pdf/1502.03167

 

 

Background

batch normalizaion ์€ 2015๋…„์— ์ œ์‹œ๋œ ICS(Internal Covariate Shift) ๋ฌธ์ œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. covariate shift ๋Š” ํ•™์Šต ๋•Œ ํ™œ์šฉํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค์ œ ์ถ”๋ก ์— ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ„์˜ ๋ถ„ํฌ๊ฐ€ ๋‹ค๋ฅด๋ฉด ์ถ”๋ก  ์„ฑ๋Šฅ์— ์•…์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค๋ผ๋Š” ์ฃผ์žฅ์ธ๋ฐ ์ด๊ฒŒ ์‹ ๊ฒฝ๋ง ๋‚ด๋ถ€์—์„œ๋„ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค ๋ผ๋Š” ์ฃผ์žฅ์„ ํ•˜๋ฉฐ ์ƒ๊ธด์šฉ์–ด๊ฐ€ Internal Covariate Shift ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์„ ๋ณด๋ฉด ์ง๊ด€์ ์œผ๋กœ ์ดํ•ด๊ฐ€ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‹ ๊ฒฝ๋ง์„ ํ†ต๊ณผํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ์˜ ๋ถ„ํฌ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ

 

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

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

๊ทธ๋Ÿฐ๋ฐ ๋…ผ๋ฌธ์—์„œ๋Š” ics ๋ฅผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค๊ณ  ์ฃผ์žฅํ•˜์˜€์œผ๋‚˜ ์‹ค์ œ๋กœ ์ฆ๋ช…ํ•˜์ง€๋Š” ๋ชปํ–ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์„ ์ฆ๋ช…ํ•˜๊ธฐ ์œ„ํ•œ How Does Batch Normalization Help Optimization?  ๋ผ๋Š” ๋…ผ๋ฌธ์ด ๋‚˜์™”์Šต๋‹ˆ๋‹ค.

https://arxiv.org/pdf/1805.11604

 

 

์šฐ์„  ์ผ๋ฐ˜์ ์œผ๋กœ Batch Norm ์„ ์ ์šฉ์‹œํ‚จ ๋„คํŠธ์›Œํฌ๊ฐ€ Accuracy ๊ฐ€ ๊ฐ€ํŒŒ๋ฅธ ํญ์œผ๋กœ ์˜ฌ๋ผ๊ฐ”๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

 

 

์šฐ์ธก์˜ ํžˆ์Šคํ† ๊ทธ๋žจ์„ ๋ณด๋ฉด ๊ฐ ๋ ˆ์ด์–ด์˜ ๋ถ„ํฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ๋Š”๋ฐ์š” ๊ฐ€์žฅ์šฐ์ธก์˜ Standard + Noisy BatchNorm ์—์„œ Layer3 ๋ถ€ํ„ฐ ๋ถ„ํฌ๊ฐ€ ๊ฐ‘์ž‘์Šค๋Ÿฝ๊ฒŒ ๋ณ€ํ•˜์—ฌ ICS๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Œ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ICS๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์™ผ์ชฝ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด๋ฉด ํ•™์Šต์„ฑ๋Šฅ์ด ์šฐ์ˆ˜ํ•จ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰ ์ž„์˜๋กœ Batch Norm Layer ์ดํ›„ ๋ฐ”๋กœ Noise ๋ฅผ ๋„ฃ์–ด covariate shift ๋ฅผ ๋ฐœ์ƒ์‹œ์ผฐ์„ ๋•Œ์—๋„ BatchNorm ์ด ํฌํ•จ๋œ ๋„คํŠธ์›Œํฌ๋Š” ์ผ๋ฐ˜์ ์ธ ๋„คํŠธ์›Œํฌ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ์šฐ์ˆ˜ํ•จ์„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹คํ—˜์ ์œผ๋กœ Batch Norm ์ด ICS ๋ฌธ์ œ๋ฅผ ํ•ด์†Œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์ „ ๋…ผ๋ฌธ์˜ ๋ฐ˜๋ฐ•์„ ํ•˜์˜€๊ณ , ์‹ฌ์ง€์–ด ICS๊ฐ€ ํฌ๊ฒŒ ๋ฐœ์ƒํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Batch Norm ์ด ์žˆ์œผ๋ฉด ์„ฑ๋Šฅ์ด ์ข‹์•„์ง„๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค€ ์‚ฌ๋ก€๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น๋…ผ๋ฌธ์—์„œ ICS๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ธฐ์šธ๊ธฐ ๊ณ„์‚ฐํ•˜์—ฌ ICS๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์•ˆํ–ˆ๋Š”๋ฐ, ํฌ์ŠคํŒ…์˜ ๋ชฉ์ ๋ณด๋‹ค ๋„ˆ๋ฌด ๋ฒ—์–ด๋‚˜๋Š”๊ฒƒ ๊ฐ™์•„ ๋‹ค๋ฃจ์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ถ๊ธˆํ•˜์‹ ๋ถ„๊ป˜์„œ๋Š” ๋…ผ๋ฌธ์„ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ICS ๋ฅผ ํ•ด์†Œํ•˜์ง€ ๋ชปํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์„ฑ๋Šฅ์ด ์ข‹์€ ์ด์œ ๋Š” ๋ญ˜๊นŒ์š”? ๋…ผ๋ฌธ์—์„œ๋Š” Batch Norm ์˜ Smoothing ํšจ๊ณผ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

 

Loss Landscape ๊ฐ€ ํ›จ์”ฌ ๋” ์˜ˆ์ƒ ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„๋กœ ํ˜•์„ฑ๋˜๋ฉด์„œ ํ•™์Šตํšจ๊ณผ๊ฐ€ ์ฆ๋Œ€๋œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Batch Normalization Layer

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

์ •๊ทœํ™”์—์„œ ํ•™์Šต ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ํ™œ์„ฑํ™” ํ•จ์ˆ˜์˜ ํŠน์ง•์— ์žˆ์Šต๋‹ˆ๋‹ค. sigmoid๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค๋ฉด ์–ด๋–ค ๊ตฌ๊ฐ„์—์„œ๋Š” ๋งค์šฐ ์„ ํ˜•์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ‘œ์ค€์ •๊ทœ๋ถ„ํฌ๋กœ ์ •๊ทœํ™”ํ•œ 0๊ณผ 1์‚ฌ์ด์˜ ๊ฐ’์—์„œ ์„ ํ˜•์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ๋งˆ์™€ ๋ฒ ํƒ€๋ฅผ ํ™œ์šฉํ•ด non-linearity ๋ฅผ ์ง€์ผœ์ฃผ๊ณ , ํ•ด๋‹น ์ •๊ทœํ™” ๋ ˆ์ด์–ด์˜ output ๋„ ์ ์ ˆํ•˜๊ฒŒ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๋ก ์€ ๋ ˆ์ด์–ด์˜ ์ž…๋ ฅ์„ ์ •๊ทœํ™”ํ•  ๋•Œ๋Š” linearity ๋ฅผ ์ฃผ์˜ํ•ด์„œ ์ •๊ทœํ™” ํ•ด์•ผํ•œ๋‹ค๋Š” ์  ์ž…๋‹ˆ๋‹ค.

 

Batch Normalization Layer ์—ฐ์‚ฐ๊ตฌ๋ถ„

batch normalization Layer ๋Š” ํ•™์Šตํ• ๋•Œ์™€ ์ถ”๋ก ํ•  ๋•Œ ๋„คํŠธ์›Œํฌ์—์„œ์˜ ์—ญํ• ์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ํ•™์Šตํ• ๋•Œ ๊ฐ๋งˆ์™€ ๋ฒ ํƒ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ•™์Šต์‹œ์ผœ์•ผ ํ•˜์ง€๋งŒ ์ถ”๋ก ๋•Œ์—๋Š” ํ•„์š”์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ ํ•ด๋‹น ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ ๊ณ ์ •ํ•˜์—ฌ ํ•™์Šต๋œ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์˜ํ•œ ๊ฐ’์ด ๋‚˜์™€์•ผํ•ฉ๋‹ˆ๋‹ค.

 

step 7 ์—์„œ๋ถ€ํ„ฐ๋Š” BN ์ด training ๋ชจ๋“œ๋กœ ๋„คํŠธ์›Œํฌ์— ์žˆ์—ˆ๋˜ ๊ฒƒ์„ inference ๋ชจ๋“œ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ( ํŒŒ๋ผ๋ฏธํ„ฐ ๊ณ ์ •์„ ํ†ตํ•ด์„œ )

Batch Normalization Data Flow

์ž…๋ ฅ ๋ฐ์ดํ„ฐ (X)

 

$$

X = \begin{bmatrix} [1,\ 2] \ [2,\ 4] \ [3,\ 6] \end{bmatrix}

$$

๋ฐฐ์น˜๋กœ ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ

shape: (3, 2)

→ ์ƒ˜ํ”Œ 3๊ฐœ, ๊ฐ ์ƒ˜ํ”Œ์€ 2์ฐจ์› ๋ฒกํ„ฐ


Linear Layer ํ†ต๊ณผ

๊ฐ€์ค‘์น˜์™€ bias๋ฅผ ์ด๋ ‡๊ฒŒ ๋‘๊ฒ ์Šต๋‹ˆ:

$$ [ W = \begin{bmatrix} [1,0], \ [0,1] \end{bmatrix}, \quad b = [0,\ 0] ] $$

์ฆ‰, ์•„๋ฌด ๋ณ€ํ™” ์—†๋Š” ์„ ํ˜•์ธต

$$ [ Z = XW + b = X ] $$

๊ฒฐ๊ณผ:

Z =
[
 [1, 2],
 [2, 4],
 [3, 6]
]

shape ๊ทธ๋Œ€๋กœ (3, 2)


Batch Normalization

1๏ธโƒฃ Batch Mean (μ)

feature๋ณ„ ํ‰๊ท :

$$ μ=[(1+2+3)/3, (2+4+6)/3]=[2, 4] $$


2๏ธโƒฃ Batch Variance (σ²)

$$ σ2=[((1−2)2+(2−2)2+(3−2)2)/3,((2−4)2+(4−4)2+(6−4)2)/3]=[2/3, 8/3] $$


3๏ธโƒฃ Normalize (xฬ‚)

$$ \hat{x} = \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} (ε ๋ฌด์‹œํ•œ๋‹ค๊ณ  ๊ฐ€์ •) $$

์ƒ˜ํ”Œ๋ณ„ ๊ณ„์‚ฐ

์ฒซ ๋ฒˆ์งธ ์ƒ˜ํ”Œ

$$ [1,2] → [-1/\sqrt{2/3},\ -2/\sqrt{8/3}] ≈ [-1.22,\ -1.22] $$

๋‘ ๋ฒˆ์งธ

$$ [2,4] → [0,\ 0] $$

์„ธ ๋ฒˆ์งธ

$$ [3,6] → [1.22,\ 1.22] $$

๊ฒฐ๊ณผ:

X_hat =
[
 [-1.22, -1.22],
 [ 0.00,  0.00],
 [ 1.22,  1.22]
]

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น๊ฐ’์— gamma ์™€ betta ์—ฐ์‚ฐ์„ ํ†ตํ•ด Layer ๋ฅผ ํ†ต๊ณผ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ batch norm ์€ ๋ฏธ๋‹ˆ ๋ฐฐ์น˜์˜ ํ”ผ์ฒ˜๋ณ„๋กœ ํ‰๊ท , ๋ถ„์‚ฐ์„ ๊ตฌํ•ด์„œ ์›๋ณธ ๋ฐ์ดํ„ฐ์— ๋Œ€์ž…์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ Normalizaion ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Layer Normalization

arxiv.org

Layer Normalization ์€ Batch Norm ์ด RNN ์— ์ ์šฉํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ์ ์„ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด ์ œ์‹œ๋œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. RNN์€ ์‹œ๊ฐ„๋‹จ์œ„๋กœ ๊ณ„์‚ฐ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฏธ๋‹ˆ๋ฐฐ์น˜์˜ ๊ฐ ํ”ผ์ณ๋งˆ๋‹ค ํ†ต๊ณ„๋ฅผ ์ด์šฉํ•ด ์ •๊ทœํ™”ํ•˜๋Š” BN ์˜ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ์ŠคํŠธ๋ฆผ์˜ ๋งฅ๋ฝ์„ ๋ฐ˜์˜ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” RNN ์ด๋‚˜ NLP, ํ˜น์€ ์Œ์„ฑ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ๋Š” ๋ฐฐ์น˜๋งˆ๋‹ค ๊ธธ์ด๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ 1: "๋‚˜๋Š” ๋ฐฅ์„ ๋จน์—ˆ๋‹ค"        (๊ธธ์ด 4)
์ƒ˜ํ”Œ 2: "์˜ค๋Š˜"                    (๊ธธ์ด 1)
์ƒ˜ํ”Œ 3: "์–ด์ œ ๋น„๊ฐ€ ์™€์„œ ์šฐ์‚ฐ์„ ์ผ๋‹ค" (๊ธธ์ด 6)

์ด๊ฒƒ์„ BN ์„ ํ™œ์šฉํ•œ Layer output ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ƒ˜ํ”Œ2 ์˜ 2,3 ์ƒ˜ํ”Œ1์˜ 3,4 ๊ฐ€ 0์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ์˜ ์˜๋ฏธ๋ฅผ ์ถฉ๋ถ„ํžˆ ๋ฐ˜์˜ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ์—๋„ ๊ทธ๋Œ€๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋‚˜ ์„ฑ์ ํ†ต๊ณ„(๊ตญ์–ด๋Š” ๊ตญ์–ด๋ผ๋ฆฌ, ์ˆ˜ํ•™์€ ์ˆ˜ํ•™๋ผ๋ฆฌ) ์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ํ”ผ์ณํ•˜๋‚˜๊ฐ€ ๋‹ค๋ฅธ ํ”ผ์ณ๋‚˜ ๋ฐ์ดํ„ฐ์—๋„ ์˜ํ–ฅ์„ ์ฃผ๋Š”๊ฒฝ์šฐ๋Š” Batch ์‚ฌ์ด์ฆˆ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ์˜ ์˜๋ฏธ๋ฅผ ์ž˜ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋Š” LN ์ด ์„ฑ๋Šฅ์ด ์ข‹๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

 

BN ๊ณผ์˜ ์ฐจ์ด์ 

Batch Normalization์€ ๋ฏธ๋‹ˆ๋ฐฐ์น˜ ๋‹จ์œ„๋กœ ํ‰๊ท ๊ณผ ๋ถ„์‚ฐ์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ •๊ทœํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด **Layer Normalization(LN)**์€ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๋ ˆ์ด์–ด ๋‹จ์œ„, ์ •ํ™•ํžˆ๋Š” ํ•˜๋‚˜์˜ ์ƒ˜ํ”Œ ๋‚ด๋ถ€ feature๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ ์ •๊ทœํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ •๊ทœํ™”์˜ ๊ธฐ์ค€์ด ์™„์ „ํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

  • Batch Normalization
    • ํ‰๊ท , ๋ถ„์‚ฐ ๊ณ„์‚ฐ ์ถ•: batch ๋ฐฉํ–ฅ
    • ๊ฐ™์€ feature๋ฅผ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ ์ƒ˜ํ”Œ์„ ํ•จ๊ป˜ ์‚ฌ์šฉ
  • Layer Normalization
    • ํ‰๊ท , ๋ถ„์‚ฐ ๊ณ„์‚ฐ ์ถ•: feature ๋ฐฉํ–ฅ
    • ํ•˜๋‚˜์˜ ์ƒ˜ํ”Œ ์•ˆ์—์„œ๋งŒ ๊ณ„์‚ฐ

ํ•˜๋‚˜์˜ ์ƒ˜ํ”Œ x = [xโ‚, xโ‚‚, ..., xโ‚]์— ๋Œ€ํ•ด:

$$ \mu = \frac{1}{d} \sum_{i=1}^{d} x_i $$

$$ \sigma^2 = \frac{1}{d} \sum_{i=1}^{d} (x_i - \mu)^2 $$

$$ \hat{x}_i = \frac{x_i - \mu}{\sqrt{\sigma^2 + \epsilon}} $$

๊ทธ๋ฆฌ๊ณ  Batch Normalization๊ณผ ๋™์ผํ•˜๊ฒŒ scale, shift ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค:

$$ y_i = \gamma_i \hat{x}_i + \beta_i $$

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์€ γ, β๋Š” feature ์ฐจ์›์— ๋Œ€ํ•ด์„œ๋งŒ ์กด์žฌํ•˜๋ฉฐ batch ํฌ๊ธฐ์™€ ๋ฌด๊ด€ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์œ„์˜ ์ˆ˜์‹๋Œ€๋กœ ๊ฐ™์€ ์ƒ˜ํ”Œ์„ ๊ฐ€์ง€๊ณ  ๋ ˆ์ด์–ด๋ฅผ ํ†ต๊ณผํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Layer Normalization Data Flow

์ž…๋ ฅ ๋ฐ์ดํ„ฐ (X)

$$ X = \begin{bmatrix} [1,\ 2] \\ [2,\ 4] \\ [3,\ 6] \end{bmatrix} $$

shape: (3, 2)

→ ์ƒ˜ํ”Œ 3๊ฐœ, ๊ฐ ์ƒ˜ํ”Œ์€ 2์ฐจ์› ๋ฒกํ„ฐ


Linear Layer ํ†ต๊ณผ

๊ฐ€์ค‘์น˜์™€ bias๋Š” ์ด์ „๊ณผ ๋™์ผํ•˜๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

$$ Z = X $$


Layer Normalization ์ ์šฉ

Layer Normalization์€ ๊ฐ ์ƒ˜ํ”Œ๋งˆ๋‹ค ๋…๋ฆฝ์ ์œผ๋กœ ํ‰๊ท ๊ณผ ๋ถ„์‚ฐ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์ƒ˜ํ”Œ [1, 2]

$$ \mu = (1 + 2) / 2 = 1.5 $$

$$ \sigma^2 = ((1 - 1.5)^2 + (2 - 1.5)^2) / 2 = 0.25 $$

์ •๊ทœํ™” ๊ฒฐ๊ณผ:

$$ [1, 2] \rightarrow [-1, 1] $$


๋‘ ๋ฒˆ์งธ ์ƒ˜ํ”Œ [2, 4]

$$ \mu = 3,\quad \sigma^2 = 1 $$

์ •๊ทœํ™” ๊ฒฐ๊ณผ:

$$ [2, 4] \rightarrow [-1, 1] $$


์„ธ ๋ฒˆ์งธ ์ƒ˜ํ”Œ [3, 6]

$$ \mu = 4.5,\quad \sigma^2 = 2.25 $$

์ •๊ทœํ™” ๊ฒฐ๊ณผ:

$$ [3, 6] \rightarrow [-1, 1] $$


Layer Normalization ๊ฒฐ๊ณผ

X_hat =
[
 [-1,  1],
 [-1,  1],
 [-1,  1]
]

Transformer ๊ตฌ์กฐ์—์„œ Layer Normalization ์ด Batch Normalization ๋ณด๋‹ค ์ ํ•ฉํ•œ ์ด์œ 

1. ์‹œํ€€์Šค ๊ธธ์ด ๊ฐ€๋ณ€์„ฑ๊ณผ Masking ๋ฌธ์ œ

Transformer์˜ Self-Attention์€ ๊ฐ€๋ณ€ ๊ธธ์ด ์‹œํ€€์Šค๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅํ˜•ํƒœ๋Š” ๊ฐ ๋ฌธ์žฅ๋งˆ๋‹ค ๊ธธ์ด๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์งง์€ ๋ฌธ์žฅ์—๋Š” padding์„ ์ถ”๊ฐ€ํ•˜ attention mask๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

 

 

๋ฐ˜๋ฉด Layer Normalization์€ ๊ฐ ํ† ํฐ์˜ feature ์ฐจ์›์— ๋Œ€ํ•ด์„œ๋งŒ ์ •๊ทœํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ•˜๋‚˜์˜ ํ† ํฐ ๋‚ด๋ถ€์—์„œ๋งŒ ํ‰๊ท ๊ณผ ๋ถ„์‚ฐ์„ ๊ณ„์‚ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— padding ํ† ํฐ์ด๋‚˜ ์‹œํ€€์Šค ๊ธธ์ด๊ฐ€ ์ •๊ทœํ™” ํ†ต๊ณ„์— ์ „ํ˜€ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ ํ† ํฐ์€ ๋…๋ฆฝ์ ์œผ๋กœ ์ •๊ทœํ™”๋˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ์˜ ์˜๋ฏธ๊ฐ€ ์ถฉ์‹คํžˆ ๋ฐ˜์˜๋˜๊ณ  ๋ฐฐ์น˜๋‚˜ ์‹œํ€€์Šค ๊ตฌ์กฐ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ผ๊ด€๋œ ์ •๊ทœํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

2. Autoregressive Decoding๊ณผ ๋ฐฐ์น˜ ํฌ๊ธฐ ๋ถˆ์ผ์น˜

Transformer Decoder๋Š” ์ถ”๋ก  ์‹œ ๋ฏธ๋ž˜์˜ ์ •๋ณด๋ฅผ ์ฐธ์กฐํ•˜์ง€ ๋ชปํ•˜๋„๋ก autoregressive ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ด์ „์— ์ƒ์„ฑํ•œ ํ† ํฐ์„ ๋ฐ”ํƒ•์œผ๋กœ ๋‹ค์Œ ํ† ํฐ์„ ํ•˜๋‚˜์”ฉ ์ˆœ์ฐจ์ ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ฐฐ์น˜ ํฌ๊ธฐ๊ฐ€ 1์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” Layer Normalization ๋…ผ๋ฌธ์—์„œ ๋ณด์—ฌ์ค€๊ฒƒ์ฒ˜๋Ÿผ Batch Normalization์— ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

Layer Normalization์€ ๋ฐฐ์น˜ ํฌ๊ธฐ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์•ˆ์ •์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์น˜ ํฌ๊ธฐ๊ฐ€ 1์ด๋“  32๋“  ์ •๊ทœํ™” ๊ฒฐ๊ณผ๋Š” ์ผ๊ด€๋˜๋ฉฐ, ํ•™์Šต ์‹œ ๊ด€์ฐฐํ•œ ์„ฑ๋Šฅ์ด ์ถ”๋ก  ์‹œ์—๋„ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” Transformer Decoder์˜ ์ƒ์„ฑ ํ’ˆ์งˆ์— ๊ฒฐ์ •์ ์œผ๋กœ ์ค‘์š”ํ•œ ํŠน์„ฑ์ž…๋‹ˆ๋‹ค.

3. Residual Connection๊ณผ์˜ ๊ตฌ์กฐ์  ๋ถˆ์ผ์น˜

Transformer์˜ ๊ฐ ๋ธ”๋ก์€ residual connection์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค: y = x + Sublayer(LN(x)). ์ด ๊ตฌ์กฐ๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ ๋Š” gradient์˜ ํ๋ฆ„ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์—ญ์ „ํŒŒ ์‹œ ∂y/∂x = 1 + ∂Sublayer/∂x ๊ฐ€ ๋˜์–ด, gradient๊ฐ€ ํ•ญ์ƒ ์ง์ ‘ ํ๋ฅผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ(identity mapping)๊ฐ€ ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊นŠ์€ ๋„คํŠธ์›Œํฌ์—์„œ gradient vanishing ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.

๋งŒ์•ฝ Batch Normalization์„ residual path์— ์‚ฌ์šฉํ•˜๋ฉด, BN์˜ ์ถœ๋ ฅ์ด ๋ฐฐ์น˜ ํ†ต๊ณ„์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— residual path์— batch-dependent noise๊ฐ€ ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” gradient flow๋ฅผ ๋ถˆ์•ˆ์ •ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ , ํŠนํžˆ ๊นŠ์€ Transformer์—์„œ๋Š” gradient ํญ๋ฐœ์ด๋‚˜ ์†Œ์‹ค์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ Post-LN Transformer(residual ํ›„์— LN์„ ์ ์šฉ)๋Š” ๋ ˆ์ด์–ด๊ฐ€ ๊นŠ์–ด์งˆ์ˆ˜๋ก ํ•™์Šต์ด ๋ถˆ์•ˆ์ •ํ•ด์ง€๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์œผ๋ฉฐ, Pre-LN Transformer(residual ์ „์— LN์„ ์ ์šฉ)๊ฐ€ ๋” ์•ˆ์ •์ ์ธ ํ•™์Šต์„ ๋ณด์ž…๋‹ˆ๋‹ค. BN์€ ์ด๋Ÿฌํ•œ residual connection์˜ ํŠน์„ฑ๊ณผ ๊ทผ๋ณธ์ ์œผ๋กœ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

Layer Normalization์€ ๊ฐ ์ƒ˜ํ”Œ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ •๊ทœํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์น˜์— ์˜์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ residual path์˜ gradient flow๋ฅผ ๋ฐฉํ•ดํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ˆ˜์‹ญ ๊ฐœ์˜ ๋ ˆ์ด์–ด๋กœ ์ด๋ฃจ์–ด์ง„ ๊นŠ์€ Transformer์—์„œ๋„ ์•ˆ์ •์ ์ธ ํ•™์Šต์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ์  ์กฐํ™”๊ฐ€ Transformer๊ฐ€ Layer Normalization์„ ์‚ฌ์šฉํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

728x90

+ Recent posts