LLM端侧部署系列 | 如何将阿里千问大模型Qwen部署到手机上?环境安装及其配置(上篇)

  • 引言

  • 下载待部署模型

  • 安装minconda

  • 安装tvm和mlc-llm

  • 安装 JDK

  • 安装 Android SDK

  • 下载mlc-llm仓库

  • 设置环境变量

  • 安装Rust

1. 引言

梨花风起正清明,游子寻春半出城。

小伙伴们好,我是公众号《小窗幽记机器学习》的小编:卖青团的小女孩,紧接前文:

LLM端侧部署系列 | 如何将阿里千问大模型Qwen部署到手机上?实战演示(下篇)

今天这篇小作文主要介绍LLM端侧部署系列 | 如何将阿里千问大模型Qwen部署到手机上?实战演示(下篇)的前置工作,即Qwen部署到手机上的环境配置细节。

如需与小编进一步交流,可以在公众号上添加小编微信好友。

2.下载待部署模型

将 https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat 下载到本地:

/share/model_zoo/LLM/Qwen/Qwen1.5-1.8B-Chat

3. 安装minconda

在下载好minconda的安装脚本之后,使用以下命令进行无交互安装:

bash Miniconda3-latest-Linux-x86_64.sh -b -p /home/your_user_name/opt/miniconda

将 bin 目录添加到PATH,

/home/your_user_name/opt/miniconda/bin

为实现长期可以使用conda命令具体实现,在/etc/profile文件末尾添加:

export PATH="/home/your_user_name/opt/miniconda/bin:$PATH"

在终端运行:source /etc/profile

创建虚拟环境:

conda env remove -n mlc-chat-env-py311

conda create -n mlc-chat-env-py311 -c conda-forge "llvmdev>=15" "cmake>=3.24" git python=3.11

# enter the build environment
conda deactivate
conda activate mlc-chat-env-py311

4. 安装tvm和mlc-llm

前往 https://mlc.ai/wheels 下载安装预构建的安装文件, 本文实验采用的版本分别是:

mlc_ai_nightly_cu122-0.15.dev228
mlc_llm_nightly_cu122-0.1.dev1072

具体下载链接:

https://github.com/mlc-ai/package/releases/download/v0.9.dev0/mlc_ai_nightly_cu122-0.15.dev228-cp311-cp311-manylinux_2_28_x86_64.whl

https://github.com/mlc-ai/package/releases/download/v0.9.dev0/mlc_llm_nightly_cu122-0.1.dev1072-cp311-cp311-manylinux_2_28_x86_64.whl

安装命令:

pip3 install mlc_ai_nightly_cu122-0.15.dev228-cp311-cp311-manylinux_2_28_x86_64.whl -i https://mirrors.cloud.tencent.com/pypi/simple

pip3 install mlc_llm_nightly_cu122-0.1.dev1072-cp311-cp311-manylinux_2_28_x86_64.whl -i https://mirrors.cloud.tencent.com/pypi/simple

5. 安装 JDK

在目录/share_tools中执行以下命令:

# 下载 JDK 
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz
tar -zxvf jdk-17_linux-x64_bin.tar.gz
export JAVA_HOME=/share_tools/jdk-17.0.10/

6. 安装 Android SDK

先安装 Android SDK,直接在借助 Android SDK 安装 NDK。下载 Android SDK 命令行版,在目录/share_tools执行以下命令:

wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip
unzip -d android-sdk commandlinetools-linux-11076708_latest.zip

此时,Android SDK即可为/share_tools/android-sdk/cmdline-tools

查看可下载的sdk版本:

cd android-sdk/cmdline-tools/bin
./sdkmanager --sdk_root=/share_tools/android-sdk/ --list

按需下载sdk版本:

./sdkmanager --sdk_root=/share_tools/android-sdk/ "platforms;android-28"
./sdkmanager --sdk_root=/share_tools/android-sdk/ "platform-tools"
./sdkmanager --sdk_root=/share_tools/android-sdk/ "build-tools;28.0.3"
./sdkmanager --sdk_root=/share_tools/android-sdk/ "ndk;25.2.9519653"

查看安装之后的结果:ls -lrth /share_tools/android-sdk/ndk

drwxr-xr-x 13 root root 4.0K Mar 29 12:35 21.3.6528147
drwxr-xr-x 11 root root 4.0K Apr  1 01:58 25.2.9519653

后续使用25.2.9519653这个版本,所以将其添加到系统环境变量中:export ANDROID_NDK=/share_tools/android-sdk/ndk/25.2.9519653

此外,还需要设置NDK的clang compilerexport TVM_NDK_CC=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android24-clang

以上,已经配置了:

export ANDROID_NDK=...  # Android NDK toolchain
export TVM_NDK_CC=...   # Android NDK clang
export JAVA_HOME=...    # Java

