3 月 19 日下午 2 点,锁定 NVIDIA AI 网络中文专场。立即注册观看
数据科学

使用 NVIDIA NIM 和 Outerbounds 构建 LLM 驱动的生产系统

在过去 18 个月中,随着语言模型的快速扩展,如今有数百种变体可供选择。这些变体包括 大语言模型(LLMs)、小语言模型(SLMs)和特定领域的模型,其中许多模型可以免费用于商业用途。特别是对于 LLMs,使用自定义数据集进行微调的过程也变得越来越经济实惠和简单。

随着 AI 模型的成本降低且更易于访问,越来越多的现实世界流程和产品成为潜在应用。考虑任何涉及非结构化数据的流程,包括支持工单、医疗记录、事故报告、剧本等。

所涉及的数据通常很敏感,而结果对业务至关重要。虽然 LLMs 让黑客快速演示变得轻而易举,但为开发和部署 LLM 驱动的应用建立适当的流程和基础设施并非易事。所有常见的企业问题仍然适用,包括如何:

  1. 安全可靠地访问数据、部署和操作系统。
  2. 在整个组织内建立快速、高效的开发流程。
  3. 随着该领域快速发展,衡量和促进持续改进。

在企业环境中部署大型语言模型(LLMs)需要一种安全且结构良好的 机器学习(ML) 基础架构、开发和部署方法。

本文介绍了 NVIDIA NIM 微服务和 Outerbounds 平台如何共同高效、安全地管理大型语言模型和围绕它们构建的系统。特别是,我们专注于将大型语言模型集成到企业环境中,同时遵循既定的持续集成和持续部署 (CI/CD) 最佳实践。

NVIDIA NIM 为自行托管的 GPU 加速微服务提供容器,用于在云、数据中心和工作站上部署预训练和定制的 AI 模型。Outerbounds 是 Netflix 开发的领先 MLOps 和 AI 平台,由热门开源框架 Metaflow 提供支持。

使用 NVIDIA NIM 构建大型语言模型驱动的企业应用

无需向第三方服务发送数据,即可轻松缓解大量安全和数据治理问题。这是 NVIDIA NIM 的关键价值主张。NVIDIA NIM 是一种微服务,可提供大量由社区创建的预包装和优化的 LLM,可部署在公司的私有环境中。

自 NIM 首次发布以来,Outerbounds 一直在帮助公司开发基于 LLM 的企业应用和 公开示例 NIM 现已集成到 Outerbounds 平台中 ,使开发人员能够 跨云和本地资源 安全部署。在此过程中,Outerbounds 开始识别新兴模式和最佳实践,尤其是围绕基础设施设置和开发工作流程的模式和最佳实践。

大语言模型运算(LLMOps)的概念已经被提出,以涵盖这些实践。但是,不要被名称所误导。LLMOps 集中在管理大语言模型依赖项和操作的挑战上,而 MLOps 则覆盖了更广泛的任务,包括跨不同领域和应用程序监督机器学习模型的各种任务。

讨论的许多主题都是借鉴软件工程的既定最佳实践。事实上, 使用与任何稳健软件相同的原则开发大型语言模型驱动的系统 是有好处的,同时特别注意大型语言模型的随机性和自然语言提示所带来的额外挑战,以及它们的独特计算需求。

以下各节重点介绍了任何严肃认真的系统都需要解决的三个主要方面的学习:

  • 生产开发实践
  • 协作和持续改进
  • 稳健的生产部署

这三个领域是使用 NVIDIA NIM 构建由 LLM 驱动的企业应用的关键组成部分。生产开发实践利用 NIM 的微服务在私有环境中安全地试验、微调和测试 LLM。协作和持续改进可确保团队能够高效地迭代模型、监控性能并适应变化。借助 NIM 的生产部署,企业可以安全地扩展由 LLM 驱动的应用,无论是在云端还是本地,从而确保这些系统从开发阶段转向实际使用时的稳定性和性能。

此讨论侧重于文档理解等批量用例,但所讨论的许多元素也适用于实时用例。

第 1 阶段:开发由 LLM 支持的系统 

