LLM端侧部署系列 | 如何将阿里千问大模型Qwen部署到手机上?实战演示(下篇)

  • 引言

  • 简介

  • 编译Android可用的模型

    • 转换权重

    • 生成配置文件

    • 模型编译

  • 编译apk

    • 修改配置文件

    • 绑定android library

    • 配置gradle

    • 编译apk

  • 手机上运行

    • 安装 APK

    • 植入模型

    • 效果实测

0. 引言

清明时节雨纷纷,路上行人欲断魂。

小伙伴们好,我是《小窗幽记机器学习》的小编:卖青团的小女孩,紧接前文LLM系列。今天这篇小作文主要介绍如何将阿里巴巴的千问大模型Qwen 1.8B部署到手机端,实现离线、断网条件下使用大模型。主要包括以下几个步骤:

  1. 编译Android手机可以使用的Qwen模型

  2. 编译打包APK,为Qwen在Android手机上运行提供用户交互界面

  3. 安装APK和效果实测

如需与小编进一步交流,可以在《小窗幽记机器学习》上添加小编好友。

1. 简介

为将Qwen大模型部署到手机,实现断网下Qwen模型正常使用,本文选择MLC-LLM框架。

MLC LLM(机器学习编译大型语言模型,Machine Learning Compilation for Large Language Models) 是一种高性能的通用部署解决方案,将任何语言模型本地化部署在各种硬件后端和本机应用程序上,并为每个人提供一个高效的框架,以进一步优化自己模型性能。该项目的使命是使每个人都能够使用ML编译技术在各种设备上本机开发、优化和部署AI模型。

以下将以Qwen1.5-1.8B-Chat为例,详细说明如何利用mlc-llm将该模型部署到Android手机上,最终实现每秒约20个token的生成速度。以下命令执行都在mlc-llm的目类下执行。囿于篇幅,将在后文,以上篇名义补充介绍对应的环境安装和配置等工作。

2. 编译Android可用模型

MODEL_NAME=Qwen1.5-1.8B-Chat
QUANTIZATION=q4f16_1

2.1 权重转换

# convert weights
mlc_llm convert_weight /share_model_zoo/LLM/Qwen/$MODEL_NAME/ --quantization $QUANTIZATION -o dist/$MODEL_NAME-$QUANTIZATION-MLC/

通过上述命令,将hf格式的Qwen模型转为mlc-llm支持的模型格式,结果文件存于:dist/Qwen1.5-1.8B-Chat-q4f16_1-MLC

2.2 生成配置文件

# 生成配置文件mlc_llm gen_config /share_model_zoo/LLM/Qwen/$MODEL_NAME/ --quantization $QUANTIZATION --model-type qwen2 --conv-template chatml --context-window-size 4096 -o dist/${MODEL_NAME}-${QUANTIZATION}-MLC/

此时生成的配置文件dist/Qwen1.5-1.8B-Chat-q4f16_1-MLC/mlc-chat-config.json信息:

{"model_type": "qwen2","quantization": "q4f16_1","model_config": {"hidden_act": "silu","hidden_size": 2048,"intermediate_size": 5504,"num_attention_heads": 16,"num_hidden_layers": 24,"num_key_value_heads": 16,"rms_norm_eps": 1e-06,"rope_theta": 1000000.0,"vocab_size": 151936,"context_window_size": 4096,"prefill_chunk_size": 4096,"tensor_parallel_shards": 1,"head_dim": 128,"dtype": "float32"},"vocab_size": 151936,"context_window_size": 4096,"sliding_window_size": -1,"prefill_chunk_size": 4096,"attention_sink_size": -1,"tensor_parallel_shards": 1,"mean_gen_len": 128,"max_gen_len": 512,"shift_fill_factor": 0.3,"temperature": 0.7,"presence_penalty": 0.0,"frequency_penalty": 0.0,"repetition_penalty": 1.1,"top_p": 0.8,"conv_template": {"name": "chatml","system_template": "<|im_start|>system\n{system_message}","system_message": "A conversation between a user and an LLM-based AI assistant. The assistant gives helpful and honest answers.","add_role_after_system_message": true,"roles": {"user": "<|im_start|>user","assistant": "<|im_start|>assistant"},"role_templates": {"user": "{user_message}","assistant": "{assistant_message}","tool": "{tool_message}"},"messages": [],"seps": ["<|im_end|>\n"],"role_content_sep": "\n","role_empty_sep": "\n","stop_str": ["<|im_end|>"],"stop_token_ids": [2],"function_string": "","use_function_calling": false},"pad_token_id": 151643,"bos_token_id": 151643,"eos_token_id": [151645,151643],"tokenizer_files": ["tokenizer.json","vocab.json","merges.txt","tokenizer_config.json"],"version": "0.1.0"
}

