Metal 部署示例¶
Paddle Lite 支持在 iOS 和 macOS 系统上运行基于 Metal 的程序
1. 编译¶
1.2 编译 Paddle Lite Metal 库 iOS 范例¶
注:以 ios/metal
为目标、macOS M1 芯片、CMake3.21 作为编译开发环境为例。
(1) 下载代码¶
# 下载 Paddle Lite 源码
git clone https://github.com/PaddlePaddle/Paddle-Lite.git
# 切换到 release 分支
git checkout <release-version-tag>
(2) 源码编译¶
cd Paddle-Lite
# (可选) 删除 third-party 目录,编译脚本会自动从国内 CDN 下载第三方库文件
# rm -rf third-party
# 请在 Paddle-Lite 当前目录下执行脚本
./lite/tools/build_ios.sh --with_metal=ON
其他可选择编译选项
with_extra
:[OFF | ON]
,编译全量 op 和 kernel,包含控制流 NLP 相关的 op 和 kernel 体积会大,编译时间长;with_profile
:[OFF | ON]
,是否使用 Profiler 编译;with_xcode
:[OFF | ON]
, 是否使用 Xcode 编译;with_cv
:[OFF | ON]
,编译 ARM CPU Neon 实现的的 cv 预处理模块;with_exception
:[OFF | ON]
,是否开启 C++ 异常;with_log
:[ON | OFF]
,是否在执行过程打印日志;
说明: 编译过程中,如出现源码编译耗时过长,通常是第三方库下载过慢或失败导致。请在完成 Paddle Lite 源码下载后,删除本地仓库根目录下的 third-party 目录,编译脚本会自动下载存储于国内 CDN 的第三方依赖文件压缩包,节省从 GitHub repo 同步第三方库的时间。
(3) 编译产物说明¶
编译产物位于 build.ios.metal.ios64.armv8
下的 inference_lite_lib.ios64.armv8.metal
文件夹内,文件目录如下:
inference_lite_lib.ios64.armv8.metal
├── include C++ 头文件
│ ├── paddle_api.h
│ ├── paddle_image_preprocess.h
│ ├── paddle_lite_factory_helper.h
│ ├── paddle_place.h
│ ├── paddle_use_kernels.h
│ ├── paddle_use_ops.h
│ └── paddle_use_passes.h
├── lib C++ 预测库(静态库)
│ └── libpaddle_api_light_bundled.a
└── metal metallib 文件
└── lite.metallib
1.3 编译 Paddle Lite Metal 库 macOS 范例¶
注:以 macOS/metal
为目标、macOS M1 芯片、CMake3.21 作为编译开发环境为例。
(1) 源码编译¶
cd Paddle-Lite
# (可选) 删除 third-party 目录,编译脚本会自动从国内 CDN 下载第三方库文件
# rm -rf third-party
# 请在 Paddle-Lite 当前目录下执行脚本
./lite/tools/build_macos.sh --with_metal=ON
其他可选择编译选项
with_extra
:[OFF | ON]
,编译全量 op 和 kernel,包含控制流 NLP 相关的 op 和 kernel 体积会大,编译时间长;with_profile
:[OFF | ON]
,是否使用 Profiler 编译;with_xcode
:[OFF | ON]
, 是否使用 Xcode 编译;with_cv
:[OFF | ON]
,编译 ARM CPU Neon 实现的的 cv 预处理模块;with_exception
:[OFF | ON]
,是否开启 C++ 异常;with_log
:[ON | OFF]
,是否在执行过程打印日志;with_python
:[OFF | ON]
,是否生成 python whl 安装包;
(2) 编译产物说明¶
编译产物位于 build.macos.armmacos.armv8.metal
下的 inference_lite_lib.armmacos.armv8.metal
文件夹内,文件目录如下:
inference_lite_lib.armmacos.armv8.metal
├── cxx C++ 预测库和头文件
│ ├── include C++ 头文件
│ │ ├── paddle_api.h
│ │ ├── paddle_image_preprocess.h
│ │ ├── paddle_lite_factory_helper.h
│ │ ├── paddle_place.h
│ │ ├── paddle_use_kernels.h
│ │ ├── paddle_use_ops.h
│ │ └── paddle_use_passes.h
│ └── lib C++ 预测库
│ ├── libpaddle_api_light_bundled.a C++ 静态库(轻量库)
│ └── libpaddle_light_api_shared.dylib C++ 动态库(轻量库)
│ ├── libpaddle_api_full_bundled.a.a C++ 静态库(全量库)
│ └── libpaddle_full_api_shared.dylib C++ 动态库(全量库)
│
├── metal metallib 文件
│ └── lite.metallib
│
│
└── demo C++ 示例代码
└── cxx C++ 预测库 demo
└── armmacos_mobile_light_demo
└── mobilenetv1_light_api.cc
2. 运行示例¶
下面以 macOS 的环境为例,介绍 opt 转换得到的 Metal 模型如何在 iOS/macOS 设备上执行基于 Metal 的 ARM GPU 推理过程。
2.1 iOS demo 部署方法¶
在 iOS demo 部署过程中,需要将 inference_lite_lib.ios64.armv8.metal 文件中的所有编译产物手动复制到 Xcode 工程当中,其中包括:
include 文件中的所有 C++ 头文件;
lib 文件中的静态库文件 libpaddle_api_light_bundled.a;
metal 文件中的 Metal 库文件 lite.metallib;
详细 iOS demo 部署方法参考 iOS工程示例
2.2 macOS demo 部署方法¶
安装好 Xcode 后,在 demo 目录下添加由 opt 转换得到的 Metal 模型,并运行以下命令:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -isysroot $(xcrun --sdk macosx --show-sdk-path) -target arm64-macos11 -std=c++11 -I .{$Paddle-Lite}/build.macos.armmacos.armv8/inference_lite_lib.armmacos.armv8/cxx/include .{$Paddle-Lite}/build.macos.armmacos.armv8/inference_lite_lib.armmacos.armv8/cxx/lib/libpaddle_api_light_bundled.a ./mobilenet_light_api.cc -o mobilenet_light_api -framework MetalPerformanceShaders -framework Metal -framework Foundation -framework CoreGraphics -DMETAL=ON
注意: 将 mobilenetv1_light_api.cc 文件中以下两个头文件注释去掉。
#include "include/paddle_use_ops.h"
#include "include/paddle_use_kernels.h"