构建由大型语言模型(LLM)提供支持的系统的第一阶段侧重于建立高效的开发环境,以实现快速迭代和实验。NVIDIA NIM 微服务通过提供可部署在安全、私有环境中的优化 LLM 发挥着关键作用。这一阶段涉及微调模型、构建工作流以及使用真实数据进行测试,同时确保数据控制并最大限度地提高 LLM 性能。我们的目标是建立坚实的开发流程,支持隔离环境和无缝 LLM 集成。

A diagram showing a development environment that includes workstations, local GPU resources, and a shared compute pool hosting NVIDIA NIM containers and additional GPU resources.
图 1. 使用 NVIDIA NIM 微服务的开发环境。

Outerbounds 首先关注开发阶段,发现以下要素有助于开发由 LLM 驱动的应用,尤其是在处理敏感数据时:

  • 在云环境中运行
  • 在隔离的开发环境中使用本地计算资源
  • 更大限度地提高 LLM 吞吐量以降低成本
  • 支持特定领域的评估
  • 通过微调自定义模型

在云环境中运行

Outerbounds 可帮助您在自己的云帐户中部署图 1 所示的开发环境,以便您可以根据现有的数据治理规则和边界开发由 NIM 提供支持的 AI 应用。此外,您可以使用现有的计算资源托管模型,而无需为 LLM 推理 支付额外的利润。

具有本地计算资源的灵活隔离开发环

图 1 中的两个示例提供了个人开发环境,您可以在此环境中自由运行,而不会产生干扰其他应用程序的风险。这有助于更大限度地提高开发速度。NIM 提供了 OpenAI 兼容的 API,可让用户使用现成的框架来达到私有端点,并为每个作业选择合适的工具。除了在个人 Jupyter Notebook 中探索和开发之外,您还可以使用 开源 Metaflow 构建端到端工作流。Metaflow 是一个 Python 库,用于开发、部署和运行各种数据密集型应用,尤其是涉及数据科学、机器学习和人工智能的应用。Outerbounds 通过 @nim 装饰器扩展了 Metaflow,从而可以直接将 LLM NIM 微服务嵌入到更大的工作流中:

MODEL = "meta/llama3-70b-instruct"

PROMPT = "answer with one word HAPPY if the sentiment of the following sentence is positive, otherwise answer with one word SAD"

@nim(models=[MODEL])
class NIMExample(FlowSpec):
  ...
  @step
  def prompt(self):
    llm = current.nim.models[MODEL]
    prompt = {"role": "user", "content": f"{PROMPT}---{doc}"}
    chat_completion = llm(messages=[prompt], max_tokens=1)
    print('response', chat_completion['choices'][0]['message']['content'])

作为开发者,您可以在工作站上本地执行类似的流,访问测试数据并使用开发环境中可用的任何 NIM 微服务,快速迭代提示和模型。有关涉及 @nim 的端到端示例,请参阅 350M Tokens Don’t Lie 其随附的源代码

更大限度地提高 LLM 吞吐量以降低成本

与许多第三方 API 不同,您可以在自己的环境中调用 NIM 端点,而无需担心速率限制。得益于诸如 动态批处理 等各种 NIM 优化,您可以通过并行化提示来提高总吞吐量。有关更多详细信息,请参阅 使用 NVIDIA NIM 微服务大规模优化 LLM 的推理效率

对于 350M Tokens Don’t Lie 示例,Outerbounds 使用 LLama 3 70B 模型在 NIM 容器中执行 5 个并发工作任务,在大约 9 小时内处理了 230 million 个输入令牌(图 2)。该模型在 4 个 NVIDIA H100 Tensor Core GPU 上运行。

由于 NIM 微服务在环境中托管的 NVIDIA GPU 上运行和自动扩展,因此吞吐量越高,成本越低。

Figure shows a timeline of multiple batches of five tasks prompting NIM microservices.
图 2. 在 Outerbounds 上运行的具有五个并发工作进程的 NIM 微服务

支持特定领域的评估

虽然衡量和基准测试原始性能可能很容易,但在评估 LLM 响应的质量时,很难作出具体规定。一般来说,您需要在数据和应用的背景下评估响应,而不是依赖现成的基准测试或数据集。

Outerbounds 发现,构建特定于案例的评估集(有时由自定义 UI 支持)非常有用。这使您能够快速评估结果并迭代提示。有关示例,请参阅 扩展 LLM 驱动的文档理解

