Examples ======== 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](#python) examples demonstrate usage of Python APIs: - [Training](#training) - [Inference](#inference) - [C++](#c) examples demonstrate usage of C++ APIs - [Intel® AI Reference Models](#intel-ai-reference-models) provide out-of-the-box use cases, demonstrating the performance benefits achievable with Intel Extension for PyTorch\* ## 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 [//]: # (marker_train_single_fp32_complete) ```python 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") ``` [//]: # (marker_train_single_fp32_complete) ##### BFloat16 [//]: # (marker_train_single_bf16_complete) ```python 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") ``` [//]: # (marker_train_single_bf16_complete) ### 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 [//]: # (marker_inf_rn50_imp_fp32) ```python 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") ``` [//]: # (marker_inf_rn50_imp_fp32) ###### BERT [//]: # (marker_inf_bert_imp_fp32) ```python 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") ``` [//]: # (marker_inf_bert_imp_fp32) ##### Imperative Mode ###### Resnet50 [//]: # (marker_inf_rn50_imp_bf16) ```python 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") ``` [//]: # (marker_inf_rn50_imp_bf16) ###### BERT [//]: # (marker_inf_bert_imp_bf16) ```python 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") ``` [//]: # (marker_inf_bert_imp_bf16) ##### Imperative Mode ###### Resnet50 [//]: # (marker_inf_rn50_imp_fp16) ```python 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") ``` [//]: # (marker_inf_rn50_imp_fp16) ###### BERT [//]: # (marker_inf_bert_imp_fp16) ```python 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") ``` [//]: # (marker_inf_bert_imp_fp16) #### 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. [//]: # (marker_inf_rn50_imp_fp32_alt) ```python 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") ``` [//]: # (marker_inf_rn50_imp_fp32_alt) ### 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** [//]: # (marker_cppsdk_sample_usm) [//]: # (marker_cppsdk_sample_usm) **CMakeLists.txt** [//]: # (marker_cppsdk_cmake_usm) [//]: # (marker_cppsdk_cmake_usm) ### 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](./features/DPC++_Extension.md) for details.