公开文章

Android 端侧大模型技术路线全景图

Android 端侧大模型实战第二篇:从模型文件、量化、分发、加载、推理引擎到性能采样,梳理行业终端本地部署路线

Android 端侧大模型技术路线全景图

大家好,我是唐人。

上一篇我们先把方向定下来:

端侧大模型,不应该只盯普通手机 App。

真正更适合端侧 AI 的,往往是教育平板、医疗终端、车机、工控手持、门店设备这类行业 Android 终端。

原因也很现实:设备型号更可控,网络环境更复杂,数据更垂直,也更有机会把模型预装、下载、校验、升级和性能调优做成一套闭环。

所以第二篇,我们不写 App 层的按钮、页面、ViewModel。

这篇只聊一件事:

Android 行业终端上,端侧大模型从模型文件到本地推理,中间到底经过哪些环节?

一、端侧大模型不是 API 接入,而是本地部署链路

如果把端侧大模型理解成“调一个 AI 接口”,那路就走窄了。

真正落到 Android 设备上,它更像一条本地部署链路:

模型选择
  -> 模型转换 / 量化
  -> 模型文件分发
  -> 本地加载
  -> 推理后端选择
  -> Token 生成
  -> 性能采样
  -> 降级 / 上云

这里每一步都会影响产品能不能跑起来。

模型太大,设备装不下。

量化不合适,效果掉太多。

加载太慢,用户打开功能先等十几秒。

backend 选错,GPU 没吃上,CPU 烫得飞起。

没有性能日志,线上出了问题只剩一句“用户说很慢”。

这才是端侧 AI 真正麻烦、也真正有价值的地方。

02-technical-map-01-stack

二、先从模型配置开始

假设我们要给一台教育平板预置一个本地错题提示模型。

不要先写业务代码。

我会先定义模型配置。

{
  "model_id": "gemma-2b-it-q4",
  "model_path": "models/gemma-2b-it-q4.litertlm",
  "sha256": "replace-with-real-hash",
  "min_ram_mb": 6144,
  "preferred_backend": "GPU",
  "fallback_backend": "CPU",
  "context_length": 2048,
  "max_output_tokens": 256,
  "temperature": 0.3
}

这段配置看起来很普通,但它比写一个“AI 助手类”重要。

因为行业终端部署模型,最先要回答的是这些问题:

  • 模型文件在哪里?
  • .task.tflite,还是 .litertlm
  • 模型有没有做 hash 校验?
  • 低于多少内存不允许加载?
  • 优先跑 GPU 还是 CPU?
  • GPU 失败以后怎么 fallback?
  • 上下文长度限制多少?
  • 单次最多生成多少 token?

这才是本地部署的第一层。

App 层只是壳,模型配置才是端侧能力的入口。

三、Android 上几条路线怎么摆?

现在再看 Gemini Nano、ML Kit、LiteRT-LM、MediaPipe,就会清楚很多。

它们不是同一种东西。

02-technical-map-02-routes

Gemini Nano / AICore 更像系统托管模型。

如果设备支持,模型管理、更新、安全和硬件加速尽量交给系统。适合系统级能力、设备可控的终端,但你不能假设所有 Android 设备都有。

ML Kit GenAI 更像高层任务 API。

它适合快速验证摘要、改写、校对、图片描述这类功能,但它不是底层本地部署主线。用它验证产品价值可以,别把它当成你掌控模型文件和推理引擎的方案。

LiteRT-LM 是现在更值得重点关注的本地 LLM 路线。

Google AI Edge 文档把它定位成面向 LLM 的生产化运行和编排层,强调 Android Kotlin API、跨平台、高性能,以及 CPU/GPU/NPU 等硬件后端。

MediaPipe LLM Inference 仍然值得了解,但现在 Android 文档已经明确提示维护模式,新功能和优化会集中到 LiteRT-LM。

所以新项目里,我会把 MediaPipe 当成理解历史路线和存量 Demo 的材料,而不是新主线。

一句话:

想快速验证功能,看 ML Kit;想系统托管,看 Gemini Nano;想自己带模型做本地部署,新项目优先看 LiteRT-LM。

四、加载模型时,真正要关心的是 backend 和 fallback