通过微调支持模型自定义

借助现已推出的功能强大的大型语言模型,您通常可以通过及时的工程设计获得出色的结果。然而,如果有需要,能够使用自定义数据集微调模型,将会非常有用。

虽然可以通过继续训练 LLM 进行微调,但这需要大量的计算资源。作为对所有模型参数进行微调的替代方案,通常会利用 参数高效微调(Parameter-Efficient Fine Tuning,PEFT) 技术,该技术只会更改模型参数的子集。这可以用更少的计算资源完成。

幸运的是, NIM 支持开箱即用的 PEFT 微调 ,因此您可以将 NIM 与自定义模型结合使用,而无需手动设置推理堆栈。

如果您对技术细节感兴趣,请查看 Outerbounds 提供的用于微调的新功能 ,包括 使用 Metaflow 和 Hugging Face 创建适配器并通过 NIM 提供服务 的端到端示例。该工作流和说明展示了如何借助几个命令和几百行 Python 代码来完全控制自定义工作流,从而定制最强大的开源 LLM。

例如,考虑图 1 中描述的开发环境。为了支持快速迭代,工作站配备了中等规模的本地 GPU,从而实现快速代码开发。对于更大规模的微调,开发者可以利用公司计算池中的更大 GPU 集群。在这两种情况下,在部署到生产环境之前,可以在开发环境中快速评估微调模型。

第 2 阶段:持续改进 LLM 系统 

由高性能 LLM 提供支持的可提高工作效率的开发环境可实现快速开发迭代。但是,速度并不是一切。Outerbounds 希望确保开发者可以在不破坏工作的情况下快速发展,并力求在长期内实现一致、持续的改进。GitOps 是一种使用 Git 维护版本控制和持续改进的框架,是确保实现这一点的好方法。

在开发环境中引入适当的版本控制、跟踪和监控有助于实现这一目标(图 2)。

A diagram showing a development environment that supports iterative development through versioning, tracking and monitoring, building on Figure 1.
图 3. 向开发环境中添加版本控制、跟踪和监控。

版本控制代码、数据、模型和提示

在使用 Git 或类似工具进行版本控制时,跟踪提示、提示响应和所用模型的最佳方式是什么?

这正是 Metaflow 内置构件 派上用场的地方。Metaflow 会自动保持整个工作流状态,因此通过将提示和响应视为构件,所有内容都会在默认情况下进行版本控制, 并可轻松用于后期分析 。值得注意的是, 构件会自动按命名空间组织和命名 ,因此开发者团队可以并发地合作。

此外,您可以使用 Metaflow 标签 来帮助协作,为特别成功的提示和运行添加注释,以便其他人轻松重复使用。

将 LLM 纳入软件供应链

在由大型语言模型(LLM)提供支持的现代系统中,一个关键但常常被忽略的部分是,与任何其他软件库类似,LLM 需要被视为系统的核心依赖项。换言之,LLM(确切地说,LLM 的特定版本)成为软件供应链的一部分。如需了解详情,请参阅 具有安全软件依赖项的安全机器学习

想象一下,在开发期间运行良好并通过初始评估的系统可能会随着 辅助 LLM 的失控变化 而突然中断或缓慢腐蚀。当使用第三方 API 时,必须相信供应商不会更改模型。由于模型快速发展,这一点很困难。

在您的环境中部署 NIM 微服务可让您控制整个模型生命周期。特别是,您可以将模型视为系统的适当依赖项,将特定提示和评估与精确的模型版本相关联,直至生成结果的容器镜像的哈希值。

监控 NIM 微服务

除了跟踪和存储伪影和指标外,您还可以在整个流程中分析关键点,使所有内容都易于观察。其中一种方法是使用 Metaflow 卡 ,该卡支持您将自定义的版本化可视化附加到工作流程中。

在 Outerbounds 上运行时, @nim 自动收集有关 NIM 性能的指标,如图 4 所示。

A visualization showing NIM response successes and latencies.
图 4. 可视化 NIM 响应成功率和延迟的 Metaflow 卡。

