作者:罗宏裕,张晶
英特尔独立显卡技术指导:唐文凯
本文将介绍在英特尔独立显卡上训练AI智能收银机分类模型的全流程,在下一篇中将介绍基于OpenVINOTM在AIxBoard上部署训练好的模型,快速实现AI智能收银机解决方案基于英特尔平台从模型训练到部署的端到端的关键技术验证。
在阅读本文前,请先在Ubuntu22.04上安装英特尔锐炫™独立显卡驱动程序。
1.1 什么是AI智能收银机
“看”一眼就能结账的AI智能收银机极大提升了零售店智能化水平和结算效率,推动无人结算零售店时代的到来。以食堂应用场景为例,就餐者自助取餐选菜后,直接将餐盘放在智能结算台上,AI可以自动识别菜品的种类以及对应价格,然后自动计算出整餐金额,整个过程不到一秒钟。
本文将以AI食物图片分类为例,详细介绍在英特尔锐炫™独立显卡上训练PyTorch版ResNet50模型的整个过程。
1.2 英特尔锐炫™独立显卡简介
英特尔锐炫™ 显卡基于Xe-HPG 微架构,Xe HPG GPU 中的每个 Xe 内核都配置了一组 256 位矢量引擎,旨在加速传统图形和计算工作负载,以及新的 1024 位矩阵引擎或 Xe 矩阵扩展,旨在加速人工智能工作负载。
1.3 搭建基于英特尔锐炫™独立显卡训练PyTorch模型的开发环境
1.3.1 环境要求:
在Ubuntu22.04上基于英特尔独立显卡训练PyTorch模型,需要依次安装:
- 英特尔独立显卡的驱动程序
- Intel® oneAPI Base Toolkit 2023.0
- torch 1.10a0和torchvision 0.14.1a0
- intel-extension-for-pytorch
1.3.2 安装英特尔独立显卡的驱动程序
请参考《在Ubuntu22.04上安装英特尔锐炫™独立显卡驱动程序》完成英特尔独立显卡的驱动安装。安装成功后,可以在About窗口Graphics一栏看到英特尔独立显卡的型号。
1.3.3 下载并安装Intel® oneAPI Base Toolkit
第一步,通过下面的命令下载Intel® oneAPI Base Toolkit并启动安装程序:
wget https://registrationcenter-download.intel.com/akdlm/irc_nas/19079/l_BaseKit_p_2023.0.0.25537.sh
sudo sh ./l_BaseKit_p_2023.0.0.25537.sh
第二步,保持默认选项,完成Intel® oneAPI Base Toolkit安装
1.3.4 安装intel-extension-for-pytorch
使用命令安装torch、torchvision和intel-extension-for-pytorch:
python -m pip install torch==1.13.0a0 torchvision==0.14.1a0 intel_extension_for_pytorch==1.13.10+xpu -f https://developer.intel.com/ipex-whl-stable-xpu
1.3.5 安装xpu-smi(可选)
英特尔® XPU 管理器是一个免费的开源工具,类似nvidia-smi,用于监测英特尔独立显卡的运行信息(例如,温度、功耗、频率、显存容量等),也可以用于诊断独立显卡的问题。
进入https://github.com/intel/xpumanager/releases网站,下载相应的安装包
然后,通过下面的命令进行安装
sudo apt install ./xpu-smi_1.2.5_20230313.033847.f458af77.u22.04_amd64.deb
xpu-smi的使用示例如下所示:
xpu-smi dump -d 0 -m 0,1,2,3,4,5,6
到此,在Ubuntu平台上用英特尔独立显卡训练PyTorch模型的开发环境配置完毕。
1.4 在英特尔独立显卡上训练PyTorch食物分类模型
第一步,请通过以下命令激活oneAPI环境:
source /opt/intel/oneapi/setvars.sh
第二步,请通过以下命令激活DPC++ 编译器和 oneMKL 环境:
source /opt/intel/oneapi/compiler/latest/env/vars.sh
source /opt/intel/oneapi/mkl/latest/env/vars.sh
第三步,请下载training_on_Intel_dGPU_bf16_ipex.py并运行,该范例代码使用了PyTorch自带的Food101数据集和resnet50预训练模型参数。
下载地址:training_on_Intel_dGPU_bf16_ipex.py · PPOV_NUC/training_on_intel_GPU - Gitee.com
核心代码片段:
model = torchvision.models.resnet50(weights='IMAGENET1K_V2',num_classes=101)
model = model.to('xpu')
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr = LR, momentum=0.9)
model.train()
model, optimizer = ipex.optimize(model, optimizer=optimizer, dtype=torch.bfloat16)
# 训练循环
for epoch in range(epochs):
tloss,vloss = 0.0, 0.0
top1,top5 = 0.0, 0.0
pbar = tqdm(enumerate(train_loader),total=len(train_loader), bar_format=TQDM_BAR_FORMAT)
for i, (data, target) in pbar:
model.train()
data = data.to('xpu')
target = target.to('xpu')
with torch.xpu.amp.autocast():
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
optimizer.zero_grad()
tloss = (tloss*i + loss.item()) / (i+1)
if i == len(pbar) - 1:
pred,targets,vloss = [], [], 0
n = len(val_loader)
# 评估训练精度
model.eval()
with torch.xpu.amp.autocast():
for d, (images, labels) in enumerate(val_loader):
images = images.to('xpu')
labels = labels.to('xpu')
y = model(images)
pred.append(y.argsort(1, descending=True)[:, :5])
targets.append(labels)
vloss += criterion(y, labels).item()
运行结果,如下图所示:
1.5 总结:
本文详细介绍了在Ubuntu22.04下使用英特尔独立显卡进行PyTorch模型训练,此外,基于单卡英特尔A750和Ubuntu22.04的环境,笔者还分别测试了基于Food101数据集的Resnet50模型和Resnet101模型各自的BF16格式和FP32格式的最大batch_size及其训练时的最大显存使用率,方便读者对batch_size进行修改,具体结果如下表所示。
BF16 | FP32 | |
Resnet50 | batch_size:128 显存使用率:92.09% | batch_size:64 显存使用率:90.41% |
Resnet101 | batch_size:96 显存使用率:98.95% | batch_size:48 显存使用率:96.77% |