Поделиться через


Использование GPU для ресурсоемких рабочих нагрузок

Область применения: AKS в Azure Stack HCI 22H2, AKS в Windows Server

Графические процессоры (GPU) используются для ресурсоемких рабочих нагрузок, таких как машинное обучение, глубокое обучение и многое другое. В этой статье описывается, как использовать GPU для ресурсоемких рабочих нагрузок в AKS, включенных Azure Arc.

Подготовка к работе

Если вы обновляете AKS с предварительной версии, более ранней, чем октябрь 2022 г., в котором работают пулы узлов с поддержкой GPU, перед началом работы удалите все кластеры рабочей нагрузки с GPU. Выполните действия, описанные в этом разделе.

Шаг 1. Удаление драйвера узла Nvidia

На каждом хост-компьютере перейдите к панель управления > Установка и удаление программ, удалите драйвер узла NVIDIA, а затем перезагрузите компьютер. После перезагрузки компьютера убедитесь, что драйвер успешно удален. Откройте терминал PowerShell с повышенными привилегиями и выполните следующую команду:

Get-PnpDevice  | select status, class, friendlyname, instanceid | findstr /i /c:"3d video" 

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

Error       3D Video Controller                   PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
Error       3D Video Controller                   PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000 

Шаг 2. Отключение драйвера узла от узла

При удалении драйвера узла физический GPU переходит в состояние ошибки. Необходимо отключить все устройства GPU от узла.

Для каждого устройства GPU (3D Video Controller) выполните следующие команды в PowerShell. Скопируйте идентификатор экземпляра; Например, PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 из предыдущих выходных данных команды:

$id1 = "<Copy and paste GPU instance id into this string>"
$lp1 = (Get-PnpDeviceProperty -KeyName DEVPKEY_Device_LocationPaths -InstanceId $id1).Data[0]
Disable-PnpDevice -InstanceId $id1 -Confirm:$false
Dismount-VMHostAssignableDevice -LocationPath $lp1 -Force

Чтобы убедиться, что gpu были правильно отключены от узла, выполните следующую команду. Следует поместить gpu в состояние :Unknown

Get-PnpDevice  | select status, class, friendlyname, instanceid | findstr /i /c:"3d video"
Unknown       3D Video Controller               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
Unknown       3D Video Controller               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000 

Шаг 3. Скачивание и установка драйвера для устранения рисков NVIDIA

Программное обеспечение может включать компоненты, разработанные и принадлежащие nvidia Corporation или ее лицензиарам. Использование этих компонентов регулируется лицензионным соглашением с конечным пользователем NVIDIA.

Чтобы скачать драйвер устранения рисков NVIDIA, ознакомьтесь с документацией по центру обработки данных NVIDIA . После скачивания драйвера разверните архив и установите драйвер устранения рисков на каждом хост-компьютере.

Invoke-WebRequest -Uri "https://docs.nvidia.com/datacenter/tesla/gpu-passthrough/nvidia_azure_stack_inf_v2022.10.13_public.zip" -OutFile "nvidia_azure_stack_inf_v2022.10.13_public.zip"
mkdir nvidia-mitigation-driver
Expand-Archive .\nvidia_azure_stack_inf_v2022.10.13_public.zip .\nvidia-mitigation-driver\

Чтобы установить драйвер устранения рисков, перейдите в папку, содержащую извлеченные файлы, щелкните правой кнопкой мыши файл nvidia_azure_stack_T4_base.inf и выберите Установить. Убедитесь, что у вас есть правильный драйвер; В настоящее время AKS поддерживает только GPU NVIDIA Tesla T4.

Вы также можете выполнить установку с помощью командной строки, перейдя в папку и выполнив следующие команды, чтобы установить драйвер устранения рисков:

pnputil /add-driver nvidia_azure_stack_T4_base.inf /install 
pnputil /scan-devices 

После установки драйвера устранения рисков графические процессоры отображаются в состоянии ОК в разделе Nvidia T4_base — отключен:

Get-PnpDevice  | select status, class, friendlyname, instanceid | findstr /i /c:"nvidia"
OK       Nvidia T4_base - Dismounted               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
OK       Nvidia T4_base - Dismounted               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000

Шаг 4. Повторите шаги 1–3

Повторите шаги 1–3 для каждого узла в отказоустойчивом кластере.

Важно!

Виртуальные машины с поддержкой GPU не добавляются в кластеризация отработки отказа в Windows Server 2019, Windows Server 2022 или Azure Stack HCI.

Установка или обновление AKS

Ознакомьтесь с кратким руководством по AKS с помощью PowerShell или Windows Admin Center для установки или обновления AKS, включенной в Arc.

