Процесс обучения¶
В данном разделе описан процесс обучения модели с использованием образов 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=eth0GLOO_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_confinput_dir- директория, в которой должны находиться данные для обучения на задаче поиска параллельных предложений.batch_size- размер мини-батча в предложениях-запросах, используемый при обучении на задаче поиска параллельных предложений. Стоит также учитывать, что для каждого предложения-запроса в мини-батч добавляется позитивный пример, что удваивает кол-во предложений в мини-батче. Если опцияdont_use_hns- false, то для каждого исходного предложения добавляется также некоторое количество негативных примеров. Количество негативных примеров выбирается случайным образом для каждого предложения. Минимальное количество негативных примеров контролируется параметромmin_hn_cnt. Максимальное количество ограничено при создании датасета, так для каждого предложения добавлялось максимум 4 негативных примера.dont_use_dups- если значение false, то при создании мини-батчей будут исключаться предложения, являющиеся близкими к предложениям (неполные дубликаты), уже включенным в мини-батч.
Параметры документов: общий префикс
batches.docs_batch_iterator_conf.batch_generator_confinput_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 слоя, используемого в архитектуре transformershare_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- вероятность дропаута