MLC LLM:将LLMs部署到消费类硬件的优势、挑战以及解决方案

一、前言

随着生成人工智能(AI)和大语言模型(LLM)的快速发展,基于LLM的应用越来越普及。然而,大规模的模型需要密集计算和庞大的资源,使得许多公司无法承担从头开始训练模型的成本。目前,大部分厂商提供基于云端的LLM服务,需要联网才能使用。这对于需要在专用网络中部署LLM的情况,提供云端模型能力从成本投入和应用效果上来看并不一定是最合适的解决方案。

为了解决这个问题,研究人员正在寻找将LLM直接部署在终端设备(如智能柜、一体机、登记终端)和消费类设备(笔记本电脑、手机)上的方法。这种部署方式将带来以下优势:

  • 更快的响应时间:本地部署可以减少网络延迟,提高用户体验。

  • 提高隐私和数据安全性:将计算任务保留在用户设备上,降低数据泄露风险。

  • 离线使用能力:用户无需始终保持与云服务器的连接,可以在无网络环境下使用LLM。

实现这一目标需要解决计算设备和部署环境的多样性挑战,包括:

  • 支持不同型号的CPU、GPU及其他协处理器和加速器。

  • 部署在可能没有现成Python或其他依赖项的用户设备本机环境上。

  • 解决内存限制,通过精心规划分配和压缩模型参数。

为了应对这些挑战,研究人员正在探索机器学习编译领域,结合机器学习编程抽象、学习驱动的搜索、编译和优化库运行时。庆幸的是,在机器学习开源领域,MLC LLM正在解决大语言模型如何快速简单的部署在消费级设备上,这将为AI生态系统带来新的机遇和突破,推动人工智能技术在各个领域的普及和应用。然而小米很早已经嗅到了在国内LLM的创新应用模式,在消费级设备上部署针对特定场景进行微调训练的LLM,以支撑前端AI应用。

2023年8月14日,也就是今天,在雷军的年度演讲中,雷军提到小米全面拥抱大模型,小爱同学已经开始升级大模型。目前小米公司已经成功在手机端侧初步跑通大模型,雷军表示,目前小米的手机端侧大模型在部分场景下的效果媲美云端60亿参数的大模型运算能力。

二、什么是 MLC LLM ?

MLC LLM 是一种通用解决方案,允许将任何语言模型本地部署在各种硬件后端和本机应用程序上,并为每个人提供一个高效的框架,以便针对自己的用例进一步优化模型性能。 一切都在本地运行,无需服务器支持,并通过手机和笔记本电脑上的本地 GPU 进行加速。支持的平台包括:

https://sundun-rdcenter.feishu.cn/space/api/box/stream/download/asynccode/?code=Y2UxMGRmZTBmMDU5ZDMyMTUyODcwMDI0MDFmMDRhNzRfTmpQMXRIWXgzOEFMYk9mN0ZsZWZNU2ZvalRGTFNBNGRfVG9rZW46U0hicmJhSFlyb1ZpbUp4ZjJvemNGN29jbnNnXzE2OTIyNTMzMzQ6MTY5MjI1NjkzNF9WNA

MLC LLM 提供可重复、系统且可定制的工作流程,使开发人员和人工智能系统研究人员能够以注重生产力、Python 优先的方法实施模型和优化。这种方法可以快速试验新模型、新想法和新编译器通道,然后本地部署到所需目标。此外,我们通过扩大 TVM 后端来不断扩展 LLM 加速,使模型编译更加透明和高效。

MLC-LLM 项目由三个不同的子模块组成:模型定义、模型编译和运行时。

https://sundun-rdcenter.feishu.cn/space/api/box/stream/download/asynccode/?code=ZTJhYjQ4NDFhMmRjNDhkYTM5MGU5MzMwZTdjNzBiZjRfZm5hakkwSUZ4OW1vSjBMWEpQdHhGOXJFRTdNajJBRWdfVG9rZW46TW1idGJ6SEJub3RUaTB4UmhTV2MxaVYybk5oXzE2OTIyNTMzMzQ6MTY5MjI1NjkzNF9WNA