那么还需要配置TVM_HOME。由于TVM Unity runtime 置于MLC LLM项目中的 3rdparty/tvm。因此,可以不用额外安装,设置以下环境变量:

export TVM_HOME=/home/your_user_name/Repository/LLM/mlc-llm/3rdparty/tvm/

设置TVM_HOME之后,可以通过$TVM_HOME/include/tvm/runtime访问headers。

7. 下载mlc-llm仓库

执行以下命令下载mlc-llm仓库:

git clone --recursive https://github.com/mlc-ai/mlc-llm.git

上述命令会同时clone该目标仓库内的子模块,如果出现网络原因导致git clone 目标仓库报错,则可以在系统层面将https://github.com/统一改成GitHub的镜像网站。以下假设https://github-proxy.com/是其镜像网站,具体实现如下:

git config --global url."https://github-proxy.com/".insteadOf "https://github.com/"

然后在目录/home/Repository/LLM/下载mlc-llm仓库:

git clone --recursive https://github.com/mlc-ai/mlc-llm/

cd ./mlc-llm/

8. 设置环境变量

在配置文件/etc/profile中新增以下:

export JAVA_HOME=/share_tools/jdk-17.0.10/

# 设置 Android SDK 路径
export ANDROID_HOME=/share_tools/android-sdk

export ANDROID_NDK=/share_tools/android-sdk/ndk/25.2.9519653/

export TVM_NDK_CC=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android24-clang

export TVM_HOME=/home/Repository/LLM/mlc-llm/3rdparty/tvm/

export PATH="$JAVA_HOME/bin:$PATH"

9. 安装Rust

