书生大模型实战(从入门到进阶)L3-彩蛋岛-InternLM 1.8B 模型 Android 端侧部署实践

目录

1 环境准备

1.1 安装rust

1.2 安装Android Studio

1.3 设置环境变量

2 转换模型

2.1 安装mlc-llm

2.2 (可选)转换参数

2.3 (可选)生成配置

2.4 (可选)上传到huggingface

2.5 (可选) 测试转换的模型

3 打包运行

3.1 修改配置文件

3.2 运行打包命令

3.3 创建签名

3.4 修改gradle配置

3.5 命令行编译

3.6 运行体验


本文是对书生大模型L3-彩蛋岛-InternLM 1.8B 模型 Android 端侧部署实践部分的学习和实现,学习地址如下:

学习地址:‬​​​​⁠​​‌⁠‍⁠​‬​​​​​​​⁠‬​​​⁠​​‌​​​​​‍​​​⁠​​​学员闯关手册 - 飞书云文档 (feishu.cn)

1 环境准备

1.1 安装rust

参考: Other Installation Methods - Rust Forge。

使用了国内的镜像,出现选项直接Enter:

export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
curl --proto '=https' --tlsv1.2 -sSf https://mirrors.ustc.edu.cn/misc/rustup-install.sh  | sh

1.2 安装Android Studio

参考 :https://developer.android.com/studio。

mkdir -p /root/android && cd /root/android
wget https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2024.1.1.12/android-studio-2024.1.1.12-linux.tar.gz
tar -xvzf android-studio-2024.1.1.12-linux.tar.gz
cd android-studio
wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip?hl=zh-cn
unzip commandlinetools-linux-11076708_latest.zip\?hl\=zh-cn
export JAVA_HOME=/root/android/android-studio/jbr
cmdline-tools/bin/sdkmanager "ndk;27.0.12077973" "cmake;3.22.1"  "platforms;android-34" "build-tools;33.0.1" --sdk_root='sdk'

1.3 设置环境变量

. "$HOME/.cargo/env"
export ANDROID_NDK=/root/android/android-studio/sdk/ndk/27.0.12077973
export TVM_NDK_CC=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android24-clang
export JAVA_HOME=/root/android/android-studio/jbr
export ANDROID_HOME=/root/android/android-studio/sdk
export PATH=/usr/local/cuda-12/bin:$PATH
export PATH=/root/android/android-studio/sdk/cmake/3.22.1/bin:$PATH

2 转换模型

2.1 安装mlc-llm

参考:https://llm.mlc.ai/docs/install/mlc_llm.html,安装mlc-llm可能需要代理。

安装pytorch部分也可以使用其他包含torchconda环境。

conda create --name mlc-prebuilt  python=3.11
conda activate mlc-prebuilt
conda install -c conda-forge git-lfs
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
python -m pip install --pre -U -f https://mlc.ai/wheels mlc-llm-nightly-cu122 mlc-ai-nightly-cu122

测试如下输出说明安装正确:

python -c "import mlc_llm; print(mlc_llm)"

克隆项目:

git clone https://github.com/mlc-ai/mlc-llm.git
cd mlc-llm
git submodule update --init --recursive

2.2 (可选)转换参数

(如果不想上传到huggingface可以跳过这一步,有公开上传的)

使用 mlc_llm 的 convert_weight 对模型参数进行转换和量化,转换后的参数可以跨平台使用。

mkdir -p /root/models/
ln -s /share/new_models/Shanghai_AI_Laboratory/internlm2_5-1_8b-chat /root/models/internlm2_5-1_8b-chat
cd android/MLCChat  
export TVM_SOURCE_DIR=/root/android/mlc-llm/3rdparty/tvm
export MLC_LLM_SOURCE_DIR=/root/android/mlc-llm
mlc_llm convert_weight /root/models/internlm2_5-1_8b-chat/ \--quantization q4f16_1 \-o dist/internlm2_5-1_8b-chat-q4f16_1-MLC

2.3 (可选)生成配置

(如果不想上传到huggingface可以跳过这一步,有公开上传的)

使用 mlc_llm 的 gen_config 生成 mlc-chat-config.json 并处理 tokenizer。

