๋…ผ๋ฌธ ๋งํฌ

๊ฐ•์ ๊ณผ ๋…์ฐฝ์„ฑ, ํ•ต์‹ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜, ๊ทธ๋ฆฌ๊ณ  ํ•œ๊ณ„

๋ฌผ์–ด๋ณธ ๊ฒƒ: ์ด ๋…ผ๋ฌธ์„ ์•„์ฃผ ์ž์„ธํ•˜๊ฒŒ ์ฝ๊ณ  ๋…ผ๋ฌธ์˜ ๊ฐ•์ ๊ณผ ๋…์ฐฝ์ ์ธ ์ง€์ ์„ ์„ค๋ช…ํ•ด์ฃผ๊ณ  ํ•ต์‹ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์˜ˆ์‹œ ์ž…๋ ฅ์„ ๋“ค์–ด์„œ ์ „์ฒด์ ์ธ ๊ณผ์ •์„ ์„ค๋ช…ํ•ด์ค˜ ์ถ”๊ฐ€์ ์œผ๋กœ ๋…ผ๋ฌธ์˜ ํ•œ๊ณ„์ ์— ๋Œ€ํ•ด์„œ๋„ ์•Œ๋ ค์ค˜

๐Ÿ“Œ ๋…ผ๋ฌธ ์ œ๋ชฉ: NEO: Saving GPU Memory Crisis with CPU Offloading for Online LLM Inference

๐Ÿ“Œ ์ €์ž: Xuanlin Jiang, Yang Zhou, Shiyi Cao, Ion Stoica, Minlan Yu


1. ๊ฒฐ๋ก  ์š”์•ฝ (๊ฐ•์  & ๋…์ฐฝ์ ์ธ ์ง€์ )

NEO๋Š” GPU ๋ฉ”๋ชจ๋ฆฌ์˜ ์ œํ•œ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” LLM ์ถ”๋ก ์˜ ๋ณ‘๋ชฉ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋น„๋Œ€์นญ GPU-CPU ํŒŒ์ดํ”„๋ผ์ด๋‹๊ณผ ๋ถ€ํ•˜ ์ธ์‹ ์Šค์ผ€์ค„๋ง์„ ์ ์šฉํ•œ ์ƒˆ๋กœ์šด ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์ฃผ์š” ๊ฐ•์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. GPU ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ตœ์ ํ™”:

    • GPU์—์„œ ๋ชจ๋ธ ๊ฐ€์ค‘์น˜ ๋ฐ ์ผ๋ถ€ KV ์บ์‹œ๋งŒ ์œ ์ง€ํ•˜๋ฉฐ, ๋‚˜๋จธ์ง€ ์บ์‹œ๋Š” CPU๋กœ ์˜คํ”„๋กœ๋“œํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ณ‘๋ชฉ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
    • GPU์™€ CPU ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ตœ์ ํ™”ํ•˜์—ฌ ๋ณ‘๋ ฌ ์—ฐ์‚ฐ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋น„๋Œ€์นญ ํŒŒ์ดํ”„๋ผ์ด๋‹ (Asymmetric Pipelining):

    • ํ•˜๋‚˜์˜ ๋ฐฐ์น˜๋ฅผ ๋‘ ๊ฐœ๋กœ ๋‚˜๋ˆ„์–ด GPU์™€ CPU์—์„œ ๋™์‹œ์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    • GPU์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๋ฉด์„œ๋„ CPU์˜ ์—ฐ์‚ฐ ๋Šฅ๋ ฅ์„ ์ ์ ˆํžˆ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ธฐ์กด ๋Œ€์นญ ํŒŒ์ดํ”„๋ผ์ด๋‹๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ CPU์™€ GPU๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ถ€ํ•˜ ์ธ์‹ ์Šค์ผ€์ค„๋ง (Load-Aware Scheduling):

    • GPU ๋ฐ CPU์˜ ์‚ฌ์šฉ๋ฅ ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ์ตœ์ ์˜ ์˜คํ”„๋กœ๋“œ ์ •์ฑ…์„ ๋™์ ์œผ๋กœ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ์ž‘์—…์ด GPU ๋˜๋Š” CPU์—์„œ ์ตœ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋„๋ก ๋ฐฐ์น˜๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค.
  4. ์„ฑ๋Šฅ ํ–ฅ์ƒ:

    • H100 GPU์—์„œ ์ตœ๋Œ€ 14%, A10G GPU์—์„œ 26%, T4 GPU์—์„œ 7.5๋ฐฐ์˜ ์ถ”๋ก  ์ฒ˜๋ฆฌ๋Ÿ‰ ์ฆ๊ฐ€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
    • ๋ณด๋‹ค ๊ฐ•๋ ฅํ•œ CPU๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ A10G GPU์—์„œ 79.3%์˜ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

2. ํ•ต์‹ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๋ช… (์˜ˆ์‹œ ํฌํ•จ)

๐Ÿ’ก NEO์˜ ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” GPU ๋ฉ”๋ชจ๋ฆฌ ์ œ์•ฝ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด CPU๋กœ ์ผ๋ถ€ ์ž‘์—…์„ ์˜คํ”„๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

NEO์˜ ๊ตฌ์„ฑ ์š”์†Œ

  • Prefilling: ์ž…๋ ฅ ํ…์ŠคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ดˆ๊ธฐ KV ์บ์‹œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • Decoding: ์ž…๋ ฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ์šด ํ† ํฐ์„ ์˜ˆ์ธกํ•˜๋ฉฐ, ์ƒ์„ฑ๋œ KV ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Scheduler: ์ž‘์—… ์š”์ฒญ์„ GPU์™€ CPU๋กœ ๋ถ„๋ฐฐํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•ฉ๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณผ์ •

  1. ์ž…๋ ฅ ๋ฐ ์ดˆ๊ธฐํ™”:

    • ์˜ˆ์‹œ ์ž…๋ ฅ: “The quick brown fox jumps over the lazy dog.”
    • ๋ชจ๋ธ์€ ์ด ์ž…๋ ฅ์„ ํ† ํฐํ™”ํ•˜๊ณ  ์ž„๋ฒ ๋”ฉ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. Prefilling Stage (GPU):

    • ์ž…๋ ฅ ํ† ํฐ์„ ํ†ตํ•ด ์ดˆ๊ธฐ KV ์บ์‹œ๋ฅผ GPU์—์„œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • ์ด ๋•Œ, ๋ชจ๋ธ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋ชจ๋‘ GPU ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  3. Decoding Stage (GPU + CPU):

    • ๋น„๋Œ€์นญ ํŒŒ์ดํ”„๋ผ์ด๋‹์„ ์ ์šฉํ•˜์—ฌ ์ผ๋ถ€ ์š”์ฒญ์€ GPU์—์„œ, ์ผ๋ถ€๋Š” CPU๋กœ ์˜คํ”„๋กœ๋“œํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ž…๋ ฅ ๊ธธ์ด๊ฐ€ ๊ธด ์š”์ฒญ์€ GPU์—์„œ, ์งง์€ ์š”์ฒญ์€ CPU์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋ถ„๋ฐฐํ•ฉ๋‹ˆ๋‹ค.
  4. Load-Aware Scheduling:

    • GPU์™€ CPU์˜ ์‚ฌ์šฉ๋ฅ ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ‰๊ฐ€ํ•˜์—ฌ ์ตœ์ ์˜ ์ž‘์—… ๋ถ„๋ฐฐ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ GPU๊ฐ€ ๊ณผ๋ถ€ํ•˜ ์ƒํƒœ๋ผ๋ฉด ๋” ๋งŽ์€ ์š”์ฒญ์„ CPU๋กœ ์˜คํ”„๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  5. ๊ฒฐ๊ณผ ์ƒ์„ฑ:

    • ์˜ˆ๋ฅผ ๋“ค์–ด, “dog"๋ผ๋Š” ๋‹จ์–ด ๋‹ค์Œ์— ๋ชจ๋ธ์ด “is sleeping"์„ ์˜ˆ์ธกํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • GPU์™€ CPU์—์„œ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋Š” ๊ฒฐํ•ฉํ•˜์—ฌ ์ตœ์ข… ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

3. ๋…ผ๋ฌธ์˜ ํ•œ๊ณ„์ 

  1. GPU์™€ CPU ๊ฐ„ ํ†ต์‹  ๋ณ‘๋ชฉ (PCIe Bandwidth ๋ฌธ์ œ):

    • GPU์™€ CPU ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋ฉด PCIe ๋Œ€์—ญํญ์ด ๋ณ‘๋ชฉ์œผ๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์Šค์ผ€์ค„๋ง ๋ณต์žก๋„ ์ฆ๊ฐ€:

    • ๋ถ€ํ•˜ ์ธ์‹ ์Šค์ผ€์ค„๋ง์€ ์‹ค์‹œ๊ฐ„์œผ๋กœ GPU์™€ CPU ์‚ฌ์šฉ๋ฅ ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ตœ์ ์˜ ๋ฐฐ์น˜๋ฅผ ์ฐพ์•„์•ผ ํ•˜๋ฏ€๋กœ ์ถ”๊ฐ€์ ์ธ ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  3. ํŠน์ • ํ™˜๊ฒฝ์—์„œ ์„ฑ๋Šฅ ์ €ํ•˜:

    • ์ž…๋ ฅ ๊ธธ์ด๊ฐ€ ์งง๊ฑฐ๋‚˜ GPU ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ถฉ๋ถ„ํžˆ ํด ๊ฒฝ์šฐ, CPU๋กœ์˜ ์˜คํ”„๋กœ๋“œ๊ฐ€ ์˜คํžˆ๋ ค ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ๋‹ค์ค‘ GPU ํ™˜๊ฒฝ์—์„œ์˜ ์ตœ์ ํ™” ๋ฏธํก:

    • ๋…ผ๋ฌธ์—์„œ๋Š” ์ฃผ๋กœ ๋‹จ์ผ GPU ๋˜๋Š” 2-GPU ํ™˜๊ฒฝ์—์„œ์˜ ์‹คํ—˜์ด ์ด๋ฃจ์–ด์กŒ์œผ๋ฉฐ, 4-GPU ์ด์ƒ์˜ ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๊ฒ€์ฆ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.

4. ๊ฒฐ๋ก  ๋ฐ ์ œ์•ˆ

NEO๋Š” GPU ๋ฉ”๋ชจ๋ฆฌ ์ œ์•ฝ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด CPU ์˜คํ”„๋กœ๋“œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ์‹œ์Šคํ…œ์œผ๋กœ, ๋‹ค์–‘ํ•œ ์‹คํ—˜์—์„œ ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์ž…์ฆํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์ค‘ GPU ํ™˜๊ฒฝ์—์„œ์˜ ์ตœ์ ํ™”์™€ PCIe ๋Œ€์—ญํญ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ์—ฐ๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ

  • ๋‹ค์ค‘ GPU ํ™˜๊ฒฝ ์ตœ์ ํ™”: Tensor ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๋ฐ ๋ชจ๋ธ ์ƒค๋”ฉ ๊ธฐ๋ฒ•์„ ๊ฐœ์„ ํ•˜์—ฌ ๋‹ค์ค‘ GPU ํ™˜๊ฒฝ์—์„œ๋„ ๋†’์€ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • PCIe ๋ณ‘๋ชฉ ํ•ด๊ฒฐ: CPU์™€ GPU ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์˜คํ”„๋กœ๋“œ ๋ฐฉ์•ˆ์„ ์—ฐ๊ตฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์˜ˆ์‹œ๋กœ ๋”ฐ๋ผ๊ฐ€๊ธฐ

๋ฌผ์–ด๋ณธ ๊ฒƒ: ๋…ผ๋ฌธ์˜ ํ•ต์‹ฌ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด ์•„์ฃผ ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์ฃผ๊ณ  ์ •๋ฆฌํ•ด ์ค˜

๋…ผ๋ฌธ์˜ ํ•ต์‹ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์˜ˆ์‹œ ์ž…๋ ฅ์„ ๋ฐ”ํƒ•์œผ๋กœ ์•„์ฃผ ๊ตฌ์ฒด์ ์ด๊ณ  ๋‹จ๊ณ„์ ์œผ๋กœ ์„ค๋ช…ํ•˜๊ณ  ์ •๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ ํ•ต์‹ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜: NEO์˜ ๋น„๋Œ€์นญ GPU-CPU ํŒŒ์ดํ”„๋ผ์ด๋‹ ๋ฐ ๋ถ€ํ•˜ ์ธ์‹ ์Šค์ผ€์ค„๋ง

