Использование нескольких видеокарт

Если в вашей системе на базе 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.

Сделайте следующее:

  1. Внесите изменения в конфигурационный файл docker-compose.yaml.

    1. Откройте файл /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.

    2. Внесите изменения в файл /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. Теперь нам нужно создать его.

  2. Создайте файл конфигурации балансировщика нагрузки со следующим содержимым:

    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 получит в два раза больше запросов. Выставление параметра может понадобиться в сценариях, где используются графические процессоры разной производительности.

  3. Откройте файл конфигурации /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
    
  4. Запустите пересборку контейнеров 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 и его привязки к свободной видеокарте выполните следующие действия:

  1. В файле /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 (должен быть уникальным).

    Все остальные параметры остаются неизменными.

  2. Запустите пересборку контейнеров 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