본문 바로가기

06. RAM, VRAM, cache, bandwidth

이 장의 핵심 연결: 05장의 데이터 이동이 실제로 지나는 메모리 계층을 엽니다. memory-bound 성향(05장)이 왜 생기고 무엇으로 완화되는지, 여기서 하드웨어와 소프트웨어의 경계를 그립니다.
다음 질문: capacity·bandwidth·latency는 어떻게 다른가? "하드웨어 캐시"와 "KV 캐시" 같은 소프트웨어 캐시는 무엇이 다른가? 02장의 storage 하한 위에 무엇이 더 쌓이는가?
목표:
  • 메모리를 용량(capacity)·대역폭(bandwidth)·지연(latency) 세 축으로 분리해 읽는다.
  • 하드웨어 메모리 계층(레지스터→캐시→VRAM/RAM)과 소프트웨어가 관리하는 캐시(KV·prefix)의 경계를 명확히 한다.
  • 02장의 "런타임 메모리 전체"에서 KV 캐시의 자리를 잡는다.

먼저: 메모리를 하나로 보지 마세요

"메모리가 크다/빠르다"는 뭉뚱그린 말입니다. 메모리는 최소 세 가지 다른 성질을 갖습니다.

  • 용량(capacity): 얼마나 많이 담느냐. 단위: byte, GB/GiB(02장).
  • 대역폭(bandwidth): 단위 시간에 얼마나 많이 실어 나르느냐. 단위: byte/s(흔히 GB/s). 05장 memory-bound의 그 통로 넓이입니다.
  • 지연(latency): 요청하고 첫 데이터가 도착하기까지의 시간. 단위: 초(보통 나노초·마이크로초).

이 셋은 따로 놉니다. 용량이 크다고 대역폭이 넓지 않고, 대역폭이 넓다고 지연이 짧지 않습니다. 뭉뚱그리면 "왜 안 빠른가"를 못 짚습니다.

비유: 용량 = 창고 크기, 대역폭 = 출입구의 폭(한 번에 얼마나 나가나), 지연 = 주문 후 첫 물건이 나오기까지의 시간. 큰 창고(용량)라도 문이 좁으면(대역폭) 느리고, 문이 넓어도 첫 반응(지연)이 느릴 수 있습니다.

정확한 정의: 하드웨어 메모리 계층

빠르고 작은 것부터 느리고 큰 것까지 계층을 이룹니다. 코어에 가까울수록 빠르고 작습니다.

flowchart TB
    REG["레지스터<br/>가장 빠름·가장 작음"]:::fast --> L1["온칩 캐시<br/>(L1/L2 등)<br/>매우 빠름·작음"]:::fast
    L1 --> ACCMEM["가속기 전용 메모리<br/>(예: VRAM)<br/>빠른 대역폭·중간 용량"]:::mem
    ACCMEM --> SYS["시스템 메모리<br/>(RAM)<br/>큰 용량·상대적으로 느림"]:::mem
    SYS --> STORE["저장장치<br/>(SSD 등)<br/>가장 큼·가장 느림"]:::slow

    classDef fast fill:#cffafe,stroke:#0891b2,color:#164e63
    classDef mem fill:#ede9fe,stroke:#7c3aed,color:#4c1d95
    classDef slow fill:#e5e7eb,stroke:#6b7280,color:#374151
약어·용어 풀이
  • RAM(Random Access Memory): 시스템의 주 메모리. 대체로 큰 용량, 가속기 전용 메모리보다는 대역폭이 좁은 편.
  • VRAM(Video RAM): GPU 등 가속기에 붙은 전용 메모리의 통칭. 대체로 높은 대역폭. (제품마다 종류·사양이 다르므로 구체 수치는 사양 확인 필요.)
  • 캐시(cache, 하드웨어): 자주 쓰는 데이터를 코어 가까이 두어 재사용하는 빠른 소량 메모리(L1/L2 등). 하드웨어가 자동 관리합니다.
  • 온칩(on-chip): 프로세서 칩 안에 있다는 뜻. 칩 밖 메모리보다 훨씬 빠릅니다.
📌 핵심: 05장의 memory-bound가 아픈 이유가 여기 있습니다. 큰 가중치를 느린 계층에서 코어로 실어 나르는 데 시간이 들고, 그 통로(대역폭)가 병목이 됩니다. 그래서 "재사용(캐시)"과 "이동량 줄이기(정밀도↓, 03장)"가 처방이 됩니다.

