MLC-LLM android部署大模型

MLC-LLM 是一个开源项目,旨在为大规模语言模型(LLM)提供高效的训练和推理框架。它支持各种模型架构和训练策略,并且致力于优化计算资源的使用,以提高模型的性能和可扩展性。

这里稍微讲解了一些MLC的基本概念,以帮助我们使用和了解 MLC LLM。MLC-LLM 由三个不同的子模块组成:模型定义、模型编译和模型运行。

使用 mlc-llm开发流程:

➀ Python 中的模型定义。MLC 提供各种预定义架构,例如 Llama(例如 Llama2、Vicuna、OpenLlama、Wizard)、GPT-NeoX(例如 RedPajama、Dolly)、RNN(例如 RWKV)和 GPT-J(例如MOSS)。开发人员可以仅使用纯 Python 定义模型,而无需接触编码。

➁ Python 中的模型编译。模型由TVM Unity编译器编译,其中编译配置为纯 Python。MLC LLM 将基于 Python 的模型量化导出到模型库并量化模型权重。可以用纯 Python 开发量化和优化算法,以针对特定用例压缩和加速 LLM。

➂ 不同平台的模型运行。每个平台上都提供了 MLCChat 的变体:用于命令行的C++ 、用于 Web 的Javascript 、用于 iOS 的Swift 和用于 Android 的Java,可通过 JSON 进行配置。开发人员只需熟悉平台即可将 MLC 编译的 LLM 集成到他们的项目中。

windwos 下打包 android apk


首先是 anaconda 安装 python==3.10 以,我这里 3.11.8,环境名称设置为 mlc-llm,然后 git 拉取整个项目代码下来使用 pycharm 打开并下载依赖。

主项目:
git clone https://github.com/mlc-ai/mlc-llm.git
cd mlc-llm
git submodule update --init --recursive    # 加载子项目,如果加载失败,可反复运行,直到运行后没有返回为止

可以通过预构建包或者源码两种方式安装 mlc-llm,下面使用预构建包来更加方便简单,注意全部按照官网说明来。

1.安装依赖(cpu+vulkan):
python -m pip install --pre -U -f https://mlc.ai/wheels mlc-llm-nightly mlc-ai-nightly

2.同时安装下面包防止环境缺失:
conda install -c conda-forge clang libvulkan-loader git-lfs git

3.验证mlc是否安装成功:
python -c "import mlc_llm; print(mlc_llm)"
打印说明成功:
<module 'mlc_llm' from 'D:\\workspace\\anaconda\\envs\\mlc-llm\\Lib\\site-packages\\mlc_llm\\__init__.py'>

4.验证tvm环境是否正常:
python -c "import tvm; print(tvm.__file__)"
D:\workspace\anaconda\envs\mlc-llm\Lib\site-packages\tvm\__init__.py

5.安装好之后可以执行 mlc_llm --help 查看所有功能,其中 compile 指令就是模型编译指令:

6.然后源码目录存放下载的llm模型,模型推荐选择 Llama2-7B-Chat,总共25G:

​Llama2-7B Hugging Face版本:https://pan.xunlei.com/s/VN_t0dUikZqOwt-5DZWHuMvqA1?pwd=66ep
Llama2-7B-Chat Hugging Face版本:https://pan.xunlei.com/s/VN_oaV4BpKFgKLto4KgOhBcaA1?pwd=ufir
Llama2-13B Hugging Face版本:https://pan.xunlei.com/s/VN_yT_9G8xNOz0SDWQ7Mb_GZA1?pwd=yvgf
Llama2-13B-Chat Hugging Face版本:https://pan.xunlei.com/s/VN_yA-9G34NGL9B79b3OQZZGA1?pwd=xqrg
Llama2-70B-Chat Hugging Face版本:https://pan.xunlei.com/s/VNa_vCGzCy3h3N7oeFXs2W1hA1?pwd=uhxh#

7.执行模型转换和编译,设置结果保存目录:

Llama-2-7b-chat-hf => Llama-2-7b-chat-hf-q4f16_1-MLC

1.执行模型转换,转为 mlc 格式:
mlc_llm convert_weight ./Llama-2-7b-chat-hf/ --quantization q4f16_1 -o ./Llama-2-7b-chat-hf-q4f16_1-MLC/

2.创建 mlc-chat-config.json,也就是配置文件:
mlc_llm gen_config ./Llama-2-7b-chat-hf/ --quantization q4f16_1 --conv-template llama-2 --context-window-size 768 -o ./Llama-2-7b-chat-hf-q4f16_1-MLC/

3.执行模型编译,指定 mlc-chat-config.json 配置以及转换后的模型:
mlc_llm compile ./Llama-2-7b-chat-hf-q4f16_1-MLC/mlc-chat-config.json --device android -o ./Llama-2-7b-chat-hf-q4f16_1-MLC/Llama-2-7b-chat-hf-q4f16_1-android.tar

