如何高效部署和扩展AI模型:开源平台与无服务器架构的综合应用

news2024/12/25 12:48:01

  每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行! 订阅:https://rengongzhineng.io/

在过去的几年中,我们见证了开源模型在数量和质量上的惊人增长。

平台如Hugging Face已经使得广泛的模型,包括大型语言模型(LLM)和扩散模型,变得易于获取,赋予了开发者自由和高效创新的能力。开发者享有更大的自主权,他们可以随意微调和组合不同的模型,这促使了像检索增强生成(RAG)这样的创新方法和高级代理的创建。从经济角度看,开源模型提供了可观的成本节约,使得使用较小、专用的模型在预算上比使用通用模型如GPT-4更为经济。

开源模型是一个吸引人的解决方案,但接下来的挑战是什么呢?不像使用像OpenAI这样的模型端点,其中模型是API背后的一个可扩展的黑盒子,部署您自己的开源模型引入了扩展挑战。确保您的模型能够有效地随生产流量扩展,并在流量高峰期间保持流畅的体验至关重要。此外,高效管理成本也很重要,这样您只需为实际使用的资源付费,避免月底时出现经济上的意外。

真正的解决方向:用于GPU的无服务器功能。有趣的是,这听起来像是现代无服务器架构(如AWS Lambda)已经解决的挑战——这种解决方案已经存在了近十年。然而,当涉及到AI模型部署时,情况并非如此。

用于AI部署的无服务器功能的限制是多方面的。

  1. 没有GPU支持。像AWS Lambda这样的平台不支持GPU。这不仅仅是技术疏忽;它植根于架构和实际考虑。
  2. GPU不能轻易共享。GPU虽然是高度可并行的设备,但在同时处理多个模型的多个推理任务上不够灵活。
  3. GPU昂贵。它们适用于模型推理任务,但维护成本高昂,特别是如果不连续使用的话。

接下来,让我们来看看我们的扩展旅程以及我们途中学到的重要教训。

冷启动问题


在我们开始着手扩展之前,我们遇到了臭名昭著的“冷启动”问题。这个问题在三个不同阶段表现出来:

云服务配置:

这一阶段涉及云服务商分配实例并将其整合到我们的集群中所需的时间。这一过程变化很大,快则30秒,慢则几分钟,甚至在某些情况下,特别是对于需求高的实例,如Nvidia A100和H100 GPU,可能需要几个小时。


容器镜像拉取:

与简单的Python工作镜像不同,AI模型服务镜像非常复杂,因为它们需要依赖和自定义库。虽然云服务商提供的网络带宽高达数千兆,但我们的经验常常看到下载速度远低于这一数字,镜像拉取时间约为3分钟。


模型加载

这里所需的时间大多取决于模型的大小,像LLM和扩散模型这样的大型模型因其数十亿参数而需要更长的时间。例如,加载一个5GB的模型,如Stable Diffusion 2,可能需要约1.3分钟,而更大的模型,如Llama 13B和Mixtral 8x7B,则可能需要3.5分钟和12.5分钟。

我们为每个冷启动问题阶段制定了具体策略,以尽量减少延迟。在接下来的部分中,我们将更详细地探讨每一个策略和解决方案。

云服务配置解决


与无服务器CPU的同质环境相比,处理GPU时管理各种计算实例类型至关重要,每种类型都针对特定用例进行了优化。例如,IO密集型的大型语言模型(LLMs)需要高GPU内存带宽和容量,而生成模型则需要更强大的GPU计算能力。

在流量高峰期间确保可用性,通过维护所有GPU实例类型可以导致成本过高。为了避免闲置实例带来的经济压力,我们实施了“待命实例”机制。我们没有为可能的最大负载做准备,而是保持了与增量扩展步骤大小相匹配的待命实例数量。例如,如果我们每次按两个GPU扩展,我们需要准备两个待命实例。这使我们能够在需求激增时迅速增加资源,大大减少等待时间,同时控制成本。

在多租户环境中,多个团队或者在我们的案例中,多个组织共享一个公共资源池,我们可以实现更高的利用率。这种共享环境允许我们平衡不同的资源需求,有助于提高成本效率。然而,管理多租户引入了挑战,比如执行配额和确保网络隔离,这可以增加集群的复杂性。

容器镜像拉取解决


无服务器CPU工作负载通常使用轻量级镜像,如Python slim镜像(约154MB)。与此形成鲜明对比的是,为服务LLM构建的容器镜像可能要大得多(6.7GB);这种大小的大部分来自运行AI模型所需的各种依赖。

