Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 5 Next »

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

Настройка

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

sudo apt-get install -y cuda-drivers

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

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

enable_hardware_acceleration=true

При включенном аппаратном ускорении приоритет будет у 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 - интервал в секундах между тестами различных чипов

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

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

Во время тестирования 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,
        "decoderFps2": 29,
        "encoderFps2": 29
      },
      "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": "1.14 MB",
        "usedPciBandwidth2": "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

CodeReason
200OK
500Internal server error

Параметры

ПараметрОписаниеПример
mediaSessionОбъект описания сбора данных MEDIA_SESSION"mediaSession": {"frequency":100, "ids":["12345678-0000-1111"]} 
  • No labels