Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MegEngine 天元
Docs
提交
725e9cf7
D
Docs
项目概览
MegEngine 天元
/
Docs
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
725e9cf7
编写于
7月 01, 2020
作者:
M
Megvii Engine Team
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(advanced): fix deployment doc
GitOrigin-RevId: e703805a8cad9d01ca9ba3f489e57fbb0a7ba2f4
上级
98cb57d2
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
7 addition
and
6 deletion
+7
-6
source/advanced/deployment.rst
source/advanced/deployment.rst
+7
-6
未找到文件。
source/advanced/deployment.rst
浏览文件 @
725e9cf7
...
...
@@ -35,11 +35,11 @@ MegEngine 的一大核心优势是“训练推理一体化”,其中“训练
pred_fun.trace(data, net=xor_net)
# 使用 trace 类的 dump 接口进行部署
pred_fun.dump("xornet_deploy.mge", arg_names=["data"])
pred_fun.dump("xornet_deploy.mge", arg_names=["data"]
, optimize_for_inference=True
)
这里再解释一下编译与序列化相关的一些操作。编译会将被 :class:`~.trace` 装饰的函数(这里的 ``pred_fun`` )视为计算图的全部流程,计算图的输入严格等于 ``pred_fun`` 的位置参数(positional arguments,即参数列表中星号 ``*`` 前的部分,这里的 ``data`` 变量),计算图的输出严格等于函数的返回值(这里的 ``pred_normalized`` )。而这也会进一步影响到部署时模型的输入和输出,即如果运行部署后的该模型,会需要一个 ``data`` 格式的输入,返回一个 ``pred_normalized`` 格式的值。
为了便于我们在 C++ 代码中给序列化之后的模型传入输入数据,我们需要给输入赋予一个名字,即代码中的 ``arg_names`` 参数。由于该示例中 ``pred_fun`` 只有一个位置参数,即计算图只有一个输入,所以传给 ``arg_names`` 的列表也只需一个字符串值即可,可以是任意名字,用于在 C++ 代码中引用,详情见下节内容。
为了便于我们在 C++ 代码中给序列化之后的模型传入输入数据,我们需要给输入赋予一个名字,即代码中的 ``arg_names`` 参数。由于该示例中 ``pred_fun`` 只有一个位置参数,即计算图只有一个输入,所以传给 ``arg_names`` 的列表也只需一个字符串值即可,可以是任意名字,用于在 C++ 代码中引用,详情见下节内容。
另外传递 ``optimize_for_inference=True`` (默认为 Flase)标志将在 ``dump()`` 方法中对模型针对 inference 进行优化,提高 inference 时候的模型运行效率。
总结一下,我们对在静态图模式下训练得到的模型,可以使用 :meth:`~.trace.dump` 方法直接序列化,而无需对模型代码做出任何修改,这就是“训练推理一体化”的由来。
...
...
@@ -48,7 +48,7 @@ MegEngine 的一大核心优势是“训练推理一体化”,其中“训练
接下来我们需要编写一个 C++ 程序,来实现我们期望在部署平台上完成的功能。在这里我们基于上面导出的异或网络模型,实现一个最简单的功能,即给定两个浮点数,输出对其做异或操作,结果为 0 的概率以及为 1 的概率。
在此之前,为了能够正常使用 MegEngine 底层 C++ 接口,需要先按照
:ref:`installation` 从源码编译安装 MegEngine,并执行 ``make install`` 保证 MegEngine 相关 C++ 文件被正确安装
。
在此之前,为了能够正常使用 MegEngine 底层 C++ 接口,需要先按照
MegeEngine 中提供的编译脚本( `MegEngine/scripts <https://github.com/MegEngine/MegEngine/tree/master/scripts/cmake-build>`_ )从源码编译得到 MegEngine 的相关库, 通过这些脚本可以交叉编译安卓(ARMv7,ARMv8,ARMv8.2)版本、linux 版本(ARMv7,ARMv8,ARMv8.2)以及 ios 相关库,也可以本机编译 windows/linux/macos 相关库文件
。
实现上述异或计算的示例 C++ 代码如下(引自 `xor-deploy.cpp <https://github.com/MegEngine/MegEngine/blob/master/sdk/xor-deploy/xor_deploy.cpp>`_ ):
...
...
@@ -56,6 +56,7 @@ MegEngine 的一大核心优势是“训练推理一体化”,其中“训练
:language: cpp
简单解释一下代码的意思,我们首先通过 :ref:`exhale_class_classmgb_1_1serialization_1_1GraphLoader` 将模型加载进来,接着通过 ``tensor_map`` 和上节指定的输入名称 ``data`` ,找到模型的输入指针,再将运行时提供的输入 ``x`` 和 ``y`` 赋值给输入指针,然后我们使用 ``network.graph->compile`` 将模型编译成一个函数接口,并调用执行,最后将得到的结果 ``predict`` 进行输出,该输出的两个值即为异或结果为 0 的概率以及为 1 的概率 。
另外可以配置上面加载模型时候的 ``config`` 来优化 inference 计算效率,为了加速一般在 ARM 上面配置 ``enable_nchw44_layout()`` ,在x86 CPU上面配置 ``enable_nchw88_layout()`` ,具体的配置方法参考 `load_and_run 源码 <https://github.com/MegEngine/MegEngine/blob/80ecabe8c6f3329f2817912a9ef82be99e07419e/sdk/load-and-run/src/mgblar.cpp#L997>`_ 。
编译并执行
------------------------------
...
...
@@ -64,9 +65,9 @@ MegEngine 的一大核心优势是“训练推理一体化”,其中“训练
.. note::
目前发布的版本我们开放了对 CPU(X86、X64
)和 GPU(CUDA)平台的支持,后续会继续开放对 ARM 平台
的支持。
目前发布的版本我们开放了对 CPU(X86、X64
、ARMv7、ARMv8、ARMv8.2)和 GPU(CUDA)平台的 float 和量化 int8
的支持。
我们在这里以 CPU
平台为例,
直接使用 gcc 或者 clang (用 ``$CXX`` 指代)进行编译即可:
我们在这里以 CPU
(X86) 平台为例,如果目标平台是ARM则可以参考 :ref:`inference_chinese` 。首先
直接使用 gcc 或者 clang (用 ``$CXX`` 指代)进行编译即可:
.. code-block:: bash
...
...
@@ -84,4 +85,4 @@ MegEngine 的一大核心优势是“训练推理一体化”,其中“训练
Predicted: 0.999988 1.2095e-05
至此我们便完成了从 Python 模型到 C++ 可执行文件的部署流程。
至此我们便完成了从 Python 模型到 C++ 可执行文件的部署流程
,如果需要快速的运行模型以及测试模型性能,请参考 :ref:`how_to_use_load_and_run`
。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录