• Русский
  • Как определить модель стоимости vGPU (Hami)

    Предварительные требования

    В GPU-кластере должны быть установлены:

    • Alauda Build of Hami
    • Агент управления стоимостью (Cost Management Agent)

    О Alauda Build of Hami

    Heterogeneous AI Computing Virtualization Middleware (HAMi), ранее известный как k8s-vGPU-scheduler, — это универсальный чарт для управления гетерогенными AI-вычислительными устройствами в кластере k8s. Он обеспечивает возможность совместного использования гетерогенных AI-устройств между задачами.

    Note
    Поскольку выпуски Alauda Build of Hami осуществляются в ином режиме, чем у Alauda Container Platform, документация Alauda Build of Hami теперь доступна в виде отдельного набора по адресу Alauda Build of Hami

    Процедура

    Создание PrometheusRule для генерации необходимых метрик

    Создайте PrometheusRule в кластере Hami.

    apiVersion: monitoring.coreos.com/v1
    kind: PrometheusRule
    metadata:
      labels:
        prometheus: kube-prometheus
      name: hami-gpu-labels
      namespace: kube-system
    spec:
      groups:
        - name: hami-gpu-labels.rules
          rules:
            - expr: |
                min by (podnamespace, deviceuuid, label_modelName, label_device) (
                  vGPUCorePercentage
                  * on (deviceuuid) group_left(label_modelName, label_device) (
                    label_replace(
                      label_replace(
                        label_replace(
                          DCGM_FI_DEV_SM_CLOCK,
                          "deviceuuid", "$1", "UUID", "(.*)"
                        ),
                        "label_modelName", "$1", "modelName", "(.*)"
                      ),
                      "label_device", "$1", "device", "([a-zA-Z]+)[0-9]+$"
                    )
                  )
                )
              record: vgpu_core_labels

    Добавление конфигурации сбора (Cost Management Agent)

    Создайте ConfigMap в кластере Hami, где запущен Cost Management Agent, чтобы указать, что собирать.

    Примечание: конфигурация project quota поддерживается только в hami 2.7+

    apiVersion: v1
    data:
      config: >
        - kind: vGPU
          category: vGPUCore
          item: vGPUCoreQuota
          period: Hourly
          labels:
            query: "vgpu_core_labels{}"
            mappers:
              name: deviceuuid
              namespace: podnamespace
              cluster: ""
              project: ""
          usage:
            query: sum by (deviceuuid,podnamespace) (avg_over_time(vGPUCorePercentage{}[5m]))
            step: 5m
            mappers:
              name: deviceuuid
              namespace: podnamespace
              cluster: ""
              project: ""
        - kind: vGPU
          category: vGPUMemory
          item: vGPURamBytesQuota
          period: Hourly
          labels:
            query: "vgpu_core_labels{}"
            mappers:
              name: deviceuuid
              namespace: podnamespace
              cluster: ""
              project: ""
          usage:
            query: sum by (deviceuuid,podnamespace) (avg_over_time(vGPU_device_memory_limit_in_bytes{}[5m]))
            step: 5m
            mappers:
              name: deviceuuid
              namespace: podnamespace
              cluster: ""
              project: ""
        - kind: vGPU
          category: vGPUCore
          item: vGPUCoreUsed
          period: Hourly
          labels:
            query: "vgpu_core_labels{}"
            mappers:
              name: deviceuuid
              namespace: podnamespace
              cluster: ""
              project: ""
          usage:
            query: sum by (deviceuuid,podnamespace) (avg_over_time(Device_utilization_desc_of_container{}[5m]))
            step: 5m
            mappers:
              name: deviceuuid
              namespace: podnamespace
              cluster: ""
              project: ""
        - kind: vGPU
          category: vGPUMemory
          item: vGPURamBytesUsed
          period: Hourly
          labels:
            query: "vgpu_core_labels{}"
            mappers:
              name: deviceuuid
              namespace: podnamespace
              cluster: ""
              project: ""
          usage:
            query: sum by (deviceuuid,podnamespace) (avg_over_time(vGPU_device_memory_usage_in_bytes{}[5m]))
            step: 5m
            mappers:
              name: deviceuuid
              namespace: podnamespace
              cluster: ""
              project: ""
    kind: ConfigMap
    metadata:
      labels:
        cpaas.io/slark.collection.config: "true"
      name: slark-agent-vgpu-namespace-config
      namespace: cpaas-system
    ---
    # Note: The following configmap is only supported in hami 2.7+
    apiVersion: v1
    data:
      config: >
        - kind: Project
          category: vGPUCore
          item: vGPUCoresProjectQuota
          period: Hourly
          usage:
            query: avg by (project, cluster) (avg_over_time(cpaas_project_resourcequota{resource="limits.nvidia.com/gpucores", type="project-hard"}[5m]))
            step: 5m
            mappers:
              name: project
              namespace: ""
              cluster: cluster
              project: project
        - kind: Project
          category: vGPUMemory
          item: vGPURamBytesProjectQuota
          period: Hourly
          usage:
            query: avg by (project, cluster) (avg_over_time(cpaas_project_resourcequota{resource="limits.nvidia.com/gpumem", type="project-hard"}[5m]))
            step: 5m
            mappers:
              name: project
              namespace: ""
              cluster: cluster
              project: project
    kind: ConfigMap
    metadata:
      labels:
        cpaas.io/slark.collection.config: "true"
      name: slark-agent-project-config-vgpu
      namespace: cpaas-system

    После добавления yaml необходимо перезапустить Pod агента для перезагрузки конфигураций.

    kubectl delete pods -n cpaas-system -l service_name=slark-agent

    Добавление конфигурации отображения/хранения (Cost Management Server)

    Создайте ConfigMap в кластере, где запущен Cost Management Server, чтобы определить элементы биллинга, методы, единицы измерения и отображаемые имена. Это указывает серверу, что и как учитывать в биллинге.

    Примечание:
    Использование Request Usage без включения GPU Overcommitment Ratio бессмысленно. Если вы используете Request Usage, пожалуйста, включите GPU Overcommitment Ratio.

    apiVersion: v1
    data:
      config: |
        - name: vGPUCore
          displayname:
            zh: "HAMi NVIDIA vGPU Cores"
            en: "HAMi NVIDIA vGPU Cores"
          methods:
            - name: Request
              displayname:
                zh: "请求量"
                en: "Request Usage"
              item: vGPUCoreQuota
              divisor: 1
              unit:
                zh: "core-hours"
                en: "core-hours"
            - name: Usage
              displayname:
                zh: "使用量"
                en: "Used Usage"
              item: vGPUCoreUsed
              divisor: 1
              unit:
                zh: "core-hours"
                en: "core-hours"
            - name: ProjectQuota
              displayname:
                zh: "项目配额"
                en: "Project Quota"
              item: vGPUCoresProjectQuota
              unit:
                zh: "core-hours"
                en: "core-hours"
              divisor: 1
        - name: vGPUMemory
          displayname:
            zh: "HAMi NVIDIA vGPU Memory"
            en: "HAMi NVIDIA vGPU Memory"
          methods:
            - name: Request
              displayname:
                zh: "请求量"
                en: "Request Usage"
              item: vGPURamBytesQuota
              divisor: 1073741824
              unit:
                zh: "Gi-hours"
                en: "Gi-hours"
            - name: Used
              displayname:
                zh: "使用量"
                en: "Used Usage"
              item: vGPURamBytesUsed
              divisor: 1073741824
              unit:
                zh: "Gi-hours"
                en: "Gi-hours"
            - name: ProjectQuota
              displayname:
                zh: "项目配额"
                en: "Project Quota"
              item: vGPURamBytesProjectQuota
              unit:
                zh: "Gi-hours"
                en: "Gi-hours"
              divisor: 1024 # Mi/1024
    kind: ConfigMap
    metadata:
      labels:
        cpaas.io/slark.display.config: "true"
      name: slark-display-config-for-vgpu
      namespace: kube-public

    После добавления yaml необходимо перезапустить Pod сервера для перезагрузки конфигураций.

    kubectl delete pods -n cpaas-system -l service_name=slark

    Добавление цены для модели стоимости vGPU

    Если в GPU-кластере отсутствует модель стоимости, необходимо создать новую модель стоимости.
    Затем можно добавить цену для модели стоимости GPU-кластера:

    Описание методов биллинга

    Элемент биллингаМетод биллингаПравила биллингаОписание
    vGPUUsage (Core-hours)Рассчитывается почасово на основе AVG(Usage) POD за последний час, умноженного на фактическую продолжительность POD (если меньше 5 минут — считается 5 минут).Основано на фактическом потреблении vGPU
    vGPURequest (Core-hours)Рассчитывается почасово на основе Request POD за последний час, умноженного на фактическую продолжительность POD (если меньше 5 минут — считается 5 минут).Основано на запросах ресурсов vGPU
    vGPUProject Quota (Core-hours)Рассчитывается почасово на основе выделенного проекту лимита CPU quota, умноженного на время. Расчет сегментируется при изменении квоты.Основано на квотах ресурсов на уровне проекта
    vGPUMemoryUsage (GiB-hours)Рассчитывается почасово на основе AVG(Usage) POD за последний час, умноженного на фактическую продолжительность POD (если меньше 5 минут — считается 5 минут).Основано на фактическом потреблении памяти vGPU
    vGPUMemoryRequest (GiB-hours)Рассчитывается почасово на основе Request POD за последний час, умноженного на фактическую продолжительность POD (если меньше 5 минут — считается 5 минут).Основано на запросах памяти vGPU
    vGPUMemoryProject Quota (GiB-hours)Рассчитывается почасово на основе выделенного проекту лимита памяти, умноженного на время. Расчет сегментируется при изменении квоты.Основано на квотах ресурсов на уровне проекта

    Добавление цены для модели стоимости

    1. Выберите vGPU или vGPUMemory в Billing Items.

    2. Выберите Request Usage (core-hours) или Used Usage (core-hours) или Project Quota (core-hours) в Method.

    3. Установите Default Price.

    4. Настройте Price By Label (опционально).
      В настоящее время поддерживаются только два ключа: modelName и device

      modelName: модель GPU, например "Tesla P100-PCIE-16GB" или "Tesla T4" (получается с помощью nvidia-smi).

      device: производитель GPU, например "nvidia" или "ascend".

    Детали стоимости и статистика стоимости

    Наконец, после ожидания 1 или более часов, вы можете увидеть детали стоимости в разделе Cost Details с измерениями по namespace и uuid карты.
    Также вы можете увидеть общие затраты по кластеру, проекту и namespace в разделе Cost Statistics.