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

Совет

Не стесняйтесь обращаться к нашим специалистам по вопросам миграции по адресу 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/data/findface-tarantool-server и подсчитайте количество шардов по количеству директорий.

      Примечание

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

      cd /opt/findface-multi/data/findface-tarantool-server
      
      ls -l
      
      shard-001
      shard-002
      shard-003
      shard-004
      shard-005
      shard-006
      shard-007
      shard-008
      
    2. Создайте директории, в которых будут храниться файлы новых шардов.

      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 создайте новые сервисы для каждого нового шарда. Для этого скопируйте существующий сервис и замените имя шарда на новое, порты в CFG_LISTEN_PORT, TT_LISTEN, а также путь к шарду в volumes.

    sudo vi docker-compose.yaml
    
    services:
      ...
      findface-tarantool-server-shard-**011**:
        depends_on: [findface-ntls]
        environment: {CFG_EXTRA_LUA: loadfile("/tnt_schema.lua")(), CFG_LISTEN_HOST: 127.0.0.1,
          CFG_LISTEN_PORT: '8111', CFG_NTLS: '127.0.0.1:3133', TT_CHECKPOINT_COUNT: 3,
          TT_CHECKPOINT_INTERVAL: '14400', TT_FORCE_RECOVERY: 'true', TT_LISTEN: '127.0.0.1:32011',
          TT_MEMTX_DIR: snapshots, TT_MEMTX_MEMORY: '2147483648', TT_WAL_DIR: xlogs, TT_WORK_DIR: /var/lib/tarantool/FindFace}
        image: docker.int.ntl/ntech/universe/tntapi:ffserver-9.230407.1
        logging: {driver: journald}
        network_mode: service:pause
        restart: always
        volumes: ['./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
    objects_limit: 1000
    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
    

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