16年前的電影《功夫》可以說是家喻戶曉,並將武俠片推向了一個新的高潮。在電影中,街頭小混混阿星偶然間被打通了任督二脈,因善開悟,再有「如來神掌」的加持,讓他的武功變得登峰造極,最後從天而降,一掌擊敗了大反派火雲邪神。相信不少小夥伴們都因此萌生了武俠夢、功夫夢,夢想自己有一天也能「開掛」,變得天下無敵!
如果當時做個問卷調查,問獲得絕世武功的第一步需要什麼?即使很多人說不清楚任脈和督脈的位置,他們仍然會回答——打通任督二脈!
「只有打通任督二脈,才能加速真氣運行效率,從而獲得神功」已成為多數少俠們的共同認識。其實,這個道理同樣能應用於現實之中。比如,在人工智慧領域,開源開放非常普遍,只有打通壁壘,實現互通有無,才能促進發展的效率。
近期,飛槳進入了2.0時代,不僅 API 體系得到了全面升級,動態圖模式變得更加完備,為廣大開發者帶來「動靜統一的開發體驗」,還集成了最新版的 Paddle2ONNX 工具,進一步提升了框架的開放性。除了原先的 Paddle Inference 和 Paddle Lite 等高性能部署方案外,用戶還可以通過使用 paddle.onnx.export 接口,將模型保存為 ONNX 協議格式後進行部署,極大豐富了飛槳的軟硬體部署生態!
Paddle2ONNX 項目地址:
https://github.com/PaddlePaddle/Paddle2ONNX
ONNX(Open Neural Network Exchange)是一種針對機器學習所設計的開放式的文件格式,用於存儲訓練好的模型。它使得不同的人工智慧框架,可以採用相同格式存儲模型數據並交互。
簡而言之,ONNX 相當於是一套統一的深度學習模型格式。基於這一套統一的格式,很多廠商的硬體和軟體天然支持運行 ONNX 格式的模型。
關注飛槳的用戶此前就應該了解到,Paddle Lite 不僅可以支持飛槳原生模型部署,同時也支持 PyTorch 模型的部署,其技術路徑就是通過 PyTorch 導出 ONNX 格式模型,再通過 X2Paddle 轉換為飛槳模型格式進行部署。
不了解的童鞋快戳連結,了解 X2Paddle 項目:
https://github.com/PaddlePaddle/X2Paddle
飛槳作為國內最早開源的開源框架,在過去一年中技術生態迅猛發展,為開源社區貢獻多個模型套件。其中,目標檢測模型套件推出產業實踐最優模型 PP-YOLO,性能和精度都超過原生的 YOLO-V4;在文字識別方向,PP-OCR 在2020年一經開源,便吸引了大量開發者使用,多次登陸 GitHub 技術趨勢榜;另外,在多個國際權威語義評測中獲得冠軍的預訓練模型 ERNIE,也升級至2.0。飛槳進步,永不止步。為了幫助開發同學解決部署環境難題,飛槳也在不斷探索。
現在,飛槳與 ONNX 開源組織進行了合作,開源了 Paddle2ONNX 項目,並基於 Paddle2ONNX 與英特爾合作,打通了飛槳模型在 OpenVINO 上的部署推理。
本月,我們將發布 Paddle2ONNX 最新版本 V0.5,帶來更多重磅功能,覆蓋更多飛槳官方模型,期望通過 ONNX 這個橋梁,進一步推動飛槳、開發者和軟硬體廠商的合作!
Paddle2ONNX 項目升級解讀在飛槳框架升級2.0後,框架已經內置 paddle.onnx.export 接口,用戶在代碼中可以調用接口以 ONNX 協議格式保存模型。此外,用戶已經保存的飛槳模型,也可以通過 Paddle2ONNX 加載後進行轉換。本文的使用教程部分,會附有針對動態圖和靜態圖模型的轉換方法,以供大家參考體驗。
新版本的 Paddle2ONNX 支持多達88個 Paddle OP 算子。在轉換過程中,支持用戶指定轉換為 ONNX 1到12任意版本的模型,提升模型的適配能力。
覆蓋 CV 和 NLP 領域主流模型,不僅支持 PP-YOLO 這樣模型新星的轉換,還開始支持 ERNIE 這樣 NLP 領域的王牌!它們均已支持轉為 ONNX 進行部署,有需求的同學快去試試吧!
此前就有部分用戶諮詢飛槳小哥哥:飛槳 PP-YOLO、ERNIE 等明星模型,能不能用 ONNX 方式來部署?現在小哥哥現身回答你!
本教程將向大家展示如何將飛槳官方內置的 MobileNetV2 動態圖模型,導出為 ONNX 格式的模型,並使用 ONNXRunTime 工具驗證模型的正確性。
使用飛槳框架2.0構建的動態圖模型,可以通過調用 paddle.onnx.export 接口,實現 ONNX 模型的快速導出。
import os
import time
import paddle
# 從模型代碼中導入模型
from paddle.vision.models import mobilenet_v2
# 實例化模型
model = mobilenet_v2()
# 將模型設置為推理狀態
model.eval()
# 定義輸入數據
input_spec = paddle.static.InputSpec(shape=[None, 3, 320, 320], dtype='float32', name='image')
# ONNX模型導出
# enable_onnx_checker設置為True,表示使用官方ONNX工具包來check模型的正確性,需要安裝ONNX(pip install onnx)
paddle.onnx.export(model, 'mobilenet_v2', input_spec=[input_spec], opset_version=12, enable_onnx_checker=True)
執行結果:
2021-01-26 10:52:13 [INFO] ONNX model genarated is valid.
2021-01-26 10:52:13 [INFO] ONNX model saved in mobilenet_v2.onnx
我們可以看到模型成功轉換保存為 ONNX 格式文件——mobilenet_v2.onnx。
將靜態圖模型導出為 ONNX 模型
通過命令行調用 paddle2onnx 命令可完成靜態圖模型的轉換。
# Paddle動態圖保存為靜態圖
paddle.jit.save(model, 'inference/model', input_spec=[input_spec])
# 調用paddle2onnx命令
!paddle2onnx \
--model_dir inference \
--model_filename model.pdmodel\
--params_filename model.pdiparams \
--save_file mobilenet_v2.onnx \
--opset_version 12
執行結果:
2021-01-26 10:53:29 [INFO] ONNX model saved in mobilenet_v2.onnxnx
# 動態圖導出的ONNX模型測試
import time
import numpy as np
from onnxruntime import InferenceSession
# 加載ONNX模型
sess = InferenceSession('mobilenet_v2.onnx')
# 準備輸入
x = np.random.random((1, 3, 320, 320)).astype('float32')
# 模型預測
start = time.time()
ort_outs = sess.run(output_names=None, input_feed={'image': x})
end = time.time()
print("Exported model has been predicted by ONNXRuntime!")
print('ONNXRuntime predict time: %.04f s' % (end - start))
# 對比ONNX Runtime 和 飛槳的結果
paddle_outs = model(paddle.to_tensor(x))
diff = ort_outs[0] - paddle_outs.numpy()
max_abs_diff = np.fabs(diff).max()
if max_abs_diff < 1e-05:
print("The difference of results between ONNXRuntime and Paddle looks good!")
else:
relative_diff = max_abs_diff / np.fabs(paddle_outs.numpy()).max()
if relative_diff < 1e-05:
print("The difference of results between ONNXRuntime and Paddle looks good!")
else:
print("The difference of results between ONNXRuntime and Paddle looks bad!")
print('relative_diff: ', relative_diff)
print('max_abs_diff: ', max_abs_diff)
執行結果:
Exported model has been predicted by ONNXRuntime!
ONNXRuntime predict time: 0.0260 s
The difference of results between ONNXRuntime and Paddle looks good!
max_abs_diff: 4.2632564e-13
這裡,我們可以看到推理時間需要0.0260秒,推理結果與轉換前的飛槳模型相比幾乎一致。詳細示例信息可以參考 AI Studio 項目「Paddle2.0 導出 ONNX 模型和推理」,地址:
https://aistudio.baidu.com/aistudio/projectdetail/1461212
除了上面的例子外,還有更多使用和了解 Paddle2ONNX 的方式:
Paddle2ONNX 項目地址:
https://github.com/PaddlePaddle/Paddle2ONNX歡迎給項目 Star,支持項目工程師的工作!
未來,Paddle2ONNX 還將支持更多的模型,如果您有相關的需求,歡迎加入官方群與我們交流。
https://www.paddlepaddle.org.cn/GitHub: https://github.com/PaddlePaddle/Paddle Gitee: https://gitee.com/paddlepaddle/Paddle