導(dǎo)讀
費盡心血訓(xùn)練好的深度學(xué)習(xí)模型如何給別人展示毛雇?只在服務(wù)器上運行demo怎么吸引別人的目光?怎么才能讓自己的成果落地汹胃?這篇文章帶你進入模型部署的大門砰逻。
0 前言
模型部署的步驟:
- 訓(xùn)練一個深度學(xué)習(xí)模型;
- 使用不同的推理框架對模型進行推理轉(zhuǎn)換昼牛;
- 在應(yīng)用平臺運行轉(zhuǎn)換好的模型术瓮。
步驟看起來比較簡單,但是牽扯的到的知識還是比較多贰健。在實際應(yīng)用過程中胞四,我們使用的模型通常不會太簡單,因為要確保模型的精度伶椿。但是辜伟,實際應(yīng)用場景往往需要模型速度與精度能達(dá)到一個較好的平衡。因此這就需要在算法(剪枝脊另,壓縮等)與底層(手寫加速算作)去優(yōu)化模型导狡。但是,我們現(xiàn)在可以站在巨人的肩膀上去眺望世界偎痛,因此旱捧,該文章會給大家介紹一些常用的開源推理框架,大家一起參考學(xué)習(xí)踩麦。畢竟大牛團隊做出來的好用一些枚赡。
1 ONNX、NCNN谓谦、OpenVINO贫橙、 TensorRT、Mediapipe模型部署那家強反粥?
1.1 ONNX
簡介:
開放神經(jīng)網(wǎng)絡(luò)交換ONNX(Open Neural Network Exchange)是一套表示深度神經(jīng)網(wǎng)絡(luò)模型的開放格式卢肃,由微軟和Facebook于2017推出疲迂,然后迅速得到了各大廠商和框架的支持。通過短短幾年的發(fā)展莫湘,已經(jīng)成為表示深度學(xué)習(xí)模型的實際標(biāo)準(zhǔn)尤蒿,并且通過ONNX-ML,可以支持傳統(tǒng)非神經(jīng)網(wǎng)絡(luò)機器學(xué)習(xí)模型逊脯,大有一統(tǒng)整個AI模型交換標(biāo)準(zhǔn)优质。ONNX定義了一組與環(huán)境和平臺無關(guān)的標(biāo)準(zhǔn)格式,為AI模型的互操作性提供了基礎(chǔ)军洼,使AI模型可以在不同框架和環(huán)境下交互使用巩螃。硬件和軟件廠商可以基于ONNX標(biāo)準(zhǔn)優(yōu)化模型性能,讓所有兼容ONNX標(biāo)準(zhǔn)的框架受益匕争,簡單來說避乏,ONNX就是模型轉(zhuǎn)換的中間人。
使用場景:
無論你使用什么樣的訓(xùn)練框架來訓(xùn)練模型(比如TensorFlow/Pytorch/OneFlow/Paddle)甘桑,你都可以在訓(xùn)練后將這些框架的模型統(tǒng)一轉(zhuǎn)為ONNX存儲拍皮。ONNX文件不僅存儲了神經(jīng)網(wǎng)絡(luò)模型的權(quán)重,還存儲了模型的結(jié)構(gòu)信息跑杭、網(wǎng)絡(luò)中各層的輸入輸出等一些信息铆帽。目前,ONNX主要關(guān)注在模型預(yù)測方面(inferring)德谅,將轉(zhuǎn)換后的ONNX模型爹橱,轉(zhuǎn)換成我們需要使用不同框架部署的類型,可以很容易的部署在兼容ONNX的運行環(huán)境中窄做。
使用方法:
[代碼示例]在 ONNX 模型上運行形狀推理:https://github.com/onnx/onnx
import onnx
from onnx import helper, shape\_inference
from onnx import TensorProto
\# 預(yù)處理:創(chuàng)建一個包含兩個節(jié)點的模型愧驱,Y是未知的
node1 = helper.make\_node\("Transpose", \["X"\], \["Y"\], perm=\[1, 0, 2\]\)
node2 = helper.make\_node\("Trans
pose", \["Y"\], \["Z"\], perm=\[1, 0, 2\]\)
graph = helper.make\_graph\(
\[node1, node2\],
"two-transposes",
\[helper.make\_tensor\_value\_info\("X", TensorProto.FLOAT, \(2, 3, 4\)\)\],
\[helper.make\_tensor\_value\_info\("Z", TensorProto.FLOAT, \(2, 3, 4\)\)\],
\)
original\_model = helper.make\_model\(graph, producer\_name="onnx-examples"\)
\# 檢查模型并打印Y的信息
onnx.checker.check\_model\(original\_model\)
print\(f"Before shape inference, the shape info of Y is:\\n\{original\_model.graph.value\_info\}"\)
\# 在模型上進行推理
inferred\_model = shape\_inference.infer\_shapes\(original\_model\)
\# 檢查模型并打印Y的信息
onnx.checker.check\_model\(inferred\_model\)
print\(f"After shape inference, the shape info of Y is:\\n\{inferred\_model.graph.value\_info\}"\)
1.2 NCNN
簡介:
ncnn 是一個為手機端極致優(yōu)化的高性能神經(jīng)網(wǎng)絡(luò)前向計算框架,也是騰訊優(yōu)圖實驗室成立以來的第一個開源項目椭盏。ncnn 從設(shè)計之初深刻考慮手機端的部署和使用组砚,無第三方依賴,跨平臺掏颊,手機端 CPU 的速度快于目前所有已知的開源框架糟红。基于 ncnn乌叶,開發(fā)者能夠?qū)⑸疃葘W(xué)習(xí)算法輕松移植到手機端高效執(zhí)行改化,開發(fā)出人工智能 App。ncnn 目前已在騰訊多款應(yīng)用中使用枉昏,如 QQ、Qzone揍鸟、微信兄裂、天天P圖等句旱。
使用場景:
從NCNN的發(fā)展矩陣可以看出,NCNN覆蓋了幾乎所有常用的系統(tǒng)平臺晰奖,尤其是在移動平臺上的適用性更好谈撒,在Linux、Windows和Android匾南、以及iOS啃匿、macOS平臺上都可以使用GPU來部署模型。
框架特點:
- 支持卷積神經(jīng)網(wǎng)絡(luò)蛆楞,支持多輸入和多分支結(jié)構(gòu)溯乒,可計算部分分支
- 無任何第三方庫依賴,不依賴 BLAS/NNPACK 等計算框架
- 純 C++ 實現(xiàn)豹爹,跨平臺裆悄,支持 Android / iOS 等
- ARM Neon 匯編級良心優(yōu)化,計算速度極快
- 精細(xì)的內(nèi)存管理和數(shù)據(jù)結(jié)構(gòu)設(shè)計臂聋,內(nèi)存占用極低
- 支持多核并行計算加速光稼,ARM big.LITTLE CPU 調(diào)度優(yōu)化
- 支持基于全新低消耗的 Vulkan API GPU 加速
- 可擴展的模型設(shè)計,支持 8bit 量化和半精度浮點存儲孩等,可導(dǎo)入 caffe/pytorch/mxnet/onnx/darknet/keras/tensorflow(mlir) 模型
- 支持直接內(nèi)存零拷貝引用加載網(wǎng)絡(luò)模型
- 可注冊自定義層實現(xiàn)并擴展
使用方法:
[代碼示例]輸入數(shù)據(jù)并推理輸出:[https://github.com/Tencent/ncnn](https://mp.weixin.qq.com/s//wiki">https://github.com/Tencent/ncnn/wiki
\#include \<opencv2/core/core.hpp> \#include \<opencv2/highgui/highgui.hpp> \#include "net.h"
int main\(\)
\{
// opencv讀取輸入圖片
cv::Mat img = cv::imread\("image.ppm", CV\_LOAD\_IMAGE\_GRAYSCALE\);
int w = img.cols;
int h = img.rows;
// 減均值以及縮放操作艾君,最后輸入數(shù)據(jù)的值域為\[-1,1\]
ncnn::Mat in = ncnn::Mat::from\_pixels\_resize\(img.data, ncnn::Mat::PIXEL\_GRAY, w, h, 60, 60\);
float mean\[1\] = \{ 128.f \};
float norm\[1\] = \{ 1/128.f \};
in.substract\_mean\_normalize\(mean, norm\);
// 構(gòu)建NCNN的net,并加載轉(zhuǎn)換好的模型
ncnn::Net net;
net.load\_param\("model.param"\);
net.load\_model\("model.bin"\);
// 創(chuàng)建網(wǎng)絡(luò)提取器肄方,設(shè)置網(wǎng)絡(luò)輸入冰垄,線程數(shù),light模式等等
ncnn::Extractor ex = net.create\_extractor\(\);
ex.set\_light\_mode\(true\);
ex.set\_num\_threads\(4\);
ex.input\("data", in\);
// 調(diào)用extract接口扒秸,完成網(wǎng)絡(luò)推理播演,獲得輸出結(jié)果
ncnn::Mat feat;
ex.extract\("output", feat\);
return 0;
1.3 OpenVINO
簡介:
OpenVINO是一種可以加快高性能計算機視覺和深度學(xué)習(xí)視覺應(yīng)用開發(fā)速度的工具套件,支持各種英特爾平臺的硬件加速器上進行深度學(xué)習(xí)伴奥,并且允許直接異構(gòu)執(zhí)行写烤。OpenVINO?工具包是用于快速開發(fā)應(yīng)用程序和解決方案的綜合工具包,可解決各種任務(wù)拾徙,包括模擬人類視覺洲炊,自動語音識別,自然語言處理尼啡,推薦系統(tǒng)等暂衡。該工具包基于最新一代的人工神經(jīng)網(wǎng)絡(luò),包括卷積神經(jīng)網(wǎng)絡(luò)(CNN)崖瞭,循環(huán)和基于注意力的網(wǎng)絡(luò)狂巢,可在英特爾?硬件上擴展計算機視覺和非視覺工作負(fù)載,從而最大限度地提高性能书聚。它通過從邊緣到云的高性能唧领,人工智能和深度學(xué)習(xí)推理來加速應(yīng)用程序藻雌。
使用場景:
框架特點:
OpenVINO在模型部署前,首先會對模型進行優(yōu)化斩个,模型優(yōu)化器會對模型的拓?fù)浣Y(jié)構(gòu)進行優(yōu)化胯杭,去掉不需要的層,對相同的運算進行融合受啥、合并以加快運算效率做个,減少內(nèi)存拷貝;FP16滚局、INT8量化也可以在保證精度損失很小的前提下減小模型體積居暖,提高模型的性能。在部署方面核畴,OpenVIVO的開發(fā)也是相對比較簡單的膝但,提供了C、C++和python3種語言編程接口谤草。它最大的優(yōu)勢呢跟束,其實還是在Intel的不同硬件平臺上進行部署的時候,移植會很方便丑孩。推理引擎對不同的硬件提供統(tǒng)一的接口冀宴,底層實現(xiàn)直接調(diào)用硬件指令集的加速庫,應(yīng)用程序開發(fā)人員不需要關(guān)心底層的硬件實現(xiàn)温学,即可在不同的硬件平臺上加速模型推理略贮。
- 在邊緣啟用基于CNN的深度學(xué)習(xí)推理
- 支持通過英特爾?Movidius?VPU在英特爾?CPU,英特爾?集成顯卡仗岖,英特爾?神經(jīng)計算棒2和英特爾?視覺加速器設(shè)計之間進行異構(gòu)執(zhí)行
- 通過易于使用的計算機視覺功能庫和預(yù)先優(yōu)化的內(nèi)核加快上市時間
- 包括對計算機視覺標(biāo)準(zhǔn)(包括OpenCV *和OpenCL?)的優(yōu)化調(diào)用
使用方法:
[代碼示例]在應(yīng)用程序中實現(xiàn)典型的 OpenVINO? 運行推理:https://docs.openvino.ai/latest/openvino_docs_OV_UG_Integrate_OV_with_your_application.html
\#include \<openvino/openvino.hpp>
// 1.創(chuàng)建 OpenVINO? 核心以管理可用設(shè)備和讀取模型對象
ov::Core core;
// 2.為特定設(shè)備編譯模型
ov::CompiledModel compiled\_model = core.compile\_model\("model.onnx", "AUTO"\);
// 3.創(chuàng)建推理請求
ov::InferRequest infer\_request = compiled\_model.create\_infer\_request\(\);
// 4.設(shè)置輸入
// 獲取模型的輸入端口
auto input\_port = compiled\_model.input\(\);
// 從外部存儲器創(chuàng)建張量
ov::Tensor input\_tensor\(input\_port.get\_element\_type\(\), input\_port.get\_shape\(\), memory\_ptr\);
// 為模型設(shè)置一個輸入張量
infer\_request.set\_input\_tensor\(input\_tensor\);
// 5.開始推理
infer\_request.start\_async\(\);
infer\_request.wait\(\);
// 6.處理推理結(jié)果
// 通過tensor\_name獲取輸出張量
auto output = infer\_request.get\_tensor\("tensor\_name"\);
const float \\\*output\_buffer = output.data\<const float\>\(\);
// output\_buffer\[\] - 訪問輸出張量數(shù)據(jù)
// 7.釋放分配的對象(僅適用于C)
ov\_shape\_free\(\&input\_shape\);
ov\_tensor\_free\(output\_tensor\);
ov\_output\_const\_port\_free\(input\_port\);
ov\_tensor\_free\(tensor\);
ov\_infer\_request\_free\(infer\_request\);
ov\_compiled\_model\_free\(compiled\_model\);
ov\_model\_free\(model\);
ov\_core\_free\(core\);
// 為項目創(chuàng)建結(jié)構(gòu)
project/
├── CMakeLists.txt - CMake file to build
├── ... - Additional folders like includes/
└── src/ - source folder
└── main.cpp
build/ - build directory
...
// 創(chuàng)建 Cmake 腳本
cmake\_minimum\_required\(VERSION 3.10\)
set\(CMAKE\_CXX\_STANDARD 11\)
find\_package\(OpenVINO REQUIRED\)
add\_executable\(\$\{TARGET\_NAME\} src/main.cpp\)
target\_link\_libraries\(\$\{TARGET\_NAME\} PRIVATE openvino::runtime\)
// 構(gòu)建項目
cd build/
cmake ../project
cmake --build .
1.4 TensorRT
簡介:
NVIDIA TensorRT? 是用于高性能深度學(xué)習(xí)推理的 SDK逃延。此 SDK 包含深度學(xué)習(xí)推理優(yōu)化器和運行時環(huán)境,可為深度學(xué)習(xí)推理應(yīng)用提供低延遲和高吞吐量轧拄。
在推理過程中揽祥,基于 TensorRT 的應(yīng)用程序的執(zhí)行速度可比 CPU 平臺的速度快 40 倍。借助 TensorRT檩电,您可以優(yōu)化在所有主要框架中訓(xùn)練的神經(jīng)網(wǎng)絡(luò)模型拄丰,精確校正低精度,并最終將模型部署到超大規(guī)模數(shù)據(jù)中心料按、嵌入式或汽車產(chǎn)品平臺中载矿。
TensorRT 以 NVIDIA 的并行編程模型 CUDA 為基礎(chǔ)構(gòu)建而成恢准,可幫助您利用 CUDA-X 中的庫魂挂、開發(fā)工具和技術(shù),針對人工智能馁筐、自主機器坠非、高性能計算和圖形優(yōu)化所有深度學(xué)習(xí)框架中的推理炎码。
TensorRT 針對多種深度學(xué)習(xí)推理應(yīng)用的生產(chǎn)部署提供 INT8 和 FP16 優(yōu)化盟迟,例如視頻流式傳輸、語音識別歉闰、推薦和自然語言處理辖众。推理精度降低后可顯著減少應(yīng)用延遲,這恰巧滿足了許多實時服務(wù)和敬、自動和嵌入式應(yīng)用的要求变骡。
使用場景:
框架特點:
\1. 權(quán)重與激活精度校準(zhǔn)
通過將模型量化為 INT8 來更大限度地提高吞吐量,同時保持高準(zhǔn)確度
\2. 層與張量融合
通過融合內(nèi)核中的節(jié)點而克,優(yōu)化 GPU 顯存和帶寬的使用
\3. 內(nèi)核自動調(diào)整
基于目標(biāo) GPU 平臺選擇最佳數(shù)據(jù)層和算法
\4. 動態(tài)張量顯存
更大限度減少顯存占用日麸,并高效地為張量重復(fù)利用內(nèi)存
\5. 多流執(zhí)行
用于并行處理多個輸入流的可擴展設(shè)計
圖片取自TensorRT的官網(wǎng),里面列出了TensorRT使用的一些技術(shù)。可以看到模型量化摔刁、動態(tài)內(nèi)存優(yōu)化海蔽、層的融合等技術(shù)均已經(jīng)在TensorRT中集成了,這也是它能夠極大提高模型推斷速度的原因准潭。總體來說TensorRT將訓(xùn)練好的模型通過一系列的優(yōu)化技術(shù)轉(zhuǎn)化為了能夠在特定平臺(GPU)上以高性能運行的代碼域仇,也就是最后圖中生成的Inference Engine刑然。
使用方法:
1.導(dǎo)出模型
2.選擇批次大小
3.選擇精度
4.轉(zhuǎn)換模型:
- 使用 TF-TRT
- 從文件自動轉(zhuǎn)換 ONNX
- 使用 TensorRT API 手動構(gòu)建網(wǎng)絡(luò)(C++或python)
5.部署模型:
- 在 TensorFlow 中部署
- 使用獨立的 TensorRT 運行時 API
- 使用 NVIDIA Triton 推理服務(wù)器
具體模型轉(zhuǎn)換部署方法詳見:[Quick Start Guide :: NVIDIA Deep Learning TensorRT Documentation]:https://docs.nvidia.com/deeplearning/tensorrt/quick-start-guide/index.html
1.5 Mediapipe
簡介:
MediaPipe是一款由 Google Research 開發(fā)并開源的多媒體機器學(xué)習(xí)模型應(yīng)用框架。在谷歌暇务,一系列重要產(chǎn)品泼掠,如 YouTube、Google Lens垦细、ARCore择镇、Google Home 以及 Nest,都已深度整合了 MediaPipe括改。作為一款跨平臺框架腻豌,MediaPipe 不僅可以被部署在服務(wù)器端,更可以在多個移動端 (安卓和蘋果 iOS)和嵌入式平臺(Google Coral 和樹莓派)中作為設(shè)備端機器學(xué)習(xí)推理 (On-device Machine Learning Inference)框架嘱能。
除了上述的特性吝梅,MediaPipe 還支持 TensorFlow 和 TF Lite 的推理引擎(Inference Engine),任何 TensorFlow 和 TF Lite 的模型都可以在 MediaPipe 上使用惹骂。同時苏携,在移動端和嵌入式平臺,MediaPipe 也支持設(shè)備本身的 GPU 加速对粪。
使用場景:
框架特點:
- 端到端加速:內(nèi)置快速 ML 推理和處理右冻,即使在普通硬件上也能加速
- 一次構(gòu)建,隨處部署:統(tǒng)一解決方案適用于安卓著拭、iOS纱扭、桌面/云、Web 和物聯(lián)網(wǎng)
- 即用型解決方案:展示框架全部功能的尖端 ML 解決方案
- 免費和開源:Apache 2.0下的框架和解決方案茫死,完全可擴展和可定制
使用方法:
[代碼示例]以人臉檢測為例:https://google.github.io/mediapipe/solutions/face_detection
import cv2
import mediapipe as mp
mp\_face\_detection = mp.solutions.face\_detection
mp\_drawing = mp.solutions.drawing\_utils
\# 對于靜態(tài)圖像:
IMAGE\_FILES = \[\]
with mp\_face\_detection.FaceDetection\(
model\_selection=1, min\_detection\_confidence=0.5\) as face\_detection:
for idx, file in enumerate\(IMAGE\_FILES\):
image = cv2.imread\(file\)
\# 將BGR圖像轉(zhuǎn)換為RGB并使用MediaPipe人臉檢測對其進行處理.
results = face\_detection.process\(cv2.cvtColor\(image, cv2.COLOR\_BGR2RGB\)\)
\# 繪制每張人臉的人臉檢測.
if not results.detections:
continue
annotated\_image = image.copy\(\)
for detection in results.detections:
print\('Nose tip:'\)
print\(mp\_face\_detection.get\_key\_point\(
detection, mp\_face\_detection.FaceKeyPoint.NOSE\_TIP\)\)
mp\_drawing.draw\_detection\(annotated\_image, detection\)
cv2.imwrite\('/tmp/annotated\_image' + str\(idx\) + '.png', annotated\_image\)
\# 用于網(wǎng)絡(luò)攝像頭輸入:
cap = cv2.VideoCapture\(0\)
with mp\_face\_detection.FaceDetection\(
model\_selection=0, min\_detection\_confidence=0.5\) as face\_detection:
while cap.isOpened\(\):
success, image = cap.read\(\)
if not success:
print\("Ignoring empty camera frame."\)
\# 如果加載視頻跪但,請使用“中斷”而不是“繼續(xù)”.
continue
\# 若要提高性能他去,可以選擇將圖像標(biāo)記為不可寫以通過引用傳遞.
image.flags.writeable = False
image = cv2.cvtColor\(image, cv2.COLOR\_BGR2RGB\)
results = face\_detection.process\(image\)
\# 在圖像上繪制人臉檢測注釋.
image.flags.writeable = True
image = cv2.cvtColor\(image, cv2.COLOR\_RGB2BGR\)
if results.detections:
for detection in results.detections:
mp\_drawing.draw\_detection\(image, detection\)
\# 水平翻轉(zhuǎn)圖像以獲得自拍視圖顯示.
cv2.imshow\('MediaPipe Face Detection', cv2.flip\(image, 1\)\)
if cv2.waitKey\(5\) \& 0xFF == 27:
break
cap.release\(\)
2.框架對比
應(yīng)用平臺:
模型推理部署框架 | 應(yīng)用平臺 |
---|---|
NCNN | 移動端 |
OpenVINO | CPU,GPU饮亏,嵌入式平臺都可以使用慨绳,尤其是在CPU上首選OPenVINO。DepthAI嵌入式空間AI平臺被环。 |
TensorRT | 只能用在NIVDIA的GPU上的推理框架糙及。NIVDIA的Jetson平臺。 |
Mediapipe | 服務(wù)端筛欢,移動端浸锨,嵌入式平臺,TPU版姑。 |
研發(fā)單位:
- 騰訊公司開發(fā)的移動端平臺部署工具——NCNN柱搜;
- Intel公司針對自家設(shè)備開開發(fā)的部署工具——OpenVINO;
- NVIDIA公司針對自家GPU開發(fā)的部署工具——TensorRT剥险;
- Google針對自家硬件設(shè)備和深度學(xué)習(xí)框架開發(fā)的部署工具——Mediapipe聪蘸;
- 由微軟、亞馬遜 表制、Facebook 和 IBM 等公司共同開發(fā)的開放神經(jīng)網(wǎng)絡(luò)交換格式——ONNX健爬;
如何選擇:
- ONNXRuntime 是可以運行在多平臺 (Windows,Linux么介,Mac娜遵,Android,iOS) 上的一款推理框架壤短,它接受 ONNX 格式的模型輸入设拟,支持 GPU 和 CPU 的推理。唯一不足就是 ONNX 節(jié)點粒度較細(xì)鸽扁,推理速度有時候比其他推理框架如 TensorRT 較低蒜绽。
- NCNN是針對手機端的部署。優(yōu)勢是開源較早桶现,有非常穩(wěn)定的社區(qū)躲雅,開源影響力也較高。
- OpenVINO 是 Intel 家出的針對 Intel 出品的 CPU 和 GPU 友好的一款推理框架骡和,同時它也是對接不同訓(xùn)練框架如 TensorFlow相赁,Pytorch,Caffe 等慰于。不足之處可能是只支持 Intel 家的硬件產(chǎn)品钮科。
- TensorRT 針對 NVIDIA 系列顯卡具有其他框架都不具備的優(yōu)勢,如果運行在 NVIDIA 顯卡上婆赠, TensorRT 一般是所有框架中推理最快的绵脯。一般的主流的訓(xùn)練框架如TensorFlow 和 Pytorch 都能轉(zhuǎn)換成 TensorRT 可運行的模型。當(dāng)然了,TensorRT 的限制就是只能運行在 NVIDIA 顯卡上蛆挫,同時不開源 kernel赃承。
- MediaPipe 不支持除了tensorflow之外的其他深度學(xué)習(xí)框架。MediaPipe 的主要用例是使用推理模型和其他可重用組件對應(yīng)用機器學(xué)習(xí)管道進行快速原型設(shè)計悴侵。MediaPipe 還有助于將機器學(xué)習(xí)技術(shù)部署到各種不同硬件平臺上的演示和應(yīng)用程序中瞧剖,為移動、桌面/云可免、web和物聯(lián)網(wǎng)設(shè)備構(gòu)建世界級ML解決方案和應(yīng)用程序抓于。
3.小結(jié)
本文主要介紹了5種推理框架,目的是使大家更加直觀的了解這幾種框架的特點浇借,應(yīng)用場景以及如何選擇捉撮,為大家之后的學(xué)習(xí)提供有限的幫助,不足之處請大家多多指正妇垢。
參考資料