出现提示时输入y。


mlc_llm gen_config /root/models/internlm2_5-1_8b-chat/  \--quantization q4f16_1 --conv-template chatml  \-o dist/internlm2_5-1_8b-chat-q4f16_1-MLC
Do you wish to run the custom code? [y/N] y

2.4 (可选)上传到huggingface

上传这一步需要能访问huggingface,可能需要部署代理并耗费一定流量。

具体方法可以参考网上的大量教程,如果不想上传到huggingface可以跳过这一步,直接在接下来的配置中使用如下链接的模型(和文档中的转换方法一样) https://huggingface.co/timws/internlm2_5-1_8b-chat-q4f16_1-MLC。

2.5 (可选) 测试转换的模型

在打包之前可以测试模型效果,需要编译成二进制文件。

在个人电脑上运行测试代码正常,InternStudio暂未成功。


mlc_llm compile ./dist/internlm2_5-1_8b-chat-q4f16_1-MLC/mlc-chat-config.json \--device cuda -o dist/libs/internlm2_5-1_8b-chat-q4f16_1-MLC-cuda.so

测试编译的模型是否符合预期,手机端运行的效果和测试效果接近:

from mlc_llm import MLCEngine# Create engine
engine = MLCEngine(model="./dist/internlm2_5-1_8b-chat-q4f16_1-MLC", model_lib="./dist/libs/internlm2_5-1_8b-chat-q4f16_1-MLC-cuda.so")# Run chat completion in OpenAI API.
print(engine)
for response in engine.chat.completions.create(messages=[{"role": "user", "content": "你是谁?"}],stream=True
):for choice in response.choices:print(choice.delta.content, end="", flush=True)
print("\n")
engine.terminate()

3 打包运行

3.1 修改配置文件

修改mlc-package-config.json 参考如下:

{"device": "android","model_list": [{"model": "HF://timws/internlm2_5-1_8b-chat-q4f16_1-MLC","estimated_vram_bytes": 3980990464,"model_id": "internlm2_5-1_8b-chat-q4f16_1-MLC"},{"model": "HF://mlc-ai/gemma-2b-it-q4f16_1-MLC","model_id": "gemma-2b-q4f16_1-MLC","estimated_vram_bytes": 3980990464}]
}

3.2 运行打包命令

这一步需要能访问huggingface,可能需要部署代理:

 mlc_llm package

3.3 创建签名

cd /root/android/mlc-llm/android/MLCChat
/root/android/android-studio/jbr/bin/keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000
Enter keystore password:  
Re-enter new password: 
What is your first and last name?[Unknown]:  Any
What is the name of your organizational unit?[Unknown]:  Any
What is the name of your organization?[Unknown]:  Any
What is the name of your City or Locality?[Unknown]:  Any
What is the name of your State or Province?[Unknown]:  Any
What is the two-letter country code for this unit?[Unknown]:  CN
Is CN=Any, OU=Any, O=Any, L=Any, ST=Any, C=CN correct?[no]:  yesGenerating 2,048 bit RSA key pair and self-signed certificate (SHA256withRSA) with a validity of 10,000 daysfor: CN=Any, OU=Any, O=Any, L=Any, ST=Any, C=CN
[Storing my-release-key.jks]

3.4 修改gradle配置

如果是本地可以WIFI或USB调试不用签名,在服务器构建需要签名 修改app/build.gradle为如下内容,主要是增加了签名部分,注意确认签名文件的位置:

