評價此頁

在 Intel GPU 上入門#

建立日期:2024 年 6 月 14 日 | 最後更新日期:2025 年 9 月 1 日

硬體先決條件#

適用於 Intel 資料中心 GPU

裝置

Red Hat* Enterprise Linux* 9.2

SUSE Linux Enterprise Server* 15 SP5

Ubuntu* Server 22.04 (>= 5.15 LTS 核心)

Intel® 資料中心 GPU Max 系列(代號:Ponte Vecchio)

適用於 Intel 客戶端 GPU

支援的作業系統

已驗證的硬體

Windows 11 & Ubuntu 24.04/25.04




Intel® Arc A 系列顯示卡(代號:Alchemist)
Intel® Arc B 系列顯示卡(代號:Battlemage)
整合 Intel® Arc™ 顯示卡的 Intel® Core™ Ultra 處理器(代號:Meteor Lake-H)
整合 Intel® Arc™ 顯示卡的 Intel® Core™ Ultra 桌上型電腦處理器(第二代)(代號:Lunar Lake)
整合 Intel® Arc™ 顯示卡的 Intel® Core™ Ultra 移動處理器(第二代)(代號:Arrow Lake-H)

從 PyTorch* 2.5 版本開始,Intel GPU 對 Intel® 客戶端 GPU 和 Intel® 資料中心 GPU Max 系列在 Linux 和 Windows 上均提供支援(原型),將 Intel GPU 和 SYCL* 軟體棧整合到官方 PyTorch 棧中,提供一致的使用者體驗,以適應更多 AI 應用場景。

軟體先決條件#

要在 Intel GPU 上使用 PyTorch,您需要先安裝 Intel GPU 驅動程式。安裝指南請訪問 Intel GPU 驅動程式安裝

如果您是從二進位制檔案安裝,請跳過 Intel® Deep Learning Essentials 安裝部分。如果您是從原始碼構建,請參閱 Intel GPU 的 PyTorch 安裝先決條件,其中包含 Intel GPU 驅動程式和 Intel® Deep Learning Essentials 的安裝說明。

安裝#

二進位制檔案#

在安裝了 Intel GPU 驅動程式 後,使用以下命令安裝 pytorchtorchvisiontorchaudio

適用於釋出版 wheel

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/xpu

適用於 nightly wheel

pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/xpu

從原始碼構建#

在安裝了 Intel GPU 驅動程式和 Intel® Deep Learning Essentials 後。按照指南從原始碼構建 pytorchtorchvisiontorchaudio

從原始碼構建 torch,請參閱 PyTorch 安裝:從原始碼構建

從原始碼構建 torchvision,請參閱 Torchvision 安裝:從原始碼構建

從原始碼構建 torchaudio,請參閱 Torchaudio 安裝:從原始碼構建

檢查 Intel GPU 的可用性#

要檢查您的 Intel GPU 是否可用,通常可以使用以下程式碼

import torch
print(torch.xpu.is_available())  # torch.xpu is the API for Intel GPU support

如果輸出為 False,請仔細檢查 Intel GPU 的驅動程式安裝。

最小程式碼更改#

如果您正在遷移從 cuda 編寫的程式碼,則需要將 cuda 的引用更改為 xpu。例如:

# CUDA CODE
tensor = torch.tensor([1.0, 2.0]).to("cuda")

# CODE for Intel GPU
tensor = torch.tensor([1.0, 2.0]).to("xpu")

以下幾點概述了 PyTorch 與 Intel GPU 的支援和限制:

  1. 支援訓練和推理工作流。

  2. 支援 eager 模式和 torch.compile。從 PyTorch* 2.7 版本開始,Windows 上的 torch.compile 功能也支援 Intel GPU,請參閱 如何在 Windows CPU/XPU 上使用 torch.compile

  3. 支援 FP32、BF16、FP16 等資料型別以及自動混合精度 (AMP)。

示例#

本節包含推理和訓練工作流的用法示例。

推理示例#

以下是一些推理工作流的示例。

FP32 推理#

import torch
import torchvision.models as models

model = models.resnet50(weights="ResNet50_Weights.DEFAULT")
model.eval()
data = torch.rand(1, 3, 224, 224)

model = model.to("xpu")
data = data.to("xpu")

with torch.no_grad():
    model(data)

print("Execution finished")

AMP 推理#

import torch
import torchvision.models as models

model = models.resnet50(weights="ResNet50_Weights.DEFAULT")
model.eval()
data = torch.rand(1, 3, 224, 224)

model = model.to("xpu")
data = data.to("xpu")

with torch.no_grad():
    d = torch.rand(1, 3, 224, 224)
    d = d.to("xpu")
    # set dtype=torch.bfloat16 for BF16
    with torch.autocast(device_type="xpu", dtype=torch.float16, enabled=True):
        model(data)

print("Execution finished")

使用 torch.compile 進行推理#

import torch
import torchvision.models as models
import time

model = models.resnet50(weights="ResNet50_Weights.DEFAULT")
model.eval()
data = torch.rand(1, 3, 224, 224)
ITERS = 10

model = model.to("xpu")
data = data.to("xpu")

