欢迎光临
我们一直在努力

plucky ports不支持arm64吗

在AI模型部署领域,将模型从x86服务器迁移到低功耗的ARM64(AArch64)边缘设备(如NVIDIA Jetson系列或树莓派)是常见的需求。虽然通常可以使用预编译的包,但为了最大限度地利用ARM架构的特定优化指令集(如NEON),我们往往需要进行定制化的交叉编译。

当涉及到类似于“plucky ports”这样,针对特定架构或定制系统的编译移植问题时,最可靠的解决方案是建立一个稳定且可复现的交叉编译环境。本文将以ONNX Runtime为例,详细介绍如何在x86主机上,利用Docker和QEMU环境,高效地为ARM64目标设备编译出高性能的ONNX Runtime库。

1. 为什么需要交叉编译?

直接在资源受限的ARM设备上编译大型项目(如ONNX Runtime)耗时长且容易因内存不足而失败。交叉编译允许我们在强大的x86主机上执行编译过程,但生成针对ARM64目标架构的二进制文件。

2. 准备交叉编译环境 (Docker + QEMU)

我们使用Docker来封装所有依赖,并使用binfmt_misc和QEMU来模拟ARM64环境,确保编译环境的隔离和可移植性。

首先,在宿主机上安装QEMU支持:

******bash
sudo apt update
sudo apt install qemu-user-static
sudo docker run –rm –privileged multiarch/qemu-user-static –reset -p yes


接下来,创建一个基于目标架构的Docker镜像(例如使用Ubuntu ARM64基础镜像,并安装编译工具链)。

Dockerfile (arm64_cross_compile):

******dockerfile

使用支持ARM64的Ubuntu基础镜像

FROM ubuntu:20.04

设置环境变量和安装必要的依赖

RUN apt update && apt install -y \n build-essential \n cmake \n git \n libprotobuf-dev \n protobuf-compiler \n wget \n python3 \n python3-pip

RUN pip3 install numpy protobuf

创建一个存放源代码的工作目录

WORKDIR /src


构建并进入容器:

******bash
docker build -t onnxruntime-arm64-env .
docker run -it onnxruntime-arm64-env /bin/bash


3. 获取ONNX Runtime源码并创建Toolchain文件

在容器内部,下载ONNX Runtime的稳定版本源码:

******bash
git clone –recursive https://github.com/microsoft/onnxruntime
cd onnxruntime
git checkout v1.17.1 # 使用一个稳定版本


为了让CMake知道我们正在进行交叉编译,我们需要一个工具链文件(arm64.cmake)。这个文件定义了目标架构、编译器路径和系统根目录。

arm64.cmake:

******cmake

指定目标架构

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_PROCESSOR aarch64)

指定编译器路径 (如果使用系统的cross-compiler)

这里我们假设在容器内,编译器可以直接工作

SET(CMAKE_C_COMPILER /usr/bin/gcc)
SET(CMAKE_CXX_COMPILER /usr/bin/g++)

告诉CMake查找/usr/aarch64-linux-gnu下的库 (如果使用外部工具链)

SET(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu)

只在指定的路径中搜索程序,避免使用宿主机的程序

SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

在指定的路径中搜索库和头文件

SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)


4. 执行ONNX Runtime交叉编译

关键在于在cmake命令中指定工具链文件,并启用特定于ARM64的优化,尤其是NEON指令集。NEON是ARM架构上的SIMD(单指令多数据)扩展,对于模型推理的性能至关重要。

/src/onnxruntime目录下执行以下步骤:

******bash

创建构建目录

mkdir build_arm64
cd build_arm64

核心编译指令

/usr/bin/python3 ../tools/ci_build/build.py \n –config Release \n –build_dir . \n –cmake_extra_defines \n CMAKE_TOOLCHAIN_FILE=../arm64.cmake \n onnxruntime_RUN_ONNX_TESTS=OFF \n onnxruntime_DEV_MODE=OFF \n onnxruntime_BUILD_SHARED_LIB=ON \n onnxruntime_USE_NEON=ON \n onnxruntime_GPGPU_BUILD=OFF \n onnxruntime_BUILD_UNIT_TESTS=OFF \n onnxruntime_CROSS_COMPILING=ON \n –build_wheel \n –parallel


参数说明:
* CMAKE_TOOLCHAIN_FILE=../arm64.cmake: 引入交叉编译配置。
* onnxruntime_USE_NEON=ON: 强制启用ARM NEON优化,这是提升推理速度的关键。
* onnxruntime_BUILD_SHARED_LIB=ON: 构建动态链接库(.so文件)以便部署。

编译完成后,生成的.so文件或Python Wheel包(如果使用了–build_wheel)将位于build_arm64/Release目录下,这些文件可以直接部署到目标ARM64设备上,提供原生优化的性能。

【本站文章皆为原创,未经允许不得转载】:汤不热吧 » plucky ports不支持arm64吗
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址