|
|
|
|
|
|
|
|
import logging |
|
|
import random |
|
|
|
|
|
import numpy |
|
|
import torch |
|
|
from datasets import Dataset, load_dataset |
|
|
|
|
|
from sentence_transformers import ( |
|
|
SentenceTransformer, |
|
|
SentenceTransformerModelCardData, |
|
|
SentenceTransformerTrainer, |
|
|
SentenceTransformerTrainingArguments, |
|
|
) |
|
|
from sentence_transformers.evaluation import NanoBEIREvaluator |
|
|
from sentence_transformers.losses import CachedMultipleNegativesRankingLoss |
|
|
from sentence_transformers.training_args import BatchSamplers |
|
|
from sentence_transformers.models import Router, Transformer, Pooling |
|
|
|
|
|
logging.basicConfig(format="%(asctime)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S", level=logging.INFO) |
|
|
random.seed(12) |
|
|
torch.manual_seed(12) |
|
|
numpy.random.seed(12) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
model = SentenceTransformer( |
|
|
modules=[ |
|
|
Transformer("microsoft/mpnet-base"), |
|
|
Router.for_query_document( |
|
|
query_modules=[Pooling(768, pooling_mode="cls")], |
|
|
document_modules=[Pooling(768, pooling_mode="lasttoken")], |
|
|
), |
|
|
], |
|
|
model_card_data=SentenceTransformerModelCardData( |
|
|
language="en", |
|
|
license="apache-2.0", |
|
|
model_name="MPNet base trained on Natural Questions pairs", |
|
|
), |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dataset = load_dataset("sentence-transformers/natural-questions", split="train") |
|
|
dataset_dict = dataset.train_test_split(test_size=1_000, seed=12) |
|
|
train_dataset: Dataset = dataset_dict["train"] |
|
|
eval_dataset: Dataset = dataset_dict["test"] |
|
|
|
|
|
|
|
|
loss = CachedMultipleNegativesRankingLoss(model, mini_batch_size=16) |
|
|
|
|
|
|
|
|
run_name = "mpnet-base-nq" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
run_name += "cls-last-split-pooling" |
|
|
args = SentenceTransformerTrainingArguments( |
|
|
|
|
|
output_dir=f"models/{run_name}", |
|
|
|
|
|
num_train_epochs=1, |
|
|
per_device_train_batch_size=256, |
|
|
per_device_eval_batch_size=256, |
|
|
learning_rate=2e-5, |
|
|
warmup_ratio=0.1, |
|
|
fp16=False, |
|
|
bf16=True, |
|
|
batch_sampler=BatchSamplers.NO_DUPLICATES, |
|
|
router_mapping={ |
|
|
"query": "query", |
|
|
"answer": "document", |
|
|
}, |
|
|
|
|
|
eval_strategy="steps", |
|
|
eval_steps=50, |
|
|
save_strategy="steps", |
|
|
save_steps=50, |
|
|
save_total_limit=2, |
|
|
logging_steps=5, |
|
|
logging_first_step=True, |
|
|
run_name=run_name, |
|
|
seed=12, |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
dev_evaluator = NanoBEIREvaluator( |
|
|
|
|
|
|
|
|
) |
|
|
dev_evaluator(model) |
|
|
|
|
|
|
|
|
trainer = SentenceTransformerTrainer( |
|
|
model=model, |
|
|
args=args, |
|
|
train_dataset=train_dataset, |
|
|
eval_dataset=eval_dataset, |
|
|
loss=loss, |
|
|
evaluator=dev_evaluator, |
|
|
) |
|
|
trainer.train() |
|
|
|
|
|
|
|
|
dev_evaluator(model) |
|
|
|
|
|
|
|
|
model.save_pretrained(f"models/{run_name}/final") |
|
|
|
|
|
|
|
|
model.push_to_hub(run_name) |
|
|
|