安卓手机摆设大模型实战

打印 上一主题 下一主题

主题 548|帖子 548|积分 1654



     本文作者系360奇舞团前端开辟工程师
    媒介

  自ChatGPT发布以来,大语言模型(Large language model, LLM)就成了AI以致整个盘算机科学的话题中心。学术界,工业界围绕大语言模型自己及其应用睁开了广泛的讨论,大量的新的实践层出不穷。
  由于LLM对盘算资源的需求极大,有能力摆设大语言模型的公司和实验室一样平常通过搭建集群,然后开放API或者网页demo的方式让用户可以使用模型。在人们纷纷发挥想象力实验各种prompt与模型对话的时间,我们也注意到在一些应用场景中,出于定制化、个性化或者隐私性的目的,人们想要自己在各种终端设备中本地运行大语言模型,不需要/不渴望连接互联网或者依靠于服务器,例如
  1、智能汽车的终端可以对驾驶员的操作习惯定制化
2、智能家居的终端可以对户主的生活习惯定制化
3、手机游戏,或者主机游戏中NPC的对话可以根据玩家的行为而改变
4、PC端的应用渴望本地摆设谈天呆板人,但是用户的显卡可能是N卡,A卡,或者集成显卡,安装了CUDA/Vulkan/OpenCL驱动

  渴望能够让每个人都可以开辟,优化和摆设AI大模型,让它工作在每个人都能方便得到的设备上。
  如何做

  我们采用了呆板学习编译技术来办理这一类标题。
  MLC LLM 是一个用于大型语言模型的呆板学习编译器和高性能摆设引擎。该项目的使命是让每个人都能够在每个人的平台上原生地开辟、优化和摆设 AI 模型。
  本页是一个快速教程,介绍如何实验 MLC LLM,以及使用 MLC LLM 摆设您自己的模型的步调。
  MLC介绍

  这里稍微讲解了一些MLC的基本概念,以帮助我们使用和了解 MLC LLM。
MLC-LLM 由三个不同的子模块组成:模型定义、模型编译和模型运行。
  MLC LLM 的三个独立子模块
  1、Python 中的模型定义。MLC 提供各种预定义架构,例如 Llama(例如 Llama2、Vicuna、OpenLlama、Wizard)、GPT-NeoX(例如 RedPajama、Dolly)、RNN(例如 RWKV)和 GPT-J(例如MOSS)。开辟人员可以仅使用纯 Python 定义模型,而无需接触编码。
  2、Python 中的模型编译。模型由TVM Unity编译器编译,其中编译配置为纯 Python。MLC LLM 将基于 Python 的模型量化导出到模型库并量化模型权重。可以用纯 Python 开辟量化和优化算法,以针对特定用例压缩和加快 LLM。
  3、不同平台的模型运行。每个平台上都提供了 MLCChat 的变体:用于命令行的C++ 、用于 Web 的Javascript 、用于 iOS 的Swift 和用于 Android 的Java,可通过 JSON 进行配置。开辟人员只需熟悉平台即可将 MLC 编译的 LLM 集成到他们的项目中。
  MLC LLM 还有许多概念,这里不在过多赘述,下面我们直接开始实践。
  基本环境配置

  这是我这里的硬件配置
  电脑:mac m2芯片 测试手机:Pixel 4,Android 11,运行内存6g
        电脑根据官网所说,在windows、linux、mac都可以跑通,主要强调一动手机,运行内存需至少需大于6g,这个配置上可以跑gemma-2b,Qwen2-1.5B等较小的模型,但如果是Llama2-13B较大的,很可能会超出内存
    需要的环境依靠不少,这里我们一步一步逐步来
  Anaconda 配置

  在MLC中需要使用的python最低版本在3.10以上,为避免环境冲突,以是最好使用虚拟环境来进行环境配置,这里保举使用Anconda来配置虚拟环境,相干的安装方法,可参考Anaconda安装
  创建虚拟环境,后续的一些操作都尽量在虚拟环境中去操作
  1. # 创建一个 your-environment的虚拟环境,python版本为3.10
  2. conda create -n your-environment python==3.10 
  3. # 进入虚拟环境
  4. activate your-environment
