开发者实战 | 在英特尔独立显卡上训练ResNet PyTorch模型

原创
01/30 17:00
阅读数 2.3K

文章作者:武卓,张晶


在英特尔独立显卡上训练TensorFlow模型》介绍了在英特尔独立显卡上训练 TensorFlow 模型的全流程;本文将基于蝰蛇峡谷(Serpent Canyon) 详细介绍如何在英特尔独立显卡上训练 ResNet PyTorch 模型的全流程


英特尔® 锐炫™ 独立显卡简介


英特尔® 锐炫™ 显卡基于 Xe-HPG 微架构,Xe HPG GPU  中的每个 Xe 内核都配置了一组 256 位矢量引擎,旨在加速传统图形和计算工作负载,以及新的 1024 位矩阵引擎或 Xe 矩阵扩展,旨在加速人工智能工作负载



蝰蛇峡谷简介


蝰蛇峡谷(Serpent Canyon) 是一款性能强劲,并且体积小巧的高性能迷你主机,搭载全新一代混合架构的第 12 代智能英特尔® 酷睿 处理器,并且内置了英特尔® 锐炫 A770M 独立显卡




搭建训练 PyTorch 模型的开发环境


Windows 版本要求


在 Windows 上基于英特尔® 独立显卡训练 PyTorch 模型所依赖的软件包 torch-directml 要求:

  • Windows 10 的版本≥1709

  • Windows 11 的版本≥21H2

用“Windows logo 键+ R键”启动“运行”窗口,然后输入命令“winver”可以查得 Windows 版本。



下载并安装最新的英特尔显卡驱动


到英特尔官网下载并安装最新的英特尔显卡驱动。驱动下载链接:

https://www.intel.cn/content/www/cn/zh/download/726609/intel-arc-iris-xe-graphics-whql-windows.html


下载并安装Anaconda


下载并安装 Python 虚拟环境和软件包管理工具Anaconda:

https://www.anaconda.com/


安装完毕后,用下面的命令创建并激活虚拟环境pt_a770:

conda create --name pt_a770 python=3.9conda activate pt_a770

向右滑动查看完整代码

安装 PyTorch


在虚拟环境 pt_a770 中安装 PyTorch 1.13 。需要注意的是:torch-directml 软件包当前只支持 PyTorch 1.13。

pip install torch==1.13.0 torchvision==0.14.0 torchaudio==0.13.0

向右滑动查看完整代码

安装 torch-directml


在虚拟环境 pt_a770 中安装 torch-directml,这是一个在 Windows 平台上的机器学习训练加速软件包。

pip install torch-directml

向右滑动查看完整代码

安装其它支持软件包


在虚拟环境 pt_a770 中安装 opencv-python, numpy, pandas, tensorboard, matplotlib, tqdm, pyyaml, wget 和scipy,这些是辅助训练模型的软件包。

pip install opencv-python numpy pandas tensorboard matplotlib tqdm pyyaml wget scipy

向右滑动查看完整代码

到此,在 Windows 平台上用英特尔独立显卡训练 PyTorch 模型的开发环境配置完毕


在英特尔独立显卡上训练 

PyTorch ResNet50 模型


请下载 pt_training_on_A770.py 并运行:

https://gitee.com/ppov-nuc/training_on_intel_GPU/blob/main/pt_training_on_A770.py


该范例代码使用了 PyTorch 自带的 StanfordCars 数据集和 resnet50 预训练模型。

import torchimport torch_directmlimport torch.nn as nnimport torch.optim as optimimport torch.nn.functional as Ffrom torch.utils.data import DataLoaderfrom torchvision import datasets, models, transformsimport time# Set device & Hyperparametersdevice = torch_directml.device()num_classes = 196   # The Cars dataset contains 16,185 images of 196 classes of carslearning_rate = 1e-3batch_size = 32# Step1: Load Flower102 dataset# https://pytorch.org/vision/stable/generated/torchvision.datasets.StanfordCars.htmldata_transforms = {    'train':    transforms.Compose([        transforms.Resize((224,224)),        transforms.RandomAffine(0, shear=10, scale=(0.8,1.2)),        transforms.RandomHorizontalFlip(),        transforms.ToTensor(),        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])    ]),    'test':    transforms.Compose([        transforms.Resize((224,224)),        transforms.ToTensor(),        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])    ]),}train_dataset = datasets.StanfordCars(root="dataset/", split="train", transform=data_transforms["train"], download=True)train_dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)test_dataset = datasets.StanfordCars(root="dataset/", split='test', transform=data_transforms["test"], download=True)test_dataloader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)# Step2: Load Pretrained ResNet50 and add FC layermodel = models.resnet50(weights='DEFAULT').to(device)    for param in model.parameters():    param.requires_grad = False   model.fc = nn.Sequential(               nn.Linear(2048, 256),               nn.ReLU(inplace=True),               nn.Linear(256, num_classes)).to(device)model.train()# Step4: define Loss and optimizerloss_fn = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=learning_rate)# Step5: Train Networkfor epoch in range(3):    losses=[]    for batch_idx, (data, targets) in enumerate(train_dataloader):        start_time = time.time()        data = data.to(device)        targets = targets.to(device)        # forward        preds = model(data)        loss = loss_fn(preds, targets)        losses.append(loss)        # backward        optimizer.zero_grad()        loss.backward()        # GSD        optimizer.step()        time_elapsed = time.time() - start_time        print(f"Step:{batch_idx}, elapsed time: {time_elapsed*1000:0.2f}ms; loss is {sum(losses)/len(losses)}.")

向右滑动查看完整代码

运行结果,如下图所示:



总结


英特尔独立显卡不仅支持 TensorFlow 模型,也支持 PyTorch 模型训练。更多训练范例请参考:

https://github.com/microsoft/DirectML

-END--



             
             
             
你也许想了解(点击蓝字查看)⬇️
➡️ “开源项目贡献”经验分享 | 百度黑客松大赛获奖者梁嘉铭
➡️  “开源项目贡献”经验分享 | 百度黑客松大赛获奖者邰秀瑢
➡️  如何给开源项目做贡献? | 开发者节日福利
➡️   几行代码轻松实现对于PaddleOCR的实时推理,快来get!
➡️   使用OpenVINO 在“端—边—云”快速实现高性能人工智能推理
➡️  图片提取文字很神奇?试试三步实现OCR!
➡️ 【Notebook系列第六期】基于Pytorch预训练模型,实现语义分割任务
➡️ 使用OpenVINO™ 预处理API进一步提升YOLOv5推理性能

👇欢迎在留言区与我们互动哦,
点击小程序 留言区 即可参与

留言区

            
            
            


扫描下方二维码立即体验 

OpenVINO™ 工具套件 2022.3





点击 阅读原文 立即体验OpenVINO 2022.3
文章这么精彩,你有没有“在看”

本文分享自微信公众号 - OpenVINO 中文社区(openvinodev)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部