Процесс обучения ================ В данном разделе описан процесс обучения модели с использованием образов docker. Запуск обучения в окружении nix, без использования docker, представлен по :doc:`ссылке `. Запуск обучения --------------- Для запуска обучения можно воспользоваться докер-образом, содержащим последнюю версию библиотеки. Предварительно необходимо подготовить :doc:`данные `. В данной секции будет описан процесс запуска обучения на небольшом наборе данных. Команда, с помощью которой можно выкачать все тестовые данные и создать описанную структуру директорий: .. code-block:: bash 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``. Команда запуска: .. code-block:: bash 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``. .. code-block:: bash 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`` для приведенного выше примера: .. code-block:: bash # 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 Оценка качества обученной модели -------------------------------- :doc:`Перейти` Конфигурация процесса обучения ------------------------------ Для конфигурации библиотеки используется фреймворк `hydra `_. Чтобы передать дополнительные опции при запуске их надо добавить в конце команды, например: .. code-block:: bash 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 Для удобства, изменение нескольких параметров можно объединить в конфигурационном файле: :download:`пример `. Этот файл нужно положить в директорию ``train/conf/experiments``. Запустить обучение с измененной конфигурацией можно следующей командой: .. code-block:: bash 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`` - вероятность дропаута