大型语言模型 (LLM) 已改变了众多行业中的任务,包括起草电子邮件、生成代码和总结会议。近几个月来,我们与 PyTorch 社区紧密合作,为 PyTorch 中标记为“xpu”的英特尔® GPU 优化 LLM 工作负载。本文将说明如何利用这些进步来加速本地 LLM 推理。值得注意的是,英特尔® GPU,包括英特尔® Arc™ 独立显卡和内置显卡,以及英特尔® Arc™ Pro,均支持 PyTorch,使开发者能够在广泛可用的笔记本电脑和台式机上本地运行 PyTorch 和 LLM,让先进的 AI 功能比以往任何时候都更容易触及。
背景
在客户端设备上运行 LLM 面临两个核心挑战:
– 内存限制: 7B+ 模型超过典型的 GPU 显存。
– GEMM 和 SPDA 内核效率: 内核效率需要在计算密集型和内存密集型场景中进行优化。
PyTorch 2.8 通过以下方式解决了英特尔® GPU 上的这些问题:
– oneDNN 后端: 优化英特尔® GPU 的 GEMM/SDPA 操作。
– TorchAO: 通过英特尔® GPU 上的张量子类化实现 INT4 量化。
– Windows 原生 torch.compile: 英特尔® GPU 上内存密集型操作的图融合。
英特尔® GPU 的 LLM 推理优化
Scaled Dot Product Attention 优化:在英特尔 GPU 上释放竞争性性能
The torch.nn.functional.scaled_dot_product_attention (SDPA)实现了里程碑式论文“Attention Is All You Need”中的核心注意力机制。虽然存在朴素的 PyTorch 实现,但其融合后端带来了变革性的性能提升。自 PyTorch 2.7 以来,我们已将oneDNN 集成作为默认的 XPU 后端——为以下两种情况优化了 SDPA:
✅ 长序列(预填充阶段)
✅ 短序列(解码阶段)
主要进展
- PyTorch 2.8+: 添加了分组查询注意力 (GQA) 支持以及多头注意力 (MHA)。
- Hugging Face 集成: 作为主要注意力后端在 Transformers 中提供原生支持。
- KV 缓存兼容性: 与动态和静态缓存策略无缝协作。
# Automatic integration with Hugging Face Transformers
英特尔 GPU 现已通过 Hugging Face 自动集成,为 Transformers 模型提供开箱即用的硬件加速。
import torch from transformers import AutoModelForCausalLM, AutoTokenizer model_id = "microsoft/Phi-3-mini-4k-instruct" model = AutoModelForCausalLM.from_pretrained(model_id, device_map="xpu", torch_dtype=torch.float16)
torch.compile:英特尔® GPU 的图融合
torch.compile 将 eager 模式执行转换为优化的图模式,利用TorchDynamo进行 Python 跟踪,并利用TorchInductor生成 Triton 内核。
对于英特尔® GPU,这可以实现:
✅ 跨平台加速
– 自 PyTorch 2.5 起支持 Linux
– 首个与 Windows 兼容的 torch.compile 加速器(PyTorch 2.7+)。请参阅“How to use torch.compile on Windows CPU/XPU”。
– 通过融合 ROPE/RMSNorm 内核加速解码。
– 通过图优化加速预填充。
根据我们的基准测试,torch.compile 将解码速度提升了 1.39 倍以上,将预填充(第一个 token 生成)速度提升了 1.1 倍以上。
模型 | 预填充加速 (第一个 Token) | 解码加速 (下一个 Token) |
meta-llama/Llama-3.2-3B | 2.42× | 1.58× |
microsoft/Phi-3-mini-4k-instruct | 1.12× | 1.39× |
Qwen/Qwen3-4B | 2.68× | 1.99× |
在英特尔® 酷睿™ i5-13400(Arc B580,12GB 显存)上进行测试,更多信息请参阅产品和性能信息会话。
WOQ-INT4:提升英特尔® GPU 上的 LLM 效率
仅权重量化 (WOQ) 是一种将模型权重压缩为 4 位整数 (INT4),同时保持激活为 16 位精度 (FP16/BF16) 的技术。图 1详细展示了此过程如何在 Transformer 模型中应用。它通过解决内存带宽瓶颈来平衡效率和准确性,从而减少内存占用并加速整体性能。
对于英特尔® GPU 用户而言,解决此瓶颈直接转化为显著的实际优势:模型变得更小、更快、更节能。这使得大型模型能够在消费级硬件上运行,并带来显着改善的用户体验。
我们针对流行模型的基准测试具体证明了这些改进:
模型 | 内存减少 | 解码加速 |
meta-llama/Llama-3.2-3B | 5.98GB→2.10GB | 1.62× |
microsoft/Phi-3-mini-4k-instruct | 7.11GB→2.13GB | 2.14× |
Qwen/Qwen3-4B | 7.49GB→ 2.49GB | 1.56× |
在英特尔® 酷睿™ i5-13400(Arc B580,12GB 显存)上进行测试,更多信息请参阅产品和性能信息会话。
数据证实,WOQ 始终可实现超过 65% 的内存节省和超过 1.5 倍的解码速度提升,突显了其在增强 LLM 可访问性和性能方面的重要作用。
在 PyTorch 2.8 中通过 TorchAO 的张量子类抽象启用,这个 PyTorch 原生优化框架使用 oneDNN 实现 A16W4 GEMM,用与后端无关的 INT4 表示替换 Linear 层权重,如 Phi-3-mini-4k-instruct 实现所示,其中只有解码器 Linear 层被量化。
WOQ-INT4 与 Hugging Face Transformers 无缝集成,支持 AWQ、RTN 和 GPTQ 算法,同时通过训练后量化工作流提供接近 FP16 的推理体验。
图 1:应用于 Phi-3-mini 中 Linear 层的 WOQ-INT4
分步操作:在英特尔® GPU 上运行 LLM 推理
安装
安装英特尔 GPU 驱动程序
要启用英特尔® GPU 加速,首先安装最新的显卡驱动程序:Windows 用户应从 英特尔 Arc & Iris Xe 显卡驱动程序页面下载驱动程序,并按照屏幕上的安装说明进行操作。Ubuntu 用户应参阅 英特尔 GPU 驱动程序安装指南,了解操作系统特定的设置步骤。
安装 PyTorch 和其他所需软件包
要安装 PyTorch 及其依赖项,请使用以下命令
# Install PyTorch + dependencies pip install torch torchao --index-url https://download.pytorch.org/whl/xpu pip install transformers accelerate
在 Windows 上启用 torch.compile
请参阅 如何在 Windows CPU/XPU 上使用 torch.compile,以在 Windows 上安装 MSVC 并激活环境。Linux 用户可以跳过此步骤。
运行 FP16 推理 (Eager Mode)
import torch from transformers import AutoModelForCausalLM, AutoTokenizer model_id = "microsoft/Phi-3-mini-4k-instruct" model = AutoModelForCausalLM.from_pretrained(model_id, device_map="xpu", torch_dtype=torch.float16) tokenizer = AutoTokenizer.from_pretrained(model_id) prompt = "Hey, are you conscious? Can you talk to me?" inputs = tokenizer( prompt, return_tensors="pt", ).to("xpu") generate_kwargs = dict(do_sample=True, temperature=0.9, num_beams=1, cache_implementation="static") generated_ids = model.generate(**inputs, max_new_tokens=128, **generate_kwargs) output_text = tokenizer.batch_decode( generated_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False ) print(output_text)
上述示例演示了通过简单地将设备设置为 XPU,在 PyTorch eager 模式下运行 LLM 推理。
使用 torch.compile 加速
import torch from transformers import AutoModelForCausalLM, AutoTokenizer model_id = "microsoft/Phi-3-mini-4k-instruct" model = AutoModelForCausalLM.from_pretrained(model_id, device_map="xpu", torch_dtype=torch.float16) model.forward = torch.compile(model.forward) tokenizer = AutoTokenizer.from_pretrained(model_id) prompt = "Hey, are you conscious? Can you talk to me?" inputs = tokenizer( prompt, return_tensors="pt", ).to("xpu") generate_kwargs = dict(do_sample=True, temperature=0.9, num_beams=1, cache_implementation="static") generated_ids = model.generate(**inputs, max_new_tokens=128, **generate_kwargs) output_text = tokenizer.batch_decode( generated_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False ) print(output_text)
使用 WOQ-INT4 加速推理
import torch from transformers import AutoModelForCausalLM, AutoTokenizer, TorchAoConfig from torchao.quantization.quant_api import Int4WeightOnlyConfig from torchao.dtypes import Int4XPULayout from torchao.quantization.quant_primitives import ZeroPointDomain model_id = "microsoft/Phi-3-mini-4k-instruct" # Create quantization configuration quantization_config = TorchAoConfig("int4_weight_only", group_size=128, layout=Int4XPULayout(), zero_point_domain=ZeroPointDomain.INT) # Load and automatically quantize model = AutoModelForCausalLM.from_pretrained(model_id, device_map="xpu", torch_dtype=torch.float16, quantization_config=quantization_config) # Use unwrap_tensor_subclass_parameters to reduce the subclass host overhead from torch._functorch._aot_autograd.subclass_parametrization import ( unwrap_tensor_subclass_parameters, ) unwrap_tensor_subclass_parameters(model) model.forward = torch.compile(model.forward) tokenizer = AutoTokenizer.from_pretrained(model_id) prompt = "Hey, are you conscious? Can you talk to me?" inputs = tokenizer( prompt, return_tensors="pt", ).to("xpu") generate_kwargs = dict(do_sample=True, temperature=0.9, num_beams=1, cache_implementation="static") model.generate(**inputs, max_new_tokens=128, **generate_kwargs) generated_ids = model.generate(**inputs, max_new_tokens=128, **generate_kwargs) output_text = tokenizer.batch_decode( generated_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False ) print(output_text)
为了进一步降低 token 生成延迟,仅权重 4 位量化 (WOQ-INT4) 在准确性和性能之间进行了战略性平衡。对于 Phi-3-mini 模型,WOQ-INT4 实现了超过 65% 模型压缩,同时提供了:
1) 在内存密集型阶段实现更快的解码,从而降低 token 延迟;
2) 在计算密集型阶段预填充效率与 FP16 匹配;
3) 对更大模型的可扩展性,使得之前在单个消费级 GPU 上无法以 FP16 精度运行的大型语言模型现在可以在单个英特尔® Arc™ B 系列 GPU 上流畅运行。这为消费级硬件带来了复杂 LLM 的实用、实时性能。
结论
PyTorch 2.8+TorchAO 实现了:
✅ 降低消费级 GPU 上的下一个 token 延迟
✅ 支持 单个英特尔® Arc GPU 上 10B+ 参数模型
✅ 通过 torch.compile 实现 Windows 原生加速
主要成就:
– 通过 WOQ-INT4 将显存使用量减少 65% 以上
– 解码速度比 FP16 快 1.5 倍以上
– 与 Hugging Face 无缝集成
致谢
特别感谢 PyTorch 维护者:Jerry Zhang、Nikita Shulga、Jason Ansel、Andrey Talman、Alban Desmaison 和 Bin Bao。
产品和性能信息
测试硬件:
– 英特尔® 酷睿™ Ultra 9 288V (Arc 140V, 16GB VRAM)
– 英特尔® 酷睿™ i5-13400 (Arc B580, 12GB VRAM)
软件: Windows 11 专业版, 英特尔® 显卡驱动程序 32.0.101.6972, PyTorch 2.8
工作负载: 在“microsoft/Phi-3-mini-4k-instruct”上测试性能,配置为 float16 与 torch.compile 优化与 + torch.compile 优化 + torchAO WOQ 优化。
英特尔于 2025 年 7 月 29 日测试。
了解更多:
– Windows 上 Torch.compile 教程
– TorchAO 量化指南
– Windows 上英特尔® GPU 驱动程序门户
注意事项和免责声明
性能因使用情况、配置和其他因素而异。性能结果基于截至所示日期的配置测试,可能无法反映所有公开可用的更新。任何产品或组件都无法做到绝对安全。您的成本和结果可能会有所不同。英特尔技术可能需要启用硬件、软件或服务激活。英特尔公司。英特尔、英特尔徽标和其他英特尔标志是英特尔公司或其子公司的商标。其他名称和品牌可能被声称为他人的财产。