NEO๋Š” GPU ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์œผ๋กœ ์ธํ•œ ์ถ”๋ก  ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ์ผ๋ถ€ ์—ฐ์‚ฐ(Decoding Attention)๊ณผ ๋ฉ”๋ชจ๋ฆฌ(KV Cache)๋ฅผ GPU์—์„œ CPU๋กœ ์˜คํ”„๋กœ๋“œํ•˜์—ฌ GPU์˜ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ ๋†’์ด๊ณ  ์ถ”๋ก  ์„ฑ๋Šฅ์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ „์ฒด ๊ณผ์ • (์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…)

์˜ˆ์‹œ ์ž…๋ ฅ ํ…์ŠคํŠธ:

PLAINTEXT
"OpenAI develops powerful AI models."

์ด ์ž…๋ ฅ์ด ๋“ค์–ด์™”์„ ๋•Œ LLM ์ถ”๋ก ์ด ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๋Š”์ง€ ๊ธฐ์กด ๋ฐฉ์‹(vLLM)๊ณผ NEO ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ž์„ธํžˆ ๋น„๊ตํ•˜๋ฉฐ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

โœ… ์˜ˆ์‹œ ํ™˜๊ฒฝ

  • GPU: NVIDIA A10G (GPU ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ: 24GB)
  • CPU: Intel Xeon (64GB ๋ฉ”๋ชจ๋ฆฌ)

๐Ÿ“ 1๋‹จ๊ณ„: Prefilling Stage (์ดˆ๊ธฐ ์ž…๋ ฅ ์ฒ˜๋ฆฌ)

โ–ช๏ธ ๊ธฐ์กด ๋ฐฉ์‹ (vLLM)

  • ์ž…๋ ฅ ํ† ํฐ(์˜ˆ: [“OpenAI”, “develops”, “powerful”, “AI”, “models”, “.”])์„ GPU์—์„œ Transformer ์ธต์„ ๊ฑฐ์ณ ์ž„๋ฒ ๋”ฉ ์ƒ์„ฑ ๋ฐ ์ดˆ๊ธฐ KV ์บ์‹œ ์ƒ์„ฑ
  • ์ƒ์„ฑ๋œ KV ์บ์‹œ๋Š” ๋ชจ๋‘ GPU ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ

๋ฌธ์ œ์ :
์ž…๋ ฅ์ด ๋งŽ์•„์ง€๋ฉด GPU ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์œผ๋กœ batch size๊ฐ€ ์ œํ•œ๋˜๊ณ  GPU ์—ฐ์‚ฐ ์ž์›์ด ๋‚ญ๋น„๋จ.

๐ŸŸข NEO ๋ฐฉ์‹

  • ์ž…๋ ฅ ํ† ํฐ์€ ๋™์ผํ•˜๊ฒŒ GPU์—์„œ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ž„๋ฒ ๋”ฉ ๋ฐ ์ดˆ๊ธฐ KV ์บ์‹œ ์ƒ์„ฑ.
  • ๊ทธ๋Ÿฌ๋‚˜ ์ƒ์„ฑ๋œ KV ์บ์‹œ๋ฅผ GPU ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ๋งŒํผ๋งŒ GPU์— ์œ ์ง€ํ•˜๊ณ , ๋‚˜๋จธ์ง€๋Š” ์ฆ‰์‹œ CPU ๋ฉ”๋ชจ๋ฆฌ๋กœ ์˜คํ”„๋กœ๋“œ(์ „์†ก) ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋•Œ GPU์™€ CPU ๊ฐ„ KV ์บ์‹œ ์ „์†ก์€ ๊ณ„์ธต(layer) ๋‹จ์œ„๋กœ ์ฆ‰์‹œ ์ˆ˜ํ–‰๋˜๋ฉฐ, ์—ฐ์‚ฐ๊ณผ ์ „์†ก์ด ๊ฒน์น˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

NEO ์ด์ :
GPU ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ๋ฌธ์ œ ํ•ด๊ฒฐ (GPU์™€ CPU ๋ฉ”๋ชจ๋ฆฌ ๋™์‹œ ํ™œ์šฉ)


๐Ÿ“ 2๋‹จ๊ณ„: Decoding Stage (์ถœ๋ ฅ ํ† ํฐ ์ƒ์„ฑ)

์ž…๋ ฅ ๋ฌธ์žฅ ๋‹ค์Œ์— ์˜ฌ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ๋‹จ์–ด๋“ค์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ • (์˜ˆ: “They”, “are”, “widely”, “used”, …)

โ–ช๏ธ ๊ธฐ์กด ๋ฐฉ์‹ (vLLM)

  • GPU์—์„œ ์ž…๋ ฅ๋œ KV ์บ์‹œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ attention์„ ๊ณ„์‚ฐํ•˜๊ณ  ๋‹ค์Œ ํ† ํฐ ์ƒ์„ฑ (์˜ˆ: “They”).
  • ๋ชจ๋“  ๊ณ„์‚ฐ(KV cache ๋ฐ attention ๊ณ„์‚ฐ)์€ GPU์—์„œ๋งŒ ์ˆ˜ํ–‰.

๋ฌธ์ œ์ :
GPU ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์œผ๋กœ ์ธํ•ด batch ํฌ๊ธฐ๋ฅผ ํฌ๊ฒŒ ๋Š˜๋ฆฌ์ง€ ๋ชปํ•˜๊ณ  GPU ์—ฐ์‚ฐ ์ž์›์„ ์ถฉ๋ถ„ํžˆ ํ™œ์šฉ ๋ชป ํ•จ.

๐ŸŸข NEO ๋ฐฉ์‹

NEO๋Š” ๋น„๋Œ€์นญ GPU-CPU ํŒŒ์ดํ”„๋ผ์ด๋‹์„ ์ ์šฉํ•˜์—ฌ ๋‘ ๊ฐœ์˜ ์„œ๋ธŒ ๋ฐฐ์น˜๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค:

  • Batch 0 (GPU ์ค‘์‹ฌ ๋ฐฐ์น˜):

    • Prefilling ๋‹จ๊ณ„์˜ ์š”์ฒญ๋“ค (์ž…๋ ฅ์ฒ˜๋ฆฌ) + ์ผ๋ถ€ GPU์— ์ ํ•ฉํ•œ Decoding ์š”์ฒญ๋“ค์„ GPU์—์„œ ์ฒ˜๋ฆฌ.
    • ์ฃผ๋กœ GPU ๋ฉ”๋ชจ๋ฆฌ์™€ ์—ฐ์‚ฐ ์ž์›์„ ํ™œ์šฉํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ์ง„ํ–‰๋˜๋Š” batch.
  • Batch 1 (CPU ์ค‘์‹ฌ ๋ฐฐ์น˜):

    • Decoding ๋‹จ๊ณ„ ์ค‘ attention ๊ณ„์‚ฐ์ด ๋ฌด๊ฑฐ์šด ์š”์ฒญ๋“ค(๊ธธ์ด๊ฐ€ ๊ธธ๊ฑฐ๋‚˜ KV ์บ์‹œ๊ฐ€ ํฐ ์š”์ฒญ)์„ CPU๋กœ ์˜คํ”„๋กœ๋“œํ•˜์—ฌ ์ฒ˜๋ฆฌ.
    • ์ด ์š”์ฒญ๋“ค์˜ attention ์—ฐ์‚ฐ๊ณผ KV ์บ์‹œ ์ ‘๊ทผ์„ CPU ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ˆ˜ํ–‰.

์ด์ :
GPU๋Š” GPU์— ์ ํ•ฉํ•œ ์ž‘์—…์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ , CPU๋Š” attention ์ค‘์‹ฌ์˜ memory-bound ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ ํšจ์œจ์„ฑ ๊ทน๋Œ€ํ™”.


๐Ÿ“ 3๋‹จ๊ณ„: Load-Aware Scheduling (GPU-CPU ๋™์  ๋ถ€ํ•˜ ๋ถ„๋ฐฐ)

NEO๋Š” ๋งค iteration๋งˆ๋‹ค ๋‹ค์Œ ์›์น™์œผ๋กœ GPU์™€ CPU์˜ ์š”์ฒญ ๋ถ„๋ฐฐ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค:

  • Greedy ๋ฐฉ์‹์œผ๋กœ GPU-only ๋ฐฉ์‹๊ณผ GPU-CPU ํŒŒ์ดํ”„๋ผ์ด๋‹ ๋ฐฉ์‹์˜ ์˜ˆ์ƒ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•˜์—ฌ ๋†’์€ ์„ฑ๋Šฅ์„ ๋‚ผ ๋ฐฉ์‹์„ ์„ ํƒ.
  • GPU์™€ CPU์˜ ์—ฐ์‚ฐ ์‹œ๊ฐ„ ๊ท ํ˜• ์œ ์ง€ (Balancing)
  • GPU์˜ ๋นˆ ์‹œ๊ฐ„(idle)์„ ์ตœ์†Œํ™”ํ•˜๊ณ  CPU์˜ ์—ฐ์‚ฐ์„ GPU ์—ฐ์‚ฐ ๋’ค์— ์ˆจ๊ฒจ์„œ ๋™์‹œ ์ž‘์—… ์ˆ˜ํ–‰ (Hiding CPU)
  • GPU ์‚ฌ์šฉ์„ ๊ทน๋Œ€ํ™”ํ•˜์—ฌ ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ์š”์ฒญ์„ GPU๋กœ ์ฒ˜๋ฆฌ (Maximizing GPU)

์ด ์›์น™์„ ๊ธฐ๋ฐ˜์œผ๋กœ batch ํ˜•์„ฑ ์ ˆ์ฐจ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

์ˆœ์„œ์ฒ˜๋ฆฌ ๋‹จ๊ณ„์„ค๋ช…์ž‘์—… ์œ„์น˜
โ‘ GPU decodingGPU์— ์ตœ์ ํ™”๋œ ์š”์ฒญ์„ ์šฐ์„  GPU ๋ฐฐ์น˜GPU
โ‘กPrefilling์ƒˆ ์ž…๋ ฅ ์š”์ฒญ ์ฒ˜๋ฆฌ, KV cache๋Š” GPU์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ CPU๋กœ ์ „์†กGPUโ†’CPU
โ‘ขCPU decodingGPU ์ฒ˜๋ฆฌ์— ๋ฐฉํ•ด๋˜์ง€ ์•Š๋Š” ์š”์ฒญ์„ CPU ๋ฐฐ์น˜CPU
โ‘ฃPrefilling ์กฐ์ •CPU ์ž‘์—… ์‹œ๊ฐ„์„ ์ดˆ๊ณผํ•˜์ง€ ์•Š๋„๋ก Prefilling ์š”์ฒญ ์ตœ์ ํ™”GPU
โ‘ค๋ฐฉ์‹ ๊ฒฐ์ •GPU-only์™€ GPU-CPU ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์ค‘ ์ตœ์„ ์˜ ๋ฐฉ์‹์„ ์„ ํƒGPU-CPU

๐Ÿ“ 4๋‹จ๊ณ„: ๊ฒฐ๊ณผ ์ทจํ•ฉ ๋ฐ ์ถœ๋ ฅ

  • GPU์™€ CPU์—์„œ ๋ณ‘๋ ฌ๋กœ ๊ณ„์‚ฐ๋œ attention ๊ฒฐ๊ณผ๋Š” ์ตœ์ข…์ ์œผ๋กœ GPU๋กœ ์ „๋‹ฌ๋˜์–ด ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ตœ์ข… ์ž„๋ฒ ๋”ฉ์ด ์™„์„ฑ๋˜๋ฉด ๋‹ค์Œ ํ† ํฐ(์˜ˆ: “They”)์˜ ํ™•๋ฅ ์„ ๊ณ„์‚ฐํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ๐Ÿ“ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํšจ๊ณผ (๋…ผ๋ฌธ ์‹คํ—˜ ๊ฒฐ๊ณผ ๊ธฐ๋ฐ˜)

GPU ์žฅ๋น„๋ชจ๋ธ ํฌ๊ธฐvLLM ๋Œ€๋น„ NEO ์„ฑ๋Šฅ ํ–ฅ์ƒ
T47B์ตœ๋Œ€ 7.5๋ฐฐ ์ฆ๊ฐ€
A10G8B์ตœ๋Œ€ 26% ์ฆ๊ฐ€
H10070B์ตœ๋Œ€ 14% ์ฆ๊ฐ€

