BentoML-实践指南-使用-JuiceFS-加速大模型加载 (奔腾)
简介
BentoML 是一个开源的大语言模型(LLM)应用开发框架和部署工具,致力于为开发者提供最简单的构建大语言模型 AI 应用的能力。当 BentoML 在 Serverless 环境中部署模型时,其中一个主要挑战是冷启动慢,尤其在部署大型语言模型时更为明显。
由于这些模型体积庞大,启动和初始化过程耗时很长。由于 ImageRegistry 的带宽较小,会让大体积的 Container Image 进一步加剧冷启动缓慢的问题。
引入 JuiceFS
为了解决这一问题,BentoML 引入了 JuiceFS。JuiceFS 的 POSIX 兼容性和数据分块使我们能够按需读取数据,读取性能接近 S3 能提供的性能的上限,有效解决了大型模型在 Serverless 环境中冷启动缓慢的问题。
使用 JuiceFS 后,模型加载速度由原来的 20 多分钟缩短至几分钟。
优化
在实施 JuiceFS 的过程中,我发现实际模型文件的读取速度与预期基准测试速度存在差异。通过一系列优化措施,如改进数据缓存策略和优化读取算法,我们成功解决了这些挑战。
1. BentoML 简介及其架构
在介绍模型部署环节的工作之前,首先需要对 BentoML 是什么以及它的架构做一个简要的介绍。
BentoML 是一个高度集成的开发框架,采用简单易用的方式,支持以开发单体应用的方式进行开发,同时以分布式应用的形式进行部署。这意味着开发者可以用很低的学习成本来快速开发一个高效利用硬件资源的大语言模型 AI 应用。
BentoML 还支持多种框架训练出来的模型,包括 PyTorch、TensorFlow 等常用 ML 框架。起初,BentoML 主要服务于传统 AI 模型,但随着大型语言模型的兴起,如 GPT 的应用,BentoML 也能够服务于大语言模型。
BentoML 产生的制品称为 Bento,Bento 的角色类似于 Container Image,是用于 AI 应用部署的最基本单位,一个 Bento 可以轻松部署在不同的环境中,比如、EC2、AWSLambda、AWSSageMaker、Kafka、Spark、Kubees。
一个 Bento 包含了业务代码、模型文件、静态文件,同时我们抽象出来了 APIServer 和 Runner 的概念,APIServer 是流量的入口,主要承载一些 I/O 密集型的任务,Runner 通常是执行模型的推理工作,主要承载一些 GPU/CPU 密集型的任务,从而可以将一个 AI 应用中不同硬件资源需求的任务进行轻松解耦。
2. Serverless 平台部署大模型的挑战
对于 Serverless 平台而言,冷启动时间至关重要。想象一下,当请求到达时,从零开始增加副本,这可能需要超过 5 分钟。在这段时间内,前面的某些 HTTP 基础设施可能认为已经超时,对用户体验不利。
特别是对于大语言模型,其模型文件通常很大,可能达到十几到二十几 GB 的规模,导致在 Serverless 环境中部署时遇到冷启动时间过长的挑战。
3. JuiceFS 的解决方案
JuiceFS 是一个分布式文件系统,它使用 POSIX 兼容的 API 提供存储服务。与传统的文件系统不同,JuiceFS 不将数据存储在单个服务器上,而是将数据分块并分布在多个服务器上。
这种架构提供了许多优势,包括:
- 可扩展性:JuiceFS 可以轻松扩展到数百个服务器,以处理海量数据。
- 高性能:JuiceFS 使用分布式架构,可以并行处理请求,从而提供高性能。
- 低成本:JuiceFS 存储数据在廉价的云存储中,例如 Amazon S3,从而降低存储成本。
JuiceFS 的这些优势使其成为在 Serverless 环境中部署大语言模型的理想解决方案。
4. 实施和优化
我们在 BentoML 中集成了 JuiceFS,以解决 Serverless 环境中大语言模型的冷启动时间过长的问题。我们使用 JuiceFS 来存储模型文件,并在模型部署时动态加载这些文件。
在实施过程中,我们遇到了两个主要挑战:
- 读取性能:实际模型文件的读取速度低于预期基准测试速度。
- 内存使用:加载大型模型文件时,内存使用量可能会很高。
我们通过以下优化措施解决了这些挑战:
- 改进数据缓存策略:我们实施了一个缓存策略,将最近访问的文件数据缓存在本地磁盘上。这显著提高了读取性能。
- 优化读取算法:我们优化了读取算法,以减少并发读取文件时系统调用的数量。这降低了内存使用量。
通过这些优化,我们能够将模型加载速度由原来的 20 多分钟缩短至几分钟。这显著提高了 Serverless 环境中大语言模型的部署效率和用户体验。
5. 结论
通过将 JuiceFS 集成到 BentoML 中,我们显著提高了 Serverless 环境中大语言模型的部署效率。JuiceFS 的 POSIX 兼容性、数据分块和按需读取数据的能力使其成为解决冷启动时间过长问题的理想解决方案。
我们的优化措施,例如改进数据缓存策略和优化读取算法,进一步提高了读取性能和降低了内存使用量。这使我们能够为开发者提供简单易用的工具,以便在 Serverless 环境中部署和使用大语言模型。
学习物理知识中的科学方法
类比法:把两个形式上相同的东西(通常是数学公式形式相同)类比,由已知直接得到未知。 如电学中库仑力公式和力学中万有引力公式都是关于r的平方反比,所以关于二者的做功、能量公式就可以互相类比得到,不必具体计算(计算需要积分)。 比较法:两个相近或两反的东西都可以比较,这时比较法和类比法基本一样。 有时比较则是为了看出两个物理过程之间的异同来,例如功和能的异同,一个是过程量,一个是状态量。 等效法:本来一个物理过程比较难以表达计算,但知道它产生的效果和另一个比较容易的物理过程一样,就可以把前者替换成后者。 例如:可以证明一条无限长的带电直线对直线外一点电荷的作用力(设距离为r)与以r为半径的带电半圆周对圆心处点电荷作用力大小相等。 这两个物理模型可以替换。 模型法:把比较复杂的实际问题简化成物理模型。 例如:天体运动中,天体本来是很多不规则球形,都可以简化成一个质点计算。 控制变量法:对多变量的问题,情况往往比较复杂,此时可以把其他变量固定,只讨论其中一个变量的变化对问题的影响。 例如:理想气体的状态方程,开始是由实验得到的,人们分别研究了等温过程、等压过程和定容过程下理想气体的体积、温度、压强和质量的关系,得出了一系列实验定律。 最终才总结为克拉珀龙方程:PV = nRT谢谢!祝你学习进步!
如何使用指北针,等高线,比例尺
你提的问题太宽泛,我只能先大体说说其用途,然后用特例给你解答了。 指北针:顾名思义,指北方向。 等高线:在地图上将高程相等的点连成一条线,这条线即为等高线,也就是说,该线上所有的点高程都相等(不是等高线的定义,是我自己的理解)。 用等高线绘制的地图叫等高线地图,常叫地形图。 比例尺:图上的长度相对于实际长度的比值,即为比例尺。 常用三种形式表示:1,文字,叙述为“图上1厘米相当于实际1米”,现在很少见到此种表示方法了;2,数值式,表示方法为“1:100”;3,直尺式,表示方法为画出一段带刻度的线,第一个刻度一般写0,第二个刻度写1m,第三个刻度写2m,以此类推,每两个刻度间的长度为1厘米。 注意,以上三种表述方法表示的比例尺是一样的,均为1:100.下面说说如何实用指北针和地形图。 找到一块高地,如山头。 拿出地形图和指北针,平铺地图,将指北针至于图纸上指北针的旁边,转动地形图(同时也转动指北针),使指北针的北针和图纸上的指北针指向相同。 找到自己所在的位置并标于地形图上。 此刻,地形图就可以看成是现实地形的缩小模型,然后就可以用图纸来进行量距离等工作了。 比如,你的正前方有一条小河,用直尺在图上量出你和小河的长度,在除以比例尺,所得的数据就是你和河流的距离。 比如图上量出的长度为20mm,比例尺为1:1000,那么实际距离就是20(1:1000)=mm=20m,所以,你和河流间的距离就是20m。 写得太多,不知道你看懂了没。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。