Ограничение доступа к ресурсам для Cuda и OpenCL
Мы хотим расширить нашу пакетную систему для поддержки вычислений на GPU.
Проблема заключается в том, что с точки зрения пакетной системы GPU является ресурсом. Мы можем легко подсчитать использованные ресурсы, но нам также нужно ограничить доступ к ним.Для графических процессоров это означает, что каждое задание требует только GPU (когда запрашивается GPU).
Из того, что мне сказали, разделение графических процессоров между рабочими местами-очень плохая идея (потому что часть графических процессоров рабочих мест может быть убита случайным образом).
Итак, мне нужен какой-то способ ограничить доступ к графическим процессорам для CUDA и OpenCL. Пакетная система имеет права суперпользователя. Я могу ограничить доступ к устройствам в /dev/
с помощью cgroups
, но я решил, что этого будет недостаточно в данном случае.
Идеальным состоянием будет, если задание будет видеть только столько графических процессоров, сколько оно запросило, и к ним не сможет получить доступ ни одно другое задание.
3 ответа:
На данный момент существует два соответствующих механизма:
Последнее, конечно, подвержено злоупотреблениям, но пока это только начало.
- Используйте nvidia-smi для установки устройств в эксклюзивный режим, таким образом, как только процесс имеет GPU, ни один другой процесс не может подключиться к тому же GPU.
- Используйте переменную CUDA_VISIBLE_DEVICES для ограничения того, какие графические процессоры видит при поиске графического процессора.
Из того, что мне сказали, совместное использование графических процессоров между рабочими местами-очень плохая идея (потому что графическая часть заданий может быть убита случайным образом).
На самом деле нет, основная причина, по которой совместное использование GPU-плохая идея, заключается в том, что им придется конкурировать за доступную память, и все процессы могут потерпеть неудачу, хотя в действительности один из них мог бы продолжить. Кроме того, они конкурируют за доступ к DMA и вычислительным системам, что может привести к снижению общей производительности.
Я считаю, что есть две вещи, которые могут помочь с графическими процессорами NVIDIA CUDA:
- переведите графические процессоры в режим" Compute Exclusive " с помощью инструмента
nvidia-smi
попросите пользователей использовать вызов no-args " cudaSetDevice ()", который автоматически выберет неиспользуемый GPU- попросите пользователей использовать другие способы инициализации устройства, отличные от
cudaSetDevice
, как описано в разделе 8.3 "руководства по передовой практике"Я не уверен, как достичь этого для OpenCL.
Я разработал библиотеку, которая будет сортировать доступные платформы и устройства OpenCL. Он подберет лучшее устройство на платформе. Затем он пытается создать контекст на нем. Если это не удается, он переходит к следующему в списке. Список отсортирован по количеству вычислительных единиц.
Он поддерживает технологию NVIDIA (графический процессор), АМД (видеокарты и процессора), процессор Intel (процессор) и Apple (GPU и процессора).
Имеется механизм блокировки для исключительного доступа. Но это не самое лучшее. Я все еще ищу лучшее решение. В основном он сохраняет файл с платформой+устройством, используемым в /tmp.
Это то, что мы используем в нашей лаборатории. Он доступен под GPLv3 и может быть найден на github: https://github.com/nbigaouette/oclutils/