英特尔优化的 Pytorch 在腾讯云上的 AI 实践

  • 5 课时
  • 744 学过
  • 8 分
GPU 云服务器人工智能pytorch

课程概述

本次课程将介绍开源AI框架Intel Optimized PyTorch.以及其在腾讯云上的实践。课程内容包括开源AI框架PyTorch介绍以以及英特尔进行的优化, 特点和优势。课程中将指导学员掌握在腾讯云使用镜象工具轻松搭建继承英特尔优化的PyTorch开发环境,并介绍PyTorch进行基于seq2seq的训练/推理过程,以及掌握使用PyTorch框架使用CPU进行seq2seq模型的训练/推理。

【课程大纲】

1. PyTorch及英特尔优化简介

2. 如何搭建PyTorch开发环境

3. 序列到序列(Seq2Seq)网络结构

4. 如何使用PyTorch进行序列到序列(Seq2Seq)模型的训练

5. 实验结果及分析

机构简介

英特尔(Intel Corporation)

英特尔是半导体行业和计算创新领域的全球领先厂商,以智能互联技术奠定全球创新基石。英特尔创始于1968年,拥有50余年推动技术创新和耕耘产业生态的成功经验。如今,英特尔正转型为一家以数据为中心的公司。英特尔的战略愿景聚焦于三个方面:一是致力于生产世界上最好的半导体芯片;二是引领人工智能与“自能”革命;三是做全球领先的端到端技术平台提供者。英特尔正与合作伙伴一起,共推人工智能、自动驾驶、 5G及物联网等领域的技术创新与应用突破,驱动智能互联世界,从而解决人类面临的重大挑战。 英特尔于1985年进入中国,是在华高科技领域最大的外国投资企业之一,协议总投入约130亿美元。中国是英特尔全球战略之重点,英特尔在中国拥有美国总部之外最为全面的业务部署,覆盖了前沿研究、产品技术开发、精尖制造、产业生态合作、市场营销、客户服务、风险投资和企业社会责任等。英特尔中国现有员工约9,500人。扎根中国三十四年,英特尔见证并深度参与了中国的改革开放,从浦东开发、西部开发到振兴东北等,英特尔一直跟随改革开放的步伐,积极带动区域经济发展,为高端制造持续注入新动力。 2014年12月,英特尔宣布在未来15年将为成都工厂投资16亿美元,首次引入英特尔最先进的高端测试技术( ATT),使成都工厂在原有的芯片封装与测试业务之外进一步升级为英特尔在美国境外唯一的ATT技术工厂;该技术已于2016年11月18日正式投产。 2015年10月,英特尔宣布投资55亿美元,将英特尔大连工厂升级为非易失性存储技术制造基地;该项目已经于2016年7月正式投产, 2017年发布了两款全新的基于3D NAND的数据中心级固态盘;其二期项目已经在2018年9月投产英特尔最先进的96层3D NAND产品。英特尔中国研究院是英特尔全球五大创新中枢之一,而英特尔亚太研发中心已发展成为英特尔在亚洲最大的综合性研发基地之一。 英特尔中国积极履行企业社会责任,涵盖了人才培养、员工关爱、多元化和包容、环境可持续、供应链建设、志愿服务等领域。英特尔连续20多年被教育部评为最佳合作伙伴。我们持续支持英特尔杯嵌入式大赛、英特尔杯软件创新大赛和人工智能人才培养等项目,开展丰富多彩的校园活动,每年都有上万名学生的直接参与,受益青少年数以十万计。英特尔中国员工在2018年参与志愿活动人数达8,636人,贡献志愿服务时间超过12万小时,参与比例为69%; 10年来累计志愿服务时间超过72 万小时。我们把公司运营与环境可持续发展协调并进,积极减少碳足迹;还和政府、产业链以及公益组织深入合作,共同推动绿色可持续发展。全球独立机构声望研究院发布的“中国最具声望的公司”( RepTrak? 100) 2018年百强排行榜中,英特尔荣登榜首。

