Поддержка Nvidia GPU

Для добавления в кластер YTsaurus хостов с GPU и их дальнейшего использования необходимо правильно сконфигурировать вычислительные ноды.

Предупреждение

Поддержка GPU появилась начиная с YTsaurus версии 25.2 и оператора версии 0.27.0.

Настройка k8s-кластера

Необходимо сделать два шага:

  1. Установить драйвера Nvidia на ноды k8s-кластера.

В итоге драйвер должен быть примонтирован в exec-ноды YTsaurus; то есть exec-нода должна видеть nvidia устройства в /dev.

  1. Установите GPU Operator от Nvidia.

Убедитесь, что оператор успешно установлен и на GPU-нодах k8s-кластера доступен ресурс nvidia.com/gpu.

Спецификация YTsaurus

Добавьте в спецификацию в раздел execNodes группу нод с поддежкой GPU.

У данной группы необходимо указать специальный entrypointWrapper, включить nvidia runtime и указать nvidia.com/gpu ресурс в запросе ресурсов.

Пример конфига для группы из одной ноды с одной GPU:

execNodes:
- instanceCount: 1
  tags:
    - gpu
  jobEnvironment:
    cri:
      entrypointWrapper:
      - tini
      - --
      - /usr/bin/gpuagent_runner.sh
  runtime:
    nvidia: {}
  privileged: true
  jobResources:
    requests:
      limits:
        cpu: 16
        memory: 128Gi
        nvidia.com/gpu: 1
      requests:
        cpu: 16
        nvidia.com/gpu: 1

После применения спецификации YTsaurus, убедитесь, что нода успешно поднялась и что на ней доступны GPU. Доступность GPU можно проверить либо в UI кластера, посмотрев на ресурсы ноды, либо с помощью CLI:

yt get //sys/exec_nodes/<node_address>/@resource_limits/gpu

Настройка дерева пулов

Для эффективной работы планировщика крайне желательно, чтобы ресурсы на exec-нодах кластера и в джобах операций были в достаточной степени гомогенны. Поэтому ноды с GPU следует выделять в отдельное дерево пулов.

Для этого выполните следующую команду:

yt create scheduler_pool_tree --attributes '{name=gpu; config={nodes_filter=gpu; main_resource=gpu;}}'

Теперь можно запустить тестовую операцию и проверить, что в джобе доступен nvidia-smi:

yt vanilla --tasks '{task={job_count=1; command="nvidia-smi 1>&2"; gpu_limit=1;};}' --spec '{pool_trees=[gpu];}'