➀ Python 中的模型定义。MLC 提供各种预定义架构,例如 Llama(例如 Llama2、Vicuna、OpenLlama、Wizard)、GPT-NeoX(例如 RedPajama、Dolly)、RNN(例如 RWKV)和 GPT-J。模型开发人员可以仅使用纯 Python 定义模型,而无需接触代码生成和运行时。

➁ Python 中的模型编译。模型由TVM Unity编译器编译,其中编译配置为纯 Python。MLC LLM 将基于 Python 的模型量化并导出到模型库并量化模型权重。可以用纯 Python 开发量化和优化算法,以针对特定用例压缩和加速 LLM。

➂ 平台本机运行时。每个平台上都提供了 MLCChat 的变体:用于命令行的C++ 、用于 Web 的Javascript 、用于 iOS 的Swift和用于 Android 的Java,可通过 JSON 聊天配置进行配置。应用程序开发人员只需熟悉平台原生运行时即可将 MLC 编译的 LLM 集成到他们的项目中。

官方提供了不同平台预构建的MLC Chat应用程序部署包,我们可以在以下平台上尝试预构建的模型:

  • iPhone

  • Android

  • Windows Linux Mac

  • Web browser

2.1、iPhone

MLC-Chat 应用程序可在 App Store 上找到,尝试在 iOS 设备 (iPhone/iPad) 上安装和使用它。Vicuna-7B 需要 4GB 内存来运行,RedPajama-3B 则需要 2.2GB 内存来运行。考虑到 iOS 和其他正在运行的应用程序,我们需要一台配备 6GB(用于 Vicuna-7B)或 4GB(用于 RedPajama-3B)的 iPhone 来运行该应用程序。该应用程序仅在 iPhone 14 Pro Max、iPhone 14 Pro 和 iPhone 12 Pro 上进行测试。

https://sundun-rdcenter.feishu.cn/space/api/box/stream/download/asynccode/?code=MGFjNDAwZmYyYmFlNjQ5M2ZiYTA4NTk3MzdjYzVjZTVfclZIWmpjN0lsTWtpZDFKTWVLbHRtWldoRGkyb2xwZzhfVG9rZW46S2RqUmJiOHVhb0RFOEh4WW1GWWMwWVJablo1XzE2OTIyNTMzMzQ6MTY5MjI1NjkzNF9WNA

注意:iOS 应用程序上的文本生成速度有时可能不稳定。一开始可能会运行缓慢,然后恢复到正常速度。

2.2、Android

MLC Chat Android 应用程序是免费的,可供下载,您只需单击下面的按钮即可试用:

https://github.com/mlc-ai/binary-mlc-llm-libs/raw/main/mlc-chat.apk

安装应用程序后,您无需连接互联网即可与模特聊天:

不同型号的内存要求有所不同。Vicuna-7B 模型需要至少具有 6GB RAM 的 Android 设备,而 RedPajama-3B 模型可以在至少具有 4GB RAM 的 Android 设备上运行。

2.3、Windows Linux Mac

我们提供 CLI(命令行界面)应用程序来与终端中的机器人聊天。在安装 CLI 应用程序之前,我们应该先安装一些依赖项。

  1. 我们使用Conda来管理我们的应用程序,因此我们需要安装一个版本的conda。我们可以安装MinicondaMiniforge

  2. 在 Windows 和 Linux 上,聊天机器人应用程序通过 Vulkan 平台在 GPU 上运行。对于Windows和Linux用户,请安装最新的Vulkan驱动程序。对于 NVIDIA GPU 用户,请务必安装 Vulkan 驱动,因为 CUDA 驱动可能不太好。

安装所有依赖项后,只需按照以下说明安装 CLI 应用程序即可:

# 创建一个新的conda环境,安装CLI应用程序,并激活该环境。
conda create -n mlc-chat-venv -c mlc-ai -c conda-forge mlc-chat-cli-nightly
conda activate mlc-chat-venv

# 如果你还没有安装Git和Git-LFS,请先安装它们。# 它们用于从HuggingFace下载模型权重。
conda install git git-lfs
git lfs install

# 创建一个目录,从HuggingFace下载模型权重,并从GitHub下载二进制库文件。
mkdir -p dist/prebuilt
git clone https://github.com/mlc-ai/binary-mlc-llm-libs.git dist/prebuilt/lib

