MLC-LLM是大模型的通用部署方案。以下是根据安卓部署官方文档的部署流程。主要安装步骤参考官方文档即可,这里仅为一些踩坑笔记,可以作为参考
部分说明基于自己理解,若有错误还请指正
1 流程简介
如图所示,绿色方框表示tvm-unity ,其中黄色方框表示需要安装的依赖,紫色方块表示外部输入。 HuggingFace_Tokenizer 、Model 分别通过rust 、tvm_compiler 编译,得到安卓运行库(android lib)
得到的安卓运行库(android lib)需要和tvm_runtime 打包在一起,该过程需要调用java ,得到一个jar文件
jar文件通过Android Studio,最终生成一个安卓应用
2 安装依赖
2.1 安装rust
例如在Ubuntu 22.04系统下,执行如下命令:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env
2.2 安装AS
根据官方文档安装即可,同时下载NDK和CMake。
2.3 安装java
这里推荐安装jdk 17,否则将会在AS构建apk的过程中遇到java版本号过高的问题,例如:
报错: Unsupported class file major version 65
解决方法: 使用更低版本的jdk 或者 升级AS的gradle
注意: 执行./prepare_libs.sh
会使用第一次配置的java生成缓存。要使用不同版本的java,先删除mlc-llm/android/build
文件夹,再重新执行./prepare_libs.sh
命令。
2.4 配置环境变量
在工具链调用过程中,需要用到某些环境变量。参考官方文档配置即可。
例如,我在~/.bashrc
中有如下配置:
export ANDROID_NDK=~/Android/Sdk/ndk/26.1.10909125
export TVM_NDK_CC=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android24-clang
export JAVA_HOME=~/jdk-17.0.2
export TVM_HOME=~/mlc-llm/3rdparty/tvm
2.5 安装tvm-compiler
参考安装文档安装即可。
特别需要注意的是,在验证时,执行
less
python -c "import tvm; print('\n'.join(f'{k}: {v}' for k, v in tvm.support.libinfo().items()))"
需要特别检查如下参数处于打开状态:
vbnet
USE_LLVM: llvm-config --link-static
LLVM_VERSION: 15.0.7
否则后续编译遇到报错: Module stackvm should be either dso exportable or binary serializable
解决方法: 由于该prebuilt package更新频率快,如果上述检查参数不正确,等待几天重新下载即可。若不想等待,直接从源代码构建。
3 构建安卓运行库(android lib)
3.1 克隆mlc-llm项目到本地,并安装依赖(torch等)
git clone --recursive https://github.com/mlc-ai/mlc-llm/
cd ./mlc-llm/
pip install .
3.2 构建模型
由于Llama模型较大,构建环境耗时,这里使用RedPajama作为示例,执行如下代码:
css
python3 -m mlc_llm.build --hf-path togethercomputer/RedPajama-INCITE-Chat-3B-v1 --target android --max-seq-len 768 --quantization q4f16_1
注意: 检查tvm-compiler是否安装成功,执行python3 -m mlc_llm.build --help
即可。
接下来,跟着官方文档走即可。
4 使用AS构建apk
问题: 打开该andorid项目时,AS需要配置相应的gradle环境。由于仓库在国外,下载速度极慢
解决方法: 在setting.gradle
中配置国内镜像,例如:
rust
pluginManagement {
repositories {
maven { url 'https://maven.aliyun.com/repository/centerl' }
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
google()
mavenCentral()
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
maven { url 'https://maven.aliyun.com/repository/centerl' }
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
google()
mavenCentral()
}
}
rootProject.name = "MLCChat"
include ':app'
5 其他
官方提供的源代码构建成最终apk文件后,可能会出现应用权限问题