从MATLAB R2018b开始,如何部署深度学习网络用于硬件在环(HIL)仿真,例如Speedgoat或dSPACE硬件系统?

44次浏览(过去30天)
我想从我的keras深度学习神经元网络生成纯代码,以避免对第三方库的依赖。我在MATLAB R2021a中做这个。
在此之后,我想在MATLAB R2017b中构建一个S-Function用于在一个模型中使用,用于在HIL中部署,它是在MATLAB R2017b中设置的。推荐的工作流程是什么?

接受的答案

MathWorks支金宝app援小组
编辑:MathWorks支金宝app援小组 2021年6月9日
在HIL仿真中部署深度学习网络的工作流包括三个步骤:
  1. 首先,根据你的目标硬件,为你的深度学习网络生成使用第三方库(如cuDNN)的CUDA代码。或者,从R2021a开始,您可以为您的深度学习网络生成不使用第三方库的通用C/ c++代码。如果您通常使用第三方库处理深度学习网络,但希望在当前工作流中避免使用它们,则泛型代码生成是有用的。
  2. 在为网络生成代码之后,第二步是将生成的代码合并到主模型中,例如,通过使用s函数。
  3. 最后,为整个Simulink模型生成代码,并将其部署到HIL中。金宝app
下面几节将更详细地描述这些步骤。
(1)深度学习网络代码生成:
生成使用第三方库的c++ CUDA代码:
从MATLAB R2018b开始,您可以为使用第三方库的预训练深度学习网络生成c++ CUDA代码。要做到这一点,在MATLAB代码中,使用coder.loadDeepLearningConfig函数加载目标库。
在Simulink中直接生成c++ CUDA代码:金宝app
从MATLAB R2020b开始,您可以使用MATLAB函数块或深度神经网络块库直接在Simulink中为深度学习模型生成代码。金宝appGPU Coder为在Simulink模型中使用这些块实现的深度学习网络生成优化的代码。金宝app
如果使用MATLAB函数块,则编写MATLAB代码,通过使用编码器加载预先训练好的深度学习网络。loadDeepLearningNetwork函数。
控件中的预测和图像分类器块深度神经网络图书馆。
对于这两种类型的块,您可以使用Simulink Coder或Embedded Coder生成代码。金宝app
生成不使用第三方库的通用C/ c++代码:
从R2021a开始,您可以为深度学习网络生成不使用第三方库的普通C/ c++代码。为此,将DeepLearningConfig代码配置属性设置为:
cfg。DeepLearningConfig =编码器。DeepLearningConfig (“TargetLibrary”“没有”);
但是,如果您的目标是将深度学习神经元网络的生成代码(无论是CUDA还是纯代码)插入到旧的MATLAB版本中的Simulink模型中,例如在MATLAB R2017b中,建议从整个深度学习网络生成一个DLL,而不是一个MEX:金宝app
%使用嵌入式编码器生成独立的C动态库作为嵌入式代码
CFG = code .config(“dll”);
cfg。TargetLang =“C”
cfg。DeepLearningConfig =编码器。DeepLearningConfig (“没有”);%“none”,因为生成的是纯代码
(2)将生成的代码合并到Simulink模型中:金宝app
合并使用第三方库的c++ CUDA代码:如上所述,从R2020b开始,您可以直接在Simulink中使用深度学习网络。金宝app如果你想将CUDA代码用于深度学习网络以外的算法,Simulink块目前不支持GPU代码。金宝app金宝app但是,您可以通过生成动态链接库来将CUDA代码引入Simulink,该库仍然金宝app使用gpu的性能,并使用遗留代码工具将该库作为s函数实现到Simulink模型中。看到将深度学习与GPU Coder集成到Simulink中金宝app
合并不使用第三方库的通用C/ c++代码:如果您生成普通的C/ c++代码,请使用以下任何一个实用程序将这些代码合并到您的主要Simulink模型中金宝app
  • C调用块-通过导入C函数将C代码集成到Simulink中。金宝app
  • C函数块——集成和调用来自Simulink模型的外部C代码。金宝app
  • S-Function -使用称为S-Function API的特殊语法与Simulink引擎通信。金宝app它们允许您创建连续的、离散的和混合的系统。
  • S-Function Builder -通过从您提供的规范代码中构建S-Function来集成C/ c++代码。s函数构建器还充当模型中生成的s函数的包装器。
  • 遗留代码工具-集成C/ c++函数,如查找表,通用函数和接口到Simulink模型中。金宝app
有关这些方法的更多信息,请参见使用C/ c++代码实现算法
您还可以将为深度神经网络生成的代码(无论是CUDA还是普通C/ c++)合并到旧的MATLAB版本中的Simulink模型中,例如MATLAB R2017b。金宝app
为此,建议使用遗留代码工具集成DLL中生成的C函数(来自上述示例)。在下一节中,将描述创建相应s函数所需的步骤。该工作流记录在使用遗留代码工具集成C函数
在这里,重要的是要考虑“OutputFcnSpec”的正确定义,以便获得一个可行的s函数。此属性需要包含在生成DLL中的函数头文件的签名:
头文件中的签名如下:
浮动Predict_NN_MAT(双dki,双lki,双tki,双nab,双实验室,双标签,双完成)
在本例中,签名包含“float”作为输出类型,参考上面的文档链接,您需要将输出数据类型从“float”切换为“single”。此外,变量应该是唯一的,如u1, u2等。下面是一个关于如何生成S-Function的例子:
Def = legacy_code(“初始化”);
def.SFunctionName =“Predict_NN_MAT_SFcn”
def.OutputFcnSpec ='单y1= Predict_NN_MAT(双u1,双u2,双u3,双u4,双u5,双u6,双u7)'
def.HeaderFiles = {“FullyConnectedActivation.h”“Predict_NN_MAT.h”“Predict_NN_MAT_data.h”“Predict_NN_MAT_initialize.h”“Predict_NN_MAT_internal_types.h”“Predict_NN_MAT_terminate.h”“Predict_NN_MAT_types.h”“predict.h”“rtwtypes.h”};
def.SourceFiles = {“FullyConnectedActivation.c”“Predict_NN_MAT.c”“Predict_NN_MAT_data.c”“Predict_NN_MAT_initialize.c”“Predict_NN_MAT_terminate.c”“predict.c”};
def.IncPaths = {“……\ dll \ Predict_NN_MAT”};
def.SrcPaths = {“……\ dll \ Predict_NN_MAT”};
def.LibPaths = {“……\ dll \ Predict_NN_MAT”};
def.Options.useTlcWithAccel = false;
legacy_code (“sfcn_cmex_generate”def);
(3)生成整个模型部署在HIL中的代码:
在Simulink模型中集成通用C/ c++或CUDA代码后,使用Embedded Coder为整个模型生成用于HIL部署的代金宝app码。看到使用嵌入式编码器生成代码
有关显示如何从Simulink模型生成C代码的示例,请参见金宝app从Simulink模型生成C代码金宝app

更多答案(0)

类别

了解更多开始使用GPU编码器帮助中心而且文件交换

标签

还没有输入标签。

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!

翻译的