Интеллектуальное планирование ресурсов GPU#
Данная ИИ-функция автоматизирует распределение ограниченных вычислительных ресурсов GPU между конкурирующими задачами, что имитирует когнитивные способности человека, связанные с принятием решений в условиях ограниченных ресурсов: она позволяет оптимально распределять GPU-ресурсы между задачами ИИ и машинного обучения, учитывая их приоритеты, гарантированные квоты и баланс между потребителями:
Сценарий позволяет пользователю:
проверять готовность планировщика KAI Scheduler;
управлять очередями планирования и их квотами на ресурсы GPU;
планировать GPU-нагрузки с назначением очереди и планировщика;
приоритизировать рабочие нагрузки и обеспечивать вытеснение низкоприоритетных задач;
обеспечивать одновременное планирование всех pod группы (gang scheduling);
эффективно разделять GPU между несколькими задачами.
Примечание
При использовании ИИ-функций DropApp соблюдайте правила работы пользователя с ИИ-функциями.
Предусловия#
Предварительными условиями выполнения сценария являются:
Развернутый кластер DropApp с установленным программным компонентом K8S Artificial Intelligence (K8SI).
Доступ к кластеру с правами, достаточными для просмотра состояния узлов, pod и ресурсов, а также для создания и удаления pod и пользовательских ресурсов планирования.
Наличие GPU-узлов и настроенного GPU-стека (драйверы NVIDIA, Container Toolkit, K8s-device-plugin, компонент GPU Operator), обеспечивающего доступ к ресурсу
nvidia.com/gpu.Установленный планировщик KAI Scheduler с созданными по умолчанию очередями
default-parent-queueиdefault-queue.
Сведения о KAI Scheduler и его установке приведены в разделе «KAI Scheduler» Руководства администратора.
Проверка готовности планировщика KAI Scheduler#
Проверьте, что планировщик KAI Scheduler развернут в кластере и готов к планированию рабочих нагрузок. Планировщик обеспечивает интеллектуальное распределение ресурсов GPU между очередями и задачами.
Сценарий проверки готовности KAI Scheduler:
Убедитесь, что pod планировщика в пространстве имен
kai-schedulerнаходятся в состоянииRunning:kubectl get pods -n kai-schedulerПример вывода:
NAME READY STATUS RESTARTS AGE kai-scheduler-xxxxxxxxx-xxxxx 1/1 Running 0 10mУбедитесь, что пользовательский ресурс
Queueзарегистрирован в кластере:kubectl get crd queues.scheduling.run.aiЕсли в выводе команды присутствует пользовательский ресурс
queues.scheduling.run.ai, планировщик KAI Scheduler готов к управлению очередями и планированию рабочих нагрузок.Проверьте, что очередь по умолчанию доступна для планирования:
kubectl get queuesПример вывода:
NAME AGE default-parent-queue 10m default-queue 10mОчереди
default-parent-queue(родительская) иdefault-queue(дочерняя) создаются автоматически при установке KAI Scheduler. Рабочие нагрузки по умолчанию планируются в очередьdefault-queue.
Управление очередями планирования#
Очередь планирования — пользовательский ресурс Kubernetes, представляющий группу задач с общими гарантиями ресурсов, квотами, лимитами и приоритетом. Очередь является основной базовой единицей управления ресурсами в KAI Scheduler. Рабочая нагрузка должна принадлежать какой-либо очереди, чтобы быть запланированной.
KAI Scheduler поддерживает иерархические очереди: планирование задач выполняется в дочерние (листовые) очереди, а родительские очереди служат организационными единицами распределения ресурсов между дочерними очередями.
Сценарий управления очередями:
Создайте очередь с гарантированной квотой и лимитом на ресурсы GPU, а также на CPU и память:
apiVersion: scheduling.run.ai/v2 kind: Queue metadata: name: ml-team spec: displayName: "ML Team" parentQueue: "default-parent-queue" resources: cpu: quota: 1000 limit: 2000 memory: quota: 4096 limit: 8192 gpu: quota: 1 limit: 2Где:
parentQueue— родительская очередь, в которую входит создаваемая очередь (опционально);quota— гарантированный объем ресурса, выделяемый очереди;limit— максимальный объем ресурса, который может потребить очередь;priority— приоритет очереди при распределении ресурсов, превышающих квоту (опционально).
Примените манифест:
kubectl apply -f - <<EOF apiVersion: scheduling.run.ai/v2 kind: Queue metadata: name: ml-team spec: displayName: "ML Team" parentQueue: "default-parent-queue" resources: cpu: quota: 1000 limit: 2000 memory: quota: 4096 limit: 8192 gpu: quota: 1 limit: 2 EOFУбедитесь, что очередь создана и доступна для планирования:
kubectl get queue ml-teamОчередь
ml-teamготова к планированию рабочих нагрузок с гарантированной квотой и лимитом ресурсов GPU.
Планирование GPU-нагрузки с назначением очереди#
Планируйте рабочие нагрузки с использованием KAI Scheduler, назначая им очередь планирования и планировщик. Для планирования задачи средствами KAI Scheduler необходимо указать в ее спецификации имя очереди в метке kai.scheduler/queue и имя планировщика kai-scheduler в поле schedulerName.
Важно
Для отправки рабочих нагрузок используйте выделенное пространство имен. Не используйте пространство имен kai-scheduler для отправки рабочих нагрузок.
Сценарий планирования GPU-нагрузки:
Создайте pod, запрашивающий ресурс GPU
nvidia.com/gpuи назначенный в очередьdefault-queue:apiVersion: v1 kind: Pod metadata: name: gpu-pod labels: kai.scheduler/queue: default-queue spec: schedulerName: kai-scheduler containers: - name: main image: sberlinux command: ["bash", "-c"] args: ["nvidia-smi; trap 'exit 0' TERM; sleep infinity & wait"] resources: limits: nvidia.com/gpu: "1"Где:
kai.scheduler/queue— метка, указывающая очередь планирования, в которую помещается pod;schedulerName— имя планировщика, управляющего размещением pod (kai-scheduler);nvidia.com/gpu— количество физических GPU, необходимых для pod.
Примените манифест:
kubectl apply -f - <<EOF apiVersion: v1 kind: Pod metadata: name: gpu-pod labels: kai.scheduler/queue: default-queue spec: schedulerName: kai-scheduler containers: - name: main image: sberlinux command: ["bash", "-c"] args: ["nvidia-smi; trap 'exit 0' TERM; sleep infinity & wait"] resources: limits: nvidia.com/gpu: "1" EOFУбедитесь, что pod запланирован и находится в состоянии
Running:kubectl get pod gpu-pod -o widePod успешно размещен на GPU-узле планировщиком KAI Scheduler, что подтверждает корректность назначения очереди и планирования GPU-ресурса.
Проверьте, что внутри pod доступен GPU-ускоритель:
kubectl logs gpu-pod | head -n 5Вывод команды
nvidia-smiсодержит сведения о GPU-ускорителе, выделенном pod.После завершения проверки удалите тестовый pod:
kubectl delete pod gpu-pod
Приоритизация рабочих нагрузок#
KAI Scheduler классифицирует рабочие нагрузки по приоритету и планирует их в порядке убывания приоритета. При нехватке ресурсов в кластере планировщик вытесняет низкоприоритетные задачи, освобождая ресурсы для высокоприоритетных. Это обеспечивает первоочередное выделение ресурсов критичным сервисам и соблюдение SLA (Service Level Agreement, соглашение об уровне предоставления услуги).
KAI Scheduler поставляется с предопределенными классами приоритетов:
Класс приоритета |
Значение |
Назначение |
|---|---|---|
|
50 |
Предвытесняемые обучающие рабочие нагрузки |
|
75 |
Предвытесняемые задачи сборки и интерактивные задачи |
|
100 |
Задачи сборки и интерактивные задачи (не подлежат вытеснению) |
|
125 |
Задачи инференса (не подлежат вытеснению) |
Класс приоритета указывается в поле priorityClassName спецификации pod или рабочей нагрузки. Класс приоритета со значением 100 и выше считается не подлежащим вытеснению.
Сценарий приоритизации рабочих нагрузок:
Создайте очередь с лимитом в один GPU:
apiVersion: scheduling.run.ai/v2 kind: Queue metadata: name: test spec: resources: gpu: quota: 0 limit: 1Очередь
testограничивает потребление ресурсов GPU одним устройством (limit: 1), что позволяет продемонстрировать вытеснение задач.Примените манифест:
kubectl apply -f - <<EOF apiVersion: scheduling.run.ai/v2 kind: Queue metadata: name: test spec: resources: gpu: quota: 0 limit: 1 EOFСоздайте pod с приоритетом
train(значение50), запрашивающий один GPU:apiVersion: v1 kind: Pod metadata: name: train-pod labels: kai.scheduler/queue: test spec: schedulerName: kai-scheduler priorityClassName: train containers: - name: main image: sberlinux command: ["bash", "-c"] args: ["sleep infinity"] resources: limits: nvidia.com/gpu: "1"Примените манифест pod
train-pod.Дождитесь, пока pod
train-podперейдет в состояниеRunning:kubectl get pod train-podСоздайте pod с приоритетом
build(значение100), запрашивающий один GPU в ту же очередьtest:apiVersion: v1 kind: Pod metadata: name: build-pod labels: kai.scheduler/queue: test spec: schedulerName: kai-scheduler priorityClassName: build containers: - name: main image: sberlinux command: ["bash", "-c"] args: ["sleep infinity"] resources: limits: nvidia.com/gpu: "1"Примените манифест pod
build-pod.Проверьте состояние обоих pod:
kubectl get pods | grep -E "train-pod|build-pod"Поскольку оба pod запрашивают один GPU, который является лимитом очереди
test, планировщик вытеснит низкоприоритетный podtrain-podи запланирует высокоприоритетный podbuild-podвместо него. Это подтверждает приоритизацию рабочих нагрузок средствами KAI Scheduler.После завершения проверки удалите тестовые pod и очередь:
kubectl delete pod train-pod build-podkubectl delete queue test
Одновременное планирование группы pod#
KAI Scheduler поддерживает одновременное (gang) планирование группы pod: либо все pod группы планируются одновременно, либо ни один из них не получает ресурсы до появления достаточных ресурсов в кластере. Это необходимо для распределенных задач обучения и инференса, в которых все pod должны запускаться совместно.
Сценарий одновременного планирования группы pod:
Зарегистрируйте пользовательский ресурс
PodGroupи убедитесь в его доступности:kubectl get crd podgroups.scheduling.run.aiЕсли в выводе команды присутствует пользовательский ресурс
podgroups.scheduling.run.ai, планировщик KAI Scheduler готов к управлению группами pod.Создайте
PodGroup, объединяющий группу pod с минимальным количеством участников:apiVersion: scheduling.run.ai/v2 kind: PodGroup metadata: name: ai-training labels: kai.scheduler/queue: default-queue spec: minMember: 3Где
minMember— минимальное количество pod, которые должны быть запланированы совместно, прежде чем запустится любой из них.Примените манифест:
kubectl apply -f - <<EOF apiVersion: scheduling.run.ai/v2 kind: PodGroup metadata: name: ai-training labels: kai.scheduler/queue: default-queue spec: minMember: 3 EOFСоздайте pod, входящие в группу
ai-training:apiVersion: v1 kind: Pod metadata: name: ai-training-0 labels: kai.scheduler/queue: default-queue pod-group.scheduling.run.ai/name: ai-training spec: schedulerName: kai-scheduler containers: - name: main image: sberlinux command: ["bash", "-c"] args: ["sleep infinity"] resources: limits: nvidia.com/gpu: "1"Аналогичным образом создайте pod
ai-training-1иai-training-2, указав в каждом метку очередиkai.scheduler/queue: default-queueи принадлежность к группеpod-group.scheduling.run.ai/name: ai-training.Примените манифесты pod группы.
Убедитесь, что все pod группы запущены совместно:
kubectl get pods | grep ai-trainingЕсли все pod группы
ai-trainingнаходятся в состоянииRunning, одновременное планирование группы настроено корректно.После завершения проверки удалите группу и тестовые pod:
kubectl delete podgroup ai-trainingkubectl delete pod ai-training-0 ai-training-1 ai-training-2
Совместное использование GPU#
KAI Scheduler позволяет эффективно разделять один или несколько GPU между несколькими pod, максимизируя использование ресурсов. Pod может запросить часть GPU-устройства, указав долю памяти устройства или конкретный объем памяти GPU.
Примечание
Совместное использование GPU (GPU Sharing) отключено по умолчанию и включается параметром global.gpuSharing=true при установке KAI Scheduler (подробнее — в разделе «KAI Scheduler» Руководства администратора).
Сценарий совместного использования GPU:
Создайте pod, запрашивающий долю GPU-устройства
0.5(половину памяти устройства):apiVersion: v1 kind: Pod metadata: name: gpu-sharing-pod labels: kai.scheduler/queue: default-queue annotations: gpu-fraction: "0.5" spec: schedulerName: kai-scheduler containers: - name: main image: sberlinux command: ["bash", "-c"] args: ["sleep infinity"] resources: limits: nvidia.com/gpu: "1"Где аннотация
gpu-fractionсо значением0.5разрешает pod потреблять до половины памяти GPU-устройства, оставляя остальную память для совместного использования другими pod.Примените манифест:
kubectl apply -f - <<EOF apiVersion: v1 kind: Pod metadata: name: gpu-sharing-pod labels: kai.scheduler/queue: default-queue annotations: gpu-fraction: "0.5" spec: schedulerName: kai-scheduler containers: - name: main image: sberlinux command: ["bash", "-c"] args: ["sleep infinity"] resources: limits: nvidia.com/gpu: "1" EOFУбедитесь, что pod
gpu-sharing-podнаходится в состоянииRunning:kubectl get pod gpu-sharing-podСоздайте второй pod с аннотацией
gpu-memory, запрашивающий конкретный объем памяти GPU-устройства (в МиБ):apiVersion: v1 kind: Pod metadata: name: gpu-memory-pod labels: kai.scheduler/queue: default-queue annotations: gpu-memory: "2000" spec: schedulerName: kai-scheduler containers: - name: main image: sberlinux command: ["bash", "-c"] args: ["sleep infinity"] resources: limits: nvidia.com/gpu: "1"Аннотация
gpu-memoryсо значением2000разрешает pod потреблять до 2000 МиБ памяти GPU-устройства, оставляя остальную память для других pod.Примените манифест pod
gpu-memory-pod.Убедитесь, что оба pod совместно используют одно GPU-устройство:
kubectl get pods | grep gpuЕсли pod
gpu-sharing-podиgpu-memory-podнаходятся в состоянииRunningи размещены на одном GPU-узле, совместное использование GPU настроено корректно.После завершения проверки удалите тестовые pod:
kubectl delete pod gpu-sharing-pod gpu-memory-pod
Результат#
Ожидаемым результатом являются:
готовность планировщика KAI Scheduler к планированию;
успешная настройка очередей и их квот на ресурсы GPU;
запланированность GPU-нагрузки с назначением очереди;
приоритезация рабочих нагрузок с вытеснением низкоприоритетных задач;
одновременная запланированность группы pod и эффективное совместное использование GPU несколькими задачами.