版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用ONNXRuntime推理模简官方网站ONNXRuntime(ORT)是机器学习模型的加速器,具有多平台支持和灵活的接口,可与特定于硬件的库集成。ONNXRuntime可与来自PyTorch、Tensorflow/Keras、TFLite、scikit-learn的模型一起使用。ONNXRuntime是针对ONNX模型的以性能为中心的引擎,可在多个平台和硬件(Windows,Linux和Mac以及CPU和GPU上)高效地进行推理。ONNX型号的性能。ONNX运行时推理为Office、Azure、Bing以及数十个社区项目的关键Microsoft产品和服务中的提高各种ML模型的推理性能;在Python中训练但部署到C#/C++/Java应用程序中;基本使用方参考使用前先准备一个onnx的模型,参考Pytorch的官方教程,运行export_onnx_model.py文件(在2.2.3Pytorch官方示例小节中找到)中的export_onnx_model()函数,可以导出ONNX模型super_resolution.onnx。该模型接收形状为[batch_size,1、224、224]的输入,输出形状为[1,1,672,672]注:[batch_size,1、224、224]表示batch_size张通道数为1、高度为224,宽度为224本篇文章仅讲述ONNXRT的使用,不讲述Pytorch导出过程。Python使 ONNXRuntime提供Python接口。根据ONNXRT的官方文档(PythonAPI页面),ONNXRuntime兼容的Python版本为Python3.6-3.9,注意安装匹配的Python版本。调用ONNXRuntime的Python接口需要安装onnxruntime的CPU版或GPU版,安装命令如下$$pipinstall$pipinstallonnxruntime-注:在查阅资料时发现CPU版可能和GPU进行尝试。ONNXRuntime的Python接口进行推理主要分三步导入onnxruntime包创建InferenceSession,参数为需要进行推理的onnx义见下面的InferenceSession小节;用run方法进行推理,参数为输出列的名称list和输入的名称-输入值的dict,输入值的形状与模型能接受的形状相同,其他参数的含义见下面的Session.run小节。返回值是一个由ndarray组成的list,形如[array([[[...]]]),array([[[...]]]),...],array的形状应该(待测)与importimportsess=output=sess.run([output_name,...],{input_name:input_valueInferenceSession继承自Session类,包括初始化参数及其含义,具体定义如下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得来的,在此处调用了C函数,其源码在onnxruntime\onnxruntime\python\onnxruntime_pybind_state.cc此处不再展开。注:onnxruntime调用C语言fromonnxruntime.capiimport_pybind_stateasCrun方法的参数为输出列的列名,输入名和值的字典以及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方法的定义中发现run方法是self.sess.run()的外壳,run方法的返回值实际上是self.sess.run()的返回值,它们参数相同。Pytorch官方示SuperResolution模型论文Pytorch官方使用SuperResolution模型(低分辨率图像恢复成高分辨率图像),示例文件包括导出ONNX模型、验证ONNX模型、使用ONNX在./python_demo/super_resolution/export_onnx_model.py文件中。官方教程的Jupyter版本可在第5节参考资料中的[1]和[2]中获取。原始图片运行export_onnx_model.py运行export_onnx_model.py$python3运行结果如下FastNeuralStyleTransfer-FNSCandy:/jcjohnson/fast-neural-在./python_demo/fns_candy/export_onnx_model.py将图片转换为目标图片的风格。此示例用于比较Python接口推理和C++果转换成的图像与2.3.2节中大致相同,有微小差别,由在./python_demo/fns_candy/export_onnx_model.py原始图片运行export_onnx_model.py运行export_onnx_model.py$python3运行结果官方文档写的较为详细,具体使用方法可参考Python文档地址C/C++使 ONNXRuntime是微软推出的,优先适用于Windows系统,推荐使用VisualStudio供了一个在Linux下能够运行的C语言示例,示例地址如上。C环境使用ONNXRuntime的流程基本如下包含调用创建Session:OrtCreateSession(env,model_uri,添加更多的运行设备(Provider,如CPU、CUDA),如,对于CUDA来说,使创建张量(Tensor):1)OrtCreateMemoryInfo2)运行模型:OrtRun安装snap官方网站ONNXRuntime需求cmake(version>=3.13),需要安装cmake(个人不推荐任何工具包用源码安装,坑巨多无比,有简单方式就用简单方式)。所以我们使用snap命令安装cmake。Snap是Canonical推出的一种新的软件打包格式,彻底解决linux依赖性的问题,Snap更加稳定和安全的特性。snap预装在ubuntu18.0.4及更高版本中,在CentOS和Debian中没有预装,可在CentOS中同故宫以下命令安装snap:$$sudoyuminstall安装cmake的snap命令如下$$sudosnapinstall查看版本$$cmake--卸载$$sudosnapremove$hash-安装ONNX从GithubRelease页面(仓库页面右侧栏Releases)的Assets中下载所需版本:https://gi/microsoft/onnxruntime/releases,我们这里下载onnxruntime-linux-x64-1.10.0.tgz(可以在后文中的Github地址中一并下载),然后解压tar压缩解压缩命令详解$$tarxfonnxruntime-linux-x64-解压后将解压得到的库文件移动到动态链接库搜索目录/usr/local/libcp命令-r复制该目录下的所有子目录和文-f覆盖已经存在的目标文件而不给出提-v详细显示命令执行的操$$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#让动态链接库能够为系统共享,在默认搜索目录及动态库配置文件/etc/ld.so.conf内所列的目录下搜索可共享的动态链接库(<lib_name>.so),$$sudo快速开始:FastNeuralStyleTransfer示例为ONNXRuntimeC语言官方示例,运行环境为CentOS8,onnxruntime-linux-1.10.0,使用FNSCandy模型,该模型将图片转换为FNSCandy风格的图片示例编译和运行步需要按照2.3.1节安装好所需组件示例需要libpng,从示例地址给出的链接下载libpng.zip,解压后将文件移动到动态链接$$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文件中已经没有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,使源代码路径保持干净,编译出来的内容都在build目录下。运行下列命令,创建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>根据README.md,下载模型candy.onnx放入./model目录下,随便下载一张图片,设置图片大小为720*720,放入./img目录下,使用fns_candy_style_transfer进行推理。$.$./fns_candy_style_transfer./model/candy.onnx./output/photo_infer.png原图推理结果CAPI文档:https://onnxruntime.ai/docs/api/c/index.htmlPython文档比较有条理,容易理解,可以参照Python文档了解ONNXRuntime的基本用法,对相应内容理解C文档不同输入时调用Run。默认每个会话一个线程池,也可以跨会话共享全局线程池。多个线程中对同一个session调用run方法是线程安全的。ONNXRuntime提供内存管理接口,包括以下几种功能。全局/会话(以推断不同模型),将得到每个会话创建的多个线程池,从而导致效率低下。ONNXRuntime为此引入全局/共享线程池的新功能,可跨多个会话共享一组全局线程池,其典型用法如下:设置ThreadingOptions,ORT中默认值为0用CreateEnvWithGlobalThreadPools()创建环境创建Session并调用sessionoption对象 方法调 在会话(session)间共享分配器(allocator):允许同一进程中的多个会话使用相同的分配(allocator)。例如,在同一个进程中有多个session,其内存使用率很高的原因之一可能是:在默认情况下,每个session基于arena创建自己的CPU分配器。ORT实现了基于DougLea的最佳优先合并算法(DougLea’sbest-firstwithcoalescingalgorithm)的Arena分配器的简化版本。每个会话包含一个分配器,它在初始化期间分配一个大的内存区域,然后根据分配/分块、合并和扩展。超时后,arena以每个会话中未使用的内存块结束,且arena还给系统,一旦分配,它总是保持分配状态。当使用多个会话(每个会话都有自己的arena)时,这些因素会增加进程的整体内存消耗。因此,在会话之间共享arena分配器变得很重要。内存arena:默认情况下,内存arena不会缩小(将未使用的内存返回给系统)户以某种节奏”缩小”arena。目前,唯一支持的节奏是在每个Run()结束时,如果使用此功能,则扫描arena内存以在每个Run()结束时释放未使用的内存。该功能通过RunOptio
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河北农业大学现代科技学院《试验设计与数据处理实验》2023-2024学年第一学期期末试卷
- 2024年二手房转让合同中的违约金计算方式3篇
- 雇人拆迁劳务合同范本
- 买卖合同范文
- 2024版工程居间劳动用工合同3篇
- 洗车店转让合同
- 基于虚拟现实的文化旅游项目开发与运营合同(2024版)
- 2024年度股权转让与投资合同协议3篇
- 2024年度版权许可合同的许可范围与使用限制3篇
- 护士个人劳动合同
- 编程学徒合同协议书(2篇)
- 2024-2025学年人教版数学六年级上册 第五单元圆单元测试(含答案)
- 2024年资格考试-WSET二级认证考试近5年真题附答案
- 大药房《质量管理体系文件》-管理制度
- 2024至2030年中国空气主轴(气浮主轴)行业深度分析及发展趋势研究预测报告
- 食品风味研究专题智慧树知到期末考试答案章节答案2024年中国农业大学
- 碳汇经济与美丽中国智慧树知到期末考试答案章节答案2024年东北林业大学
- 16J914-1 公用建筑卫生间
- 短视频的拍摄与剪辑
- 如何做好家园共育工作
- GB∕T 40112-2021 地质灾害危险性评估规范
评论
0/150
提交评论