Как определить модель стоимости 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-кластера:
Описание методов биллинга
Добавление цены для модели стоимости
-
Выберите vGPU или vGPUMemory в Billing Items.
-
Выберите Request Usage (core-hours) или Used Usage (core-hours) или Project Quota (core-hours) в Method.
-
Установите Default Price.
-
Настройте 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.