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

news2024/10/1 1:41:08

目录

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]:  yes

Generating 2,048 bit RSA key pair and self-signed certificate (SHA256withRSA) with a validity of 10,000 days
        for: 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 34

    defaultConfig {
        applicationId "ai.mlc.mlcchat"
        minSdk 26
        targetSdk 33
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary true
        }
    }

    
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility 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 false
            proguardFiles 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.coloradmin.cn/o/2181226.html

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

相关文章

Parallels Desktop19官方中文版10月最新

如何使用 Parallels Desktop 在 Mac 上运行虚拟机 Parallels Desktop 是一款强大的虚拟机软件,允许 Mac 用户在 macOS 上方便地运行 Windows 和其他操作系统。这款软件尤其适合开发者、设计师以及任何需要使用不同操作系统的用户。本文将为新手用户提供一步一步的指…

EthernetIP IO从站设备数据 转profinet IO项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 网关采集ETHERNETIP IO数据 2 5 用PROFINET IO协议转发数据 4 6 从设备的的EDS文件获取参数信息 7 7 案例总结 9 1 案例说明 设置网关采集EthernetIP IO设备数据把采集的数据转成profinet IO协议转发给其他系统。 2…

可视耳勺方便吗?双十一质量最好的可视挖耳勺推荐

相信大家掏耳的时候完全依赖我们的感觉和经验,我们无法直接看到耳道内部的情况。这就如同在黑暗中摸索,极易造成意外伤害。稍有不慎,就可能刮伤耳道娇嫩的皮肤,导致耳道出血、感染,引发炎症。更严重的可能会导致听力下…

Linux驱动开发(速记版)--平台总线

第四十七章 平台总线模型介绍 47.1 什么是平台总线? 平台总线是Linux内核中的一种虚拟机制,用于连接和匹配平台设备与对应的平台驱动。它简化了设备与驱动之间的绑定过程,提高了系统对硬件的适配性和扩展性。 当设备或驱动被注册时&#xff…

Java 如何从图片上提取文字

生活中我们可能会遇到想从图片上直接复制上边的文字&#xff0c;该如何获取呢&#xff0c;接下来看看如何使用Java程序实现从图片中读取文字。 实现过程 1、引入Tess4J 依赖 <!--Tess4J 依赖--> <dependency><groupId>net.sourceforge.tess4j</groupId…

AI绘画助手,对比总结出这六款

AI绘画助手&#xff0c;AI绘画助手近年来在艺术创作领域中逐渐崭露头角&#xff0c;成为许多艺术家和设计师的新宠。随着人工智能技术的飞速发展&#xff0c;这些工具不仅提高了创作效率&#xff0c;还为用户带来了前所未有的创意体验。下文将介绍六款简单好用的AI绘画助手&…

主成分分析法

主成分分析法 1. 基础知识1.1 向量1.1.1 样本均值1.1.2 向量投影 1.2 矩阵1.2.1 矩阵微分1.2.2 矩阵特征值和特征向量1.2.2.1 特征值和特征向量的几何意义1.2.2.2 特征向量与矩阵变换的关系1.2.2.3 特征值与矩阵的迹 1.3 Lagrange乘子法1.3.1 等式约束优化问题 2. 主成分分析法…

【JavaScript】LeetCode:56-60

文章目录 56 路径总和Ⅲ57 二叉树的最近公共祖先58 二叉树中的最大路径59 岛屿数量60 腐烂的橘子 56 路径总和Ⅲ 递归遍历每个节点所有可能的路径。pathSum()&#xff1a;返回所有节点满足条件的路径数目&#xff0c;traversal()&#xff1a;返回当前遍历节点满足条件的路径数目…

鸿蒙开发(NEXT/API 12)【状态查询与订阅】手机侧应用开发