8.编译成功会在 ./Llama-2-7b-chat-hf-q4f16_1-MLC 下得到目标文件,按照官网说明里面是包含了三个部分:

1.运行时配置 (Runtime Configuration):

    * 配置对话模板,包括系统提示、重复惩罚、采样参数(如温度和 top-p 概率)、最大序列长度等。

    * 通常命名为 mlc-chat-config.json,与分词器配置一起使用。

2.模型库 (Model Lib):

    * 编译后的库,支持移动 GPU。文件名通常为 MODEL_NAME-{MODEL_NAME}-MODEL_NAME-{QUANTIZATION}-android.tar,例如 Llama-2-7b-chat-hf-q4f16_1-android.tar。

3.模型权重 (Model Weights):

    * 权重文件分片为 params_shard_*.bin,元数据存储在 ndarray-cache.json 中。

编译成功:

按照官网的说明 Llama-2-7b-chat-hf-q4f16_1-android.tar 将作为静态库在 android app 中使用:

打包 android apk。官方提供了样例 apk 打包,也就是位于源码 android 目录下面的工程文件 ./android/MLCChat 。

修改配置文件 MLCChat/mlc-package-config.json,删掉所有模型配置,只配置我们的 llama-7b,具体每个参数作用说明如下。

官方文档介绍了如何通过修改 MLCChat/mlc-package-config.json 文件来定制 Android 应用。每个模型条目包括以下字段:

* model(必填):MLC 转换模型的路径,例如 Hugging Face URL。
* model_id(必填):模型的唯一本地标识符。
* estimated_vram_bytes(必填):运行模型所需的 vRAM 估计值。
* bundle_weight(选填):是否将模型权重打包进应用中。
* overrides(选填):覆盖默认模型上下文窗口大小和预填充块大小。
* model_lib(选填):指定系统库前缀,用于同一架构的多个模型变体。

打包时会使用 ndk 以及下面的 llvm 编译器,以及java,在 python 环境中设置临时环境变量:

set ANDROID_NDK=D:\workspace\android\ndk\27.0.11902837
set TVM_NDK_CC=D:\workspace\android\ndk\27.0.11902837\toolchains\llvm\prebuilt\windows-x86_64\bin\aarch64-linux-android24-clang
set JAVA_HOME=D:\workspace\jdk\jdk8

另外打包时因为要交叉编译到 android,所以需要安装 rust,windwos直接一路点击 rustup-init.exe。设置代理安装会更快:
https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe
set HTTP_PROXY=http://localhost:10809
set HTTPS_PROXY=http://localhost:10809
rustup-init.exe    # 执行安装
rustc --version        # 查看版本
C:\Users\tangyufan\.cargo\bin     # 安装路径需要添加环境变量
C:\Users\tangyufan\.cargo\bin\rustup.exe target add aarch64-linux-android    # 安装andorid 64位交叉编译组件,这个提前安装防止后面打包时安装不下来

打包 android 还需要 ninja、cmake 等构建工具,按照官网说明进行安装:
conda install -c conda-forge cmake ninja git git-lfs zstd

然后进入 android/MLCChat 执行打包,会自动查找当前路径下的 mlc-package-config.json 配置文件进行打包,另外打包时需要使用 --mlc-llm-source-dir 参数指定源码路径:

cd android/MLCChat
mlc_llm package --mlc-llm-source-dir=D:\workspace\pycharm_workspace\mlc-llm

最终编译打包成功如下:

编译结果在 dist 中,package 指令按照官方说明生成的结果包含下面几个部分:

* libtvm4j_runtime_packed.so 提供了执行模型的底层逻辑和功能。
* tvm4j_core.jar 使得 Java 程序能够调用 libtvm4j_runtime_packed.so 中的功能。
* dist/lib/mlc4j 是 Gradle 子项目,它整合了模型库和运行时,方便在 Android 应用中使用。

官方有说明通过下面的方式引入 android 项目中:

样例工程在完成了上面的编译打包等所有操作之后,使用 android studio 打开项目 android/MLCChat,官方说明了不能使用虚拟机需要使用带有 gpu 的真机:

使用 gdb 链接android 手机,在 android studio 中编译项目,build 路径下会生成可执行 apk 包:

android/MLCChat/app/build/outputs/apk/debug/app-debug.apk

使用 bundle_weight 将模型权重注入到 apk 的应用路径下,同时执行 apk 的安装(修改代码,将 adb 替换成真实的 adb.exe 路径)替换如下::

安然执行 apk 安装以及模型的上传:

cd android/MLCChat
python bundle_weight.py --apk-path app/build/outputs/apk/debug/app-debug.apk

上传结果:

然后就可以启动 app 了:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0x13

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值