训练营简介
2025年昇腾CANN训练营第二季,基于CANN开源开放全场景,推出0基础入门系列、码力全开特辑、开发者案例等专题课程,助力不同阶段开发者快速提升算子开发技能。获得Ascend C算子中级认证,即可领取精美证书,完成社区任务更有机会赢取华为手机,平板、开发板等大奖。

报名链接:https://www.hiascend.com/developer/activities/cann20252#cann-camp-2502-intro

前言

“万物互联,智在端侧。”

在昇腾的生态版图中,端云协同是重要的一环。我们在云端(Ascend 910)训练好的大模型,最终往往需要量化剪枝后,运行在边缘设备(Ascend 310B / Nano)上。

OpenHarmony 作为面向万物互联的操作系统,与昇腾 NPU 的结合(如 Orange Pi AIpro 开发板)正在成为 AIoT 开发的新范式。

但在端侧跑算子,最头疼的就是环境不一致:你的代码是在 PC 上写的,但要跑在 ARM 架构的板子上。这就涉及到交叉编译。本期文章将带你跨越架构的鸿沟,实现“一次编写,端侧运行”。

一、 核心图解:跨越架构的桥梁

PC 是 x86 架构,端侧是 ARM 架构。它们就像讲不同语言的两个人。 交叉编译器(Cross Compiler) 就是翻译官,它运行在 x86 上,但能生成 ARM 能听懂的二进制指令。

二、 环境准备:搭建交叉编译工具链

要进行 OpenHarmony 开发,我们需要 SDK 和 NPU 驱动包。

2.1 获取 SDK

下载 OpenHarmony SDK(包含 Native C++ 工具链)。 核心工具是 clang / clang++,它们被配置为目标架构是 aarch64-linux-ohos

2.2 获取昇腾 ACL 库 (ARM版)

这是最容易出错的一步。 注意:你不能链接 PC 上的 /usr/local/Ascend 库,因为那是 x86 的。 你需要下载 Ascend-cann-toolkit_linux-aarch64.run,并提取其中的 runtime/lib64include 目录,作为编译时的依赖。

三、 实战:配置 CMake 进行交叉编译

假设我们要部署一个调用 AddCustom 算子的 C++ 推理应用。

3.1 编写 CMakeLists.txt

我们需要告诉 CMake:别用本地的 GCC,用鸿蒙的 Clang!

# toolchain.cmake (工具链配置文件)
set(CMAKE_SYSTEM_NAME OHOS)
set(CMAKE_SYSTEM_PROCESSOR aarch64)

# 指定编译器路径 (指向 OHOS SDK)
set(CMAKE_C_COMPILER   ${OHOS_SDK}/native/llvm/bin/clang)
set(CMAKE_CXX_COMPILER ${OHOS_SDK}/native/llvm/bin/clang++)

# 指定 Sysroot (头文件和库的基础路径)
set(CMAKE_SYSROOT ${OHOS_SDK}/native/sysroot)

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(OhosAscendApp)

# 1. 包含 Ascend 头文件 (ARM版)
include_directories(${ASCEND_ARM_LIBS}/include)

# 2. 链接 Ascend 库 (ARM版)
link_directories(${ASCEND_ARM_LIBS}/lib64)

add_executable(main main.cpp)

# 3. 链接 ACL 库
# 注意:OpenHarmony 上通常链接 libascendcl.so
target_link_libraries(main ascendcl acl_dvpp stdc++)

3.2 编译指令

mkdir build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake
make -j

编译成功后,你会得到一个 ARM 架构的可执行文件 main。可以通过 file main 命令确认: main: ELF 64-bit LSB executable, ARM aarch64

四、 部署与运行:HDC 的妙用

OpenHarmony 使用 HDC (HarmonyOS Device Connector) 工具进行设备管理(类似 Android 的 ADB)。

4.1 推送文件

将编译好的 main 和转换好的算子模型 .om 推送到板子上。

# 1. 推送可执行文件
hdc file send ./main /data/local/tmp/

# 2. 推送模型文件
hdc file send ./model_add.om /data/local/tmp/

# 3. 赋予执行权限
hdc shell "chmod +x /data/local/tmp/main"

4.2 运行与调试

# 进入设备 Shell
hdc shell

# 设置库路径 (如果 ACL 库不在系统默认路径)
export LD_LIBRARY_PATH=/usr/lib64:/data/local/tmp/libs:$LD_LIBRARY_PATH

# 运行
cd /data/local/tmp
./main

如果看到 [INFO] Execute Success!,恭喜你,你的 Ascend C 算子已经在鸿蒙设备上跑起来了!

五、 端侧开发的特殊约束

在端侧(如 Ascend 310B),资源非常紧张,代码习惯要改改:

  1. 内存池化:端侧系统内存(OS Memory)和 NPU 内存往往是共享物理内存(Unified Memory)。尽量复用 Buffer,避免频繁 malloc/free 造成碎片。

  2. 静态 Shape:端侧推理强烈建议使用 Static Shape。动态 Shape 会导致运行时的 Tiling 计算和 workspace 申请,增加时延抖动。

  3. ACL Lite:如果是极简应用,可以考虑使用 ACL Lite 库,它是对标准 ACL 的封装,代码量更少,更适合嵌入式开发。

六、 总结

端云一体是 AI 的未来形态。

  1. 开发:在 x86 服务器上使用 MindStudio 开发和仿真。

  2. 编译:使用交叉编译工具链生成 ARM 二进制。

  3. 部署:通过 HDC 推送到 OpenHarmony 设备运行。

掌握了这一套流程,你就打通了从云端算法边缘硬件的任督二脉。你的算子将不再局限于机房,而是能深入到千行百业的智能终端中。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