除低级指标外,您还可以 自定义 Metaflow 卡 ,以显示与用例相关的指标。例如,监控数据漂移,并在响应准确性降低到特定阈值以下时发出警报。

第 3 阶段:CI/CD 和生产部署 

在最后一个阶段,重点转向集成持续集成和持续交付实践,以确保大型语言模型(LLM)驱动的系统顺利、可靠地进行生产部署。通过实施自动化流程,组织可以在保持稳定性的同时不断改进和更新其 LLM 模型。这一阶段强调了逐步部署、监控和版本控制的重要性,以管理实时环境中 LLM 系统的复杂性。

将 LLM 移动到生产环境中通常被视为一个二元里程碑,跨越这一点标志着项目的成功完成。然而,在按下部署按钮之后,现代的业务关键型系统仍然是不完整的。

A figure showing development and production environments side by side, connected through a CI/CD system, building on Figure 3.
图 5. 添加生产环境,通过 CI/CD 系统连接到开发环境

通过 CI/CD 系统持续交付

根据 DevOps 最佳实践,LLM 驱动的系统应通过 CI/CD 流水线(如 GitHub Actions)进行部署。此设置支持持续部署系统改进,这对于正在进行快速迭代的系统(LLM 的常见场景)至关重要。随着时间的推移,优化提示、微调模型和升级底层 LLM,尤其是在新模型每隔几个月发布一次的情况下。

与其将“部署”视为一次性操作,不如将其视为逐步推出。由于 LLM 具有随机性,因此很难判断新版本是否优于旧版本,而无需将其暴露于实时数据中。换言之,首先将其部署为 A/B 实验,或者作为与生产并行运行的影子部署。

这种方法会在生产环境中同时生成多个版本的 LLM:现有的生产版本以及许多挑战性模型。由于您可以控制 NIM 模型,因此可以在自己的环境中更可靠地管理类似这样的部署。 有关更多详细信息,请参阅如何组织 ML/AI 系统的持续交付:10 阶段成熟度模型。

隔离业务逻辑和模型,统一计算。

为了实现稳定、高可用的生产部署,它们必须与开发环境安全隔离。在任何情况下,开发都不应干扰生产(反之亦然)

在 LLMs 的情况下,您可能希望尝试使用最新和最好的模型,同时在生产环境中使用更保守的模型。此外,在跟踪和监控生产系统时,您可能需要控制谁有权访问生产模型响应,尤其是在涉及敏感数据时。例如,您可以通过为生产和实验设置单独的云帐户来实现这一点。您还可以使用具有基于角色的访问控制的 Outerbounds 边界来设置所需的权限边界

尽管通常严格要求隔离逻辑和数据,但在整个开发和生产过程中使用共享计算池通常有助于提高利用率,从而降低宝贵的 GPU 资源的成本。例如,您可以拥有一个统一的 GPU(云)硬件集群,但在两个环境中部署一组单独的 NIM 模型,以保证生产环境有足够的容量和隔离。如需了解详情, 请参阅成本优化的 ML/AI/数据工作负载的 6 个步骤

将大型语言模型(LLM)驱动的系统集成到周围环境

Outerbounds 上由 LLM 提供支持的系统并不是孤立的孤岛。它们连接到上游数据源,例如数据仓库,并且下游系统会使用它们的结果。这给部署带来了额外的挑战,因为它们必须与其他系统很好地协同工作。

您可以使用 Metaflow 事件触发器, 让系统实时响应上游数据源的变化 。当与下游系统集成时,强版本控制和隔离部署是必须的,以避免无意中破坏结果的消费者兼容性。

开始使用 NVIDIA NIM 和 Outerbounds 构建大型语言模型驱动的生产系

在许多方面,使用大型语言模型(LLM)驱动的系统时,应与使用随机输入和输出的任何其他大型软件系统类似。LLM 的存在类似于内置的 Chaos Monkey,在正确使用时,必须从设计上构建更为强大的系统。

LLMs 是一种新型软件依赖项,发展速度极快,因此必须进行相应的管理。NVIDIA NIM 可将 LLM 作为标准容器镜像提供,从而在不牺牲创新速度的情况下,利用经过战斗强化的最佳实践构建稳定和安全的生产系统。

开始使用 NVIDIA NIM 和 Outerbounds

 

标签