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

Совет

Не стесняйтесь обращаться к нашим специалистам по вопросам миграции по адресу 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.yml"
    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 создайте новые сервисы для каждого нового шарда. Для этого скопируйте существующий сервис и замените имя шарда на новое, а также путь к шарду в 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: 0.0.0.0,
          CFG_LISTEN_PORT: '8101', CFG_NTLS: 'findface-ntls:3133', TT_CHECKPOINT_COUNT: 3,
          TT_CHECKPOINT_INTERVAL: '14400', TT_FORCE_RECOVERY: 'true', TT_LISTEN: '0.0.0.0:32001',
          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-12.241211.2
        logging: {driver: journald}
        networks: [product-network]
        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://findface-extraction-api: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://findface-tarantool-server-shard-001:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-002:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-003:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-004:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-005:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-006:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-007:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-008:8101/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://findface-tarantool-server-shard-011:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-012:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-013:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-014:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-015:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-016:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-017:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-018:8101/v2/
          slave: ''
    workers_num: 3
    objects_limit: 1000
    extraction_batch_size: 8
    normalized_storage:
      type: webdav
      enabled: True
      webdav:
        upload-url: http://findface-upload: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://findface-tarantool-server-shard-001:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-002:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-003:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-004:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-005:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-006:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-007:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-008:8101/v2/
          slave: ''
        ...
    

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

    storage-api-to:
      ...
      shards:
        - master: http://findface-tarantool-server-shard-011:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-012:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-013:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-014:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-015:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-016:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-017:8101/v2/
          slave: ''
        - master: http://findface-tarantool-server-shard-018:8101/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
    

    Примечание

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

    Важно

    В случае возникновения в логах ошибок, связанных с миграцией галерей кластеров при запуске утилиты sf-api-migrate (см. ниже), следует их игнорировать.

    level=error msg="Object failed. Can't get normalized image for Object(4699640452743520140) in gallery \"face:ffsec_face_clusters\": bad http status (404)"
    
  8. Откройте файл конфигурации /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://findface-tarantool-server-shard-011:8101/v2/
        slave: ''
      - master: http://findface-tarantool-server-shard-012:8101/v2/
        slave: ''
      - master: http://findface-tarantool-server-shard-013:8101/v2/
        slave: ''
      - master: http://findface-tarantool-server-shard-014:8101/v2/
        slave: ''
      - master: http://findface-tarantool-server-shard-015:8101/v2/
        slave: ''
      - master: http://findface-tarantool-server-shard-016:8101/v2/
        slave: ''
      - master: http://findface-tarantool-server-shard-017:8101/v2/
        slave: ''
      - master: http://findface-tarantool-server-shard-018:8101/v2/
        slave: ''
    
    sudo docker-compose restart findface-sf-api
    
  9. После завершения миграции удалите сервисы старых шардов из файла docker-compose.yaml и остановите используемые ими контейнеры.

    sudo docker-compose up -d --remove-orphans
    
  10. Мигрируйте кластеры, если данная функция включена в системе. Для этого выполните следующие действия:

  1. Если включена кластеризация по расписанию, отключите ее во время миграции, установив значение ENABLE_NIGHT_CLUSTERIZATION в False, и перезапустите сервисы findface-multi-legacy-singleton-services и findface-multi-legacy, чтобы применить изменения.

    sudo vi /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py
    
    # -- Clusters configuration --
    'ENABLE_NIGHT_CLUSTERIZATION': False,
    ...
    
    sudo docker restart findface-multi-findface-multi-legacy-singleton-services-1 findface-multi-findface-multi-legacy-1
    
  2. Выполните следующую команду:

    Примечание

    Перечислите мигрируемые типы объектов в виде опций команды: --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 --no-lock
    
  3. Верните настройку кластеризации по расписанию в желаемое значение и перезапустите findface-multi-legacy-singleton-services и findface-multi-legacy сервисы, чтобы применить изменения.

    sudo vi /opt/findface-multi/configs/findface-multi-legacy/findface-multi-legacy.py
    
    # -- Clusters configuration --
    'ENABLE_NIGHT_CLUSTERIZATION': True,
    ...
    
    sudo docker restart findface-multi-findface-multi-legacy-singleton-services-1 findface-multi-findface-multi-legacy-1
    

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