讲义

PyTorch及英特尔优化简介

PyTorch简介

PyTorch能够帮助深度学习研究者、开发者提高开发效率的训练和推理。它提供深度学习所需的灵活丰富的功能,具有良好的性能。PyTorch默认使用动态模型,调试简便。PyTorch能够自动计算梯度及更新网络参数,同时也拥有一个优秀的社区。

左边这张图是一个常见的深度学习计算图。输入数据x首先与网络参数w1进行点乘操作,然后通过relu激活函数后与网络参数w2进行点乘操作。所得到的结果与真实答案通过损失函数计算损失,并通过梯度下降方法更新w1和w2的值。我们可以通过Numpy来实现这一计算过程。但是缺点在于代码略为繁琐,且Numpy函数只能在CPU上执行。幸运的是,PyTorch提供了可以灵活调用的深度学习模块,使得需要编写的代码量可以大幅减少。并且执行完一条指令后就可以打印出来便于调试。梯度的计算及网络参数的更新通过两条语句即可实现。PyTorch同时也支持在GPU上进行计算,简单易用。

我们来介绍一下PyTorch的一个最为重要的功能:自动梯度计算。如图所示为一个简单的例子。首先我们定义a为一个tensor,值为1。b为另一个值为2的tensor。我们定义计算为x=a+a*b,y=x的平方。通过查看x和y的grad_fn函数,我们可以看到在定义x和y计算的时候,PyTorch已经自动为其生成了反向传播的函数。通过调用y的backward函数可以轻松完成整个网络的反向传播。通过查看a和b的grad变量,我们可以知道a和b对于最终结果y的偏导数值分别是18和6。我们再通过左边的数学推导来验证PyTorch的这个结果是否正确。首先,a和b是输入,值为1和2。x=a+a*b。y=x的平方。所以前向传播的结果x等于3,y的值为9。然后我们来进行反向传播。根据链式法则,偏y偏a=偏y偏x乘以偏x偏a。同理,偏y偏b=偏y偏x乘以偏x偏b。所以偏y偏x为对y=x平方对x求导,即2乘以x,=6。偏x偏a为x=a+a*b对a求偏导,即1+b。b的值为2,所以偏x偏a值为1+2=3。同理,偏x偏b为a=1。我们把偏x偏a和偏x偏b的值代入回来可以算出偏y偏a值为18,偏y偏b为6,与PyTorch的结果相符。

英特尔优化

基于英特尔的CPU架构,英特尔开发了两个数学加速库,Intel Math Kernel Library (MKL)以及Intel Math Kernel Library for Deep Neural Networks (MKL-DNN)。前者充分利用了英特尔CPU的并行计算能力以及向量化技术来优化矩阵乘法的性能。后者充分利用英特尔CPU的并行计算能力及向量化等技术,并且高效率的利用CPU的片上缓存一最大限度提高卷积、批标准化等深度学习中常用运算的性能。英特尔至强可扩展处理器Skylake server及Cascade Lake Server支持MKL及MKL-DNN。

如何搭建PyTorch开发环境

在云上使用PyTorch

  • 首先,您需要进入腾讯云控制台创建一个云服务器。然后点击下一步:选择镜像
  • 您可以在镜像市场中找到本课程所使用的包含英特尔优化的PyTorch镜像
  • 最后确认并完成服务器配置。PyTorch开发环境已经默认在您选择的镜像中了,所以您不需要自己去安装PyTorch

验证PyTorch开发环境

我们可以在Python3环境中通过运行import torch命令来验证PyTorch是否已经安装了。如果这条命令没有报错,则表明PyTorch已经安装好了。然后,我们可以通过print(torch.__version__)命令来打印当前安装的PyTorch的版本。

验证英特尔优化是否被启用

我们可以通过创建一个如图所示只包含二维卷积以及全连接层的简单网络,并设置环境变量MKL_VERBOSE=1以及MKLDNN_VERBOSE=1来验证英特尔优化是否被启用。

