Миграция векторов признаков на другую модель нейронной сети

Совет

Не стесняйтесь обращаться к нашим специалистам по вопросам миграции по адресу support@ntechlab.com.

Важно

В случае если вы выполняете миграцию как часть обновления системы до новой версии, выполните сначала обновление. Только после этого приступайте к миграции.

Этот раздел посвящен миграции векторов признаков объектов на другую модель нейронной сети.

Выполните следующие действия:

  1. Создайте резервную копию базы данных векторов признаков на основе Tarantool в любой выбранной директории, например, /etc/ffmulti_dump.

    sudo docker exec -it findface-multi-findface-sf-api-1 bash -c "mkdir ffmulti_dump; cd ffmulti_dump && /storage-api-dump -config /etc/findface-sf-api.ini"
    sudo docker cp findface-multi-findface-sf-api-1:/ffmulti_dump /etc
    
  2. Создайте новые шарды, в которых будут храниться заново сгенерированные векторы признаков.

    1. Перейдите в директорию /opt/findface-multi/configs/findface-tarantool-server/ и подсчитайте количество шардов по количеству файлов конфигурации shard-00*.lua.

      Примечание

      В примере ниже восемь шардов.

      cd /opt/findface-multi/configs/findface-tarantool-server
      
      ls -l
      
      shard-001.lua
      shard-002.lua
      shard-003.lua
      shard-004.lua
      shard-005.lua
      shard-006.lua
      shard-007.lua
      shard-008.lua
      
    2. В директории /opt/findface-multi/configs/findface-tarantool-server/ создайте новые шарды в том же количестве. Для этого скопируйте уже существующие файлы конфигурации shard-00*.lua.

      Примечание

      Для удобства в качестве второй цифры в новых именах используется 1: shard-01*.lua.

      for i in {1..8}; do sudo cp shard-00$i.lua shard-01$i.lua; done
      
    3. В файле конфигурации каждого шарда измените следующие строки в зависимости от его имени:

      Прежнее значение

      Новое значение

      listen = '127.0.0.1:32001'

      Listen = '127.0.0.1:32011'

      FindFace.start(«127.0.0.1», 8101, {

      FindFace.start(«127.0.0.1», 8111, {

      Это можно сделать, выполнив следующую команду:

      for i in {1..8}; do sudo sed -i "s/    listen = '127.0.0.1:3200$i',/    listen = '127.0.0.1:3201$i',/" shard-01$i.lua && sudo sed -i "s/FindFace.start(\"127.0.0.1\", 810$i, {/FindFace.start(\"127.0.0.1\", 811$i, {/" shard-01$i.lua; done
      
    4. Создайте директории, в которых будут храниться файлы новых шардов.

      cd /opt/findface-multi/data/findface-tarantool-server
      
      sudo mkdir -p shard-01{1..8}/{index,snapshots,xlogs}
      
  3. Откройте файл конфигурации /opt/findface-multi/configs/findface-extraction-api/findface-extraction-api.yaml и замените модели extraction на новые в параметрах body_emben, car_emben и face_emben, в зависимости от мигрируемых типов объектов.

    sudo vi /opt/findface-multi/configs/findface-extraction-api/findface-extraction-api.yaml
    
    extractors:
      ...
      models:
        ...
         body_emben: pedrec/<new_model_body>.cpu<gpu>.fnk
         ...
         car_emben: carrec/<new_model_car>.cpu<gpu>.fnk
         ...
         face_emben: face/<new_model_face>.cpu<gpu>.fnk
         ...
    

    Перезапустите контейнер findface-multi-findface-extraction-api-1.

    cd /opt/findface-multi/
    sudo docker-compose restart findface-extraction-api
    
  4. В файле docker-compose.yaml создайте новые сервисы для каждого нового шарда. Для этого скопируйте существующий сервис и замените имя шарда на новое.

    sudo vi docker-compose.yaml
    
    services:
      ...
      findface-tarantool-server-shard-**011**:
        depends_on: [findface-ntls]
        image: docker.int.ntl/ntech/universe/tntapi:ffserver-8.221216
        network_mode: service:pause
        restart: always
        volumes: ['./configs/findface-tarantool-server/shard-**011**.lua:/etc/tarantool/instances.enabled/FindFace.lua:ro',
          './data/findface-tarantool-server/shard-**011**:/var/lib/tarantool/FindFace', './configs/findface-tarantool-server/tnt-schema.lua:/tnt_schema.lua:ro']
      ...
    
  5. Запустите новые шарды, подняв контейнеры.

    sudo docker-compose up -d
    
  6. На основании приведенного ниже примера создайте файл конфигурации с настройками миграции migration.yaml.

    sudo vi migration.yaml
    
    extraction-api:
      timeouts:
        connect: 5s
        response_header: 30s
        overall: 35s
        idle_connection: 0s
      extraction-api: http://127.0.0.1:18666
    storage-api-from: # current location of the gallery
      timeouts:
        connect: 5s
        response_header: 30s
        overall: 35s
        idle_connection: 10s
      max-idle-conns-per-host: 20
      shards:
        - master: http://127.0.0.1:8101/v2/
          slave: ''
        - master: http://127.0.0.1:8102/v2/
          slave: ''
        - master: http://127.0.0.1:8103/v2/
          slave: ''
        - master: http://127.0.0.1:8104/v2/
          slave: ''
        - master: http://127.0.0.1:8105/v2/
          slave: ''
        - master: http://127.0.0.1:8106/v2/
          slave: ''
        - master: http://127.0.0.1:8107/v2/
          slave: ''
        - master: http://127.0.0.1:8108/v2/
          slave: ''
    storage-api-to:
      timeouts:
        connect: 5s
        response_header: 30s
        overall: 35s
        idle_connection: 10s
      max-idle-conns-per-host: 20
      shards:
        - master: http://127.0.0.1:8111/v2/
          slave: ''
        - master: http://127.0.0.1:8112/v2/
          slave: ''
        - master: http://127.0.0.1:8113/v2/
          slave: ''
        - master: http://127.0.0.1:8114/v2/
          slave: ''
        - master: http://127.0.0.1:8115/v2/
          slave: ''
        - master: http://127.0.0.1:8116/v2/
          slave: ''
        - master: http://127.0.0.1:8117/v2/
          slave: ''
        - master: http://127.0.0.1:8118/v2/
          slave: ''
    workers_num: 3
    faces_limit: 100
    extraction_batch_size: 8
    normalized_storage:
      type: webdav
      enabled: True
      webdav:
        upload-url: http://127.0.0.1:3333/uploads/
      s3:
        endpoint: ''
        bucket-name: ''
        access-key: ''
        secret-access-key: ''
        secure: False
        region: ''
        public-url: ''
        operation-timeout: 30
    

    В разделе storage-api-from укажите шарды, с которых осуществляется миграция.

    storage-api-from: # current location of the gallery
      ...
      shards:
        - master: http://127.0.0.1:8101/v2/
          slave: ''
        - master: http://127.0.0.1:8102/v2/
          slave: ''
        - master: http://127.0.0.1:8103/v2/
          slave: ''
        - master: http://127.0.0.1:8104/v2/
          slave: ''
        - master: http://127.0.0.1:8105/v2/
          slave: ''
        - master: http://127.0.0.1:8106/v2/
          slave: ''
        - master: http://127.0.0.1:8107/v2/
          slave: ''
        - master: http://127.0.0.1:8108/v2/
          slave: ''
        ...
    

    В разделе storage-api-to укажите новые шарды, в которых будут храниться данные после миграции.

    storage-api-to:
      ...
      shards:
        - master: http://127.0.0.1:8111/v2/
          slave: ''
        - master: http://127.0.0.1:8112/v2/
          slave: ''
        - master: http://127.0.0.1:8113/v2/
          slave: ''
        - master: http://127.0.0.1:8114/v2/
          slave: ''
        - master: http://127.0.0.1:8115/v2/
          slave: ''
        - master: http://127.0.0.1:8116/v2/
          slave: ''
        - master: http://127.0.0.1:8117/v2/
          slave: ''
        - master: http://127.0.0.1:8118/v2/
          slave: ''
        ...
    
  7. Скопируйте файл migration.yaml внутрь контейнера findface-multi-findface-sf-api-1. Запустите утилиту sf-api-migrate с опцией -config и укажите файл конфигурации migration.yaml.

    sudo docker cp migration.yaml findface-multi-findface-sf-api-1:/
    sudo docker exec findface-multi-findface-sf-api-1 ./sf-api-migrate -config migration.yaml
    

    Примечание

    Если в системе много событий и карточек, процесс миграции может занять значительное количество времени.

  8. После завершения миграции удалите сервисы старых шардов из файла docker-compose.yaml и остановите используемые ими контейнеры.

    sudo docker-compose up -d --remove-orphans
    
  9. Откройте файл конфигурации /opt/findface-multi/configs/findface-sf-api/findface-sf-api.yaml и измените порты шардов в зависимости от новых настроек. Перезапустите контейнер findface-multi-findface-sf-api-1.

    sudo vi /opt/findface-multi/configs/findface-sf-api/findface-sf-api.yaml
    
    storage-api:
      shards:
      - master: http://127.0.0.1:8111/v2/
        slave: ''
      - master: http://127.0.0.1:8112/v2/
        slave: ''
      - master: http://127.0.0.1:8113/v2/
        slave: ''
      - master: http://127.0.0.1:8114/v2/
        slave: ''
      - master: http://127.0.0.1:8115/v2/
        slave: ''
      - master: http://127.0.0.1:8116/v2/
        slave: ''
      - master: http://127.0.0.1:8117/v2/
        slave: ''
      - master: http://127.0.0.1:8118/v2/
        slave: ''
    
    sudo docker-compose restart findface-sf-api
    
  10. Мигрируйте кластеры, если данная функция включена в системе. Для этого выполните следующую команду:

    Примечание

    Перечислите мигрируемые типы объектов в виде опций команды: --face, --body, --car.

    sudo docker exec -it findface-multi-findface-multi-legacy-1 /opt/findface-security/bin/python3 /tigre_prototype/manage.py migrate_clusters --face --body --car --use-best-event --use-thumbnail --force-clustering
    

    В результате система повторно сгенерирует векторы признаков для существующих кластерных событий и автоматически запустит запланированную кластеризацию для пересборки кластеров.