Two Bugs That Hid in Plain Sight: A vLLM Debugging Detective Story โ Asaf Gardin & Yuval Belfer
ํ ์ค ํต์ฌ
๊ณ ์ ๋ขฐ๋์ธ๋ฐ๋ ์กฐ์ฉํ ๋ง๊ฐ์ง๋ vLLM/Jamba ๊ณ์ด ์ถ๋ก ยทํ์ต ๋ฒ๊ทธ ๋ ๊ฑด์, ๋ก๊ทธํ๋กญ ๋น๊ต์ ์ฌํ ์กฐ๊ฑด ์์ถ์ผ๋ก ์ถ์ ํด ์์ธ์ ์ฐพ์๋ธ ๋๋ฒ๊น ์ฌ๋ก๋ค.
์๊ฐ๋ณ ์์ฝ
-
0:00
๋ฌด์ค๋จยท๋ฌด๊ฒฝ๊ณ ยท๊ณ ์ ๋ขฐ ์ด ๋ฌธ์ ๋ค์ ํฌ๋์๋ ๊ฒฝ๊ณ ์์ด๋ ์ถ๋ ฅ๋ง ์กฐ์ฉํ ํ์ด์ง๋ ์ ํ์ด๋ฉฐ, ๋ชจ๋ธ ํ์ง ๋ฌธ์ ๊ฐ ์๋๋ผ ์ถ๋ก ยท์คํ ํ์ดํ๋ผ์ธ์ ์์ง๋์ด๋ง ๋ฌธ์ ๋ก ๋ค๋ค์ผ ํ๋ค. ์ฌ๋ก์ ๋ฐฐ๊ฒฝ์ AI21์ Jamba ๊ณ์ด ๋ชจ๋ธ์ ํ์ตยท์๋นํ๋ ๊ณผ์ ์์ ๋ฐ์ํ ์ค์ ๋ฒ๊ทธ ์ถ์ ์ด๋ค.
-
2:48
์ฒ ๋ฒ ์ค ํ ๋ฒ ๋์ค๋ ํก์ค์์ค ์ฒซ ๋ฒ์งธ ๋ฌธ์ ๋ 1,000๋ฒ ์ค 1๋ฒ ์ ๋๋ง ๋ํ๋๋ ํฌ๊ทํ gibberish๋ก, ๋จ์ผ ์์ฒญ์ด๋ ์๊ท๋ชจ ํธ๋ํฝ์์๋ ์ ๋๋ฌ๋์ง ์๋๋ค. vLLM์์๋ง ๋ฐ์ํ๊ณ ๋ค๋ฅธ ์ธํ๋ผ ํ๋ ์์ํฌ์์๋ ๋ณด์ด์ง ์์, ์์ง ํน์ด์ ์ธ ์์ธ ์ถ์ ์ด ํ์ํ๋ค.
-
3:43
GPU๋ฅผ ๊ตถ๊ฒจ ๋น ๋ฅด๊ฒ ์ฌํํ๊ธฐ ์ฌํ์ ๋น ๋ฅด๊ฒ ๋ง๋ค๊ธฐ ์ํด GPU memory utilization์ 90%์์ 20%๋ก ๋ฎ์ถ๊ณ ๋์์ ๋ง์ ์์ฒญ์ ๋๋ ค, ํน์ ์์ฒญ์ด ์์ ์ ์ผ๋ก gibberish๋ฅผ ๋ด๋๋ก ๋ง๋ค์๋ค. temperature zero๋ก ์ํ๋งํด ๊ฐ์ ์คํจ๋ฅผ ๋ฐ๋ณต ์ฌํํ ์ ์๊ฒ ํ์ ๋๋ฒ๊น ๋ฃจํ๊ฐ ์งง์์ก๋ค.
-
5:18
ํ๋ฒํ ๊ธฐ์ค์ ๊ณผ์ logprob ๋น๊ต vLLM์ ์ถ๋ ฅ๊ณผ logprops๋ฅผ Hugging Face transformers์ plain baseline๊ณผ ๋น๊ตํด ๋ถํฌ ์ฐจ์ด๋ฅผ ์ธก์ ํ๋ค. ์ฒ์์๋ CUDA prefill kernel, compute sanitizer, decode/prefill ๋ถ๋ฆฌ ์คํ๊น์ง ํ์ง๋ง ์ด์์ด ๋ณด์ด์ง ์์๊ณ , ๋ฌธ์ ๋ ๋ ๊น์ ์์ง ํ๋ฆ์ ์์ ๊ฐ๋ฅ์ฑ์ด ์ปค์ก๋ค.
-
8:48
forward pass์ request ID๋ฅผ ๋ฃ๊ธฐ ์์ฒญ์ identity๊ฐ ์์ด์ ์ด๋ prompt๊ฐ ์ฒ๋ฆฌ ์ค์ธ์ง ์ถ์ ํ ์ ์์๊ธฐ ๋๋ฌธ์, request ID๋ฅผ forward context์ ์ค์ด prefill๊ณผ decode ์ง์ ๊น์ง ์ ๋ฌํ๋ค. ์ด๋ก์จ ํน์ ์คํจ ์์ฒญ์ breakpoint๋ฅผ ๊ฑธ๊ณ ๋ด๋ถ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ง์ ๊ด์ฐฐํ ์ ์๊ฒ ๋๋ค.
-
9:30
prefill๋ณด๋ค ๋จผ์ decode๊ฐ ์คํ๋ ์ด์ ์ Mamba๋ง ๋ฌธ์ ๋ฅผ ๋ณธ ์ด์ ๋ฌธ์ ์์ฒญ์ ๋ณธ๋ prefill ํ decode์ฌ์ผ ํ๋๋ฐ, scheduler๊ฐ decode๋ฅผ ๋จผ์ ๋ฐฐ์นํด stale state๋ฅผ ์ฝ๊ณ ์์๋ค. attention์ KV๋ฅผ ๋ฎ์ด์ฐ๋ ๊ตฌ์กฐ๋ผ ๋ฒํฐ์ง๋ง, Mamba๋ ๋จผ์ ์ฝ๊ณ ๊ณ์ฐํ๋ฏ๋ก ์ด์ ์์ฒญ์ ์ค๋๋ ์ํ๋ฅผ ์จ์ gibberish๊ฐ ๋ฐ์ํ๋ค.
-
11:47
๋ ๋ฒ์งธ ์ฌ๋ก: 12์คํ ๋ง๋ค logprob๊ฐ ํ๋ ํ์ ๋ ๋ฒ์งธ ๋ฌธ์ ๋ RL๊ณผ inference์์ rollout๊ณผ FSTP ์ฌ์ด์ logprob๊ฐ ๊ฐ๋ ํฌ๊ฒ ๋ฌ๋ผ์ง๋ ํ์์ผ๋ก, ๊ฐ์ ์ ๋ ฅ๊ณผ ๊ฐ์ ๊ฐ์ค์น์ธ๋ฐ๋ ๊ฒฐ๊ณผ๊ฐ ์ผ์นํ์ง ์์๋ค. ํนํ 12 step ์ฃผ๊ธฐ๋ก ๋ฐ๋ณต์ ์ผ๋ก ์คํ์ดํฌ๊ฐ ๋ํ๋ ๋ค๋ฅธ ์คํจ ๋ฉ์ปค๋์ฆ์ ์์ฌํ๊ฒ ํ๋ค.
-
12:29
์คํจ์ ๋ชจ์์ ๋ฐ๊พธ๋ ๋ ๋ฒ ์์ธ์ ์ขํ๊ธฐ ์ํด ๋จ์ํ ์คํจ ํ์๊ฐ ์๋๋ผ ์คํจ ์์ ๊ณผ ํํ๋ฅผ ๋ฐ๊พธ๋ ๋ ๋ฒ๋ฅผ ์ฐพ์๊ณ , rollout per prompt๋ฅผ 8์์ 16, 32, 64, 128๋ก ๋๋ ค ์ฌํ ์์ ์ ์๋น๊ฒผ๋ค. ๊ทธ ๊ฒฐ๊ณผ 128์์๋ step 1์ ๋ฐ๋ก ๋ฌธ์ ๊ฐ ๋๋ฌ๋ฌ๊ณ , GPU ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค์ด๋ฉด ์คํ๋ ค ๋ฌธ์ ๊ฐ ์ฌ๋ผ์ง๋ค๋ ๋จ์๋ ์ป์๋ค.
-
14:33
๋๋์๊ฐ 32๋นํธ ์ธ๋ฑ์ค ์์ธ์ Mamba ์ปค๋์ด unsigned 32-bit index๋ฅผ ์จ์ ์คํ์ ์ด ์ฝ 4 billion์ ๋์ผ๋ฉด wrap-around๋๋ ๊ฒ์ด์๋ค. GPU ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค์ด๋ฉด ๋ฒํผ๊ฐ ์์์ ธ overflow์ ๋๋ฌํ์ง ๋ชปํ๊ณ , ํด๊ฒฐ์ u in32๋ฅผ size_t๋ก ๋ฐ๊ฟ 64-bit ๋ฒ์๋ก ๋ํ๋ ๊ฒ์ด์๋ค.
-
15:42
๋ ์ฅ๋ฉด, ํ ๋ฒ์ธ ๋ ์ฌ๊ฑด์ ์๋ก ๋ฌ๋ผ ๋ณด์ฌ๋ ๋ชจ๋ Mamba state cache ์ฃผ๋ณ์์, ๋ฉ๋ชจ๋ฆฌ ์๋ฐ๊ณผ logprob ํฌ๋ ์์ผ๋ก ๋๋ฌ๋ ์กฐ์ฉํ ์คํจ๋ผ๋ ๊ณตํต์ ์ ๊ฐ์ก๋ค. ํต์ฌ ๊ตํ์ ๋ก๊ทธํ๋กญ ๋น๊ต ์คํฌ๋ฆฝํธ, ๋ฉ๋ชจ๋ฆฌ ์์ถ ์ฌํ, ์คํจ์ ์๊ฐยท๊ณต๊ฐยทํํ๋ฅผ ๋ฐ๊พธ๋ ๋ ๋ฒ, ๊ทธ๋ฆฌ๊ณ identity ์ถ์ ์ ์ง์ ์ฌ๋ ์ต๊ด์ด ํ์ํ๋ค๋ ์ ์ด๋ค.
์ค๋ฌด ์ธ์ฌ์ดํธ
- ์กฐ์ฉํ ์ค๋ตํ ๋ฒ๊ทธ๋ ๋ชจ๋ธ ๊ฐ์ ๋ณด๋ค ๋น๊ต ๊ธฐ์ค์ ๊ณผ ์ฌํ ์กฐ๊ฑด ์ค๊ณ๊ฐ ๋จผ์ ์ฌ์ผ ํ๋ฉฐ, logprob ๋น๊ต๋ฅผ ์๋ํํ๋ฉด ์์ธ ๋ถ๋ฆฌ๊ฐ ๋นจ๋ผ์ง๋ค.
- ํฌ๊ท ๋ฒ๊ทธ๋ ํธ๋ํฝ์ ๋๋ฆฌ๊ธฐ๋ณด๋ค ๋ฉ๋ชจ๋ฆฌยท๋กค์์ ์ยท์ค์ผ์ค ์์๋ฅผ ์กฐ์ ํด ์คํจ๋ฅผ ์์ถ์ํค๋ ๋ฐฉ์์ด ๋๋ฒ๊น ํจ์จ์ด ๋๋ค.
- ์์ฒญ ID ๊ฐ์ identity๋ฅผ forward pass๊น์ง ๊ดํต์ํค๋ฉด, ํ ์๋ง ๋จ๋ ๊ตฌ๊ฐ์์๋ ์ด๋ค ์์ฒญ์ด ์ด๋ค ๊ฒฝ๋ก๋ฅผ ํ๋์ง ์ถ์ ํ ์ ์๋ค.