如果英特尔优化被启用,命令行中将打印出MKL以及MKL-DNN的verbose信息。PyTorch默认已经启用了英特尔的MKL以及MKL-DNN优化。

Seq2Seq网络结构

递归神经网络(RNN)

递归神经网络RNN是一种深度学习网络结构。相对于广泛被应用于图像处理任务的卷积神经网络CNN,RNN引入了时间概念,所以可以用来处理时序序列,并且可以保存历史特征对当前状态的影响。如下图所示,一个RNN单元包含了输入x,隐藏状态h以及输出o。RNN单元通常按时序顺此相接。每个RNN单元通过接受前一时刻t-1的隐藏状态作为当前时刻的初始隐藏状态来保留历史信息。

长短期记忆(LSTM)& 门控循环单元(GRU)

目前最常用的两种RNN单元为长短期记忆LSTM以及门控循环单元GRU。LSTM可有效解决长序列训练时所发生的梯度消失/梯度爆炸问题。LSTM包含两个隐藏状态c和h。LSTM的一个变种GRU在保证了与LSTM相当的结果的同时简化了计算量。GRU只有一个隐藏状态h。

Seq2Seq网络结构

Seq2Seq网络结构接受一个时序序列作为输入,产生另一个时序序列作为输出。常被用于机器翻译等任务。编码器-解码器结构是Seq2Seq网络结构的基础,包含编码器部分和解码器部分。两者通常使用同一种的RNN单元。编码器提取输入序列的特征,用其最后一级隐藏状态来初始化解码器。解码器部分通常使用前一时刻的输出作为当前时刻RNN单元的输入。

如何使用PyTorch进行Seq2Seq模型的训练和推理

总览

总体来说,使用PyTorch进行深度学习开发包含左图所示的几大步骤:首先需要对数据进行读取以及预处理,其次需要实现拓扑结构,并实例化模型。如果是训练模型,需要定义优化器和损失函数以后将模型设置为训练模式,然后优化器梯度归零,模型前向传播,然后使用损失函数计算偏差,然后模型反向传播并使用优化器更新模型参数。验证或推理相对训练简单很多,只需要将模型设置为推理模式,并进行一次前向传播。如果是为了验证训练,需要再加一步使用损失函数计算偏差。

训练时可以通过绘制曲线来掌握训练状态。我们可以绘制训练损失以及精度曲线来判断模型或超参是否合理。理想的总体趋势应为减小损失,提高精度。同时我们也可以通过绘制验证损失/精度曲线来判断训练是否过拟合。过拟合时应停止训练。

数据读取及预处理

PyTorch中数据读取通过组合使用Dataset类和DataLoader类来实现。Dataset类为表述数据集的抽象类。使用方法为继承torch.utils.data.Dataset类并重载以下3个函数。init函数用来初始化类,len函数返回数据集中数据个数,getitem函数返回index位置处的数据。

torch.utils.data.DataLoader类用来从刚才定义的Dataset类中读取数据,该类支持分批读取数据以及乱序读取。首先,实例化继承自Dataset的类为数据集实例,然后使用其初始化DataLoader类实例,并通过enumerate函数以及for循环来遍历数据集。

Seq2Seq拓扑结构的实现

要实现Seq2Seq拓扑结构,我们需要分别实现编码器和解码器。这个例子里我们都使用GRU作为RNN单元,编码器接受输入input,并返回最后一级的隐藏状态hidden以及输出output。解码器使用编码器返回的隐藏状态hidden作为其初始隐藏状态,并返回输出序列。

需要实例化模型,将在init函数中定义的参数传入即可。

训练

训练需要用到的基本元素有模型、数据、优化器以及损失函数。模型我们通过实例化拓扑结构已经取得了。数据通过DataLoader来读取。PyTorch提供了丰富的优化器和损失函数可供我们选择,这个例子里我们使用Adam作为优化器,使用NLLLoss作为损失函数。

