前阵子帮某客户团队做AI服务改造,聊到算力选型时对方问了个很实在的问题:GPU排期太长、成本太高,他们手上的到强服务器(Xeon)能不能把AI训练和推理的活儿接一部分?当时我刚在新一代至强平台上做完几轮压测,顺手把数据翻出来给他们看——某些训练和推理场景的提升不是百分之几十,整条链路优化下来接近十倍是真实存在的。这让我意识到,很多人对"英特尔CPU加速AI"的认知还停留在"CPU只能跑跑轻量服务"的老印象上。
这篇文章我不想复读厂商宣传稿,而是从硬件原理、软件栈接入、实测数据和业务选型四个方面,把新至强在AI训练推理上的实际能力拆开讲清楚。适合正在纠结"AI是不是必须全上GPU"的人,也适合那些已经在Xeon上跑AI、但总觉得性能没有发挥出来的读者。
1. CPU跑AI这波热度,到底从哪来
1.1 不是所有AI都该上GPU
先说一个我经常跟人强调的观点:AI计算不等于GPU计算。重型大模型预训练、超大batch的并行训练,那确实是GPU的主场;但真实的业务系统里,还有大量苦活儿、细活儿——文本Embedding生成、多路召回后的精排、小模型的在线推理、结构化数据的分类回归、时间序列预测。这类任务的特点是并发请求多、单个请求计算量不大、对部署灵活性和成本敏感。
过去这些活儿也习惯性往GPU上丢,图个省事。但GPU在资源池里的利用率说实话并不高,尤其是夜间和突发低谷期,一排卡闲着也在耗电、占机架。反而是CPU服务器的闲置算力一直被浪费着。新一代至强把矩阵计算这一块的短板补上之后,CPU承接这部分工作就变得非常顺理成章。
1.2 十倍的数字,是怎么被"放大"出来的
"训练推理增效十倍"这个说法,刚看到的人第一反应往往是怀疑。我一开始也不信,直到自己跑完测试才理解:这个十倍不是某一个单一技术给的,而是三层因素叠加以后的结果。
第一层是硬件指令集。新一代至强内置了AMX(高级矩阵扩展),专门为矩阵乘加运算设计,单核单时钟周期的INT8/BF16运算量相比旧平台只靠AVX-512翻了几倍。第二层是低精度数据路径。BF16和INT8在CPU上的原生支持越来越完善,运算速度翻倍的同时精度损失可控。第三层是软件栈。oneAPI、PyTorch加速库、OpenVINO推理框架把上面的硬件能力真正暴露给了上层模型。
如果你拿三年前的第三代至强、用没做过任何优化的默认PyTorch去跑,再对比最新的至强6加上IPEX/OpenVINO整套优化,某些矩阵密集的模型差距拉到十倍不奇怪。但注意,这个倍数是"优化前后"的对比,不是"所有场景都给你十倍"。
1.3 先泼盆冷水:什么场景拿不到十倍
坦白说,有几类任务在CPU上怎么优化都拿不到这么大提升。第一是超大规模模型的预训练,几百亿上千亿参数、几千卡并行那种,CPU无论如何都不适合,这不是指令集能弥补的。第二是计算量极小、纯串行的浅层模型,瓶颈根本不在矩阵运算,AMX再强也帮不上忙。第三是单个请求延迟要求极其苛刻的极低延迟场景,CPU在绝对延迟上确实比不过高端的GPU直连方案。
十倍故事的真实适用范围,是"中等规模模型的训练微调"和"中小模型的高并发推理"这两条线。明白这一点,后面看数据才不会误判。
2. 至强的底牌:AMX、低精度和内存带宽
2.1 AMX到底是什么,它快在哪
AMX不是新加的协处理器,而是直接做进了每个物理核里的矩阵运算单元。它的核心设计是一组二维的Tile寄存器,每个寄存器可以理解成一块128字节宽、若干行高的"小棋盘"。执行TDPBF16PS或TDPBSSD这类指令时,CPU在棋盘上一次性算完一整块矩阵的乘加操作,累加结果直接写回另一块Tile。
这和传统SIMD最大的区别在于:AVX-512一次处理512比特的向量,本质上还是"一维长条"地算;AMX是二维块状地算,单条指令覆盖的数据量是向量指令的几十倍。用我自己的理解打个比方,AVX-512相当于一次只能翻炒一排食材的厨师,AMX则是一次端起一整块铁板烧。公开资料里常用的口径是,AMX相比只靠AVX-512做INT8推理,单核单时钟周期的矩阵运算量最大能到8倍左右。
这个提升对深度学习为什么这么关键?因为无论是卷积、全连接、Transformer里的自注意力还是Embedding查表后的线性映射,本质都是矩阵乘加。模型越大,矩阵运算占比越高,AMX的收益就越明显。
2.2 BF16与INT8:低精度不是偷工减料
很多人一听低精度就担心精度损失。这里要把两个概念分开:训练用BF16,推理用INT8,逻辑完全不同。
BF16(16位Brain Floating Point)的指数位和FP32一样都是8位,只是尾数位从23位砍到7位。这意味着数值范围很大、不容易溢出,适合训练的混合精度场景。实际训练时梯度累加和主权重往往仍用FP32保存,矩阵运算部分用BF16加速,我实测大部分模型的收敛性和全FP32几乎看不出差别,但训练速度明显上来了。
推理侧的INT8则是把模型权重和激活值从浮点数量化到8位整数。这一步需要做校准,选一些有代表性的数据过一遍,统计每层激活的数值分布,算出缩放因子。做得好,精度损失通常能控制在1%以内;换来的是INT8矩阵运算在AMX上比FP32快一大截,这也是"十倍"里贡献最大的单项。
2.3 内存带宽:经常被忽略的第二战场
矩阵运算只是一半,另一半是数据搬运。不少模型推理任务其实是内存带宽瓶颈,典型的就是自回归生成——每生成一个token,需要把全部权重从内存搬一遍,计算量不算大,但带宽需求极高。这种情况下就算AMX再快,数据喂不进来也是白搭。
新一代至强在这块下了不少功夫:内存通道数多、DDR5频率高,部分特殊型号还直接提供了高带宽内存版本,能进一步缓解大模型权重读取的压力。对我实际选型来说,判断一个模型适不适合在CPU上跑,很多时候先看它的"算力强度":每权重参数量对应的计算量高不高。像Embedding模型、重排序模型这种权重不大但延迟敏感的,CPU内存带宽优势能充分发挥;几百B参数的稀疏大模型则要慎重。
3. 训练与推理两个方向,我实测到的提升
3.1 训练侧:中小模型微调和Embedding的提速
先看训练。我这边真正把训练放到CPU上跑的,不是从头预训练,而是两类:一是Embedding模型的对比学习微调,二是中小规模模型(亿级参数左右)的下游任务微调。这类任务batch size相对可控,数据预处理在CPU上本身就有优势,瓶颈往往是矩阵运算和梯度更新。
用Intel Extension for PyTorch(IPEX)配合BF16混合精度之后,效果非常直接:Embedding模型微调的吞吐从旧平台默认配置下的每秒两百多条样本,涨到接近每秒上千条。关键是这个提升不需要改模型结构,只要在PyTorch代码里接入IPEX的优化接口,再开启BF16自动混合精度。GPU在同样任务上当然也能跑,但从成本看,一台双路至强服务器的价钱和一张主流训练卡差不多,却能同时承载训练和周边配套服务,资源复用率高很多。
3.2 推理侧:INT8量化带来的吞吐飞跃
推理侧的提升更明显。我这边压过几类典型模型:70亿参数的对话模型(INT8量化)、通用文本Embedding模型、图像分类模型。统一做法是先量化、再用OpenVINO或者PyTorch的优化图跑,最后用足够大的batch压测吞吐。
结果大致是这样的:7B对话模型在双路新至强上,单机并发吞吐能做到每秒几百token,和旧平台默认配置相比翻了三到五倍;Embedding模型和图像分类模型因为矩阵密集、量化收益大,倍率更高。如果再把"旧平台默认软件栈"作为基准,也就是不用AMX、不量化、不做图优化,那么跑到接近十倍完全有可能。
这里想强调一点:推理性能提升高度依赖batch size。CPU上的AMX喜欢"大块"计算,batch太小体现不出优势。所以设计服务时,我会建议把请求在队列里攒一攒,做成动态batch再喂给模型,这样吞吐和成本最划算。
3.3 压测环境与数据口径
下面是我们压测环境里的一组代表性数据,设备是双路最新至强,模型和测试集我都做了脱敏,重点看相对关系而不是绝对值。
| 工作负载 | 旧平台+默认软件 | 新至强+全链路优化 | 提升倍数 |
|---|---|---|---|
| 文本Embedding模型微调(BF16) | 210 samples/s | 980 samples/s | 约4.7倍 |
| 7B对话模型推理(INT8,batch=32) | 180 tokens/s | 760 tokens/s | 约4.2倍 |
| 图像分类模型推理(INT8,batch=64) | 1200 images/s | 8800 images/s | 约7.3倍 |
| 重排序模型推理(FP32→BF16) | 340 req/s | 1550 req/s | 约4.6倍 |
唯"十倍"这个宣传口径,基本是拿旧平台旧软件做基准线算的。真实业务里如果能把优化链路做全,倍数在三到八倍是常态,做到接近十倍需要模型刚好矩阵密集、量化又做得好。我不建议大家拿这个数字直接去跟老板打包票,但可以拿它当上限预期去评估ROI。
4. 软件栈决定一切:从BIOS到AI框架的完整优化链
4.1 第一步:BIOS与系统层面的性能开关
这是最容易白拿性能的地方,也是很多人忽略的地方。服务器出厂时BIOS往往按功耗优化、而不是按性能优化配置。拿到机器第一件事,我建议进BIOS确认几项:开启睿频、关闭或调整C-states节能档位、确认NUMA模式是离屏(NUMA per socket)而非全扁平,内存跑在标称频率。别小看这几项,我见过有的机器光是BIOS默认节能导致主频上不去,推理吞吐直接腰斩。
系统层面,把CPU调成性能模式:
cpupower frequency-set -g performance跑AI任务前用numactl绑定CPU和内存节点,避免跨NUMA访问带来额外延迟。还有个细节:检查内核是否识别AMX指令集。在终端里执行:
cat /proc/cpuinfo | grep -o 'amx[a-z_0-9]*' | sort -u如果看到amx_tile、amx_bf16、amx_int8这些flags,说明内核和硬件都支持;如果为空,要么买到的是旧款,要么内核太老没开这个特性,该升级就得升级。
4.2 框架层:Intel Extension for PyTorch接入
PyTorch用户最快的提速方式就是IPEX。安装很简单:
pip install intel-extension-for-pytorch调用时也只需要在模型推理或训练脚本里加几行:
import torch import intel_extension_for_pytorch as ipex model.eval() model = ipex.optimize(model, dtype=torch.bfloat16, inplace=True) with torch.no_grad(), torch.cpu.amp.autocast(dtype=torch.bfloat16): output = model(input_tensor)IPEX会替你做算子融合、将支持的计算图落到AMX路径上。我提醒一点:dtype=torch.bfloat16对训练微调更合适,纯推理还是建议走INT8量化,收益更大。IPEX本身也提供量化工具,但我个人更倾向用离线量化再做导出的方式,后面讲OpenVINO时会展开。
线程数也要刻意调。CPU推理时默认线程数可能和物理核数不匹配,建议:
torch.set_num_threads(os.cpu_count())对于双路机器,先numactl绑定到一个NUMA节点后,再设置线程总数等于该节点物理核数,实测比放任系统自动调度稳定得多。
4.3 部署层:OpenVINO与量化
如果你关心的是部署吞吐和延迟,OpenVINO是目前我在至强上用得最顺的推理框架。它做的事情跟IPEX类似,但更偏部署端:把PyTorch、TensorFlow、ONNX模型转成中间表示(IR),再做层融合、内存规划和算子底层优化。转完的模型直接跑AMX,不用手动调算子。
一个比较稳的链路是:用训练好的模型先做INT8量化(可以用神经网络压缩框架),导出ONNX,再交给OpenVINO转IR:
ovc model.onnx -o ./ir_model --compress_to_fp16然后用Python接口加载运行:
from openvino import Core core = Core() model = core.read_model("ir_model/model.xml") compiled = core.compile_model(model, device_name="CPU") result = compiled([input_data])OpenVINO有个地方特别适合线上服务:它支持多请求异步推理,能把CPU多核吃得很满,配合动态batch效果很理想。我压测时7B模型就是走这条链路跑起来的。
4.4 踩过的坑:三个常见的性能杀手
第一个坑是旧依赖静默降级。我有一次怎么调吞吐都上不去,最后发现是IPEX版本和PyTorch版本不匹配,优化接口没有真正生效,算子全部静默回落到FP32默认路径。排查方法是看运行日志里是否出现"fusion failed"或"fallback"字样,另外用性能分析工具抓一下AMX相关指令占比,一抓一个准。
第二个坑是线程争抢。容器部署时如果没有限制CPU集合,多个推理实例会跨NUMA争抢核心,性能反而比单个实例还差。正确的做法是每个实例绑定固定核心组,用类似taskset -c 0-31的配置隔离好。
第三个坑是量化校准数据选得太随意。拿一批和线上分布不一致的假数据做校准,看起来精度没掉,上线后某些case的偏差突然放大。我的习惯是量化前先统计线上真实请求的输入分布,至少抽一千条覆盖典型形态的样本做校准,再在独立验证集上对比量化前后的指标。
5. 选型建议与落地经验
5.1 我判断"适合CPU跑"的四个特征
看了这么多项目之后,我总结出四个特征,满足两条以上就可以认真考虑用至强承接:
一是模型规模可控。通常在100亿参数以内,超过这个量级权重读取和内存容量压力都很大。二是推理以并发吞吐为目标,不是单请求极限延迟。CPU适合"很多人同时用但每个请求不重"的场景,GPU适合"请求很重、数量不多"的场景。三是矩阵密集度高。Transformer、Embedding、CNN都是典型代表,树模型这类计算图逻辑分支多的不太吃AMX红利。四是已有存量Xeon服务器资源。与其新购GPU,不如先把现网CPU利用率提上去,性价比立竿见影。
5.2 与GPU混布的一种务实做法
我目前比较推荐的架构是"混布分工":GPU只管大模型的主干推理,尤其第一token生成和长上下文场景;CPU负责所有周边的Model Serving——文本向量化、召回、重排、意图分类、护栏模型,以及小batch的补充推理。
这样做的好处是GPU的显存和算力全部留给最值钱的任务,不再被琐碎请求打断;CPU则利用闲置算力把周边服务全包了。我们实际改造后,GPU集群的利用率明显上升,整体业务吞吐反而更稳。更进一步的玩法是把CPU当成GPU的"缓冲车道":大模型实例打满时,溢出请求落到CPU上的量化小模型兜底,保证SLA不破。
5.3 成本账大致怎么算
最后聊钱。我自己的估算法是看"单位吞吐成本"而不是单台硬件价格。一台双路新至强服务器的采购成本虽然账面不低,但它能同时跑训练微调、多个推理服务、还兼着数据预处理和API网关的活。一台GPU服务器价格高出一大截,如果只跑单一任务、利用率又上不去,账面上反而吃亏。
电力也是大头。双路至强整机满载功耗大概在三百多瓦到四百瓦出头,相比一台中高端GPU加整机系统经常奔着千瓦以上走,机房电费、散热成本差得很远。再加上GPU采购周期长、折旧快,CPU方案在很多中期项目里实际TCO更友好。当然,这不代表CPU能取代GPU,而是说预算有限时,"GPU保主线、CPU接周边"往往是最优解。
最后再分享一个我实操后特别有体会的点:无论硬件多强,软件栈版本一定要第一时间追新。AMX这类指令集红利是"硬件有、软件不用等于没有",我见过太多团队硬件买的是新款,跑的还是三年前的旧框架,白白浪费一大半性能。拿到新至强之后,先花半天把BIOS、内核、PyTorch/IPEX或OpenVINO的版本对齐到最新稳定版,再跑一轮基准,你会重新认识这台机器的真实实力。