โ€ป CPU ๋ฉ”๋ชจ๋ฆฌ ๋Œ€์—ญํญ์ด ํด์ˆ˜๋ก ์„ฑ๋Šฅ ์ฆ๊ฐ€ํญ ์ปค์ง (์ตœ๋Œ€ 79.3%)


๐Ÿ” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ „์ฒด ์š”์•ฝ (์ •๋ฆฌ)

NEO์˜ ํ•ต์‹ฌ์€ GPU ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด CPU๋กœ attention ์—ฐ์‚ฐ๊ณผ KV ์บ์‹œ ์ผ๋ถ€๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์˜คํ”„๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋น„๋Œ€์นญ ํŒŒ์ดํ”„๋ผ์ด๋‹๊ณผ ๋ถ€ํ•˜ ์ธ์‹ ์Šค์ผ€์ค„๋ง์„ ์ ์šฉํ•˜์—ฌ GPU์™€ CPU ์ž์›์„ ๋™์ ์œผ๋กœ ์ตœ์ ํ™”ํ•˜๊ณ , ๊ฒฐ๊ณผ์ ์œผ๋กœ GPU-only ์‹œ์Šคํ…œ ๋Œ€๋น„ ํ˜„์ €ํ•œ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์ด๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ์กด ๋ฐฉ์‹: ๋ชจ๋“  ์—ฐ์‚ฐ๊ณผ KV ์บ์‹œ๊ฐ€ GPU์— ์œ„์น˜.
  • NEO ๋ฐฉ์‹:
    • GPU์—์„œ ์ ํ•ฉํ•œ ์ž‘์—… ์ˆ˜ํ–‰ (Prefilling, Linear ๊ณ„์‚ฐ)
    • CPU์—์„œ ์ ํ•ฉํ•œ ์ž‘์—… ์ˆ˜ํ–‰ (Memory-bound Attention)
    • GPU์™€ CPU ์—ฐ์‚ฐ์ด ์„œ๋กœ ๊ฒน์ณ์„œ ๋ณ‘๋ ฌํ™”

๊ฒฐ๊ณผ์ ์œผ๋กœ GPU ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ๊ทน๋ณตํ•˜๊ณ  GPU์™€ CPU์˜ ๊ฐ•์ ์„ ๋ชจ๋‘ ํ™œ์šฉํ•˜์—ฌ LLM ์ถ”๋ก  ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•œ ๋…์ฐฝ์ ์ธ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

์‹คํ—˜ ๊ฒฐ๊ณผ์™€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋ก ๊ณผ์˜ ์ฐจ์ด

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

๋…ผ๋ฌธ์˜ ์‹คํ—˜ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ธํžˆ ๋ถ„์„ํ•˜์—ฌ, ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋ก ๊ณผ ๋น„๊ตํ•˜์—ฌ ํŠน์ถœ๋‚œ ์ ๊ณผ ๊ทธ ์ด์œ ๋ฅผ ๋…ผ๋ฌธ์—์„œ ์ œ์‹œํ•œ ๊ทผ๊ฑฐ์™€ ํ•จ๊ป˜ ๋ถ„์„ํ•˜๊ณ , ์ €์˜ ๊ฒฌํ•ด๋ฅผ ๋ง๋ถ™์—ฌ ์ •๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ”‘ 1. ์‹คํ—˜๊ฒฐ๊ณผ ์š”์•ฝ (์ •๋Ÿ‰์  ์ˆ˜์น˜)

๋…ผ๋ฌธ์€ ์„ธ ๊ฐ€์ง€ GPU ํ™˜๊ฒฝ(T4, A10G, H100)๊ณผ ์„ธ ๊ฐ€์ง€ LLM ๋ชจ๋ธ(7B, 8B, 70B)์— ๋Œ€ํ•ด NEO, vLLM (GPU-only), ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์กด์˜ CPU ์˜คํ”„๋กœ๋“œ ๋ฐฉ์‹์ธ FastDecode๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

GPU ํ™˜๊ฒฝ๋ชจ๋ธ ํฌ๊ธฐThroughput (NEO vs. GPU-only(vLLM))Latency
T47B์ตœ๋Œ€ 7.5๋ฐฐ(750%) ์ฆ๊ฐ€์œ ์ง€
A10G8B์ตœ๋Œ€ 26% ์ฆ๊ฐ€์œ ์ง€
H10070B์ตœ๋Œ€ 14% ์ฆ๊ฐ€์œ ์ง€

์ถ”๊ฐ€์ ์œผ๋กœ, CPU ์„ฑ๋Šฅ์„ ๋†’์ผ ๊ฒฝ์šฐ A10G GPU ํ™˜๊ฒฝ์—์„œ ์ตœ๋Œ€ 79.3%์˜ ์„ฑ๋Šฅํ–ฅ์ƒ์ด ๊ด€์ฐฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ” 2. ๊ธฐ์กด ๋ฐฉ๋ฒ•๋ก  ๋Œ€๋น„ ํŠน์ถœ๋‚œ ์ 

๋…ผ๋ฌธ์—์„œ ๋น„๊ตํ•œ ์ฃผ์š” ๊ธฐ์กด ๋ฐฉ๋ฒ•๋ก ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • vLLM (GPU-only): GPU๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์œผ๋กœ ์ธํ•ด ๋†’์€ batch ํฌ๊ธฐ๋ฅผ ํ™•๋ณดํ•˜์ง€ ๋ชปํ•˜๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • FastDecode: KV cache์™€ attention์„ ๋ชจ๋‘ CPU์— ์™„์ „ํžˆ ์˜คํ”„๋กœ๋“œํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, CPU๊ฐ€ ๋ณ‘๋ชฉ ์ง€์ ์ด ๋˜์–ด ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๋Š” ๋ฌธ์ œ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋น„๊ต ๊ธฐ์ค€NEO (๋ณธ ๋…ผ๋ฌธ)vLLM (GPU-only)FastDecode (Full Offload)
GPU ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑโญ• ๋†’์ŒโŒ ๋‚ฎ์Œ (์ œํ•œ์  batch size)โญ• ๋†’์Œ
CPU-GPU ๋ณ‘๋ ฌํ™”โญ• ๋งค์šฐ ํšจ์œจ์ โŒ ์—†์Œโ–ณ ์ œํ•œ์  ๋ณ‘๋ ฌํ™”
Latency ์œ ์ง€โญ• ์œ ์ง€โญ• ์œ ์ง€โŒ ์ฆ๊ฐ€
CPU ์ž์› ํ™œ์šฉโญ• ์ตœ์ ํ™”โŒ ํ™œ์šฉํ•˜์ง€ ์•Š์Œโ–ณ ๋ณ‘๋ชฉ์ด ๋˜์–ด ๋น„ํšจ์œจ์ 
Throughput ์„ฑ๋Šฅโญ• ๊ฐ€์žฅ ๋†’์ŒโŒ ๋‚ฎ์Œโ–ณ ์ผ๋ถ€ ํ™˜๊ฒฝ์—์„œ๋งŒ ๋†’์Œ
  • ํŠน์ถœ๋‚œ ์ง€์ :
    • NEO๋Š” GPU์˜ ์ œํ•œ๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ™•์žฅํ•˜๋ฉด์„œ CPU ์ž์›์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜์—ฌ GPU-only ๋ฐฉ์‹๊ณผ Full-offload ๋ฐฉ์‹์˜ ๋‹จ์ ์„ ๋ชจ๋‘ ๋ณด์™„ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ํŠนํžˆ GPU-only ๋ฐฉ์‹(vLLM)์— ๋น„ํ•ด ์ตœ๋Œ€ 750%๋ผ๋Š” ๊ทน์ ์ธ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๋ณด์—ฌ์ฃผ๋ฉฐ, FastDecode์˜ CPU ๋ณ‘๋ชฉ ๋ฌธ์ œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํšŒํ”ผํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿš€ 3. ๋…ผ๋ฌธ์—์„œ ๋ฐํžŒ ์„ฑ๋Šฅ ํ–ฅ์ƒ์˜ ์ฃผ์š” ์›์ธ (๋…ผ๋ฌธ์˜ ์ฃผ์žฅ)

๋…ผ๋ฌธ์€ NEO๊ฐ€ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋˜ ์ฃผ์š” ์ด์œ ๋กœ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ํ•ต์‹ฌ ๊ธฐ์ˆ ์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.

โ‘  Asymmetric Pipelining (๋น„๋Œ€์นญ ํŒŒ์ดํ”„๋ผ์ด๋‹)

  • GPU ์—ฐ์‚ฐ(Linear operation, Prefilling)์— ์ตœ์ ํ™”๋œ ์š”์ฒญ์„ GPU์—์„œ,
    attention ์—ฐ์‚ฐ์ด ๋งŽ์€ ์š”์ฒญ์€ CPU์—์„œ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ณ‘๋ ฌํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ํšจ๊ณผ: GPU ๋ฉ”๋ชจ๋ฆฌ์˜ ํšจ์œจ์  ์‚ฌ์šฉ๊ณผ ๋™์‹œ์— CPU ์—ฐ์‚ฐ ๋Šฅ๋ ฅ๊นŒ์ง€ ์ตœ๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋…ผ๋ฌธ์˜ ๊ทผ๊ฑฐ:
“๊ธฐ์กด ๋Œ€์นญ(symmetric) ํŒŒ์ดํ”„๋ผ์ด๋‹์€ GPU์™€ CPU๊ฐ€ ๋™์ผํ•œ ์ž‘์—…๋Ÿ‰์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋ฏ€๋กœ, CPU๊ฐ€ ๋ณ‘๋ชฉ์ด ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
NEO์˜ ๋น„๋Œ€์นญ(asymmetric) ํŒŒ์ดํ”„๋ผ์ด๋‹์€ ์„œ๋กœ ๋‹ค๋ฅธ ์ž‘์—… ์„ฑ๊ฒฉ์„ GPU์™€ CPU์— ์ ์ ˆํžˆ ๋ฐฐ์น˜ํ•˜์—ฌ idle ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค.”

โ‘ก Load-Aware Scheduling (๋ถ€ํ•˜ ์ธ์‹ ์Šค์ผ€์ค„๋ง)

  • ๋งค iteration๋งˆ๋‹ค ์‹ค์‹œ๊ฐ„์œผ๋กœ GPU์™€ CPU์˜ ๋ถ€ํ•˜๋ฅผ ๊ณ ๋ คํ•ด ์š”์ฒญ์„ ๋™์ ์œผ๋กœ ๋ถ„๋ฐฐํ•ฉ๋‹ˆ๋‹ค.
  • ํšจ๊ณผ: GPU์™€ CPU ์–ด๋А ํ•œ ์ชฝ๋„ ๋ณ‘๋ชฉ์ด ๋˜์ง€ ์•Š๋„๋ก ๊ท ํ˜• ์œ ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

๋…ผ๋ฌธ์˜ ๊ทผ๊ฑฐ:
“๊ธฐ์กด ๋ฐฉ์‹์€ ์ •์ ์ธ(static) ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์˜ ์ž…/์ถœ๋ ฅ ๊ธธ์ด ๋ณ€ํ™”๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋Œ€์‘ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
NEO์˜ ๋™์  ๋ถ€ํ•˜ ์ธ์‹ ์Šค์ผ€์ค„๋ง์€ ์‹ค์‹œ๊ฐ„ ํ™˜๊ฒฝ์—์„œ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ์š”์ฒญ ๋ฐฐ์น˜๋ฅผ ๊ฒฐ์ •ํ•ด ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.”


๐ŸŽฏ 4. ๋‚˜์˜ ๋ถ„์„ ๋ฐ ๊ฒฌํ•ด