尽管云服务商宣传具有高带宽网络,实际情况往往不尽如人意,实际下载速度只是承诺速率的一小部分。实际上,很大一部分文件从未被使用过。一种方法是优化容器镜像本身,但这很快被证明是难以管理的。相反,我们转而专注于按需文件拉取方法。具体来说,我们首先只下载镜像元数据,实际的远程文件稍后根据需要再获取。此外,我们利用集群内的点对点网络大幅提高了拉取效率。

通过这些优化,我们将镜像拉取时间从几分钟减少到了几秒钟。然而,我们都知道这种测量方法是“作弊”,因为实际文件此时还未拉取。真正的文件拉取发生在服务运行时。因此,建立一个服务框架,允许您在不同的生命周期阶段定义行为,如初始化和服务是至关重要的。通过在初始化期间完成所有引导工作,我们可以确保所有文件依赖都已拉取。这样,当服务时间到来时,就不会因文件拉取而造成延迟。

模型加载解决


最初,模型加载的最直接方法是从远程存储库如Hugging Face直接获取。使用内容交付网络(CDNs)、NVMe SSDs和共享内存,我们可以消除一些瓶颈。虽然这种方法有效,但远非最佳。

为了改进这一过程,我们考虑使用区域内网络带宽。我们在分布式文件系统中对模型进行了分块,允许并行下载。这极大地提高了性能,但我们仍然遇到了云提供商的网络带宽瓶颈。

为了应对这一问题,我们进一步优化利用集群内网络带宽通过点对点共享和利用本地缓存。虽然改进显著,但它们增加了过程的复杂性,我们需要从开发者那里抽象出来。

即使采用了上述做法,我们仍然遭受一个序列化瓶颈:需要等待每个步骤完成后才能进行下一个步骤。模型必须完全下载到持久驱动器,然后才能加载到CPU内存中,再转移到GPU。

我们转向使用基于流的方法加载模型权重,利用我们已经建立的分布式文件缓存系统。这个系统允许程序操作,仿佛所有文件逻辑上都在磁盘上可用。实际上,所需数据是按需从远程存储中获取的,因此绕过了磁盘写入。通过使用像Safetensors这样的格式,我们可以通过内存映射(mmap)高效地将模型权重加载到主内存中,然后以流式方式加载到GPU内存中。

此外,我们采用了异步写入磁盘的方法。这样做,我们在本地磁盘上创建了一个更快访问的缓存层。因此,仅有代码更改的新部署可以绕过较慢的远程存储获取阶段,直接从本地缓存读取模型权重。

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

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

相关文章

java的深入探究JVM之类加载与双亲委派机制

前言 前面学习了虚拟机的内存结构、对象的分配和创建,但对象所对应的类是怎么加载到虚拟机中来的呢?加载过程中需要做些什么?什么是双亲委派机制以及为什么要打破双亲委派机制? 类的生命周期 类的生命周期包含了如上的7个阶段&a…

【Linux C | 多线程编程】线程同步 | 总结条件变量几个问题

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰: 本文未经允许…

visual studio连接ubuntu不成功原因(SSH问题)及解决办法

原因1: 网络没有互通(一般VMware) 使用ping来看网络是不是可以互通,例如: //这里的ip是ubuntu的ip,也可以从ubuntu的客户端ping一下当前主机 ping 192.168.1.101原因2: SSH没有密钥&#xf…

如何构建云原生安全?云安全的最佳实践

理解云原生安全 在数字时代,云计算已经成为企业的标配,大多数企业都已经将自己的应用程序和数据迁移到了云上。然而,随着企业规模不断扩大,云安全问题也逐渐浮出水面。云安全最新的趋势是云原生安全,这是指在云环境中构…

深入理解数据结构第六弹——排序(3)——归并排序

排序1:深入了解数据结构第四弹——排序(1)——插入排序和希尔排序-CSDN博客 排序2:深入理解数据结构第五弹——排序(2)——快速排序-CSDN博客 前言: 在前面,我们已经学习了插入排序…

基于Springboot+Vue的Java项目-在线视频教育平台系统(附演示视频+源码+LW)

大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &am…

解析OceanBase v4.2 Oracle 语法兼容之 LOCK TABLE

