logo 🤗

技术视野

聚焦科技前沿,分享技术解析,洞见未来趋势。在这里,与您一起探索人工智能的无限可能,共赴技术盛宴。

安装

  1. 安装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
  1. 验证mlc。
mlc_llm --help
  1. 验证TVM,MLC库里面已经预编译了TVM,所以不需要再安装了,直接验证一下就行了,输出不为空就ok了。
python -c "import tvm; print(tvm.__file__)"

转权重

  1. 准备一下gemma-2b-it的模型(官网用的是一个3b的模型)。
  2. 转模型权重。
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
  1. 生成 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部署

  1. 需要先下载预编译库,根据模型类型,对应平台,对应数据类型的so,官方下载页面,所以这里需要下载q4f16_1-cuda.so结尾的包,不过gemma没有看到对应的库(只有安卓/ios/web的),所以需要自己编译一下。
  • 创建一个文件夹储存编译后的lib
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
  1. 用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.
  1. 测试开启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

  1. 需要安装一些环境,参考官方链接,安装顺序:rustAndroid Studio,下载NDK,配置ANDROID_NDKTVM_NDK_CC环境。
  2. 再生成一次配置文件(可选),降低上下文窗口长度,防止安卓手机内存不足卡死。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
  1. 需要先下载预编译库,根据模型类型,对应平台,对应数据类型的so,官方下载页面,所以这里需要下载q4f16_1-android.tar结尾的包,下载地址,如果有执行第二步减少内存,则需要重新编译一下安卓依赖库。
  • 创建一个文件夹储存编译后的lib
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
  1. 拉取mlc-llm官方仓库,编译安卓apk需要用到。
git clone https://github.com/mlc-ai/mlc-llm.git
cd mlc-llm
git submodule update --init --recursive
  1. 将之前编译的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/
  1. 进入mlc-llm/android/library路径
cd android/library
  1. 里面有一个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"
  }
}
  1. 执行prepare_libs.sh
./prepare_libs.sh
  • 这将生成以下两个文件:
./build/output/arm64-v8a/libtvm4j_runtime_packed.so
./build/output/tvm4j_core.jar
  1. 打开android-studio,在android-studio打开刚刚的mlc-llm/android目录,打开后会自动下载gradle中依赖,需要等待一会。
  2. 运行Build → Generate Signed Bundle/APK,选择你的签名,打包方式建议选APK,然后就可以在mlc-llm/android/release目录获得一个app-release.apk包,然后手机安装该apk包就行了。
  3. 不过目前模型只能在线下载或者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/"
  1. 测试如下:
    image.png
  2. (可选)将你刚刚的dist/gemma-2b-it_q4f16_1-MLC文件夹上传到huggingface(实测不支持魔搭),然后将你的app-config.json中模型的的url换成你的项目url,这样分享apk给其他人的时候,别人就可以直接在apk里面在线下载了。

版权属于:tlntin
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2024年04月21日 11:11


39 文章数
5 分类数
40 页面数
已在风雨中度过 1年188天17小时34分
目录
来自 《MLC-LLM体验(以gemma-2b为例)》
暗黑模式
暗黑模式
返回顶部
暗黑模式
暗黑模式
返回顶部