Процесс обучения

В данном разделе описан процесс обучения модели с использованием образов docker. Запуск обучения в окружении nix, без использования docker, представлен по ссылке.

Запуск обучения

Для запуска обучения можно воспользоваться докер-образом, содержащим последнюю версию библиотеки. Предварительно необходимо подготовить данные. В данной секции будет описан процесс запуска обучения на небольшом наборе данных. Команда, с помощью которой можно выкачать все тестовые данные и создать описанную структуру директорий:

mkdir -p train/data/docs train/data/sents/paral && \
(cd train && wget -q 'http://dn11.isa.ru:8080/doc-enc-data/tokenizer.bpe.256k_from_600M.spm.model' -O sentencepiece.bpe.model) && \
(cd train/data/docs && wget -q -O -  'http://dn11.isa.ru:8080/doc-enc-data/datasets.docs.mini.v1.tar.gz'  | tar zxf -) && \
(cd train/data/sents/paral/ && wget -q -O - 'http://dn11.isa.ru:8080/doc-enc-data/datasets.sents.mini.v1.tar.gz' | tar zxf -)

Папка train, находящаяся в текущей директории, будет содержать:

  • sentencepiece.bpe.model - модель токенизатора;

  • data - директория с датасетами для обучения, которые должны находится во вложенных папках docs и sents. Директория docs содержит датасеты для задачи ранжирования документов, в качестве примера используется сэмпл. В директории sents/paral находится небольшой набор параллельных предложений: сэмпл.

Перед запуском необходимо скопировать директорию с конфигурацией из репозитория проекта в папку train/conf.

Команда запуска:

docker run  --gpus=1  --rm  -v $(pwd)/train/:/train/ \
semvectors/doc_enc_train:0.1.2 \
run_training +personal/common=quick

Модели и логи будут сохранены в папку train/outputs, в которой будет создаваться рабочая директория для каждого запуска обучения.

Пример запуска на нескольких GPU

Для запуска на всех GPU нужно передать all параметру --gpus.

docker run  --gpus=all --rm  -v $(pwd)/train/:/train/ \
semvectors/doc_enc_train:0.1.2 run_training +personal/common=quick

Запуск на нескольких серверах

Для запуска обучения в кластере на нескольких серверах необходимо перед запуском обучения установить несколько переменных окружения:

  • MASTER_ADDR - адрес главного сервера;

  • MASTER_PORT - порт главного сервера ( по умолчанию 29500);

  • TORCH_DIST_WORLD_SIZE - общее кол-во процессов;

  • TORCH_DIST_RANK - стартовый номер процесса на каждом сервере.

В случае возникновения ошибок:

torch.distributed.DistBackendError: NCCL error in: ../torch/csrc/distributed/c10d/ProcessGroupNCCL.cpp:1275, internal error, NCCL version 2.14.3
ncclInternalError: Internal check failed.

может потребоваться добавить переменные:

  • NCCL_SOCKET_IFNAME=eth0

  • GLOO_SOCKET_IFNAME=eth0

Подробности доступны по ссылке

В качестве примера рассмотрим кластер с 3 серверами: s1, s2 и s3. На первом 2 GPU, на втором и третьем по 1 GPU. Главный сервер s1 с ip адресом 192.168.80.1. В таком случае надо задать MASTER_ADDR=192.168.80.1, TORCH_DIST_WORLD_SIZE=4 при запуске всех процессов. TORCH_DIST_RANK будет иметь отличные значения на каждом сервере: TORCH_DIST_RANK=0 на s1, TORCH_DIST_RANK=2 на s2, TORCH_DIST_RANK=3 на s3.

При запуске в окружении докер, нужно убедиться, что контейнеры, находящиеся на разных серверах могут взаимодействовать друг с другом по сети. Для этого воспользуйтесь руководоством на сайте докера. При тестировании можно использовать сеть хоста для этого передайте флаг --net=host при старте контейнера. Пример запуска контейенеров на серверах s1 и s2 для приведенного выше примера:

# on s1
docker run  --gpus=all  --rm --net=host \
-e MASTER_ADDR=192.168.80.1 -e TORCH_DIST_WORLD_SIZE=4 -e TORCH_DIST_RANK=0  \
-v $(pwd)/train/:/train/ semvectors/doc_enc_train:0.1.2 run_training +personal/common=quick
# on s2
docker run  --gpus=all  --rm --net=host \
-e MASTER_ADDR=192.168.80.1 -e TORCH_DIST_WORLD_SIZE=4 -e TORCH_DIST_RANK=2  \
-v $(pwd)/train/:/train/ semvectors/doc_enc_train:0.1.2 run_training +personal/common=quick

Оценка качества обученной модели

Перейти

Конфигурация процесса обучения

Для конфигурации библиотеки используется фреймворк hydra. Чтобы передать дополнительные опции при запуске их надо добавить в конце команды, например:

docker run  --gpus=1 --rm  -v $(pwd)/train/:/train/ \
semvectors/doc_enc_train:0.1.2 \
run_training batches.docs_batch_iterator_conf.use_existing_combined_meta=true

Для удобства, изменение нескольких параметров можно объединить в конфигурационном файле: пример. Этот файл нужно положить в директорию train/conf/experiments. Запустить обучение с измененной конфигурацией можно следующей командой:

docker run  --gpus=1 --rm  -v $(pwd)/train/:/train/ \
semvectors/doc_enc_train:0.1.2 \
run_training +experiments=trans_sf_2

