ToB企服应用市场:ToB评测及商务社交产业平台

标题: 安卓端侧大模型MLC-LLM部署全攻略:以InternLM2.5-1.8B为例 [打印本页]

作者: 北冰洋以北    时间: 昨天 19:45
标题: 安卓端侧大模型MLC-LLM部署全攻略:以InternLM2.5-1.8B为例
本文来自社区投稿,作者: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 安装。
  1. export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
  2. export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
  3. 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
  1. mkdir -p /root/android && cd /root/android
  2. wget https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2024.1.1.12/android-studio-2024.1.1.12-linux.tar.gz
  3. tar -xvzf android-studio-2024.1.1.12-linux.tar.gz
  4. cd android-studio
  5. wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip?hl=zh-cn
  6. unzip commandlinetools-linux-11076708_latest.zip\?hl\=zh-cn
  7. export JAVA_HOME=/root/Downloads/android-studio/jbr
  8. 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 设置环境变量

  1. . "$HOME/.cargo/env"
  2. export ANDROID_NDK=/root/android/android-studio/sdk/ndk/27.0.12077973
  3. export TVM_NDK_CC=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android24-clang
  4. export JAVA_HOME=/root/android//android-studio/jbr
  5. export ANDROID_HOME=/root/android/android-studio/sdk
  6. export PATH=/usr/local/cuda-12/bin:$PATH
  7. 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 (假如下载很慢可以取消重新运行一下,大概本地下载了之后拷已往)
  1. conda create --name mlc-prebuilt  python=3.11
  2. conda activate mlc-prebuilt
  3. conda install -c conda-forge git-lfs
  4. pip install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 transformers sentencepiece protobuf
  5. 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
  6. 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
  7. pip install mlc_ai_nightly_cu122-0.15.dev404-cp311-cp311-manylinux_2_28_x86_64.whl
  8. pip install mlc_llm_nightly_cu122-0.1.dev1445-cp311-cp311-manylinux_2_28_x86_64.whl
复制代码
测试如下输出说明安装正确
  1. python -c "import mlc_llm; print(mlc_llm)"
复制代码

克隆项目
  1. git clone https://github.com/mlc-ai/mlc-llm.git
  2. cd mlc-llm
  3. git submodule update --init --recursive
复制代码
2.2 转换参数

使用 mlc_llm 的 convert_weight 对模型参数举行转换和量化,转换后的参数可以跨平台使用
  1. cd android/MLCChat  
  2. export TVM_SOURCE_DIR=/root/android/mlc-llm/3rdparty/tvm
  3. export MLC_LLM_SOURCE_DIR=/root/android/mlc-llm
  4. mlc_llm convert_weight /root/models/internlm2_5-1_8b-chat/ \
  5.     --quantization q4f16_1 \
  6.     -o dist/internlm2_5-1_8b-chat-q4f16_1-MLC
复制代码
2.3 生成设置

使用 mlc_llm 的 gen_config 生成 mlc-chat-config.json 并处置惩罚 tokenizer
出现提示时输入 y
  1. mlc_llm gen_config /root/models/internlm2_5-1_8b-chat/  \
  2.     --quantization q4f16_1 --conv-template chatml  \
  3.     -o dist/internlm2_5-1_8b-chat-q4f16_1-MLC
  4. 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 (可选) 测试转换的模型

在打包之前可以测试模型效果,必要编译成二进制文件,已成功在个人电脑上运行测试代码。
  1. mlc_llm compile ./dist/internlm2_5-1_8b-chat-q4f16_1-MLC/mlc-chat-config.json \
  2.     --device cuda -o dist/libs/internlm2_5-1_8b-chat-q4f16_1-MLC-cuda.so
复制代码
测试编译的模型是否符合预期,手机端运行的效果和测试效果靠近
  1. from mlc_llm import MLCEngine
  2. # Create engine
  3. 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")
  4. # Run chat completion in OpenAI API.
  5. print(engine)
  6. for response in engine.chat.completions.create(
  7.     messages=[{"role": "user", "content": "你是谁?"}],
  8.     stream=True
  9. ):
  10.     for choice in response.choices:
  11.         print(choice.delta.content, end="", flush=True)
  12. print("\n")
  13. engine.terminate()
复制代码
3 打包运行

3.1 修改设置文件

修改 mlc-package-config.json,参考如下
  1. {
  2.     "device": "android",
  3.     "model_list": [
  4.         {
  5.             "model": "HF://timws/internlm2_5-1_8b-chat-q4f16_1-MLC",
  6.             "estimated_vram_bytes": 3980990464,
  7.             "model_id": "internlm2_5-1_8b-chat-q4f16_1-MLC"
  8.         },
  9.         {
  10.             "model": "HF://mlc-ai/gemma-2b-it-q4f16_1-MLC",
  11.             "model_id": "gemma-2b-q4f16_1-MLC",
  12.             "estimated_vram_bytes": 3980990464
  13.         }
  14.     ]
  15. }
