主要内容

基于MATLAB函数块的深度学习网络GPU代码生成

使用GPU Coder™,您可以为Simulink生成优化的代码®包含各种经过训练的深度学习网络的模型。您可以在Simulink中使用MATLAB函数块或通过使用深度神经网络图书馆。当使用MATLAB函数块,使用coder.loadDeepLearningNetwork函数加载经过训练的深度学习网络,并使用网络对象的对象函数来获得所需的响应。您可以配置代码生成器以利用NVIDIA®CUDA®用于NVIDIA gpu的深度神经网络库(cuDNN)和TensorRT™高性能推断库。生成的代码通过使用在网络对象中指定的体系结构、层和参数来实现深度卷积神经网络(CNN)。

示例:使用GoogLeNet对图像进行分类

GoogLeNet已经在超过100万张图像上进行了训练,可以将图像分为1000个对象类别(例如键盘、咖啡杯、铅笔和动物)。该网络将图像作为输入,然后输出图像中对象的标签以及每个对象类别的概率。此示例向您展示如何执行模拟并为预训练生成CUDA代码googlenet深度卷积神经网络对图像进行分类。

  1. 加载预先训练好的GoogLeNet网络。您可以选择加载不同的预训练网络进行图像分类。如果您没有安装所需的支持包,请根据软件安装指导书进行安装。

    Net = googlenet;

  2. 的对象包含了DAGNetwork对象。使用analyzeNetwork功能,用于显示网络体系结构的交互式可视化,检测网络中的错误和问题,并显示有关网络层的详细信息。层信息包括层激活和可学习参数的大小,可学习参数的总数,循环层状态参数的大小。

    analyzeNetwork(净);

    分析显示GoogLeNet网络分析的网络应用程序。

  3. 要分类的图像必须与网络的输入大小相同。对于GoogLeNet,大小imageInputLayer是224 - 224 - 3。的输出的属性classificationLayer包含网络学习到的类的名称。从1000个类名中随机查看10个。

    classNames = net.Layers(end).Classes;numClasses = numel(classNames);disp(类名(randperm (numClasses 10)))
    “快艇”、“纱窗”、“等足类动物”、“木勺”、“口红”、“公鸭”、“鬣狗”、“哑铃”、“草莓”、“蛋奶苹果”

创建GoogLeNet模型

  1. 创建一个Simulink模型并插入一个MATLAB函数用户定义函数图书馆。

  2. 添加一个图片来自文件计算机视觉工具箱库,并设置文件名称参数peppers.png

  3. 添加一个调整计算机视觉工具箱库的模型。设置指定参数。调整输出行数和列数并输入(224 224)作为的值输出行数和列数.这个bock将输入图像的大小调整为网络输入层的大小。

    包含使用GoogLeNet对图像进行分类的块的Simulink模型。

  4. 双击MATLAB函数块。属性中出现默认函数签名MATLAB函数块编辑器。

  5. 定义一个函数googlenet_predict,实现了预测入口点函数。函数头声明作为一个参数googlenet_predict函数,分数而且indxTop作为返回值。

    函数[scores,indxTop] = googlenet_predict(in)% # codegen持续的mynet;如果mynet = code . loaddeeplearningnetwork (mynet)“googlenet”);结束输入合格率Predict_scores = predict(mynet,in);[scores,indx] = sort(predict_scores,“下”);indxTop = indx(1:5);

    持久对象mynet加载DAGNetwork对象。在第一次调用入口点函数时,构造并设置持久对象。在对该函数的后续调用中,将重用相同的对象来调用预测在输入时,避免重构和重新加载网络对象。

    你也可以使用激活(深度学习工具箱)方法来为特定层进行网络激活。例如,下面这行代码返回中指定的层的网络激活layerIdx

    out =激活(mynet,in,layerIdx,'输出','通道');

    你也可以使用分类(深度学习工具箱)方法来预测图像数据的类标签使用训练过的网络mynet

    [out,scores] = category (mynet,in);

    对于LSTM网络,可以使用predictAndUpdateState(深度学习工具箱)而且resetState(深度学习工具箱)方法。有关这些方法的使用说明和限制,请参见支持功能

  6. 的块参数MATLAB函数块。在代码生成选项卡上,选择可重用的功能函数包装

  7. 如图所示,把这些块连接起来。将模型另存为googlenetModel

    Simulink模型显示块之间的连接。

配置GPU加速的型号