# 下载Llama-2-7B、Llama-2-13B或Llama-2-70B cd dist/prebuilt的预构建权重
git clone https://huggingface.co/mlc-ai/mlc-chat-Llama-2-7b-chat-hf-q4f16_1

# 或者下载13B模型# git clone https://huggingface.co/mlc-ai/mlc-chat-Llama-2-13b-chat-hf-q4f16_1# 或者下载70B模型(至少需要50GB VRAM的Apple Silicon Mac才能运行)# git clone https://huggingface.co/mlc-ai/mlc-chat-Llama-2-70b-chat-hf-q4f16_1  cd ../..
mlc_chat_cli --local-id Llama-2-7b-chat-hf-q4f16_1

# 或者下载13B模型 mlc_chat_cli --local-id Llama-2-13b-chat-hf-q4f16_1 或者下载70B模型(至少需要50GB VRAM的Apple Silicon Mac才能运行) mlc_chat_cli --local-id Llama-2-70b-chat-hf-q4f16_1 你还可以尝试更多的模型,例如:# 下载RedPajama-3B的预构建权重 cd dist/prebuilt
git clone https://huggingface.co/mlc-ai/mlc-chat-RedPajama-INCITE-Chat-3B-v1-q4f16_1
cd ../..
mlc_chat_cli --local-id RedPajama-INCITE-Chat-3B-v1-q4f16_1

注意:如果您使用的是 Windows 或 Linux。确保您安装了最新的 Vulkan 驱动程序。请按照GPU驱动程序和SDK教程中的说明准备环境。

2.4、Web Browser

随着WebGPU的进步,我们现在可以完全在Web浏览器环境中运行LLM。您可以在WebLLM中尝试 MLC LLM 的网络版本。

在 WebLLM 中,一旦在第一次运行中获取模型权重并将其存储在本地缓存中,您就可以开始与模型进行交互,而无需连接互联网。

运行 WebLLM 需要兼容 WebGPU 的浏览器和本地 GPU。您可以下载最新的 Google Chrome 并使用WebGPU 报告来验证浏览器上 WebGPU 的功能。

三、LLMs在消费类设备上的潜在机会

将LLMs应用于消费类设备具有很多机会。以下是一些可能的未来发展方向(可能不完全)。

https://sundun-rdcenter.feishu.cn/space/api/box/stream/download/asynccode/?code=YjE5ZTlhMWQyM2FjOTAzNDhiYzNiMjAwM2EzYTBhYjdfZTFtVm1nQklmbDdtUHRiVk9HbnEwRGtyQW4yc0IwcDZfVG9rZW46VkNxdmJPMWo3b1E5TDN4S3dTMmNGZDBYbjFnXzE2OTIyNTMzMzQ6MTY5MjI1NjkzNF9WNA

3.1、个性化

智能语言模型知道很多东西,但它们不一定知道我们最喜欢的歌曲或写作风格。在一个可能的未来,有些人可能喜欢拥有一个个人AI伙伴。这些模型可能不是最聪明的,但它们了解我们自己,可以用来提高我们的日常工作效率。它们还可以与服务器上更强大的模型一起工作,创造更强大的体验。它们还可以作为适配器,构建在开放强大的模型之上。然而,要创建这样的个性化AI,我们需要将个人数据提供给模型,最好是在我们自己的消费类设备上运行它们。

3.2、专业化和应用集成

语言模型可以做很多事情,但在某些领域,我们可能只需要一个稍微精简的版本。将来,游戏可能会利用这些模型的变种为每个玩家生成独特的体验。将游戏对话专业化是现有应用从集成LLMs中受益的一个例子。在游戏机上直接运行专业化模型可能会带来很多有趣的机会。

3.3、离线支持和客户端服务器混合用例

我们并非始终连接到互联网。在飞行或进入网络难以接入的地方时,拥有一些不那么强大但仍然聪明的AI助手来帮助我们仍然是非常好的。另一种情况是,让不同的AI组件一起工作,将部分计算任务分担到本地,并与云端运行的模型协作。或者与一个根据我们所处环境自动在两者之间切换计算任务的服务合作。

3.4、去中心化

最后,去中心化是一个有趣的未来发展方向。虽然每个消费类设备的计算能力可能不如数据中心强大,但当它们连接在一起时,可以做很多强大的事情。去中心化AI领域有很多有趣的动态,如果得到合适的工具支持,将会很有趣地看到它们能实现什么功能。