复制代码
Rust

  来自官网的介绍:Rust (install) is needed to cross-compile HuggingFace tokenizers to Android. Make sure rustc, cargo, and rustup are available in $PATH. 如此安装:
  1. curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
复制代码
Android Studio

  要使用Android Studio就需要安装 SDK、NDK、CMake和JAVA。
  其中Android Studio可以在官网中去下载。
在 Android Studio 单击“File → Settings → Languages & Frameworks → Android SDK → SDK Tools”,选择安装NDK、CMake和Android SDK Platform-Tools。安装完成后,需要在环境变量中去对NDK等进行配置才可使用。
  配置环境变量

  1. export ANDROID_NDK="$HOME/Library/Android/sdk/ndk/27.0.11902837"
  2. export ANDROID_HOME="$HOME/Library/Android/Sdk"
  3. export PATH="$PATH:$HOME/Library/Android/Sdk/cmake/3.22.1/bin"
  4. export PATH="$PATH:$HOME/Library/Android/Sdk/platform-tools"
  5. export TVM_NDK_CC="$ANDROID_NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android24-clang"
  6. export TVM_SOURCE_DIR="$HOME/pyProjects/intelli-vista/3rdparty/tvm"
  7. export TVM_HOME="$TVM_HOME/include/tvm/runtime"
  8. export MLC_LLM_SOURCE_DIR="$HOME/pyProjects/intelli-vista"
  9. export JAVA_HOME="/Applications/Android\ Studio.app/Contents/jbr/Contents/Home"
复制代码
Java

  Android Studio需要安装openjdk,官方要求的版本是>17。安装教程许多,这里以linux常用的安装方式为列:
  1. # 更新update
  2. sudo apt update
  3. # 安装openjdk17
  4. sudo apt install openjdk-17-jdk 
  5. # 查看jdk17的安装路径
  6. sudo update-alternatives --list java
  7. # 用上面命令获取的路径,编入到bashrc文件的最后一行中
  8. vi ~/.bashrc
  9. # 将下面的命令,编入到bashrc文件的最后一行中
  10. export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/bin/java
  11. # 更新环境变量
  12. source ~/.bashrc
复制代码
TVM Unity runtime

  这个就在我们接下来要git clone的包里,在 3rdparty/tvm里面,以是不需要额外下载,只需要在上面环境配置中路径写对即可。
  TVM Unity compiler

  我们需要用这个来对模型进行编译,也可以直接使用官网提供的prebuilt model,如许就不用安装,本章直接使用官网已经提供的作为展示。
  1. conda activate your-environment
  2. python -m pip install --pre -U -f https://mlc.ai/wheels mlc-ai-nightly
复制代码
TVM的安装验证:以下命令可以帮助确认 TVM 是否已准确安装为 python 包并提供 TVM python 包的位置
  1. >>> python -c "import tvm; print(tvm.__file__)"
  2. /some-path/lib/python3.10/site-packages/tvm/__init__.py
复制代码
MLC-LLM安装

  1. # 克隆源代码及源代码附属的子项目
  2. git clone https://github.com/mlc-ai/mlc-llm.git --recursive
  3. # 进入mlc-llm文件夹
  4. cd mlc-llm
  5. # 将mlc-llm安装进环境
  6. pip install .
复制代码
验证安装
  1. >>> mlc_llm --help
  2. usage: MLC LLM Command Line Interface. [-h]
  3.                                        {compile,convert_weight,gen_config,chat,serve,bench}
  4. positional arguments:
  5.   {compile,convert_weight,gen_config,chat,serve,bench}
  6.                         Subcommand to to run. (choices: compile,
  7.                         convert_weight, gen_config, chat, serve, bench)
  8. options:
  9.   -h, --help            show this help message and exit
