Использование нескольких видеокарт
Если в вашей системе на базе GPU на физическом сервере установлено несколько видеокарт, вы можете создать дополнительные экземпляры findface-extraction-api или findface-video-worker и распределить их по одному экземпляру на карту.
Если вы следовали инструкции по подготовке сервера на Ubuntu (CentOS, Debian), то у вас уже должно быть все готово к работе.
Однако прежде чем приступать к дальнейшим действиям, убедитесь, что в файле /etc/docker/daemon.json указана правильная конфигурация. В примере, приведенном для операционной системы Ubuntu, показано как настроить сеть Docker, а также как настроить использование среды NVIDIA Container Runtime. Обратите внимание, что в нашем примере мы подразумеваем, что среда NVIDIA Container Runtime уже установлена.
sudo su
BIP=10.$((RANDOM % 256)).$((RANDOM % 256))
cat > /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 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