๋…ผ๋ฌธ์˜ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์€ GPU ๋ฉ”๋ชจ๋ฆฌ์˜ ์ œ์•ฝ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ƒ๋‹นํžˆ ํ˜„์‹ค์ ์ด๊ณ  ํšจ๊ณผ์ ์ธ ์ ‘๊ทผ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ธก๋ฉด์—์„œ ๋…์ฐฝ์„ฑ๊ณผ ์‹คํšจ์„ฑ์„ ๋†’๊ฒŒ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • ํ˜„์‹ค์ ์ธ GPU ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ
    GPU ๊ธฐ์ˆ ์€ ๋น ๋ฅด๊ฒŒ ๋ฐœ์ „ํ•˜์—ฌ ์—ฐ์‚ฐ ์„ฑ๋Šฅ์€ ๊ธ‰์†ํžˆ ์ฆ๊ฐ€ํ–ˆ์œผ๋‚˜, ๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰์€ ์ œํ•œ์ ์ธ ๋ฐœ์ „ ์†๋„๋ฅผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.
    NEO๋Š” ์ด๋Ÿฌํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ๋ฌธ์ œ์— ๋Œ€ํ•ด CPU ์˜คํ”„๋กœ๋“œ๋ฅผ ์•„์ฃผ ์‹ค์šฉ์ ์ธ ํ•ด๋ฒ•์œผ๋กœ ์ œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

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

  • CPU๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ ˆ์ œ๋œ ์„ค๊ณ„
    FastDecode๋Š” ๋ชจ๋“  attention ์ž‘์—…์„ CPU๋กœ ๋„˜๊ธฐ๋ฉด์„œ CPU ๋ณ‘๋ชฉ ๋ฌธ์ œ๊ฐ€ ์‹ฌ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
    ๋ฐ˜๋ฉด NEO๋Š” ๋ถ€๋ถ„์ ์ธ ์˜คํ”„๋กœ๋“œ๋กœ CPU์˜ ๋ถ€๋‹ด์„ ์ตœ์†Œํ™”ํ•˜์—ฌ, ํ˜„์‹ค์ ์ธ ๋ณ‘๋ชฉ ๋ฌธ์ œ๋ฅผ ํšŒํ”ผํ•˜๋Š” ์ง€ํ˜œ๋กœ์šด ์„ค๊ณ„๋ฅผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ, ํ•œ ๊ฐ€์ง€ ์šฐ๋ ค๋˜๋Š” ๋ถ€๋ถ„์€:

  • GPU-CPU ๊ฐ„ ๋นˆ๋ฒˆํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก์œผ๋กœ ์ธํ•œ PCIe bandwidth ๋ณ‘๋ชฉ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ๋” ๋†’์€ ์„ฑ๋Šฅ์˜ PCIe ๋˜๋Š” CXL ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ํ•ด์†Œ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์ง€๋งŒ, ๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ์‹คํ—˜ ๊ฒ€์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ตœ์ข… ๊ฒฐ๋ก  ๋ฐ ์ œ์•ˆ

์ด ๋…ผ๋ฌธ์€ GPU ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํšจ๊ณผ์ ์ด๋ฉฐ ์‹ค์šฉ์ ์ธ ์ ‘๊ทผ๋ฒ•์œผ๋กœ์„œ ๋งค์šฐ ์œ ์˜๋ฏธํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” GPU-CPU์˜ ์ž์›์„ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ์ „๋žต ๋•๋ถ„์ด๋ฉฐ, ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋ก ์ด ๊ฐ€์ง€๋Š” ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•œ ๋…์ฐฝ์ ์ธ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