复制代码
构建运行时和模型库

  Android 应用程序构建的模型在 中指定MLCChat/mlc-package-config.json:在 中model_list,model指向 Hugging Face 存储库,该存储库 model指向包含预转换模型权重的 Hugging Face 存储库。Android 应用程序将从 Hugging Face URL 下载模型权重。model_id是唯一的模型标识符。estimated_vram_bytes是对模型在运行时所占用的 vRAM 的估计。"bundle_weight": true意味着模型的模型权重将在构建时捆绑到应用程序中。overrides指定一些模型配置参数覆盖。
  此处我们测试两个模型gemma-2b 和 Qwen2-1.5B,以是配置mlc-package-config.json为:
  1. {
  2.     "device": "android",
  3.     "model_list": [
  4.         {
  5.             "model": "HF://mlc-ai/gemma-2b-it-q4f16_1-MLC",
  6.             "model_id": "gemma-2b-q4f16_1-MLC",
  7.             "estimated_vram_bytes": 3000000000,
  8.             "bundle_weight": true
  9.         },
  10.         {
  11.             "model": "HF://mlc-ai/Qwen2-1.5B-Instruct-q4f16_1-MLC",
  12.             "estimated_vram_bytes": 3980990464,
  13.             "model_id": "Qwen2-1.5B-Instruct-q4f16_1-MLC",
  14.             "bundle_weight": true
  15.         }
  16.     ]
  17. }
复制代码
我们有一个单行命令来构建和预备全部模型库:
  1. cd /path/to/MLCChat  # e.g., "android/MLCChat"
  2. export MLC_LLM_SOURCE_DIR=/path/to/mlc-llm  # e.g., "../.."
  3. mlc_llm package
复制代码
该命令主要执行以下两个步调:编译模型。我们将每个模型编译model_list成MLCChat/mlc-package-config.json二进制模型库。
  构建运行时和标记器。除了模型自己之外,还需要轻量级运行时和标记器来实际运行 LLM。
  该命令创建一个./dist/包含运行时和模型构建输出的目次。请确保以下全部文件都存在于中./dist/。
  1. dist
  2. └── lib
  3.     └── mlc4j
  4.         ├── build.gradle
  5.         ├── output
  6.         │   ├── arm64-v8a
  7.         │   │   └── libtvm4j_runtime_packed.so
  8.         │   └── tvm4j_core.jar
  9.         └── src
  10.             ├── cpp
  11.             │   └── tvm_runtime.h
  12.             └── main
  13.                 ├── AndroidManifest.xml
  14.                 ├── assets
  15.                 │   └── mlc-app-config.json
  16.                 └── java
  17.                     └── ...
复制代码
移动 GPU 中的模型执行逻辑已整合到 中libtvm4j_runtime_packed.so,而tvm4j_core.jar是与之绑定的轻量级 (~60 kb) Java 。dist/lib/mlc4j是一个 gradle 子项目,您应将其包含在应用中,以便 Android 项目可以引用 mlc4j (MLC LLM java 库)。此库打包了执行模型所需的依靠模型库和必要的运行时。
  我们定义的模型下载后会在这里
  1. dist
  2. ├── bundle
  3. │   ├── gemma-2b-q4f16_1   # The model weights that will be bundled into the app.
  4. │   └── mlc-app-config.json
  5. └── ...
复制代码
       由于环境和网络限定,可以使用国内大佬们提供好的下载,也可以采用一些特别手段,这里不在赘述。
    构建Android应用程序

  生成 APK。进入 Android Studio,点击“Build → Generate Signed Bundle/APK”生成 APK 进行发布。如果是第一次生成 APK,需要根据Android 官方指南生成密钥。此 APK 将放置在 下android/MLCChat/app/release/app-release.apk。
  在手机设置的开辟者模式中启用“USB 调试”。运行以下命令,如果 ADB 安装准确,你的手机将表现为设备:
  1. adb devices
复制代码
将 APK 和权重安装到您的手机。运行以下命令安装应用程序,并将本地权重推送到设备上的应用程序数据目次。完成后,您可以在设备上启动 MLCChat 应用程序。bundle_weight设置为 true 的模型的权重已存在于设备上。
  1. cd /path/to/MLCChat  # e.g., "android/MLCChat"
  2. python bundle_weight.py --apk-path app/release/app-release.apk
复制代码
现在已经可以在手机上运行大模型了

        由于手机硬件标题,现在只能跑像gemma-2b 或者 Qwen2-1.5B较小的模型,后续会在其他手机上实验跑一下更大的模型例如Llama-13B。
    参考文档:

  https://llm.mlc.ai/docs/deploy/android.html
  
- END -

  
如果您关注前端+AI 相干领域可以扫码进群交流

  
 

  
扫码进群2或添加小编微信进群1

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

泉缘泉

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表