Ограничение доступа к ресурсам для Cuda и OpenCL


Мы хотим расширить нашу пакетную систему для поддержки вычислений на GPU.

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

Для графических процессоров это означает, что каждое задание требует только GPU (когда запрашивается GPU).

Из того, что мне сказали, разделение графических процессоров между рабочими местами-очень плохая идея (потому что часть графических процессоров рабочих мест может быть убита случайным образом).

Итак, мне нужен какой-то способ ограничить доступ к графическим процессорам для CUDA и OpenCL. Пакетная система имеет права суперпользователя. Я могу ограничить доступ к устройствам в /dev/ с помощью cgroups, но я решил, что этого будет недостаточно в данном случае.

Идеальным состоянием будет, если задание будет видеть только столько графических процессоров, сколько оно запросило, и к ним не сможет получить доступ ни одно другое задание.

3 2

3 ответа:

На данный момент существует два соответствующих механизма:

  • Используйте nvidia-smi для установки устройств в эксклюзивный режим, таким образом, как только процесс имеет GPU, ни один другой процесс не может подключиться к тому же GPU.
  • Используйте переменную CUDA_VISIBLE_DEVICES для ограничения того, какие графические процессоры видит при поиске графического процессора.
Последнее, конечно, подвержено злоупотреблениям, но пока это только начало.

Из того, что мне сказали, совместное использование графических процессоров между рабочими местами-очень плохая идея (потому что графическая часть заданий может быть убита случайным образом).

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

Я считаю, что есть две вещи, которые могут помочь с графическими процессорами NVIDIA CUDA:

  1. переведите графические процессоры в режим" Compute Exclusive " с помощью инструмента nvidia-smi
  2. попросите пользователей использовать вызов no-args " cudaSetDevice ()", который автоматически выберет неиспользуемый GPU
  3. попросите пользователей использовать другие способы инициализации устройства, отличные от cudaSetDevice, как описано в разделе 8.3 "руководства по передовой практике"

Я не уверен, как достичь этого для OpenCL.

Я разработал библиотеку, которая будет сортировать доступные платформы и устройства OpenCL. Он подберет лучшее устройство на платформе. Затем он пытается создать контекст на нем. Если это не удается, он переходит к следующему в списке. Список отсортирован по количеству вычислительных единиц.

Он поддерживает технологию NVIDIA (графический процессор), АМД (видеокарты и процессора), процессор Intel (процессор) и Apple (GPU и процессора).

Имеется механизм блокировки для исключительного доступа. Но это не самое лучшее. Я все еще ищу лучшее решение. В основном он сохраняет файл с платформой+устройством, используемым в /tmp.

Это то, что мы используем в нашей лаборатории. Он доступен под GPLv3 и может быть найден на github: https://github.com/nbigaouette/oclutils/