Linux x86 环境下编译适用于 ARM Linux 的库

简介

本文档旨在介绍如何在 x86 Linux 操作系统环境下编译 Paddle Lite 源码,生成目标硬件为 ARM Linux 的预测库。

说明:

  • 通常情况下,你不需要自行从源码构建编译包,优先推荐下载 Paddle Lite 官方发布的预编译包,可满足一部分场景的需求。如果官方发布的编译包未覆盖你的场景,或者需要修改 Paddle Lite 源代码,则可参考本文构建。

  • 本文介绍的编译方法只适用于 Paddle Lite v2.6 及以上版本。v2.3 及之前版本请参考release/v2.3 源码编译方法

在该场景下 Paddle Lite 已验证的软硬件配置如下表所示:

Host 环境

目标硬件环境

x86 Linux

CPU arm64/armhf
Huawei Ascend NPU
Kunlunxin XPU
OpenCL
Rockchip NPU
Amlogic NPU
Imagination NNA
Intel FPGA
注:查询以上芯片支持的具体型号,可参考支持硬件列表章节。

准备编译环境

适用于基于 ARMv8 和 ARMv7 架构 CPU 的各种开发板,例如 RK3399,树莓派等,目前支持交叉编译和本地编译两种方式,对于交叉编译方式,在完成目标程序编译后,可通过 scp 方式将程序拷贝到开发板运行。 因为本教程使用 Host 环境为 x86 架构,因此下面仅介绍交叉编译 ARM Linux 方式。

推荐环境

  • Ubuntu == 16.04

  • aarch64-xxxx-gcc、aarch64-xxxx-g++ == 5.4.0

  • python == 3.7

  • cmake >= 3.10

  • git、make、wget、scp

环境安装命令

以 Ubuntu16.04 为例介绍安装命令。其它 Linux 发行版安装步骤类似,在此不再赘述。 注意需要 root 用户权限执行如下命令。

 # 1. Install basic software
apt update
apt-get install -y --no-install-recommends \
  gcc g++ git make wget python unzip

# 2. Install arm gcc toolchains
apt-get install -y --no-install-recommends \
  g++-arm-linux-gnueabi gcc-arm-linux-gnueabi \
  g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf \
  gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

# 3. Install cmake 3.10 or above
wget -c https://mms-res.cdn.bcebos.com/cmake-3.10.3-Linux-x86_64.tar.gz && \
  tar xzf cmake-3.10.3-Linux-x86_64.tar.gz && \
  mv cmake-3.10.3-Linux-x86_64 /opt/cmake-3.10 && \
  ln -s /opt/cmake-3.10/bin/cmake /usr/bin/cmake && \
  ln -s /opt/cmake-3.10/bin/ccmake /usr/bin/ccmake

了解基础编译参数

Paddle Lite 仓库中 ./lite/tools/build_linux.sh脚本文件用于构建linux版本的编译包,通过修改build_linux.sh脚本文件中的参数,可满足不同场景编译包的构建需求,常用的基础编译参数如下表所示: 有特殊硬件需求的编译参数见后文。

参数

说明

可选范围

默认值

arch

目标硬件的架构版本

armv8 / armv7hf / armv7 / x86

armv8

toolchain

C++ 语言的编译器工具链

gcc / clang

gcc

with_python

是否包含 python 编译包,目标应用程序是 python 语言时需配置为 ON

OFF / ON

OFF

with_cv

是否将 cv 函数加入编译包中

OFF / ON

OFF

with_log

是否在执行过程打印日志

OFF / ON

ON

with_exception

是否开启 C++ 异常

OFF / ON

OFF

with_extra

是否编译完整算子(见支持算子一节)

OFF / ON

OFF

with_profile

是否打开执行耗时分析

OFF / ON

OFF

with_precision_profile

是否打开逐层精度结果分析

OFF / ON

OFF

with_opencl

是否编译支持 OpenCL 的预测库

OFF / ON

OFF

编译步骤

# 下载 Paddle Lite 源码并切换到发布分支,如 develop
git clone https://github.com/PaddlePaddle/Paddle-Lite.git
cd Paddle-Lite && git checkout develop

# (可选) 删除 third-party 目录,编译脚本会自动从国内 CDN 下载第三方库文件
# rm -rf third-party

./lite/tools/build_linux.sh

说明: 编译过程中,如出现源码编译耗时过长,通常是第三方库下载过慢或失败导致。请在完成 Paddle Lite 源码下载后,删除本地仓库根目录下的 third-party 目录,编译脚本会自动下载存储于国内 CDN 的第三方依赖文件压缩包,节省从 GitHub repo 同步第三方库的时间。

验证编译结果

如果按./lite/tools/build_linux.sh中的默认参数执行,成功后会在 Paddle-Lite/build.lite.linux.armv8.gcc/inference_lite_lib.armlinux.armv8/ 生成 Paddle Lite 编译包,文件目录如下。

inference_lite_lib.armlinux.armv8/
├── 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_light_api_shared.so             C++ light_api 动态库
│
└── demo                                              C++
│   └── cxx                                           C++ 预测库 demo

