Examples — Intel&#174 Extension for PyTorch* 2.8.10+xpu documentation (original) (raw)

These examples will help you get started using Intel® Extension for PyTorch* with Intel GPUs.

Prerequisites: Before running these examples, install the torchvision and transformers Python packages.

Python

Training

Single-Instance Training

To use Intel® Extension for PyTorch* on training, you need to make the following changes in your code:

  1. Import intel_extension_for_pytorch as ipex.
  2. Use the ipex.optimize function for additional performance boost, which applies optimizations against the model object, as well as an optimizer object.
  3. Use Auto Mixed Precision (AMP) with BFloat16 data type.
  4. Convert input tensors, loss criterion and model to XPU, as shown below:

... import torch import intel_extension_for_pytorch as ipex ... model = Model() criterion = ... optimizer = ... model.train()

Move model and loss criterion to xpu before calling ipex.optimize()

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

For Float32

model, optimizer = ipex.optimize(model, optimizer=optimizer)

For BFloat16

model, optimizer = ipex.optimize(model, optimizer=optimizer, dtype=torch.bfloat16) ... dataloader = ... for (input, target) in dataloader: input = input.to("xpu") target = target.to("xpu") optimizer.zero_grad() # For Float32 output = model(input)

# For BFloat16
with torch.xpu.amp.autocast(enabled=True, dtype=torch.bfloat16):
    output = model(input)

loss = criterion(output, target)
loss.backward()
optimizer.step()

...

Below you can find complete code examples demonstrating how to use the extension on training for different data types:

Float32

import torch import torchvision

############# code changes ############### import intel_extension_for_pytorch as ipex

############# code changes ###############

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") model, optimizer = ipex.optimize(model, optimizer=optimizer) ######################## 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")

BFloat16

import torch import torchvision

############# code changes ############### import intel_extension_for_pytorch as ipex

############# code changes ###############

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") model, optimizer = ipex.optimize(model, optimizer=optimizer, dtype=torch.bfloat16) ##################################### code changes ################################

for batch_idx, (data, target) in enumerate(train_loader): optimizer.zero_grad() ######################### code changes ######################### data = data.to("xpu") target = target.to("xpu") with torch.xpu.amp.autocast(enabled=True, dtype=torch.bfloat16): ######################### code changes ######################### 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")

Inference

Get additional performance boosts for your computer vision and NLP workloads by applying the Intel® Extension for PyTorch* optimize function against your model object.

Float32

Imperative Mode
Resnet50

import torch import torchvision.models as models

############# code changes ############### import intel_extension_for_pytorch as ipex

############# code changes ###############

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") model = ipex.optimize(model) ######## code changes #######

with torch.no_grad(): model(data)

print("Execution finished")

BERT

import torch from transformers import BertModel

############# code changes ############### import intel_extension_for_pytorch as ipex

############# code changes ###############

model = BertModel.from_pretrained("bert-base-uncased") model.eval()

vocab_size = model.config.vocab_size batch_size = 1 seq_length = 512 data = torch.randint(vocab_size, size=[batch_size, seq_length])

######## code changes ####### model = model.to("xpu") data = data.to("xpu") model = ipex.optimize(model) ######## code changes #######

with torch.no_grad(): model(data)

print("Execution finished")

Imperative Mode
Resnet50

import torch import torchvision.models as models

############# code changes ############### import intel_extension_for_pytorch as ipex

############# code changes ###############

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") model = ipex.optimize(model, dtype=torch.bfloat16) #################### code changes #################

with torch.no_grad(): ############################# code changes ##################### with torch.xpu.amp.autocast(enabled=True, dtype=torch.bfloat16): ############################ code changes ###################### model(data)

print("Execution finished")

BERT

import torch from transformers import BertModel

############# code changes ############### import intel_extension_for_pytorch as ipex

############# code changes ###############

model = BertModel.from_pretrained("bert-base-uncased") model.eval()

vocab_size = model.config.vocab_size batch_size = 1 seq_length = 512 data = torch.randint(vocab_size, size=[batch_size, seq_length])

#################### code changes ################# model = model.to("xpu") data = data.to("xpu") model = ipex.optimize(model, dtype=torch.bfloat16) #################### code changes #################

with torch.no_grad(): ########################### code changes ######################## with torch.xpu.amp.autocast(enabled=True, dtype=torch.bfloat16): ########################### code changes ######################## model(data)

print("Execution finished")

Imperative Mode
Resnet50

import torch import torchvision.models as models

############# code changes ############### import intel_extension_for_pytorch as ipex

############# code changes ###############

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") model = ipex.optimize(model, dtype=torch.float16) #################### code changes ################

with torch.no_grad(): ############################# code changes ##################### with torch.xpu.amp.autocast(enabled=True, dtype=torch.float16): ############################# code changes ##################### model(data)

print("Execution finished")

BERT

import torch from transformers import BertModel

############# code changes ############### import intel_extension_for_pytorch as ipex

############# code changes ###############

model = BertModel.from_pretrained("bert-base-uncased") model.eval()

vocab_size = model.config.vocab_size batch_size = 1 seq_length = 512 data = torch.randint(vocab_size, size=[batch_size, seq_length])

#################### code changes ################ model = model.to("xpu") data = data.to("xpu") model = ipex.optimize(model, dtype=torch.float16) #################### code changes ################

with torch.no_grad(): ############################# code changes ##################### with torch.xpu.amp.autocast(enabled=True, dtype=torch.float16): ############################# code changes ##################### model(data)

print("Execution finished")

torch.xpu.optimize

The torch.xpu.optimize function is an alternative to ipex.optimize in Intel® Extension for PyTorch*, and provides identical usage for XPU devices only. The motivation for adding this alias is to unify the coding style in user scripts base on torch.xpu modular. Refer to the example below for usage.

import torch import torchvision.models as models

############# code changes ######### import intel_extension_for_pytorch

############# code changes #########

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

model = model.to(memory_format=torch.channels_last) data = data.to(memory_format=torch.channels_last)

########## code changes ######### model = model.to("xpu") data = data.to("xpu") model = torch.xpu.optimize(model) ########## code changes #########

with torch.no_grad(): model(data)

print("Execution finished")

Use SYCL code

Using SYCL code in an C++ application is also possible. The example below shows how to invoke SYCL codes. You need to explicitly pass -fsycl into CMAKE_CXX_FLAGS.

example-usm.cpp

CMakeLists.txt

Customize DPC++ kernels

Intel® Extension for PyTorch* provides its C++ dynamic library to allow users to implement custom DPC++ kernels to run on the XPU device. Refer to the DPC++ extension for details.