Список основных параметров обучения

  • trainer.optim.emb.lr - скорость обучения эмбеддингов токенов

  • trainer.optim.sent.lr - скорость обучения энкодера предложений

  • trainer.optim.sent.max_grad_norm - норма для контролирования взрыва градиентов энкодера предложений. В случае если = 0 градиенты не изменяются. Аналогичные параметры для энкодеров фрагмента и документа: trainer.optim.fragment.max_grad_norm, trainer.optim.doc.max_grad_norm.

  • trainer.optim.sent.weight_decay - коэффициент уменьшения весов для энкодера предложений. Аналогичные параметры для энкодеров фрагмента и документа: trainer.optim.fragment.weight_decay, trainer.optim.doc.weight_decay.

  • trainer.optim.max_grad_norm - значение, которое будет использоваться для контролирования взрыва градиентов. В случае если == 0 ничего не происходит.

  • trainer.optim.fragment.lr - скорость обучения энкодера фрагментов

  • trainer.optim.doc.lr - скорость обучения энкодера текстов документов

  • trainer.emb_grad_scale - величина, на которую умножаются градиенты эмбеддингов токенов, перед обновлением весов. В случае если == 0 то ничего не происходит.

  • model.scale - значение, на которое умножается результаты скалярного произведения между документами-запросами и остальными документами, входящими в мини-батч. Аналогичный параметр для задачи sent retrieval - model.sent.scale.

  • model.margin - значение, которое вычитается из результата скалярного произведения между документами-запросами и позитивными примерами. Аналогичный параметр для задачи sent retrieval - model.sent.margin.

  • model.load_params_from - Путь к предобученной модели. Перед началом обучения веса будут инициализированы из указанной модели.

Параметры мини-батчей

  • Параметры предложений: общий префикс batches.sents_batch_iterator_conf.batch_generator_conf

    • input_dir - директория, в которой должны находиться данные для обучения на задаче поиска параллельных предложений.

    • batch_size - размер мини-батча в предложениях-запросах, используемый при обучении на задаче поиска параллельных предложений. Стоит также учитывать, что для каждого предложения-запроса в мини-батч добавляется позитивный пример, что удваивает кол-во предложений в мини-батче. Если опция dont_use_hns - false, то для каждого исходного предложения добавляется также некоторое количество негативных примеров. Количество негативных примеров выбирается случайным образом для каждого предложения. Минимальное количество негативных примеров контролируется параметром min_hn_cnt. Максимальное количество ограничено при создании датасета, так для каждого предложения добавлялось максимум 4 негативных примера.

    • dont_use_dups - если значение false, то при создании мини-батчей будут исключаться предложения, являющиеся близкими к предложениям (неполные дубликаты), уже включенным в мини-батч.

  • Параметры документов: общий префикс batches.docs_batch_iterator_conf.batch_generator_conf

    • input_dir - директория, в которой должны находиться данные для обучения на задаче поиска похожих документов.

    • batch_total_tokens_cnt - максимальный размер мини-батча в токенах.

    • batch_total_sents_cnt - общее количество предложений, входящее в мини-батч.

    • batch_batch_docs_cnt - размер мини-батча в документах-запросах.

    • negatives_per_doc - кортеж, состоящий из двух элементов: минимальное/максимальное количество негативных примеров для каждого документа-запроса.

    • positives_per_doc - кортеж, состоящий из двух элементов: минимальное/максимальное количество позитивных примеров для каждого документа-запроса.

    • min_sents_per_doc - минимальное количество предложений в документе, для включения в мини-батч.

    • max_sents_per_doc - максимальное количество предложений в документе, для включения в мини-батч.

Параметры энкодеров

Одинаковы для энкодеров всех типов.

  • encoder_kind - тип энкодера( LSTM, GRU, TRANSFORMER, LONGFORMER, FNET )

  • hidden_size - размер скрытого слоя энкодера

  • num_layers - количество слоев энкодера

  • dropout - вероятность дропаута

  • pooler.pooling_strategy - стратегия пулинга (MAX, MEAN, FIRST)

  • pooler.force_dense_layer - добавлять дополнительный линейный слой после пулинга скрытого слоя

  • pooler.use_activation - добавлять слой активации tanh после пулинга скрытого слоя

  • input_size - размер входных эмбеддингов (для RNN сетей)

  • bidirectional - использовать двунаправленную сеть (для RNN сетей)

  • num_heads - количество блоков внимания (для transformer сетей)

  • intermediate_size - размер промежуточных линейных слоев (для transformer сетей)

  • intermediate_activation - функция активации, используемая в промежуточных слоях (для transformer сетей)

  • full_intermediate - флаг переключения между двумя реализациями feed-forward слоя, используемого в архитектуре transformer

  • share_attn - включает использования общего внимания между всеми слоями энкодера (для transformer сетей)

  • attention_window - размер окна, используемого в механизме локальном внимания.

  • add_beg_seq_token - добавлять дополнительный эмбеддинг в начало последовательности (для уровня фрагментадокумента)

  • input_dropout - вероятность дропаута для входных эмбеддингов (для уровня фрагментадокумента)

  • add_pos_emb - суммировать входные эмбеддинги с эмбеддингами позиций (для уровня фрагментадокумента)

  • emb_conf.emb_kind - тип эмбеддингов токенов (TOKEN, TOKEN_WITH_POSITIONAL_ENC, TOKEN_WITH_POSITIONAL_EMB)

  • emb_conf.emb_dim - размерность эмбеддингов токенов

  • emb_conf.scale_by_dim - умножать значения эмбеддингов на квадратный корень размерности

  • emb_conf.normalize_emb - применять слой нормализации

  • emb_conf.dropout - вероятность дропаута