Использование нескольких видеокарт
Если в вашей системе на базе GPU на физическом сервере установлено несколько видеокарт, вы можете создать дополнительные экземпляры findface-extraction-api
или findface-video-worker
и распределить их по одному экземпляру на карту.
Если вы следовали инструкции по подготовке сервера на Ubuntu (CentOS, Debian), то у вас уже должно быть все готово к работе.
Однако прежде чем приступать к дальнейшим действиям, убедитесь, что в файле /etc/docker/daemon.json
указана правильная конфигурация. В примере, приведенном для операционной системы Ubuntu, показано как настроить сеть Docker, а также как настроить использование среды NVIDIA Container Runtime. Обратите внимание, что в нашем примере мы подразумеваем, что среда NVIDIA Container Runtime уже установлена.
BIP=10.$((RANDOM % 256)).$((RANDOM % 256))
sudo tee /etc/docker/daemon.json <<EOF
{
"default-address-pools":
[
{"base":"$BIP.0/16","size":24}
],
"bip": "$BIP.1/24",
"fixed-cidr": "$BIP.0/24",
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "nvidia"
}
EOF
Обратитесь к соответствующим разделам документации для проверки конфигурации файла /etc/docker/daemon.json
для CentOS и Debian.
В этом разделе:
Распределение экземпляров findface-extraction-api
между несколькими видеокартами
Для распределения экземпляров findface-extraction-api
по нескольким видеокартам создайте несколько экземпляров сервиса findface-extraction-api
в конфигурационном файле docker-compose.yaml
. Затем, чтобы экземпляры findface-extraction-api
работали в одной системе, объедините их через балансировщик нагрузки, например, Nginx.
Сделайте следующее:
Внесите изменения в конфигурационный файл
docker-compose.yaml
.Откройте файл
/opt/findface-cibr/docker-compose.yaml
и создайте несколько экземпляров конфигурацииfindface-extraction-api
в секцииfindface-extraction-api
. Каждый новый экземпляр конфигурацииfindface-extraction-api
должен быть настроен аналогично другому, чтобы не возникало проблем при обработке запросов. Сделайте следующее:Переименуйте используемое по умолчанию название сервиса
findface-extraction-api
.Создайте копии конфигурации для новых экземпляров сервиса.
Отредактируйте новые экземпляры конфигурации.
Ниже приведен пример конфигурации для двух сервисов:
sudo vi /opt/findface-cibr/docker-compose.yaml findface-extraction-api-0: command: [--config=/etc/findface-extraction-api.ini] depends_on: [findface-ntls] environment: - CUDA_VISIBLE_DEVICES=0 - CFG_LISTEN=127.0.0.1:18660 image: docker.int.ntl/ntech/universe/extraction-api-gpu:ffserver-9.230407.1 logging: {driver: journald} network_mode: service:pause restart: always runtime: nvidia volumes: ['./configs/findface-extraction-api/findface-extraction-api.yaml:/etc/findface-extraction-api.ini:ro', './models:/usr/share/findface-data/models:ro', './cache/findface-extraction-api/models:/var/cache/findface/models_cache'] findface-extraction-api-1: command: [--config=/etc/findface-extraction-api.ini] depends_on: [findface-ntls] environment: - CUDA_VISIBLE_DEVICES=1 - CFG_LISTEN=127.0.0.1:18661 image: docker.int.ntl/ntech/universe/extraction-api-gpu:ffserver-9.230407.1 logging: {driver: journald} network_mode: service:pause restart: always runtime: nvidia volumes: ['./configs/findface-extraction-api/findface-extraction-api.yaml:/etc/findface-extraction-api.ini:ro', './models:/usr/share/findface-data/models:ro', './cache/findface-extraction-api/models:/var/cache/findface/models_cache']
findface-extraction-api-0
— читаемое название экземпляра. Должно быть уникальным для каждого экземпляра;CUDA_VISIBLE_DEVICES=0
— идентификатор GPU для запуска экземпляра сервиса. Должен быть уникальным для каждого экземпляра;CFG_LISTEN=127.0.0.1:18660
— слушающий IP:Порт. Должен быть уникальным для каждого экземпляра;./cache/findface-extraction-api/models:/var/cache/findface/models_cache
— том (volume) для хранения кэша моделей нейронных сетей. Он может быть одинаковым, если у вас одинаковые модели GPU. В других случаях кэши хранятся отдельно.
Остальные параметры конфигурации могут быть одинаковыми для каждого экземпляра сервиса
findface-extraction-api
.Внесите изменения в файл
/opt/findface-cibr/docker-compose.yaml
, чтобы настроить балансировку нагрузки. Для этого добавьте новый сервис (findface-extraction-api-lb
в нашем примере) в файлdocker-compose.yaml
, например, в конец файла.findface-extraction-api-lb: depends_on: [findface-ntls] image: docker.int.ntl/ntech/multi/multi/ui-cibr:ffcibr-2.1.2.1 logging: {driver: journald} network_mode: service:pause restart: always volumes: ['./configs/findface-extraction-api/loadbalancer.conf:/etc/nginx/conf.d/default.conf:ro']
В томах (volumes) секции
findface-extraction-api-lb
мы указали конфигурационный файлloadbalancer.conf
. Теперь нам нужно создать его.
Создайте файл конфигурации балансировщика нагрузки со следующим содержимым:
sudo vi /opt/findface-cibr/configs/findface-extraction-api/loadbalancer.conf upstream findface-extraction-api-lb { least_conn; server 127.0.0.1:18660 max_fails=3 fail_timeout=60s; server 127.0.0.1:18661 max_fails=3 fail_timeout=60s; } server { listen 18666 default_server; server_name _; location / { proxy_pass http://findface-extraction-api-lb; } }
В секции
upstream
настройте поведение балансировки и перечислите экземплярыfindface-extraction-api
, между которыми будет распределяться нагрузка.Вы можете выбрать один из приведенных ниже вариантов поведения отправки, но мы рекомендуем использовать вариант
least_conn
.round-robin
— запросы равномерно распределяются по серверам циклически;least_conn
— запросы отправляются на сервер с наименьшим количеством активных соединений. Этот алгоритм удобен, когда у вас есть внутренние серверы с разной пропускной способностью;weighted
— внутренним серверам присваиваются различные веса, и запросы распределяются в зависимости от этих весов. Таким образом, у определенных серверов приоритет будет выше, чем у других.
Строка
server 127.0.0.1:18666 max_fails=3 fail_timeout=60s
состоит из следующих значимых частей:server
— определяет вышестоящий сервер в Nginx;127.0.0.1:18660
— указывает IP-адрес (127.0.0.1
) и порт (18660
) экземпляраfindface-extraction-api
;max_fails=3
— параметр задает максимальное количество неудачных попыток, которое Nginx допустит при подключении к серверу, прежде чем посчитает его недоступным;fail_timeout=60s
— параметр задает 1) время, в течение которого должно произойти заданное в параметреmax_fails
число неудачных попыток работы с сервером для того, чтобы сервер считался недоступным; 2) время, в течение которого сервер будет считаться недоступным (в данном случае 60 секунд);weight=2
(в текущем примере не используется) — параметр позволяет назначить относительный вес или приоритет каждому серверу в группеupstream
. Это означает, что на каждый запрос сервер сweight=2
получит в два раза больше запросов. Выставление параметра может понадобиться в сценариях, где используются графические процессоры разной производительности.
Откройте файл конфигурации
/opt/findface-cibr/configs/findface-sf-api/findface-sf-api.yaml
. Адрес и порт балансировщика нагрузки в секцииextraction-api
должны иметь вид127.0.0.1:18666
. Если адрес и порт балансировщика нагрузки в вашем примере отличаются от вышеуказанных значений, приведите их к виду127.0.0.1:18666
.sudo vi /opt/findface-cibr/configs/findface-sf-api/findface-sf-api.yaml extraction-api: timeouts: connect: 5s response_header: 30s overall: 35s idle_connection: 10s max-idle-conns-per-host: 20 keepalive: 24h0m0s trace: false url: http://127.0.0.1:18666
Запустите пересборку контейнеров FindFace CIBR, выполнив при этом очистку старых контейнеров для сервисов, которые больше не включены в файл
docker-compose.yaml
.cd /opt/findface-cibr/ docker-compose down docker-compose up -d --remove-orphans
Чтобы убедиться в правильной работе сервисов, проверьте их логи.
docker compose logs --tail 10 -f findface-extraction-api-0
docker compose logs --tail 10 -f findface-extraction-api-1
docker compose logs --tail 10 -f findface-extraction-api-lb
Привязка findface-video-worker
к дополнительной видеокарте
Для создания дополнительного экземпляра findface-video-worker
и его привязки к свободной видеокарте выполните следующие действия:
В файле
/opt/findface-cibr/docker-compose.yaml
укажите конфигурациюfindface-video-worker
для каждого запущенного экземпляраfindface-video-worker
. Скопируйте текущую конфигурациюfindface-video-worker
.sudo vi /opt/findface-cibr/docker-compose.yaml findface-video-worker: command: [--config=/etc/findface-video-worker.yaml] depends_on: [findface-video-manager, findface-ntls, mongodb] environment: [CUDA_VISIBLE_DEVICES=0] image: docker.int.ntl/ntech/universe/video-worker-gpu:ffserver-9.230407.1 logging: {driver: journald} network_mode: service:pause restart: always runtime: nvidia volumes: ['./configs/findface-video-worker/findface-video-worker.yaml:/etc/findface-video-worker.yaml:ro', './models:/usr/share/findface-data/models:ro', './cache/findface-video-worker/models:/var/cache/findface/models_cache', './cache/findface-video-worker/recorder:/var/cache/findface/video-worker-recorder']
Затем отредактируйте каждую конфигурацию соответствующим образом.
findface-video-worker-0: command: [--config=/etc/findface-video-worker.yaml] depends_on: [findface-video-manager, findface-ntls, mongodb] environment: - CUDA_VISIBLE_DEVICES=0 - CFG_STREAMER_PORT=18990 - CFG_STREAMER_URL=127.0.0.1:18990 image: docker.int.ntl/ntech/universe/video-worker-gpu:ffserver-9.230407.1 logging: {driver: journald} network_mode: service:pause restart: always runtime: nvidia volumes: ['./configs/findface-video-worker/findface-video-worker.yaml:/etc/findface-video-worker.yaml:ro', './models:/usr/share/findface-data/models:ro', './cache/findface-video-worker/models:/var/cache/findface/models_cache', './cache/findface-video-worker/recorder:/var/cache/findface/video-worker-recorder'] findface-video-worker-1: command: [--config=/etc/findface-video-worker.yaml] depends_on: [findface-video-manager, findface-ntls, mongodb] environment: - CUDA_VISIBLE_DEVICES=1 - CFG_STREAMER_PORT=18991 - CFG_STREAMER_URL=127.0.0.1:18991 image: docker.int.ntl/ntech/universe/video-worker-gpu:ffserver-9.230407.1 logging: {driver: journald} network_mode: service:pause restart: always runtime: nvidia volumes: ['./configs/findface-video-worker/findface-video-worker.yaml:/etc/findface-video-worker.yaml:ro', './models:/usr/share/findface-data/models:ro', './cache/findface-video-worker/models:/var/cache/findface/models_cache', './cache/findface-video-worker/recorder:/var/cache/findface/video-worker-recorder']
Здесь есть следующие основные параметры:
findface-video-worker-0
— новое название экземпляраfindface-video-worker
(в данном примере экземпляруfindface-video-worker
присвоен номер, равный ID GPU на устройстве);CUDA_VISIBLE_DEVICES=0
— идентификатор устройства CUDA для запуска нового экземпляра;CFG_STREAMER_PORT=18991
— порт стримера (должен быть уникальным);CFG_STREAMER_URL=127.0.0.1:18991
— URL для подключения и получения потока от экземпляраfindface-video-worker
(должен быть уникальным).
Все остальные параметры остаются неизменными.
Запустите пересборку контейнеров FindFace CIBR, выполнив при этом очистку старых контейнеров для сервисов, которые больше не включены в файл
docker-compose.yaml
.cd /opt/findface-cibr/ docker-compose down docker-compose up -d --remove-orphans
Чтобы убедиться в правильной работе экземпляров findface-video-worker
, проверьте их логи.
docker compose logs --tail 10 -f findface-video-worker-0
docker compose logs --tail 10 -f findface-video-worker-1