大家好,今天带来的是有关于飞桨结构v2.4 AP晋级的内容~快来看看是不是你所期待的新内容吧!
2022年11月,飞桨结构2.4版别发布。比较飞桨结构2.3版别,飞桨结构v2.4添加了167个功用性API,新增稀少核算(paddle.sparse)、图学习(paddle.geometric)和语音处理(paddle.audio)等更多范畴API,一起也进一步完善了loss核算、张量核算、分布式和视觉改换等类别的API。下面咱们将为大家具体介绍每一类新增API及其运用场景示例,便利大家快速了解和上手运用哦~
全面支撑干流模型稀少化练习及推理
当前越来越多的场景有稀少核算的需求,例如3D点云图画处理和NLP中的稀少Attention等。神经网络的稀少化能够提高网络的功用,削减核算量及内存/显存的占用,已成为深度学习的研究抢手之一。飞桨v2.4新增了如下稀少类API,支撑干流稀少模型的练习和推理,并支撑多种稀少Tensor格局及稀少Tensor与稠密Tensor的混合核算,一起其称号和运用方法与惯例稠密Tensor的API坚持一致,便利回忆且简略上手。
稀少根底核算API:
-
一元核算: paddle.sparse.sin/sinh/tan/tanh/expm1/log1p/pow/square/sqrt/abs/cast/neg…
-
二元核算: paddle.sparse.add/substract/multiply/divide…
-
矩阵和向量核算: paddle.sparse.matmul/masked_matmul/addmm/mv…
-
数据变形: paddle.sparse.transpose/reshape…
稀少组网API:
-
网络层: paddle.sparse.nn.Conv3D/SubmConv3D/MaxPool3D/BatchNorm…
-
激活层: paddle.sparse.nn.ReLU/ReLU6/LeakyReLU/Softmax…
覆盖稀少核算干流运用场景
3D点云目标检测
CenterPoint是一种物体检测器,以点云作为输入,将三维物体在Bird-View下的中心点作为要害点,根据要害点检测的方法回归物体的尺寸、方向和速度。
飞桨结构v2.4完好供给了这类模型需求的稀少SubmanifoldConv3D/Conv3D、稀少BatchNorm和稀少ReLU等API。模型的练习评估、动转静及推理的各项功用均已彻底完结,欢迎试用。实测比业界同类竞品提速4%,练习精度提高0.2%。
- CenterPoint模型介绍
github.com/PaddlePaddl…
Sparse Transformer
稀少Transformer与经典的稠密Transformer比较,能支撑更长的输入序列,得到更好的网络功用。
稀少Attention的中心核算逻辑为:
飞桨结构v2.4供给稀少矩阵乘、稀少softmax等运算,可完好支撑SparseTransformer的运算。在高稀少度场景下,比较运用DenseTensor提速105.75%,比较同类产品稀少核算提速4.01%~58.55%,极致节约显存并提高功用。
支撑多种稀少Tensor格局及稀少Tensor与稠密Tensor的混合核算
飞桨API支撑最常运用的稀少数据COO和CSR格局。COO为稀少数据坐标格局,CSR为压缩行信息格局。不同格局的稀少数据运用场景不同,其间SparseConv3D更适合处理COO格局的数据,SparseTransformer中有较多取整行的操作,更适合处理CSR格局的数据,能更好下降核算复杂度。尽管这些API有不同的格局倾向,但是飞桨稀少API在规划时,每个都尽可能支撑多种稀少格局,这样在不同模型场景下处理不同的数据格局时都能够运用相同的API,不必修正代码,更灵敏且更能极致提高功用。
以ReLU激活函数为例,其支撑处理不同的稀少Tensor:
#稀少COOTensor
coo=paddle.sparse.sparse_coo_tensor(
indices=[[0,1,2],
[1,2,0]],
values=[1.,2.,3.],
shape=[3,3])
out=paddle.sparse.nn.functional.relu(coo)
#稀少CSRTensor
csr=paddle.sparse.sparse_csr_tensor(
crows=[0,1,2,3],
cols=[1,2,0],
values=[1.,2.,3.],
shape=[3,3])
out=paddle.sparse.nn.functional.relu(csr)
除了支撑不同的稀少格局外,关于二元核算及矩阵向量核算等API,还支撑多种稀少格局和惯例的稠密格局(Dense Tessor)的混合核算,网络能够部分运用传统组网,部分运用稀少,更便利已有模型的优化:
#COO与Dense矩阵乘,回来稠密Tensor
coo=paddle.sparse.sparse_coo_tensor(
indices=[[0,1,2],
[1,2,0]],
values=[1.,2.,3.],
shape=[3,3])
dense=paddle.rand([3,2])
out=paddle.sparse.matmul(coo,dense)
#CSR与Dense矩阵乘,回来稠密Tensor
csr=paddle.sparse.sparse_csr_tensor(
crows=[0,1,2,3],
cols=[1,2,0],
values=[1.,2.,3.],
shape=[3,3])
dense=paddle.rand([3,2])
out=paddle.sparse.matmul(csr,dense)
#Dense与Dense矩阵乘,回来稀少Tensor
x=paddle.rand([3,5])
y=paddle.rand([5,4])
mask=paddle.sparse.sparse_csr_tensor(
crows=[0,2,3,5],
cols=[1,3,2,0,1],
values=[1.,2.,3.,4.,5.],
shape=[3,4])
out=paddle.sparse.masked_matmul(x,y,mask)
称号和运用方法与惯例稠密Tensor的API坚持一致,便利回忆且简略上手
一般模型中运用的API都是处理稠密数据(Dense Tensor)的API。飞桨SparseAPI在规划之初就考虑尽可能下降理解成本,与惯例处理稠密数据(Dense Tensor)的API坚持风格一致,便利用户快速上手。
以模型中一段ResNet稀少网络的代码为例:
importpaddle
frompaddleimportsparse
frompaddle.sparseimportnn
classSparseBasicBlock(paddle.nn.Layer):
def__init__(
self,
in_channels,
out_channels,
stride=1,
downsample=None,
):
super(SparseBasicBlock,self).__init__()
self.conv1=nn.SubmConv3D(
in_channels,
out_channels,
kernel_size=3,
stride=stride,
padding=1)
self.bn1=nn.BatchNorm(out_channels,epsilon=1e-3,momentum=0.01)
self.relu=nn.ReLU()
self.conv2=nn.SubmConv3D(
out_channels,
out_channels,
kernel_size=3,
stride=stride,
padding=1)
self.bn2=nn.BatchNorm(out_channels,epsilon=1e-3,momentum=0.01)
self.downsample=downsample
defforward(self,x):
identity=x
out=self.conv1(x)
out=self.bn1(out)
out=self.relu(out)
out=self.conv2(out)
out=self.bn2(out)
ifself.downsampleisnotNone:
identity=self.downsample(x)
out=sparse.add(out,identity)
out=self.relu(out)
returnout
能够看到,ResNet稀少网络的代码和惯例ResNet网络代码几乎没有差别,只需求经过paddle.sparse.*代替paddle.*即可,源于飞桨Sparse系列API在全体运用上与Dense系列API高度一致。假如能够添加import路径替换,甚至原网络代码都无需改动。例如经过frompaddle.sparseimportnn,则可坚持与本来的nn.*写法彻底一致,更易于上手。
新增图学习类API,支撑高效图学习核算
近几年,图学习相关研究开展迅速,在自然语言处理、核算机视觉、引荐系统、生物化学等范畴具有较为广泛的运用和开展。图学习逐渐成为机器学习范畴的要害技术,本次飞桨结构v2.4新增paddle.geometric图学习类API,供给更好的图学习建模和高效图学习核算体会。
高效图音讯传递
现有的大多数图学习结构在进行图模型规划时,一般采用图音讯传递机制的经典范式。飞桨结构v2.4新增图学习音讯传递API,支撑高效图音讯传递。其间,新增的send_u_recv、send_ue_recv、send_uv合计3个API,经过完结原子等级的音讯发送与接纳,大大削减了冗余的中心显存变量占用,从而带来显著的显存收益。在稠密图场景下,GCN、GAT等经典图神经网络模型可节约50%+的显存,并可进一步提高练习速度约20%。各个send_recv系列API支撑sum、mean、max、min合计4个音讯聚合方法,在节点特征与边特征交互时则支撑add、sub、mul、div合计4种核算方法。运用方法示例如下:
importpaddle
x=paddle.to_tensor([[0,2,3],[1,4,5],[2,6,7]],dtype="float32")
y=paddle.to_tensor([1,1,1,1],dtype="float32")
indexes=paddle.to_tensor([[0,1],[1,2],[2,1],[0,0]],dtype="int32")
src_index,dst_index=indexes[:,0],indexes[:,1]
out=paddle.geometric.send_ue_recv(x,y,src_index,dst_index,message_op="add",reduce_op="sum")
高功用图采样
图采样过程关于图采样模型特别是在大图场景下对错常有必要的,但一起也是图模型练习的功用瓶颈。本次新增了高功用图采样API,支撑高并发图采样,加快图采样模型采样和练习功率,经典图模型Graphsage的采样速度可提高32142倍,练习速度可提高1257倍。除了支撑纯GPU采样和CPU采样之外,还能够支撑借助UVA(Unified Virtual Addressing,统一虚拟寻址)技术,将图结构放置在内存中进行GPU采样,该完结方法在大图场景下十分有效。简略示例如下:
importpaddle
frompaddle.fluidimportcore
row=np.array([3,7,0,9,1,4,2,9,3,9,1,9,7])
colptr=np.array([0,2,4,5,6,7,9,11,11,13,13])
row=core.eager.to_uva_tensor(row)
colptr=core.eager.to_uva_tensor(colptr)
nodes=paddle.to_tensor([0,8,1,2])
sample_size=2
#街坊采样API的输入要求图结构信息为CSC格局
neighbors,neighbor_count=paddle.geometric.sample_neighbors(row,colptr,nodes,sample_size=sample_size)
#生成重编号后的边
reindex_src,reindex_dst,out_nodes=paddle.geometric.reindex_graph(nodes,neighbors,neighbor_count)
新增语音范畴类API
近几年,智能语音范畴快速迅速,深度学习范畴发生了许多语音练习处理根底才能的需求。本次飞桨结构v2.4新增paddle.audio类API供给了语音根底处理才能,提高了语音建模和学习快捷性。
高效的特征提取模块
特征提取模块是深度学习语音范畴最根底的模块,特别在大规模数据练习和推理过程中,其速度为一个功用瓶颈。本次新增MFCC、Spectrogram、LogMelSpectrogram等特征提取API,支撑GPU核算,比较CPU完结处理功用提高15倍以上,可大幅提高语音模型练习GPU利用率,到达快速练习和推理的作用。运用示例如下:
importpaddle
frompaddle.audio.featuresimportLogMelSpectrogram
#设置音频相关参数
sample_rate=16000
wav_duration=0.5
num_channels=1
num_frames=sample_rate*wav_duration
wav_data=paddle.linspace(-1.0,1.0,num_frames)*0.1
waveform=wav_data.tile([num_channels,1])
#设置特征提起器相关参数
feature_extractor=LogMelSpectrogram(sr=sample_rate,n_fft=512,window='hann',power=1.0)
feats=feature_extractor(waveform)
音频处理根底模块
深度学习语音范畴,除了传统的经典模型外,还有许多语音前端处理的实验需求进行,定制化语音特征的需求应运而生。本次新增窗函数、离散余弦改换等特征提取根底API,便利用户自定义语音特征提取,便利完结定制化需求。运用示例如下:
importpaddle
#cosine窗函数示例
n_fft=512
cosine_window=paddle.audio.functional.get_window('cosine',n_fft)
#高斯窗函数
std=7
gaussian_window=paddle.audio.functional.get_window(('gaussian',std),n_fft)
#离散余弦改换示例
n_mfcc=23
n_mels=257
dct=paddle.audio.functional.create_dct(n_mfcc,n_mels)
语音IO模块
对各种语音数据进行读取是音频处理的根底。实际场景中语音的编码格局林林总总,所以需求IO模块灵敏地支撑多种格局。飞桨结构v2.4新增语音IO模块,供给2种音频I/Obackend,支撑6种编解码,快捷地完结语音数据的加载。运用示例如下:
importos
importpaddle
#设置相关参数,生成示例音频
sample_rate=16000
wav_duration=0.5
num_channels=1
num_frames=sample_rate*wav_duration
wav_data=paddle.linspace(-1.0,1.0,num_frames)*0.1
waveform=wav_data.tile([num_channels,1])
base_dir=os.getcwd()
filepath=os.path.join(base_dir,"test.wav")
#保存和提取音频信息
paddle.audio.save(filepath,waveform,sample_rate)
wav_info=paddle.audio.info(filepath)
#wav_info中会有sample_rate,num_frames,num_channels等信息
语音分类数据集
在练习深度学习语音模型的时分,便利地下载处理数据集会为模型练习带来快捷。飞桨结构v2.4新增TESS、ESC50语音分类数据集。用户不必进行复杂的预处理,能够便利地启动练习流程,快捷地完结练习。用户也能够依照此代码,便利定制自己的数据集。运用示例如下:
importpaddle
mode='dev'
esc50_dataset=paddle.audio.datasets.ESC50(mode=mode,
feat_type='raw')
foridxinrange(5):
audio,label=esc50_dataset[idx]
#dosomethingwithaudio,label
print(audio.shape,label)
#[audio_data_length],label_id
esc50_dataset=paddle.audio.datasets.ESC50(mode=mode,
feat_type='mfcc',
n_mfcc=40)
foridxinrange(5):
audio,label=esc50_dataset[idx]
#dosomethingwithmfccfeature,label
print(audio.shape,label)
#[feature_dim,length],label_id
其它新增的API
除了以上描述的几类新增API,飞桨结构v2.4还对已有的一些API类别进行了扩大。
loss核算API
为了更便利地支撑各种组网的loss核算需求,飞桨结构v2.4扩大了多个loss核算的API,包含:
-
paddle.nn.functional.cosine_embedding_loss根据label类型,核算2个输入之间的CosineEmbedding丢失。
-
paddle.nn.functional.soft_margin_loss核算输入和label间的二分类softmargin丢失。
-
paddle.nn.functional.multi_label_soft_margin_loss核算输入和label间的多分类最大熵丢失。
-
paddle.nn.functional.triplet_margin_loss和paddle.nn.functional.triplet_margin_with_distance_loss核算输入与正样本和负样本之间的相对相似性,后者可自定义距离核算函数。
张量核算API
飞桨结构2.3之前的版别完结了许多根底的张量核算API,飞桨结构2.4版别根据这些根底API,经过组合的方法扩大了张量核算API,便利用户直接运用,包含:
-
新增paddle.sgn取复数的单位值和实数的符号。
-
新增paddle.count_nonzero沿给定的轴核算输入张量中非零元素的个数。
-
新增paddle.take将输入张量视为一维,回来指定索引上的元素调集。
-
新增paddle.bucketize根据给定的一维桶区分,得到输入张量对应的桶索引。
-
新增paddle.triu_indices和paddle.tril_indices别离取二维张量(矩阵)中上/下三角矩阵元素的队伍坐标。
-
新增paddle.heaviside核算赫维赛德阶跃函数。
-
新增paddle.nanmedian和paddle.nanquantile忽略张量中的nan值,别离核算出中位数和分位数值。
分布式API
新增10个分布式通讯API,如paddle.distributed.communication.stream.all_gather等,支撑在主核算流上做通讯,下降了在流切换、事件等待时的功用开支,能够使分布式GPT3模型练习提速11.35%。
视觉改换API
根据飞桨根底API,扩大了paddle.vision.transforms中视觉改换API,包含:
-
paddle.vision.transforms.affine和paddle.vision.transforms.RandomAffine对图画进行仿射改换,后者运用随机发生的仿射改换矩阵参数。
-
paddle.vision.transforms.erase和paddle.vision.transforms.RandomErasing运用给定的值擦除输入图画中的像素,前者是选定区域,后者是随机区域。
-
paddle.vision.transforms.perspective和paddle.vision.transforms.RandomPerspective对图画进行透视改换,前者是选定区域,后者是随机区域,两者都能够挑选插值方法。
除了上面的介绍外,飞桨结构v2.4还扩大了一些组网类(如paddle.nn.ChannelShuffle)、辅佐类(如paddle.iinfo)等API,具体列表可点击下方链接参阅Release Note。
- Release Note地址
github.com/PaddlePaddl…
结语
飞桨结构的建造除了来自百度的工程师外,还有一批酷爱飞桨、酷爱开源的开发者,他们正在用自己的方法参加飞桨结构的建造,与飞桨共同生长。在飞桨结构v2.4中,有约三分之一的新增API由社区开发者奉献,飞桨的昌盛离不开广阔开发者的运用与支撑。
飞桨结构v2.4逐步形成了老练的API开发范式,结构的开发难度继续下降。合作官方供给的标准开发环境,飞桨社区开发者能够愈加顺畅地完结飞桨API开发与奉献。具体体现在:
-
简化API开发过程:飞桨结构v2.4完结了根底结构算子系统重构,结构高可复用的PHI算子库(Paddle HIgh reusability operator library),支撑根据已有的算子内核以及Kernel Primitives API组合完结新的算子,支撑插件式接入新硬件或者新加快库。PHI算子库的老练,提高了飞桨API的开发功率,并形成了通用的API开发流程,使得开发者能够愈加简洁流畅地参加飞桨API的开发与奉献。
-
发布标准API奉献攻略:飞桨结构v2.4形成了标准的API奉献攻略,包含奉献流程与操作攻略、API规划文档模板、API代码模板、API文档写作标准,为飞桨社区开发者供给明晰的文档指引与辅佐,使得开发者能够快速上手。
-
供给标准开发环境:飞桨AIStudio平台推出标准开发环境,为开发者供给飞桨镜像环境、在线IDE与专属GPU算力,登录即可开发调试,免去环境配置与算力限制,随时随地参加飞桨结构的开发与奉献。
飞桨结构v2.4供给了愈加丰厚的API系统,不只更好地支撑深度学习稀少核算、图学习、语音范畴的快速迭代和创新,并且不断扩展对3D点云、Sparse Transformer等场景运用的支撑,一起也不断优化飞桨API的运用体会,更好地支撑业界论文中模型的完结,加快创新,让根据深度学习的运用开发更简略!