• Русский
  • Настройка аппаратного ускорителя на 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.