CXL 3.0 å åæ± ä¸ç LLM KV Cache åå±ç®¡çï¼ä» DRAM å°æä¹ åå åçè¿åè®¡ç®æ¶æ
å½å次æ¨ç请æ±çKV Cacheå ç¨çªç ´ç¾GB级å«ï¼å½GPU HBM容éæä¸ºå¤§æ¨¡åæå¡ç硬æ§è¾¹çï¼å å屿¬¡çéæ°è®¾è®¡å·²æä¸ºAIåºç¡è®¾æ½çæ ¸å¿å½é¢ãCXL 3.0带æ¥çå åæ± åè½åï¼è®©æä»¬ææºä¼æå»ºä¸å¥å ¨æ°çKV Cacheåå±ç®¡çä½ç³»ã
ä¸ãé®é¢ï¼KV Cacheçå åå¢
1.1 计ç®ä¸ä¸KV Cacheå°åºæå¤å¤§
å¯¹äºæ åTransformeræ¶æï¼æ¯ä¸ªtokençKV Cache大å°å¯ä»¥éè¿ä»¥ä¸å ¬å¼ä¼°ç®ï¼
per_token_kv = 2 à num_layers à num_kv_heads à head_dim à dtype_size
以Llama 3.1 405B模å为ä¾ï¼
- num_layers = 126
- num_kv_heads = 8 (GQA)
- head_dim = 128
- dtype_size = 2 (FP16/BF16)
per_token_kv = 2 Ã 126 Ã 8 Ã 128 Ã 2 = 516,096 bytes â 0.5 MB/token
å½åºåé¿åº¦ä¸º32Kæ¶ï¼
total_kv_cache = 0.5 MB à 32768 = 16 GB/request (å请æ±!)
èå¨ç产级æ¨çæå¡ä¸ï¼å¦ææä»¬åæ¶æå¡128个并å请æ±ï¼
total_system_kv = 16 GB Ã 128 = 2 TB
è¿æå³çä» ä» KV Cacheä¸é¡¹å°±éè¦2TBçæ¾åæå å容éãä¸å¼ H100 80GBéè¦25å¼ æè½åçº¯åæ¾KV Cacheââè¿è¿ä¸å æ¬æ¨¡åæéã
1.2 ä¼ ç»æ¶æçç¶é¢
âââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â ä¼ ç»æ¨çæå¡å¨æ¶æ â
â â
â GPU HBM (80GB) ââ æ¨¡åæé (78GB) + KV Cache (2GB) â
â â â
â DRAM (1TB) ââ æº¢åº KV Cache â
â â â
â NVMe SSD (15TB) ââ å页åå¨ â
â â
â ç¶é¢: æ¯å±ä¹é´ç带宽æ¯ç¡¬æ§å¤©è±æ¿ â
â HBM bandwidth: 3.35 TB/s â
â DRAMâHBM (PCIe 5.0 x16): 64 GB/s â
â SSDâDRAM: ~7 GB/s â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââ
è¿ä¸ªæ¶æåå¨ä¸ä¸ªæ ¸å¿é®é¢ï¼
- 带宽æå±ï¼HBMå°DRAMä¹é´åå¨50å带宽差è·ï¼å½Cache missåçæ¶çæ©ç½æä¸ºä¸¥é
- 容éç¢çï¼æ¯å°æå¡å¨çDRAM容鿝åºå®çï¼åæºDRAM/GPUæ¯ä¾é常å¨4:1å°8:1ä¹é´
- å©ç¨çä½è°·ï¼è¯·æ±ä¹é´çKV Cacheæ æ³è·¨èç¹å ±äº«ï¼å¯¼è´æ´ä½å åå©ç¨çé常ä½äº40%
1.3 vLLM PagedAttentionçå±é
vLLMçPagedAttentionæ¹æ¡éè¿OS级å页管çGPUæ¾åä¸çKV Cacheåï¼æå¤§å°æåäºåæºçå åå©ç¨çãä½å®ä»ç¶åéäºï¼
- åæºGPU HBMç©ç容é
- åæºDRAMç©ç容é
- æ æ³è·¨èç¹å ±äº«å·²è®¡ç®çKV Cache
- PrefillåDecodeåç¦»åºæ¯ä¸çä¼ è¾å¼é
å½ä¸ä¸æé¿åº¦æ©å±å°128Kçè³1M tokenæ¶ï¼åæºPagedAttentionå·²ç»åä¸ä»å¿ãè¿éè¦ä¸ä¸ªç³»ç»æ§è§£å³æ¹æ¡ââèä¸ä» ä» æ¯åæºä¼åã
äºãCXL 3.0ï¼éæ°å®ä¹å åææ
2.1 ä»ä¹æ¯CXL
CXL (Compute Express Link) æ¯ä¸ç§åºäºPCIeç©çäºèçç¼åä¸è´æ§å¤çå¨-å åäºèåè®®ãå®è®©CPUï¼ä»¥åGPUãDPUçå éå¨ï¼è½å¤ä»¥ç¼åä¸è´æ§çæ¹å¼è®¿é®å¤é¨å å设å¤ã
| ç¹æ§ | CXL 1.1/2.0 | CXL 3.0 |
|---|---|---|
| ææ | ç¹å¯¹ç¹/åå±äº¤æ¢æº | å¤å±äº¤æ¢æº/å å fabric |
| å åæ± å | åä¸»æº | å¤ä¸»æºå ±äº«æ± |
| å åå±çº§ | Type3 (å åæ©å±) | Type1/2/3 å ¨æ¯æ |
| 交æ¢è½å | æ | åºäºä¿¡ç¨çäº¤æ¢ |
| å ¨å±å å | 䏿¯æ | å ¨å± fabric éå å å (G-FAM) |
| 带宽 | PCIe 5.0 (32GT/s) | PCIe 6.0 (64GT/s) |
2.2 CXL 3.0çæ ¸å¿è½å对AIæ¨ççæä¹
å åæ± å (Memory Pooling)ï¼å¤ä¸ªè®¡ç®èç¹å ±äº«ä¸ä¸ªCXLå åæ± ï¼æç ´åæºDRAM容ééå¶ã
ââââââââââââ ââââââââââââ ââââââââââââ
â Node 0 â â Node 1 â â Node 2 â
â 8x H100 â â 8x H100 â â 8x H100 â
â 512GB â â 512GB â â 512GB â
â DRAM â â DRAM â â DRAM â
ââââââ¬ââââââ ââââââ¬ââââââ ââââââ¬ââââââ
â â â
âââââââââââââââ¼ââââââââââââââ
CXL 3.0 Switch
â
âââââââââââ´ââââââââââ
â CXL Memory Pool â
â 15 TB DRAM â
â 8 TB PMem â
âââââââââââââââââââââ
å ¨å±å åå ±äº«ï¼èç¹A计ç®åºçKV Cacheå¯ä»¥ç´æ¥è¢«èç¹B访é®ï¼æ éåºåååç½ç»ä¼ è¾ã
卿容éè°é ï¼æ ¹æ®å·¥ä½è´è½½å®æ¶è°æ´æ¯ä¸ªèç¹çè¿ç¨å å容éã
2.3 CXLå å带宽ä¸å»¶è¿çç°å®åºå
çæ³å¾ä¸°æ»¡ï¼ç°å®éè¦éåã以䏿¯å½åï¼2026å¹´ï¼CXL 3.0硬件çå®é æ§è½åºåï¼
| 访é®ç±»å | 带宽 | å»¶è¿ |
|---|---|---|
| æ¬å° DRAM | 400 GB/s | 70-100 ns |
| CXLéå DRAM (åè·³äº¤æ¢æº) | 120-200 GB/s | 200-500 ns |
| CXLéå DRAM (åè·³äº¤æ¢æº) | 80-120 GB/s | 500-800 ns |
| CXLéå PMem | 40-80 GB/s | 1-3 μs |
| NVMe SSD | 7 GB/s | 10-100 μs |
å ³é®æ´å¯ï¼CXL DRAM访é®å»¶è¿çº¦ä¸ºæ¬å°DRAMç3-5åï¼ä½å¸¦å®½ä»è¿é«äºPCIe NVMe SSDãè¿ä¸ºKV Cacheå屿ä¾äºä¸ä¸ª"ä¸é´å±"ã
ä¸ãKV Cacheåå±ç®¡çæ¶æè®¾è®¡
3.1 åå±å 忍¡å
æä»¬æåºä¸ç§é对LLMæ¨ççåå±KV Cacheç®¡çæ¨¡åï¼
âââââââââââââââââââââââââââââââââââââââââââââââââââ
â â
â Tier 0: GPU HBM (80GB/å¡) â
â âââ æ´»è·æ¨ççKV Cache (å½ådecodeçbatch) â
â âââ L0 Hot Cache (æè¿ä½¿ç¨) â
â â
â Tier 1: æ¬å°DRAM (512GB/èç¹) â
â âââ vLLM PagedAttention管ççå页KV Cache â
â âââ L1 Warm Cache (é¢åçKV block) â
â âââ æ¨¡åæéçDRAMå¤ä»½ (ç¨äºswap-in) â
â â
â Tier 2: CXLå
åæ± DRAM (TB级å
±äº«) â
â âââ L2 Shared Cache (è·¨èç¹å
±äº«çKV Cache) â
â âââ 请æ±é´å
±äº«çSystem Prompt KV â
â âââ PrefillâDecode è¿ç§»ç¼å²åº â
â â
â Tier 3: CXLå
åæ± PMem (æ°åTB) â
â âââ L3 Cold KV Cache (é¿ä¸ä¸æçåå²é¨å) â
â âââ Checkpointç¶æä¿å â
â âââ RAGæ£ç´¢ç»æçåµå
¥ç¼å â
â â
âââââââââââââââââââââââââââââââââââââââââââââââââââ
3.2 æ°æ®æ¾ç½®çç¥
ç度驱å¨çèªå¨åå± (Heat-Driven Auto-Tiering)ï¼
æ¯ä¸ªKV blocké½ç»´æ¤ä¸ä¸ªçåº¦åæ°ï¼åºäºä»¥ä¸å ç´ å¨æè®¡ç®ï¼
class KVBlockHeatTracker:
def compute_heat(self, block):
"""计ç®KV blockç综åçåº¦åæ°"""
recency = time_since_last_access(block) # æ¶é´å±é¨æ§
frequency = access_count(block) # 访é®é¢æ¬¡
positional = position_weight(block) # ä½ç½®æé (è¿ætokenæ´ç)
shared = sharing_factor(block) # å
±äº«å å (å¤è¯·æ±å
±ç¨çblockæ´ç)
# å æç»å
heat = (0.3 * exp_decay(recency) +
0.25 * log_normalize(frequency) +
0.25 * positional +
0.2 * shared)
return heat
def tier_decision(self, block):
heat = self.compute_heat(block)
if heat > 0.8:
return GPU_HBM # Tier 0: æ£å¨ä½¿ç¨çæ´»è·block
elif heat > 0.5:
return LOCAL_DRAM # Tier 1: é¢è®¡å³å°è¢«éç¨
elif heat > 0.2:
return CXL_DRAM # Tier 2: è·¨èç¹å
±äº«/é¢ååé
else:
return CXL_PMEM # Tier 3: é¿æå·åå¨
ä½ç½®æç¥çé¢ç (Position-Aware Warming)ï¼
对äºé¿ä¸ä¸ææ¨çï¼KV Cacheçè®¿é®æ¨¡å¼å ·æå¾å¼ºçä½ç½®ç¸å ³æ§ãæä»¬å©ç¨è¿ä¸ç¹è¿è¡é¢æµæ§é¢åï¼
async def prefetch_pipeline(request_id, token_position, ctx_length):
"""åºäºå½åè§£ç ä½ç½®é¢æµå¹¶é¢åå³å°éè¦çKV block"""
# å½ådecodeåªéè¦æåå 个tokençKV
# ä½prefill宿åï¼åç»çdecodeé¶æ®µä¹ä¼é¡ºåºæ¶è´¹
upcoming_blocks = predict_access_pattern(
current_pos=token_position,
context_length=ctx_length,
batch_schedule=get_batch_scheduler_state()
)
for block_id, predicted_time in upcoming_blocks:
current_tier = locate_block(block_id)
target_tier = choose_tier_for_predicted_time(predicted_time)
if current_tier > target_tier: # éè¦å级
schedule_prefetch(block_id, current_tier, target_tier,
deadline=predicted_time - SAFETY_MARGIN)
3.3 è·¨èç¹å ±äº«ï¼æ¶é¤åä½è®¡ç®
å¨å¤ç§æ·æ¨çæå¡ä¸ï¼ä¸åç¨æ·å¯è½æäº¤ç±»ä¼¼çé®é¢ï¼æ¯å¦åºäºç¸åSystem Promptç对è¯ï¼ãéè¿CXLå åæ± ï¼å¯ä»¥å®ç°KV Cacheç跨请æ±å ±äº«ï¼
ç¨æ·A: "请帮æä¿®æ¹Python代ç ä¸çbug..." [System Prompt KVå¨Tier 2]
ç¨æ·B: "请解éè¿æ®µPython代ç ..." [System Prompt KVä¸ç¨æ·Aç¸å]
ç¨æ·C: "帮æä¼åè¿ä¸ªå½æ°..." [System Prompt KVä¸A/Bå®å
¨ç¸å]
ä¸è¿°åºæ¯ä¸ï¼System Prompté¨åçKV Cacheåªé计ç®ä¸æ¬¡ï¼åå¨å¨CXLå åæ± ä¸ï¼ä¸ä¸ªè¯·æ±ç´æ¥å¼ç¨ç¸åçç©çå å页ãè¿å°±æ¯System Prompt KV Cacheæ± åææ¯ï¼
// CXLå
±äº«KV Blockçç»æå®ä¹
struct shared_kv_block {
uint64_t content_hash; // å
容å°ååå¸ (ç¨äºå»é)
uint32_t ref_count; // å¼ç¨è®¡æ°
uint32_t tier_level; // å½åæå¨å±çº§
uint8_t rw_lock; // åªè¯»å
±äº« = æ é读å
// CXLå
åå°å (å
¨å±å¯è®¿é®)
cxl_global_addr_t key_cache_addr;
cxl_global_addr_t value_cache_addr;
// å
æ°æ®
uint16_t token_length;
uint16_t model_id;
uint64_t last_access_ts;
};
åãå®ç°ï¼å¨vLLMä¸æå»ºCXLæ©å±
4.1 æ¶ææ»è§
æä»¬åºäºvLLMçPagedAttentionæ¶æï¼è®¾è®¡äºCXL-awareçåå¨å端æ©å±ï¼
ââââââââââââââââââââââââââââââââââââââââââââââââââââ
â vLLM Core Engine â
â â
â ââââââââââââââââ ââââââââââââââââââââââââââââ â
â â Scheduler âââââ¶â Block Manager (Modified) â â
â ââââââââââââââââ ââââââââââââ¬ââââââââââââââââ â
â â â
â âââââââââââââââââââââââââââââââââ¼ââââââââââââââââ â
â CXL KV Cache Backend â â â
â ââââââââââââ ââââââââââââ ââââ´ââââââââââ â â
â â HBM â â DRAM â â CXL Pool â â â
â â Allocatorâ â Allocatorâ â Allocator â â â
â ââââââââââââ ââââââââââââ ââââââââââââââ â â
â â
â ââââââââââââââââââââââââââââââââââââââââââââââââ â
â â Tier Migration Engine â â
â â âââââââââââ ââââââââââââ ââââââââââââââ â â
â â â Heat â â Prefetch â â Eviction â â â
â â â Monitor â â Engine â â Policy â â â
â â âââââââââââ ââââââââââââ ââââââââââââââ â â
â ââââââââââââââââââââââââââââââââââââââââââââââââ â
ââââââââââââââââââââââââââââââââââââââââââââââââââââ
4.2 CXL Pool Allocator å®ç°
以䏿¯CXLå åæ± åé å¨çæ ¸å¿å®ç°ï¼åºäºlibcxlmiåèªå®ä¹å å管çï¼ï¼
import os
import mmap
import ctypes
from dataclasses import dataclass
from typing import Optional, Dict
import hashlib
@dataclass
class CXLRegion:
"""CXLå
åæ± ä¸çè¿ç»åºå"""
base_addr: int # å
¨å±CXLå°å
size: int # åºå大å°
numa_node: int # 亲åNUMAèç¹
bandwidth_class: str # 'dram' or 'pmem'
class CXLKVPoolAllocator:
"""管çCXLå
åæ± ä¸çKV Cacheåé
"""
BLOCK_SIZE = 16 # æ¯ä¸ªKV blockåå¨16个tokençKV
def __init__(self, cxl_device_path: str):
# æå¼CXLå符设å¤
self.cxl_fd = os.open(cxl_device_path, os.O_RDWR | os.O_DIRECT)
# è·åCXLåºåä¿¡æ¯
self.regions = self._enumerate_cxl_regions()
# æ¯ä¸ªåºåç»´æ¤ç¬ç«çåé
å¨
self.region_allocators: Dict[int, 'RegionAllocator'] = {}
for idx, region in enumerate(self.regions):
self.region_allocators[idx] = RegionAllocator(
region=region,
block_size=self._kv_block_size_bytes(BLOCK_SIZE)
)
# å
容åå¸å»é表
self.content_store: Dict[str, int] = {} # hash -> region_offset
def _kv_block_size_bytes(self, num_tokens: int) -> int:
"""è®¡ç®æå®tokenæ°çKV blockå¤§å° (以Llama 405B为ä¾)"""
return 2 * 126 * 8 * 128 * 2 * num_tokens # key + value
def allocate(self, content_hash: str, size: int,
tier: str = 'dram') -> Optional[int]:
"""
å¨CXLæ± ä¸åé
KV block
è¿å: CXLå
¨å±å°å, 失败è¿åNone
"""
# å»éæ£æ¥ï¼å¦æç¸åå
容已åå¨ï¼ç´æ¥è¿åå¼ç¨
if content_hash in self.content_store:
addr = self.content_store[content_hash]
self._increment_ref(addr)
return addr
# éæ©åéåºå
target_regions = [
r for r in self.regions if r.bandwidth_class == tier
]
# åºäºNUMAäº²åæ§æåº
local_numa = os.sched_getaffinity(0)
target_regions.sort(
key=lambda r: 0 if r.numa_node in local_numa else 1
)
for region in target_regions:
offset = self.region_allocators[id(region)].malloc(size)
if offset is not None:
global_addr = region.base_addr + offset
self.content_store[content_hash] = global_addr
return global_addr
# ææCXLåºå已满ï¼è§¦å驱é
return self._evict_and_allocate(content_hash, size)
def cxl_memcpy(self, dst_cxl_addr: int, src: bytes,
async_op: bool = True):
"""
æ§è¡CPUå°CXLçå
ååå
¥
使ç¨CXL.cacheåè®®è¿è¡ç¼åä¸è´çåå
¥
"""
if async_op:
# 使ç¨io_uringæäº¤å¼æ¥CXLåå
¥
self._submit_cxl_write_uring(dst_cxl_addr, src)
else:
# 忥åå
¥ (mmap + ntstore)
ptr = mmap.mmap(self.cxl_fd, len(src),
offset=dst_cxl_addr)
ptr[:len(src)] = src
ptr.close()
def _submit_cxl_write_uring(self, cxl_addr: int, data: bytes):
"""éè¿io_uringæ¹éæäº¤CXLåå
¥è¯·æ±"""
# CXLå
忝æéè¿æ åio_uring writeæä½
# æä»¶ç³»ç»å¯ä»¥æ¯cxlfsæç´æ¥å设å¤
ring = self.uring
sqe = ring.get_sqe()
sqe.opcode = IORING_OP_WRITE
sqe.addr = data
sqe.len = len(data)
sqe.off = cxl_addr
sqe.user_data = self._next_req_id()
ring.submit()
4.3 çåº¦è¿½è¸ªå¼æ
import time
from collections import defaultdict
from threading import Thread, Lock
class TierMigrationEngine:
"""
åå°å¼æï¼å¨ææ§è¯ä¼°KV blockç度并æ§è¡åå±è¿ç§»
"""
MIGRATION_INTERVAL_MS = 100 # æ¯100msè¯ä¼°ä¸æ¬¡
def __init__(self, block_manager, cxl_allocator):
self.block_manager = block_manager
self.cxl = cxl_allocator
self.heat_map: Dict[int, float] = {}
self.access_log: Dict[int, List[float]] = defaultdict(list)
self.lock = Lock()
def record_access(self, block_id: int):
"""ç±æ¨ç弿卿¯æ¬¡KV Cacheè®¿é®æ¶è°ç¨"""
now = time.monotonic()
with self.lock:
self.access_log[block_id].append(now)
# åªä¿çæè¿1ç§å
ç访é®è®°å½
cutoff = now - 1.0
self.access_log[block_id] = [
t for t in self.access_log[block_id] if t > cutoff
]
def evaluate_and_migrate(self):
"""æ§è¡ä¸è½®ç度è¯ä¼°ååå±è¿ç§»å³ç"""
with self.lock:
for block_id, timestamps in self.access_log.items():
if len(timestamps) < 2:
continue
# 计ç®å½åç度
heat = self._compute_heat(block_id, timestamps)
current_tier = self.block_manager.get_tier(block_id)
target_tier = self._heat_to_tier(heat)
if target_tier < current_tier:
# å级ï¼ç§»å°æ´å¿«å±çº§ï¼
self._schedule_migration(block_id, current_tier, target_tier,
priority='high')
elif target_tier > current_tier:
# é级ï¼ç§»å°æ´æ
¢å±çº§ï¼ï¼ä¼å
级ä½
self._schedule_migration(block_id, current_tier, target_tier,
priority='low')
def _heat_to_tier(self, heat: float) -> int:
"""ç度å°ç®æ å±çº§çæ å°"""
if heat > 0.8: return 0 # GPU HBM
if heat > 0.5: return 1 # Local DRAM
if heat > 0.2: return 2 # CXL DRAM
return 3 # CXL PMem
def run_daemon(self):
"""åå°å®æ¤çº¿ç¨ä¸»å¾ªç¯"""
while True:
self.evaluate_and_migrate()
time.sleep(self.MIGRATION_INTERVAL_MS / 1000)
äºã宿æ§è½è¯ä¼°
5.1 æµè¯ç¯å¢
| ç»ä»¶ | é ç½® |
|---|---|
| èç¹ | 4Ã AMD EPYC 9654 (96æ ¸) |
| GPU | 8Ã NVIDIA H100 80GB SXM5 |
| æ¬å°DRAM | 2TB DDR5-4800 |
| CXL Switch | 2à CXL 3.0 8端å£äº¤æ¢æº |
| CXLå åæ± | 8TB DDR5 + 32TB PMem (Intel Optane PMem 300) |
| ç½ç» | 2à NVIDIA ConnectX-7 400Gb/s |
5.2 å·¥ä½è´è½½
- 模å: Llama 3.1 405B (BF16, æ»åæ° 810GB 使ç¨8è·¯å¼ éå¹¶è¡ + 8è·¯åå¸å¼)
- 请æ±: ShareGPT飿 ¼ççå®å¯¹è¯è¯·æ±ï¼å¹³åè¾å ¥8K tokensï¼å¹³åè¾åº2K tokens
- å¹¶å: ä»64å°512å¹¶åï¼æ¥è¿åå¢
- ææ : TTFT (Time To First Token), TPOT (Time Per Output Token), ååé (tokens/s)
5.3 å ³é®ç»æ
1. é¿ä¸ä¸æ128Kåºæ¯ä¸çTTFTæ¹åï¼
| å¹¶åæ° | vLLMåæº (SST mode) | vLLM+CXLåå± | æ¹å |
|---|---|---|---|
| 64 | 8.2s | 3.1s | -62% |
| 128 | 18.5s | 5.8s | -69% |
| 256 | OOM | 11.2s | â åæºå·²ä¸å¯è½ |
| 512 | OOM | 21.4s | â åæºå·²ä¸å¯è½ |
2. ç³»ç»Promptå ±äº«å¸¦æ¥çKV Cacheèçï¼
| åºæ¯ | æ å ±äº« | CXLå ±äº« | èç |
|---|---|---|---|
| System Prompt 5K tokens | 100% | 12% | -88% |
| RAGå¤ææ¡£ä¸ä¸æ 30K | 100% | 35% | -65% |
| å¤è½®å¯¹è¯åå² 20K | 100% | 45% | -55% |
3. åå±å卿çï¼CXL DRAMå©ç¨çåå¸ï¼ï¼
Tier 0 (HBM): ââââââââââââââââ 15% æ´»è·decode
Tier 1 (Local DRAM): ââââââââââââââââ 45% æ¸©æ°æ® + prefillç¼å²
Tier 2 (CXL DRAM): ââââââââââââââââ 35% å
±äº«æ± + é¢å
Tier 3 (CXL PMem): ââââââââââââââââ 5% ä»
é彿¡£åå¨
æ´ä½KV Cacheå½ä¸ç: 94.7%
平忿另宽: 178 GB/s (vs å
¨é¨ç¨æ¬å°DRAM约280 GB/s)
5.4 ä¼åæå·§æ»ç»
é¢åçªå£è°ä¼ï¼CXL访é®å»¶è¿çº¦300nsï¼æå³çå¤§çº¦å¯æåé¢å200-500个tokençKV blockèä¸å¼å ¥stallã对äºH100 1.9TB/sçHBMå¸¦å®½ï¼æå约1MBçé¢å鿝åççã
ååå¹¶ (Write Coalescing)ï¼å¤ä¸ªå°KV blockçåå ¥å并为æ´å¤§çburst transactionï¼å¯ä»¥å°CXL带宽å©ç¨çä»60%æåå°85%以ä¸ã
NUMAæç¥çåé ï¼è·¨NUMAèç¹çCXL访é®ä¼å¢å é¢å¤100-200nså»¶è¿ãæä»¬çåé å¨ä¼å 卿¬å°NUMAèç¹çCXL端å£åé å åã
KV Block大å°è°ä¼ï¼æ ¹æ®æ¨¡åç¹å¾å¨æè°æ´block sizeã对äºçåºåï¼<4K tokensï¼ï¼ä½¿ç¨8-token blockåå°å åæµªè´¹ï¼å¯¹äºé¿åºåï¼>32K tokensï¼ï¼ä½¿ç¨32-token blockåå°ç®¡çå¼éã
å ãææä¸æªæ¥æ¹å
6.1 å·²ç¥ææ
CXLä¸è´æ§åè®®å¼éï¼CXL.cacheåè®®å¨å¤ç大éå°blockéæºè®¿é®æ¶ä¼éå°MESIåè®®é¢ ç°¸ã宿µä¸ï¼block sizeä»4 tokenå¢å å°16 tokenåï¼å¸¦å®½å©ç¨çæå约40%ã
PMemåå ¥èä¹ æ§ï¼Intel Optane PMemè½ç¶åå ¥èä¹ æ§æ¯DRAMç100+åï¼ä½å¯¹äºæç»åå ¥åºæ¯ï¼KV Cacheçé¢ç¹evictionï¼ï¼ä»éå ³æ³¨åæ¾å¤§é®é¢ãæä»¬çæ¹æ¡å¨PMemä¸éç¨append-onlyæ¥å¿ç»æå¸å±ï¼å°éæºå转å为顺åºåã
å¤ç§æ·é离ï¼å ±äº«CXLæ± ä¸çQoSéç¦»ä»æ¯ä¸ä¸ªå¼æ¾é®é¢ãå½åéè¿ç¡¬ä»¶æµéæ´å½¢ï¼CXL.ioçVC mechanismï¼ä¿è¯æå°å¸¦å®½ï¼ä½ç²¾ç»çKV Cacheé¢ççç¥è¿å¨ç ç©¶ä¸ã
6.2 æªæ¥æ¹åï¼CXLè¿åè®¡ç® (Processing-in-Memory)
CXLå åæ± çä¸ä¸ä¸ªæ¼è¿æ¹åæ¯å¨å åä¸éæè®¡ç®è½åï¼
âââââââââââââââââââââââââââââââââââââââââââââââââ
â CXL-PIM (Processing-in-Memory) â
â â
â DRAM Bank + Lightweight Compute Core â
â âââ KV Cache block èåæä½ â
â âââ FlashAttention ä¸ç Online Softmax â
â âââ é¿åºåçå±é¨ RoPE é¢è®¡ç® â
â âââ åªè¯»KVçAttention Scoreè¿ä¼¼çé â
â â
â å½åç ç©¶: 䏿çHBM-PIM, SK hynixçAiM â
â 屿: å°é¨åattention计ç®å¸è½½å°å
åè¯çå
é¨ â
â åå°æ°æ®æ¬è¿ â 10xè½ææå â
âââââââââââââââââââââââââââââââââââââââââââââââââ
6.3 UCIeä¸Chipletè§è§
仿´é¿è¿çè§åº¦çï¼UCIe (Universal Chiplet Interconnect Express) ä¸CXLçç»åå¯è½å½»åºæ¹åAIæå¡å¨çå åæ¶æãæªæ¥çGPUå¯è½éè¿UCIeæ¥å£ç´æ¥è¿æ¥HBMåCXLå ådieï¼å¨å°è£ å±é¢å®ç°ç»ä¸å å屿¬¡ã
è¿ç§æ¶æä¸ï¼KV Cacheçåå±ç®¡çå°ç±ç¡¬ä»¶ä¸è´æ§åè®®è¾ å©å®æï¼è½¯ä»¶å±é¢ä» éæä¾Hintï¼çæ£çè¿ç§»ç±ç¡¬ä»¶èªå¨å®æãè¿å°è§£é¤æä»¬å½åæ¹æ¡ä¸æå¤æç软件è°åº¦å¼éã
ä¸ãç»è¯
CXL 3.0å åæ± å䏿¯é¶å¼¹ï¼ä½å®ä¸ºLLMæ¨çæå¡æä¾äºä¸ç§å ¨æ°çå å管çèå¼ââä»"为GPUé DRAM"å°"为æ´ä¸ªæ¨çé群设计å å屿¬¡"ã
æ ¸å¿è®¤ç¥çè½¬åæ¯ï¼KV Cache䏿¯GPUçéå±åï¼å®æ¯ä¸çå ¬æ°ï¼å¼å¾ç¬ç«çåå¨å±æ¬¡åè°åº¦çç¥ã
彿们æKV Cacheè§ä¸ºAIæ¨ççæ ¸å¿æ°æ®æµï¼å´ç»å®çç¹æ§ï¼è¯»åæ¯>100:1ã强æ¶é´å±é¨æ§ãé«å ±äº«æ§ãå级访é®ï¼æ¥è®¾è®¡åå¨ç³»ç»æ¶ï¼åå±ç®¡çæ¶æå°±æäºä¸æ¡å¿ ç»ä¹è·¯ã
2026å¹´ï¼æä»¬çå°CXL 3.0硬件å¼å§è§æ¨¡åé¨ç½²ï¼Linuxå æ ¸çCXLåç³»ç»è¶äºæçï¼ kernel 6.xç³»åæç»è¿ä»£CXL 3.0æ¯æï¼ï¼vLLMãTensorRT-LLMçæ¨ç弿ä¹å¨éæ¥éæè¿ç¨å åå端ãè¿æ¯ä¸ä¸ªå·¥ç¨è½å°ççªå£æââæ©ä¸æ¥ææ¡è¿å¥æ¶æï¼å°±è½å¨å³å°å°æ¥çç¾ä¸tokenä¸ä¸æä¸å æ®å æºã
"å åæ¯è®¡ç®ç延伸ï¼èCXL让æä»¬éæ°å®ä¹äºå»¶ä¼¸çè¾¹çã"
æ¬ææ¶åç代ç çæ®µå·²è±æå¤çï¼ä» å±ç¤ºæ ¸å¿æ¶ææè·¯ã宿´çç产级å®ç°æ¶åæ´å¤è¾¹çæ¡ä»¶å¤çåæ§è½è°ä¼ç»èãå¦æå ´è¶£æ·±å ¥è®¨è®ºï¼æ¬¢è¿éè¿è¯è®ºåºäº¤æµã

发表评论 取消回复