MLC LLM:将大模型运行在手机端的部署工具

news2024/9/22 15:49:36

前言

MLC LLM 是一个通用的解决方案

它允许任何语言模型在不同的硬件后端和本地应用程序集上进行本地部署

并为每个人提供一个高效的框架,以进一步优化模型的性能,满足他们自己的用例

其使命是让每个人都能在自己的设备(如手机端)上开发、优化和部署人工智能模型

项目地址:https://github.com/mlc-ai/mlc-llm


什么是MLC-LLM

自ChatGPT发布以来,大语言模型(Large language model, LLM)就成了AI乃至整个计算机科学的话题中心

学术界,工业界围绕大语言模型本身及其应用展开了广泛的讨论,大量的新的实践层出不穷

由于LLM对计算资源的需求极大

有能力部署大语言模型的公司和实验室一般通过搭建集群,然后开放API或者网页demo的方式让用户可以使用模型

在人们纷纷发挥想象力尝试各种prompt与模型对话的时候

同时也注意到在一些应用场景中,出于定制化、个性化或者隐私性的目的

人们想要自己在各种终端设备中本地运行大语言模型,不需要/不希望连接互联网或者依赖于服务器

为了解决这一类问题

MLC-LLM是我们在各种不同硬件上原生部署任意大语言模型的解决方案。可以将大语言模型部署到这些平台上

  • 移动端:iPhone (Android平台的app正在开发中)
  • Metal GPU和Intel/ARM MacBook
  • 在Linux/Windows上,通过Vulkan驱动的AMD和NVIDIA GPU
  • 在Linux/Windows上,通过Cuda驱动的NVIDIA GPU
  • 浏览器,通过WebGPU ,我们也有这一方向的尝试

MLC-LLM的目标是什么

近年来,生成性人工智能(AI)和大语言模型(LLM)的研究取得了长足的进展,并日益普及

多亏了开源计划,现在可以使用开源模型来开发个人人工智能助手

然而,LLM 往往是资源密集型和计算要求

为了创建可伸缩的服务,开发人员可能需要依赖强大的集群和昂贵的硬件来运行模型推理

此外,部署 LLM 提出了一些挑战,例如它们不断发展的模型创新、内存约束以及对潜在优化技术的需求

MLC-LLM的目标是开发、优化和部署人工智能模型

以便在一系列设备上进行推理,这些设备不仅包括服务器级硬件,还包括用户的浏览器、笔记本电脑和移动应用程序

为了实现这一点,我们需要解决计算设备和部署环境的多样性。一些主要挑战包括:

  1. 支持不同型号的 CPU、 GPU 以及可能的其他协处理器和加速器
  2. 在用户设备的本机环境上部署,这些设备可能没有 Python 或其他必要的可用依赖项
  3. 通过仔细规划分配和积极压缩模型参数来解决内存约束

MLC LLM 提供了一个可重复的、系统化的和可定制的工作流程

使开发人员和人工智能系统研究人员能够以以生产力为中心、 Python 优先的方法实现模型和优化

这种方法可以快速尝试新的模型、新的想法和新的编译器传递,然后将本机部署到所需的目标

此外,我们不断扩大 LLM 加速通过扩大 TVM 后端,使模型编译更加透明和高效。


MLC 如何本地部署?

MLC LLM的解决方案的基石是机器学习编译(MLC) 利用它来有效地部署 AI 模型, 部署时有如下特征

  1. LLM天然具有输入变长的特点,我们将原生支持dynamic shape输入的模型编译成TVM IRModule,使我们能够避免必须padding到最大长度,从而减少计算开销和内存需求(对于移动端来说尤其重要,例如iPhone限制了每个应用最多使用4G内存)

  2. 组合机器学习编译优化: 我们执行许多模型部署优化,例如更好的编译代码转换、融合、内存规划、库卸载和手动代码优化,可以很容易地将 TVM 的 IRModule 转换作为 Python API 公开

  3. 利用低位量化来压缩模型权重,并利用 TVM 的环路级 TensorIR 来快速定制不同压缩编码方案的代码生成

  4. TVM编译生成的库通过TVM runtime在设备的原生环境下运行(不同于WebGPU)TVM runtime支持CUDA/Vulkan/Metal等主流GPU驱动以及C, JavaScript等语言的绑定

  5. 提供了一个轻量级的基于 C + + 的示例 CLI 应用程序,它展示了如何包装已编译的构件和必要的预/后处理,这将有望澄清工作流程,以便将它们嵌入到本地应用程序中。

  6. 作为一个起点,MLC 为 CUDA、 Vulkan 和 Metal 生成 GPU 着色器。通过对 TVM 编译器和运行时的改进,可以增加更多的支持,比如 OpenCL、 sycl、 webgpu 本机。MLC 还通过 LLVM 支持各种 CPU 目标,包括 ARM 和 x86。