ํ–ฅํ›„ ์—ฐ๊ตฌ์—์„œ๋Š”:

  • PCIe ๋Œ€์—ญํญ ์ œํ•œ์„ ์–ด๋–ป๊ฒŒ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ์„์ง€์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์‹คํ—˜๊ณผ ๋ถ„์„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋” ๋งŽ์€ GPU (4~8 GPU ์ด์ƒ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ํ™˜๊ฒฝ์—์„œ์˜ ์„ฑ๋Šฅ์„ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ถ”๊ฐ€ ์—ฐ๊ตฌ๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค๋ฉด, NEO ๋ฐฉ์‹์€ ๋Œ€๊ทœ๋ชจ LLM ์ถ”๋ก  ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ๊ณผ ํšจ์œจ์„ฑ์„ ํฌ๊ฒŒ ๊ฐœ์„ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

์ž…๋ ฅ ๋ฐ์ดํ„ฐ์™€ ์ถ”๋ก  ๊ณผ์ •, ๋ชจ๋ธ ๊ตฌ์กฐ์™€ ์ž์› ์š”๊ตฌ๋Ÿ‰

๋ฌผ์–ด๋ณธ ๊ฒƒ: ์ด ๋…ผ๋ฌธ์˜ ์ž…๋ ฅ๋ฐ์ดํ„ฐ์™€ ์ถ”๋ก  ๊ณผ์ •์— ๋Œ€ํ•ด์„œ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด ์•„์ฃผ ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…ํ•ด ์ฃผ๊ฒ ๋‹ˆ? ์ถ”๊ฐ€์ ์œผ๋กœ ๋ชจ๋ธ์•„ํ‚คํ…์ฒ˜์˜ ๊ตฌ์„ฑ ๋ฐ ๋ชจ๋ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ์—ฐ์‚ฐ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ๋Ÿ‰ ์ปดํ“จํŒ… ์š”๊ตฌ๋Ÿ‰ ๋Œ€ํ•ด์„œ๋„ ์„ค๋ช…ํ•ด์ค˜

์ด ๋…ผ๋ฌธ์—์„œ ์ œ์‹œ๋œ NEO ์‹œ์Šคํ…œ์˜ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ณผ์ •, ์ถ”๋ก  ๊ณผ์ •, ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜, ์—ฐ์‚ฐ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ/์ปดํ“จํŒ… ์š”๊ตฌ๋Ÿ‰์„ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด ๋งค์šฐ ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ 1. ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์™€ ์ถ”๋ก  ๊ณผ์ • ์˜ˆ์‹œ (Detailed Example)

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž…๋ ฅ ๋ฌธ์žฅ์„ ์˜ˆ์‹œ๋กœ ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

์ž…๋ ฅ ๋ฌธ์žฅ:

PLAINTEXT
"GPT models can generate high-quality text."

์ด ์ž…๋ ฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ NEO ์‹œ์Šคํ…œ์—์„œ ์ถ”๋ก ์ด ์ง„ํ–‰๋˜๋Š” ๊ตฌ์ฒด์ ์ด๊ณ  ์ƒ์„ธํ•œ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


๐Ÿ” 2. NEO ์‹œ์Šคํ…œ์˜ ๋‹จ๊ณ„๋ณ„ ์ถ”๋ก  ๊ณผ์ • ์ƒ์„ธ ์„ค๋ช…

NEO์—์„œ์˜ LLM ์ถ”๋ก ์€ ํฌ๊ฒŒ Prefilling๊ณผ Decoding ๋‘ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

โœ… ๋‹จ๊ณ„ 1: Prefilling ๋‹จ๊ณ„

์ด ๋‹จ๊ณ„์—์„œ๋Š” ์ž…๋ ฅ๋œ ๋ฌธ์žฅ ์ „์ฒด๋ฅผ ๋ชจ๋ธ์ด ์ฒ˜๋ฆฌํ•˜์—ฌ ์ตœ์ดˆ์˜ KV ์บ์‹œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ์ž…๋ ฅ ํ† ํฐํ™”(Tokenization)
    ์ž…๋ ฅ ๋ฌธ์žฅ์ด ๋ชจ๋ธ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ† ํฐ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

    PLAINTEXT
    ["GPT", "models", "can", "generate", "high", "-", "quality", "text", "."]
  • ์ž„๋ฒ ๋”ฉ(Embedding)
    ๊ฐ ํ† ํฐ์€ ์ž„๋ฒ ๋”ฉ ๋ ˆ์ด์–ด๋ฅผ ํ†ต๊ณผํ•˜์—ฌ ๋ฒกํ„ฐ ํ˜•ํƒœ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.

    • ์ž…๋ ฅ ์ฐจ์› ์˜ˆ์‹œ: [ํ† ํฐ์ˆ˜ ร— ์ž„๋ฒ ๋”ฉ ํฌ๊ธฐ]
  • Transformer Layer ์—ฐ์‚ฐ
    Transformer๋Š” ์ฃผ๋กœ Attention ์—ฐ์‚ฐ๊ณผ Feed Forward Network (FFN) ์—ฐ์‚ฐ์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

    • Self-Attention ์—ฐ์‚ฐ: ์ž…๋ ฅ ๋ฒกํ„ฐ๋ผ๋ฆฌ ์—ฐ๊ด€์„ฑ์„ ๊ณ„์‚ฐํ•˜์—ฌ context-awareํ•œ ๋ฒกํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

      • Attention(Q,K,V) = softmax(QKแต€/โˆšd_k)V
      • ๊ณ„์‚ฐ ๋ณต์žก๋„: ์ž…๋ ฅ ๊ธธ์ด \( n \)์— ๋Œ€ํ•ด \( O(n^2) \)
    • KV Cache ์ƒ์„ฑ
      Attention ์—ฐ์‚ฐ์˜ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋กœ Key, Value ๋ฒกํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ GPU ๋ฐ CPU ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
      (์˜ˆ: “GPT models can generate"์™€ ๊ฐ™์€ ์ด์ „ ํ† ํฐ์˜ ์ •๋ณด๊ฐ€ KV cache์— ์ €์žฅ)

    • FFN ์—ฐ์‚ฐ
      Attention ์ถœ๋ ฅ์„ ๋ฐ›์•„ FFN ์ธต์„ ํ†ต๊ณผํ•˜๋ฉฐ, ๋ชจ๋ธ์˜ ํ‘œํ˜„ ๋Šฅ๋ ฅ์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ์ถ”๊ฐ€ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ณผ์ • ํ›„ GPU์—์„œ ์ƒ์„ฑ๋œ KV cache ์ค‘ ์ผ๋ถ€๋Š” CPU ๋ฉ”๋ชจ๋ฆฌ๋กœ ์˜คํ”„๋กœ๋“œ ๋ฉ๋‹ˆ๋‹ค.


โœ… ๋‹จ๊ณ„ 2: Decoding ๋‹จ๊ณ„

Decoding ๋‹จ๊ณ„์—์„œ๋Š” ๋‹ค์Œ์— ์˜ฌ ํ† ํฐ์„ ํ•˜๋‚˜์”ฉ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

์˜ˆ์‹œ: ์ž…๋ ฅ ๋ฌธ์žฅ ์ดํ›„ ์ƒ์„ฑํ•  ๋‹ค์Œ ๋‹จ์–ด "They"์˜ ์ƒ์„ฑ์„ ์˜ˆ์ธก

  • Attention ์—ฐ์‚ฐ (Decoding Attention)
    ์ƒˆ๋กœ์šด ์ž…๋ ฅ ํ† ํฐ "They"์— ๋Œ€ํ•œ attention ์—ฐ์‚ฐ์€, ๊ธฐ์กด KV cache์™€์˜ attention์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

    • ๊ณ„์‚ฐ ๋ณต์žก๋„: KV cache์˜ ๊ธธ์ด(\(m\))์— ๋Œ€ํ•ด \( O(m) \) (์„ ํ˜• ๋ณต์žก๋„)
    • ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์ค‘์‹ฌ ์—ฐ์‚ฐ(memory bandwidth-bound ์—ฐ์‚ฐ)
  • NEO์˜ GPU-CPU ์˜คํ”„๋กœ๋“œ ์ „๋žต

    • GPU์— KV cache๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ: GPU์—์„œ ์ฒ˜๋ฆฌ
    • CPU์— ์˜คํ”„๋กœ๋“œ๋œ KV cache๋Š” CPU ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฒ˜๋ฆฌ
  • ๋น„๋Œ€์นญ ํŒŒ์ดํ”„๋ผ์ด๋‹ (NEO์˜ ๋…์ฐฝ์„ฑ)

    • GPU๊ฐ€ Prefilling๊ณผ Decoding ์ผ๋ถ€ ์—ฐ์‚ฐ(FFN, Linear)์„ ๋ณ‘๋ ฌ ์ˆ˜ํ–‰
    • CPU๊ฐ€ Attention ์—ฐ์‚ฐ๋งŒ ๋ณ‘๋ ฌ๋กœ ์ˆ˜ํ–‰

์ด๋ ‡๊ฒŒ GPU์™€ CPU์—์„œ ๋ณ‘๋ ฌ๋กœ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค์‹œ ๊ฒฐํ•ฉ๋˜์–ด ๋‹ค์Œ ๋‹จ์–ด์˜ ํ™•๋ฅ  ๋ถ„ํฌ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ๊ฐ€์žฅ ํ™•๋ฅ ์ด ๋†’์€ ๋‹จ์–ด๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ› ๏ธ 3. ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ (Transformer ๊ตฌ์กฐ)

NEO๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” Transformer ๊ธฐ๋ฐ˜ ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ธต(layer)๋“ค๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

PLAINTEXT
[Input] โ†’ [Embedding Layer] โ†’ [Transformer Layer (Attention + FFN)] x N โ†’ [Linear Layer] โ†’ [Output Token Probabilities]

๊ฐ Transformer ์ธต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฐ์‚ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • Multi-Head Attention
    • Query(Q), Key(K), Value(V) ๋ฒกํ„ฐ ๊ณ„์‚ฐ ๋ฐ Attention ์—ฐ์‚ฐ
  • Feed Forward Network (FFN)
    • ๋‘ ๊ฐœ์˜ fully-connected ์ธต์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ์ค‘๊ฐ„์— ํ™œ์„ฑํ™” ํ•จ์ˆ˜(ReLU ๋˜๋Š” GELU)๊ฐ€ ์ ์šฉ

๋ชจ๋ธ ์˜ˆ์‹œ: LLaMa-3 8B ๋ชจ๋ธ

  • ๋ชจ๋ธ ํŒŒ๋ผ๋ฏธํ„ฐ: 80์–ต ๊ฐœ
  • ์ธต(layer) ์ˆ˜: 32๊ฐœ
  • ์ž„๋ฒ ๋”ฉ ์ฐจ์›: 4096 ์ฐจ์›
  • ํ—ค๋“œ(head)์˜ ์ˆ˜: 32๊ฐœ (Attention ์—ฐ์‚ฐ์˜ ๋ณ‘๋ ฌ์„ฑ ์ œ๊ณต)

๐Ÿ’ป 4. ์—ฐ์‚ฐ ์š”๊ตฌ๋Ÿ‰ (Computational Complexity)

Transformer ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์˜ ์—ฐ์‚ฐ์€ ํฌ๊ฒŒ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์—ฐ์‚ฐ ์ข…๋ฅ˜์—ฐ์‚ฐ ์„ค๋ช…๊ณ„์‚ฐ ๋ณต์žก๋„
Attention ์—ฐ์‚ฐ์ž…๋ ฅ ์‹œํ€€์Šค ๊ธธ์ด n, ๋ฒกํ„ฐ ์ฐจ์› d์ผ ๋•Œ\(O(n^2 \cdot d)\) (Prefilling), \(O(n \cdot d)\) (Decoding)
FFN ์—ฐ์‚ฐ์ž…๋ ฅ ๊ธธ์ด n, ๋ฒกํ„ฐ ์ฐจ์› d์ผ ๋•Œ\(O(n \cdot d^2)\)
  • Attention์€ ์งง์€ ๋ฌธ์žฅ์—์„œ๋„ ํฐ ๋ฉ”๋ชจ๋ฆฌ bandwidth๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.
  • FFN์€ GPU ์—ฐ์‚ฐ ๋Šฅ๋ ฅ์„ ๋งŽ์ด ํ•„์š”๋กœ ํ•˜๋Š” compute-bound ์—ฐ์‚ฐ์ž…๋‹ˆ๋‹ค.

๐Ÿ’พ 5. ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ๋Ÿ‰ (Memory Requirements)

๋ฉ”๋ชจ๋ฆฌ๋Š” ํฌ๊ฒŒ ๋ชจ๋ธ ๊ฐ€์ค‘์น˜, Activations, KV Cache ๋กœ ๋‚˜๋ˆ ์ง‘๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์ข…๋ฅ˜์„ค๋ช…๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ๋Ÿ‰ ์˜ˆ์‹œ (LLaMa-3 8B ๊ธฐ์ค€)
๋ชจ๋ธ ๊ฐ€์ค‘์น˜๋ชจ๋ธ ํŒŒ๋ผ๋ฏธํ„ฐ ์ €์žฅ์•ฝ 16 GB (FP16)
Activations์ถ”๋ก  ์‹œ ์ž„์‹œ ์ €์žฅ์ˆ˜๋ฐฑ MB ~ GB (Batch์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง)
KV Cache์ด์ „ ํ† ํฐ์˜ ์ •๋ณด๋ฅผ ์ €์žฅ์ž…๋ ฅ ๊ธธ์ด์™€ ์ถœ๋ ฅ ๊ธธ์ด์— ๋น„๋ก€ (์ˆ˜ GB~์ˆ˜์‹ญ GB ์ด์ƒ ๊ฐ€๋Šฅ)

NEO๋Š” ์ด ์ค‘ KV cache ์ผ๋ถ€๋ฅผ CPU ๋ฉ”๋ชจ๋ฆฌ๋กœ ์˜คํ”„๋กœ๋“œํ•˜์—ฌ GPU ๋ฉ”๋ชจ๋ฆฌ ๋ถ€๋‹ด์„ ์ค„์ž…๋‹ˆ๋‹ค.


โš™๏ธ 6. NEO๊ฐ€ ์—ฐ์‚ฐ/๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•

NEO์˜ ์„ฑ๋Šฅํ–ฅ์ƒ ์›์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • GPU ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ โ†’ CPU ๋ฉ”๋ชจ๋ฆฌ ํ™œ์šฉ (์˜คํ”„๋กœ๋“œ)
  • Attention ์—ฐ์‚ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ bandwidth-bound ํŠน์„ฑ โ†’ CPU์—์„œ ํšจ์œจ์  ์ฒ˜๋ฆฌ
  • FFN ์—ฐ์‚ฐ์˜ compute-bound ํŠน์„ฑ โ†’ GPU์—์„œ ํšจ์œจ์  ์ฒ˜๋ฆฌ
  • GPU์™€ CPU์˜ ์—ฐ์‚ฐ์„ ๋น„๋Œ€์นญ์ ์œผ๋กœ ๋ณ‘๋ ฌํ™” โ†’ idle ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•ด ์„ฑ๋Šฅ ๊ทน๋Œ€ํ™”

์ด๋Ÿฌํ•œ ์ „๋žต ๋•๋ถ„์—, ๋™์ผ ํ•˜๋“œ์›จ์–ด ํ™˜๊ฒฝ์—์„œ๋„ GPU-only ๋ฐฉ์‹ ๋Œ€๋น„ ์ตœ๋Œ€ 7.5๋ฐฐ๋ผ๋Š” ๋†€๋ผ์šด ์„ฑ๋Šฅํ–ฅ์ƒ์„ ๋ณด์ผ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


๐Ÿšฉ ๊ฒฐ๋ก  ๋ฐ ๋‚˜์˜ ์˜๊ฒฌ

NEO๋Š” Transformer ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์˜ ํŠน์ง•์„ ์ž˜ ๋ถ„์„ํ•˜์—ฌ GPU์˜ ๋ฉ”๋ชจ๋ฆฌ ํ•œ๊ณ„๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ณ  GPU์™€ CPU์˜ ์ž์›์„ ์ตœ์ ์œผ๋กœ ํ™œ์šฉํ•œ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ์  ์ดํ•ด์™€ ํšจ์œจ์ ์ธ ์ž์› ๋ฐฐ์น˜๋Š” ์•ž์œผ๋กœ๋„ ๋‹ค์–‘ํ•œ ๋Œ€๊ทœ๋ชจ AI ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ์— ์ค‘์š”ํ•œ ์„ค๊ณ„๋ฐฉ์‹์œผ๋กœ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ•œ๊ณ„๋ฅผ ๋„˜์œผ๋ ค๋Š” ์—ฐ๊ตฌ ํ๋ฆ„

๋ฌผ์–ด๋ณธ ๊ฒƒ: ์ด ๋…ผ๋ฌธ์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์–ด๋–ค ์—ฐ๊ตฌํ๋ฆ„์ด ์žˆ๋Š”์ง€ ์ •๋ฆฌํ•ด์„œ ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…ํ•ด ์ค˜

๋ณธ ๋…ผ๋ฌธ(N E O)์€ GPU ๋ฉ”๋ชจ๋ฆฌ์˜ ์ œํ•œ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฌธ์ œ๋ฅผ CPU ์˜คํ”„๋กœ๋“œ ๋ฐ ๋น„๋Œ€์นญ ํŒŒ์ดํ”„๋ผ์ด๋‹ ๊ธฐ๋ฒ•์œผ๋กœ ํšจ๊ณผ์ ์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋…ผ๋ฌธ์ด ๋ฐํžŒ ๋ช‡ ๊ฐ€์ง€ ํ•œ๊ณ„์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ตœ๊ทผ์˜ ์—ฐ๊ตฌํ๋ฆ„์—์„œ ์–ด๋– ํ•œ ์ ‘๊ทผ๋ฒ•๊ณผ ์—ฐ๊ตฌ ๋ฐฉํ–ฅ๋“ค์ด ์žˆ๋Š”์ง€ ์ •๋ฆฌํ•˜๊ณ  ์ œ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ 1. ๋…ผ๋ฌธ์—์„œ ๋ฐํžŒ ํ•œ๊ณ„์  ์š”์•ฝ

๋…ผ๋ฌธ์—์„œ ์ง์ ‘์ ์œผ๋กœ ์ œ์‹œํ•˜๊ฑฐ๋‚˜ ๊ฐ„์ ‘์ ์œผ๋กœ ์–ธ๊ธ‰ํ•œ NEO์˜ ํ•œ๊ณ„์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. GPU-CPU ๊ฐ„ ํ†ต์‹  ๋ณ‘๋ชฉ(PCIe bandwidth ๋ฌธ์ œ)

    • GPU์™€ CPU ์‚ฌ์ด KV ์บ์‹œ ๋ฐ์ดํ„ฐ์˜ ๋นˆ๋ฒˆํ•œ ์ „์†ก์œผ๋กœ ์ธํ•ด PCIe ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ณ‘๋ชฉ์ด ๋  ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ
    • ๋Œ€์—ญํญ ์ œํ•œ์œผ๋กœ ์ธํ•ด ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ ์„ฑ๋Šฅ ์ €ํ•˜ ์šฐ๋ ค๊ฐ€ ์žˆ์Œ
  2. ๋™์  ์Šค์ผ€์ค„๋ง์˜ ๋ณต์žก๋„ ์ฆ๊ฐ€ ๋ฌธ์ œ

    • GPU์™€ CPU ์ž์› ์‚ฌ์šฉ๋ฅ  ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋ถ€ํ•˜ ๊ท ํ˜• ์œ ์ง€๋ฅผ ์œ„ํ•œ ๋ณต์žกํ•œ ์Šค์ผ€์ค„๋ง ๊ณ„์‚ฐ ๋น„์šฉ ๋ฐœ์ƒ
  3. ๋‹ค์ค‘ GPU ํ™˜๊ฒฝ์—์„œ์˜ ๋ฏธํกํ•œ ์ตœ์ ํ™”

    • ๋ณธ ์—ฐ๊ตฌ์—์„œ๋Š” ์ฃผ๋กœ ๋‹จ์ผ ๋˜๋Š” 2-GPU ํ™˜๊ฒฝ ์‹คํ—˜ ์ˆ˜ํ–‰
    • ์ˆ˜์‹ญ์—์„œ ์ˆ˜๋ฐฑ GPU๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋Œ€๊ทœ๋ชจ ํ™˜๊ฒฝ์—์„œ๋Š” ์„ฑ๋Šฅ ๊ฒ€์ฆ ๋ถ€์กฑ

๐Ÿ“ 2. ํ•œ๊ณ„ ๊ทน๋ณต์„ ์œ„ํ•œ ์ตœ๊ทผ ์—ฐ๊ตฌ ํ๋ฆ„ ๋ฐ ์ ‘๊ทผ ๋ฐฉ๋ฒ•

๐Ÿšฉ (1) GPU-CPU ๊ฐ„ ๋ณ‘๋ชฉ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•๋“ค

โœ… โ‘  ์ฐจ์„ธ๋Œ€ ๊ณ ์† ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ์ˆ  ํ™œ์šฉ
  • PCIe 5.0, 6.0, CXL(Compute Express Link)
    • ์ตœ๊ทผ PCIe 4.0 (64GB/s)์—์„œ PCIe 5.0 (128GB/s), 6.0 (256GB/s)๋กœ ๋น ๋ฅด๊ฒŒ ์ง„ํ™” ์ค‘
    • ํŠนํžˆ CXL ๊ธฐ์ˆ ์€ GPU-CPU ๊ฐ„ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ง€์›, ์„ฑ๋Šฅ ๊ทน๋Œ€ํ™” ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ

๊ด€๋ จ ์ตœ์‹  ์—ฐ๊ตฌ ํ๋ฆ„

  • DistServe(2024), FastServe(2023): ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์ตœ์ ํ™”์™€ ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ์ˆ ์„ ์ ‘๋ชฉํ•ด GPU-CPU ์ „์†ก ํšจ์œจ ํ–ฅ์ƒ
  • InstInfer(2024): ์ €์žฅ์žฅ์น˜(SSD)์— ์ผ๋ถ€ ์—ฐ์‚ฐ์„ offloadingํ•˜์—ฌ PCIe ๋ณ‘๋ชฉ ํšŒํ”ผ ์‹œ๋„
โœ… โ‘ก ์••์ถ• ๋ฐ ๊ฒฝ๋Ÿ‰ํ™” ๊ธฐ์ˆ  (KV cache ์••์ถ•, ์••์ถ• ์—ฐ์‚ฐ)
  • KV cache ์••์ถ•(KV-cache compression) ๋ฐ ์–‘์žํ™”(Quantization)
    • KV cache ์••์ถ• ๊ธฐ์ˆ ๋กœ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋ฅผ ์ค„์—ฌ GPU-CPU ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก๋Ÿ‰ ๊ฐ์†Œ
    • ๋‚ฎ์€ ๋น„ํŠธ ์ •๋ฐ€๋„(8-bit, 4-bit) ์—ฐ์‚ฐ์„ ํ™œ์šฉํ•œ KV cache ์—ฐ์‚ฐ ํšจ์œจํ™” ์—ฐ๊ตฌ ์ง„ํ–‰ ์ค‘

๊ด€๋ จ ์ตœ์‹  ์—ฐ๊ตฌ ํ๋ฆ„

  • Atom(2024), GPTQ(2023): 8-bit ์ดํ•˜ ์–‘์žํ™” ๋ฐ sparse ์••์ถ•์„ ํ™œ์šฉํ•œ KV-cache ์••์ถ•
  • AWQ(2024): Activation-aware quantization์œผ๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก๋Ÿ‰ ์ ˆ๊ฐ ๋ฐ bandwidth ์š”๊ตฌ๋Ÿ‰ ๊ฐ์†Œ

๐Ÿšฉ (2) ๋™์  ์Šค์ผ€์ค„๋ง ๋ณต์žก๋„ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ์—ฐ๊ตฌ ๋ฐฉํ–ฅ

โœ… โ‘  ๊ฐ•ํ™”ํ•™์Šต ๊ธฐ๋ฐ˜ ์ตœ์ ํ™”๋œ ๋™์  ์Šค์ผ€์ค„๋ง
  • ๋ณต์žกํ•œ ํ™˜๊ฒฝ์„ ๋™์  ์ตœ์ ํ™”ํ•˜๋Š” ๋ฌธ์ œ์— ๊ฐ•ํ™”ํ•™์Šต(RL)์„ ํ™œ์šฉ
  • GPU ๋ฐ CPU ์‚ฌ์šฉ๋ฅ ์„ ์˜ˆ์ธกํ•˜๊ณ , ์ƒํ™ฉ์— ๋งž๋Š” ์Šค์ผ€์ค„๋ง ์ •์ฑ…์„ ํ•™์Šตํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™”

๊ด€๋ จ ์ตœ์‹  ์—ฐ๊ตฌ ํ๋ฆ„

  • ORCA(2022), Sarathi-Serve(2024): RL ๊ธฐ๋ฐ˜ ๋˜๋Š” ํœด๋ฆฌ์Šคํ‹ฑ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ์Šค์ผ€์ค„๋ง ์ตœ์ ํ™” ์‹œ๋„
  • RL-based Scheduling (์ตœ๊ทผ Google Research ๋“ฑ์—์„œ ํ™œ๋ฐœํžˆ ์—ฐ๊ตฌ ์ค‘)
โœ… โ‘ก ํœด๋ฆฌ์Šคํ‹ฑ & ๋ฉ”ํƒ€๋Ÿฌ๋‹์„ ํ†ตํ•œ ์Šค์ผ€์ค„๋ง ๊ฐ„์†Œํ™”
  • ๋ณต์žกํ•œ ์Šค์ผ€์ค„๋ง ์—ฐ์‚ฐ์„ ๋‹จ์ˆœํ™”๋œ ํœด๋ฆฌ์Šคํ‹ฑ(Heuristic) ๋ฐ ๋ฉ”ํƒ€๋Ÿฌ๋‹(Meta-learning) ๊ธฐ๋ฐ˜์˜ ๊ฐ„๋‹จํ•œ ๋ชจ๋ธ๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ์Šค์ผ€์ค„๋ง ์˜ค๋ฒ„ํ—ค๋“œ ์ตœ์†Œํ™”

๊ด€๋ จ ์ตœ์‹  ์—ฐ๊ตฌ ํ๋ฆ„

  • FlexGen(2023), HeteGen(2024): ํœด๋ฆฌ์Šคํ‹ฑ ๋ฐฉ์‹์˜ ํšจ์œจ์ ์ธ ์Šค์ผ€์ค„๋ง ์—ฐ๊ตฌ
  • Lightweight meta-schedulers (์Šค์ผ€์ค„๋ง ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ตœ๊ทผ ํ™œ๋ฐœํžˆ ์—ฐ๊ตฌ๋จ)

๐Ÿšฉ (3) ๋‹ค์ค‘ GPU ํ™˜๊ฒฝ ์ตœ์ ํ™” ์—ฐ๊ตฌ ํ๋ฆ„

โœ… โ‘  ํ…์„œ ๋ณ‘๋ ฌํ™”(Tensor Parallelism) ๋ฐ ๋ชจ๋ธ ์ƒค๋”ฉ(Sharding)
  • ๋ชจ๋ธ ๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ GPU๊ฐ„ ๋‚˜๋ˆ„์–ด ๋ฐฐ์น˜ํ•˜์—ฌ GPU ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจํ™” ๋ฐ ์—ฐ์‚ฐ ๋ณ‘๋ ฌํ™”
  • ๋ณ‘๋ ฌ GPU ํ™˜๊ฒฝ์—์„œ ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ๋ถ„๋ฐฐ ๋ฐ ๊ณ„์‚ฐ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ์ด ์ค‘์š” ์—ฐ๊ตฌ ์ฃผ์ œ

๊ด€๋ จ ์ตœ์‹  ์—ฐ๊ตฌ ํ๋ฆ„

  • Megatron-LM (NVIDIA, 2022~), Alpa (2023): ๋Œ€๊ทœ๋ชจ ํ…์„œ ๋ณ‘๋ ฌํ™” ๋ฐ ํšจ์œจ์ ์ธ GPU ๋ถ„์‚ฐ์ฒ˜๋ฆฌ ์—ฐ๊ตฌ
  • DistServe(2024), DeepSpeed(Microsoft, 2023): ๋ฐ์ดํ„ฐ ๋ฐ ๋ชจ๋ธ ๋ณ‘๋ ฌํ™”๋ฅผ ํ†ตํ•œ ํšจ์œจ์  ๋ฉ”๋ชจ๋ฆฌ ๋ฐ ์—ฐ์‚ฐ ์ฒ˜๋ฆฌ
โœ… โ‘ก ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ณ‘๋ ฌํ™” ๊ธฐ๋ฒ• (Hybrid Parallelism)
  • ํ…์„œ ๋ณ‘๋ ฌํ™” + ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌํ™” + ํŒŒ์ดํ”„๋ผ์ธ ๋ณ‘๋ ฌํ™”๋ฅผ ๊ฒฐํ•ฉํ•œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ณ‘๋ ฌํ™” ๊ธฐ๋ฒ•
  • ๋Œ€๊ทœ๋ชจ ํ™˜๊ฒฝ์—์„œ ์—ฐ์‚ฐ, ๋ฐ์ดํ„ฐ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ GPU ์ž์› ์‚ฌ์šฉ ๊ทน๋Œ€ํ™”

๊ด€๋ จ ์ตœ์‹  ์—ฐ๊ตฌ ํ๋ฆ„

  • Colossal-AI(2024), DeepSpeed-ZeRO(2023~2024): ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ณ‘๋ ฌํ™”๋ฅผ ํ†ตํ•ด ์ˆ˜๋ฐฑ GPU ํ™˜๊ฒฝ ์ตœ์ ํ™” ์‹œ๋„
  • LLaMA, GPT ์‹œ๋ฆฌ์ฆˆ ๋ชจ๋ธ๋“ค์„ ์ˆ˜๋ฐฑ๋Œ€ GPU์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹คํ—˜์„ ํ™œ๋ฐœํžˆ ์ง„ํ–‰ ์ค‘

๐Ÿ“— ๊ฒฐ๋ก  ๋ฐ ์—ฐ๊ตฌ ๋ฐฉํ–ฅ ์ •๋ฆฌ (ํ•œ๊ณ„ ๊ทน๋ณต ๋ฐฉ๋ฒ• ์š”์•ฝ)

ํ•œ๊ณ„์ ํ•ด๊ฒฐ ์ ‘๊ทผ๋ฒ•์ตœ์‹  ์—ฐ๊ตฌ ์‚ฌ๋ก€
GPU-CPU ์ „์†ก ๋ณ‘๋ชฉ์ฐจ์„ธ๋Œ€ ์ธํ„ฐํŽ˜์ด์Šค, ์••์ถ• ๋ฐ ๊ฒฝ๋Ÿ‰ํ™”CXL, Atom(2024), AWQ(2024), InstInfer(2024)
๋™์  ์Šค์ผ€์ค„๋ง ๋ณต์žก์„ฑ๊ฐ•ํ™”ํ•™์Šต, ๋ฉ”ํƒ€๋Ÿฌ๋‹, ํœด๋ฆฌ์Šคํ‹ฑ ๊ธฐ๋ฒ•ORCA(2022), FlexGen(2023), Sarathi-Serve(2024)
๋‹ค์ค‘ GPU ํ™˜๊ฒฝ ์ตœ์ ํ™”ํ…์„œ ๋ณ‘๋ ฌํ™”, ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ณ‘๋ ฌํ™” ๊ธฐ๋ฒ•Megatron-LM(2022~), DistServe(2024), Colossal-AI(2024)

๐Ÿ“ ๋‚˜์˜ ์˜๊ฒฌ ๋ฐ ์ „๋ง

ํ–ฅํ›„ NEO์™€ ๊ฐ™์€ CPU ์˜คํ”„๋กœ๋“œ ๋ฐฉ์‹์€ ๋” ํšจ์œจ์ ์ธ ํ•˜๋“œ์›จ์–ด(CXL ๋“ฑ)์™€ ๋ณ‘๋ ฌํ™” ๊ธฐ์ˆ  ๋ฐœ์ „์— ํž˜์ž…์–ด ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ๊ฐœ์„ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.
ํŠนํžˆ GPU์™€ CPU ์ž์›์„ ๋™์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ•ํ™”ํ•™์Šต ๊ธฐ๋ฐ˜์˜ ํšจ์œจ์  ์Šค์ผ€์ค„๋ง ์—ฐ๊ตฌ๊ฐ€ ๊ธ‰์†ํžˆ ๋ฐœ์ „ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋ฉฐ, ์ด๋Š” ๋Œ€๊ทœ๋ชจ LLM ์ถ”๋ก  ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ํ•ต์‹ฌ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ–ฅํ›„ ์—ฐ๊ตฌ๋Š” ์ด๋Ÿฌํ•œ ์ตœ์‹  ๊ธฐ์ˆ  ๋ฐ ๋ฐฉ๋ฒ•๋“ค์„ ํ†ตํ•ฉ์ ์œผ๋กœ ํ™œ์šฉํ•˜์—ฌ, NEO์˜ ์‹ค์šฉ์„ฑ๊ณผ ํšจ์œจ์„ฑ์„ ๋”์šฑ ํ™•์žฅํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐœ์ „ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์ธ ์งˆ๋ฌธ ์žˆ์œผ์‹œ๋ฉด ์–ธ์ œ๋“ ์ง€ ํŽธํ•˜๊ฒŒ ๋ฌผ์–ด๋ณด์„ธ์š”! ๐Ÿ˜Š

Q : NEO ์‹œ์Šคํ…œ์ด GPU-only ์‹œ์Šคํ…œ(vLLM)๊ณผ ๊ธฐ์กด CPU ์˜คํ”„๋กœ๋“œ ์‹œ์Šคํ…œ(FastDecode)์— ๋น„ํ•ด ์„ฑ๋Šฅ์ด ๋” ๋›ฐ์–ด๋‚œ ๊ทผ๋ณธ์ ์ธ ์ด์œ ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์ด ์ฐจ์ด๋ฅผ ๋งŒ๋“œ๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€?

NEO ์‹œ์Šคํ…œ์ด GPU-only ์‹œ์Šคํ…œ(vLLM) ๋ฐ ๊ธฐ์กด CPU ์˜คํ”„๋กœ๋“œ ์‹œ์Šคํ…œ(FastDecode)์— ๋น„ํ•ด ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚œ ๊ทผ๋ณธ์ ์ธ ์ด์œ ๋Š” GPU์™€ CPU์˜ ์ž์›์„ ๋™์‹œ์— ๊ท ํ˜• ์žˆ๊ฒŒ ์ตœ์ ํ™”ํ•˜์—ฌ ํ™œ์šฉํ•˜๋Š” “๋น„๋Œ€์นญ ํŒŒ์ดํ”„๋ผ์ด๋‹(Asymmetric Pipelining)“๊ณผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ž์› ๋ฐฐ๋ถ„์„ ๊ฒฐ์ •ํ•˜๋Š” “๋ถ€ํ•˜ ์ธ์‹ ์Šค์ผ€์ค„๋ง(Load-Aware Scheduling)“์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์ฒด์ ์œผ๋กœ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฒซ์งธ, ๊ธฐ์กด GPU-only ์‹œ์Šคํ…œ(vLLM)์€ GPU ๋ฉ”๋ชจ๋ฆฌ์˜ ์ œ์•ฝ์œผ๋กœ ์ธํ•ด ํฐ batch ํฌ๊ธฐ๋ฅผ ํ™•๋ณดํ•˜์ง€ ๋ชปํ•˜์—ฌ GPU ์—ฐ์‚ฐ ๋Šฅ๋ ฅ์„ ์ถฉ๋ถ„ํžˆ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, NEO๋Š” ์ผ๋ถ€ attention ์—ฐ์‚ฐ๊ณผ KV cache๋ฅผ CPU ๋ฉ”๋ชจ๋ฆฌ๋กœ ์˜คํ”„๋กœ๋“œํ•˜์—ฌ GPU ๋ฉ”๋ชจ๋ฆฌ ์—ฌ์œ ๋ฅผ ํ™•๋ณดํ•˜๊ณ  batch ํฌ๊ธฐ๋ฅผ ํ‚ค์šธ ์ˆ˜ ์žˆ์–ด GPU์˜ ๊ณ„์‚ฐ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋‘˜์งธ, ๊ธฐ์กด CPU ์˜คํ”„๋กœ๋“œ ์‹œ์Šคํ…œ(FastDecode)์€ ๋ชจ๋“  decoding attention ์—ฐ์‚ฐ์„ ๋ฌด์กฐ๊ฑด CPU๋กœ ๋„˜๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— CPU๊ฐ€ ๋ณ‘๋ชฉ ์ง€์ ์ด ๋˜์–ด ์ „์ฒด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค. NEO๋Š” ์ด์™€ ๋‹ฌ๋ฆฌ attention ์—ฐ์‚ฐ์˜ ์ผ๋ถ€๋งŒ ์„ ํƒ์ ์œผ๋กœ CPU์— ์˜คํ”„๋กœ๋“œํ•˜์—ฌ CPU ๊ณผ๋ถ€ํ•˜๋ฅผ ํ”ผํ•˜๊ณ , GPU์™€ CPU๋ฅผ ๋™์‹œ์— ํšจ์œจ์ ์œผ๋กœ ๊ฐ€๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ‘๋ ฌํ™”ํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ์ ์œผ๋กœ NEO์˜ “๋น„๋Œ€์นญ ํŒŒ์ดํ”„๋ผ์ด๋‹"์€ GPU์™€ CPU๊ฐ€ ๊ฐ๊ฐ ๊ฐ€์žฅ ์ž˜ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์„ ๋‚˜๋ˆ„์–ด ๋™์‹œ์— ๋ณ‘๋ ฌ๋กœ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. GPU๋Š” ์ฃผ๋กœ prefilling ๋‹จ๊ณ„๋‚˜ ๊ณ„์‚ฐ ์ค‘์‹ฌ(linear, FFN ๋“ฑ)์˜ ์ž‘์—…์„ ๋‹ด๋‹นํ•˜๊ณ , CPU๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์ค‘์‹ฌ์˜ attention ์ž‘์—…์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์ž‘์—…์ด ์ค‘์ฒฉ๋˜์–ด ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ GPU์™€ CPU๋Š” ๊ฑฐ์˜ ์‰ฌ๋Š” ์‹œ๊ฐ„ ์—†์ด ๊ณ„์† ์—ฐ์‚ฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ “๋ถ€ํ•˜ ์ธ์‹ ์Šค์ผ€์ค„๋ง"์€ GPU์™€ CPU์˜ ํ˜„์žฌ ์ž‘์—… ๋ถ€ํ•˜๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํŒŒ์•…ํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ batch๋ฅผ ํ˜•์„ฑํ•˜์—ฌ ์ž์›์„ ๊ฐ€์žฅ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด GPU-only ๋ฐฉ์‹์ด๋‚˜ ๊ธฐ์กด CPU ์˜คํ”„๋กœ๋“œ ๋ฐฉ์‹ ๋Œ€๋น„ ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰(throughput)๊ณผ ๋‚ฎ์€ ์ง€์—ฐ(latency)์„ ๋™์‹œ์— ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ, NEO๊ฐ€ ์ œ์•ˆํ•œ ์ด๋Ÿฌํ•œ ๋‘ ๊ฐ€์ง€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์กฐํ•ฉ์ด GPU-only ์‹œ์Šคํ…œ ๋ฐ ๊ธฐ์กด CPU ์˜คํ”„๋กœ๋“œ ์‹œ์Šคํ…œ์˜ ๋‹จ์ ์„ ๊ทน๋ณตํ•˜๊ณ  ํ˜„์ €ํžˆ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•œ ๊ทผ๋ณธ์  ์ด์œ ์ž…๋‹ˆ๋‹ค.

Q : NEO์—์„œ ์‚ฌ์šฉํ•œ ๋น„๋Œ€์นญ ํŒŒ์ดํ”„๋ผ์ด๋‹๊ณผ ๋ถ€ํ•˜ ์ธ์‹ ์Šค์ผ€์ค„๋ง์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋ฉฐ, ์ด ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ‘๋ชฉ ํ˜„์ƒ์ด๋‚˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋…ผ๋ฌธ์—์„œ ์ œ์‹œํ•œ ๊ตฌ์ฒด์ ์ธ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€?

NEO์—์„œ ์‚ฌ์šฉํ•œ ๋น„๋Œ€์นญ ํŒŒ์ดํ”„๋ผ์ด๋‹(Asymmetric Pipelining)๊ณผ ๋ถ€ํ•˜ ์ธ์‹ ์Šค์ผ€์ค„๋ง(Load-Aware Scheduling)์€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € ๋น„๋Œ€์นญ ํŒŒ์ดํ”„๋ผ์ด๋‹์€ ์ถ”๋ก  ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ, ์ด๋ฅผ ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋น„๋Œ€์นญ์ ์ธ ํ•˜์œ„ ๋ฐฐ์น˜๋กœ ๋‚˜๋ˆ„์–ด GPU์™€ CPU์— ๋™์‹œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ฐฐ์น˜(batch-0)๋Š” GPU๊ฐ€ ๊ฐ•์ ์ธ Prefilling ๋‹จ๊ณ„์™€ ์„ ํ˜•(Linear, FFN ๋“ฑ) ์—ฐ์‚ฐ์„ ์œ„์ฃผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋‹ค๋ฅธ ๋ฐฐ์น˜(batch-1)๋Š” CPU๊ฐ€ ๊ฐ•์ ์ธ attention ์—ฐ์‚ฐ์„ ์ฃผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋‘ ๋ฐฐ์น˜๊ฐ€ ๊ฐ์ž์˜ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, GPU์™€ CPU๊ฐ€ ๋™์‹œ์— ์ผ์„ ํ•จ์œผ๋กœ์จ ์—ฐ์‚ฐ ์ž์›์˜ idle ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋ถ€ํ•˜ ์ธ์‹ ์Šค์ผ€์ค„๋ง์€ GPU์™€ CPU์˜ ์ž‘์—… ์ƒํ™ฉ๊ณผ ๋ถ€ํ•˜(load)๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ฉด์„œ ์ตœ์ ์˜ ์ž‘์—… ๋ถ„๋ฐฐ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋งค iteration๋งˆ๋‹ค ๋‹ค์Œ์˜ ์›์น™์„ ์ ์šฉํ•˜์—ฌ ๋ฐฐ์น˜๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • Greedy ์›์น™: GPU-only ๋ฐฉ์‹๊ณผ GPU-CPU ํ˜ผํ•ฉ ๋ฐฉ์‹์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋น„๊ตํ•˜์—ฌ ๊ฐ€์žฅ ์„ฑ๋Šฅ์ด ์ข‹์€ ๋ฐฉ์‹์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • Balancing ์›์น™: GPU์™€ CPU์˜ ์—ฐ์‚ฐ ์‹œ๊ฐ„์„ ์ตœ๋Œ€ํ•œ ๋น„์Šทํ•˜๊ฒŒ ๋งž์ถ”์–ด ์–ด๋А ํ•œ ์ชฝ์ด ๋ณ‘๋ชฉ(bottleneck)์ด ๋˜์ง€ ์•Š๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • Hiding CPU ์›์น™: CPU ์—ฐ์‚ฐ์„ GPU ์—ฐ์‚ฐ์˜ ๋’ค์— ์ˆจ๊ฒจ์„œ, CPU ์—ฐ์‚ฐ ์ค‘ GPU๊ฐ€ idle ์ƒํƒœ๊ฐ€ ๋˜๋Š” ํ˜„์ƒ์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • Maximizing GPU ์›์น™: ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ์š”์ฒญ์„ GPU์—์„œ ์ฒ˜๋ฆฌํ•˜์—ฌ GPU์˜ ์—ฐ์‚ฐ ๋Šฅ๋ ฅ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ‘๋ชฉ์ด๋‚˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋…ผ๋ฌธ์ด ์ œ์‹œํ•œ ๊ตฌ์ฒด์ ์ธ ์ „๋žต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฒซ์งธ, ๋ถ€๋ถ„ ์˜คํ”„๋กœ๋“œ(Partial Offloading) ์ „๋žต์„ ์‚ฌ์šฉํ•˜์—ฌ CPU์˜ ๋ถ€ํ•˜๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์ ์ •ํ•œ ์ˆ˜์ค€๋งŒ CPU๋กœ ์˜ฎ๊ธฐ๋ฉฐ, GPU ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์„ ์ตœ์ ์˜ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋‘˜์งธ, ๋ฐฐ์น˜๋ฅผ ํ˜•์„ฑํ•  ๋•Œ ๊ณ„์ธต ๋‹จ์œ„(layer-wise)์˜ KV cache ์˜คํ”„๋กœ๋“œ ์ „๋žต์„ ์ ์šฉํ•˜์—ฌ GPU-CPU ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์—ฐ์‚ฐ๊ณผ ๊ฒน์น˜๋„๋ก(overlap) ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ „์†ก์œผ๋กœ ์ธํ•œ idle ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

์…‹์งธ, ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ†ตํ•ด ๊ฒฐ์ •ํ•˜๋Š” ๋™์  ์Šค์ผ€์ค„๋ง(dynamic scheduling)์„ ๊ตฌํ˜„ํ•˜์—ฌ GPU-CPU ๊ฐ„ ๊ท ํ˜•์„ ๋งž์ถ”๊ณ , ์ƒํ™ฉ ๋ณ€ํ™”(์ž…์ถœ๋ ฅ ๊ธธ์ด์˜ ๋ณ€ํ™” ๋“ฑ)์— ๋น ๋ฅด๊ฒŒ ๋Œ€์‘ํ•˜์—ฌ ๋ณ‘๋ชฉ ๋ฐœ์ƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, GPU ์—ฐ์‚ฐ ์ปค๋„(kernel) ํ˜ธ์ถœ ํšŸ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ตฌ์กฐ(์˜ˆ: GPU ์ปค๋„์„ ๋ฐ˜๋ณต ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹  ํ•œ ๋ฒˆ์˜ ๊ธด ํ˜ธ์ถœ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ)๋ฅผ ํ†ตํ•ด GPU kernel launch๋กœ ์ธํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

์ข…ํ•ฉ์ ์œผ๋กœ NEO๋Š” ๋น„๋Œ€์นญ์  GPU-CPU ๋ณ‘๋ ฌํ™”์™€ ์‹ค์‹œ๊ฐ„ ๋™์  ์Šค์ผ€์ค„๋ง์„ ํ™œ์šฉํ•˜์—ฌ ์—ฐ์‚ฐ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  GPU ๋ฐ CPU ์ž์›์„ ์ตœ๋Œ€ํ•œ ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Q : NEO์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ๊ธธ์ด, GPU/CPU ์„ฑ๋Šฅ ๋“ฑ ๋‹ค์–‘ํ•œ ์š”์†Œ๋“ค์— ๋”ฐ๋ผ ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š”์ง€ ์‹คํ—˜ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด ์„ค๋ช…ํ•˜๊ณ , ์‹ค์ œ ํ™˜๊ฒฝ์— ์ ์šฉํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ค‘์š”ํ•œ ์š”์†Œ์™€ ํ•œ๊ณ„์ ์€ ๋ฌด์—‡์ธ๊ฐ€?

NEO์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์€ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ๊ธธ์ด, GPU ๋ฐ CPU์˜ ์„ฑ๋Šฅ์ด๋ผ๋Š” ์š”์†Œ๋“ค์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ฌ๋ผ์ง„๋‹ค๊ณ  ๋…ผ๋ฌธ์€ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ๊ธธ์ด์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ ๋ณ€ํ™”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ž…๋ ฅ ๊ธธ์ด๊ฐ€ ๊ธธ๊ฑฐ๋‚˜ ์ถœ๋ ฅ ๊ธธ์ด๊ฐ€ ๊ธธ์–ด์งˆ์ˆ˜๋ก KV ์บ์‹œ์˜ ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉฐ, GPU-only ์‹œ์Šคํ…œ์€ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•œ ๋ฐฐ์น˜ ํฌ๊ธฐ๊ฐ€ ๊ธ‰๊ฒฉํžˆ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, NEO๋Š” CPU ๋ฉ”๋ชจ๋ฆฌ๋กœ KV ์บ์‹œ ์ผ๋ถ€๋ฅผ ์˜คํ”„๋กœ๋“œํ•˜๋ฏ€๋กœ, ํŠนํžˆ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ๊ธธ์ด๊ฐ€ ์ค‘๊ฐ„์—์„œ ๊ธด ๊ฒฝ์šฐ(batch ํฌ๊ธฐ๊ฐ€ ์ค‘์š”ํ•œ ์ƒํ™ฉ)์— ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ๊ฐœ์„ ๋ฉ๋‹ˆ๋‹ค.

๊ตฌ์ฒด์ ์ธ ์‹คํ—˜ ๊ฒฐ๊ณผ๋กœ, T4 GPU ํ™˜๊ฒฝ์—์„œ ์ž…๋ ฅ ๊ธธ์ด๊ฐ€ 100์—์„œ 500, ์ถœ๋ ฅ ๊ธธ์ด๊ฐ€ 50์—์„œ 200 ์ •๋„์ผ ๋•Œ, GPU-only ๋Œ€๋น„ NEO์˜ ์„ฑ๋Šฅ์€ ์ตœ๋Œ€ 7.5๋ฐฐ๊นŒ์ง€ ์ƒ์Šนํ•ฉ๋‹ˆ๋‹ค. ํ•œํŽธ, ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ๊ธธ์ด๊ฐ€ ๋งค์šฐ ์งง์€ ๊ฒฝ์šฐ GPU ๋ฉ”๋ชจ๋ฆฌ ๋ณ‘๋ชฉ ๋ฌธ์ œ๊ฐ€ ๊ฑฐ์˜ ์—†์–ด NEO์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒํญ์€ ์ƒ๋Œ€์ ์œผ๋กœ ์ค„์–ด๋“ค๊ฑฐ๋‚˜ ์˜คํžˆ๋ ค ์˜คํ”„๋กœ๋“œ ๊ณผ์ •์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์ธํ•ด ์•ฝ๊ฐ„ ๋–จ์–ด์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

GPU ๋ฐ CPU ์„ฑ๋Šฅ์˜ ์˜ํ–ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

CPU ์„ฑ๋Šฅ(ํŠนํžˆ ๋ฉ”๋ชจ๋ฆฌ bandwidth)์ด ์ฆ๊ฐ€ํ•˜๋ฉด CPU๊ฐ€ ๋” ๋งŽ์€ KV ์บ์‹œ์™€ Attention ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด GPU ๋ถ€๋‹ด์„ ๋œ์–ด์ค๋‹ˆ๋‹ค. ๋…ผ๋ฌธ์˜ ์‹คํ—˜ ๊ฒฐ๊ณผ๋กœ AWS EC2 ํ™˜๊ฒฝ์—์„œ CPU์˜ ๋ฉ”๋ชจ๋ฆฌ ๋Œ€์—ญํญ์„ ์ฆ๊ฐ€์‹œํ‚ฌ ๊ฒฝ์šฐ A10G GPU์—์„œ ์ตœ๋Œ€ 79.3%๊นŒ์ง€ ์ถ”๊ฐ€์ ์ธ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, CPU ์„ฑ๋Šฅ์ด ๋‚ฎ์€ ํ™˜๊ฒฝ์—์„œ๋Š” CPU๊ฐ€ ์‰ฝ๊ฒŒ ๋ณ‘๋ชฉ ์ง€์ ์ด ๋˜์–ด ์„ฑ๋Šฅ ํ–ฅ์ƒํญ์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

GPU ์„ฑ๋Šฅ์˜ ๊ฒฝ์šฐ, H100์ฒ˜๋Ÿผ ์ตœ์‹  ๊ณ ์„ฑ๋Šฅ GPU๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์„ฑ๋Šฅ ํ–ฅ์ƒํญ์€ ๋‹ค์†Œ ์ž‘์•„์ง€์ง€๋งŒ(์•ฝ 14%), T4๋‚˜ A10G์ฒ˜๋Ÿผ ์ค‘๊ฐ„~ํ•˜์œ„ ์„ฑ๋Šฅ GPU๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ GPU ๋ฉ”๋ชจ๋ฆฌ ํ•œ๊ณ„๊ฐ€ ๋ช…ํ™•ํ•ด์ง€๋ฏ€๋กœ ์„ฑ๋Šฅ ํ–ฅ์ƒํญ์ด ๋” ํฝ๋‹ˆ๋‹ค(26% ~ 7.5๋ฐฐ ์ฆ๊ฐ€).

์ด๋Ÿฌํ•œ ์‹คํ—˜์  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹ค์ œ ํ™˜๊ฒฝ์— NEO๋ฅผ ์ ์šฉํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ค‘์š”ํ•œ ์š”์†Œ์™€ ํ•œ๊ณ„์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ค‘์š”ํ•œ ๊ณ ๋ ค ์š”์†Œ๋Š”:

  1. GPU ๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰๊ณผ ์„ฑ๋Šฅ: GPU ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ํ˜„์ƒ์ด ๋šœ๋ ทํ•œ ํ™˜๊ฒฝ์ผ์ˆ˜๋ก NEO์˜ ์„ฑ๋Šฅ ์ด๋“์ด ์ปค์ง‘๋‹ˆ๋‹ค.
  2. CPU ๋ฉ”๋ชจ๋ฆฌ bandwidth: CPU ๋ฉ”๋ชจ๋ฆฌ ๋Œ€์—ญํญ์ด ์ถฉ๋ถ„ํžˆ ํ™•๋ณด๋œ ํ™˜๊ฒฝ์ด์–ด์•ผ CPU ์˜คํ”„๋กœ๋“œ ํšจ๊ณผ๊ฐ€ ์ปค์ง€๊ณ , ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  3. ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ๊ธธ์ด์˜ ๋ถ„ํฌ: ์š”์ฒญ๋˜๋Š” ์ถ”๋ก  ์ž‘์—…์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ๊ธธ์ด๊ฐ€ ๊ธธ์ˆ˜๋ก NEO์˜ ํšจ๊ณผ๊ฐ€ ํฌ๋ฉฐ, ๋ฐ˜๋Œ€๋กœ ๋งค์šฐ ์งง์€ ์š”์ฒญ์ด ๋งŽ์œผ๋ฉด GPU-only ๋ฐฉ์‹์ด ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. GPU-CPU ๊ฐ„ ์ธํ„ฐํŽ˜์ด์Šค(PCIe ๋˜๋Š” CXL)์˜ ์„ฑ๋Šฅ: ์ธํ„ฐํŽ˜์ด์Šค ์„ฑ๋Šฅ์ด ์ถฉ๋ถ„ํžˆ ๋†’์•„์•ผ ์˜คํ”„๋กœ๋“œ ๊ณผ์ •์—์„œ ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•œ๊ณ„์ ์€:

  1. PCIe ์ธํ„ฐํŽ˜์ด์Šค ๋ณ‘๋ชฉ: ๋นˆ๋ฒˆํ•œ GPU-CPU ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก์œผ๋กœ ์ธํ•ด PCIe bandwidth๊ฐ€ ๋ณ‘๋ชฉ์ด ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์Šค์ผ€์ค„๋ง ๋ณต์žก์„ฑ ์ฆ๊ฐ€: ๋ถ€ํ•˜ ์ธ์‹ ์Šค์ผ€์ค„๋ง์˜ ์‹ค์‹œ๊ฐ„ ์—ฐ์‚ฐ์ด ๋ณต์žกํ•˜์—ฌ, ๊ด€๋ฆฌ ๋น„์šฉ๊ณผ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์งง์€ ์š”์ฒญ์ด ์ฃผ๋ฅผ ์ด๋ฃจ๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ์˜คํ”„๋กœ๋“œ ๊ณผ์ • ์ž์ฒด๊ฐ€ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์–ด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์„ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ๋‹ค์ค‘ GPU ํ™˜๊ฒฝ ์ตœ์ ํ™” ๋ฏธํก: ํ˜„์žฌ ๋…ผ๋ฌธ์—์„œ ๊ฒ€์ฆ๋œ ๊ฒƒ์€ ๋‹จ์ผ GPU๋‚˜ ์†Œ์ˆ˜ GPU ํ™˜๊ฒฝ์œผ๋กœ, ๋งŽ์€ ์ˆ˜์˜ GPU๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ์˜ ์„ฑ๋Šฅ ๊ฒ€์ฆ์€ ์•„์ง ๋ฏธํกํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ๋Š” ์œ„์™€ ๊ฐ™์€ ์š”์†Œ๋“ค์„ ์‚ฌ์ „์— ์ฒ ์ €ํžˆ ํ‰๊ฐ€ํ•˜๊ณ , GPU-CPU ํ™˜๊ฒฝ ์„ค์ •, ํ•˜๋“œ์›จ์–ด ์ŠคํŽ™ ์„ ์ •, ์š”์ฒญ ๊ธธ์ด ํŠน์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ NEO์˜ ์ตœ์  ์ ์šฉ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ผ์ด์„ ์Šค

์ž‘์„ฑ์ž: Jaehun Ryu

๋งํฌ: https://jaehun.me/posts/neo-saving-gpu-memory-crisis-with-cpu-offloading-for-online-llm-inference/

๋ผ์ด์„ ์Šค: CC BY 4.0

์ด ์ €์ž‘๋ฌผ์€ ํฌ๋ฆฌ์—์ดํ‹ฐ๋ธŒ ์ปค๋จผ์ฆˆ ์ €์ž‘์žํ‘œ์‹œ 4.0 ๊ตญ์ œ ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถœ์ฒ˜๋ฅผ ๋ฐํžˆ๋ฉด ์ƒ์—…์  ๋ชฉ์ ์„ ํฌํ•จํ•ด ์ž์œ ๋กญ๊ฒŒ ์ด์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€