模型存储-OCI

type
status
date
slug
summary
tags
category
icon
password
网址
KServe传统的模型初始化方法涉及从S3存储桶URI等来源获取模型。这个过程对于小型模型来说是足够的,但对于大型模型(如大语言模型)来说会成为瓶颈,在自动扩展场景中显著延长启动时间。
"Modelcars"是一个专门解决这些挑战的KServe功能。它通过使用OCI镜像简化了模型获取过程,提供了以下几个优势:
  • 减少启动时间:通过避免重复下载大型模型,显著减少启动延迟。
  • 降低磁盘空间使用:该功能减少了对重复本地存储的需求,节省磁盘空间。
  • 提升性能:Modelcars支持预取镜像和延迟加载等高级技术,提高效率。
  • 兼容性和集成性:它可以与现有的KServe基础设施无缝集成,确保易于采用。
Modelcars代表了高效模型服务的一个进步,特别适用于处理大型模型和动态服务环境。

启用Modelcars

KServe中的Modelcars功能默认是未启用的。要使用这种新的模型服务方法,需要在KServe配置中激活它。按照以下步骤在您的环境中启用Modelcars。
可以通过修改inferenceservice-config ConfigMap中的storageInitializer配置来启用Modelcars。这可以通过手动使用kubectl edit来完成,或者执行下面提供的脚本,当前命名空间需要设置为安装kserve-controller-manager的命名空间(取决于KServer的安装方式)。

准备包含模型数据的OCI镜像

要使用Modelcars来服务模型,您需要准备一个包含模型数据的OCI(开放容器倡议)镜像。这个过程包括创建一个Dockerfile并构建一个在特定目录中存放模型的OCI镜像。以下是指导您完成此过程的步骤和示例。
  1. 创建Dockerfile:首先创建一个Dockerfile,使用包含必要命令(如用于创建符号链接的ln和用于保持容器运行的sleep)的基础镜像。Dockerfile还应包括创建目录/model用于存放模型数据,并将数据复制到该目录的步骤。以下是一个示例Dockerfile,其中data/目录包含您的模型数据。这些数据随后将由运行时挂载到/mnt/models
    1. 构建并推送镜像到镜像仓库:一旦您的Dockerfile准备就绪,使用docker或podman构建镜像并将其推送到容器镜像仓库(如Docker Hub或quay.io
      完成这些步骤后,您就有了一个准备就绪的OCI镜像,其中包含模型数据,可以与KServe的Modelcars功能一起使用,实现高效的模型服务。
       

      使用Modelcars

      启用Modelcars并准备好包含模型数据的OCI镜像后,将此设置集成到您的InferenceService中非常简单。关键步骤是在InferenceService配置中使用oci://协议指定storageURI来指向您的OCI镜像。
      以下是使用Modelcars功能时InferenceService配置的示例:
      为了充分利用Modelcars设置中OCI镜像的本地缓存功能,使用特定的模型镜像标签至关重要,而不是依赖默认的latest标签。例如,在提供的示例中使用了标签1.0。这种方法确保modelcar镜像使用IfNotPresent策略拉取,从而有效利用本地缓存。相反,使用latest标签或完全省略标签会默认使用Always拉取策略。这意味着每次Pod重启或扩展时都会重新下载镜像,从而失去本地缓存的优势,可能导致启动时间增加。

      示例

      让我们通过使用OCI镜像部署入门示例来了解modecars的工作原理,并检查它与使用storage-initalizer初始化容器的启动有何不同。
      假设您已经设置了启用KServe的命名空间kserve-test,创建一个使用oci://存储URL的InferenceService
      InferenceService成功部署后,您可以按照入门示例的步骤验证安装。
      最后,让我们简单了解一下这个功能的工作原理。首先检查运行时pod:
      示例输出
      如您所见,Pod现在有一个额外的容器。这个容器运行modelcar镜像并执行ln -sf /proc/$$/root/models /mnt/命令,在modelcar容器和服务运行时容器中挂载在/mnt的共享空卷上创建符号链接。这里的魔法在于通过proc文件系统创建的符号链接,它在所有容器之间共享。在Kubernetes中,如果设置了字段.spec.shareProcessNamespacetrue,Pod的容器之间就可以实现这一点,这适用于所有使用oci://协议的storageUri。
      让我们进入运行时容器并检查挂载的/mnt文件系统:
      容器内会话示例
      如您所见,运行时可以直接访问来自modelcar镜像的数据,无需预先将其复制到另一个卷中。

      配置

      通过推理服务的全局配置设置,可以对KServe中的Modelcars行为进行微调。这些设置位于inferenceservice-config ConfigMap中,该ConfigMap位于kserve命名空间或KServe控制器运行的命名空间中。这个ConfigMap包含各种子配置,其中Modelcars配置位于storageInitializer条目下。
      要查看当前配置,请使用以下命令:
      示例输出
      输出是表示配置的JSON字符串。对于Modelcars,可以自定义以下几个键:
      描述
      示例
      enableModelcar
      启用使用"oci://"协议的源URL直接访问OCI容器镜像。
      true
      cpuModelcar
      modelcar容器的CPU请求和限制。
      10m
      memoryModelcar
      modelcar容器的内存请求和限制。
      15Mi
      uidModelcar
      modelcar进程和主容器运行时使用的UID。如果需要root权限,设置为0。如果未设置,则使用容器的UID。
      1042

      参考资料

      • Modelcar设计文档
      • 原始GitHub问题(同时讨论了一些替代解决方案)
      • 12分钟演示
      • 代码演示展示了KServe中Modelcars的实现(用于背景信息)
      上一篇
      模型存储-S3
      下一篇
      模型存储-URI
      Loading...
      文章列表
      Kserve中文文档
      快速开始
      管理指南
      用户指南
      开发指南
      机器学习概念
      大模型周报