Перейти к содержанию

Поддержка аппаратного ускорения при транскодинге видео

Описание

Начиная со сборки 5.2.2022, WCS поддерживает аппаратное ускорение при декодировании и кодировании видео с использование NVIDIA GPU.

Требования к серверу

  • Ubuntu 22.04 или новее
  • установленные драйверы NVIDIA
  • установленный графический адаптер NVIDIA

Поддерживаемые сценарии использования

  • транскодинг H264 и H265 в любом сочетании
  • микшер H264 (только кодирование)
  • HLS ABR H264
  • WebRTC ABR H264

Warning

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

Неподдерживаемые сценарии использования

Транскодинг на GPU не поддерживается для:

Warning

Во всех этих случаях поток должен декодироваться и кодироваться на CPU, аппаратное ускорение должно быть отключено

Рекомендуется выделять под вышеперечисленные сценарии отдельный сервер без GPU.

Настройка

Для работы аппаратного ускорения на сервере должны быть установлены NVIDIA CUDA драйверы по инструкции с официального сайта. При этом CUDA toolkit устанавливать не нужно:

sudo apt-get install -y cuda-drivers

Если драйверы установлены успешно, утилита nvidia-smi покажет текущее состояние GPU

Поддержка аппаратного ускорения включается настройкой

enable_hardware_acceleration=true

Warning

При включенном аппаратном ускорении приоритет будет у CUDA кодировщика/декодировщика, если сценарий использования не попадает под исключения!

Настройка для работы под нагрузкой

Настроек по умолчанию достаточно для небольшого количества сессий транскодинга и тестирования. Однако для эксплуатации в условиях повышенных нагрузок необходимо настроить такие параметры, как максимально допустимое количество кодировщиков на графическое ядро и на сервер в целом. Для этого используется файл настроек /usr/local/FlashphonerWebCallServer/conf/gpu_config.json

[
  {
    "gpuName" : "Tesla P100-PCIE-16GB",
    "disabled" : false,
    "config" : {
      "maxEncodeSessions" : 95,
      "maxHostEncodeSessions" : 95,
      "maxDecodeSessions" : 19,
      "maxEncoderUtilization" : 90,
      "maxDecoderUtilization" : 90,
      "minMemoryAvailable" : "4 GB"
    }
  }
]
[
  {
    "pciBusId" : "0000:02:00.0",
    "disabled" : false,
    "config" : {
      "maxEncodeSessions" : 95,
      "maxHostEncodeSessions" : 95,
      "maxDecodeSessions" : 19,
      "maxEncoderUtilization" : 90,
      "maxDecoderUtilization" : 90,
      "minMemoryAvailable" : "4 GB"
    }
  }
]

Здесь:

  • gpuName - имя GPU
  • pciBusId - идентификатор GPU на PCI шине
  • disabled - не использовать GPU
  • maxEncodeSessions - максимальное количество кодировщиков на GPU
  • maxHostEncodeSessions - максимальное количество кодировщиков на сервере
  • maxDecodeSessions - максимальное количество декодеров на GPU
  • maxEncoderUtilization - максимальная нагрузка на GPU при кодировании, в процентах
  • maxDecoderUtilization - максимальная нагрузка на GPU при декодировании, в процентах
  • minMemoryAvailable - минимальное количество свободной памяти

Если в сервер установлены несколько GPU, конфигурация с именем GPU применяется ко всем чипам с таким именем. Конфигурация с идентификатором GPU на PCI шине применяется только к одному GPU, т.к. идентификаторы на PCI шине уникальны для каждого устройства.

Инструмент для тестирования GPU и автоматической генерации файла настроек

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

/usr/local/FlashphonerWebCallServer/tools/gpu_calibration_tool.sh sample.mp4 --separate-test --interval=20

Здесь:

  • sample.mp4 - файл-источник видео для тестирования, должен содержать видео максимального разрешения, которое будет использоваться в эксплуатации, например, 1920x1080
  • --separate-test - провести тестирование всех GPU, установленных на сервере и доступных операционной системе; если этот ключ не указан, проводится тест одного GPU, выбранного случайным образом
  • --interval - интервал в секундах между тестами различных чипов

Для тестирования инструмент использует профили кодирования, заданные в файле /usr/local/FlashphonerWebCallServer/conf/hls_abr_profiles.yml (см HLS ABR на одном узле).

Инструмент проводит тестирование и создает файл настроек с максимальными параметрами GPU по результатам теста. Если тестируется несколько чипов, в настройках будут указаны их идентификаторы на PCI шине. Если тестируется только один чип (ключ --separate-test не указан), в настройках будет имя GPU.

Если в сервер установлены разные GPU, и ключ --separate-test не указан, будет протестировано по одному из GPU каждого типа

Warning

Во время тестирования WCS должен быть остановлен!

Изменение конфигурации кодирования/декодирования при изменении разрешения исходного потока

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

