飛槳框架v2.4 API新升級!全面支援稀疏計算、圖學習、語音處理等任務
大家好,今日帶來的是有關於飛槳框架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模型介紹
http://github.com/PaddlePaddle/Paddle3D/tree/release/1.0/docs/models/centerpoint
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:
# 稀疏COO Tensor
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)
# 稀疏CSR Tensor
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稀疏網路的程式碼為例:
import paddle
from paddle import sparse
from paddle.sparse import nn
class SparseBasicBlock(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
def forward(self, x):
identity = x
out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out)
if self.downsample is not None:
identity = self.downsample(x)
out = sparse.add(out, identity)
out = self.relu(out)
return out
可以看到,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種計算方式。使用方式示例如下:
import paddle
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的取樣速度可提升32~142倍,訓練速度可提升12~57倍。除了支援純GPU取樣和CPU取樣之外,還可以支援藉助UVA(Unified Virtual Addressing,統一虛擬定址)技術,將圖結構放置在記憶體中進行GPU取樣,該實現方式在大圖場景下非常有效。簡單示例如下:
import paddle
from paddle.fluid import core
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利用率,達到快速訓練和推理的效果。使用示例如下:
import paddle
from paddle.audio.features import LogMelSpectrogram
#設定音訊相關引數
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,方便使用者自定義語音特徵提取,方便完成定製化需求。使用示例如下:
import paddle
#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種編解碼,便捷地實現語音資料的載入。使用示例如下:
import os
import paddle
#設定相關引數,生成示例音訊
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語音分類資料集。使用者不必進行復雜的預處理,可以方便地啟動訓練流程,便捷地完成訓練。使用者也可以依照此程式碼,方便定製自己的資料集。使用示例如下:
import paddle
mode = 'dev'
esc50_dataset = paddle.audio.datasets.ESC50(mode=mode,
feat_type='raw')
for idx in range(5):
audio, label = esc50_dataset[idx]
# do something with audio, label
print(audio.shape, label)
# [audio_data_length] , label_id
esc50_dataset = paddle.audio.datasets.ESC50(mode=mode,
feat_type='mfcc',
n_mfcc=40)
for idx in range(5):
audio, label = esc50_dataset[idx]
# do something with mfcc feature, 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地址
http://github.com/PaddlePaddle/Paddle/releases
結語
飛槳框架的建設除了來自百度的工程師外,還有一批熱愛飛槳、熱愛開源的開發者,他們正在用自己的方式參與飛槳框架的建設,與飛槳共同成長。在飛槳框架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的使用體驗,更好地支援業界論文中模型的實現,加速創新,讓基於深度學習的應用開發更簡單!
- 基於飛槳實現的特定領域知識圖譜融合方案:ERNIE-Gram 文字匹配演算法
- 文心一言:這48小時,我被問了xxxx個問題
- 百度生成式AI產品文心一言邀請測試,五大場景、五大能力革新生產力工具
- 成為AI架構師的三大能力
- 動轉靜兩大升級!一鍵轉靜成功率領先,重點模型訓練提速18%
- 即刻報名!飛槳黑客馬拉松第四期如約而至,等你挑戰
- 文心一言,3月16日見!
- 百度集團副總裁吳甜釋出文心大模型最新升級,AI應用步入新階段
- PGLBox全面解決圖訓練速度、成本、穩定性、複雜演算法四大問題!
- C 到Python全搞定,教你如何為FastDeploy貢獻程式碼
- 飛槳框架v2.4 API新升級!全面支援稀疏計算、圖學習、語音處理等任務
- 10w 訓練標籤?成本太高!PaddleNLP情感分析賦能消費“回暖”
- 文心ERNIE 3.0 Tiny新升級!端側壓縮部署“小” “快” “靈”!
- 帶你零門檻掌握基於大模型技術的AIGC場景應用
- 從百度飛槳YOLOSeries庫看各個YOLO模型
- 30分鐘使用百度EasyDL實現健康碼/行程碼智慧識別
- 智慧健身動作識別:PP-TinyPose打造AI虛擬健身教練!
- 超大規模的產業實用語義分割資料集PSSL與預訓練模型開源啦!
- 使用百度 EasyDL 實現電動車進電梯自動預警
- 中國信通院報告:百度飛槳超越TensorFlow和PyTorch,居中國市場應用規模第一