注意 该接口的调用需要在开发者联盟申请设备基础信息权限与穿戴用户状态权限&#xff0c;穿戴用户状态权限还需获得用户授权。 实时查询穿戴设备可用空间、电量状态。订阅穿戴设备连接状态、低电量告警、用户心率告警。查询和订阅穿戴设备充电状态、佩戴状态、设备模式。 使…

基于Apache和Tomcat的负载均衡实验报告

说明&#xff1a;本实验为浙江科技大学软件工程本科专业课程《软件体系结构》的实验报告。 五、总结 负载均衡的基础是集群&#xff0c;集群就是一组连在一起的计算机&#xff0c;从外部看它是一个系统&#xff0c;各节点可以是不同的操作系统或不同的硬件构成的计算机。负载…

【d56】【sql】完成sql 7题目

... 有一题感觉没意义&#xff0c;直接不刷

vue + echarts 快速入门

vue echarts 快速入门 本案例即有nodejs和vue的基础&#xff0c;又在vue的基础上整合了echarts Nodejs基础 1、Node简介 1.1、为什么学习Nodejs(了解) 轻量级、高性能、可伸缩web服务器前后端JavaScript同构开发简洁高效的前端工程化 1.2、Nodejs能做什么(了解) Node 打破了…

TCP-2;CSNSDWSSC;肿瘤血管及M1型巨噬细胞靶向肽

【TCP-2 简介】 TCP-2&#xff08;Tumor-conditioned medium-stimulated Clone-2&#xff09;是一种特定的靶向肽&#xff0c;主要针对肿瘤微环境中的肿瘤血管和M1型巨噬细胞。这种肽在肿瘤治疗领域显示出巨大的潜力&#xff0c;尤其是在提高药物递送的精确性、增强免疫介导的抗…

【网络安全】绕过 Etplorer 管理面板实现RCE

未经许可,不得转载。 文章目录 正文使用 ffuf 进行FUZZ查找漏洞漏洞复现目标网站:https://app.redacted.com 正文 使用 ffuf 进行FUZZ ffuf -u https://app.redacted.com/FUZZ -w wordlist.txt -c -r-c:表示彩色输出,方便用户在终端中查看结果。 -r:忽略响应中的重定向…

【重学 MySQL】四十三、多行子查询

【重学 MySQL】四十三、多行子查询 使用 IN 子查询示例&#xff1a;查找属于特定部门的员工 使用 ANY 和 ALL 子查询使用 ANY使用 ALL 注意事项 在 MySQL 中&#xff0c;多行子查询&#xff08;也称为 IN 子查询&#xff09;是指子查询返回多行数据&#xff0c;并且这些数据用于…

新质农业——水资源可持续管理

橙蜂智能公司致力于提供先进的人工智能和物联网解决方案&#xff0c;帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、埃域知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能&…

基于SpringBoot+Vue的服装销售管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

C++ | Leetcode C++题解之第437题路径总和III

题目&#xff1a; 题解&#xff1a; class Solution { public:unordered_map<long long, int> prefix;int dfs(TreeNode *root, long long curr, int targetSum) {if (!root) {return 0;}int ret 0;curr root->val;if (prefix.count(curr - targetSum)) {ret pref…

CaChe的基本原理

目录 一、Cache的定义与结构 二、Cache的工作原理 三、Cache的映射与替换策略 四、Cache的写操作处理 Cache&#xff0c;即高速缓冲存储器&#xff0c;是计算机系统中位于CPU与主存之间的一种高速存储设备。它的主要作用是提高CPU对存储器的访问速度&#xff0c;从而优化系…

YOLOv8改进 - 注意力篇 - 引入SCAM注意力机制

一、本文介绍 作为入门性篇章&#xff0c;这里介绍了SCAM注意力在YOLOv8中的使用。包含SCAM原理分析&#xff0c;SCAM的代码、SCAM的使用方法、以及添加以后的yaml文件及运行记录。 二、SCAM原理分析 SCAM官方论文地址&#xff1a;SCAM文章 SCAM官方代码地址&#xff1a;SC…