文章目录
- [1. 背景](#1. 背景)
- [2. 硬件与软件环境](#2. 硬件与软件环境)
-
- [2.1 目标板(AllWinner T507)](#2.1 目标板(AllWinner T507))
- [2.2 编译主机(x86_64 宿主机)](#2.2 编译主机(x86_64 宿主机))
- [3. 推理框架和模型选择](#3. 推理框架和模型选择)
-
- [3.1 为什么选择 llama.cpp](#3.1 为什么选择 llama.cpp)
- [3.2 为什么选择 Qwen2.5-0.5B-Instruct](#3.2 为什么选择 Qwen2.5-0.5B-Instruct)
- [4. 编译过程](#4. 编译过程)
-
- [4.1 第一步:准备交叉编译工具链](#4.1 第一步:准备交叉编译工具链)
- [4.2 第二步:安装 CMake](#4.2 第二步:安装 CMake)
- [4.3 第三步:配置交叉编译](#4.3 第三步:配置交叉编译)
- [4.4 第四步:编译](#4.4 第四步:编译)
- [5. 部署过程](#5. 部署过程)
-
- [5.1 第一步:配置 T507 网络](#5.1 第一步:配置 T507 网络)
- [5.2 第二步:传输二进制文件](#5.2 第二步:传输二进制文件)
- [5.3 第三步:下载模型](#5.3 第三步:下载模型)
- [5.4 第四步:运行推理](#5.4 第四步:运行推理)
- [5.5 运行结果](#5.5 运行结果)
- [5.6 性能指标](#5.6 性能指标)
- [5.7 启动 API 服务](#5.7 启动 API 服务)
- [6. 经验总结](#6. 经验总结)
-
- [6.1 关键坑点](#6.1 关键坑点)
- [6.2 优化方向](#6.2 优化方向)
- [6.3 适用场景](#6.3 适用场景)
1. 背景
AllWinner T507 是一款面向工业控制的 Arm Cortex-A53 四核处理器,主频最高 1.5GHz,常见于嵌入式 HMI、工业网关等场景。本文记录在这类资源受限的嵌入式设备上,通过交叉编译 llama.cpp 并部署 Qwen2.5-0.5B-Instruct 量化模型的完整过程。
目标:在 T507 上运行一个可交互的文本生成模型,验证嵌入式平台运行大语言模型的可行性。
2. 硬件与软件环境
2.1 目标板(AllWinner T507)
| 资源 | 配置 |
|---|---|
| CPU | AllWinner T507,四核 Cortex-A53,最高 1.512GHz |
| 内存 | 1.9GB |
| 存储 | eMMC 7.29GB,根分区可用 4.2GB |
| GPU | Arm Mali-G31 MP2(本方案不使用) |
| 系统 | Ubuntu 20.04 LTS,内核 4.9.170 |
| 网络 | 千兆以太网,DHCP 获取 IP |
2.2 编译主机(x86_64 宿主机)
| 项目 | 配置 |
|---|---|
| 发行版 | Ubuntu 20.04.6 LTS (Focal Fossa) |
| 架构 | x86_64 |
| CPU | 8 核 |
| 内存 | 16GB |
| CMake | 4.4.3(snap 安装) |
| 交叉编译器 | aarch64-linux-gnu-g++ 9.4.0 |
| 宿主机 g++ | 9.4.0 |
| Git | 2.25.1 |
3. 推理框架和模型选择
3.1 为什么选择 llama.cpp
llama.cpp 是纯 C/C++ 实现的大模型推理框架,不依赖 Python、PyTorch 等重型运行时,支持 ARM 架构交叉编译,是嵌入式平台运行量化模型的首选方案。
3.2 为什么选择 Qwen2.5-0.5B-Instruct
- 参数量仅 5 亿,Q4_K_M 量化后模型文件约 400MB
- 推理时内存占用约 500-700MB,适配 T507 的 1.9GB 内存
- 经过指令微调,能理解和执行简单对话指令
- 有官方 GGUF 格式发布,可直接被 llama.cpp 加载
4. 编译过程
4.1 第一步:准备交叉编译工具链
最初尝试使用全志 SDK 自带的 Linaro GCC 5.3.1,但编译失败,原因是该版本对 C++17 支持不完整:
text
error: 'to_string' is not a member of 'std'
error: expected '(' before 'constexpr'
改用 Ubuntu 系统包 gcc-aarch64-linux-gnu(GCC 9.4.0),完整支持 C++17:
bash
$ sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
$ aarch64-linux-gnu-g++ --version
aarch64-linux-gnu-g++ (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
4.2 第二步:安装 CMake
llama.cpp 的 UI 构建脚本要求 CMake ≥ 3.18,Ubuntu 20.04 系统自带的 3.16.3 不满足。通过 snap 安装新版:
bash
sudo snap install cmake --classic
安装后清理 shell 命令哈希缓存:
bash
hash -r
验证:
bash
$ which cmake
make version 4.4.3
CMake suite maintained and supported by Kitware (kitware.com/cmake).
$ cmake --version
# cmake version 4.4.3
4.3 第三步:配置交叉编译
设置环境变量:
bash
export CROSS=aarch64-linux-gnu-
export CC=${CROSS}gcc
export CXX=${CROSS}g++
export AR=${CROSS}ar
export RANLIB=${CROSS}ranlib
export STRIP=${CROSS}strip
配置 CMake:
bash
cmake -B build-aarch64 \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_PROCESSOR=aarch64 \
-DCMAKE_C_COMPILER=${CC} \
-DCMAKE_CXX_COMPILER=${CXX} \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=OFF \
-DLLAMA_CURL=OFF \
-DGGML_OPENMP=OFF \
-DLLAMA_BUILD_TESTS=OFF \
-DLLAMA_BUILD_EXAMPLES=OFF
关键参数说明:
| 参数 | 作用 |
|---|---|
| CMAKE_SYSTEM_NAME=Linux | 触发交叉编译模式 |
| CMAKE_SYSTEM_PROCESSOR=aarch64 | 指定目标架构 |
| BUILD_SHARED_LIBS=OFF | 静态链接,减少目标板依赖 |
| LLAMA_CURL=OFF | 禁用 curl 依赖 |
| GGML_OPENMP=OFF | 禁用 OpenMP |
4.4 第四步:编译
bash
cmake --build build-aarch64 --config Release -j$(nproc)
编译成功后,可执行文件位于 build-aarch64/bin/,核心文件为 llama-cli(16MB)和 llama-server(15MB)。
验证文件指令架构:
bash
$ file build-aarch64/bin/llama-cli
build-aarch64/bin/llama-cli: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=82e10aa4f5587e8efeeeb54bcd4c03ef7b5db9f0, for GNU/Linux 3.7.0, not stripped
5. 部署过程
5.1 第一步:配置 T507 网络
T507 原本使用静态 IP(192.168.0.202),由 /etc/network/interfaces.d/ 下的 ifupdown 配置管理。改为 DHCP:
text
auto eth0
allow-hotplug eth0
iface eth0 inet dhcp
重启网络后,T507 从局域网 DHCP 服务器获取到 192.168.2.135。
注:笔者因为将 T507 接在局域网内的路由器上,所以使用了 DHCP,读者可根据自己的网络环境选择合适的方式。
5.2 第二步:传输二进制文件
在编译主机打包编译生成的 llama-cli 和 llama-server 后传输到 T507:
bash
cd build-aarch64/bin
tar czf llama-bin-aarch64.tar.gz llama-cli llama-server
scp llama-bin-aarch64.tar.gz root@192.168.2.135:/root/
然后在 T507 解压:
bash
cd /root
tar xzf llama-bin-aarch64.tar.gz
chmod +x llama-cli llama-server
5.3 第三步:下载模型
bash
cd ~/models
wget https://modelscope.cn/models/second-state/Qwen2.5-0.5B-Instruct-GGUF/resolve/master/Qwen2.5-0.5B-Instruct-Q4_K_M.gguf
笔者是现在编译主机下载模型文件,然后再传送到 T507:
bash
scp Qwen2.5-0.5B-Instruct-Q4_K_M.gguf root@192.168.2.135:/root/models/
5.4 第四步:运行推理
将 T507 CPU 调至性能模式:
bash
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
启动对话:
bash
/root/llama-cli -m /root/models/Qwen2.5-0.5B-Instruct-Q4_K_M.gguf \
-p "你好,请用一句话介绍你自己" -n 128 -t 4
5.5 运行结果

5.6 性能指标
| 指标 | 数值 |
|---|---|
| Prompt | 处理速度 7.9 tokens/s |
| 生成速度 | 3.9 tokens/s |
| 模型格式 | Q4_K_M |
| 内存占用 | 约 600MB |
生成速度 3.9 tokens/s 对 Cortex-A53 来说属于正常水平,适合简单问答、文本分类、信息抽取等场景,不适合长文本生成或复杂推理。
5.7 启动 API 服务
如需供其他程序调用,启动 HTTP 服务:
bash
/root/llama-server -m /root/models/Qwen2.5-0.5B-Instruct-Q4_K_M.gguf \
--host 0.0.0.0 --port 8080 -t 4
浏览器访问 http://192.168.2.135:8080 即可使用 Web 对话界面。该接口兼容 OpenAI API 格式,可被现有工具直接调用。
运行效果如下:


6. 经验总结
6.1 关键坑点
-
交叉编译器版本:全志 SDK 自带的 Linaro GCC 5.3.1 对 C++17 支持不完整,必须使用 GCC 9+。系统包 gcc-aarch64-linux-gnu 是更省心的选择。
-
CMake 版本:llama.cpp 的 UI 构建脚本要求 CMake ≥ 3.18,Ubuntu 20.04 自带的 3.16.3 不满足,需通过 snap 升级。
-
模型下载:HuggingFace 在国内直连不稳定,ModelScope 镜像可稳定下载 Qwen 系列 GGUF 模型。
-
动态链接依赖:交叉编译产物是动态链接的,目标板需有兼容的 glibc 和 libstdc++。本次 T507 运行 Ubuntu 20.04,glibc 版本匹配,未遇到依赖问题。
6.2 优化方向
- 调整线程数(-t 参数),找到 CPU 核心数与调度开销的平衡点
- 降低量化精度(Q4_0 替代 Q4_K_M),提升速度但牺牲部分质量
- 限制上下文长度(-c 参数),减少 KV Cache 内存占用
- 创建 Swap 文件,为多进程并发提供内存缓冲
6.3 适用场景
在 T507 这类嵌入式平台上,0.5B 级别模型适合:
- 简单问答与知识查询
- 文本分类与情感分析
- 结构化信息抽取
- 格式转换(如自然语言转 JSON)
- 简单翻译
- 短文本生成
不适合复杂推理、长文写作、高事实准确性要求的任务。