hardware_acceleration_enable_soft_reconfiguration=true
hardware_acceleration_reconfigure_max_width=1920
hardware_acceleration_reconfigure_max_height=1088

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

С настройкой

hardware_acceleration_enable_soft_reconfiguration=false

настройки декодирования будут сбрасываться при каждом изменении разрешения. Это может сильно повлиять на производительность.

Мониторинг

Текущую статистику использования GPU можно получить при помощи REST API.

REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:

  • HTTP: http://streaming.flashphoner.com:8081/rest-api/gpu/info
  • HTTPS: https://streaming.flashphoner.com:8444/rest-api/gpu/info

Здесь:

  • streaming.flashphoner.com - адрес WCS-сервера
  • 8081 - стандартный REST / HTTP порт WCS-сервера
  • 8444 - стандартный HTTPS порт
  • rest-api - обязательный префикс
  • /gpu/info - используемый REST-вызов

REST методы и статусы ответа

/gpu/info

Получить текущую статистику использования всех GPU

Request example
POST /rest-api/gpu/info HTTP/1.1
Host: localhost:8081
Content-Type: application/json
Response example
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/json

{
  "cudaVersion": "12.4",
  "nvencVersion": "12.2",
  "driverVersion": "550.90.07",
  "nvmlVersion": "12.550.90.07",
  "numOfAvailableDevices": 1,
  "numOfDecodingSessions": 1,
  "numOfEncodingSessions": 5,
  "numOfHostEncodingSessions": 5,
  "deviceList": [
    {
      "name": "Tesla P100-PCIE-16GB",
      "pciBusId": "0000:02:00.0",
      "computeCapability": "6.0",
      "computeMode": 0,
      "computeModeDescription": "Default compute mode (Multiple contexts allowed per device)",
      "numOfDecodingSessions": 1,
      "numOfEncodingSessions": 5,
      "numOfHostEncodingSessions": 5,
      "fpsStats": {
        "decoderFps": 30,
        "encoderFps": 30
      },
      "nativeEncoderStats": {
        "averageFps": 29,
        "averageLatency": 1225
      },
      "utilizationState": {
        "computeUtilization": 1,
        "memUtilization": 0,
        "decoderUtilization": 5,
        "encoderUtilization": 4,
        "totalMem": "16 GB",
        "freeMem": "15.26 GB",
        "usedMem": "752.25 MB",
        "usedPciBandwidth": "984.76 KB"
      },
      "supportedEncodeCodecs": {
        "H265": {
          "minWidth": 65,
          "minHeight": 33,
          "maxWidth": 4096,
          "maxHeight": 4096
        },
        "H264": {
          "minWidth": 33,
          "minHeight": 17,
          "maxWidth": 4096,
          "maxHeight": 4096
        }
      },
      "supportedDecodeCodecs": {
        "H265": {
          "minWidth": 144,
          "minHeight": 144,
          "maxWidth": 4096,
          "maxHeight": 4096
        },
        "H264": {
          "minWidth": 48,
          "minHeight": 16,
          "maxWidth": 4096,
          "maxHeight": 4096
        }
      }
    }
  ]
}
Return codes
Code Reason
200 OK
500 Internal server error

Параметры

Параметр Описание Пример
cudaVersion Версия CUDA 12.4
nvencVersion Версия NVENC 12.2
driverVersion Версия драйверов NVIDIA 550.90.07
nvmlVersion Версия NVIDIA management library 12.550.90.07
numOfAvailableDevices Количество доступных GPU 1
numOfDecodingSessions Количество декодеров 1
numOfEncodingSessions Количество кодировщиков 5
numOfHostEncodingSessions Количество кодировщиков на сервер 5
name Имя GPU Tesla P100-PCIE-16GB
pciBusId Идентификатор GPU на PCI шине 0000:02:00.0
computeCapability Идентификатор возможностей GPU 6.0
computeMode Режим вычислений GPU 0
computeModeDescription Описание режима вычислений Default compute mode (Multiple contexts allowed per device)
decoderFps FPS декодирования 30
encoderFps FPS кодирования 30
averageFps Средний FPS по данным GPU 29
averageLatency Средняя задержка по данным GPU в микросекундах 1225
computeUtilization Процент использования GPU 1
memUtilization Процент использования памяти 0
decoderUtilization Процент загрузки декодирования 5
encoderUtilization Процент загрузки кодирования 4
totalMem Общее количество памяти 16 GB
freeMem Количество свободной памяти 15.26 GB
usedMem Количество используемой памяти 752.25 MB
usedPciBandwidth Использование пропускной способности шины PCI 984.76 KB
minWidth Минимальная ширина картинки для декодирования/кодирования 33
minHeight Минимальная высота картинки для декодирования/кодирования 17
maxWidth Максимальная ширина картинки для декодирования/кодирования 4096
maxHeight Максимальная высота картинки для декодирования/кодирования 4096