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-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 ..
检查英特尔 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 的支持和限制
支持训练和推理工作流。
支持急切模式和
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")