首先,我们需要将模型设置为训练模式model.train(),然后将优化器梯度归零optimizer.zero_grad(),然后做一次前向传播y = model(data),将其结果使用损失函数计算与真实答案间的差距loss = loss_fn(y, answer),然后使用backward函数做反向传播计算梯度loss.backward(),最后使用优化其更新模型参数optimizer.step()。

验证/推理

对于验证,我们需要经过训练的模型,通过DataLoader类读取的数据,以及用来计算训练效果的损失函数。首先我们将模型设置为推理模式,然后做一次前向传播,最后使用损失函数计算损失即可。如果只做推理的话,前向传播以后就不需要计算损失了。

实验结果以及分析

实验

本次实验的目标为使用具有一定规律的数据集训练Seq2Seq模型,并验证模型的精确度。数据集包含两部分,输入序列和输出序列。输入序列为包含连续三个或者四个0的随机整数序列,非零元素为1到9的随机整数。输出序列为输入序列中0序列向右平移该0序列长度个单位。下面是一个例子,输入序列为3个0开头的随机整数序列,相对应的输出序列就是将这个0序列向右平移3位。

实验所需要的软件包为PyTorch、PyTorch的可视化工具Visdom,用于读取csv格式数据的Pandas以及Numpy。运行该实验脚本前需要先运行Visdom可视化工具:

  • $ visdom &
  • $ python run_seq2seq.py

结果

训练用数据集为14000对序列,验证用数据集为2800对序列。模型使用4层含有256个隐藏状态的GRU为RNN单元。GRU单元内dropout设为0.8。训练在约1200个epoch后收敛,2000个epoch后精度约99.7%,损失约0.001。

推理结果:Call行为输入序列,True行为期望输出序列,Resp行为实际输出序列,Accuracy行为准确率。下图所示模型可以准确地提取训练及特征并将其重现。

我们通过设置环境变量MKL_VERBOSE=1和MKLDNN_VERBOSE=1可以确认英特尔优化被启用了。

分析

对于这个结果,我们可以从三个方面对其进行分析。首先是模型结构的复杂性对于训练以及结果的影响。其次是Dropout对于训练以及结果的影响。最后是数据集大小对于训练以及结果的影响。我们先说结论,模型简单的话不足以完全拟合数据集,会造成精度不足。模型过于复杂容易导致过拟合,造成实际精度的下降。Dropout可以在保持模型整体复杂性的同时,在训练时减少模型的复杂性以延缓过拟合的发生,提高精度。总体来说,大数据集对提高精度能产生积极的影响。

对于模型的复杂性和dropout对于结果的影响,我们进行了三组实验。如左图,我们先使用一层RNN单元生成模型,Dropout为0,在约1900个epoch后过拟合,过拟合时的精度约60%。然后,我们使用四层RNN单元生成模型,Dropout同样为0,中间那张图。相比一层RNN单元,四层的时候在600个epoch时就出现了过拟合现象,过拟合时精度约58%。但是当我们把四层RNN单元的Dropout值设成0.8以后,过拟合现象发生在约1700个epoch后,此时精度约81%,如右图。Dropout有助于提高模型的准确度并延缓过拟合的发生。

对于数据集大小对结果的影响,我们进行了两组实验。一组的训练集数据量为2800对序列,另一组为14000对序列。训练集与验证集的大小比例均为5:1。左图为小数据集曲线,右图为大数据集曲线。小数据集在约1700个epoch后过拟合,精度约81.2%。大数据集未出现过拟合现象,精度约99.7%。

课程总结

本课程详细介绍了:

  • 深度学习框架PyTorch以及英特尔对其进行的优化
  • 如何启用及验证英特尔的优化是否得到使用
  • 如何使用PyTorch搭建Seq2Seq拓扑结构网络并进行训练/推理
  • 深度学习训练中需要注意的事项及其对于训练和结果的影响

课程评价(0)

感谢你参加本课程,请你作出评价:
0/300

以下选自学员评价

暂无精选评价