安装
- 安装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__)"
转权重
- 准备一下gemma-2b-it的模型(官网用的是一个3b的模型)。
- 转模型权重。
mlc_llm convert_weight ./dist/models/gemma-2b-it \
--model-type gemma \
--device cuda:0 \
--quantization q4f16_1 \
--source-format huggingface-safetensor \
-o dist/gemma-2b-it_q4f16_1-MLC
mlc_llm convert_weight --help
- 生成 MLC 聊天配置,用于生成和处理分词器。
mlc_llm gen_config ./dist/models/gemma-2b-it \
--model-type gemma \
--quantization q4f16_1 \
--conv-template gemma_instruction \
-o dist/gemma-2b-it_q4f16_1-MLC
mlc_llm gen_config --help
使用python部署
- 需要先下载预编译库,根据模型类型,对应平台,对应数据类型的so,官方下载页面,所以这里需要下载
q4f16_1-cuda.so
结尾的包,不过gemma没有看到对应的库(只有安卓/ios/web的),所以需要自己编译一下。
mkdir dist/prebuilt_libs
mlc_llm compile ./dist/gemma-2b-it_q4f16_1-MLC/mlc-chat-config.json \
--device cuda \
-o dist/prebuilt_libs/gemma-2b-it-q4f16_1-cuda.so
- 用python跑一下下面的代码。
from mlc_llm import ChatModule
cm = ChatModule(
device="cuda:0", # can set "auto"b
model="dist/gemma-2b-it_q4f16_1-MLC",
model_lib_path="dist/prebuilt_libs/gemma-2b-it-q4f16_1-cuda.so"
)
print(cm.generate("hi, What's your name"))
[2024-04-16 14:44:53] INFO auto_device.py:76: Found device: cuda:0
[2024-04-16 14:44:53] INFO chat_module.py:379: Using model folder: /home/tlntin/PycharmProjects/qwen-mlc/dist/gemma-2b-it_q4f16_1-MLC
[2024-04-16 14:44:53] INFO chat_module.py:380: Using mlc chat config: /home/tlntin/PycharmProjects/qwen-mlc/dist/gemma-2b-it_q4f16_1-MLC/mlc-chat-config.json
[2024-04-16 14:44:53] INFO chat_module.py:529: Using library model: dist/prebuilt_libs/gemma-2b-it-q4f16_1-cuda.so
[2024-04-16 14:44:54] INFO model_metadata.py:96: Total memory usage: 2400.83 MB (Parameters: 1344.52 MB. KVCache: 0.00 MB. Temporary buffer: 1056.31 MB)
[2024-04-16 14:44:54] INFO model_metadata.py:105: To reduce memory usage, tweak `prefill_chunk_size`, `context_window_size` and `sliding_window_size`
I do not have a name, as I am an artificial intelligence, and do not have the capacity to have personal experiences or identities.
- 测试开启api服务。
mlc_llm serve dist/gemma-2b-it_q4f16_1-MLC \
--model-lib-path dist/prebuilt_libs/gemma-2b-it-q4f16_1-cuda.so \
--device "cuda:0" \
--host 127.0.0.1 \
--port 8000
import requests
import json
# Get a response using a prompt with streaming
payload = {
"model": "dist/gemma-2b-it_q4f16_1-MLC",
"messages": [{"role": "user", "content": "write a daily record for me, need 500 words."}],
"stream": True,
}
with requests.post("http://127.0.0.1:8000/v1/chat/completions", json=payload, stream=True) as r:
for chunk in r.iter_content(chunk_size=None):
chunk = chunk.decode("utf-8")
if "[DONE]" in chunk[6:]:
break
response = json.loads(chunk[6:])
content = response["choices"][0]["delta"].get("content", "")
print(content, end="", flush=True)
print("\n")
部署安卓app
- 需要安装一些环境,参考官方链接,安装顺序:
rust
,Android Studio
,下载NDK,配置ANDROID_NDK
和TVM_NDK_CC
环境。 - 再生成一次配置文件(可选),降低上下文窗口长度,防止安卓手机内存不足卡死。gemma默认上下文是8k,这里给他降到2048,最大batch也设置为1。
mlc_llm gen_config ./dist/models/gemma-2b-it \
--model-type gemma \
--quantization q4f16_1 \
--conv-template gemma_instruction \
--context-window-size 2048 \
--max-batch-size 1 \
-o dist/gemma-2b-it_q4f16_1-MLC
- 需要先下载预编译库,根据模型类型,对应平台,对应数据类型的so,官方下载页面,所以这里需要下载
q4f16_1-android.tar
结尾的包,下载地址,如果有执行第二步减少内存,则需要重新编译一下安卓依赖库。
mkdir dist/prebuilt_libs
mlc_llm compile ./dist/gemma-2b-it_q4f16_1-MLC/mlc-chat-config.json \
--device android \
-o dist/prebuilt_libs/gemma-2b-it-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
- 将之前编译的
gemma-2b-it-q4f16_1-android.tar
放到mlc-llm/dist/prebuilt/lib/gemma-2b-it/
目录下。没有就创建该目录。
mkdir -p mlc-llm/dist/prebuilt/lib/gemma-2b-it/
cp dist/prebuilt_libs/gemma-2b-it-q4f16_1-android.tar mlc-llm/dist/prebuilt/lib/gemma-2b-it/
- 进入
mlc-llm/android/library
路径
cd android/library
- 里面有一个
prepare_model_lib.py
,在其子路径src/main/assets/app-config.json
,里面有定义模型路径和动态库路径。这里的model_url
只支持在线路径,并且在运行时会从网站上下载,并存储在/storage/emulated/0/Android/data/ai.mlc.mlcchat/files/
目录下。我们只需要gemma-2b的,所以可以选择只留下gemma的相关配置即可。
- 为了和dist文件夹一致,这里我修改了一下model_id,修改后配置如下:
{
"model_list": [
{
"model_url": "https://huggingface.co/mlc-ai/gemma-2b-it-q4f16_1-MLC",
"model_id": "gemma-2b-it-q4f16_1",
"model_lib": "gemma_q4f16_1",
"estimated_vram_bytes": 3000000000
}
],
"model_lib_path_for_prepare_libs": {
"gemma_q4f16_1": "prebuilt/lib/gemma-2b-it/gemma-2b-it-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 push dist/gemma-2b-it_q4f16_1-MLC /data/local/tmp/gemma-2b-q4f16_1/
adb shell "mkdir -p /storage/emulated/0/Android/data/ai.mlc.mlcchat/files/"
adb shell "mv /data/local/tmp/gemma-2b-q4f16_1/ /storage/emulated/0/Android/data/ai.mlc.mlcchat/files/"
- 测试如下:
- (可选)将你刚刚的
dist/gemma-2b-it_q4f16_1-MLC
文件夹上传到huggingface(实测不支持魔搭),然后将你的app-config.json
中模型的的url换成你的项目url,这样分享apk给其他人的时候,别人就可以直接在apk里面在线下载了。