本地部署不是把模型文件放进目录就结束。

你还要决定它怎么跑。

enum class InferenceBackend {
    CPU,
    GPU,
    NPU
}

data class LocalModelConfig(
    val modelPath: String,
    val sha256: String,
    val preferredBackend: InferenceBackend,
    val fallbackBackend: InferenceBackend,
    val contextLength: Int,
    val maxOutputTokens: Int,
    val temperature: Float
)

行业终端里,我会把 backend 选择写得非常明确。

比如教育平板可以优先 GPU,失败后回退 CPU。

车机如果有专用 NPU,可能要优先走 NPU。

医疗终端如果稳定性要求高,宁愿慢一点,也要优先选择更可控的后端。

伪代码大概是这样:

fun chooseBackend(config: LocalModelConfig, device: DeviceProfile): InferenceBackend {
    if (config.preferredBackend == InferenceBackend.NPU && device.hasNpu) {
        return InferenceBackend.NPU
    }

    if (config.preferredBackend == InferenceBackend.GPU && device.hasGpu && device.ramMb >= 6144) {
        return InferenceBackend.GPU
    }

    return config.fallbackBackend
}

这类代码比业务路由更重要。

因为端侧模型能不能跑稳,很多时候就卡在这里。

五、性能采样必须从第一天就做

端侧大模型不能只看“能不能生成文字”。

行业终端里,至少要记录这些指标:

  • 模型加载耗时
  • 首 token 时间
  • prefill tokens/s
  • decode tokens/s
  • 峰值内存
  • backend 类型
  • 设备温度
  • 是否 fallback
  • 推理是否超时

日志可以先很朴素:

data class InferenceMetrics(
    val modelId: String,
    val backend: InferenceBackend,
    val loadMs: Long,
    val firstTokenMs: Long,
    val prefillTokensPerSec: Float,
    val decodeTokensPerSec: Float,
    val peakMemoryMb: Int,
    val fallbackUsed: Boolean,
    val success: Boolean
)

真正上线后,你需要的不是“我感觉这个模型挺快”。

你需要的是一张表:

设备型号 | 模型 | backend | 首 token | decode/s | 峰值内存 | 温度 | 成功率

只有这张表出来,模型选择才不是拍脑袋。

02-technical-map-03-edge-cloud

六、行业终端选型:先问能不能控制设备

如果我现在要做一个行业终端端侧 AI 项目,我会按这个顺序问:

  1. 设备型号能不能控制?
  2. 模型能不能预装或受控下载?
  3. 本地存储够不够?
  4. RAM 是否够加载目标模型?
  5. 有没有 GPU / NPU 可用?
  6. 弱网或无网时必须保留哪些能力?
  7. 哪些结果必须人工确认?
  8. 性能指标怎么采样和回传?

这些问题没想清楚,不要急着选模型。

特别是普通手机 App,很多时候第一问就卡住了:

你根本控制不了用户设备。

这也是为什么我反复强调,端侧大模型更适合行业终端。

教育平板可以预装模型。

车机可以绑定硬件平台。

医疗终端可以走统一设备管理。

工控手持可以固定系统镜像。

这才是本地部署真正有机会跑稳的地方。

02-technical-map-04-decision

七、这一篇先定地图

第二篇我们先不展开具体 SDK。

只先把底层路线定住:

模型配置 -> 模型分发 -> 本地加载 -> 后端选择 -> 推理生成 -> 性能采样 -> 降级策略

后面每一篇,都应该围绕这条链路往下钻。

第三篇如果写 Gemini Nano,就不能只写“怎么调 API”,而要讲清楚 AICore 托管模型的边界、设备支持、模型状态和失败兜底。

第五篇如果写 LiteRT-LM / Gemma,就要真正进入模型文件、加载配置、backend、tokens/s 和内存。

第六篇性能评测,就要把日志和 benchmark 表格跑出来。

这才是“Android 端侧大模型实战”该有的味道。

我是唐人。

下一篇,我们开始拆第一条路线:Gemini Nano / AICore。

参考资料

关注公众号

不错过后续文章和配套资源

扫码关注「唐人Console」,获取文章更新、配套资源和领取入口。 需要解锁时,文章页会生成专属口令。

唐人Console二维码扫码关注