模型配置参数决定了仿真过程中使用的加速方法。

  1. 打开“配置参数”对话框。打开解算器窗格。要编译您的模型以加速并生成CUDA代码,请将模型配置为使用固定步骤求解器。下表显示了本例的求解器配置。

    参数 设置 对生成代码的影响
    类型 固定步 维护一个常量(固定的)步长,这是代码生成所需要的
    解算器 离散(无连续状态) 采用固定步长积分法计算模型的状态导数
    固定的大小 汽车 Simulink选择步长

    显示模拟解算器选项的配置参数对话框的快照。

  2. 选择模拟目标窗格。设置语言c++

  3. 选择GPU加速

    特定于GPU编码器的选项现在可以在模拟目标> GPU加速窗格。对于本例,您可以使用这些特定于gpu的参数的默认值。

    模型配置参数对话框中的GPU加速面板。

  4. 模拟目标窗格中,设置目标库参数中的深度学习集团cuDNN

    配置参数对话框的快照,显示模拟加速的深度学习选项。

    您也可以选择TensorRT针对NVIDIA gpu的TensorRT高性能推断库。

  5. 点击好吧保存并关闭“配置参数”对话框。

    你可以使用set_param在MATLAB中编程配置模型参数®命令窗口。

    set_param (“googlenetModel”“GPUAcceleration”“上”);

构建GPU加速模型

  1. 要构建和模拟GPU加速模型,请选择运行模拟tab或使用MATLAB命令:

    Out = sim(“googlenetModel”);

    该软件首先检查CUDA/ c++代码之前是否为您的模型编译过。如果之前创建了代码,那么软件将运行模型。如果之前没有构建代码,软件首先生成并编译CUDA/ c++代码,然后运行模型。代码生成工具将生成的代码放在工作文件夹的子文件夹中slprj / _slprj / googlenetModel

  2. 以直方图的形式显示前五个预测标签及其相关概率。由于网络将图像划分为如此多的对象类别,并且许多类别是相似的,因此在评估网络时,通常会考虑前五名的准确性。该网络以高概率将图像分类为灯笼椒。

    Im = imread(“peppers.png”);classNamesTop = classNames(out.yout{2}.Values.Data(:,:,1)) h = figure;h.位置(3)= 2*h.位置(3);Ax1 = subplot(1,2,1);Ax2 = subplot(1,2,2);图像(ax₁,im);barh (ax2 out.yout {1} .Values.Data(1、5:1:1,1)包含(ax2,“概率”) yticklabels(ax2,classNamesTop(5:-1:1))YAxisLocation =“对”;sgtitle (“使用GoogLeNet的5大预测”

配置代码生成模型

模型配置参数为代码生成和构建过程提供了许多选项。

  1. 选择代码生成窗格。设置系统目标文件grt.tlc

    你也可以使用嵌入式编码器®目标文件ert.tlc或自定义系统目标文件。

    对于GPU代码生成,自定义目标文件必须基于grt.tlcert.tlc.有关开发自定义目标文件的信息,请参见自定义系统目标文件(仿真软件编码器)

  2. 设置语言c++

  3. 选择生成GPU代码

  4. 选择只生成代码

  5. 选择工具链.Linux®平台,选择NVIDIA CUDA | gmake(64位Linux).对于Windows®系统,选择NVIDIA CUDA (w/Microsoft Visual c++ 20XX) | nmake(64位windows)

    当使用自定义系统目标文件时,必须为工具链方法设置构建控件。要了解用于自定义目标的工具链方法的更多信息,请参见支持自定义目标的工具链方法(仿真软件编码器)

  6. 代码生成>报表窗格中,选择创建代码生成报告而且自动打开报表

  7. 代码生成>接口窗格中,设置目标库深度学习集团cuDNN

    您也可以选择TensorRT针对NVIDIA gpu的TensorRT高性能推断库。

  8. 生成GPU代码参数启用时,特定于GPU Coder的选项将在代码生成> GPU代码窗格。对于本例,您可以使用中特定于gpu参数的默认值代码生成> GPU代码窗格。

    模型配置参数对话框上的GPU代码面板。

  9. 点击好吧保存并关闭“配置参数”对话框。

    你也可以使用set_param函数在MATLAB命令窗口中以编程方式配置模型参数。

    set_param (“googlenetModel”“GenerateGPUCode”CUDA的);

为模型生成CUDA代码

  1. 在Simulink编辑器中,打开仿真软件编码器应用程序。

  2. 生成的代码。

消息出现在诊断查看器中。代码生成器生成CUDA源文件和头文件,以及HTML代码生成报告。代码生成器将文件放在建立文件夹的子文件夹googlenetModel_grt_rtw在当前工作文件夹下。

限制

  • GPU代码生成MATLAB函数块在状态流®不支持图表。

  • GPU加速是否启用,代码生成器不支持导入自定义代码用于导入自定义编写的CUDA源文件(*.cu)。相反,使用coder.cevalMATLAB函数块。

  • MATLAB函数block不支持MATLAB语言中的所有数据类型。有关支持的数据类型,请参阅块文档。

  • 对于GPU代码生成,自定义目标文件必须基于grt.tlcert.tlc

  • 对于部署生成的代码,建议使用生成一个示例主程序选项生成ert_main.cu模块。此选项需要嵌入式编码器许可证。

    你也可以使用rt_cppclass_main.cpp静态主模块由MathWorks提供®.但是,必须修改静态主文件,以便模型类构造函数指向深度学习对象。例如,

    静态googlenetModelModelClass:: deeplearning_googlenetmodel_deeplearning;静态googlenetmodelmodel_obj {&googlenetModel_DeepLearning};

另请参阅

功能

相关的话题

Baidu
map