MLC LLM依赖于开源生态系统,更具体地说,是 TVM Unity,这是 TVM 项目中一个令人兴奋的最新发展,它支持 Python 优先的交互式 MLC 开发体验,使我们能够轻松地用 Python 编写新的优化,并逐步将我们的应用带到感兴趣的环境中。利用优化,如融合量化内核,一流的动态形状支持和不同的 GPU 后端。


关键技术-Dynamic shape的支持

Dynamic shape是MLC LLM成功运行大语言模型的关键,因为sequence length(seq_len)和kv cache的大小都是动态的

seq_len根据模型输入决定,而kv cache的大小随每次模型forward而增长

之前的大部分基于编译的深度学习框架采用static shape

采用那些框架必须使用padding技术和bucketing技术,会造成重复编译,极大增加编译时间

TVM Unity 原生支持dynamic shape,所以我们可以将seq_len和kv cache 大小分别表示成抽象变量,避免重复编译

TVM的symbolic shape的支持可以使得我们针对动态的计算也可以进行如算子融合, TensorIR融合和内存分配等优化,并且灵活地和其他优化结合起来。


Dynamic shape引发了新的问题

如何对一个dynamic shape的算子优化?

因为TVM unity的灵活特性,我们可以采用各种自己的优化策略

我们采用了专家知识和自动调优结合的方法

首先,我们得知大部分库采用高度优化的固定shape的micro-kernel,循环调用它,来实现dynamic shape的优化。我们采用相似的方法,使用auto tuning优化一个micro-kernel,如323232的矩阵乘法(下文以该micro-kernel举例),然后使用专家知识,手工pad算子的形状为32的倍数

然后在tiling之后,使用micro-kernel替换内部循环

在推动模型的支持的过程中我们也基本确认TVM Unity可以有效针对性地处理动态shape的编译迭代

相信相关的代码也可以让其它对于机器学习编译和大模型优化有兴趣的同学有所帮助,或者帮助大家部署大模型到更多硬件上。


整体结构
在这里插入图片描述


参考文献

  • https://github.com/mlc-ai/mlc-llm
  • https://zhuanlan.zhihu.com/p/625959003
  • https://mlc.ai/mlc-llm/

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WordPress 不使用ftp更新

文章目录 摘要修改 wp-config.php文件处理 413 Request Entity Too Large修改nginx配置:client_max_body_size重启nginx 处理uploaded file exceeds the upload max filesize找到php.ini修改 upload_max_filesize重启php 摘要 每次 WordPress 有插件或主题更新都要…

计算机组成原理第五章(2)---中断

5.1概述 产生和应用 在IO设备和主机交换数据时,由于设备本身的机电特性的影响,其工作速度比较低,与CPU无法匹配,如果采用程序查询的方式需要CPU进行等待,但是如果在等待的过程中CPU可以执行其他的程序,可…

04_Uboot操作命令与其他命令

目录 BOOT 操作命令 bootz命令 bootm 命令 reset 命令 go 命令 run 命令 mtest 命令 BOOT 操作命令 uboot的本质工作是引导Linux,所以uboot肯定有相关的boot(引导)命令来启动Linux。常用的跟boot有关的命令有:bootz、bootm和boot。 bootz命令 要启动Linux,需要先将Lin…

《LearnUE——基础指南:上篇—1》——GamePlay架构之Actor和Component

目录 Component大法好,谁用谁知道!! 1.1.1 创世(UObject) 1.1.2 造物(Actor) 1.1.3 赋能(Component) Component大法好,谁用谁知道!&#xff0…

合肥职业技术学院分类考试招生职业技能考试 -- 计算机专业

考试大纲模块一 专业能力测试主要内容模块二 技术技能测试主要内容分值分布 分模块讲解模块一 专业能力测试计算机的发展、类型及其应用领域计算机技术的发展计算机应用领域 计算机中数据的表示、存储和处理计算机软、硬件系统的组成及主要技术指标计算机软、硬件系统的组成硬件…

YOLOv5-7.0训练中文标签的数据集

链接&#xff1a;https://pan.baidu.com/s/1KSROxTwyYnNoNxI5Tk13Dg 提取码&#xff1a;8888 以显示楷体为例&#xff08;上面的百度网盘里面有黑体、宋体、楷体ttf文件&#xff09; (1)将metric.py中&#xff1a; 将 sn.set(font_scale1.0 if nc < 50 else 0.8) # for …

iOS可视化动态绘制八种排序过程

一、可视化解决方案综述 1.交互UI综述 在本篇博客的第一部分我们先来整体的看一下我们Demo的功能。下方就是我们今天博客中的Demo的交互示意图。上方的输入框可以输入要排序元素的个数&#xff0c;下方输入的是300。程序会根据你输入的个数来随机生成数据&#xff0c;你输入30…

D. Edge Deletion(堆优化最短路)

Problem - D - Codeforces 给定一个由 n 个顶点和 m 条边组成的无向连通加权图。将从顶点 1 到顶点 i 的最短路径长度表示为 di。 你必须删除一些图中的边&#xff0c;使得最多只保留 k 条边。如果在删除边后&#xff0c;仍然存在从 1 到 i 的路径&#xff0c;其长度为 di&…

