安装
bash
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。
bash
mlc_llm --help- 验证TVM,MLC库里面已经预编译了TVM,所以不需要再安装了,直接验证一下就行了,输出不为空就ok了。
bash
python -c "import tvm; print(tvm.__file__)"转权重
- 准备一下qwen1.5-1.8b-chat的模型(官网用的是一个3b的模型)。
- 转模型权重。
- 转gpu权重
bash
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- 如果需要转cpu权重,可以用这个
bash
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- 关于这个的参数解释,可以通过下面的指令获取。
bash
mlc_llm convert_weight --help- 生成 MLC 聊天配置,用于生成和处理分词器。
- gpu,建议降低一下上下文到8k,否则容易显存不足而运行时失败。
bash
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- cpu
bash
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- 关于这个的参数解释,可以通过下面的指令获取。
bash
mlc_llm gen_config --help部署安卓app
- 需要安装一些环境,参考官方链接,安装顺序:
rust,Android Studio,下载NDK,配置ANDROID_NDK和TVM_NDK_CC环境。 - 再生成一次配置文件(可选),降低上下文窗口长度,防止安卓手机内存不足卡死。gemma默认上下文是8k,这里给他降到2048,最大batch也设置为1。
bash
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结尾的包,下载地址,如果有执行第二步减少内存,则需要重新编译一下安卓依赖库。
- 创建一个文件夹储存编译后的lib
bash
mkdir dist/prebuilt_libs- 开始编译
bash
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需要用到。
bash
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/目录下。没有就创建该目录。
bash
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路径
bash
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,修改后配置如下:
json
{
"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
bash
./prepare_libs.sh- 这将生成以下两个文件:
bash
./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将模型复制进手机。
bash
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里面在线下载了。