plugins {id 'com.android.application'id 'org.jetbrains.kotlin.android'
}android {namespace 'ai.mlc.mlcchat'compileSdk 34defaultConfig {applicationId "ai.mlc.mlcchat"minSdk 26targetSdk 33versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"vectorDrawables {useSupportLibrary true}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}kotlinOptions {jvmTarget = '1.8'}buildFeatures {compose true}composeOptions {kotlinCompilerExtensionVersion '1.4.3'}packagingOptions {resources {excludes += '/META-INF/{AL2.0,LGPL2.1}'}}signingConfigs {release {storeFile file("/root/android/mlc-llm/android/MLCChat/my-release-key.jks")storePassword "123456"keyAlias "mykey"keyPassword "123456"}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'signingConfig signingConfigs.release}}
}dependencies {implementation project(":mlc4j")implementation 'androidx.core:core-ktx:1.10.1'implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'implementation 'androidx.activity:activity-compose:1.7.1'implementation platform('androidx.compose:compose-bom:2022.10.00')implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1'implementation 'androidx.compose.ui:ui'implementation 'androidx.compose.ui:ui-graphics'implementation 'androidx.compose.ui:ui-tooling-preview'implementation 'androidx.compose.material3:material3:1.1.0'implementation 'androidx.compose.material:material-icons-extended'implementation 'androidx.appcompat:appcompat:1.6.1'implementation 'androidx.navigation:navigation-compose:2.5.3'implementation 'com.google.code.gson:gson:2.10.1'implementation fileTree(dir: 'src/main/libs', include: ['*.aar', '*.jar'], exclude: [])testImplementation 'junit:junit:4.13.2'androidTestImplementation 'androidx.test.ext:junit:1.1.5'androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'androidTestImplementation platform('androidx.compose:compose-bom:2022.10.00')androidTestImplementation 'androidx.compose.ui:ui-test-junit4'debugImplementation 'androidx.compose.ui:ui-tooling'debugImplementation 'androidx.compose.ui:ui-test-manifest'}

3.5 命令行编译

运行编译命令,完成后在app/build/outputs/apk/release生成app-release.apk安装包,下载到手机上运行 运行App需要能访问huggingface下载模型(参考文档中的bundle方法需要ADB刷入模型数据):

./gradlew assembleRelease

3.6 运行体验

  • 运行App需要能访问huggingface下载模型
  • 需要大概4G运行内存
  • 如果运行闪退,和可能是下载不完整可以删除重新下载

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

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

相关文章

Python next方法应用场景

Python next方法应用场景 什么是 next() 函数?基本用法与示例next() 函数的实际应用场景场景 1:在生成器中逐个获取元素场景 2:文件逐行读取场景 3:跳过迭代中的特定元素场景 4:查找匹配元素场景 5:用 next…

管理方法(12)-- 采购管理

采购人员不是在为公司讨价还价,而是在为顾客讨价还价,我们应该为顾客争取最低的价钱。-----山姆 沃尔顿 沃尔玛的创始人。 1. 采购的定义和原则 5R原则:适时(Right Time)、适质(Right Quality)、适量(Right Quantity)、适价(Right Price)、适地(Right Place)。…

基于深度学习的视频内容理解

基于深度学习的视频内容理解(Video Content Understanding, VCU)是一项关键技术,旨在通过神经网络模型自动分析、解读和提取视频中的语义信息。深度学习方法能够利用视频的时序和空间特性,提取多模态信息(如图像、音频…

数据结构——栈的基本操作

前言 介绍 🍃数据结构专区:数据结构 参考 该部分知识参考于《数据结构(C语言版 第2版)》55 ~ 59页 🌈每一个清晨,都是世界对你说的最温柔的早安:ૢ(≧▽≦)و✨ 1、栈的基本概念 栈&#x…

【SpringBoot详细教程】-08-MybatisPlus详细教程以及SpringBoot整合Mybatis-plus【持续更新】

目录 🌲 MyBatis Plus 简介 🌾入门案例 🌾 MP 简介 🌲 MP 的CRUD 🌾 新增 🌾 删除 🌾 修改在进行 🌾 根据ID查询 🌾 查询所有 🌲 分页功能 🌾 设置分页参数 🌾 设置分页拦截器 🌲 优化启动 🌾 取消mbatisPlusBanner 🌾 取消Sprin…

[linux] 磁盘清理相关

在 CentOS 7 中清理磁盘空间可以通过多种方法实现,以下是一些常用的步骤和命令: 1. 查找和删除大文件 你可以使用 find 命令查找占用大量空间的文件: find / -type f -size 100M 2>/dev/null这条命令会查找大于 100 MB 的文件。你可以根…

国外电商系统开发-运维系统功能清单开发

一、最终效果图 二、功能清单 功能 描述 自定义日志绘图 根据Nginx、Apache登录日志文件绘图,绘图数据包括:访问量走势,500错误,200正确百分比等 创建服务器 加入服务器 主机状态自动检查 加入主机到系统后,系统…

LeetCode: 1971. 寻找图中是否存在路径

寻找图中是否存在路径 原题 有一个具有 n 个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edges[i] [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点…

记OpenGL的Demo中增加ImGui后界面不显示的问题

百思不得其解: 我的ImGui界面呢? 经过不断调整代码,也可能是对这还不太熟悉吧,最终将drawData放在clearColor后界面出来了,仔细想想也能理解,先画了界面,再渲染了背景色,将界面盖住了…

浅谈stm32的GPIO引脚配置模式

STM32的GPIO(通用输入输出)引脚可以被配置为多种模式,以适应不同的应用场景。下面介绍一些一些常见的STM32 GPIO引脚模式: 模拟输入模式(Analog Input Mode):在这种模式下,GPIO引脚被…

Docker Compose 部署大模型GPU集群:高效分配与管理算力资源

Docker Compose 部署大模型GPU集群:高效分配与管理算力资源 文章目录 Docker Compose 部署大模型GPU集群:高效分配与管理算力资源一 Dockerfile 编写二 Dockerfile 示例三 分配GPU资源1)GPU分配:指定count2)GPU分配&am…

虚商目前有哪些业务痛点?

虚拟运营商当前面临的业务痛点主要集中在市场竞争、运营成本、技术依赖、用户体验及政策监管等方面。 一、市场竞争激烈 1、竞争者数量增加: 随着市场准入门槛的降低,越来越多的企业进入虚拟运营商市场导致市场竟争日益激烈。为了争夺市场份额,企业不得不…

【Xcode Command Line Tools】安装指南

安装指令 xcode-select --install安装 完成安装 验证 $ xcode-select -p /Library/Developer/CommandLineTools

使用Chrome浏览器时打开网页如何禁用缓存

缓存是浏览器用于临时存储网页资源的一种机制,可以提高网页加载速度和减轻服务器负载。 然而,有时候我们需要阻止缓存中的Chrome浏览器,以便获取最新的网页内容。以下是一些方法可以实现这个目标: 1、强制刷新页面:在C…

【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错

1. 运行项目 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Appl…

【车载开发系列】ParaSoft单元测试环境配置(四)

【车载开发系列】ParaSoft单元测试环境配置(四) 【车载开发系列】ParaSoft单元测试环境配置(四) 【车载开发系列】ParaSoft单元测试环境配置(四)一. 如何设置过滤二. 如何设置静态扫描的规则三. 如何设置单…

Pycharm 本地搭建 stable-diffusion-webui

一、下载工程源码 Github官方连接 https://github.com/AUTOMATIC1111/stable-diffusion-webui 二、Pycharm打开工程 1、设置环境 文件-设置-项目-Python解析器-添加解释器-添加本地解释器 Conda环境-创造新环境-Python版本3.10 注意一定要选择Python3.10版本,否…

tushare库简介及数据获取方法

文章目录 tushare库简介tushare使用方法接口数据获取实例获取交易日历股票基础信息沪股通和深股通成份股上市公司基础信息获取新股上市列表数据A股日线行情A股周线行情A股月线行情股票每日指标,选股分析 tushare库简介 tushare库是一个用于抓取中国股票的历史和实时…

虚拟机三种网络模式详解

在电脑里开一台虚拟机,是再常见不过的操作了。无论是用虚拟机玩只有旧版本系统能运行的游戏,还是用来学习Linux、跑跑应用程序都是很好的。而这其中,虚拟机网络是绝对绕不过去的。本篇文章通俗易懂的介绍了常见的虚拟网络提供的三种网络链接模…

从0开始实现es6 promise类

主要由基础实现和静态类的实现两部分组成。 1 基础实现(不含静态类) 1.1 使用类实现完成构造函数 实现代码如下,构造函数传入一个回调函数,定义resolve和reject函数,将两个函数作为参数执行回调函数。 // 1. 使用类实…