尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

旧手机跑大模型:OlliteRT 与 GGUF 端侧推理实战

发布时间:2026/9/26 14:07:02

资讯中心
01
ARTICLE

旧手机跑大模型:OlliteRT 与 GGUF 端侧推理实战

旧手机跑大模型:OlliteRT 与 GGUF 端侧推理实战
1. 为什么要在旧手机上折腾大模型手里有台两三年前的安卓机骁龙 865 或者天玑 1200 这种日常用着还行但卖二手也就几百块。扔了可惜留着吃灰。我去年翻出一台 8GB 内存的旧机器突然想到这玩意儿有 CPU、有 GPU、有 NPU算力其实比十年前的工作站还强为什么不能让它跑个大模型这个念头一出来就收不住了。市面上确实有一些方案比如用 Termux 跑 llama.cpp或者用 MLC-LLM 的安卓版本但要么配置繁琐要么性能拉胯。后来我注意到OlliteRT这个项目它的定位很明确在安卓设备上通过NNAPI和GPU加速来推理GGUF格式的模型。简单说就是把桌面端 llama.cpp 那套东西用安卓原生的神经网络接口重新包装了一遍让旧手机也能跑起来 7B 甚至 13B 的量化模型。这篇文章适合谁看如果你手里有闲置的安卓手机想拿它做个本地 AI 助手、离线翻译机、或者单纯想折腾一下端侧推理那这篇内容应该能帮你省下不少查文档和踩坑的时间。我会从项目结构、环境搭建、模型转换、性能调优几个方面把整个流程拆开讲清楚。涉及到的工具包括Android Studio、GGUF模型文件、NNAPI代理配置以及 GPU 后端的选择逻辑。先说结论一台骁龙 865、8GB 内存的手机跑 Q4_K_M 量化的 7B 模型推理速度大概在 3-5 token/s虽然比不上桌面端但做离线问答、文本摘要这类任务已经够用了。关键是整个过程不需要 root不需要复杂的交叉编译用 Android Studio 就能搞定。2. OlliteRT 项目架构与核心组件拆解2.1 项目定位它到底解决了什么问题安卓端跑大模型核心痛点有三个第一模型文件太大动辄几个 GB怎么高效加载和内存映射第二安卓的硬件碎片化严重不同芯片的加速接口不一样怎么统一调用第三推理框架的依赖太重很多方案需要完整的 Python 环境或者 JNI 编译链。OlliteRT 的思路是用GGUF作为模型格式因为 GGUF 本身就是为端侧推理设计的支持内存映射和量化加载速度快。然后通过NNAPI作为硬件抽象层把推理任务分发给 CPU、GPU 或者 NPU。NNAPI 是安卓 8.1 引入的到安卓 12 以后已经比较成熟了主流芯片厂商都有对应的驱动实现。项目本身是一个 Android Studio 工程核心代码分三块模型加载模块、推理引擎模块、以及 UI 交互模块。模型加载用的是 mmap 方式避免一次性把整个模型读进内存推理引擎封装了 llama.cpp 的 C 接口通过 JNI 调用UI 部分就是一个简单的聊天界面方便测试。2.2 核心依赖与版本选择在开始之前有几个关键依赖需要确认版本组件推荐版本说明Android StudioHedgehog 2023.1.1 或更高支持最新的 NDK 和 CMakeNDK25.2.9519653与 llama.cpp 的编译要求匹配CMake3.22.1Android Studio 自带GGUF 模型Q4_K_M 或 Q5_K_M平衡体积和精度最低 SDKAPI 28 (Android 9)NNAPI 从 API 27 开始但 28 更稳定这里重点说一下 NDK 版本。我试过用 NDK 26 编译结果 llama.cpp 的某些汇编优化会报错后来退回 25.2 就正常了。如果你遇到undefined reference to __android_log_print这类错误大概率是 NDK 版本不匹配。2.3 NNAPI 与 GPU 后端的选择逻辑OlliteRT 支持两种加速后端NNAPI 和 GPU。NNAPI 的好处是统一接口厂商驱动会自己决定用 CPU、GPU 还是 NPU 来执行。但实际测试下来NNAPI 在旧设备上的表现并不稳定有些算子会回退到 CPU反而更慢。GPU 后端则是直接调用 OpenCL 或 Vulkan 来计算绕过 NNAPI 的调度。在骁龙 865 上Adreno 650 的 OpenCL 性能还不错跑矩阵乘法比 CPU 快 2-3 倍。但 GPU 后端的缺点是功耗高手机容易发热降频。我的建议是先用 NNAPI 跑一遍看看adb shell dumpsys nnapi的输出确认哪些算子被加速了。如果大部分算子都回退到 CPU那就切到 GPU 后端。如果 GPU 也不理想那就老老实实用 CPU至少稳定。3. 从零搭建 OlliteRT 开发环境3.1 Android Studio 安装与中文设置Android Studio 的安装没什么好说的官网下载安装包一路下一步就行。但有几个设置项需要调整第一关闭自动注入。有些版本的 Android Studio 会默认开启一个叫“自动注入”的功能会在你不知情的情况下修改 Gradle 配置。在 Settings Build, Execution, Deployment Compiler 里把“Auto-inject”相关的选项全部关掉。这个功能在旧版本里叫“小冉自动注入”新版本可能改了名字但逻辑是一样的。第二设置中文界面。Android Studio 本身没有官方中文但可以通过插件实现。在 Settings Plugins 里搜索“Chinese”安装“Chinese (Simplified) Language Pack”插件重启后界面就变成中文了。不过我个人建议还是用英文因为很多报错信息和文档都是英文的中文翻译反而容易混淆。第三配置 SDK 和 NDK。在 Settings Appearance Behavior System Settings Android SDK 里勾选 API 28 到 API 34 的 SDK Platform然后在 SDK Tools 标签页里勾选 NDK (Side by side) 和 CMake。NDK 版本选 25.2.9519653这是经过验证的稳定版本。3.2 项目克隆与 Gradle 配置从 GitHub 克隆 OlliteRT 项目git clone https://github.com/ollitert/ollitert-android.git cd ollitert-android打开项目后Gradle 会开始同步。这时候大概率会遇到两个问题一是 Gradle 版本不匹配二是依赖下载超时。Gradle 版本问题可以通过修改gradle/wrapper/gradle-wrapper.properties解决distributionUrlhttps\://services.gradle.org/distributions/gradle-8.2-bin.zip依赖下载超时的话在build.gradle里把仓库换成国内镜像repositories { maven { url https://maven.aliyun.com/repository/google } maven { url https://maven.aliyun.com/repository/central } maven { url https://maven.aliyun.com/repository/gradle-plugin } }同步完成后连接手机开启 USB 调试点击 Run 按钮项目应该能直接安装到手机上。如果报错INSTALL_FAILED_USER_RESTRICTED需要在开发者选项里关闭“MIUI 优化”或者“权限监控”。3.3 模型文件的准备与导入OlliteRT 需要GGUF格式的模型。你可以从 Hugging Face 或者 ModelScope 下载现成的 GGUF 文件也可以自己用 llama.cpp 的convert.py脚本转换。下载模型时注意选择量化版本。Q4_K_M 是性价比最高的7B 模型大概 4GB 左右Q5_K_M 大概 5GBQ8_0 则接近 8GB。旧手机内存有限建议从 Q4_K_M 开始。模型文件下载后需要放到手机的存储里。有两种方式第一种通过 adb pushadb push model.gguf /sdcard/Android/data/com.ollitert.app/files/models/第二种直接在手机上下载然后用文件管理器移动到对应目录。注意Android 11 以后/sdcard/Android/data/目录对普通文件管理器不可见需要用系统自带的文件应用或者 adb 来操作。如果遇到content://com.tencent.wework.fileprovider/external_path/android/data/com...这类路径说明你正在通过第三方应用访问受限目录。这种情况下建议直接用 adb 推送避免权限问题。4. 推理引擎配置与性能调优4.1 NNAPI 代理的启用与参数调整在 OlliteRT 的代码里NNAPI 的配置在NativeLib.java里public static native long initContext(String modelPath, int nThreads, boolean useNNAPI, boolean useGPU);useNNAPI设为 true 时会尝试用 NNAPI 加速。但 NNAPI 的行为取决于设备厂商的驱动实现。在骁龙设备上可以通过adb shell dumpsys nnapi查看哪些算子被加速了。如果发现大部分算子都回退到 CPU可以尝试强制指定 NNAPI 的加速设备// 在 initContext 之前调用 NativeLib.setNNAPIAccelerator(1); // 0: CPU, 1: GPU, 2: NPU这个接口不是所有设备都支持如果设置后崩溃就说明驱动不支持。4.2 GPU 后端的编译与调用GPU 后端需要单独编译。在CMakeLists.txt里找到USE_GPU选项设为 ONoption(USE_GPU Use GPU backend ON)然后重新编译 native 库。编译完成后在初始化时把useGPU设为 true。GPU 后端的性能调优主要看两个参数nThreads和nGpuLayers。nThreads是 CPU 线程数一般设为 4 到 6nGpuLayers是放到 GPU 上计算的层数设为 0 表示全部用 CPU设为模型总层数表示全部用 GPU。在骁龙 865 上7B 模型大概有 32 层我试过nGpuLayers20速度比纯 CPU 快 40% 左右但功耗也高了 30%。如果手机发热严重可以降到 10 层。4.3 内存映射与模型加载优化GGUF 格式支持内存映射这是它比 GGML 格式快的重要原因。在 OlliteRT 里模型加载用的是mmap系统调用代码在llama-android.cpp里void* model_data mmap(NULL, model_size, PROT_READ, MAP_PRIVATE, fd, 0);这种方式的好处是模型文件不需要全部读进内存操作系统会按需加载。对于 8GB 内存的手机来说跑 7B Q4_K_M 模型实际内存占用大概在 4.5GB 左右剩下的留给系统和应用。但内存映射也有坑。如果模型文件放在 SD 卡上mmap 的性能会差很多因为 SD 卡的随机读取速度远不如内置存储。所以模型文件一定要放在内置存储的/data分区里。另外Android 的 low memory killer 可能会在后台杀掉进程导致模型重新加载。可以在AndroidManifest.xml里加上android:largeHeaptrue并且把应用设为前台服务减少被杀的几率。5. 实操流程从编译到跑通第一个模型5.1 编译 Native 库的完整步骤打开 Android Studio 的 Terminal进入项目根目录cd app/src/main/cpp mkdir build cd build cmake -DCMAKE_TOOLCHAIN_FILE$ANDROID_NDK/build/cmake/android.toolchain.cmake \ -DANDROID_ABIarm64-v8a \ -DANDROID_PLATFORMandroid-28 \ -DUSE_GPUON \ .. make -j4编译完成后会在build目录下生成libollitert.so。把这个文件复制到app/src/main/jniLibs/arm64-v8a/目录下。这里注意ANDROID_NDK环境变量要指向正确的 NDK 路径。如果没设置可以直接写绝对路径。5.2 模型转换与量化参数选择如果你手头只有 PyTorch 或 SafeTensors 格式的模型需要先转换成 GGUF。用 llama.cpp 的convert.pypython convert.py --input-model ./llama-7b --output-model ./llama-7b.gguf --outtype f16然后量化./quantize ./llama-7b.gguf ./llama-7b-Q4_K_M.gguf Q4_K_M量化参数的选择逻辑Q4_K_M 是 4-bit 量化但关键层用 6-bit平衡了精度和体积Q5_K_M 是 5-bit精度更高但体积大 20%Q8_0 是 8-bit几乎无损但体积翻倍。对于旧手机Q4_K_M 是最优解。5.3 首次运行与日志排查安装 APK 后打开应用选择模型文件点击加载。这时候用adb logcat查看日志adb logcat | grep -i ollitert正常的话会看到I/OlliteRT: Loading model from /sdcard/Android/data/com.ollitert.app/files/models/llama-7b-Q4_K_M.gguf I/OlliteRT: Model loaded, size: 4.2GB I/OlliteRT: NNAPI accelerator: GPU I/OlliteRT: Context initialized, nThreads4, nGpuLayers20如果卡在Loading model不动大概率是文件路径不对或者权限不足。检查AndroidManifest.xml里有没有READ_EXTERNAL_STORAGE权限Android 13 以后还需要READ_MEDIA_IMAGES之类的细分权限。如果报错NNAPI accelerator not available说明设备不支持 NNAPI 的 GPU 加速需要切回 CPU 模式。6. 性能调优与常见问题排查6.1 推理速度优化的五个关键参数参数推荐值影响nThreads4-6太高会导致线程竞争太低跑不满 CPUnGpuLayers10-20越高越快但功耗和发热也越高nBatch512批处理大小影响 prompt 处理速度nCtx2048上下文长度越大内存占用越高useMmaptrue开启内存映射减少加载时间实测数据骁龙 8657B Q4_K_MnThreads4nGpuLayers20nBatch512nCtx2048推理速度 4.2 token/s。如果把 nGpuLayers 降到 0速度降到 2.8 token/s。如果把 nThreads 提到 8速度反而降到 3.9 token/s因为大核调度不过来。6.2 常见崩溃与报错速查表报错信息原因解决方法GPU发生崩溃或D3D设备已移除GPU 驱动超时降低 nGpuLayers 或切回 CPUcooperative thread array相关错误GPU 不支持 CTA关闭 GPU 后端unsupported GPU设备 GPU 太旧只用 CPUcontent://...fileprovider权限拒绝第三方应用访问受限目录用 adb push 代替INSTALL_FAILED_USER_RESTRICTED厂商限制安装关闭 MIUI 优化或权限监控undefined reference to __android_log_printNDK 版本不匹配换 NDK 25.26.3 发热与功耗控制经验旧手机跑大模型最大的敌人是发热。骁龙 865 的 GPU 满载功耗大概 5W加上 CPU 和内存整机功耗能到 8W。手机散热跟不上几分钟后就会降频。我的做法是第一摘掉手机壳用散热背夹第二把 nGpuLayers 控制在 15 以内第三在应用里加一个温度监控超过 45 度就自动降频。还有一个技巧把推理任务放在后台线程UI 线程只负责显示。这样即使推理卡顿界面也不会 ANR。7. 进阶玩法与扩展方向7.1 多模型切换与模型管理OlliteRT 默认只加载一个模型但你可以改代码支持多模型切换。核心思路是维护一个模型列表每次切换时释放旧的 context加载新的模型。public void switchModel(String modelPath) { if (currentContext ! 0) { NativeLib.freeContext(currentContext); } currentContext NativeLib.initContext(modelPath, 4, true, true); }注意释放 context 后要调用System.gc()否则内存可能不会立即回收。7.2 结合 RAG 做本地知识库跑通推理后可以进一步做 RAG。思路是用一个小型 embedding 模型比如 all-MiniLM-L6-v2把文档向量化存到本地 SQLite 里。查询时先检索相关段落再拼接到 prompt 里送给大模型。embedding 模型也可以用 GGUF 格式跑在 CPU 上就行速度要求不高。7.3 模型微调与算子优化如果你懂 CUDA 或者 OpenCL可以自己写 kernel 算子来加速特定操作。比如 attention 里的 softmax用 GPU 并行计算比 CPU 快很多。但这条路门槛较高需要熟悉 GPU 架构和并行计算模型。另一个方向是模型微调。用 LoRA 在桌面端微调好然后合并到 GGUF 里再部署到手机。这样可以让模型更适应特定任务比如客服问答或者代码补全。我在实际使用中发现旧手机跑大模型最大的瓶颈不是算力而是内存带宽。骁龙 865 的 LPDDR5 带宽大概 44GB/s而桌面端的 DDR5 能到 80GB/s 以上。所以模型量化得越狠内存压力越小速度反而越快。Q4_K_M 比 Q5_K_M 快 15% 左右精度损失在可接受范围内。最后分享一个小技巧如果你的手机支持 UFS 3.0 或更高模型加载速度会快很多。UFS 2.1 的随机读取大概 100MB/sUFS 3.0 能到 300MB/s 以上。所以尽量选内置存储别用 SD 卡。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。