在Android上交叉编译HuggingFace tokenizers需要安装Rust,并确保$PATH中有rustc、cargorustup`。

下载&安装:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

打印信息如下:

info: default toolchain set to 'stable-x86_64-unknown-linux-gnu'

  stable-x86_64-unknown-linux-gnu installed - rustc 1.75.0 (82e1608df 2023-12-21)


Rust is installed now. Great!

To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory ($HOME/.cargo/bin).

To configure your current shell, run:
source "$HOME/.cargo/env"

配置:

source ~/.bashrc

至此,完成rustccargo、和rustup命令安装:

/home/your_user_name/.cargo/bin/rustc
/home/your_user_name/.cargo/bin/cargo
/home/your_user_name/.cargo/bin/rustup

支持,完成 LLM端侧部署系列 | 如何将阿里千问大模型Qwen部署到手机上?实战演示(下篇) 所需环境配置,进入 mlc-llm 目录,跟着实战篇中的步骤一步步操作即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/735862.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

38. 外观数列

题目 「外观数列」是一个数位字符串序列,由递归公式定义: countAndSay(1) "1" countAndSay(n) 是 countAndSay(n-1) 的行程长度编码。 行程长度编码(RLE)是一种字符串压缩方法,其工作原理是通过将连续相…

刷代码随想录有感(114):动态规划——最少数量的零钱换整

题干&#xff1a; 代码&#xff1a; class Solution { public:int coinChange(vector<int>& coins, int amount) {vector<int>dp(amount 1, INT_MAX);dp[0] 0;for(int i 0; i < coins.size(); i){for(int j coins[i]; j < amount; j){if(dp[j - coi…

【Linux】系统文件IO·文件描述符fd

前言 C语言文件接口 C 语言读写文件 1.C语言写入文件 2.C语言读取文件 stdin/stdout/stderr 系统文件IO 文件描述符fd&#xff1a; 文件描述符分配规则&#xff1a; 文件描述符fd&#xff1a; 前言 我们早在C语言中学习关于如何用代码来管理文件&#xff0c;比如文件的…

对于C++ 程序员来说,35岁魔咒是否存在?

大家常说程序员职业生涯会在35岁左右遇到所谓的“35岁魔咒”。这意味着在这个年龄段&#xff0c;程序员可能会面临就业不稳定或职业发展的挑战。对于C程序员来说&#xff0c;这个问题更加引人关注。 随着时间的推移&#xff0c;技术行业不断演进&#xff0c;新的编程语言层出不…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 01:假想的编译器

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

34、shell数组+正则表达式命令

0、课前补充 jiafa () { result$(echo " $1 $2 " | bc ) print "%.2f\n" "$result" } ##保留小数点两位 薄弱加强点 a$(df -h | awk NR>1 {print $5} | tr -d %) echo "$a"一、数组 1.1、定义 数组的定义&am…

Native开发工具之应用开发编辑器打包发布(一)

Nuclide 是基于 Atom 之上构建的单独的一个包&#xff0c;其提供可编程性且社区非常活跃。它为 React Native、Hack 和 Flow 项目提供一流的开发环境。 2. Atom 官网&#xff1a;https://atom.io/ Github 项目地址&#xff1a;atom(https://github.com/atom) 文档&#xff1…

SpringBoot-注解@PropertiySource读取外部属性文件

ConfigurationProperties和Value两个注解能从配置文件中获取数据&#xff0c;但是前面讲了他们是从全局配置文件中获取&#xff0c;且只能从全局配置文件中获取&#xff0c;那么如果是一些数值类的数据放在全局配置文件里&#xff0c;是不怎么合适的&#xff0c;我们往往会把他…

gitlab 获取指定分支下指定路径文件夹的解决方案

第一步&#xff1a; 获取 accessToken 及你的 项目 id &#xff1a; 获取 accessToken ,点击用户头像进入setting 按图示操作&#xff0c;第 3 步 填写你发起请求的域名。 获取项目 id , 简单粗暴方案 进入 你项目仓库页面后 直接 源码搜索 project_id&#xff0c; value 就…

QT自定义标题栏窗口其一:实现拖动及可拉伸效果

1、效果 2、核心代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent<

Android intent 打开链接跳转到外部浏览

前言: 各位同学大家好, 最近接到一个比较诡异的需求 ,不是通常的webview 加URL显示网页 是需要跳转到外部浏览器 ,我这边处理好了就分享给大家 效果图 : 点几就跳转到外部浏览器 如图 具体代码实现: 点击打开链接并跳转外部浏览器方法 public void openBrowser(Con…

算法刷题总结

1. 排序算法 1.1 快速排序算法 public abstract class Sort<T extends Comparable<T>> {public abstract void sort(T[] array);protected boolean less(T first, T two) {return first.compareTo(two) < 0;}protected void swap(T[] array, int i, int j) {T…

《人生苦短,我用python·四》pybind11多场景使用

引言 Pybind11作为一个强大的工具&#xff0c;不仅可以轻松地将简单的C函数和类暴露给Python&#xff0c;还可以处理更复杂的场景&#xff0c;比如支持C标准库容器、处理C异常、以及自定义数据结构的转换。本文将深入介绍Pybind11的一些高级用法&#xff0c;帮助你在实际项目中…

修复 pprof ---node_exproter访问漏洞(go-pprof-leak)

前言&#xff1a; ** 在Go语言中&#xff0c;pprof和debug包是用来检测和避免goroutine泄漏&#xff0c;避免导致goroutine泄漏&#xff0c;进而消耗大量系统资源。不过对于安全而言确又存在一定风险&#xff0c;** 风险&#xff1a; 通过node_exporter web发现 190.168.46.1…

Unity Meta Quest 开发:关闭 MR 应用的安全边界

社区链接&#xff1a; SpatialXR社区&#xff1a;完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 &#x1f4d5;教程说明 这期教程我将介绍如何在应用中关闭 Quest 系统的安全边界。 视频讲解&#xff1a; https://www.bilibili.com/video/BV1Gm42157Zi 在 Unity…

DVWA 靶场 Weak Session IDs 通关解析

前言 DVWA代表Damn Vulnerable Web Application&#xff0c;是一个用于学习和练习Web应用程序漏洞的开源漏洞应用程序。它被设计成一个易于安装和配置的漏洞应用程序&#xff0c;旨在帮助安全专业人员和爱好者了解和熟悉不同类型的Web应用程序漏洞。 DVWA提供了一系列的漏洞场…

VirtualBox虚拟机声音设置

最近发现VirtualBox创建的Windows 10和11虚拟机没有声音&#xff0c;但是另外一个Windows 7的虚拟机确有声音&#xff0c;检查对比了一下虚拟机的声音设置&#xff0c;发现是Host Audio Driver的设置不一样&#xff0c;Windows10和11的是Default&#xff0c;而Windows7的是Puls…

【C++】初始化列表、匿名对象、static成员、友元、内部类

文章目录 一、初始化列表构造函数体赋值初始化列表explicit关键字 二、匿名对象三、static成员四、友元友元函数友元类 五、内部类六、练习题 一、初始化列表 构造函数体赋值 实际上&#xff0c;构造函数的函数体内&#xff0c;并不是对 对象 初始化的地方&#xff0c;而是对…

html做一个雷达图的软件

要实现一个在线输入数据并生成雷达图的功能&#xff0c;可以使用HTML表单和JavaScript来处理用户输入的数据。以下是一个示例代码&#xff0c;演示了如何实现这个功能&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"…

C++初学者指南第一步---13.聚合类型

C初学者指南第一步—13.聚合类型 文章目录 C初学者指南第一步---13.聚合类型1. 类型分类&#xff08;简化&#xff09;2. 如何定义和使用3. 为什么选择自定义类型/数据聚合&#xff1f;4. 聚合类型初始化5.混合6. 复制7. 值和引用的语义8.聚合的向量(std::vector)9.最令人烦恼的…