四、部署LLMs到消费类硬件的挑战

我们讨论的这些想法都是可能即将到来的未来。除了谈论它们,更有趣的是询问我们如何实现其中的一些可能性。具体来说,我们可以如何为开源社区做出贡献,推动以下目标:

让每个人都能在任何地方(包括服务器环境和消费类设备)原生开发、优化和部署AI模型。

让我们从硬件加速这个关键要素开始。大型模型对计算能力和内存需求很高。利用硬件加速对于将一些大型模型带到消费类设备非常重要。好消息是,如果我们可以在消费类设备上玩游戏,那么我们很可能已经拥有了必要的硬件 - 一个GPU,用于加速感兴趣的AI工作负载。此外,还有越来越多的专用硬件支持用于加速机器学习工作负载。当然,这里也存在很多挑战。

4.1、硬件和软件堆栈的多样性

消费类设备具有很高的多样性。例如,许多桌面设备可能配备了Nvidia、AMD或Intel GPU,它们各自拥有自己的软件堆栈。游戏机如steam-deck配备了APU。笔记本电脑也可以搭载多种集成GPU,来自AMD、Intel和苹果。移动领域也带来了很多多样性。当然,如果我们谈论网络应用程序,那么网络中也需要GPU加速。在不同平台上编程这些硬件的子集也有不同的方式,包括CUDA、Rocm、Metal、OpenCL、SYCL、Direct3D、Vulkan/SPIRV和WebGPU。

https://sundun-rdcenter.feishu.cn/space/api/box/stream/download/asynccode/?code=OTA5ODIzM2M1NGZmMmFkYzRlMWY3ODM2ZDdiMDc4NGFfbkEwMTZZdzRHZXJEVWF6WWE4YWtpczNnTmdyQkRVR0ZfVG9rZW46UW5QM2I3NWhjb2lOVnd4SnhIbGNWRnZibnZmXzE2OTIyNTMzMzQ6MTY5MjI1NjkzNF9WNA

4.2、持续的机器学习系统开发需求

开源机器学习社区的发展速度令人惊叹,新的模型变体不断被训练出来。我们还看到了机器学习系统研究领域的持续创新,这些创新采用了将模型优化与改进系统支持相结合的新方法,需要将其纳入解决方案。这不仅仅是构建一个完美的解决方案,而是不断改进系统以支持机器学习和系统社区的最新创新。

五、什么是机器学习编译

机器学习编译(MLC)是将机器学习执行从开发形式转变为部署形式的转变和优化的过程。

开发形式 是指我们在开发机器学习模型时使用的元素集。典型的开发形式涉及用 PyTorch、TensorFlow 或 JAX 等通用框架编写的模型描述以及与之相关的权重。

部署形式 是指执行机器学习应用程序所需的元素集。它通常涉及一组为支持机器学习模型的每个步骤而生成的代码、管理资源(例如内存)的例程以及应用程序开发环境的接口(例如用于 Android 应用程序的 java API)。

https://sundun-rdcenter.feishu.cn/space/api/box/stream/download/asynccode/?code=OTIyZDBhNGIxZWE3YTcwNmY2ZDczZjE0YTFkZmNhNzNfdmJmb3ZzUE5pOXNOSzFQa212MnVjU0V1RUxKV1ZMSk5fVG9rZW46SzZUdGJMMnNCb0lhYVN4N3JuaGNVenV0blhWXzE2OTIyNTMzMzQ6MTY5MjI1NjkzNF9WNA

我们使用术语“编译”,因为该过程可以与传统编译器的操作非常相似 - 编译器以开发形式获取我们的应用程序并将其编译为可以部署的库。然而,机器学习编译在很多方面仍然与传统编译不同。

首先,这个过程并不一定涉及代码生成。例如,部署形式可以是一组预定义的库函数,而机器学习编译仅将开发形式转换为对这些库的调用。面临的挑战和解决方案也截然不同。这就是为什么将机器学习编译作为一个独立的主题来研究是值得的,独立于传统的编译。尽管如此,我们也会在机器学习编译中发现一些有用的传统编译概念。

机器学习编译过程通常有几个目标:

集成和依赖性最小化。 部署过程通常涉及集成——将部署应用程序所需的元素组装在一起。例如,如果我们想要启用 Android 相机应用程序来对花卉进行分类,我们将需要组装运行花卉分类模型的必要代码,但不一定是与模型无关的其他部分(例如,我们不需要包括 NLP 应用程序的嵌入表查找代码)。组装和最小化必要依赖项的能力对于减少整体大小并增加应用程序可以部署到的环境数量非常重要。

利用硬件本机加速。 每个部署环境都有自己的一套本机加速技术,其中许多技术是专门为 ML 开发的。机器学习编译过程的目标之一是利用硬件的本机加速。我们可以通过构建调用本机加速库的部署表单或生成利用 TensorCore 等本机指令的代码来实现这一点。

总体优化。 有许多等效的方法来运行相同的模型执行。MLC 的共同主题是通过不同形式的优化,以最小化内存使用或提高执行效率的方式转变模型执行。

这些目标没有严格的界限。例如,集成和硬件加速也可以被视为一般优化。根据具体的应用场景,我们可能对某些源模型和生产环境对感兴趣,或者我们可能对部署到多个并选择最具成本效益的变体感兴趣。

重要的是,MLC 并不一定代表单一稳定的解决方案。事实上,随着硬件和模型集数量的增长,许多 MLC 实践都涉及与不同背景的开发人员的合作。硬件开发人员需要为其最新的硬件本机加速提供支持,机器学习工程师的目标是实现额外的优化,而科学家则引入新模型。

六、机器学习编译如何助力

机器学习编译(MLC)是一种新兴方法,旨在弥合这里的差距。与其直接依赖于每个平台的手动优化和编写GPU着色器来实现各种硬件加速,这种方法会非常耗费工程资源。我们可以将机器学习模型视为一个程序,并通过多个步骤将其转换为目标平台中所需的形式。

https://sundun-rdcenter.feishu.cn/space/api/box/stream/download/asynccode/?code=MTgzMzBkYzdmNGQ3YTNlYTIxMzY1YWM3MmVmZTllNmRfUHVjeTJUN3Z1SDhOTXpHam9QY3VZZlNCcEoxd0pHeW1fVG9rZW46Wm5SSGJVT2x5b2trNkp4SUJOUGN5UGRqbkJoXzE2OTIyNTMzMzQ6MTY5MjI1NjkzNF9WNA

上图展示了一个典型的机器学习编译流程示例。模型的整体执行逻辑被捕获在一个名为IRModule的容器中,其中包含了代表不同类型计算的函数集合,例如LLM推理中的编码和单步解码。

然后,我们可以通过以下几个步骤对IRModule进行编程转换:

  • 在某些情况下,我们可以用库或代码生成器中更快的实现替换某些操作符(如注意力机制)。

  • 在其他情况下,我们需要仔细规划不同层次之间的内存共享,以减少内存消耗。

  • 为了获得最大性能,将操作符融合在一起也很重要,这样就不需要付出全局硬件内存的往返成本。

  • 最后,有一些技术可以让我们自动转换并生成目标平台(如Metal、CUDA、ROCm或Vulkan)的内核代码。

MLC方法的主要优势在于我们通常只需构建一次IRModule,就可以获得针对性的管道(例如,相同的解决方案为Web生成WGSL,为本地设备生成SPIRV)。此外,它还为全局进行某些转换提供了机会,例如系统地规划执行过程中的内存使用,以便将大型模型适应内存预算。值得注意的是,MLC并非是一种排他性方法。相反,它可以作为一种方法论,放大并补充其他工程方法,如内核性能优化。为此,我们可以将一些方法混合在一起,例如,在加速库可用时利用它们,同时使用代码生成来覆盖模型的其他部分。

使用MLC方法以及其他互补方法开发机器学习系统解决方案,可以大大提高我们的生产力。我们可以在可能的情况下利用管道的自动化部分,并专注于定制一些瓶颈部分。最近,机器学习编译领域出现了许多令人兴奋的开源发展,包括PyTorch 2.0OpenXLA/MLIRApache TVM Unity等。MLC作为一种方法论,可以帮助我们解决许多日常用例。

七、机器学习编译在语言模型中的应用

MLC-LLM是一种通用解决方案,采用机器学习编译方法,并将LLM带到各种消费类设备上。同样的解决方案也适用于移动和服务器用例。

