MLC-LLM框架的安卓应用部署实战(2)

进行apk的打包,需要使用Android Studio。

要使用Android Studio就需要安装 SDK、NDK、CMake和JAVA。

其中Android Studio可以在官网中去下载,windows直接执行安装程序,按照默认设置安装即可,linux则是将tar.gz文件解压到对应的目录即可。运行以下命令即可开始使用android studio(需要图形化界面)

./bin/studio.sh

在 Android Studio 单击“File → Settings → Languages & Frameworks → Android SDK → SDK Tools”,选择安装NDK、CMake和Android SDK Platform-Tools。安装完成后,需要在环境变量中去对NDK等进行配置才可使用。
在这里插入图片描述

下面是安装完毕之后需要配置的环境变量,具体操作就是 vim ~/.bashrc 打开之后在最下面粘贴即可:(小白注意:里面的路径需要和自己安装的路径一致)

export ANDROID\_NDK=/home/User/Android/Sdk/ndk/26.1.10909125
export ANDROID\_HOME=/home/User/Android/Sdk
export PATH=$PATH:/home/User/Android/Sdk/cmake/3.22.1/bin
export PATH=$PATH:/home/User/Android/Sdk/platform-tools
export TVM\_NDK\_CC=$ANDROID\_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android24-clang
export TVM\_HOME=/home/User/mlc-llm/3rdparty/tvm
export TVM\_HOME=$TVM\_HOME/include/tvm/runtime
source $HOME/.cargo/env # Rust


JAVA

Android Studio需要安装openjdk,官方要求的版本是>17。

# 更新update
sudo apt update
# 安装openjdk17
sudo apt install openjdk-17-jdk 
# 查看jdk17的安装路径
sudo update-alternatives --list java
# 用上面命令获取的路径,编入到bashrc文件的最后一行中
vi ~/.bashrc
# 将下面的命令,编入到bashrc文件的最后一行中
export JAVA\_HOME=/usr/lib/jvm/java-17-openjdk-amd64/bin/java
# 更新环境变量
source ~/.bashrc

TVM Unity runtime

这个就在我们接下来要git clone的包里,在 3rdparty/tvm里面,所以不需要额外下载,只需要在上面环境配置中路径写对即可。

TVM Unity compiler

这个必须要安装,我们需要用这个来对模型进行编译,(官网说如果用prebuilt的话则不用安装,但是我没找到prebuilt在哪,有知道的小伙伴可以提醒我一下)

conda activate your-environment
python -m pip install --pre -U -f https://mlc.ai/wheels mlc-ai-nightly

注意:由于mlc-ai-nigtly这个包不在国内的pip源中,需要在mlc.ai网站的wheels中去进行下载,如果你没有像我一样安装Clash for linux,则根据这篇博文进行安装MLC-LLM

TVM的安装验证:以下命令可以帮助确认 TVM 是否已正确安装为 python 包并提供 TVM python 包的位置

>>> python -c "import tvm; print(tvm.__file__)"
/some-path/lib/python3.10/site-packages/tvm/__init__.py

编译模型

下载模型

好,现在前置环境配置的工作终于完成了,现在可以进行模型的编译了,由于从huggingface上下载模型太慢,这里采用别人提供的国内云盘上的模型:

Llama2模型下载地址
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#

下载好了之后放到虚拟机里面备用,虚拟机务必留出足够的空间!我下载的是Llama2-7B-Chat Hugging Face版本。

Cloning MLC LLM from GitHub
git clone --recursive https://github.com/mlc-ai/mlc-llm/
          ^^^^^^^^^^^
cd ./mlc-llm/

没啥好说的,如果显示没有git命令就安装好了,注意–recursive是必须加的。

编译支持安卓的模型

终于到了最关键的一步!
首先,找到我们放模型的目录,打开终端,运行下面的命令:

我先解释一下:MODEL_NAME这个变量就是你放模型的目录名,QUANTIZATION就是默认的q4f16_1,后面的dist/MODEL_NAME-QUANTIZATION-MLC/就是保存编译之后的文件目录名,建议严格根据官网教程来,除非你知道你在做什么。

MODEL\_NAME=Llama-2-7b-chat-hf
QUANTIZATION=q4f16_1
# convert weights
mlc_llm convert_weight ./dist/models/$MODEL\_NAME/ --quantization $QUANTIZATION -o dist/$MODEL\_NAME-$QUANTIZATION-MLC/

# create mlc-chat-config.json
mlc_llm gen_config ./dist/models/$MODEL\_NAME/ --quantization $QUANTIZATION \
  --conv-template llama-2 --context-window-size 768 -o dist/${MODEL\_NAME}-${QUANTIZATION}-MLC/

