From c3ab9b49374a27d3ca4bd3dfc606cb3daf9809e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E6=9F=B1?= Date: Wed, 8 Nov 2023 09:25:59 +0800 Subject: [PATCH] add MNN MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 罗柱 --- thirdparty/MNN/HPKBUILD | 74 ++++++++++++++++++++ thirdparty/MNN/HPKCHECK | 27 +++++++ thirdparty/MNN/OAT.xml | 20 ++++++ thirdparty/MNN/README.OpenSource | 11 +++ thirdparty/MNN/README_zh.md | 11 +++ thirdparty/MNN/SHA512SUM | 1 + thirdparty/MNN/docs/hap_ingtegrate.md | 71 +++++++++++++++++++ thirdparty/MNN/docs/pic/MNN_install_dir.png | Bin 0 -> 12216 bytes thirdparty/MNN/docs/pic/MNN_test.png | Bin 0 -> 11454 bytes thirdparty/MNN/docs/pic/MNN_usage.png | Bin 0 -> 21814 bytes 10 files changed, 215 insertions(+) create mode 100644 thirdparty/MNN/HPKBUILD create mode 100644 thirdparty/MNN/HPKCHECK create mode 100644 thirdparty/MNN/OAT.xml create mode 100644 thirdparty/MNN/README.OpenSource create mode 100644 thirdparty/MNN/README_zh.md create mode 100644 thirdparty/MNN/SHA512SUM create mode 100644 thirdparty/MNN/docs/hap_ingtegrate.md create mode 100644 thirdparty/MNN/docs/pic/MNN_install_dir.png create mode 100644 thirdparty/MNN/docs/pic/MNN_test.png create mode 100644 thirdparty/MNN/docs/pic/MNN_usage.png diff --git a/thirdparty/MNN/HPKBUILD b/thirdparty/MNN/HPKBUILD new file mode 100644 index 00000000..e0ad34c0 --- /dev/null +++ b/thirdparty/MNN/HPKBUILD @@ -0,0 +1,74 @@ +# Copyright (c) 2023 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Contributor: Ding Qian <1052888395@qq.com> luozhu <1393302983@qq.com> +# Maintainer: Ding Qian <1052888395@qq.com> + +pkgname=MNN +pkgver=2.6.3 +pkgrel=0 +pkgdesc="MNN is a highly efficient and lightweight deep learning framework. It supports inference and training of deep learning models." +url="https://github.com/alibaba/MNN" +archs=("armeabi-v7a" "arm64-v8a") +license=("Apache 2.0") +depends=() +makedepends=() +source="https://github.com/alibaba/$pkgname/archive/refs/tags/$pkgver.tar.gz" + +autounpack=true +downloadpackage=true +builddir=$pkgname-${pkgver} +packagename=$builddir.tar.gz +buildtools="cmake" + +prepare() { + mkdir -p $builddir/$ARCH-build +} + +build() { + cd $builddir + ${OHOS_SDK}/native/build-tools/cmake/bin/cmake "$@" -B$ARCH-build -DMNN_BUILD_TEST=ON -B$ARCH-build -S./ > $buildlog 2>&1 + $MAKE VERBOSE=1 -C $ARCH-build >> $buildlog 2>&1 + ret=$? + cd $OLDPWD + return $ret +} + +package() { + cd $builddir + $MAKE -C $ARCH-build install VERBOSE=1 >> $buildlog 2>&1 + ret=$? + cd $OLDPWD + return $ret +} + +check() { + if [ $ARCH == "armeabi-v7a" ] + then + cp ${OHOS_SDK}/native/llvm/lib/arm-linux-ohos/libc++_shared.so $LYCIUM_ROOT/usr/$pkgname/$ARCH/lib/ + elif [ $ARCH == "arm64-v8a" ] + then + cp ${OHOS_SDK}/native/llvm/lib/aarch64-linux-ohos/libc++_shared.so $LYCIUM_ROOT/usr/$pkgname/$ARCH/lib/ + else + echo "${ARCH} not support" + return -1. + fi + echo "The test must be on an OpenHarmony device!" + # ./run_test.out +} + +# 清理环境 +cleanbuild(){ + rm -rf ${PWD}/$builddir +} + diff --git a/thirdparty/MNN/HPKCHECK b/thirdparty/MNN/HPKCHECK new file mode 100644 index 00000000..bf85699a --- /dev/null +++ b/thirdparty/MNN/HPKCHECK @@ -0,0 +1,27 @@ +# Copyright (c) 2023 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Contributor: luozhu <1393302983@qq.com> +# Maintainer: luozhu <1393302983@qq.com> + +source HPKBUILD > /dev/null 2>&1 +logfile=${LYCIUM_THIRDPARTY_ROOT}/${pkgname}/${pkgname}_${ARCH}_${OHOS_SDK_VER}_test.log + +openharmonycheck() { + res=0 + cd $builddir/${ARCH}-build + ./run_test.out > ${logfile} 2>&1 + res=$? + cd $OLDPWD + return $res +} diff --git a/thirdparty/MNN/OAT.xml b/thirdparty/MNN/OAT.xml new file mode 100644 index 00000000..c2cd820f --- /dev/null +++ b/thirdparty/MNN/OAT.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/thirdparty/MNN/README.OpenSource b/thirdparty/MNN/README.OpenSource new file mode 100644 index 00000000..fd1ec843 --- /dev/null +++ b/thirdparty/MNN/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "MNN", + "License": "Apache 2.0", + "License File": "https://www.apache.org/licenses/LICENSE-2.0.txt", + "Version Number": "2.6.3", + "Owner": "1393302983@qq.com", + "Upstream URL": "https://github.com/alibaba/MNN/archive/refs/tags/2.6.3.tar.gz", + "Description": "MNN is a highly efficient and lightweight deep learning framework.It supports inference and training of deep learning models." + } +] diff --git a/thirdparty/MNN/README_zh.md b/thirdparty/MNN/README_zh.md new file mode 100644 index 00000000..53463214 --- /dev/null +++ b/thirdparty/MNN/README_zh.md @@ -0,0 +1,11 @@ +# MNN三方库说明 +## 功能简介 +MNN是一个高效、轻量级的深度学习框架,支持深度学习模型的推理和训练 +## 使用约束 +- IDE版本:DevEco Studio 3.1 Release +- SDK版本:ohos_sdk_public 4.0.8.1 (API Version 10 Release) +- 三方库版本:2.6.3 +- 当前适配的功能:支持Tensorflow、Caffe和ONNX等不同的训练框架;通过算子融合、算子替代、模型压缩、布局调整等方式对图进行基本的优化操作 + +## 集成方式 ++ [应用hap包集成](docs/hap_ingtegrate.md) \ No newline at end of file diff --git a/thirdparty/MNN/SHA512SUM b/thirdparty/MNN/SHA512SUM new file mode 100644 index 00000000..fd8f9c1f --- /dev/null +++ b/thirdparty/MNN/SHA512SUM @@ -0,0 +1 @@ +16ccd1d018f9eb026db2845a6f06e7b16d4992f2684bd36327b0ce5889f68fbec26b92c4b249d3c0e786f19c005a647430dd9e181423c29abe0cf4004b146acb MNN-2.6.3.tar.gz diff --git a/thirdparty/MNN/docs/hap_ingtegrate.md b/thirdparty/MNN/docs/hap_ingtegrate.md new file mode 100644 index 00000000..2858a134 --- /dev/null +++ b/thirdparty/MNN/docs/hap_ingtegrate.md @@ -0,0 +1,71 @@ +# MNN集成到应用hap + +本库是在RK3568开发板上基于OpenHarmony3.2 Release版本的镜像验证的,如果是从未使用过RK3568,可以先查看[润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld)。 + +## 开发环境 + +- [开发环境准备](../../../docs/hap_integrate_environment.md) + +## 编译三方库 + +- 下载本仓库 + ``` + git clone https://gitee.com/openharmony-sig/tpc_c_cplusplus.git --depth=1 + ``` +- 三方库目录结构 + ``` + tpc_c_cplusplus/thirdparty/MNN # 三方库MNN的目录结构如下 + ├── docs # 三方库相关文档的文件夹 + ├── HPKBUILD # 编译脚本 + ├── HPKCHECK # 测试脚本 + ├── OAT.xml # OAT开源审查文本 + ├── README.OpenSource # 说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md # 三方库说明文档 + ├── SHA512SUM # 三方库校验文件 + ``` + +- 在lycium目录下编译三方库 + MNN库不需要依赖其它库,所以在build时只需要编译MNN库即可 + 编译环境的搭建参考[准备三方库构建环境](../../../lycium/README.md#1编译环境准备) + ``` + cd lycium + ./build.sh MNN + ``` +- 三方库头文件及生成的库 + 在lycium目录下会生成usr目录,该目录下存在已编译完成的32位和64位三方库 + ``` + MNN/arm64-v8a MNN/armeabi-v7a + ``` + +- [测试三方库](#测试三方库) + +## 应用中使用三方库 + +- 在IDE的cpp目录下新增thirdparty目录,将编译生成的库和依赖库拷贝到该目录下,如下图所示 +   +![thirdparty_install_dir](pic/MNN_install_dir.png) + +- 在最外层(cpp目录下)CMakeLists.txt中添加如下语句 + ```shell + #将三方库加入工程中 + target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libMNN.so) + #将三方库的头文件加入工程中 + target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/MNN/${OHOS_ARCH}/include) + + ``` + +![MNN_usage](pic/MNN_usage.png) + +## 测试三方库 +三方库的测试使用自己编写的测试用例来做测试,[准备三方库测试环境](../../../lycium/README.md#3ci环境准备) + +- 将编译生成的可执行文件及生成的动态库准备好 + +- 将准备好的文件推送到开发板,进入到构建的目录添加执行文件权限和lib库环境执行./run_test.out + ![MNN_test](pic/MNN_test.png) + +## 参考资料 +- [润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld) +- [OpenHarmony三方库地址](https://gitee.com/openharmony-tpc) +- [OpenHarmony知识体系](https://gitee.com/openharmony-sig/knowledge) +- [通过DevEco Studio开发一个NAPI工程](https://gitee.com/openharmony-sig/knowledge_demo_temp/blob/master/docs/napi_study/docs/hello_napi.md) diff --git a/thirdparty/MNN/docs/pic/MNN_install_dir.png b/thirdparty/MNN/docs/pic/MNN_install_dir.png new file mode 100644 index 0000000000000000000000000000000000000000..756b8729dc64847a886f4430c30913afca095e6b GIT binary patch literal 12216 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 literal 0 HcmV?d00001 diff --git a/thirdparty/MNN/docs/pic/MNN_usage.png b/thirdparty/MNN/docs/pic/MNN_usage.png new file mode 100644 index 0000000000000000000000000000000000000000..fce97800ddaed7dac37470c0a5786eea0972ed1d GIT binary patch literal 21814 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

5WUv>~23QEFsymAt~ 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