复制代码
3.2 运行打包命令

这一步必要能访问 HuggingFace,可能必要部署署理
  1. mlc_llm package
复制代码

3.3 创建署名

  1. cd /root/android/mlc-llm/android/MLCChat
  2. /root/android/android-studio/jbr/bin/keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000
  3. Enter keystore password:  
  4. Re-enter new password:
  5. What is your first and last name?
  6.   [Unknown]:  Any
  7. What is the name of your organizational unit?
  8.   [Unknown]:  Any
  9. What is the name of your organization?
  10.   [Unknown]:  Any
  11. What is the name of your City or Locality?
  12.   [Unknown]:  Any
  13. What is the name of your State or Province?
  14.   [Unknown]:  Any
  15. What is the two-letter country code for this unit?
  16.   [Unknown]:  CN
  17. Is CN=Any, OU=Any, O=Any, L=Any, ST=Any, C=CN correct?
  18.   [no]:  yes
  19. Generating 2,048 bit RSA key pair and self-signed certificate (SHA256withRSA) with a validity of 10,000 days
  20.         for: CN=Any, OU=Any, O=Any, L=Any, ST=Any, C=CN
  21. [Storing my-release-key.jks]
复制代码
3.4 修改 gradle 设置

假如是本地可以 WIFI 或 USB 调试,不用署名;在服务器构建必要署名,修改 app/build.gradle 为如下内容,重要是增加了署名部分,留意确认署名文件的位置。
  1. plugins {
  2.     id 'com.android.application'
  3.     id 'org.jetbrains.kotlin.android'
  4. }
  5. android {
  6.     namespace 'ai.mlc.mlcchat'
  7.     compileSdk 34
  8.     defaultConfig {
  9.         applicationId "ai.mlc.mlcchat"
  10.         minSdk 26
  11.         targetSdk 33
  12.         versionCode 1
  13.         versionName "1.0"
  14.         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  15.         vectorDrawables {
  16.             useSupportLibrary true
  17.         }
  18.     }
  19.     compileOptions {
  20.         sourceCompatibility JavaVersion.VERSION_1_8
  21.         targetCompatibility JavaVersion.VERSION_1_8
  22.     }
  23.     kotlinOptions {
  24.         jvmTarget = '1.8'
  25.     }
  26.     buildFeatures {
  27.         compose true
  28.     }
  29.     composeOptions {
  30.         kotlinCompilerExtensionVersion '1.4.3'
  31.     }
  32.     packagingOptions {
  33.         resources {
  34.             excludes += '/META-INF/{AL2.0,LGPL2.1}'
  35.         }
  36.     }
  37.     signingConfigs {
  38.         release {
  39.             storeFile file("/root/android/mlc-llm/android/MLCChat/my-release-key.jks")
  40.             storePassword "123456"
  41.             keyAlias "mykey"
  42.             keyPassword "123456"
  43.         }
  44.     }
  45.     buildTypes {
  46.         release {
  47.             minifyEnabled false
  48.             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  49.             signingConfig signingConfigs.release
  50.         }
  51.     }
  52. }
  53. dependencies {
  54.     implementation project(":mlc4j")
  55.     implementation 'androidx.core:core-ktx:1.10.1'
  56.     implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
  57.     implementation 'androidx.activity:activity-compose:1.7.1'
  58.     implementation platform('androidx.compose:compose-bom:2022.10.00')
  59.     implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.6.1'
  60.     implementation 'androidx.compose.ui:ui'
  61.     implementation 'androidx.compose.ui:ui-graphics'
  62.     implementation 'androidx.compose.ui:ui-tooling-preview'
  63.     implementation 'androidx.compose.material3:material3:1.1.0'
  64.     implementation 'androidx.compose.material:material-icons-extended'
  65.     implementation 'androidx.appcompat:appcompat:1.6.1'
  66.     implementation 'androidx.navigation:navigation-compose:2.5.3'
  67.     implementation 'com.google.code.gson:gson:2.10.1'
  68.     implementation fileTree(dir: 'src/main/libs', include: ['
  69. *.aar', '*
  70. .jar'], exclude: [])
  71.     testImplementation 'junit:junit:4.13.2'
  72.     androidTestImplementation 'androidx.test.ext:junit:1.1.5'
  73.     androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
  74.     androidTestImplementation platform('androidx.compose:compose-bom:2022.10.00')
  75.     androidTestImplementation 'androidx.compose.ui:ui-test-junit4'
  76.     debugImplementation 'androidx.compose.ui:ui-tooling'
  77.     debugImplementation 'androidx.compose.ui:ui-test-manifest'
  78. }
复制代码
3.5 命令行编译

运行编译命令,完成后在 app/build/outputs/apk/release 生成 app-release.apk 安装包,下载到手机上运行,运行 App 必要能访问 HuggingFace 下载模型。
  1. ./gradlew assembleRelease
复制代码

3.6 运行体验




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4