Create новый кластер рабочей нагрузки с пулом узлов с поддержкой GPU

Использование пулов узлов с поддержкой GPU пока доступно только для пулов узлов Linux.

New-AksHciCluster -Name "gpucluster" -nodePoolName "gpunodepool" -nodeCount 2 -osType linux -nodeVmSize Standard_NK6 

После установки кластера рабочей нагрузки выполните следующую команду, чтобы получить kubeconfig:

Get-AksHciCredential -Name gpucluster

Убедитесь, что вы можете запланировать gpu

Создав пул узлов GPU, убедитесь, что вы можете запланировать gpu в Kubernetes. Сначала получите список узлов в кластере с помощью команды kubectl get nodes.

kubectl get nodes
NAME             STATUS  ROLES                 AGE   VERSION
moc-l9qz36vtxzj  Ready   control-plane,master  6m14s  v1.22.6
moc-lhbkqoncefu  Ready   <none>                3m19s  v1.22.6
moc-li87udi8l9s  Ready   <none>                3m5s  v1.22.6

Теперь используйте команду kubectl describe node , чтобы убедиться, что графические процессоры можно запланировать. В разделе Емкость gpu должен отображаться как nvidia.com/gpu: 1.

kubectl describe <node> | findstr "gpu" 

Выходные данные должны отображать GPU из рабочего узла и выглядеть примерно так:

         nvidia.com/gpu.compute.major=7
         nvidia.com/gpu.compute.minor=5
         nvidia.com/gpu.count=1
         nvidia.com/gpu.family=turing
         nvidia.com/gpu.machine=Virtual-Machine
         nvidia.com/gpu.memory=16384
         nvidia.com/gpu.product=Tesla-T4
Annotations:    cluster.x-k8s.io/cluster-name: gpucluster
                cluster.x-k8s.io/machine: gpunodepool-md-58d9b96dd9-vsdbl
                cluster.x-k8s.io/owner-name: gpunodepool-md-58d9b96dd9
         nvidia.com/gpu:   1
         nvidia.com/gpu:   1
ProviderID:         moc://gpunodepool-97d9f5667-49lt4
kube-system         gpu-feature-discovery-gd62h       0 (0%)    0 (0%)   0 (0%)      0 (0%)     7m1s
         nvidia.com/gpu   0     0

Запуск рабочей нагрузки с поддержкой GPU

После выполнения предыдущих шагов создайте файл YAML для тестирования. например, gpupod.yaml. Скопируйте и вставьте следующий код YAML в новый файл с именем gpupod.yaml, а затем сохраните его:

apiVersion: v1
kind: Pod
metadata:
  name: cuda-vector-add
spec:
  restartPolicy: OnFailure
  containers:
  - name: cuda-vector-add
    image: "k8s.gcr.io/cuda-vector-add:v0.1"
    resources:
      limits:
        nvidia.com/gpu: 1

Выполните следующую команду, чтобы развернуть пример приложения:

kubectl apply -f gpupod.yaml

Убедитесь, что модуль pod запущен, завершен и назначен GPU:

kubectl describe pod cuda-vector-add | findstr 'gpu'

Предыдущая команда должна отобразить один назначенный GPU:

nvidia.com/gpu: 1
nvidia.com/gpu: 1

Проверьте файл журнала модуля pod, чтобы узнать, пройден ли тест:

kubectl logs cuda-vector-add

Ниже приведен пример выходных данных предыдущей команды:

[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done

Если при вызове драйверов появляется ошибка несоответствия версий, например "Версия драйвера CUDA недостаточна для версии среды выполнения CUDA", просмотрите диаграмму совместимости матрицы драйверов NVIDIA.

Вопросы и ответы

Что происходит во время обновления пула узлов с поддержкой GPU?

Обновление пулов узлов с поддержкой GPU выполняется по той же схеме последовательного обновления, которая используется для обычных пулов узлов. Для успешного создания пулов узлов с поддержкой GPU на новой виртуальной машине на физическом хост-компьютере требуется один или несколько физических GPU для успешного назначения устройств. Эта доступность гарантирует, что приложения могут продолжать работу, когда Kubernetes планирует модули pod на этом обновленном узле.

Перед обновлением

  1. Запланируйте простой во время обновления.
  2. У вас есть один дополнительный GPU на физический узел, если вы используете Standard_NK6 или 2 дополнительных GPU, если вы используете Standard_NK12. Если вы работаете с полной емкостью и у вас нет дополнительного GPU, рекомендуется выполнить масштабирование пула узлов до одного узла перед обновлением, а затем увеличить масштаб после успешного обновления.

Что произойдет, если у меня нет дополнительных физических GPU на физическом компьютере во время обновления?

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

Дальнейшие действия