https://sundun-rdcenter.feishu.cn/space/api/box/stream/download/asynccode/?code=MTRhNTFiMTNlYzZiNjVlNzZjZTg1YjIwZWEyNjIzM2FfRHdNV09pa3B0eWwzTmZPaUc3UncwckZHUGxBQnBPYUxfVG9rZW46TDF4TmJ0cW16b0M2SlB4RHJRTmNjS3N0bmtkXzE2OTIyNTMzMzQ6MTY5MjI1NjkzNF9WNA

为了让我们的模型最终可以加速并广泛可用,该解决方案将LLM模型映射到Vulkan API和Metal,涵盖了包括Windows、Linux和macOS在内的大多数消费平台。我们可以在这些平台上尝试CLI演示。这种方法的神奇之处在于它可以帮助我们在AMD GPU和像Steam Deck这样的设备上运行。

同样的解决方案也可以应用于支持移动设备,如iOS。您可以查看Test Flight页面以尝试移动应用程序。我们还可以进一步扩展支持,以支持其他移动设备。您可以查看这里的说明以尝试iPhone演示。https://sundun-rdcenter.feishu.cn/space/api/box/stream/download/asynccode/?code=ZjRmOGU1NjNjOTg3OGNlMWI4NjU3MjU4OWZkZDJhOWVfSlY0Wnl0Ym9VanVJU3dnWTdyUnpGTUFjSUIwcGtMNGNfVG9rZW46S0pzSmJTbW8wb1c3SjF4NWFySWNIRTE4bnhoXzE2OTIyNTMzMzQ6MTY5MjI1NjkzNF9WNA

最后,借助WebGPU,我们可以将这些语言模型直接加载到网络浏览器上。WebLLM是一个伴随项目,利用机器学习编译将这些模型带到浏览器上。我们也可以通过给定的链接尝试它。AI的进步还包括其他令人兴奋的模型,机器学习编译也可以提供帮助。Web Stable Diffusion是一个通过浏览器在消费环境中运行扩散模型的示例。

MLC-LLM还构建为一个可修改的Python流程,使更多人能够高效地开发和优化自己的模型和硬件用例的性能

八、总结与展望

本文主要探讨了如何将大语言模型(LLM)部署到消费类硬件上,实现更广泛的应用。首先分析了将LLM部署在终端设备和消费类设备的优势,包括更快的响应时间、提高隐私和数据安全性以及离线使用能力。然后,讨论了实现这一目标所面临的挑战,包括支持不同型号的计算设备、部署在本机环境上以及解决内存限制。

为了解决这些挑战,作者提出了一种新的部署方法,通过以下策略实现LLM在消费类硬件上的加速:

  • 模型压缩:利用知识蒸馏和模型剪枝技术减小模型大小,降低计算和内存需求。

  • 硬件加速:针对不同硬件平台优化模型,提高计算效率。

  • 本地部署:使用轻量级框架和库,简化部署过程,降低对用户设备的侵入性。

还介绍了一些成功案例,如在手机和笔记本电脑上运行LLM的应用。这些案例表明,通过模型压缩、硬件加速和本地部署等策略,LLM可以成功地运行在消费类硬件上,为用户提供实时、安全和便捷的智能服务。

总之,本文详细分析了将LLM部署到消费类硬件的优势、挑战以及解决方案。这一研究方向有望进一步拓宽LLM的应用范围,使更多用户受益于人工智能技术。

九、References

  • MLC-LLM GitHub

    • https://github.com/mlc-ai/mlc-llm

  • WebLLM

    • https://webllm.mlc.ai/

  • WebLLM Chat-Demo

    • https://webllm.mlc.ai/#chat-demo

  • WebGPU Report

    • https://webgpureport.org/

  • Vulkan Driver

    • https://developer.nvidia.com/vulkan-driver

  • GPU Drivers and SDKs

    • https://mlc.ai/mlc-llm/docs/install/gpu.html

  • Apache TVM

    • https://tvm.apache.org/

  • MLC Chat Android

    • https://github.com/mlc-ai/binary-mlc-llm-libs/raw/main/mlc-chat.apk

猜你喜欢

转载自blog.csdn.net/FrenzyTechAI/article/details/132340135