安卓端侧大模型MLC-LLM部署全攻略:以InternLM2.5-1.8B为例

ops/2025/2/23 5:18:09/

本文来自社区投稿,作者:Tim 算法工程师

MLC-LLM 是一个机器学习编译器和高性能大型语言模型部署引擎。该项目的使命是让每个人都能在自己的平台上开发、优化和部署 AI 模型。InternLM 2.5 是上海人工智能实验室发布的新一代大规模语言模型,相比于之前的版本,InternLM 2.5支持百万长文,推理能力开源领先。本文将带大家手把手使用 MLC-LLM 将 InternLM2.5-1.8B-Chat部署到安卓手机上。

https://github.com/InternLM/InternLM

首先我们来看一下最终的效果~
在这里插入图片描述

1. 环境准备

1.1 安装 rust

可参考 https://forge.rust-lang.org/infra/other-installation-methods.html#which

此处使用了国内的镜像,如下列命令,当出现选项时选择 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/Downloads/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 (如果下载很慢可以取消重新运行一下,或者本地下载了之后拷过去)

conda create --name mlc-prebuilt  python=3.11
conda activate mlc-prebuilt
conda install -c conda-forge git-lfs
pip install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 transformers sentencepiece protobuf
wget https://github.com/mlc-ai/package/releases/download/v0.9.dev0/mlc_llm_nightly_cu122-0.1.dev1445-cp311-cp311-manylinux_2_28_x86_64.whl
wget https://github.com/mlc-ai/package/releases/download/v0.9.dev0/mlc_ai_nightly_cu122-0.15.dev404-cp311-cp311-manylinux_2_28_x86_64.whl
pip install mlc_ai_nightly_cu122-0.15.dev404-cp311-cp311-manylinux_2_28_x86_64.whl
pip install mlc_llm_nightly_cu122-0.1.dev1445-cp311-cp311-manylinux_2_28_x86_64.whl

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

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 转换参数

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

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 生成配置

使用 mlc_llmgen_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 上传到 HuggingF****ace

上传这一步需要能访问 HuggingFace,可能需要部署代理,如果没有代理可以直接在接下来的配置中使用此链接https://huggingface.co/timws/internlm2_5-1_8b-chat-q4f16_1-MLC 中的模型(和文档 https://llm.mlc.ai/docs/deploy/android.html#android-sdk 中的转换方法一样)

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

在打包之前可以测试模型效果,需要编译成二进制文件,已成功在个人电脑上运行测试代码。

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 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 下载模型。

./gradlew assembleRelease

在这里插入图片描述

3.6 运行体验

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

在这里插入图片描述


http://www.ppmy.cn/ops/160308.html

相关文章

2025华为OD机试真题-猜字谜(C++)-E卷-100分

2024华为OD机试最新题库-(C卷+D卷+E卷)-(JAVA、Python、C++) 目录 题目描述 输入描述 输出描述: 示例1 示例2 解题思路 代码 c++ 题目描述 小王设计了一个简单的猜字谜游戏,游戏的谜面是一个错误的单词,比如nesw,玩家需要猜出谜底库中正确的单词。 猜中的要求如下…

学习记录 DAY10 Tensorflow,神经网络视觉

学习视频来自B站视频:从入门到精通!不愧是公认的讲的最好的【Tensorflow全套教程】同济大佬12小时带你从入门到进阶!Tensorflow2.0/计算机视觉/神经网络与深度学习 UP主: 咕泡AI算法工程师的个人空间-咕泡AI算法工程师个人主页-…

使用京东AsyncTool实现异步编排

asyncTool: 解决任意的多线程并行、串行、阻塞、依赖、回调的并行框架,可以任意组合各线程的执行顺序,带全链路执行结果回调。多线程编排一站式解决方案。来自于京东主App后台。 /*** 批量更新用户(使用京东AsyncTool)** param i…

MobaXterm通过ssh远程连接Ubuntu的方法

MobaXterm通过ssh远程连接Ubuntu的方法 主要参见这篇博客 Ubuntu下sshd服务搭建(详解,连接MobaXterm)_ubuntu sshd-CSDN博客 步骤一、 Ubuntu下安装sshd服务 打开终端,输入指令 $ sudo apt install openssh-server

【Golang 面试题】每日 3 题(五十九)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…

搭建Kubernetes (K8s) 集群----Centos系统

前期准备 准备3台Linux虚拟机(CentOS系统),参考 https://carry.blog.csdn.net/article/details/144578009https://carry.blog.csdn.net/article/details/144578009搭建Docker环境,参考 https://carry.blog.csdn.net/article/de…

探索低空,旅游景区无人机应用技术详解

在低空领域,无人机技术在旅游景区中的应用已经日益广泛,为旅游业带来了前所未有的变革。以下是对旅游景区无人机应用技术的详细解析: 一、无人机景区巡检系统 1. 高清拍摄与实时监控:无人机搭载高清摄像头,能够对景区…

如何在 ubuntu 上使用 Clash 与 docker 开启代理拉起

如何在 ubuntu 上使用 Clash https://github.com/doreamon-design/clash/releases上面是clash 的地址 clash_2.0.24_linux_386.tar.gz 下载 386 的 如果你的电脑是inter tar -xzvf clash_2.0.24_linux_386.tar.gz 启动 ./clash 然后会在电脑上生成一个config的文件 /home/xxx/…