두 종류의 캐시를 구분하세요 (이 장의 핵심)

"캐시"라는 한 단어가 성격이 다른 두 가지를 가리킵니다. 섞으면 큰 혼란이 옵니다.

하드웨어 캐시 (L1/L2 등)소프트웨어 캐시 (KV 캐시·prefix 캐시)
누가 관리하드웨어가 자동으로추론 소프트웨어(런타임)가 명시적으로
무엇을 담나최근 접근한 임의의 데이터LLM이 이미 계산한 토큰들의 중간 상태(key·value 등)
왜 두나데이터 재사용으로 지연·대역폭 절약이미 만든 토큰을 다시 계산하지 않기 위해
크기 결정하드웨어 설계로 고정요청 길이·동시 요청 수에 따라 커짐(가변)
어디에 사나칩 안대개 가속기 메모리(VRAM 등) 안 — 02장 런타임 메모리의 일부
KV 캐시(KV cache)란?
LLM이 토큰을 하나씩 생성할 때(01장 decode), 앞서 처리한 토큰들에 대한 중간 계산 결과(흔히 key·value라 부르는 값)를 저장해 두고 재사용합니다. 이렇게 하면 매 스텝 처음부터 다시 계산하지 않아도 됩니다. 대신 이 저장물이 메모리를 차지하고, 생성이 길수록·동시 요청이 많을수록 커집니다. 이것이 02장에서 "하한 위에 쌓인다"고 한 항목의 정체입니다.

02장에 연결: 런타임 메모리에서 KV 캐시의 자리

flowchart TB
    subgraph VRAM["가속기 메모리 (예: VRAM) — 유한한 용량"]
        W["가중치<br/>storage 하한 (02장)<br/>= P×w/8"]:::mem
        A["활성값(activation)"]:::compute
        KV["KV 캐시<br/>↑ 요청 길이·동시성에 비례해 증가"]:::warn
        BUF["작업 버퍼·오버헤드"]:::slow
    end

    NOTE["세 항목이 유한한 용량을 나눠 씀<br/>→ KV 캐시가 커지면 동시에 처리할 요청 수가 제한됨"]:::req
    VRAM --> NOTE

    classDef mem fill:#ede9fe,stroke:#7c3aed,color:#4c1d95
    classDef compute fill:#dbeafe,stroke:#2563eb,color:#1e3a8a
    classDef warn fill:#fee2e2,stroke:#dc2626,color:#7f1d1d
    classDef slow fill:#e5e7eb,stroke:#6b7280,color:#374151
    classDef req fill:#fef9c3,stroke:#ca8a04,color:#713f12
📌 핵심: 가속기 메모리는 유한합니다. 가중치(고정)가 자리를 차지하고 남은 공간을 활성값·KV 캐시·버퍼가 나눠 씁니다. 그래서 "14 GB 모델이 16 GB 가속기에 들어간다"(02장의 함정)가 왜 성급한지 이제 분명합니다 — KV 캐시·활성값 자리가 없으면, 혹은 요청이 길거나 많으면 실제로는 부족합니다. KV 캐시 크기가 동시 처리 가능한 요청 수(08장 concurrency)를 제약합니다.

prefix 캐시는 또 무엇인가요?

여러 요청이 같은 앞부분(prefix)을 공유할 때(예: 같은 시스템 프롬프트), 그 부분의 계산 결과를 재사용하는 소프트웨어 캐시입니다. 목적은 KV 캐시와 같은 결(재계산 회피)이되, "요청들 사이에서 공유"에 초점이 있습니다.

  • 얻는 것: 공유 부분을 다시 계산하지 않아 절약.
  • 조건: 실제로 앞부분이 겹쳐야 하고, 소프트웨어가 이 기능을 지원해야 함. 겹침이 없으면 이점도 없음.

⚖️ 절충(tradeoff): 캐시를 둘 때

CODE
KV 캐시를 두면:
  얻는 것: decode에서 재계산 회피 → 데이터 이동·연산 절약
  치르는 것: 가속기 메모리 용량 소모 → 동시 처리 요청 수 제약
  → "속도"와 "동시성"이 메모리 용량을 두고 경쟁하는 구조

정밀도를 낮추면(03장):
  얻는 것: 같은 데이터를 더 적은 바이트로 → 용량·대역폭 여유
  치르는 것: 수치 범위·품질 변화 가능 (03장의 절충 그대로)

