版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
使用ONNXRuntime推理模簡官方網(wǎng)站ONNXRuntime(ORT)是機器學習模型的加速器,具有多平臺支持和靈活的接口,可與特定于硬件的庫集成。ONNXRuntime可與來自PyTorch、Tensorflow/Keras、TFLite、scikit-learn的模型一起使用。ONNXRuntime是針對ONNX模型的以性能為中心的引擎,可在多個平臺和硬件(Windows,Linux和Mac以及CPU和GPU上)高效地進行推理。ONNX型號的性能。ONNX運行時推理為Office、Azure、Bing以及數(shù)十個社區(qū)項目的關鍵Microsoft產(chǎn)品和服務中的提高各種ML模型的推理性能;在Python中訓練但部署到C#/C++/Java應用程序中;基本使用方參考使用前先準備一個onnx的模型,參考Pytorch的官方教程,運行export_onnx_model.py文件(在2.2.3Pytorch官方示例小節(jié)中找到)中的export_onnx_model()函數(shù),可以導出ONNX模型super_resolution.onnx。該模型接收形狀為[batch_size,1、224、224]的輸入,輸出形狀為[1,1,672,672]注:[batch_size,1、224、224]表示batch_size張通道數(shù)為1、高度為224,寬度為224本篇文章僅講述ONNXRT的使用,不講述Pytorch導出過程。Python使 ONNXRuntime提供Python接口。根據(jù)ONNXRT的官方文檔(PythonAPI頁面),ONNXRuntime兼容的Python版本為Python3.6-3.9,注意安裝匹配的Python版本。調(diào)用ONNXRuntime的Python接口需要安裝onnxruntime的CPU版或GPU版,安裝命令如下$$pipinstall$pipinstallonnxruntime-注:在查閱資料時發(fā)現(xiàn)CPU版可能和GPU進行嘗試。ONNXRuntime的Python接口進行推理主要分三步導入onnxruntime包創(chuàng)建InferenceSession,參數(shù)為需要進行推理的onnx義見下面的InferenceSession小節(jié);用run方法進行推理,參數(shù)為輸出列的名稱list和輸入的名稱-輸入值的dict,輸入值的形狀與模型能接受的形狀相同,其他參數(shù)的含義見下面的Session.run小節(jié)。返回值是一個由ndarray組成的list,形如[array([[[...]]]),array([[[...]]]),...],array的形狀應該(待測)與importimportsess=output=sess.run([output_name,...],{input_name:input_valueInferenceSession繼承自Session類,包括初始化參數(shù)及其含義,具體定義如下classclassThisisthemainclassusedtorunamodel.definit(self,path_or_bytes,sess_options=None,providers=None,:parampath_or_bytes:filenameorserializedONNXorORTformatmodelinabytestring:paramsess_options:session:paramproviders:Optionalsequenceofprovidersinorderofdecreasingprecedence.Valuescaneitherbeprovidernamesortuplesof(providername,optionsdict).Ifnotprovided,thenallavailableprovidersareusedwiththedefaultprecedence.:paramprovider_options:OptionalsequenceofoptionsdictstotheproviderslistedinThemodeltypewillbeinferredunlessexplicitlysetintheToexplicitlyso=onnxruntime.SessionOptions()so.add_session_config_entry('session.load_model_format','ONNX')orso.add_session_config_entry('session.load_model_format','ORT')orAfileextensionof'.ort'willbeinferredasanORTformatmodel.AllotherfilenamesareassumedtobeONNXformatmodels.
'providers'cancontaineithernamesornamesandoptions.Whenanyaregivenin'providers','provider_options'shouldnotbeused.Thelistofprovidersisorderedbyprecedence.Forexample['CUDAExecutionProvider','CPUExecutionProvider']meansexecuteanodeusingCUDAExecutionProviderifcapable,otherwiseexecuteusingCPUExecutionProvider.Session.initifisinstance(path_or_bytes,str):self._model_path=path_or_bytesself._model_bytes=Noneself._model_path=Noneself._model_bytes=path_or_bytes#TODO:Thisisbadaswe'reholdingthememoryindefinitelyraiseTypeError("Unabletoloadfromtypeself._sess_options=sess_optionsself._enable_fallback=Trueself._read_config_from_model=os.environ.get('ORT_LOAD_CONFIG_FROM_MODEL')==self._create_inference_session(providers,exceptifprint("EPErrorusing{}".format(self._providers))print("Fallingbackto{}andself._create_inference_session(self._fallback_providers,None)#Fallbackonlyonce.available_providers=C.get_available_providers()#validateprovidersandprovider_optionsbeforeotherinitializationproviders,provider_options=#TensorrtcanfallbacktoCUDA.AllothersfallbacktoCPU.if'TensorrtExecutionProvider'inavailable_providers:self._fallback_providers=session_options=self._sess_optionsifself._sess_optionselseifsess=C.InferenceSession(session_options,self._model_path,True,sess=C.InferenceSession(session_options,self._model_bytes,False,#initializetheC++InferenceSessionsess.initialize_session(providers,provider_options)self._sess=self._inputs_meta=self._sess.inputs_metaself._outputs_meta=self._sess.outputs_metaself._model_meta=self._sess.model_metaself._providers=self._sess.get_providers()self._provider_options=self._sess.get_provider_options()self._profiling_start_time_ns=def_reset_session(self,providers,provider_options):"releaseunderlyingsessionobject."#metadatareferencessessioninternal#sotheymustbesettoNonetodecrement_sessreferencecount.self._sess_options=Noneself._inputs_meta=Noneself._outputs_meta=Noneself._model_meta=Noneself._providers=Noneself._provider_options=Noneself._profiling_start_time_ns=None#createanewC.InferenceSessionself._sess=Noneself._sess_options=self._sess_options_initialself._create_inference_session(providers,provider_options)從上面代碼可以看出在初始化步驟中,self._sess的值是從C.InferenceSession得來的,在此處調(diào)用了C函數(shù),其源碼在onnxruntime\onnxruntime\python\onnxruntime_pybind_state.cc此處不再展開。注:onnxruntime調(diào)用C語言fromonnxruntime.capiimport_pybind_stateasCrun方法的參數(shù)為輸出列的列名,輸入名和值的字典以及run_options(這里不展開,可參考onnxruntime.RunOptions)。run方法定義在Session類中https://onnxruntime.ai/docs/api/pythodefdefrun(self,output_names,input_feed,run_options=None):Computethe:paramoutput_names:nameofthe:paraminput_feed:dictionary``{input_name:input_value:paramrun_options:Seesess.run([output_name],{input_name:num_inputs=len(input_feed)#thegraphmayhaveoptionalinputsusedtooverrideinitializers.allowforthat.ifnum_inputs<raiseValueError("Modelrequires{}inputs.InputFeed{}".format(num_required_inputs,num_inputs))ifnotoutput_names:output_names=[foroutputinexceptC.EPFailaserr:ifprint("EPError:{}using{}".format(str(err),self._providers))print("Fallingbackto{}and#Fallbackonlyonce.可以從run方法的定義中發(fā)現(xiàn)run方法是self.sess.run()的外殼,run方法的返回值實際上是self.sess.run()的返回值,它們參數(shù)相同。Pytorch官方示SuperResolution模型論文Pytorch官方使用SuperResolution模型(低分辨率圖像恢復成高分辨率圖像),示例文件包括導出ONNX模型、驗證ONNX模型、使用ONNX在./python_demo/super_resolution/export_onnx_model.py文件中。官方教程的Jupyter版本可在第5節(jié)參考資料中的[1]和[2]中獲取。原始圖片運行export_onnx_model.py運行export_onnx_model.py$python3運行結(jié)果如下FastNeuralStyleTransfer-FNSCandy:/jcjohnson/fast-neural-在./python_demo/fns_candy/export_onnx_model.py將圖片轉(zhuǎn)換為目標圖片的風格。此示例用于比較Python接口推理和C++果轉(zhuǎn)換成的圖像與2.3.2節(jié)中大致相同,有微小差別,由在./python_demo/fns_candy/export_onnx_model.py原始圖片運行export_onnx_model.py運行export_onnx_model.py$python3運行結(jié)果官方文檔寫的較為詳細,具體使用方法可參考Python文檔地址C/C++使 ONNXRuntime是微軟推出的,優(yōu)先適用于Windows系統(tǒng),推薦使用VisualStudio供了一個在Linux下能夠運行的C語言示例,示例地址如上。C環(huán)境使用ONNXRuntime的流程基本如下包含調(diào)用創(chuàng)建Session:OrtCreateSession(env,model_uri,添加更多的運行設備(Provider,如CPU、CUDA),如,對于CUDA來說,使創(chuàng)建張量(Tensor):1)OrtCreateMemoryInfo2)運行模型:OrtRun安裝snap官方網(wǎng)站ONNXRuntime需求cmake(version>=3.13),需要安裝cmake(個人不推薦任何工具包用源碼安裝,坑巨多無比,有簡單方式就用簡單方式)。所以我們使用snap命令安裝cmake。Snap是Canonical推出的一種新的軟件打包格式,徹底解決linux依賴性的問題,Snap更加穩(wěn)定和安全的特性。snap預裝在ubuntu18.0.4及更高版本中,在CentOS和Debian中沒有預裝,可在CentOS中同故宮以下命令安裝snap:$$sudoyuminstall安裝cmake的snap命令如下$$sudosnapinstall查看版本$$cmake--卸載$$sudosnapremove$hash-安裝ONNX從GithubRelease頁面(倉庫頁面右側(cè)欄Releases)的Assets中下載所需版本:https://gi/microsoft/onnxruntime/releases,我們這里下載onnxruntime-linux-x64-1.10.0.tgz(可以在后文中的Github地址中一并下載),然后解壓tar壓縮解壓縮命令詳解$$tarxfonnxruntime-linux-x64-解壓后將解壓得到的庫文件移動到動態(tài)鏈接庫搜索目錄/usr/local/libcp命令-r復制該目錄下的所有子目錄和文-f覆蓋已經(jīng)存在的目標文件而不給出提-v詳細顯示命令執(zhí)行的操$$sudocp-rfvonnxruntime-linux-x64-1.10.0/include/*$sudocp-rfvonnxruntime-linux-x64-1.10.0/lib/*由于在步驟(2)中的共享目錄是/usr/local/lib,所以需要把共享目錄加入到共享配置文件/etc/ld.so.conf中,配置命令如下(如果(2)中目錄是/lib或/usr/lib則可以跳過此步):"errorwhileloadingsharedlibraries:xxx.so.x"錯誤的原因和解決辦法:/##catincludeld.so.conf.d/*.conf(這一行是輸出,不是命令)#echo"/usr/local/lib">>/etc/ld.so.conf#讓動態(tài)鏈接庫能夠為系統(tǒng)共享,在默認搜索目錄及動態(tài)庫配置文件/etc/ld.so.conf內(nèi)所列的目錄下搜索可共享的動態(tài)鏈接庫(<lib_name>.so),$$sudo快速開始:FastNeuralStyleTransfer示例為ONNXRuntimeC語言官方示例,運行環(huán)境為CentOS8,onnxruntime-linux-1.10.0,使用FNSCandy模型,該模型將圖片轉(zhuǎn)換為FNSCandy風格的圖片示例編譯和運行步需要按照2.3.1節(jié)安裝好所需組件示例需要libpng,從示例地址給出的鏈接下載libpng.zip,解壓后將文件移動到動態(tài)鏈接$$sudocp-rfvlibpng/include/*$sudocp-rfvlibpng/*/usr/local/lib/#cat/etc/ld.so.conf#echo"/usr/local/lib">>$sudo將fns_candy_style_transfer.c中o.cudnn_conv_algo_search=EXHAUSTIVE句中的EXHAUSTIVE修改為OrtCudnnConvAlgoSearchExhaustive,因為1.10.0版本的onnxruntime_c_api.h文件中已經(jīng)沒有EXHAUSTIVE。//////o.cudnn_conv_algo_search=EXHAUSTIVE;運行步驟(4-1)或步驟(4-cmake和CMakeLists.txt的學習怎么寫自己的(4-1)安裝好后從示例地址下載源碼fns_candy_style_transfer.c、README.mdCMakeLists.txt,將CMakeLists.txt修改如下set(CMAKE_CXX_STANDARD11)add_executable(fns_candy_style_transfer"fns_candy_style_transfer.c")target_include_directories(fns_candy_style_transferPRIVATEtarget_link_directories(fns_candy_style_transferPRIVATE${PNG_LIBDIR})其中PROJECT_BINARY_DIR=全路徑/build,PROJECT_SOURCE_DIR=全路徑/src,使源代碼路徑保持干凈,編譯出來的內(nèi)容都在build目錄下。運行下列命令,創(chuàng)建build目錄,進入build目錄,并編譯文件$$mkdirbuild&&cd$cmake(4-2)不喜歡Cmake,也可以直接運行下列命令編譯官方示例gccgcc-ofns_candy_style_transferfns_candy_style_transfer.c-lonnxruntime-運行./fns_candy_style_transfer,命令和輸出如下$$usage:<model_path><input_file><output_file>根據(jù)README.md,下載模型candy.onnx放入./model目錄下,隨便下載一張圖片,設置圖片大小為720*720,放入./img目錄下,使用fns_candy_style_transfer進行推理。$.$./fns_candy_style_transfer./model/candy.onnx./output/photo_infer.png原圖推理結(jié)果CAPI文檔:https://onnxruntime.ai/docs/api/c/index.htmlPython文檔比較有條理,容易理解,可以參照Python文檔了解ONNXRuntime的基本用法,對相應內(nèi)容理解C文檔不同輸入時調(diào)用Run。默認每個會話一個線程池,也可以跨會話共享全局線程池。多個線程中對同一個session調(diào)用run方法是線程安全的。ONNXRuntime提供內(nèi)存管理接口,包括以下幾種功能。全局/會話(以推斷不同模型),將得到每個會話創(chuàng)建的多個線程池,從而導致效率低下。ONNXRuntime為此引入全局/共享線程池的新功能,可跨多個會話共享一組全局線程池,其典型用法如下:設置ThreadingOptions,ORT中默認值為0用CreateEnvWithGlobalThreadPools()創(chuàng)建環(huán)境創(chuàng)建Session并調(diào)用sessionoption對象 方法調(diào) 在會話(session)間共享分配器(allocator):允許同一進程中的多個會話使用相同的分配(allocator)。例如,在同一個進程中有多個session,其內(nèi)存使用率很高的原因之一可能是:在默認情況下,每個session基于arena創(chuàng)建自己的CPU分配器。ORT實現(xiàn)了基于DougLea的最佳優(yōu)先合并算法(DougLea’sbest-firstwithcoalescingalgorithm)的Arena分配器的簡化版本。每個會話包含一個分配器,它在初始化期間分配一個大的內(nèi)存區(qū)域,然后根據(jù)分配/分塊、合并和擴展。超時后,arena以每個會話中未使用的內(nèi)存塊結(jié)束,且arena還給系統(tǒng),一旦分配,它總是保持分配狀態(tài)。當使用多個會話(每個會話都有自己的arena)時,這些因素會增加進程的整體內(nèi)存消耗。因此,在會話之間共享arena分配器變得很重要。內(nèi)存arena:默認情況下,內(nèi)存arena不會縮?。▽⑽词褂玫膬?nèi)存返回給系統(tǒng))戶以某種節(jié)奏”縮小”arena。目前,唯一支持的節(jié)奏是在每個Run()結(jié)束時,如果使用此功能,則掃描arena內(nèi)存以在每個Run()結(jié)束時釋放未使用的內(nèi)存。該功能通過RunOptio
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026江西南昌市社會福利院招聘2人備考題庫有完整答案詳解
- 2026江西景德鎮(zhèn)市專業(yè)森林消防支隊招聘9人備考題庫及答案詳解1套
- 2026上半年貴州事業(yè)單位聯(lián)考婦聯(lián)招聘1人備考題庫完整參考答案詳解
- 2026上半年貴州事業(yè)單位聯(lián)考貴州科學院招聘1人備考題庫及參考答案詳解一套
- 2026年西雙版納州勐臘縣事業(yè)單位考核招聘急需緊缺人才備考題庫(37人)及答案詳解一套
- 2026江蘇蘇州數(shù)智科技集團有限公司下屬子公司招聘34人備考題庫(第一批)及1套參考答案詳解
- 2025廣東惠州市龍川縣事業(yè)單位集中招聘工作人員面試備考題庫帶答案詳解
- 2025員工三級安全教育培訓試卷及答案
- 管線開挖回填施工方案
- 綠色建筑施工方案
- (2025年)軍隊文職考試面試真題及答案
- 新版-八年級上冊數(shù)學期末復習計算題15天沖刺練習(含答案)
- 制造部年終總結(jié)
- DB51-T 192-2024 公園城市綠色景觀圍墻營建指南
- 《食品標準與法規(guī)》課件全套 第1-6章 緒論-食品生產(chǎn)經(jīng)營許可和認證管理
- JBT 7562-2016 YEZX系列起重用錐形轉(zhuǎn)子制動三相異步電動機 技術條件
- 建筑工地安全形勢分析
- 【拼多多公司盈利能力探析11000字(論文)】
- 區(qū)域地質(zhì)調(diào)查及填圖方法
- 新生兒疫苗接種的注意事項與應對措施
- 膿毒癥休克患者的麻醉管理
評論
0/150
提交評論