Pytorch 2.4:於 Intel GPU 上開始使用¶
對 Intel GPU 的支援與 PyTorch v2.4 同時發布。
此版本僅支援從來源建置以用於 Intel GPU。
硬體先決條件¶
| 支援的硬體 | Intel® 資料中心 GPU Max 系列 | 
|---|---|
| 支援的作業系統 | Linux | 
適用於 Intel GPU 的 PyTorch 與 Intel® 資料中心 GPU Max 系列相容,並且僅支援 2.4 版的 Linux 作業系統。
軟體先決條件¶
作為先決條件,請按照 Intel GPU 的 PyTorch 安裝先決條件 安裝驅動程式和所需的套件。
設定環境¶
在您開始之前,您需要設定環境。這可以透過來源 intel-for-pytorch-gpu-dev 和 intel-pti-dev 套件提供的 setvars.sh 腳本來完成。
source ${ONEAPI_ROOT}/setvars.sh
注意
ONEAPI_ROOT 是您安裝 intel-for-pytorch-gpu-dev 和 intel-pti-dev 套件的資料夾。通常,它位於 /opt/intel/oneapi/ 或 ~/intel/oneapi/。
從來源建置¶
現在我們已經安裝了所有需要的套件並啟動了環境。使用以下指令從來源建置來安裝 pytorch、torchvision、torchaudio。如需更多詳細資訊,請參閱 從來源建置 PyTorch、從來源建置 Vision 和 從來源建置 Audio 中的官方指南。
# Get PyTorch Source Code
git clone --recursive https://github.com/pytorch/pytorch
cd pytorch
git checkout main # or checkout the specific release version >= v2.4
git submodule sync
git submodule update --init --recursive
# Get required packages for compilation
conda install cmake ninja
pip install -r requirements.txt
# Pytorch for Intel GPUs only support Linux platform for now.
# Install the required packages for pytorch compilation.
conda install intel::mkl-static intel::mkl-include
# (optional) If using torch.compile with inductor/triton, install the matching version of triton
# Run from the pytorch directory after cloning
# For Intel GPU support, please explicitly `export USE_XPU=1` before running command.
USE_XPU=1 make triton
# If you would like to compile PyTorch with new C++ ABI enabled, then first run this command:
export _GLIBCXX_USE_CXX11_ABI=1
# pytorch build from source
export CMAKE_PREFIX_PATH=${CONDA_PREFIX:-"$(dirname $(which conda))/../"}
python setup.py develop
cd ..
# (optional) If using torchvison.
# Get torchvision Code
git clone https://github.com/pytorch/vision.git
cd vision
git checkout main # or specific version
python setup.py develop
cd ..
# (optional) If using torchaudio.
# Get torchaudio Code
git clone https://github.com/pytorch/audio.git
cd audio
pip install -r requirements.txt
git checkout main # or specific version
git submodule sync
git submodule update --init --recursive
python setup.py develop
cd ..
檢查 Intel GPU 的可用性¶
注意
在執行程式碼之前,請按照 環境設定 確保環境已正確設定。
若要檢查您的 Intel GPU 是否可用,您通常會使用以下程式碼
import torch
torch.xpu.is_available()  # torch.xpu is the API for Intel GPU support
如果輸出為 False,請確保您的系統中有 Intel GPU,並正確按照 Intel GPU 的 PyTorch 安裝先決條件 進行操作。然後,檢查 PyTorch 編譯是否已正確完成。
最少程式碼變更¶
如果您要從 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")
以下幾點概述了 Intel GPU 的 PyTorch 支援和限制
- 支援訓練和推論工作流程。 
- 支援 Eager 模式和 - torch.compile。
- 支援 FP32、BF16、FP16 和自動混合精度 (AMP) 等資料類型。 
- 依賴第三方元件的模型將不支援,直到 PyTorch v2.5 或更高版本。 
範例¶
本節包含推論和訓練工作流程的使用範例。
推論範例¶
以下是一些推論工作流程範例。
使用 FP32 進行推論¶
import torch
import torchvision.models as models
model = models.resnet50(weights="ResNet50_Weights.DEFAULT")
model.eval()
data = torch.rand(1, 3, 224, 224)
######## code changes #######
model = model.to("xpu")
data = data.to("xpu")
######## code changes #######
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)
#################### code changes #################
model = model.to("xpu")
data = data.to("xpu")
#################### code changes #################
with torch.no_grad():
    d = torch.rand(1, 3, 224, 224)
    ############################# code changes #####################
    d = d.to("xpu")
    # set dtype=torch.bfloat16 for BF16
    with torch.autocast(device_type="xpu", dtype=torch.float16, enabled=True):
    ############################# code changes #####################
        model(data)
print("Execution finished")
使用 torch.compile 進行推論¶
import torch
import torchvision.models as models
model = models.resnet50(weights="ResNet50_Weights.DEFAULT")
model.eval()
data = torch.rand(1, 3, 224, 224)
ITERS = 10
######## code changes #######
model = model.to("xpu")
data = data.to("xpu")
######## code changes #######
model = torch.compile(model)
for i in range(ITERS):
    with torch.no_grad():
        model(data)
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)
model = torchvision.models.resnet50()
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=LR, momentum=0.9)
model.train()
######################## code changes #######################
model = model.to("xpu")
criterion = criterion.to("xpu")
######################## code changes #######################
for batch_idx, (data, target) in enumerate(train_loader):
    ########## code changes ##########
    data = data.to("xpu")
    target = target.to("xpu")
    ########## code changes ##########
    optimizer.zero_grad()
    output = model(data)
    loss = criterion(output, target)
    loss.backward()
    optimizer.step()
    print(batch_idx)
torch.save(
    {
        "model_state_dict": model.state_dict(),
        "optimizer_state_dict": optimizer.state_dict(),
    },
    "checkpoint.pth",
)
print("Execution finished")
使用 AMP 進行訓練¶
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)
model = torchvision.models.resnet50()
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=LR, momentum=0.9)
scaler = torch.amp.GradScaler(enabled=use_amp)
model.train()
######################## code changes #######################
model = model.to("xpu")
criterion = criterion.to("xpu")
######################## code changes #######################
for batch_idx, (data, target) in enumerate(train_loader):
    ########## code changes ##########
    data = data.to("xpu")
    target = target.to("xpu")
    ########## code changes ##########
    # 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()
    print(batch_idx)
torch.save(
    {
        "model_state_dict": model.state_dict(),
        "optimizer_state_dict": optimizer.state_dict(),
    },
    "checkpoint.pth",
)
print("Execution finished")