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

本文主要是介绍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。

这篇关于LLM端侧部署系列 | 如何将阿里千问大模型Qwen部署到手机上?实战演示(下篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/877002

相关文章

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

SpringBoot配置Ollama实现本地部署DeepSeek

《SpringBoot配置Ollama实现本地部署DeepSeek》本文主要介绍了在本地环境中使用Ollama配置DeepSeek模型,并在IntelliJIDEA中创建一个Sprin... 目录前言详细步骤一、本地配置DeepSeek二、SpringBoot项目调用本地DeepSeek前言随着人工智能技

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应