记一次端侧大模型部署

记一次端侧大模型部署

exdoubled Lv3

实验环境准备

操作系统:Windows 11、HarmonyOS 4.2.0

安卓设备:HUAWEI Pura 70

部署工具:开源项目 mlc-llmAndroid Studio

安装 Android Studio,并通过它安装 NDK

配置 Python 、 JDK 、CMake、adb、Rust 环境

参考环境

1
2
3
4
5
6
7
8
9
10
11
12
13
>javac -version
javac 17.0.16
>python -- version
Python 3.11.9
>rustc -- version
rustc 1.90.0 (1159e78c4 2025-09-14)
>cmake -- version
cmake version 4.1.2
CMake suite maintained and supported by Kitware (kitware.com/cmake).
>adb version
Android Debug Bridge version 1.0.41
Version 36.0.0-13206524
Running on Windows 10.0.26100

模型的编译与 APK 打包

从 GitHub 上 克隆项目

1
2
git clone https://github.com/mlc-ai/mlc-llm.git
cd mlc-llm

由于拉取时 GitHub 上项目构建失败,通过查找切换到历史版本 0034e3c61e0bcf7f1e0e2f8ca0d8eef4db3b6771

1
2
git checkout 0034e3c6
git checkout -b 0034e3c6

设置环境变量

1
$env :MLC_LLM_SOURCE_DIR

拉取必要组件

1
git submodule update --init --recursive

配置文件 mlc-package-config.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"device": "android",
"model_list": [
{
"model": "HF://mlc-ai/Mistral-7B-Instruct-v0.3-q4f16_1-MLC",
"estimated_vram_bytes": 4115131883,
"model_id": "Mistral-7B-Instruct-v0.3-q4f16_1-MLC",
"overrides": {
"sliding_window_size": 768,
"prefill_chunk_size": 256
}
}
]
}

运行

1
mlc_llm package

发现无法拉取模型,采取手动拉取模型的方式

将模型放在目录 \AppData\Local\mlc_llm\model_weights\hf\mlc-ai

重新运行命令

1
mlc_llm package

1
[152/157] Generating aarch64-linux-android/release/libtokenizers_c.a

报错

根据编译器的 help 并查询资料发现: Rust 1.89.0 dangerous_implicit_autorefs lint现在默认设置为deny级别

于是打开 \mlc-llm\3rdparty\tokenizers-cpp\rust\src\lib.rs 进行更改

将 219 行

1
*out_len = (*handle).decode_str.len();

改为

1
*out_len = (&(*handle).decode_str).len();

将 252 行

1
*out_len = (*handle).id_to_token_result.len();

改为

1
*out_len = (&(*handle).id_to_token_result).len();

重新运行

1
mlc_llm package

成功

将生成在 dist/ 目录下的文件放入 app/src/main/assets/ ,连接设备,在 Android Studio 打开 MLCChat 文件夹打包 APK 并通过 adb 安装运行

成功进入 Model List 但是输入 input 闪退,怀疑是 7B 模型过大手机算力不够,重新下载并配置文件重新生成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"device": "android",
"model_list": [
{
"model": "HF://mlc-ai/Phi-3.5-mini-instruct-q4f16_0-MLC",
"estimated_vram_bytes": 4250586449,
"model_id": "Phi-3.5-mini-instruct-q4f16_0-MLC",
"overrides": {
"prefill_chunk_size": 128
}
},
{
"model": "HF://mlc-ai/gemma-2-2b-it-q4f16_1-MLC",
"model_id": "gemma-2-2b-it-q4f16_1-MLC",
"estimated_vram_bytes": 3000000000
},
{
"model": "HF://mlc-ai/Llama-3.2-3B-Instruct-q4f16_0-MLC",
"estimated_vram_bytes": 4679979417,
"model_id": "Llama-3.2-3B-Instruct-q4f16_0-MLC",
}
]
}

成功部署在手机上,但发现只有 gemma 能成功运行,怀疑是与上文原因相同,推测解决方法为通过调整 mlc-package-config.json 中的 overrides 字段,减少 context_window_size,以减少每次推理时所需的内存

并依次询问了三个问题

模型生成速度很慢,第一个问题花了将近一分钟的时间,并且很明显后两个问题的回答都是错误的

另外,为了支持完全离线运行,在 MLCChat/mlc-package-config.json 文件中,设置 bundle_weighttrue,这会指示 MLC 将模型的权重打包进 APK,而不再通过网络下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"device": "android",
"model_list": [
{
"model": "HF://mlc-ai/Phi-3.5-mini-instruct-q4f16_0-MLC",
"estimated_vram_bytes": 4250586449,
"model_id": "Phi-3.5-mini-instruct-q4f16_0-MLC",
"bundle_weight": true,
"overrides": {
"prefill_chunk_size": 128
}
},
{
"model": "HF://mlc-ai/gemma-2-2b-it-q4f16_1-MLC",
"model_id": "gemma-2-2b-it-q4f16_1-MLC",
"bundle_weight": true,
"estimated_vram_bytes": 3000000000
},
{
"model": "HF://mlc-ai/Llama-3.2-3B-Instruct-q4f16_0-MLC",
"estimated_vram_bytes": 4679979417,
"model_id": "Llama-3.2-3B-Instruct-q4f16_0-MLC",
"bundle_weight": true
}
]
}

但在打包 APK 时,遇到了以下报错

1
2
3
> A failure occurred while executing com.android.build.gradle.tasks.PackageAndroidArtifact$IncrementalSplitterRunnable

> Zip32 cannot place CD entry 'assets/bundle/Phi-3.5-mini-instruct-q4f16_0-MLC/params_shard_64.bin' payload at 4309135970 (MAX=4294967295)

原因是 APK 即 Zip32 对文件大小和文件内部偏移量限制 4GB ,所以只能删除 Phi 并重新打包 APK ,成功完全离线部署在手机上

MLC 通过将 Hugging Face 这类高层框架转换为兼容的表示格式,同时通过量化、剪枝等技术优化模型,以适应设备的资源限制,降低内存占用和计算量。对于 Android 来说,MLC 将模型和运行时库集成到 Android 应用中,通过 JNI 接口与 Java 层交互,支持 Android 设备的 GPU 加速和其他硬件加速。

通过使用 MLC_LLM 将不同模型部署到 Android 手机上,体验了端侧本地的离线模型,但碍于端侧算力不足,经过剪枝、量化的大模型生成速度慢,体验远不如云端的大模型。

参考资料

mlc-ai/mlc-llm: Universal LLM Deployment Engine with ML Compilation

Android SDK — mlc-llm 0.1.0 documentation

1.89.0 | Rust Changelogs

  • Title: 记一次端侧大模型部署
  • Author: exdoubled
  • Created at : 2025-10-24 22:00:00
  • Updated at : 2025-10-25 00:30:24
  • Link: https://github.com/exdoubled/exdoubled.github.io.git/misc/lab1/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
记一次端侧大模型部署