多设备支持

OpenCL

  • 介绍

Paddle Lite 支持所有兼容 OpenCL 1.1 标准的 GPU 设备。

  • 基本参数

参数

说明

可选范围

默认值

with_opencl

是否包含 OpenCL 编译

OFF / ON

OFF

英特尔 FPGA

  • 介绍

Paddle Lite 已通过算子方式支持英特尔 FPGA 平台的预测部署。

  • 基本参数

参数

说明

可选范围

默认值

with_intel_fpga

是否包含英特尔 FPGA 编译

OFF / ON

OFF

intel_fpga_sdk_root

设置英特尔 FPGA sdk 目录

intel_sdk

空值

详细请参考 英特尔 FPGA 部署示例

昆仑芯 XPU

  • 介绍

Paddle Lite 已通过算子方式支持昆仑芯 XPU 在 x86 和 ARM 服务器(例如飞腾 FT-2000+/64)上进行预测部署。

  • 基本参数

参数

说明

可选范围

默认值

with_kunlunxin_xpu

是否包含 kunlunxin xpu 编译

OFF / ON

OFF

kunlunxin_xpu_sdk_url

kunlunxin xpu sdk 下载链接

用户自定义

https://baidu-kunlun-product.cdn.bcebos.com/KL-SDK/klsdk-dev_paddle

kunlunxin_xpu_sdk_env

kunlunxin xpu sdk 环境

bdcentos_x86_64 / centos7_x86_64 / ubuntu_x86_64 / kylin_aarch64

bdcentos_x86_64(x86) / kylin_aarch64(arm)

kunlunxin_xpu_sdk_root

设置 kunlunxin xpu sdk 目录

用户自定义

空值

详细请参考 昆仑芯 XPU 部署示例

NNAdapter

  • 介绍

NNAdapter 是飞桨推理 AI 硬件统一适配框架,可以通过它较为便捷的适配多种硬件。

  • 基本参数

参数

说明

可选范围

默认值

with_nnadapter

是否编译 NNAdapter

OFF / ON

OFF

NNAdapter 支持华为昇腾 NPU

参数

说明

可选范围

默认值

nnadapter_with_huawei_ascend_npu

是否编译华为昇腾 NPU 的 NNAdapter HAL 库

OFF / ON

OFF

nnadapter_huawei_ascend_npu_sdk_root

设置华为昇腾 CANN 目录

用户自定义

/usr/local/Ascend/ascend-toolkit/latest

详细请参考 华为昇腾 NPU 部署示例

NNAdapter 支持颖脉 NNA

参数

说明

可选范围

默认值

nnadapter_with_imagination_nna

是否编译颖脉 NNA 的 NNAdapter HAL 库

OFF / ON

OFF

nnadapter_imagination_nna_sdk_root

设置颖脉 imgdnn SDK 目录

用户自定义

空值

详细请参考 颖脉 NNA 部署示例

NNAdapter 支持瑞芯微 NPU

参数

说明

可选范围

默认值

nnadapter_with_rockchip_npu

是否编译瑞芯微 NPU 的 NNAdapter HAL 库

OFF / ON

OFF

nnadapter_rockchip_npu_sdk_root

设置瑞芯微 NPU DDK 目录

rk_npu_ddk

空值

详细请参考 瑞芯微 NPU 部署示例

NNAdapter 支持晶晨 NPU

参数

说明

可选范围

默认值

nnadapter_with_amlogic_npu

是否编译晶晨 NPU 的 NNAdapter HAL 库

OFF / ON

OFF

nnadapter_amlogic_npu_sdk_root

设置晶晨 NPU SDK 目录

用户自定义

空值

详细请参考 晶晨 NPU 部署示例

NNAdapter 支持芯原 TIM-VX

参数

说明

可选范围

默认值

nnadapter_with_verisilicon_timvx

是否编译芯原 TIM-VX 的 NNAdapter HAL 库

OFF / ON

OFF

nnadapter_verisilicon_timvx_src_git_tag

设置芯原 TIM-VX 的代码分支

TIM-VX repo 分支名

main

nnadapter_verisilicon_timvx_viv_sdk_url

设置芯原 TIM-VX SDK 的下载链接

用户自定义

Android系统:http://paddlelite-demo.bj.bcebos.com/devices/verisilicon/sdk/viv_sdk_android_9_armeabi_v7a_6_4_4_3_generic.tgz Linux系统:http://paddlelite-demo.bj.bcebos.com/devices/verisilicon/sdk/viv_sdk_linux_arm64_6_4_4_3_generic.tgz

nnadapter_verisilicon_timvx_viv_sdk_root

设置芯原 TIM-VX 的本地路径

用户自定义

空值

详细请参考 芯原 TIM-VX 部署示例

NNAdapter 支持亿智 NPU

参数

说明

可选范围

默认值

nnadapter_with_eeasytech_npu

是否编译亿智 NPU 的 NNAdapter HAL 库

OFF / ON

OFF

nnadapter_eeasytech_npu_sdk_root

设置亿智 NPU DDK 目录

用户自定义

空值

详细请参考 亿智 NPU 部署示例