【数学建模】matlab的常用函数运用(1)

文章目录 1. matlab基本常识2. 常用输入输出函数2.1 输出函数2.2 拼接函数&#xff08;字符串的合并&#xff09;2.3 输入函数 3. 求和函数3.1 向量求和3.2 矩阵求和 4. 提取矩阵元素4.1 取第x行第y列的元素4.2 取指定行或列的所有元素4.3 取指定某些行的所有元素 1. matlab基本…

【OMNET++】V2X仿真

1.前言 车载无线通信技术V2X即Vehicle to Everything&#xff0c;是在车辆和任何会被该车辆所影响的实体之间分享信息的技术。V2X的主要动机是道路安全、交通效率和节能。 车辆影响实体的分类&#xff1a; Vehicle:对应其他车辆&#xff0c;对应通信V2V&#xff0c;对应设备是…

Linux学习[9]查找文件指令:which whereis locate find

文章目录 前言1. which2. whereis3. locate4. find总结&#xff1a; 前言 之前在弄交叉编译的时候需要找到gcc&#xff0c;gdb什么的在哪里&#xff1b;涉及到了查找文件指令。 这里对linux中的查找指令进行总结 1. which which指令一般用来寻找可执行文件的路径&#xff0c;…

C. Playing Piano(dfs)

Problem - C - Codeforces 小Paul想学弹钢琴。他已经有了一首想要开始演奏的旋律。为简单起见&#xff0c;他将这个旋律表示为键号序列a1,a2,…,an&#xff1a;数字越大&#xff0c;它就越靠近钢琴键盘的右侧。 Paul非常聪明&#xff0c;知道关键是正确地为他要演奏的音符分配…

git-windows安装

1.下载地址 https://www.git-scm.com/ 2.第一步&#xff0c;直接next 3.选择默认安装路径 4. 选择组件&#xff0c;默认 5.开始菜单是否创建&#xff0c;默认不创建 6.这里是设置 Git 默认编辑器&#xff0c;我们这里直接下一步 "Next" 7.调整新仓库中初始分支的名称…

观察 | 卫浴产业数字化转型下的中国智造样本

文 | 智能相对论 作者 | 佘凯文 数字技术的发展已成为全球科技变革向高端技术不断升级的方向。 年初&#xff0c;中共中央、国务院印发《数字中国建设整体布局规划》&#xff0c;这是党的二十大后党中央在我国数字化发展领域作出的最全面擘画&#xff0c;从顶层设计的高度对…

elasticsearch结构化查询(一)

在上一篇中我们介绍了DSL相关的知识&#xff0c;接下来我们将会学习elasticsearch的结构化查询&#xff0c;同时也实践一下上一篇的DSL的查询用法 什么是结构化搜索? 从《Elasticsearch权威指南》上摘取部分解释如下: 结构化搜索是指查询包含内部结构的数据。日期&#xff0…

CentOS 7.6更改yum源

使用字符串替换 我这里的操作参考了https://baijiahao.baidu.com/s?id1708418392526536542&wfrspider&forpc这篇文章&#xff0c;https://mirrors.tuna.tsinghua.edu.cn/help/centos/是清华大学官网教程。 /etc/yum.repos.d/CentOS-Base.repo文件如下&#xff1a; #…

Python的类与对象、构造方法、类与对象三大特性封装、继承和多态、类型注解

类与对象 1.Python的对象 使用对象组织数据 在程序中是可以做到和生活中那样&#xff0c;设计表格、生产表格、填写表格的组织形式的。 在程序中设计表格&#xff0c;我们称之为&#xff1a;设计类(class) class Student: name None #记录学生姓名 在程序中打印生产表格&…

【MySQL】函数和约束

如标题所说,本文重点只有两个:MySQL语句里面的函数和约束 目录 1. 函数1.1 字符串函数1.2 数值函数1.3 日期函数1.4 流程函数 2.约束2.1 外键的删除更新行为 1. 函数 因为在前一篇文章里面有讲到聚合函数,所以在这里就不重复介绍了,本文所介绍的函数有4类:字符串函数,数值函数…

瑞吉外卖+Redis入门到实战教程,深度透析redis底层原理+redis分布式锁+企业解决方案+黑马点评实战项目

瑞吉外卖 Redis基础 Redis入门 redis.io nosql没有表的概念 下载与安装 注意关闭防火墙 systemctl stop firewalld 启动redis src/redis-server ./redis.conf 数据类型 常用命令 字符串 string 操作命令 哈希 hash 操作命令 列表list(类似 栈 )操作命令 集合set 操作命令 sdif…

【源码解析】流控框架Sentinel源码解析

Sentinel简介 Sentinel是阿里开源的一款面向分布式、多语言异构化服务架构的流量治理组件。 主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 核心概念 资源 资源…