背景 在OceanBase V4.1及之前的版本中,尽管已经为Oracle租户兼容了LOCK TABLE相关的语法,包括单表锁定操作,和WAIT N, NOWAIT 关键字。但使用时还存在一些限制。例如:LOCK TABLE只能针对单表进行锁定,并不…

【数据结构|C语言版】顺序表

前言1. 初步认识数据结构2. 线性表3. 顺序表3.1 顺序表的概念3.1 顺序表的分类3.2 动态顺序表的实现 结语 前言 各位小伙伴大家好!小编来给大家讲解一下数据结构中顺序表的相关知识。 1. 初步认识数据结构 【概念】数据结构是计算机存储、组织数据的⽅式。 数据…

linux 云计算平台基本环境(知识准备篇)

为了更多的了解云计算平台,结合云计算和linux的知识写了一篇云计算的介绍和汇总。 文章目录 前言1. centos的软件管理1.1 yum软件包管理1.1.1 yum命令语法:1.1.2 安装软件包的步骤1.1.3 yum源 2. 主机名管理与域名解析3. centos的防火墙管理4. openstack…

EI级 | Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM多变量时间序列预测对比

EI级 | Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM多变量时间序列预测对比 目录 EI级 | Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM多变量时间序列预测对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 【EI级】Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM…

HCIP【ospf综合实验】

目录 实验要求: 实验拓扑图: 实验思路: 实验步骤: 一、划分网段 二、配置IP地址 三、搞通私网和公网 (1)先搞通私网(基于OSPF协议,在各个路由器上进行网段的宣告&#xff0c…

Visual Studio Code使用Flutter开发第一个Web页面

1、新建Flutter项目 查看(View)-命令面板( Command Palette…) 输入flutter 我的提示‘没有匹配的命令’ 遇到这种情况的处理方法: 打开 VS Code。 打开 View > Command Palette… (查看 > 命令面…

【VUE】Vue项目打包报告生成:让性能优化触手可及

Vue项目打包报告生成:让性能优化触手可及 Vue.js是一款流行的前端框架,开发者在使用Vue.js构建项目时,生产环境的性能优化尤为重要。为了帮助开发者分析和优化打包出来的资源,生成打包报告是一个不可或缺的步骤。本文将介绍几种在…

GD32F3系列单片机环境搭建STM32CubeMX版

GD32单片机介绍 使用到开发板 GD32F303C-START 芯片型号:GD32F303CGT6 PinToPin单片机型号:STM32F103 GD32F303CGT6是超低开发预算需求并持续释放Cortex-M4高性能内核的卓越动力,为取代及提升传统的8位和16位产品解决方案,直接进…

Linux Debian安装教程

Debian 是一个免费的开源操作系统,是最古老的 Linux 发行版之一,于 1993 年由 Ian Murdock 创建。它采用了自由软件协议,并且由志愿者社区维护和支持。Debian 的目标是创建一个稳定、安全且易于维护的操作系统,以自由软件为基础&a…

【C++】<入门>C++入门基础知识

C入门 1. 入门0. 本节知识点熟悉目的1. C关键字(C98) 2. 命名空间2.1 命名空间定义2.2 命名空间使用 3. C输入&输出4. 缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.1 函数重载概念5.2 C支持函数重载的原理--名字修饰(name Ma…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十二 简单图片添加水印效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十二 简单图片添加水印效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十二 简单图片添加水印效果 一、简单介绍 二、简单图片添加水印效果实现原理 三、简单图片添加水印效果案例…

自动驾驶时代的物联网与车载系统安全:挑战与应对策略

随着特斯拉CEO埃隆马斯克近日对未来出行景象的描绘——几乎所有汽车都将实现自动驾驶,这一愿景愈发接近现实。马斯克生动比喻,未来的乘客步入汽车就如同走进一部自动化的电梯,无需任何手动操作。这一转变预示着汽车行业正朝着高度智能化的方向…

排序(一)——插入排序 希尔排序

1.直接插入排序 直接插入排序是一种简单的插入排序,它的基本思想是: 把待排序的数据按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的数据都插入完位置,就得到了一个新的有序序列。 我们可以看到他的前提是…

部署ELFK+zookeeper+kafka架构

目录 前言 一、环境部署 二、部署ELFK 1、ELFK ElasticSearch 集群部署 1.1 配置本地hosts文件 1.2 安装 elasticsearch-rpm 包并加载系统服务 1.3 修改 elasticsearch 主配置文件 1.4 创建数据存放路径并授权 1.5 启动elasticsearch是否成功开启 1.6 查看节点信息 …