๐Ÿ“บ ์˜์ƒ ์š”์•ฝ ์•„์นด์ด๋ธŒ
โ† ๋ชฉ๋ก

Two Bugs That Hid in Plain Sight: A vLLM Debugging Detective Story โ€” Asaf Gardin & Yuval Belfer

AI Engineer ยท 2026-09-20 03:30 ยท 18:06

ํ•œ ์ค„ ํ•ต์‹ฌ

๊ณ ์‹ ๋ขฐ๋„์ธ๋ฐ๋„ ์กฐ์šฉํžˆ ๋ง๊ฐ€์ง€๋Š” vLLM/Jamba ๊ณ„์—ด ์ถ”๋ก ยทํ•™์Šต ๋ฒ„๊ทธ ๋‘ ๊ฑด์„, ๋กœ๊ทธํ”„๋กญ ๋น„๊ต์™€ ์žฌํ˜„ ์กฐ๊ฑด ์••์ถ•์œผ๋กœ ์ถ”์ ํ•ด ์›์ธ์„ ์ฐพ์•„๋‚ธ ๋””๋ฒ„๊น… ์‚ฌ๋ก€๋‹ค.

์‹œ๊ฐ„๋ณ„ ์š”์•ฝ

  1. 0:00
    ๋ฌด์ค‘๋‹จยท๋ฌด๊ฒฝ๊ณ ยท๊ณ ์‹ ๋ขฐ ์ด ๋ฌธ์ œ๋“ค์€ ํฌ๋ž˜์‹œ๋‚˜ ๊ฒฝ๊ณ  ์—†์ด๋„ ์ถœ๋ ฅ๋งŒ ์กฐ์šฉํžˆ ํ‹€์–ด์ง€๋Š” ์œ ํ˜•์ด๋ฉฐ, ๋ชจ๋ธ ํ’ˆ์งˆ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ถ”๋ก ยท์‹คํ–‰ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฌธ์ œ๋กœ ๋‹ค๋ค„์•ผ ํ•œ๋‹ค. ์‚ฌ๋ก€์˜ ๋ฐฐ๊ฒฝ์€ AI21์˜ Jamba ๊ณ„์—ด ๋ชจ๋ธ์„ ํ•™์Šตยท์„œ๋น™ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•œ ์‹ค์ „ ๋ฒ„๊ทธ ์ถ”์ ์ด๋‹ค.
  2. 2:48
    ์ฒœ ๋ฒˆ ์ค‘ ํ•œ ๋ฒˆ ๋‚˜์˜ค๋Š” ํšก์„ค์ˆ˜์„ค ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ๋Š” 1,000๋ฒˆ ์ค‘ 1๋ฒˆ ์ •๋„๋งŒ ๋‚˜ํƒ€๋‚˜๋Š” ํฌ๊ท€ํ•œ gibberish๋กœ, ๋‹จ์ผ ์š”์ฒญ์ด๋‚˜ ์†Œ๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์—์„œ๋Š” ์ž˜ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š”๋‹ค. vLLM์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๊ณ  ๋‹ค๋ฅธ ์ธํ”„๋ผ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ๋ณด์ด์ง€ ์•Š์•„, ์—”์ง„ ํŠน์ด์ ์ธ ์›์ธ ์ถ”์ ์ด ํ•„์š”ํ–ˆ๋‹ค.
  3. 3:43
    GPU๋ฅผ ๊ตถ๊ฒจ ๋น ๋ฅด๊ฒŒ ์žฌํ˜„ํ•˜๊ธฐ ์žฌํ˜„์„ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด GPU memory utilization์„ 90%์—์„œ 20%๋กœ ๋‚ฎ์ถ”๊ณ  ๋™์‹œ์— ๋งŽ์€ ์š”์ฒญ์„ ๋Œ๋ ค, ํŠน์ • ์š”์ฒญ์ด ์•ˆ์ •์ ์œผ๋กœ gibberish๋ฅผ ๋‚ด๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค. temperature zero๋กœ ์ƒ˜ํ”Œ๋งํ•ด ๊ฐ™์€ ์‹คํŒจ๋ฅผ ๋ฐ˜๋ณต ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์ž ๋””๋ฒ„๊น… ๋ฃจํ”„๊ฐ€ ์งง์•„์กŒ๋‹ค.
  4. 5:18
    ํ‰๋ฒ”ํ•œ ๊ธฐ์ค€์„ ๊ณผ์˜ logprob ๋น„๊ต vLLM์˜ ์ถœ๋ ฅ๊ณผ logprops๋ฅผ Hugging Face transformers์˜ plain baseline๊ณผ ๋น„๊ตํ•ด ๋ถ„ํฌ ์ฐจ์ด๋ฅผ ์ธก์ •ํ–ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” CUDA prefill kernel, compute sanitizer, decode/prefill ๋ถ„๋ฆฌ ์‹คํ—˜๊นŒ์ง€ ํ–ˆ์ง€๋งŒ ์ด์ƒ์ด ๋ณด์ด์ง€ ์•Š์•˜๊ณ , ๋ฌธ์ œ๋Š” ๋” ๊นŠ์€ ์—”์ง„ ํ๋ฆ„์— ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์ปค์กŒ๋‹ค.
  5. 8:48
    forward pass์— request ID๋ฅผ ๋„ฃ๊ธฐ ์š”์ฒญ์— identity๊ฐ€ ์—†์–ด์„œ ์–ด๋А prompt๊ฐ€ ์ฒ˜๋ฆฌ ์ค‘์ธ์ง€ ์ถ”์ ํ•  ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, request ID๋ฅผ forward context์— ์‹ค์–ด prefill๊ณผ decode ์ง์ „๊นŒ์ง€ ์ „๋‹ฌํ–ˆ๋‹ค. ์ด๋กœ์จ ํŠน์ • ์‹คํŒจ ์š”์ฒญ์— breakpoint๋ฅผ ๊ฑธ๊ณ  ๋‚ด๋ถ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋๋‹ค.
  6. 9:30
    prefill๋ณด๋‹ค ๋จผ์ € decode๊ฐ€ ์‹คํ–‰๋œ ์ด์œ ์™€ Mamba๋งŒ ๋ฌธ์ œ๋ฅผ ๋ณธ ์ด์œ  ๋ฌธ์ œ ์š”์ฒญ์€ ๋ณธ๋ž˜ prefill ํ›„ decode์—ฌ์•ผ ํ•˜๋Š”๋ฐ, scheduler๊ฐ€ decode๋ฅผ ๋จผ์ € ๋ฐฐ์น˜ํ•ด stale state๋ฅผ ์ฝ๊ณ  ์žˆ์—ˆ๋‹ค. attention์€ KV๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ๊ตฌ์กฐ๋ผ ๋ฒ„ํ‹ฐ์ง€๋งŒ, Mamba๋Š” ๋จผ์ € ์ฝ๊ณ  ๊ณ„์‚ฐํ•˜๋ฏ€๋กœ ์ด์ „ ์š”์ฒญ์˜ ์˜ค๋ž˜๋œ ์ƒํƒœ๋ฅผ ์จ์„œ gibberish๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
  7. 11:47
    ๋‘ ๋ฒˆ์งธ ์‚ฌ๋ก€: 12์Šคํ…๋งˆ๋‹ค logprob๊ฐ€ ํŠ€๋Š” ํ˜„์ƒ ๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ๋Š” RL๊ณผ inference์—์„œ rollout๊ณผ FSTP ์‚ฌ์ด์˜ logprob๊ฐ€ ๊ฐ€๋” ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š” ํ˜„์ƒ์œผ๋กœ, ๊ฐ™์€ ์ž…๋ ฅ๊ณผ ๊ฐ™์€ ๊ฐ€์ค‘์น˜์ธ๋ฐ๋„ ๊ฒฐ๊ณผ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์•˜๋‹ค. ํŠนํžˆ 12 step ์ฃผ๊ธฐ๋กœ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ŠคํŒŒ์ดํฌ๊ฐ€ ๋‚˜ํƒ€๋‚˜ ๋‹ค๋ฅธ ์‹คํŒจ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์˜์‹ฌํ•˜๊ฒŒ ํ–ˆ๋‹ค.
  8. 12:29
    ์‹คํŒจ์˜ ๋ชจ์–‘์„ ๋ฐ”๊พธ๋Š” ๋ ˆ๋ฒ„ ์›์ธ์„ ์ขํžˆ๊ธฐ ์œ„ํ•ด ๋‹จ์ˆœํžˆ ์‹คํŒจ ํšŸ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ์‹คํŒจ ์‹œ์ ๊ณผ ํ˜•ํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ๋ ˆ๋ฒ„๋ฅผ ์ฐพ์•˜๊ณ , rollout per prompt๋ฅผ 8์—์„œ 16, 32, 64, 128๋กœ ๋Š˜๋ ค ์žฌํ˜„ ์‹œ์ ์„ ์•ž๋‹น๊ฒผ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ 128์—์„œ๋Š” step 1์— ๋ฐ”๋กœ ๋ฌธ์ œ๊ฐ€ ๋“œ๋Ÿฌ๋‚ฌ๊ณ , GPU ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ค„์ด๋ฉด ์˜คํžˆ๋ ค ๋ฌธ์ œ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค๋Š” ๋‹จ์„œ๋„ ์–ป์—ˆ๋‹ค.
  9. 14:33
    ๋˜๋Œ์•„๊ฐ„ 32๋น„ํŠธ ์ธ๋ฑ์Šค ์›์ธ์€ Mamba ์ปค๋„์ด unsigned 32-bit index๋ฅผ ์จ์„œ ์˜คํ”„์…‹์ด ์•ฝ 4 billion์„ ๋„˜์œผ๋ฉด wrap-around๋˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. GPU ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ค„์ด๋ฉด ๋ฒ„ํผ๊ฐ€ ์ž‘์•„์ ธ overflow์— ๋„๋‹ฌํ•˜์ง€ ๋ชปํ–ˆ๊ณ , ํ•ด๊ฒฐ์€ u in32๋ฅผ size_t๋กœ ๋ฐ”๊ฟ” 64-bit ๋ฒ”์œ„๋กœ ๋„“ํžˆ๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.
  10. 15:42
    ๋‘ ์žฅ๋ฉด, ํ•œ ๋ฒ”์ธ ๋‘ ์‚ฌ๊ฑด์€ ์„œ๋กœ ๋‹ฌ๋ผ ๋ณด์—ฌ๋„ ๋ชจ๋‘ Mamba state cache ์ฃผ๋ณ€์—์„œ, ๋ฉ”๋ชจ๋ฆฌ ์••๋ฐ•๊ณผ logprob ํฌ๋ Œ์‹์œผ๋กœ ๋“œ๋Ÿฌ๋‚œ ์กฐ์šฉํ•œ ์‹คํŒจ๋ผ๋Š” ๊ณตํ†ต์ ์„ ๊ฐ€์กŒ๋‹ค. ํ•ต์‹ฌ ๊ตํ›ˆ์€ ๋กœ๊ทธํ”„๋กญ ๋น„๊ต ์Šคํฌ๋ฆฝํŠธ, ๋ฉ”๋ชจ๋ฆฌ ์••์ถ• ์žฌํ˜„, ์‹คํŒจ์˜ ์‹œ๊ฐ„ยท๊ณต๊ฐ„ยทํ˜•ํƒœ๋ฅผ ๋ฐ”๊พธ๋Š” ๋ ˆ๋ฒ„, ๊ทธ๋ฆฌ๊ณ  identity ์ถ”์ ์„ ์ง์ ‘ ์‹ฌ๋Š” ์Šต๊ด€์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์ด๋‹ค.

