Настройка аппаратного ускорителя на GPU-узлах

По мере увеличения объёмов бизнес-данных, особенно в сценариях, таких как искусственный интеллект и анализ данных, вы можете захотеть использовать возможности GPU в вашем самостоятельно построенном бизнес-кластере для ускорения обработки данных. Помимо подготовки GPU-ресурсов для узлов кластера, необходимо также выполнить настройку GPU.

В данном решении узлы кластера, обладающие возможностями GPU-вычислений, называются GPU Nodes.

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

Содержание

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

GPU-ресурсы подготовлены на рабочем узле, который относится к GPU-узлу, описанному в этом разделе.

Установка драйвера GPU

Внимание: Если GPU-узел использует плагин NVIDIA MPS, убедитесь, что архитектура GPU узла — Volta или новее (Volta/Turing/Ampere/Hopper и т. д.), а драйвер поддерживает CUDA версии 11.5 или выше.

Получение адреса для загрузки драйвера

  1. Войдите на GPU-узел и выполните команду lspci |grep -i NVIDIA, чтобы проверить модель GPU узла.

    В следующем примере модель GPU — Tesla T4.

    lspci | grep NVIDIA
    00:08.0 3D controller: NVIDIA Corporation TU104GL [Tesla T4] (rev a1)
  2. Перейдите на официальный сайт NVIDIA, чтобы получить ссылку для загрузки драйвера.

    1. Нажмите на Drivers в верхней навигационной панели на главной странице.

    2. Заполните необходимые данные для загрузки драйвера в соответствии с моделью GPU узла.

    3. Нажмите Search.

    4. Нажмите Download.

    5. Щёлкните правой кнопкой мыши по Download > Copy Link Address, чтобы скопировать ссылку для загрузки драйвера.

  3. Выполните следующие команды на GPU-узле для создания каталога /home/gpu и загрузки файла драйвера в этот каталог.

    # Создать каталог /home/gpu
    mkdir -p /home/gpu
    cd /home/gpu/
    # Загрузить файл драйвера в каталог /home/gpu, пример: wget https://cn.download.nvidia.com/tesla/515.65.01/NVIDIA-Linux-x86_64-515.65.01.run
    wget <Driver download address>
    # Проверить успешность загрузки файла драйвера, если возвращается имя файла драйвера (например: NVIDIA-Linux-x86_64-515.65.01.run), значит загрузка прошла успешно
    ls <Driver file name>

Установка драйвера

  1. Выполните следующую команду на GPU-узле для установки пакетов gcc и kernel-devel, соответствующих текущей операционной системе.

    sudo yum install dkms gcc  kernel-devel-$(uname -r) -y
  2. Выполните следующие команды для установки драйвера GPU.

    chmod a+x /home/gpu/<Driver file name>
    /home/gpu/<Driver file name> --dkms
  3. После установки выполните команду nvidia-smi. Если возвращается информация о GPU, аналогичная приведённому примеру, значит установка драйвера прошла успешно.

    # nvidia-smi
    Tue Sep 13 01:31:33 2022     
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 515.65.01    Driver Version: 515.65.01    CUDA Version: 11.7     |
    +-------------------------------+-----------------------+---------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |                               |                      |               MIG M. |
    |===============================+======================+======================|
    |   0  Tesla T4            Off  | 00000000:00:08.0 Off |                    0 |
    | N/A   55C    P0    28W /  70W |      2MiB / 15360MiB |      5%      Default |
    |                               |                      |                  N/A |
    +-------------------------------+-----------------------+---------------------+
                                                                                    
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    |  No running processes found                                                 |
    +-----------------------------------------------------------------------------+

