Download sbert_training/fourth_training/train.py from jstAnotherCapi/sbert_training_raw_folder_HPC: direct link, hf CLI and curl.
- Browser
- Download file 8 kB
-
https://huggingface.co/jstAnotherCapi/sbert_training_raw_folder_HPC/resolve/main/sbert_training/fourth_training/train.py
- Command line
-
hf download hf://jstAnotherCapi/sbert_training_raw_folder_HPC/sbert_training/fourth_training/train.py
-
curl -L -o train.py https://huggingface.co/jstAnotherCapi/sbert_training_raw_folder_HPC/resolve/main/sbert_training/fourth_training/train.py
8 kB
| import logging | |
| import sys | |
| from datetime import datetime | |
| import torch | |
| from datasets import load_dataset, DatasetDict | |
| from sentence_transformers import SentenceTransformer, losses | |
| from sentence_transformers.evaluation import TripletEvaluator, SequentialEvaluator | |
| from sentence_transformers.trainer import SentenceTransformerTrainer | |
| from sentence_transformers.training_args import ( | |
| SentenceTransformerTrainingArguments, | |
| BatchSamplers, | |
| MultiDatasetBatchSamplers, | |
| ) | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| # Logging | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| logging.basicConfig( | |
| format="%(asctime)s - %(message)s", | |
| datefmt="%Y-%m-%d %H:%M:%S", | |
| level=logging.INFO, | |
| handlers=[logging.FileHandler("logs.txt")], | |
| ) | |
| class Tee: | |
| def __init__(self, *files): self.files = files | |
| def write(self, obj): | |
| for f in self.files: f.write(obj); f.flush() | |
| def flush(self): | |
| for f in self.files: f.flush() | |
| def isatty(self): return False | |
| sys.stdout = Tee(sys.stdout, open("logs.txt", "a")) | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| # Config | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| train_batch_size = 32 | |
| model_name = "/home/skiredj.abderrahman/khalil/sbert_training/third_training/output/arabert_20260326_1254/final" | |
| model_nickname = "arabert_arcd_squad" | |
| timestamp = datetime.now().strftime("%Y%m%d_%H%M") | |
| output_dir = f"output/{model_nickname}_{timestamp}" | |
| device = "cuda" if torch.cuda.is_available() else "cpu" | |
| matryoshka_dims = [768, 512, 256, 128, 64] | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| # 1. Model | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| model = SentenceTransformer(model_name, device=device) | |
| model.set_pooling_include_prompt(include_prompt=False) | |
| print(f"Model running on: {device}") | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| # TEST MODE | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| TEST_MODE = False | |
| TEST_SAMPLES = 100 | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| # 2. Dataset | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| logging.info("Loading datasets...") | |
| def load_csv(path): | |
| ds = load_dataset("csv", data_files=path)["train"] | |
| ds = ds.filter(lambda x: all(x[col] is not None and str(x[col]).strip() != "" for col in ds.column_names)) | |
| if TEST_MODE: | |
| ds = ds.select(range(min(TEST_SAMPLES, len(ds)))) | |
| return ds | |
| train_data = load_csv("/home/skiredj.abderrahman/khalil/sbert_training/fourth_training/data/pre_train_arcd_SQuAD_triplets.csv") | |
| val_data = load_csv("/home/skiredj.abderrahman/khalil/sbert_training/fourth_training/data/pre_test_arcd_SQuAD_triplets.csv") | |
| train_dataset = DatasetDict({"arcd_squad": train_data}) | |
| eval_dataset = DatasetDict({"arcd_squad": val_data}) | |
| logging.info(train_dataset) | |
| logging.info(eval_dataset) | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| # 3. Loss | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| loss = { | |
| "arcd_squad": losses.MatryoshkaLoss( | |
| model, | |
| losses.MultipleNegativesRankingLoss(model), | |
| matryoshka_dims=matryoshka_dims, | |
| ) | |
| } | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| # 4. Evaluator | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| def make_triplet_evaluators(dataset, name_prefix, max_samples=3_000): | |
| sample = dataset.shuffle(seed=42).select(range(min(max_samples, len(dataset)))) | |
| return [ | |
| TripletEvaluator( | |
| anchors=sample["anchor"], | |
| positives=sample["positive"], | |
| negatives=sample["negative"], | |
| name=f"{name_prefix}-{dim}", | |
| truncate_dim=dim, | |
| ) | |
| for dim in matryoshka_dims | |
| ] | |
| dev_evaluator = SequentialEvaluator( | |
| make_triplet_evaluators(val_data, "val-arcd-squad"), | |
| main_score_function=lambda scores: scores[0], | |
| ) | |
| logging.info("Pre-training evaluation:") | |
| dev_evaluator(model) | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| # 5. Training Arguments | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| args = SentenceTransformerTrainingArguments( | |
| output_dir=output_dir, | |
| seed=42, | |
| num_train_epochs=3, | |
| per_device_train_batch_size=train_batch_size, | |
| per_device_eval_batch_size=train_batch_size, | |
| gradient_accumulation_steps=2, | |
| bf16=True, | |
| fp16=False, | |
| learning_rate=1e-5, | |
| lr_scheduler_type="linear", | |
| warmup_ratio=0.1, | |
| weight_decay=0.01, | |
| batch_sampler=BatchSamplers.NO_DUPLICATES, | |
| multi_dataset_batch_sampler=MultiDatasetBatchSamplers.PROPORTIONAL, | |
| dataloader_num_workers=8, | |
| eval_strategy="steps", | |
| eval_steps=1000, | |
| save_strategy="steps", | |
| save_steps=1000, | |
| save_total_limit=2, | |
| report_to="tensorboard", | |
| logging_steps=100, | |
| logging_dir=f"{output_dir}/runs", | |
| ) | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| # 6. Trainer | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| trainer = SentenceTransformerTrainer( | |
| model=model, | |
| args=args, | |
| train_dataset=train_dataset, | |
| eval_dataset=eval_dataset, | |
| loss=loss, | |
| evaluator=dev_evaluator, | |
| ) | |
| trainer.train() | |
| print("Finished") | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| # 7. Save | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| final_output_dir = f"{output_dir}/final" | |
| model.save(final_output_dir) | |
| print(f"Model saved to {final_output_dir}") | |