• 文档 >
  • Pytorch 2.4:英特尔 GPU 入门
快捷方式

Pytorch 2.4:英特尔 GPU 入门

对英特尔 GPU 的支持与 PyTorch v2.4 一起发布。

此版本仅支持从源代码构建英特尔 GPU。

硬件先决条件

支持的硬件

英特尔® 数据中心 GPU Max 系列

支持的操作系统

Linux

适用于英特尔 GPU 的 PyTorch 与英特尔® 数据中心 GPU Max 系列兼容,并且仅支持 2.4 版的 Linux 操作系统。

软件先决条件

作为先决条件,请按照适用于英特尔 GPU 的 PyTorch 安装先决条件安装驱动程序和所需的软件包。

设置环境

在开始之前,您需要设置环境。这可以通过获取 intel-for-pytorch-gpu-devintel-pti-dev 软件包提供的 setvars.sh 脚本的源代码来完成。

source ${ONEAPI_ROOT}/setvars.sh

注意

ONEAPI_ROOT 是您安装 intel-for-pytorch-gpu-devintel-pti-dev 软件包的文件夹。通常,它位于 /opt/intel/oneapi/~/intel/oneapi/

从源代码构建

现在我们已经安装了所有必需的软件包并激活了环境。使用以下命令通过从源代码构建来安装 pytorchtorchvisiontorchaudio。有关更多详细信息,请参阅从源代码构建 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 ..

检查英特尔 GPU 的可用性

注意

在运行代码之前,请确保按照环境设置正确设置了环境。

要检查您的英特尔 GPU 是否可用,您通常会使用以下代码

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

如果输出为 False,请确保您的系统中装有英特尔 GPU,并正确按照适用于英特尔 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")

以下几点概述了英特尔 GPU 对 PyTorch 的支持和限制

  1. 支持训练和推理工作流。

  2. 支持急切模式和 torch.compile

  3. 支持 FP32、BF16、FP16 和自动混合精度 (AMP) 等数据类型。

  4. 依赖第三方组件的模型在 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")

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取针对初学者和高级开发人员的深入教程

查看教程

资源

查找开发资源并获得问题的解答

查看资源