Установка NVIDIA Container runtime

  1. На GPU Node добавьте репозиторий NVIDIA yum.

    distribution=$(. /etc/os-release;echo $ID$VERSION_ID) && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.repo | sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
    yum makecache -y

    При появлении сообщения "Metadata cache created." добавление прошло успешно.

  2. Установите NVIDIA Container Runtime.

    yum install nvidia-container-toolkit -y

    При появлении сообщения Complete! установка завершена успешно.

  3. Настройте Runtime по умолчанию. Добавьте следующую конфигурацию в файл.

    • Containerd: Измените файл /etc/containerd/config.toml.

      [plugins]
       [plugins."io.containerd.grpc.v1.cri"]
         [plugins."io.containerd.grpc.v1.cri".containerd]
      ...
            default_runtime_name = "nvidia"
      ...
              [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
      ...
                [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
                  runtime_type = "io.containerd.runc.v2"
                  runtime_engine = ""
                  runtime_root = ""
                  privileged_without_host_devices = false
                  base_runtime_spec = ""
                  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
                    SystemdCgroup = true
                [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]
                  privileged_without_host_devices = false
                  runtime_engine = ""
                  runtime_root = ""
                  runtime_type = "io.containerd.runc.v1"
                  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]
                    BinaryName = "/usr/bin/nvidia-container-runtime"
                    SystemdCgroup = true
      ...
    • Docker: Измените файл /etc/docker/daemon.json.

       {
       ...
           "default-runtime": "nvidia",
           "runtimes": {
           "nvidia": {
               "path": "/usr/bin/nvidia-container-runtime"
               }
           },
       ...
       }
  4. Перезапустите Containerd / Docker.

    • Containerd

      systemctl restart containerd   #Перезапуск
      
      crictl info |grep Runtime  #Проверка
    • Docker

      systemctl restart docker   #Перезапуск
      
      docker info |grep Runtime  #Проверка

Конфигурация физического GPU

Развёртывание плагина физического GPU в GPU бизнес-кластере

В интерфейсе управления GPU-кластером выполните следующие действия:

  1. В левой боковой панели каталога выберите подраздел "Cluster Plugins", нажмите для развёртывания "ACP GPU Device Plugin" и включите опцию "pGPU";

  2. Во вкладке "Nodes" выберите узлы, на которых необходимо развернуть физический GPU, затем нажмите "Label and Taint Manager", добавьте "device label" и выберите "pGPU", нажмите OK;

  3. Во вкладке "Pods" проверьте статус работы контейнерной группы, соответствующей nvidia-device-plugin-ds, чтобы убедиться в отсутствии сбоев и что она запущена на указанных узлах.

Конфигурация NVIDIA MPS (драйвер должен поддерживать CUDA версии >= 11.5)

Развёртывание плагина NVIDIA MPS в GPU бизнес-кластере

В интерфейсе управления GPU-кластером выполните следующие действия:

  1. В левой боковой панели каталога выберите подраздел "Cluster Plugins", нажмите для развёртывания "ACP GPU Device Plugin" и включите опцию "MPS";

  2. Во вкладке "Nodes" выберите узлы, на которых необходимо развернуть физический GPU, затем нажмите "Label and Taint Manager", добавьте "device label" и выберите "MPS", нажмите OK;

  3. Во вкладке "Pods" проверьте статус работы контейнерной группы, соответствующей nvidia-mps-device-plugin-daemonset, чтобы убедиться в отсутствии сбоев и что она запущена на указанных узлах.

Настройка kube-scheduler (kubernetes >= 1.23)

  1. На узле управления бизнес-кластером проверьте, правильно ли scheduler ссылается на политику планирования.

    cat /etc/kubernetes/manifests/kube-scheduler.yaml

    Проверьте, есть ли опция –config со значением /etc/kubernetes/scheduler-config.yaml, например

    apiVersion: v1
    kind: Pod
    metadata:
      creationTimestamp: null
      labels:
        component: kube-scheduler
       tier: control-plane
      name: kube-scheduler
      namespace: kube-system
    spec:
      containers:
      - command:
        - kube-scheduler
        - --config=/etc/kubernetes/scheduler-config.yaml

Примечание: Указанные параметры и значения — это конфигурации по умолчанию платформы. Если вы их изменяли, пожалуйста, верните к значениям по умолчанию. Ваши оригинальные пользовательские настройки можно скопировать в файл политики планирования.

  1. Проверьте конфигурацию файла политики планирования.

    1. Выполните команду: kubectl describe service kubernetes -n default |grep Endpoints.

      Expected effectEndpoints:         192.168.130.240:6443
    2. Замените содержимое файла /etc/kubernetes/scheduler-config.yaml на всех Master-узлах следующим содержимым, где ${kube-apiserver} нужно заменить на вывод из предыдущего шага.

      apiVersion: kubescheduler.config.k8s.io/v1beta2
      kind: KubeSchedulerConfiguration
      clientConnection:
        kubeconfig: /etc/kubernetes/scheduler.conf
      extenders:
      - enableHTTPS: true
        filterVerb: predicates
        managedResources:
        - ignoredByScheduler: false
          name: nvidia.com/mps-core
        nodeCacheCapable: false
        urlPrefix: https://${kube-apiserver}/api/v1/namespaces/kube-system/services/nvidia-mps-scheduler-plugin/proxy/scheduler
        tlsConfig:
          insecure: false
          certFile: /etc/kubernetes/pki/apiserver-kubelet-client.crt
          keyFile: /etc/kubernetes/pki/apiserver-kubelet-client.key
          caFile: /etc/kubernetes/pki/ca.crt

      Если в schedule-config.yaml уже есть extenders, добавьте этот yaml в конец.

      - enableHTTPS: true
        filterVerb: predicates
        managedResources:
        - ignoredByScheduler: false
          name: nvidia.com/mps-core
        nodeCacheCapable: false
        urlPrefix: https://${kube-apiserver}/api/v1/namespaces/kube-system/services/nvidia-mps-scheduler-plugin/proxy/scheduler
        tlsConfig:
          insecure: false
          certFile: /etc/kubernetes/pki/apiserver-kubelet-client.crt
          keyFile: /etc/kubernetes/pki/apiserver-kubelet-client.key
          caFile: /etc/kubernetes/pki/ca.crt
  2. Выполните следующую команду для получения ID контейнера:

    • Containerd: Выполните crictl ps |grep kube-scheduler, вывод будет примерно таким, первый столбец — это ID контейнера.

      1d113ccf1c1a9       03c72176d0f15       2 seconds ago       Running             kube-scheduler              3                   ecd054bbdd465       kube-scheduler-192.168.176.47
    • Docker: Выполните docker ps |grep kube-scheduler, вывод будет примерно таким, первый столбец — это ID контейнера.

      30528a45a118   d8a9fef7349c    "kube-scheduler --au..."   37 minutes ago   Up 37 minutes     k8s_kube-scheduler_kube-scheduler-192.168.130.240_kube-system_3e9f7007b38f4deb6ffd1c7587621009_28
  3. Перезапустите контейнер Containerd/Docker, используя полученный ID контейнера.

    • Containerd

      crictl stop <Container ID>
  4. Перезапустите Kubelet.

    systemctl restart kubelet

Конфигурация GPU-Manager

Настройка kube-scheduler (kubernetes >= 1.23)

  1. На узле управления бизнес-кластером проверьте, правильно ли scheduler ссылается на политику планирования.

    cat /etc/kubernetes/manifests/kube-scheduler.yaml

    Проверьте, есть ли опция –config со значением /etc/kubernetes/scheduler-config.yaml, например

    apiVersion: v1
    kind: Pod
    metadata:
      creationTimestamp: null
      labels:
        component: kube-scheduler
       tier: control-plane
      name: kube-scheduler
      namespace: kube-system
    spec:
      containers:
      - command:
        - kube-scheduler
        - --config=/etc/kubernetes/scheduler-config.yaml

Примечание: Указанные параметры и значения — это конфигурации по умолчанию платформы. Если вы их изменяли, пожалуйста, верните к значениям по умолчанию. Ваши оригинальные пользовательские настройки можно скопировать в файл политики планирования.

  1. Проверьте конфигурацию файла политики планирования.

    1. Выполните команду: kubectl describe service kubernetes -n default |grep Endpoints.

      Expected effectEndpoints:         192.168.130.240:6443
    2. Замените содержимое файла /etc/kubernetes/scheduler-config.yaml на всех Master-узлах следующим содержимым, где ${kube-apiserver} нужно заменить на вывод из предыдущего шага.

      apiVersion: kubescheduler.config.k8s.io/v1beta2
      kind: KubeSchedulerConfiguration
      clientConnection:
        kubeconfig: /etc/kubernetes/scheduler.conf
      extenders:
      - enableHTTPS: true
        filterVerb: predicates
        managedResources:
        - ignoredByScheduler: false
          name: tencent.com/vcuda-core
        nodeCacheCapable: false
        urlPrefix: https://${kube-apiserver}/api/v1/namespaces/kube-system/services/gpu-quota-admission/proxy/scheduler
        tlsConfig:
          insecure: false
          certFile: /etc/kubernetes/pki/apiserver-kubelet-client.crt
          keyFile: /etc/kubernetes/pki/apiserver-kubelet-client.key
          caFile: /etc/kubernetes/pki/ca.crt
  2. Выполните следующую команду для получения ID контейнера:

    • Containerd: Выполните crictl ps |grep kube-scheduler, вывод будет примерно таким, первый столбец — это ID контейнера.

      1d113ccf1c1a9       03c72176d0f15       2 seconds ago       Running             kube-scheduler              3                   ecd054bbdd465       kube-scheduler-192.168.176.47
    • Docker: Выполните docker ps |grep kube-scheduler, вывод будет примерно таким, первый столбец — это ID контейнера.

      30528a45a118   d8a9fef7349c    "kube-scheduler --au..."   37 minutes ago   Up 37 minutes     k8s_kube-scheduler_kube-scheduler-192.168.130.240_kube-system_3e9f7007b38f4deb6ffd1c7587621009_28
  3. Перезапустите контейнер Containerd/Docker, используя полученный ID контейнера.

    • Containerd

      crictl stop <Container ID>
  4. Перезапустите Kubelet.

    systemctl restart kubelet

Развёртывание плагина GPU Manager в GPU бизнес-кластере

В интерфейсе управления GPU-кластером выполните следующие действия:

  1. В левой боковой панели каталога выберите подраздел "Cluster Plugins", нажмите для развёртывания "ACP GPU Device Plugin" и включите опцию "GPU-Manager";

  2. Во вкладке "Nodes" выберите узлы, на которых необходимо развернуть физический GPU, затем нажмите "Label and Taint Manager", добавьте "device label" и выберите "vGPU", нажмите OK;

  3. Во вкладке "Pods" проверьте статус работы контейнерной группы, соответствующей gpu-manager-daemonset, чтобы убедиться в отсутствии сбоев и что она запущена на указанных узлах.

Проверка результатов

Метод 1: Проверьте наличие доступных GPU-ресурсов на GPU-узлах, выполнив следующую команду на управляющем узле бизнес-кластера:

kubectl get node  ${nodeName} -o=jsonpath='{.status.allocatable}' 

Метод 2: Разверните GPU-приложение на платформе, указав необходимое количество GPU-ресурсов. После развертывания выполните exec в Pod и выполните следующую команду:

# nvidia-smi
Tue Sep 13 01:31:33 2022     
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 515.65.01    Driver Version: 515.65.01    CUDA Version: 11.7     |
+-------------------------------+-----------------------+---------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla T4            Off  | 00000000:00:08.0 Off |                    0 |
| N/A   55C    P0    28W /  70W |      2MiB / 15360MiB |      5%      Default |
|                               |                      |                  N/A |
+-------------------------------+-----------------------+---------------------+
                                                                                
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

Проверьте, корректно ли получена информация о GPU.