숨은 전제:
  이 절충들의 유불리는 워크로드(요청 길이 분포·공유 정도·동시성)에 달림.
  워크로드 없이는 "캐시가 이득이다"조차 조건부.

⚠️ 흔한 오해

  • "메모리가 크면(용량) 빠르다." — 용량과 대역폭·지연은 별개입니다. 큰 용량이 넓은 대역폭을 뜻하지 않습니다.
  • "KV 캐시는 하드웨어 캐시의 일종이다." — 아닙니다. KV 캐시는 소프트웨어가 명시적으로 관리하는, 계산 결과 저장물입니다. L1/L2 같은 하드웨어 자동 캐시와 다릅니다.
  • "가중치만 들어가면 모델이 돈다." — 활성값·KV 캐시·버퍼 자리가 있어야 실제로 처리됩니다(02장 하한 ≠ 런타임 전체).
  • "GB/s와 Gb/s는 같다." — byte/s와 bit/s는 8배 차이입니다(02장 표기 함정). 대역폭 수치 읽을 때 b/B를 확인하세요.

조건 명시

내용
성립하는 조건"메모리를 용량·대역폭·지연으로 나눈다", "하드웨어 캐시와 소프트웨어 캐시는 다르다", "KV 캐시가 런타임 메모리를 쓴다"는 원리적으로 안정적입니다.
성립하지 않는 결론"이 가속기 메모리면 요청 N개를 동시에 처리한다"를 일반적으로 단정할 수 없습니다. KV 캐시 크기는 요청 길이·모델 구조·구현에 따라 다르고, 실제 동시성은 measured로 확인할 문제입니다. 구체적 대역폭·용량 수치도 제품 사양(확인일 명시)이 필요합니다.

🔬 증거 읽기: 메모리 주장의 유형

  • "이 메모리의 대역폭은 X GB/s, 용량은 Y GB" → vendor-reported 스펙(PRIMARY일 수 있음). peak 대역폭일 때가 많아 실제 달성 대역폭과 구분해야 함(09장).
  • "이 설정에서 KV 캐시가 Z GB를 썼다" → measured (요청 길이·동시성·구현을 밝혀야).
  • "그러므로 요청 N개까지 동시 처리 가능" → inferred/calculated이며, 전제(캐시 크기·여유 용량)를 명시해야 함.

이 장에서 배운 것

  • 메모리는 용량·대역폭·지연 세 축으로 나눠 읽는다. 셋은 따로 논다.
  • 하드웨어 계층(레지스터→캐시→VRAM/RAM→저장장치)은 코어에 가까울수록 빠르고 작다.
  • 하드웨어 캐시(자동)와 소프트웨어 캐시(KV·prefix, 명시적 관리)는 다르다.
  • KV 캐시는 가속기 메모리를 쓰고, 요청 길이·동시성에 비례해 커진다 — 02장 "하한 위에 쌓이는 것"의 정체이자, 동시성(08장)의 제약.
  • 속도(캐시)와 동시성이 유한한 메모리 용량을 두고 경쟁한다.

🔎 이 장의 '지지하지 않는 결론'

  • 이 장으로 "이 가속기면 요청 N개 동시 처리"를 단정할 수 없다. KV 캐시 크기가 워크로드에 달렸고, 실제 값은 measured가 필요하다.
  • "메모리 용량이 크니 대역폭도 넓고 빠르다"는 성립하지 않는다. 세 축은 별개다.

✍️ 확인 문제

  1. 용량·대역폭·지연 중, 05장의 memory-bound와 가장 직접 관련된 축은 무엇인가요? 왜죠?
  2. 하드웨어 캐시와 KV 캐시의 가장 큰 차이 두 가지(관리 주체·크기 결정 방식)를 설명하세요.
  3. [조건 묻기 / peak-measured] "이 가속기 메모리는 X GB이니 14 GB 모델을 넉넉히 돌린다"는 주장의 빠진 전제는? 그리고 사양표의 "대역폭 X GB/s"가 peak일 때, 실제 성능 추정에 그대로 쓰면 안 되는 이유는?
다음 장: 07 · GPU, node, rack, interconnect — 한 디바이스 밖으로 나가, 여러 가속기·노드·랙을 잇는 토폴로지와 인터커넥트, 그리고 all-reduce 같은 collective 비용을 엽니다. (다음 묶음에서 제작)