李优秀 发表于 2024-10-1 03:29:43

安卓端侧大模子 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
起首我们来看一下最终的结果~
https://i-blog.csdnimg.cn/direct/75dd5404dbaa48738c93be744fec2510.png
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/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' 2 转换模子

2.1 安装 mlc-llm

可参考 https://llm.mlc.ai/docs/install/mlc_llm.html (如果下载很慢可以取消重新运行一下,或者当地下载了之后拷已往)
conda create --name mlc-prebuiltpython=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)" https://i-blog.csdnimg.cn/direct/902d3696f2374ecba9c3b8cbee4af545.png
克隆项目 
git clone https://github.com/mlc-ai/mlc-llm.git
cd mlc-llm
git submodule update --init --recursive 2.2 转换参数

使用 mlc_llm 的 convert_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_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 2.4 上传到 HuggingFace

上传这一步需要能访问 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 https://i-blog.csdnimg.cn/direct/923565b044f3458f8fa68bfbb06da8f2.png
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?
:Any
What is the name of your organizational unit?
:Any
What is the name of your organization?
:Any
What is the name of your City or Locality?
:Any
What is the name of your State or Province?
:Any
What is the two-letter country code for this unit?
:CN
Is CN=Any, OU=Any, O=Any, L=Any, ST=Any, C=CN correct?
: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
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 下载模子(参考文档 https://llm.mlc.ai/docs/deploy/android.html#android-sdk 中的 bundle 方法,需要 ADB 刷入模子数据)
./gradlew assembleRelease https://i-blog.csdnimg.cn/direct/033e6c8b8b4e482abe6944f0be293eb5.png
3.6 运行体验



[*] 运行 App 需要能访问 HuggingFce 下载模子
[*] 需要大概 4G 运行内存
[*] 如果运行闪退,很大概是下载不完整可以删除重新下载
https://i-blog.csdnimg.cn/direct/75dd5404dbaa48738c93be744fec2510.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 安卓端侧大模子 MLC-LLM 摆设全攻略:以 InternLM2.5-1.8B 为例