• Русский
  • Использование KServe Modelcar для хранения моделей

    Overview

    KServe Modelcar, также известный как хранение моделей на основе OCI-контейнеров, представляет собой мощный подход для развертывания моделей в облачно-нативных средах. Упаковывая модели в виде OCI-контейнерных образов, вы можете использовать возможности контейнерного рантайма для достижения более быстрого времени запуска и более эффективного использования ресурсов.

    Преимущества использования OCI-контейнеров для хранения моделей

    • Сокращение времени запуска: избегайте многократного скачивания одной и той же модели
    • Снижение использования дискового пространства: уменьшите количество локально загруженных моделей
    • Улучшение производительности модели: возможность предварительной загрузки образов для более быстрого старта
    • Поддержка офлайн-сред: идеально подходит для сред с ограниченным доступом в интернет
    • Упрощённое распространение моделей: используйте внутренние корпоративные реестры, такие как Quay или Harbor

    Требования

    • Установленная и работающая платформа Alauda AI
    • Готовые файлы модели для упаковки
    • Доступ к реестру контейнеров (например, Harbor, Quay)
    • Установленные Podman и nerdctl на локальной машине

    Упаковка модели в OCI-образ

    Вариант 1: Использование базового образа Busybox (рекомендация Alauda AI)

    Создайте Containerfile со следующим содержимым:

    # Используем легковесный busybox в качестве базового образа
    FROM busybox
     
    # Создаём директорию для модели и задаём права
    RUN mkdir -p /models && chmod 775 /models
     
    # Внимание: Harbor имеет ограничение на размер файла в одном слое образа.
    # Рекомендуется копировать большие файлы (например, 4GB .safetensors) по 2 файла на слой.
    # Последний слой должен копировать оставшиеся конфигурационные файлы модели.
    # Пример:
    # COPY models/model-00001-of-00004.safetensors models/model-00002-of-00004.safetensors /models/
    # COPY models/model-00003-of-00004.safetensors models/model-00004-of-00004.safetensors /models/
    # COPY models/*.json models/*.md models/*.txt /models/
    
    # Если размер не критичен, можно просто скопировать всё:
    COPY models/ /models/
     
    # Согласно конвенции KServe, загрузчику модели обычно нужны только слои образа
    # Нет необходимости держать процесс запущенным, но можно добавить CMD для отладки

    Вариант 2: Использование базового образа UBI Micro (рекомендация Red Hat)

    Создайте Containerfile со следующим содержимым:

    FROM registry.access.redhat.com/ubi9/ubi-micro:latest
    COPY --chown=0:0 models /models
    RUN chmod -R a=rX /models
    
    # пользователь nobody
    USER 65534

    Сборка и загрузка образа модели

    1. Создайте временную директорию для хранения модели и вспомогательных файлов:

      cd $(mktemp -d)
    2. Создайте папку models (и при необходимости поддиректорию версии для таких фреймворков, как OpenVINO):

      mkdir -p models/1
    3. Скопируйте файлы модели в соответствующую директорию:

      • Для большинства фреймворков: cp -r your-model-folder/* models/
      • Для OpenVINO: cp -r your-model-folder/* models/1/
    4. Соберите OCI-контейнерный образ:

      # С использованием Podman
      podman build --format=oci -t <registry>/<repository>:<tag> .
      
      # С использованием nerdctl
      nerdctl build -t <registry>/<repository>:<tag> .
    5. Загрузите образ в реестр контейнеров:

      # С использованием Podman
      podman push <registry>/<repository>:<tag>
      
      # С использованием nerdctl
      nerdctl push <registry>/<repository>:<tag>

      Примечание Если ваш репозиторий приватный, убедитесь, что вы аутентифицированы в реестре перед загрузкой образа.

    Развёртывание модели из OCI-образа

    Требования для развёртывания

    Дополнительных требований, кроме перечисленных выше, не требуется.

    Создание InferenceService

    Создайте YAML-файл InferenceService со следующим содержимым:

    kind: InferenceService
    apiVersion: serving.kserve.io/v1beta1
    metadata:
      annotations:
        aml-model-repo: Qwen2.5-0.5B-Instruct
        aml-pipeline-tag: text-generation
        serving.kserve.io/deploymentMode: Standard
      labels:
        aml-pipeline-tag: text-generation
        aml.cpaas.io/runtime-type: vllm
      name: oci-demo
      namespace: demo-space
    spec:
      predictor:
        maxReplicas: 1
        minReplicas: 1
        model:
          modelFormat:
            name: transformers
          protocolVersion: v2
          resources:
            limits:
              cpu: '2'
              ephemeral-storage: 10Gi
              memory: 8Gi
            requests:
              cpu: '2'
              memory: 4Gi
          runtime: aml-vllm-0.11.2-cpu
          storageUri: oci://<registry>/<repository>:<tag>
        securityContext:
          seccompProfile:
            type: RuntimeDefault
    1. Замените Qwen2.5-0.5B-Instruct на фактическое имя вашей модели.
    2. aml.cpaas.io/runtime-type: vllm указывает тип рантайма кода. Подробнее о кастомных inference runtime смотрите в разделе Extend Inference Runtimes.
    3. Замените demo-space на существующее namespace или создайте его командой kubectl create namespace demo-space.
    4. Замените aml-vllm-0.11.2-cpu на имя рантайма, уже установленного в вашей платформе (соответствующего экземпляру CRD ClusterServingRuntime).
    5. storageUri указывает URI OCI-образа с тегом, где хранится модель. Используйте полностью квалифицированный URL реестра. Например: storageUri: oci://docker.io/alaudadockerhub/models-qwen2.5:v1

    Применение InferenceService

    Примените конфигурацию InferenceService с помощью kubectl:

    kubectl apply -f oci-inference-service.yaml

    Проверка развёртывания

    Проверьте статус InferenceService:

    kubectl get inferenceservices -n demo-space

    Вы увидите сервис в состоянии Ready после успешного развёртывания.

    Если сервис не запускается или остаётся в состоянии неготовности, выполните отладку:

    1. Просмотрите события InferenceService для получения описательных ошибок:
      kubectl describe inferenceservice oci-demo -n demo-space
    2. Просмотрите логи пода предиктора:
      kubectl logs -n demo-space -l serving.kserve.io/inferenceservice=oci-demo
    3. Проверьте, что образ модели можно успешно загрузить локально на кластере:
      # На узле кластера
      crictl pull <registry>/<repository>:<tag>

    Рекомендации по лучшим практикам

    1. Версионирование моделей: используйте теги в контейнерных образах для версионирования моделей
    2. Оптимизация размера образа: используйте легковесные базовые образы и включайте только необходимые файлы модели
    3. Управление реестром: используйте приватные реестры с правильным контролем доступа
    4. Безопасность: следуйте лучшим практикам безопасности контейнеров, включая регулярное сканирование уязвимостей
    5. Кэширование: используйте кэширование реестра контейнеров для ускорения загрузки

    Устранение неполадок

    Распространённые проблемы

    1. Ошибки разрешений: убедитесь, что файлы модели в образе имеют корректные права доступа
    2. Аутентификация в реестре: проверьте, что кластер имеет доступ к реестру контейнеров

    Заключение

    Использование KServe Modelcar (хранение моделей на основе OCI-контейнеров) обеспечивает эффективный способ развертывания моделей в платформе Alauda AI. Следуя шагам, описанным в этом руководстве, вы сможете упаковать модели в OCI-образы и развернуть их с более быстрым временем запуска и улучшенным использованием ресурсов.