0x0. 前言 这篇文章主要是填一下 mlc-llm 部署rwkv world系列模型实战(3b模型mac m2解码可达26tokens/s) 这里留下来的坑,这篇文章里面介绍了如何使用 mlc-llm 在a100/mac m2上部署 rwkv 模型。但是探索在android端部署一个rwkv对话模型的app时却碰到了诸多问题,解决的周期也很长,之前留了issue在mlc-llm的repo,这周@chentianqi大佬回复说之前编译出的app会在模型初始化阶段卡住的问题已经解决了,所以我又重新开始踩了一些坑最终完成了在手机上运行rwkv world4 3b模型的目的。这里把踩的坑和android编译方法都描述一下。
我这里编译了一个rwkv4 world 3b模型的权重int4量化版本的apk,地址为:https://github.com/bbuf/run-rwkv-world-4-in-mlc-llm/releases/download/v1.0.0/app-debug.apk 。感兴趣的小伙伴可以下载这个apk到android手机上来运行,需要注意的是由于要在线拉取huggingface的权重,所以手机上需要可以访问huggingface需要代理。
在我的redmik50手机上进行测试,效果和速度如下:
每一秒大概可以解码8个token,我感觉速度勉强够用了。由于rwkv5迭代到了第5个版本,后续希望能支持rwkv5的模型,当然也可以寻求新的优化机会提升解码速度。
0x1. 踩坑 之前写这篇文章 mlc-llm 部署rwkv world系列模型实战(3b模型mac m2解码可达26tokens/s) 的时候发现android app在初始化的时候一直会卡住,即使换成官方编译的app也是如此,所以提了issue之后就放弃了。现在这个bug被修复了,不过我没有找到具体的改动pr是什么,但我在mlc-llm的android部分没有发现相关改动,所以大概率是relax本身的bug,就不深究了。
这次仍然是按照之前的方法进行编译,但是也踩了几个坑,具体体现在下方的改动:
这个改动只是为了在本地可以编译出rwkv的android app,有坑的地方体现在下面的2个改动:
第一个坑是在dump_mlc_chat_config的时候,对于rwkv world模型应该使用工程下面的tokenzier_model文件作为tokenzie的文件,但是之前没考虑这个问题(dump出的config中tokenizer_files字段为空)就会导致编译出的app在初始化阶段报错:
经过上面的修改之后重新在mlc-llm下面pip install .,然后编译模型就可以得到可以正常初始化的config了。这个问题是通过在android studio里面通过device explore查看下载的文件夹发现的,我发现少了一个tokenizer_model文件才注意的。
第二个坑是初始化完成之后聊天的时候不出字,我在mac上去复现了这个错误,然后发现是因为在rwkv里面把max_window_size这个属性设置成了1。
然后在mlc_chat.cc里面通过max_window_size判断结束符时没有考虑-1,所以第一个token生成之后程序就终止了。所以在这里加一个特判进行了修复。
解决了上面2个问题,编译出新的apk之后就可以正常运行了。
0x2. 详细教程 下面是编译出apk的详细教程。在这之前请阅读:mlc-llm 部署rwkv world系列模型实战(3b模型mac m2解码可达26tokens/s) ,这是前置内容。
对于android,你可以按照https://mlc.ai/mlc-llm/docs/deploy/android.html的教程在你的手机上编译apk。
根据官方教程,这里有一些需要修改的地方:
修改这个文件。更新的内容应该是: { model_libs: [ rwkv-4-world-3b-q4f16_1 ], model_list: [ { model_url: https://huggingface.co/bbuf/rwkv-4-world-3b-q4f16_1/, local_id: rwkv-4-world-3b-q4f16_1 } ], add_model_samples: []} 将代码的这个部分修改为: compileoptions { sourcecompatibility javaversion.version_17 targetcompatibility javaversion.version_17}kotlinoptions { jvmtarget = '17'} 如果你遇到错误:“android gradle插件要求运行java 17。你目前使用的是java 11”,请按照https://stackoverflow.com/questions/76362800/android-gradle-plugin-requires-java-17-to-run-you-are-currently-using-java-11 的方法清除缓存并重新编译。 一旦你完成了apk的编译,你可以在你的手机上启用开发者模式并安装apk以供使用。
以小米手机为例,你可以按照下面的教程启用开发者模式并将apk传输到你的手机上。
第一步:在手机上启用usb调试
首先,前往你的手机的设置 -> 我的设备 -> 所有规格 -> miui版本,连续点击miui版本七次以进入开发者模式。 接下来,导航至设置 -> 额外设置 -> 开发者选项,打开usb调试和usb安装。 第二步:配置android studio
打开你的android studio项目,前往运行 -> 编辑配置,如下图所示,选择打开选择部署目标对话框。这将在每次你调试时提示设备选择对话框。注意:如果你直接选择usb设备,你可能无法在调试过程中检测到你的手机。 第三步:在线调试
通过usb将你的手机连接到电脑。通常会自动安装必要的驱动程序。当你运行程序时,将出现设备选择对话框。选择你的手机,apk将自动安装并运行。 一个编译好的apk: https://github.com/bbuf/run-rwkv-world-4-in-mlc-llm/releases/download/v1.0.0/app-debug.apk
0x3. 总结 这篇文章分享了一下使用mlc-llm将rwkv模型跑在android手机上遭遇的坑以及编译的详细教程,接下来也会尝试一下rwkv5。想在andorid手机上本地运行开源大模型的伙伴们可以考虑一下mlc-llm,他们的社区还是比较活跃的,如果你提出一些问题一般都会有快速的回复或者解决方法。
0x4. 相关link https://github.com/mlc-ai/tokenizers-cpp/pull/14 https://github.com/mlc-ai/mlc-llm/pull/1136 https://github.com/mlc-ai/mlc-llm/pull/848 https://mlc.ai/mlc-llm/docs/ starring2022/rwkv-4-world-1.5b starring2022/rwkv-4-world-3b starring2022/rwkv-4-world-7b https://github.com/mlc-ai/mlc-llm/issues/862 https://github.com/mlc-ai/mlc-llm/issues/859
高度集成芯片方案打造的智能头盔有哪些多个优势?
触摸电容屏原理 触摸电容屏划线出现断线怎么回事
自平衡机器人的控制系统设计
这十大科技突破,有哪几样震撼到你了呢?
如何选择工业控制电缆,选择工业控制电缆有哪些技巧
如何使用MLC-LLM在A100/Mac M2上部署RWKV模型
中国的5G技术水平已经走到了世界前列
专注5G/6G无线通信的毫米波波束成形原型设计解决方案
台积电“低点已过”,未来只有上坡路
下一代iPhone8有这些亮点?曲面屏领衔!
向Intel发起重型计算挑战 ARM发布Neoverse 处理器
5G 和 GaN:嵌入式设计人员需要了解的内容
关于电子元器件分销行业的介绍和发展
PCB设计中常见的走线等长要求
融合Azure Kinect技术,奥比中光Femto Mega接入Mac生态
语音芯片在扫地机中的应用
智能硬件村田能提供哪些无线技术
华为nova8怎么升级为鸿蒙系统
数字逻辑电路应用案例
齐纳(稳压)二极管特性的测定