for i in range(ITERS):
    start = time.time()
    with torch.no_grad():
        model(data)
        torch.xpu.synchronize()
    end = time.time()
    print(f"Inference time before torch.compile for iteration {i}: {(end-start)*1000} ms")

model = torch.compile(model)
for i in range(ITERS):
    start = time.time()
    with torch.no_grad():
        model(data)
        torch.xpu.synchronize()
    end = time.time()
    print(f"Inference time after torch.compile for iteration {i}: {(end-start)*1000} ms")

print("Execution finished")

訓練示例#

以下是一些訓練工作流的示例。

FP32 訓練#

import torch
import torchvision

LR = 0.001
DOWNLOAD = True
DATA = "datasets/cifar10/"

transform = torchvision.transforms.Compose(
    [
        torchvision.transforms.Resize((224, 224)),
        torchvision.transforms.ToTensor(),
        torchvision.transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
    ]
)
train_dataset = torchvision.datasets.CIFAR10(
    root=DATA,
    train=True,
    transform=transform,
    download=DOWNLOAD,
)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=128)
train_len = len(train_loader)

model = torchvision.models.resnet50()
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=LR, momentum=0.9)
model.train()
model = model.to("xpu")
criterion = criterion.to("xpu")

print(f"Initiating training")
for batch_idx, (data, target) in enumerate(train_loader):
    data = data.to("xpu")
    target = target.to("xpu")
    optimizer.zero_grad()
    output = model(data)
    loss = criterion(output, target)
    loss.backward()
    optimizer.step()
    if (batch_idx + 1) % 10 == 0:
         iteration_loss = loss.item()
         print(f"Iteration [{batch_idx+1}/{train_len}], Loss: {iteration_loss:.4f}")
torch.save(
    {
        "model_state_dict": model.state_dict(),
        "optimizer_state_dict": optimizer.state_dict(),
    },
    "checkpoint.pth",
)

print("Execution finished")

AMP 訓練#

注意:使用 GradScaler 進行訓練需要硬體支援 FP64。Intel® Arc™ A 系列顯示卡不原生支援 FP64。如果您在 Intel® Arc™ A 系列顯示卡上執行工作負載,請停用 GradScaler

import torch
import torchvision

LR = 0.001
DOWNLOAD = True
DATA = "datasets/cifar10/"

use_amp=True

transform = torchvision.transforms.Compose(
    [
        torchvision.transforms.Resize((224, 224)),
        torchvision.transforms.ToTensor(),
        torchvision.transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
    ]
)
train_dataset = torchvision.datasets.CIFAR10(
    root=DATA,
    train=True,
    transform=transform,
    download=DOWNLOAD,
)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=128)
train_len = len(train_loader)

model = torchvision.models.resnet50()
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=LR, momentum=0.9)
scaler = torch.amp.GradScaler(device="xpu", enabled=use_amp)

model.train()
model = model.to("xpu")
criterion = criterion.to("xpu")

print(f"Initiating training")
for batch_idx, (data, target) in enumerate(train_loader):
    data = data.to("xpu")
    target = target.to("xpu")
    # set dtype=torch.bfloat16 for BF16
    with torch.autocast(device_type="xpu", dtype=torch.float16, enabled=use_amp):
        output = model(data)
        loss = criterion(output, target)
    scaler.scale(loss).backward()
    scaler.step(optimizer)
    scaler.update()
    optimizer.zero_grad()
    if (batch_idx + 1) % 10 == 0:
         iteration_loss = loss.item()
         print(f"Iteration [{batch_idx+1}/{train_len}], Loss: {iteration_loss:.4f}")

torch.save(
    {
        "model_state_dict": model.state_dict(),
        "optimizer_state_dict": optimizer.state_dict(),
    },
    "checkpoint.pth",
)

print("Execution finished")

使用 torch.compile 進行訓練#

import torch
import torchvision

LR = 0.001
DOWNLOAD = True
DATA = "datasets/cifar10/"

transform = torchvision.transforms.Compose(
    [
        torchvision.transforms.Resize((224, 224)),
        torchvision.transforms.ToTensor(),
        torchvision.transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
    ]
)
train_dataset = torchvision.datasets.CIFAR10(
    root=DATA,
    train=True,
    transform=transform,
    download=DOWNLOAD,
)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=128)
train_len = len(train_loader)

model = torchvision.models.resnet50()
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=LR, momentum=0.9)
model.train()
model = model.to("xpu")
criterion = criterion.to("xpu")
model = torch.compile(model)

print(f"Initiating training with torch compile")
for batch_idx, (data, target) in enumerate(train_loader):
    data = data.to("xpu")
    target = target.to("xpu")
    optimizer.zero_grad()
    output = model(data)
    loss = criterion(output, target)
    loss.backward()
    optimizer.step()
    if (batch_idx + 1) % 10 == 0:
         iteration_loss = loss.item()
         print(f"Iteration [{batch_idx+1}/{train_len}], Loss: {iteration_loss:.4f}")
torch.save(
    {
        "model_state_dict": model.state_dict(),
        "optimizer_state_dict": optimizer.state_dict(),
    },
    "checkpoint.pth",
)

print("Execution finished")