Как стать автором
Обновить
50.15
HOSTKEY
IT-инфраструктура: сервера, VPS, GPU, коло

Тестируем многопоточную раздачу видео на игровых GPU

Время на прочтение6 мин
Количество просмотров4.9K

При работе с потоковым видео качество и скорость воспроизведения играют ключевую роль. Можно ли настроить многопоточную трансляцию без покупки дорогостоящего «железа»? Попробуем разобраться.

Проблема. Качественная трансляция видео обычно предполагает серьезные издержки: нужно выделить помещение и создать в нем инженерную инфраструктуру, закупить оборудование и нанять сотрудников для его обслуживания, арендовать каналы передачи данных и провести другие необходимые мероприятия. В зависимости от масштаба проекта только капитальные вложения могут потребовать значительных бюджетов.

Какова альтернатива?

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

А вот для организации вещания стоит попробовать FFmpeg. 

Мы используем этот бесплатный набор библиотек с открытым кодом для автоматизированного тестирования видеокарт. Внедрить и обслуживать решения на его основе довольно просто, к тому же они отличаются высокой скоростью кодирования и декодирования потоков. Повышение скорости достигается за счет отказа от копирования кодированных файлов в системную память: процесс кодирования осуществляется с использованием памяти графического чипа.

Схема процесса транскодинга с применением FFmpeg:

Патч для драйвера и сборка FFmpeg

Проводить тестирование мы будем в Ubuntu Linux, причем начнем с игровых графических ускорителей: GeForce GTX 1080 Ti и GeForce RTX 3090. В реальных проектах они не используются, но продемонстрировать разницу между транскодированием на CPU и GPU вполне способны. Производитель не считает эти адаптеры «квалифицированными» и ограничивает максимальное количество одновременных сеансов транскодирования видео NVENC. Чтобы решить эту проблему, придется применить хитрость и отключить проверку с помощью выложенного энтузиастами на GitHub патча для видеодрайвера.  

Патч не потребуется для профессиональных видеокарт, например, таких как RTX A4000 или A5000, поскольку для них в драйвере нет жесткого ограничения количества потоков. Список видеокарт NVIDIA с поддержкой NVENC доступен на сайте производителя. Технологию можно использовать в виде набора разработчика NVENC SDK.

Также необходимо собрать FFmpeg с поддержкой GPU NVIDIA. Пока мы не выложили его в репозиторий, поэтому приведем подробную инструкцию для Ubuntu (в других дистрибутивах Linux порядок действий сходный):

# Compiling for Linux
# FFmpeg with NVIDIA GPU acceleration is supported on all Linux platforms.
# To compile FFmpeg on Linux, do the following:
# Clone ffnvcodec
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
# Install ffnvcodec
cd nv-codec-headers && sudo make install && cd –
# Clone FFmpeg's public GIT repository.
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg/
# Install necessary packages.
sudo apt-get install build-essential yasm cmake libtool libc6 libc6-dev unzip wget libnuma1 libnuma-dev
# Configure
./configure --enable-nonfree --enable-cuda-nvcc --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --disable-static --enable-shared
# Compile
make -j 8
# Install the libraries.
sudo make install

Настройка трансляции

Для трансляции потокового видео c использованием FFmpeg нам понадобится ffserver. Отредактируем файл ffserver.conf (стандартный путь к нему — /etc/ffserver.conf).

Пример конфигурации ffserver для потокового вещания:

# Указываем порт, на котором будет работать сервер.
HTTPPort 8090
# Адрес, на котором будет работать сервер (0.0.0.0 — все доступные адреса).
HTTPBindAddress 0.0.0.0
# Максимальная пропускная способность на одного клиента в кб/с (до 100000).
MaxClients 1000 
RTSPPort 5454
RTSPBindAddress 0.0.0.0

<Stream name>
Format rtp
File /root/file.name.mp4
ACL allow 0.0.0.0
#VideoCodec libx264
#VideoSize 1920X1080
</Stream>

Пример команды для запуска потокового вещания:

ffserver ffmpeg  bbb_sunflower_1080p_30fps_normal.mp4 http://ip/feed.ffm

Пример декодирования потокового видео с использованием GPU и декодера NVENC (подключение к трансляции потокового видео и сохранение его на устройство):

ffmpeg -i rtsp://ip:5454/nier -c:v h264_nvenc Output-File.mp4

Пример вывода nvidia-smi подтверждает, что FFmpeg использует GPU: 0 N/A N/A 27564 C ffmpeg 152MiB.

Тестирование

Сравнительное тестирование транскодинга живых потоков FullHD 1080p в high profile H.264 мы провели на потребительских видеокартах, не проходивших специальной подготовки. Работа GeForce RTX 3090 была проверена без снятия ограничений на количество потоков, а также с пропатченным драйвером (для GTX 1080 Ti тест без патча показался нам избыточным). В качестве исходного видео выбрали один из демофайлов Blender — bbb_sunflower_1080p_30fps_normal.mp4

Для тестирования сигнала использовался входной поток со следующими параметрами:

Компрессия видео

H.264

Размер кадра

1920 x 1080 пикселей

Частота кадров

30 кадров/сек

