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

Если на физическом сервере установлено несколько видеокарт, вы можете создать дополнительные экземпляры findface-extract-api-gpu или findface-video-worker-gpu и распределить их по одному экземпляру на карту.

В этом разделе:

Распределение экземпляров findface-extraction-api-gpu по видеокартам

Для распределения экземпляров findface-extraction-api-gpu по нескольким видеокартам выполните следующие действия:

  1. Подготовьте исходный файл конфигурации findface-extraction-api-gpu для последующего копирования. Откройте /etc/findface-extraction-api.ini. Ограничьте количество экземпляров findface-extraction-api-gpu до 1 на видеокарту.

    sudo vi /etc/findface-extraction-api.ini
    
    ...
    extractors:
        instances: 1
    

    Совет

    При необходимости внесите другие коррективы. Например, можно включить распознавание дополнительных атрибутов. См. Распознавание атрибутов лица, Распознавание автомобилей и их атрибутов, Распознавание силуэтов и их атрибутов.

  2. Создайте несколько копий файла конфигурации /etc/findface-extraction-api.ini, в зависимости от того, какое количество видеокарт будет использоваться для извлечения векторов признаков. Добавьте номера устройств GPU, на которых будут запущены экземпляры, к именам новых файлов конфигурации (устройства GPU №0 и №7 в примере ниже).

    Примечание

    Нумерация устройств GPU в системе по умолчанию начинается с №0. Чтобы получить список используемых видеокарт, выполните следующую команду:

    nvidia-smi
    
    cp findface-extraction-api.ini findface-extraction-api-0.ini
    cp findface-extraction-api.ini findface-extraction-api-7.ini
    
  3. Откройте новые файлы конфигурации. Укажите номера соответствующих устройств GPU и измените номера слушающих портов. Каждый экземпляр должен слушать на своем порту.

    sudo vi /etc/findface-extraction-api-0.ini
    
    listen: 127.0.0.1:18667
    ...
    
    gpu_device: 0
    ...
    
    sudo vi /etc/findface-extraction-api-7.ini
    
    listen: 127.0.0.1:18668
    ...
    
    gpu_device: 7
    ...
    
  4. Чтобы экземпляры findface-extraction-api-gpu работали в одной системе, объедините их через балансировщик нагрузки, например, nginx. Для простоты мы рекомендуем настроить работу nginx на стандартном порту findface-extraction-api 18666 (подробнее см. ниже).

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

    1. Создайте новый файл конфигурации nginx.

      sudo vi /etc/nginx/sites-available/lb_extractions
      
    2. Вставьте текст следующего содержания в только что созданный файл. Обязательно укажите в директиве server фактические порты, на которых слушают экземпляры findface-extraction-api-gpu (в нашем примере 18667, 18668).

      upstream extractions {
          server 127.0.0.1:18667 max_fails=3 fail_timeout=30s;
          server 127.0.0.1:18668 max_fails=3 fail_timeout=30s;
          }
      
          server {
          listen 18666 default_server;
      
          server_name _;
      
          location / {
              client_max_body_size 100m;
              proxy_pass http://extractions;
          }
          }
      
    3. Включите балансировщик нагрузки.

      ln -s /etc/nginx/sites-available/lb_extractions /etc/nginx/sites-enabled/lb_extractions
      nginx -t
      nginx -s reload
      
  5. Остановите исходный сервис findface-extraction-api-gpu и удалите его из автозагрузки Ubuntu.

    systemctl stop findface-extraction-api.service
    systemctl disable findface-extraction-api.service
    
  6. Создайте новый сервис для экземпляров findface-extraction-api-gpu.

    /etc/systemd/system/findface-extraction-api@.service
    

    Вставьте следующий текст:

    [Unit]
    Description=Findface Extraction API service %i instance
    
    [Service]
    User=ntech
    Restart=always
    RestartSec=5
    Type=notify
    ExecStart=/usr/bin/findface-extraction-api -config="/etc/findface-extraction-api-%i.ini"
    TimeoutStartSec=60m
    
    [Install]
    WantedBy=multi-user.target
    
  7. Запустите экземпляры findface-extraction-api-gpu. Первый запуск может занять до 10 минут.

    systemctl daemon-reload
    systemctl enable findface-extraction-api@{0,7}
    systemctl start findface-extraction-api@{0,7}
    

    Совет

    Для проверки статуса выполните следующую команду:

    sudo systemctl list-units 'findface*' -a
    

Привязка findface-video-worker-gpu к дополнительной видеокарте

Для создания дополнительного экземпляра findface-video-worker-gpu и его привязки к свободной видеокарте выполните следующие действия:

  1. Отобразите статус исходного сервиса findface-video-worker-gpu, выполнив команду:

    sudo systemctl status findface-video-worker-gpu.service
    
  2. Найдите полный путь к сервису в следующей строке:

    Loaded: loaded (/usr/lib/systemd/system/findface-video-worker-gpu.service); enabled; vendor preset: enabled
    

    В приведенном примере это findface-video-worker-gpu.service (имя может быть другим). Создайте копию сервиса под новым именем.

    sudo cp /usr/lib/systemd/system/findface-video-worker-gpu.service /usr/lib/systemd/system/findface-video-worker-gpu2.service`
    
  3. Таким же образом создайте под новым именем копию исходного файла конфигурации.

    sudo cp /etc/findface-video-worker-gpu.ini /etc/findface-video-worker-gpu2.ini
    
  4. Откройте только что созданный файл конфигурации и актуализируйте номер используемого GPU-устройства. Измените номер порта в секции streamer по следующей формуле: 18999 (номер порта для GPU 0) - номер GPU-устройства, т. е. для GPU 1, port = 18998, для GPU 2, port = 18997 и т. д.

    sudo vi /etc/findface-video-worker-gpu2.ini
    
    ## cuda device number
    device_number = 1
    
    ...
    
    #------------------------------
    [streamer]
    #------------------------------
    ## streamer/shots webserver port, 0=disabled
    ## type:number env:CFG_STREAMER_PORT longopt:--streamer-port
    port = 18999
    ...
    
  5. Откройте новый сервис и укажите только что созданный файл конфигурации.

    sudo vi /usr/lib/systemd/system/findface-video-worker-gpu2.service
    
    ExecStart=/usr/bin/findface-video-worker-gpu --config /etc/findface-video-worker-gpu2.ini
    
  6. Для применения изменений перезагрузите демон systemd.

    sudo systemctl daemon-reload
    
  7. Добавьте новый сервис в автозагрузку.

    sudo systemctl enable findface-video-worker-gpu2.service
    
    Created symlink from /etc/systemd/system/multi-user.target.wants/findface-video-worker-gpu2.service to /usr/lib/systemd/system/findface-video-worker-gpu2.service
    
  8. Запустите новый сервис.

    sudo systemctl start findface-video-worker-gpu2.service
    
  9. Проверьте статус обоих сервисов findface-video-worker-gpu.

    sudo systemctl status findface-video-worker-* | grep -i 'Active:' -B 3
    
    ● findface-video-worker-gpu2.service - findface-video-worker-gpu daemon
      Loaded: loaded (/usr/lib/systemd/system/findface-video-worker-gpu2.service; enabled; vendor preset: enabled)
      Active: active (running) since Thu 2019-07-18 10:32:02 MSK; 1min 11s ago
    
    ...
    
    ● findface-video-worker-gpu.service - findface-video-worker-gpu daemon
      Loaded: loaded (/usr/lib/systemd/system/findface-video-worker-gpu.service; enabled; vendor preset: enabled)
      Active: active (running) since Mon 2019-07-15 15:18:33 MSK; 2 days ago