安装
- 安装MLC,推荐Linux系统。参考链接,网络差的可以去网站手动下载whl文件。python版本官方推荐3.11,cuda版本推荐12.1。
python3 -m pip install --pre -U -f https://mlc.ai/wheels mlc-ai-nightly-cu121
python3 -m pip install --pre -U -f https://mlc.ai/wheels mlc-llm-nightly-cu121
- 验证mlc。
mlc_llm --help
- 验证TVM,MLC库里面已经预编译了TVM,所以不需要再安装了,直接验证一下就行了,输出不为空就ok了。
python -c "import tvm; print(tvm.__file__)"
转权重
- 准备一下qwen1.5-1.8b-chat的模型(官网用的是一个3b的模型)。
- 转模型权重。
mlc_llm convert_weight ./dist/models/Qwen1.5-1.8B-Chat \
--model-type qwen2 \
--device cuda:0 \
--quantization q4f16_1 \
--source-format huggingface-safetensor \
-o dist/qwen1.5-1.8b-q4f16_1-MLC
mlc_llm convert_weight ./dist/models/Qwen1.5-1.8B-Chat \
--model-type qwen2 \
--device cpu \
--quantization q4f32_1 \
--source-format huggingface-safetensor \
-o dist/qwen1.5-1.8b-q4f32_1-MLC
mlc_llm convert_weight --help
- 生成 MLC 聊天配置,用于生成和处理分词器。
- gpu,建议降低一下上下文到8k,否则容易显存不足而运行时失败。
mlc_llm gen_config ./dist/models/Qwen1.5-1.8B-Chat \
--model-type qwen2 \
--quantization q4f16_1 \
--context-window-size 8192 \
--conv-template chatml \
-o dist/qwen1.5-1.8b-q4f16_1-MLC
mlc_llm gen_config ./dist/models/Qwen1.5-4B-Chat \
--model-type qwen2 \
--quantization q4f32_1 \
--context-window-size 8192 \
--conv-template chatml \
-o dist/qwen1.5-1.8b-q4f32_1-MLC
mlc_llm gen_config --help
部署安卓app
- 需要安装一些环境,参考官方链接,安装顺序:
rust
,Android Studio
,下载NDK,配置ANDROID_NDK
和TVM_NDK_CC
环境。 - 再生成一次配置文件(可选),降低上下文窗口长度,防止安卓手机内存不足卡死。gemma默认上下文是8k,这里给他降到2048,最大batch也设置为1。
mlc_llm gen_config ./dist/models/Qwen1.5-1.8B-Chat \
--model-type qwen2 \
--quantization q4f16_1 \
--conv-template chatml \
--context-window-size 2048 \
--max-batch-size 1 \
-o dist/qwen1.5-1.8b-q4f16_1-MLC
- 需要先下载预编译库,根据模型类型,对应平台,对应数据类型的so,官方下载页面,所以这里需要下载
q4f16_1-android.tar
结尾的包,下载地址,如果有执行第二步减少内存,则需要重新编译一下安卓依赖库。
mkdir dist/prebuilt_libs
mlc_llm compile ./dist/qwen1.5-1.8b-q4f16_1-MLC/mlc-chat-config.json \
--device android \
-o dist/prebuilt_libs/qwen1.5-1.8b-q4f16_1-android.tar
- 拉取mlc-llm官方仓库,编译安卓apk需要用到。
git clone https://github.com/mlc-ai/mlc-llm.git
cd mlc-llm
git submodule update --init --recursive
cd ..
- 将之前编译的
qwen1.5-1.8b-q4f16_1-android.tar
放到mlc-llm/dist/prebuilt/lib/qwen1.5-1.8b/
目录下。没有就创建该目录。
mkdir -p mlc-llm/dist/prebuilt/lib/qwen1.5-1.8b/
cp dist/prebuilt_libs/qwen1.5-1.8b-q4f16_1-android.tar mlc-llm/dist/prebuilt/lib/qwen1.5-1.8b/
- 进入
mlc-llm/android/library
路径
cd mlc-llm/android/library
- 里面有一个
prepare_model_lib.py
,在其子路径src/main/assets/app-config.json
,里面有定义模型路径和动态库路径。这里的model_url
只支持在线路径,并且在运行时会从网站上下载,并存储在/storage/emulated/0/Android/data/ai.mlc.mlcchat/files/
目录下。我们只需要qwen1.5-1.8b的,所以可以选择只留下gemma的相关配置即可,url可以直接将刚刚的模型上传,也可以用别人上传好的MLC模型。
- 为了和dist文件夹一致,这里我修改了一下model_id,修改后配置如下:
{
"model_list": [
{
"model_url": "https://huggingface.co/ondevicellm/Qwen1.5-1.8B-Chat-q4f16_1-MLC",
"model_id": "qwen1.5-1.8b-q4f16_1",
"model_lib": "qwen2_q4f16_1",
"estimated_vram_bytes": 3000000000
}
],
"model_lib_path_for_prepare_libs": {
"qwen2_q4f16_1": "prebuilt/lib/qwen1.5-1.8b/qwen1.5-1.8b-q4f16_1-android.tar"
}
}
- 执行
prepare_libs.sh
./prepare_libs.sh
./build/output/arm64-v8a/libtvm4j_runtime_packed.so
./build/output/tvm4j_core.jar
- 打开android-studio,在android-studio打开刚刚的
mlc-llm/android
目录,打开后会自动下载gradle中依赖,需要等待一会。 - 运行
Build → Generate Signed Bundle/APK
,选择你的签名,打包方式建议选APK,然后就可以在mlc-llm/android/release
目录获得一个app-release.apk
包,然后手机安装该apk包就行了。 - 不过目前模型只能在线下载或者adb复制进去,为了省事,我们可以选择用adb将模型复制进手机。
adb push dist/qwen1.5-1.8b-q4f16_1-MLC /data/local/tmp/qwen1.5-1.8b-q4f16_1/
adb shell "mkdir -p /storage/emulated/0/Android/data/ai.mlc.mlcchat/files/"
adb shell "mv /data/local/tmp/qwen1.5-1.8b-q4f16_1/ /storage/emulated/0/Android/data/ai.mlc.mlcchat/files/"
- 测试一下没啥问题。
- (可选)将你刚刚的
dist/qwen1.5-1.8b-q4f16_1-MLC
文件夹上传到huggingface(实测不支持魔搭),然后将你的app-config.json
关于qwen的url换成你的项目url,这样分享apk给其他人的时候,别人就可以直接在apk里面在线下载了。