Битрейт видео

2,996 Мбит/сек

Компрессия аудио

AAC

Частота аудиосигнала

48 кГц

Количество аудиоканалов

Стерео

Битрейт аудио

479 кбит/сек

Разрешение FullHD 1080p считается одним из самых распространенных для потокового вещания видео в режиме реального времени и позволяет обеспечить интенсивную вычислительную нагрузку при тестировании.

Описание тестовой среды:

Тест на CPU

GeForce GTX 1080 Ti

GeForce RTX 3090

CPU

4 x VPS Core

4 x VPS Core

1 x Xeon E3-1230v6 3.5GHz (4 cores)

RAM

1 x VPS RAM 16Gb

1 x VPS RAM 16Gb

2 x 16 Gb DDR4

HDD

1 x VPS HDD 240 Gb

1 x VPS HDD 240 Gb

1 x 512Gb SSD

1 x 120Gb SSD

Other hardware

1 x VGPU 1080Ti

1 x VGPU 1080Ti

1 x RTX 3090

Тест на CPU

CPU

4 x VPS Core

RAM

1 x VPS RAM 16Gb

HDD

1 x VPS HDD 240 Gb

Other hardware

1 x VGPU 1080Ti

GeForce GTX 1080 Ti

CPU

4 x VPS Core

RAM

1 x VPS RAM 16Gb

HDD

1 x VPS HDD 240 Gb

Other hardware

1 x VGPU 1080Ti

GeForce RTX 3090

CPU

1 x Xeon E3-1230v6 3.5GHz (4 cores)

RAM

2 x 16 Gb DDR4

HDD

1 x 512Gb SSD

1 x 120Gb SSD

Other hardware

1 x RTX 3090

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

Fan

Temp

Perf

Pwr:Usage/Cap

Memory-Usage

GeForce GTX 1080 Ti

59%

82C

P2

86W / 250W

5493MiB/11178MiB

GeForce RTX 3090

43%

51C

P2

149W / 350W

22806MiB /24267MiB

GeForce GTX 1080 Ti

Fan

59%

Temp

82C

Perf

P2

Pwr:Usage/Cap

86W / 250W

Memory-Usage

5493MiB/11178MiB

GeForce RTX 3090

Fan

43%

Temp

51C

Perf

P2

Pwr:Usage/Cap

149W / 350W

Memory-Usage

22806MiB /24267MiB

Тест на CPU без использования GPU прошел успешно, но максимально загрузил сервер: были задействованы все вычислительные ядра и вся доступная память, а на выходе мы получили лишь несколько потоков. Высокая нагрузка на процессор не позволяет эффективно использовать такой способ для организации реальной трансляции из-за риска возникновения критических ошибок и сбоев. CPU не годится для проведения большого количества параллельных операций.

При проведении тестирования GPU на вход декодера подавался один поток, а на выходе транскодированные потоки раздавались через протокол rstp. Отметим, что GeForce RTX 3090 без патча драйвера осилила только три потока. При попытке обработать больше мы получили ошибки:

[h264_nvenc @ 0x55ddbdd3ef80] OpenEncodeSessionEx failed: out of memory (10): (no details)
[h264_nvenc @ 0x55ddbdd3ef80] No capable devices found
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or heightight

Количество потоков после применения патча к видеодрайверу и объем используемой памяти представлены на диаграмме:

Лимит количества обрабатываемой каждой картой потоков ограничен как объемом памяти GPU, так и оперативной памятью. Модификации GeForce RTX 3090 отличаются по объему видеопамяти, но обрабатывают одинаковое количество потоков, что определяется тестовой сборкой — 32 Гб оперативной памяти. Ниже приведен пример вывода данных об оперативной памяти тестового стенда с видеокартой GeForce RTX 3090 при проведении тестирования:

Total

Used

Free

Shared

Buff

Cache available

Mem

31 G

11 G

234 M

1,3 G

19 G

18 G

Swap

4,0 G

1,0 M

4,0 G

Mem

Total

31 G

Used

11 G

Free

234 M

Shared

1,3 G

Buff

19 G

Cache available

18 G

Swap

Total

4,0 G

Used

1,0 M

Free

4,0 G

Заключение

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

То есть FFmpeg вполне можно выбрать для качественной трансляции без покупки коммерческого программного обеспечения и дорогостоящих рабочих станций. Например, как бюджетный вариант для задач видеонаблюдения и сохранения потоков с нескольких десятков камер в файлы: здесь можно взять машину с одной GeForce GTX 1080 Ti и писать с нее потоки на NAS самостоятельно. 

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

Разумеется, вне вашего офиса/площадки или на территории ЦОДа из-за лицензионных правил NVIDIA использовать игровые карты не получится, да и незачем: для этого есть профессиональные линейки. Об экспериментах с ними рассказываем в следующей части статьи

Кстати, в HOSTKEY можно бесплатно попробовать серверы с RTX A5000 / A4000. 

Теги:
Хабы:
Всего голосов 5: ↑4 и ↓1+3
Комментарии10

Публикации

Информация

Сайт
www.hostkey.ru
Дата регистрации
Дата основания
Численность
31–50 человек
Местоположение
Россия