MATLAB环境下深度学习代码生成将推理模型部署到生产环境中
如今,深度学习已在商业领域普及,现实中对训练好的推理模型的应用,已可见于各行各业,但具体应用的开发仍大量依赖一些大公司的框架或产品。他们有些提供云端的接口,也有些提供基于安卓的智能终端上的apk,换句话说,核心其实并没有掌握在自己手里,想深度定制就难了。
而能够自行采用TensorRT、cuDNN或CUDA,或者利用IntelMKLDNN,又或者针对ARM的MaliGPU或Neon核实现深度学习应用的,与普遍存在的需求相比仍在少数。
原因可能是下面中的一条或多条:缺乏有相关编程经验的工程师目标平台不能用TensorRT,自己基于cuDNN或原生CUDA写太难了用TensorRT还能搞定NVIDIAGPU,ARM实在无能为力找来一套开源代码,BUG好多,动不动就死了,死了,了性能不达标但量化好坑,FP32的模型转FP16INT8可咋整有IntelXeon处理器没NVIDIAGPU,还得学MKLDNN框架
深度学习不仅训练要用到大量数据和算力,其推理也很耗计算资源,因此在实际应用中必须利用如MKLDNN、CUDA、ARMCompute等在支持张量计算的硬件如IntelXeon、NVIDIAGPU和ARMMali或Neon核上实现才能获得满足实际要求的性能。
假设我们有一个训练好的LSTM模型,存储在lstmnet。mat文件中,我们写了一个MATLAB函数lstmnetpredict。m来调用这个模型进行推理,如下:functionoutlstmnetpredict(in)
persistentmynet;
ifisempty(mynet)
mynetcoder。loadDeepLearningNetwork(lstmnet。mat);
end
outpredict(mynet,in);
采用以下脚本,即可为上述推理函数产生C代码。为代码生成进行配置
cfgcoder。gpuConfig(mex);
cfg。TargetLangC;
cfg。DeepLearningConfigcoder。DeepLearningConfig(cudnn);
定义目标函数的输入参数
matrixInputcoder。typeof(double(0),〔3Inf〕,〔falsetrue〕);
Runthecodegencommand。
codegenconfigcfglstmnetpredictargs{matrixInput}report
自动生成的C代码看起来是下面这个样子的:
事实上,通过修改代码生成配置,也就是下面这几行代码,我们就可以为不同的目标平台生成不同的代码了。为代码生成进行配置
cfgcoder。gpuConfig(mex);
cfg。TargetLangC;
cfg。DeepLearningConfigcoder。DeepLearningConfig(cudnn);
譬如,如果我们要基于TensorRT来生成嵌入式GPU(如JetsonNano)上跑的代码:为代码生成进行配置
cfgcoder。gpuConfig(lib);
cfg。TargetLangC;
cfg。GenCodeOnlytrue;
cfg。Hardwarecoder。hardware(NVIDIAJetson);
cfg。DeepLearningConfigcoder。DeepLearningConfig(tensorrt);
cfg。GpuConfig。ComputeCapability7。0;
cfg。DeepLearningConfig。DataTypefp16;
定义目标函数的输入参数
matrixInputcoder。typeof(double(0),〔3Inf〕,〔falsetrue〕);
Runthecodegencommand。
codegenconfigcfglstmnetpredictargs{matrixInput}report
这里,我们可以指定硬件平台与兼容版本,甚至通过增加一行DataType的配置就可以从默认的FP32转而生成FP16的推理代码了。
转成INT8稍微复杂一些,因为那不仅要防止溢出,还必须进行校验校准。以一个图像分类网络如mobilenetv2或resnet50为例,如果要产生INT8的代码,我们需要准备一个数据集用来在代码生成时进行校验校准,但代码生成时的配置其实也就是3行脚本:cfg。DeepLearningConfig。DataTypeint8;
cfg。DeepLearningConfig。DataPathcalibdataset;
cfg。DeepLearningConfig。NumCalibrationBatches50;
再譬如,如果要针对ARMNeon生成C代码,脚本如下:为代码生成进行配置
cfgcoder。config(lib);
cfg。TargetLangC;
cfg。GenCodeOnlytrue;
dlcfgcoder。DeepLearningConfig(armcompute);
dlcfg。ArmArchitecturearmv7;
dlcfg。ArmComputeVersion19。05;
cfg。DeepLearningConfigdlcfg;
cfg。Hardwarecoder。hardware(RaspberryPi);
定义目标函数的输入参数
matrixInputcoder。typeof(double(0),〔3Inf〕,〔falsetrue〕);
Runthecodegencommand。
codegenconfigcfglstmnetpredictargs{matrixInput}report
这里用到了ARMCompute库,我们不仅指定了ARM的架构版本,还指定了Compute库的版本。
给ARMNeon生成的代码看起来是这样子的:
面包多代码
https:mbd。puboGeBENHAGEN
此外,知乎付费咨询:哥廷根数学学派
擅长现代信号处理(改进小波分析系列,改进变分模态分解,改进经验小波变换,改进辛几何模态分解等等),改进机器学习,改进深度学习,机械故障诊断,改进时间序列分析(金融信号,心电信号,振动信号等)
把自己变成更强与更值得爱的人,唯一的办法,便是好好地爱自己爱一般不会老,它存着是指亘古不变的火苗和不灭的辉煌,全球的出现,便以为养分。这是一个充满着爱的路上,可生存在这一世界里大家,却仍然仍在寻找爱情的足迹。找寻,到底谁是谁最后的归宿?磕
人奋斗一生,最终的目的就是求得好死人来到这世上,奔波一生,或过得轰轰烈烈,或平淡无奇,最终的目的就是一个求得好死。古代的帝王,拥有四海,普天之下,莫非王土,但这些无所不能的帝王,有的从一出生就开始修陵墓,为的是求得
人生没有如果陪你从脆弱到坚强,我会一直在在生活中,我们常听到这样的声音如果早知道这样,当初就不这样做了,要是当时早答应了,结局会不会因此而不同?只可惜,人生没有如果,只有结果和后果生活也容不得
人老了才知道,这几种家庭内耗,原来是父母带来的俗语说家和万事兴,一个家庭唯有和睦共处,生活才会感到幸福美满,人人都会乐在其中。如果总是充满抱怨和争吵,那么就算家境富裕,不愁吃穿,也一样会感到苦闷无比。年轻的时候,也许我们涉世未
拼命努力工作的动力源泉你拼命努力工作的动力是什么我是六零后的人,生在贫穷的年代,看贯了旁人的白眼,尝尽了人生酸甜苦辣,在花季的年龄没有机会,没有快乐,没有梦想,只有痛苦,心里唯一的念头就是勇敢的活下去,
我来人间一趟人为什么是人?人有感情,所以是人!那人活着的意义到底是什么?对于普通人来说活着的意义可能只是把养我的人养到老,把我要养的人养到大!对于大心胸,大智慧的人来说他们活着的意义是改变世界
泰山游记格律诗文登上泰山,是我多年的夙愿,2015年的夏天,工程项目把我带到了地齐鲁大地山东的荷泽,距泰山近在咫尺。夏日里的一天,我们驱车朝着向往已久的泰山进发。在前往泰安城的路上,沿街看
拒绝签约,再见篮网!他让杜兰特受益匪浅,但你问题出在自己身上几乎没有人能想到,篮网在经历了无比混乱且动荡的一周之后,他们可以度过一个完美的周末。两场团队式的胜利让篮网全队上下有了喘息的机会,欧文的闹剧从比赛哨声响起之后被抛到了脑后,西蒙斯缺
鸿蒙智联生态蓬勃发展,成为个人智能化与空间智能化的底座11月4日,第四届华为开发者大会(Together)拉开帷幕。本届大会以创新照见未来为主题,汇聚智能家居智慧办公影音娱乐智慧出行运动健康五大场景下的创新体验。在大会主题演讲上,华为
视频超燃!6年,这组数据诠释比亚迪崛起视频加载中视频超燃!6年,这组数据诠释比亚迪龙头崛起不经意间,在10月的中国新能源汽车市场,比亚迪的销量已接近特斯拉中国的3倍。11月3日晚间,比亚迪发布的10月产销快报显示,10
贸易数字化促进跨境电商发展论坛在第五届进博会举办中国小康网讯记者金朝晖上海报道11月7日,第五届中国国际进口博览会配套现场活动2022贸易数字化促进跨境电商发展论坛在上海国家会展中心举办,论坛由中国电子商会联合国国际贸易中心联合