2.3 模型编译

# 进行模型编译:# 2. compile: compile model library with specification in mlc-chat-config.jsonmkdir dist/libsmlc_llm compile ./dist/${MODEL_NAME}-${QUANTIZATION}-MLC/mlc-chat-config.json --device android -o ./dist/libs/${MODEL_NAME}-${QUANTIZATION}-android.tar

生成dist/libs/Qwen1.5-1.8B-Chat-q4f16_1-android.tar文件。

3. 编译apk

3.1 修改配置文件

# Configure list of models
vim ./android/library/src/main/assets/app-config.json

./android/library/src/main/assets/app-config.json改为:

{"model_list": [{"model_url": "https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat","model_lib": "qwen2_q4f16_1","estimated_vram_bytes": 4348727787,"model_id": "Qwen1.5-1.8B-Chat-q4f16_1"  # 手机上模型目录要跟这个一致,不然无法加载}],"model_lib_path_for_prepare_libs": {"qwen2_q4f16_1": "libs/Qwen1.5-1.8B-Chat-q4f16_1-android.tar"}
}

3.2 绑定android library

需要查看以下系统变量:

echo $ANDROID_NDK   # Android NDK toolchain
echo $TVM_NDK_CC   # Android NDK clang
echo $JAVA_HOME    # Java
export TVM_HOME=/share/Repository/mlc-llm/3rdparty/tvm # mlc-llm 中的 tvm 目类
echo $TVM_HOME     # TVM Unity runtime

是否符合预期。

# Bundle model library
cd ./android/library
./prepare_libs.sh

上述脚本会基于rustup安装aarch64-linux-android,如果比较慢,可以进行如下配置:

export RUSTUP_DIST_SERVER=https://mirrors.tuna.tsinghua.edu.cn/rustup
export RUSTUP_UPDATE_ROOT=https://mirrors.tuna.tsinghua.edu.cn/rustup/rustup

再执行上述脚本。

3.3 配置gradle

修改android/gradle/wrapper/gradle-wrapper.properties, 将原始的内容:

#Thu Jan 25 10:19:50 EST 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

可以看出,gradle-8.5-bin.zip的路径是:android/gradle/wrapper/dist/gradle-8.5-bin.zip

这里需要注意,wrapper/dists的完整路径其实是/root/.gradle/wrapper/dists修改为:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=dist/gradle-8.5-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

需要注意,distributionUrl 这个的base目录其实是mlc-llm目录下的android/gradle/wrapper

3.4 编译apk

# Build android app
cd .. && ./gradlew assembleDebug

编译生成的Android apk 文件位于:app/build/outputs/apk/debug/app-debug.apk

4. 手机实测

4.1 安装 APK

将手机设置成debug模式,数据线连接手机,正常连接之后在电脑执行以下命令,将上面编译出的apk安装到Android手机上:

adb install app-debug.apk

PS: 需要预先在本机电脑上安装 adb 命令。

4.2 植入模型

# 改名,从而适配之前的配置信息
mv Qwen1.5-1.8B-Chat-q4f16_1-MLC Qwen1.5-1.8B-Chat-q4f16_1# 将模型文件推送到手机的 /data/local/tmp/ 目类
adb push Qwen1.5-1.8B-Chat-q4f16_1 /data/local/tmp/adb shell "mkdir -p /storage/emulated/0/Android/data/ai.mlc.mlcchat/files/"adb shell "mv /data/local/tmp/Qwen1.5-1.8B-Chat-q4f16_1 /storage/emulated/0/Android/data/ai.mlc.mlcchat/files/"

4.3 聊天实测

实测大约1s可以生成20个token。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/301407.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VAR模型(二)结婚率的影响因素分析

本文研究分析了普通本专科毕业人数、城乡居民人民币储蓄存款年底余额对结婚率的影响。以计量经济学中VAR模型为主要分析模型,建立了结婚率的多元回归模型。分析了普通本专科毕业人数、城乡居民人民币储蓄存款年底余额和结婚率现状。并且对未来结婚率进行了预测。 1.理论模型和…

C语言面试题之化栈为队

化栈为队 实例要求 C语言实现实现一个MyQueue类&#xff0c;该类用两个栈来实现一个队列&#xff1b;示例&#xff1a; MyQueue queue new MyQueue();queue.push(1); queue.push(2); queue.peek(); // 返回 1 queue.pop(); // 返回 1 queue.empty(); // 返回 false说明&…

NCI SEER breast cancer美国国立癌症研究所数据库乳腺癌生存分析和乳腺癌预测模型(2024年新项目)

​作者Toby&#xff0c;来源公众号&#xff1a;python生物信息学,美国国立癌症研究所数据库乳腺癌生存分析和乳腺癌预测模型 NCI美国国立癌症研究所(NationalCancerInstitute,NCI) 美国国立癌症研究所&#xff08;NCI&#xff09;是美国国家卫生研究院&#xff08;NIH&#xf…

USACO 2024 Open Bronze铜组题解

迟到了一个月的题解...... Logical Moos: 啊这题放在铜组T1雀食有点BT...... 首先&#xff0c;我们关注l前第一和r最后那两组。如果这俩有一个是true&#xff0c;那答案肯定也是true。 否则&#xff0c;在l和r外边的都是false。那我们就只用仔细看l和r中间的玩意儿。对于l和…

如何挂载img镜像以及lvm分区

上一章节&#xff0c;我在win10下利用qemu安装了一个aarch64的 kylin-server-v10的ISO系统镜像包。安装时将系统安装到了虚拟硬盘kylin-server-v10.img 里&#xff0c;现在有个需求&#xff0c;要读出kylin-server-v10.img中文件系统的内容。 通过fdisk命令可以看到 kylin-ser…

利用AI结合无极低码(免费版)快速实现接口开发教程,会sql即可,不需要编写编译代码

无极低码无代码写服务+AI实践 本次演示最简单的单表无代码增删改查发布服务功能,更复杂的多表操作,安全验证,多接口调用,自自动生成接口服务,生成二开代码,生成调用接口测试,一键生成管理界面多条件检索、修改、删除、查看、通用公共接口调用、通用无限级字典调用等后续…

web前端框架设计第四课-条件判断与列表渲染

web前端框架设计第四课-条件判断与列表渲染 一.预习笔记 1.条件判断 1-1&#xff1a;v-if指令&#xff1a;根据表达式的值来判断是否输出DOM元素 1-2&#xff1a;template中使用v-if 1-3&#xff1a;v-else 1-4&#xff1a;v-else-if 1-5&#xff1a;v-show&#xff08;不支…

生成式AI的情感实验——AI能否产生思想和情感?

机器人能感受到爱吗&#xff1f;这是一个很好的问题&#xff0c;也是困扰了科学家们很多年的科学未解之谜。虽然我们尚未准备好向智能机器赋予情感&#xff0c;但智能机器却已经可以借助生成式人工智能&#xff08;AI&#xff09;来帮助我们表达自己的情感。 自然情感表达 AI正…

Unity Toggle组件

Toggle Group组件 Allow Switch Off属性值为false时&#xff0c; 1&#xff0c;Toggle初始时默认会有一个被勾选&#xff08;ison为true&#xff09;&#xff0c;可以自己打勾指定 2&#xff0c;不能取消勾选 Allow Switch Off属性值为true时&#xff0c; 1&#xff0c;Toggl…

安达发|包装容器行业APS生产排程计划管理特点

在包装容器行业中&#xff0c;APS&#xff08;高级计划排程系统&#xff09;是企业实现生产自动化、信息化的重要组成部分。一个有效的APS生产排程计划管理对于提高生产效率、降低生产成本、保障交货期以及提升客户满意度具有至关重要的作用。以下是对包装容器行业APS生产排程计…

基于Springboot框架四川成都某大学教室自习室预约系统设计与实现 研究背景和意义、国内外现状

二、国内外现状 在国内外&#xff0c;教室和自习室预约系统作为高校信息化建设的重要组成部分&#xff0c;已经得到了广泛的关注和应用。不同国家和地区的高校在预约系统的建设和应用方面呈现出不同的特点和趋势。 在国内方面&#xff0c;随着高校信息化建设的不断深入&#…

麒麟系统下安装qt5.9.1后不能输入中文

引言 在虚拟机上安装麒麟系统后,安装了qt5.9.1,只能输入英文和数字不能输入中文注释,编译的程序也不能输入中文。 原因 安装后的麒麟系统自带搜狗输入法,原本可以输入中文,但是qt5.9.1缺少支持搜狗输入法的fcitx插件。所以qt5.9.1中不能输入中文。 解决方法 安装fcit…

MWeb Pro For Mac v4.5.9 强大的 Markdown 软件中文版

MWeb 是专业的 Markdown 写作、记笔记、静态博客生成软件&#xff0c;目前已支持 Mac&#xff0c;iPad 和 iPhone。MWeb 有以下特色&#xff1a; 软件下载&#xff1a;MWeb Pro For Mac v4.5.9 软件本身&#xff1a; 使用原生的 macOS 技术打造&#xff0c;追求与系统的完美结合…

【MySQL探索之旅】数据库设计以及聚合查询

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

RIP配置不求人:手把手教你配置RIP路由

#教育优质作者发文挑战赛# 大家好&#xff0c;今天给同学们介绍一下RIP基本功能相关配置 01、基本概念 RIP是一种基于距离矢量&#xff08;Distance-Vector&#xff09;算法的协议&#xff0c;它使用跳数&#xff08;Hop Count&#xff09;作为度量值来衡量到达目的地址的距离…

企业必看:几个在线文档编辑器天花板

在线文档编辑器是企业工作必不可少的工具&#xff0c;不仅能够帮助企业实现高效协作&#xff0c;还能提升文档管理的便捷性和安全性。在众多在线文档编辑器中&#xff0c;有几个工具因其出色的性能和广泛的应用而备受瞩目&#xff0c;成为了企业使用的热门选择。接下来&#xf…

Driver not loaded之记录Qt访问MySql的解决经历

对于这个问题的本质原因&#xff0c;我也搞不明白&#xff0c;所以记录的方法不一定对所有人行之有效。我的目的很简单&#xff0c;就是把数据库用起来&#xff0c;经过查找网上资料&#xff0c;最终把数据库跑起来了。因此记录如下&#xff1a; 1&#xff0c;出现这个问题是缺…

基于单片机钢琴电子节拍器系统设计

**单片机设计介绍&#xff0c;基于单片机钢琴电子节拍器系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机钢琴电子节拍器系统设计是一个综合性的项目&#xff0c;它结合了单片机编程、音频处理、用户界面设计等多个领域的…

Master节点快照回退遇到的容器不存在的问题

这次遇到的问题说起来有点扯&#xff0c;k8s集群出了点问题&#xff0c;kuboard无法访问&#xff0c;查看容器状态后&#xff0c;初始问题简单的以为是kuboard出问题了&#xff0c;理论上来说重新安装kuboard即可&#xff0c; 由此问题引发的系统bug&#xff0c;导致master节点…

探索Flutter混淆在提高应用安全性方面的作用

在移动应用开发中&#xff0c;保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具&#xff0c;帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆&#xff0c;并提供了相关的操作步骤和注意事项。 &#x1f4dd; 摘要 本…