CPU上LLM服务优化:Sandwich架构解决预填充与解码阶段挑战 1. CPU上LLM服务优化的核心挑战在CPU上部署大型语言模型(LLM)服务面临两个关键阶段的资源需求冲突预填充(prefill)阶段和解码(decode)阶段。预填充阶段需要处理变长输入属于计算密集型任务而解码阶段则受限于内存带宽和缓存争用属于内存密集型任务。这种资源需求的根本性差异导致传统优化方法难以同时兼顾两个阶段的性能。关键发现在Intel Xeon Platinum 8275CL平台上的实测数据显示预填充阶段的IPC(每周期指令数)达到1.14而解码阶段仅为0.261相差近4.4倍。这验证了两个阶段完全不同的性能特征。现代CPU架构的复杂性进一步加剧了这一挑战。以AMD EPYC 7H11处理器为例其NUMA架构中每4个核心共享一个LLC(末级缓存)切片这种子NUMA结构在传统优化方案中经常被忽视。同时动态形状张量程序的自动生成面临调优成本高、并行化效率低等问题。2. Sandwich系统架构设计2.1 整体工作流程Sandwich采用三层式架构设计通过离线分析和运行时动态切换实现全栈优化服务配置生成阶段解析CPU硬件拓扑结构构建基础TopoTree通过变换操作枚举优化方案生成并行化方案和核心利用方案内核编排阶段动态形状张量程序生成预填充专用内核优化解码专用内核优化运行时热切换机制无中断切换执行计划共享模型权重动态资源调配2.2 核心创新点2.2.1 TopoTree硬件抽象TopoTree是一种多级树形结构用于表示NUMA系统中共享资源层次结构的核心利用方案。其构建过程包括基础树构建使用lstopo等系统工具采集硬件信息叶节点对应处理单元(PU)非叶节点表示共享资源(如L3缓存)树变换操作Group变换发现潜在的共享结构def group(nodes, stride, depth): new_nodes [] for i in range(0, len(nodes), stride): cluster create_parent_node(nodes[i:istride]) new_nodes.append(cluster) insert_level(new_nodes, depth)Remove变换缓解资源争用def remove(nodes_to_remove, depth): for parent in get_nodes_at_level(depth-1): for child in nodes_to_remove: parent.remove_child(child)复杂度控制利用Merkle树原理进行哈希去重构建变换树实现剪枝优化实际测试中搜索时间控制在1.18-600秒2.2.2 动态形状张量程序生成采用快速启动-微调策略优化动态形状张量程序微内核(MK)生成尺寸为μM×μN的寄存器级优化避免寄存器溢出(32个向量寄存器限制)归约维度对齐缓存行大小两阶段优化graph TD A[快速启动阶段] -- B[指数级扩展计算切片] B -- C{性能提升?} C --|是| D[继续扩展] C --|否| E[回退并锁定维度] E -- F[微调阶段] F -- G[枚举线程聚合方案] G -- H[选择最优组合]滑动窗口优化对前16个形状使用全量MK候选后续形状仅考虑最近16个成功MK减少83%的调优时间3. 关键技术实现细节3.1 热切换机制实现Sandwich的热切换机制包含以下核心组件共享内存管理使用rank-shifted环形写入模式动态调整SHM块大小(缓存行)避免虚假共享问题状态保存与恢复关键寄存器状态快照缓存预取策略保持平均切换开销50μs资源重映射void hot_switch(Plan* new_plan) { save_current_state(); remap_memory(new_plan-numa_nodes); rebind_cores(new_plan-core_mask); restore_compute_context(); }3.2 双IR架构设计为实现跨平台兼容性Sandwich采用双重中间表示IR层级语法特征优化目标典型应用低级IRC风格指令级优化SIMD内联汇编高级IRPython风格算法参数调优注意力机制参数这种设计使得现有手工优化内核可快速移植自动调优器能灵活调整关键参数支持BF16/FP32等多种精度4. 性能评估与对比4.1 测试环境配置我们在五种CPU平台上进行评测x86架构Intel Xeon Gold 6151/6230(AVX-512)Intel Xeon Platinum 8272CLAMD EPYC 7H12(AVX-2)ARM架构Kunpeng 920(NEON指令集)测试模型包括Llama-1.3B和Llama3-8B使用ShareGPT和LMsys-Chat-1M数据集生成工作负载。4.2 内核性能对比在动态形状张量程序生成方面Sandwich展现出显著优势编译器性能(TVM1.0)调优时间(秒)TVM1.001,000,000DietCode0.92120,000Roller0.9585,000Sandwich1.181,200特别在ARM平台上Sandwich相比Bolt方案获得5.6倍的性能提升。4.3 端到端服务性能在SLO(服务等级目标)达标率测试中Llama-1.3B模型Xeon 6230达标率提升37%EPYC 7H12达标率提升72%Llama3-8B模型在相同硬件上保持1.7-3.47倍的性能优势延迟对比显示Sandwich在解码阶段实现最高3.4倍的延迟降低预填充阶段也有1.8倍的加速。5. 实际部署建议5.1 硬件适配策略x86服务器优先利用AVX-512指令集对EPYC处理器注意CCD(核心复合体)划分ARM边缘设备调整NEON微内核尺寸优化L3缓存切片利用率5.2 参数调优经验TopoTree搜索初始group步长设为物理核心数约数remove变换从共享资源层级开始动态形状优化滑动窗口大小建议16-32早期停止阈值设为5%性能波动内存配置# 最佳NUMA平衡配置 numactl --interleaveall ./sandwich_server5.3 常见问题排查性能回退检查CPU频率缩放 governor验证内存通道均衡性热切换失败确保足够的HugePage预留检查NUMA节点距离矩阵精度问题BF16需要AVX-512_BF16指令支持ARM平台需启用FP32 FMA在实际部署中我们发现对Kunpeng920平台将线程绑定到特定核心组可额外获得12%的性能提升。这验证了TopoTree对非x86架构的适配能力。