# 2. compile: compile model library with specification in mlc-chat-config.json
mlc_llm compile ./dist/${MODEL\_NAME}-${QUANTIZATION}-MLC/mlc-chat-config.json \
    --device android -o ./dist/${MODEL\_NAME}-${QUANTIZATION}-MLC/${MODEL\_NAME}-${QUANTIZATION}-android.tar

运行完成之后我们就在./dist/

M

O

D

E

L

N

A

M

E

MODEL_NAME-

MODELN​AME−QUANTIZATION-MLC这个目录下得到了我们所需的编译后文件,组成如下:

  • Runtime configuration: It configures conversation templates including
    system prompts, repetition penalty, sampling including temperature
    and top-p probability, maximum sequence length, etc. It is usually
    named as mlc-chat-config.json alongside with tokenizer
    configurations.
  • Model lib: The compiled library that uses mobile GPU. It is usually
    named as

M

O

D

E

L

N

A

M

E

{MODEL_NAME}-

MODELN​AME−{QUANTIZATION}-android.tar, for example,
Llama-2-7b-chat-hf-q4f16_1-android.tar.

  • Model weights: the model weights are sharded as params_shard_*.bin
    and the metadata is stored in ndarray-cache.json

用编译后的模型构建安卓工程

先进入目录,打开应用设置文件:

cd ./android/library
vim ./src/main/assets/app-config.json

你会看到有两个属性:model_list和model_lib_path_for_prepare_libs,model_lib_path_for_prepare_libs这个属性是用来获取模型对应的Model lib,也就是使用移动的GPU的编译库,对应的是我们刚刚获得android.tar的那个位置。model list里面的属性根据官网介绍理解:

  • model_url (Required) URL to the repo containing the weights.
  • model_id (Required) Unique local identifier to identify the model.
  • model_lib(Required) Matches the system-lib-prefix, generally set during mlc_llm compile which can be specified using --system-lib-prefix argument. By default, it is set to “{model_type}_{quantization}” e.g. gpt_neox_q4f16_1 for the RedPajama-INCITE-Chat-3B-v1 model. If the --system-lib-prefix argument is manually specified during mlc_llm compile, the model_lib field should be updated accordingly.
  • estimated_vram_bytes (Optional) Estimated requirements of VRAM to run the model.

这里会给出很多个模型的预设,我们全部删掉,只重新填写自己编译的模型信息即可,如果你不知道该怎么写诸如model_lib什么的,可以去github的issue部分查看或者保留预设。

完成之后,运行:

./prepare_libs.sh

会生成两个文件:

>>> find ./build/output -type f
./build/output/arm64-v8a/libtvm4j_runtime_packed.so
./build/output/tvm4j_core.jar

构建安卓应用

启动Android Studio:将./android文件作为Android studio 项目打开。
首先要将Android设备连接到虚拟机。如果连接成功的话你可以在这里看到你的设备:
在这里插入图片描述在Android Studio的菜单栏中,单击“Build → Make Project”。构建完成后,单击“Run → Run ‘app’”,这时候你的手机应该会自动安装MLCChat这个软件,但是先不要安装。

完成测试之后,生成 APK:点击“Build→Generate Signed Bundle/APK”构建APK进行发布。如果是第一次生成APK,则需要根据Android官方指南创建密钥。此 APK 将放置在android/MLCChat/app/release/app-release.apk.

安装ADB和USB调试:在手机设置的开发者模式中启用“USB 调试”。运行以下命令,如果ADB安装正确,手机将显示为设备:(这里用到的adb 是上面在安装Android studio时安装好的Android SDK Platform-Tools,并且环境已配置好,如果adb不可用,考虑检查环境配置和重新安装)

adb devices

注入权重

刚刚的操作,如果你都完成的话其实已经可以应用了,不过在手机上需要从huggingface上下载权重之后才能运行,并且国内无法访问。
那么我们如何给手机安装软件的同时上传权重以便直接使用呢?教程如下:

运行以下命令,将{MODEL_NAME}和替换{QUANTIZATION}为实际模型名称(例如 Llama-2-7b-chat-hf)和量化格式(例如 q4f16_1)。

# 将apk安装进你的android手机
adb install android/MLCChat/app/release/app-release.apk
# 将模型权重文件上传至android手机的临时文件夹
adb push dist/${MODEL\_NAME}-${QUANTIZATION} /data/local/tmp/${MODEL\_NAME}-${QUANTIZATION}/
# 在android手机上创建apk读取本地模型的文件夹路径
adb shell "mkdir -p /storage/emulated/0/Android/data/ai.mlc.mlcchat/files/"
# 将模型拷贝至apk读取文件夹路径
adb shell "mv /data/local/tmp/${MODEL\_NAME}-${QUANTIZATION} /storage/emulated/0/Android/data/ai.mlc.mlcchat/files/"

尾声

最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

进阶学习视频

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-qrpmJZC5-1714508643565)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值