์‹ค๋ฌด ์ธ์‚ฌ์ดํŠธ

  • ์กฐ์šฉํ•œ ์˜ค๋‹ตํ˜• ๋ฒ„๊ทธ๋Š” ๋ชจ๋ธ ๊ฐœ์„ ๋ณด๋‹ค ๋น„๊ต ๊ธฐ์ค€์„ ๊ณผ ์žฌํ˜„ ์กฐ๊ฑด ์„ค๊ณ„๊ฐ€ ๋จผ์ €์—ฌ์•ผ ํ•˜๋ฉฐ, logprob ๋น„๊ต๋ฅผ ์ž๋™ํ™”ํ•˜๋ฉด ์›์ธ ๋ถ„๋ฆฌ๊ฐ€ ๋นจ๋ผ์ง„๋‹ค.
  • ํฌ๊ท€ ๋ฒ„๊ทธ๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋Š˜๋ฆฌ๊ธฐ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌยท๋กค์•„์›ƒ ์ˆ˜ยท์Šค์ผ€์ค„ ์ˆœ์„œ๋ฅผ ์กฐ์ ˆํ•ด ์‹คํŒจ๋ฅผ ์••์ถ•์‹œํ‚ค๋Š” ๋ฐฉ์‹์ด ๋””๋ฒ„๊น… ํšจ์œจ์ด ๋†’๋‹ค.
  • ์š”์ฒญ ID ๊ฐ™์€ identity๋ฅผ forward pass๊นŒ์ง€ ๊ด€ํ†ต์‹œํ‚ค๋ฉด, ํ…์„œ๋งŒ ๋‚จ๋Š” ๊ตฌ๊ฐ„์—์„œ๋„ ์–ด๋–ค ์š”์ฒญ์ด ์–ด๋–ค ๊ฒฝ๋กœ๋ฅผ ํƒ”๋Š”์ง€ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค.