oneflow-lite是一个轻量化的模型部署框架,支持在MCU、移动端、边缘端和服务端等各种应用场景下执行高效的推理任务。
oneflow-lite由compiler和runtime两部分组成。compiler负责对oneflow训练保存的checkpoint进行编译优化,最终转换成oneflow-lite runtime所支持的二进制文件格式,runtime提供该二进制文件的运行时环境,驱动硬件执行计算过程,并向上提供合适的用户接口。
Compiler支持对计算图进行一序列优化,包括计算融合、冗余消除、Layout变换等中端图优化,也包括内存规划、算子放置、计算图切分和后端代码生成等优化。
Runtime由纯C语言开发,核心框架二进制大小只有50KB左右,包含硬件抽象层、执行的上下文和支撑库,支持以非常简洁的方式集成各类硬件模块,比如X86 CPU、英伟达CUDA GPU、华为Ascend NPU等。
-
Compiler
-
下载/更新子模块
git submodule init && git submodule update
-
编译
-
目标硬件为CUDA
cd compiler && mkdir build cmake .. -DLITE_USE_CUDA=ON && make
-
目标硬件为Ascend NPU
安装华为Ascend Toolkit,到华为Ascend网站上下载Ascend-cann-toolkit安装包,完成安装之后执行下面的命令更新一下环境变量。
source /Ascend-Toolkit-Install-Path/ascend-toolkit/set_env.sh
接着执行下面命令完成编译。
cd compiler && mkdir build cmake .. -DLITE_USE_ASCEND_NPU=ON && make
-
-
检查编译结果
在bin目录下检查是否生成了编译工具oneflow-lite-compile。
注意:Compiler组件不需要在目标硬件平台上就可以编译。
-
-
Runtime
-
在目标硬件平台上编译
比如目标平台为X86 CPU + Ascend NPU,编译命令如下,
cd runtime && mkdir build cmake .. -DBUILD_X86=ON -DBUILD_ASCEND_NPU=ON
-
交叉编译
暂时不支持
-
-
优化和转换模型
-
使用graph模式导出mlir模型
class MyGraph(nn.Graph): def __init__(self, model): super().__init__() self.model = model def build(self, *input): return self.model(*input) model = Resnet50Module() model.eval() graph = MyGraph(model) flow.save(graph, "./resnet50_model/")
-
使用
oneflow-lite-compile
工具将模型编译成oneflow-lite
的模型文件格式(以华为Ascend NPU为例)oneflow-lite/compiler/build/bin/oneflow-lite-compile ./resnet50_model -o resnet50_lite.bin --targets=ascend
-
-
在目标硬件平台上执行(以华为Ascend NPU为例)
source /Ascend-Toolkit-Install-Path/ascend-toolkit/set_env.sh oneflow-lite/runtime/build/oneflow-lite/tests/test-resnet50 resnet50_lite.bin