直接上Paddle2ONNX專案地址:
https://github.com/PaddlePaddle/Paddle2ONNX
ONNX(Open Neural Network Exchange)是一種針對機器學習所設計的開放式的檔案格式,用於儲存訓練好的模型。它使得不同的人工智慧框架,可以採用相同格式儲存模型資料並互動。
簡而言之,ONNX相當於是一套統一的深度學習模型格式。基於這一套統一的格式,很多廠商的硬體和軟體天然支援執行ONNX格式的模型。
飛槳作為國內最早開源的開源框架,在過去一年中技術生態迅猛發展,為開源社群貢獻多個模型套件。其中,目標檢測模型套件推出產業實踐最優模型PP-YOLO,效能和精度都超過原生的YOLO-V4;在文字識別方向,PP-OCR在2020年一經開源,便吸引了大量開發者使用,多次登陸GitHub技術趨勢榜;另外,在多個國際權威語義評測中獲得冠軍的預訓練模型ERNIE,也升級至2.0。飛槳進步,永不止步。為了幫助開發同學解決部署環境難題,飛槳也在不斷探索。
現在,飛槳與ONNX開源組織進行了合作,開源了Paddle2ONNX專案,並基於Paddle2ONNX與英特爾合作,打通了飛槳模型在OpenVINO上的部署推理。
本月,我們將釋出Paddle2ONNX最新版本V0.5,帶來更多重磅功能,覆蓋更多飛槳官方模型,期望透過ONNX這個橋樑,進一步推動飛槳、開發者和軟硬體廠商的合作!
ONNX的橋樑作用
Paddle2ONNX專案升級解讀
基於飛槳框架2.0,新版本的Paddle2ONNX主要新增實現了以下重要功能。
支援基於飛槳框架2.0匯出動態圖模型在飛槳框架升級2.0後,框架已經內建paddle.onnx.export介面,使用者在程式碼中可以呼叫介面以ONNX協議格式儲存模型。此外,使用者已經儲存的飛槳模型,也可以透過Paddle2ONNX載入後進行轉換。本文的使用教程部分,會附有針對動態圖和靜態圖模型的轉換方法,以供大家參考體驗。
更豐富的Paddle OP覆蓋新版本的Paddle2ONNX支援多達88個Paddle OP運算元。在轉換過程中,支援使用者指定轉換為ONNX 1到12任意版本的模型,提升模型的適配能力。
支援轉換飛槳CV、NLP領域的主流模型覆蓋CV和NLP領域主流模型,不僅支援PP-YOLO這樣模型新星的轉換,還開始支援ERNIE這樣NLP領域的王牌!它們均已支援轉為ONNX進行部署,有需求的同學快去試試吧!
Paddle2ONNX使用教程
本教程將向大家展示如何將飛槳官方內建的MobileNetV2動態圖模型,匯出為ONNX格式的模型,並使用ONNXRunTime工具驗證模型的正確性。
將動態圖模型匯出為ONNX模型
使用飛槳框架2.0構建的動態圖模型,可以透過呼叫paddle.onnx.export介面,實現ONNX模型的快速匯出。
import osimport timeimport 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.onnx
與動態圖相似,模型同樣會被儲存為ONNX 格式的檔案。
模型測試
這裡使用ONNXRunTime來進行ONNX模型驗證測試,並評估轉換後推理結果的誤差。
# 動態圖匯出的ONNX模型測試import timeimport numpy as npfrom 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 sThe 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的方式:
PaddleX基於Paddle2ONNX的OpenVINO部署方案:https://paddlex.readthedocs.io/zh_CN/develop/deploy/openvino/index.html飛槳官網匯出ONNX模型協議教程:https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/02_paddle2.0_develop/09_model_to_onnx_cn.html手把手教你透過ONNX部署飛槳模型教程:https://aistudio.baidu.com/aistudio/projectdetail/1479970Paddle2ONNX專案地址:https://github.com/PaddlePaddle/Paddle2ONNX