forked from bding08/RAG-Project
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfinetune.py
More file actions
151 lines (134 loc) · 4.88 KB
/
Copy pathfinetune.py
File metadata and controls
151 lines (134 loc) · 4.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
from kfp import dsl
from kfp import compiler
from datasets import load_dataset
from sentence_transformers import (
SentenceTransformer,
SentenceTransformerTrainer,
SentenceTransformerTrainingArguments,
SentenceTransformerModelCardData,
)
from sentence_transformers.losses import MultipleNegativesRankingLoss
from sentence_transformers.training_args import BatchSamplers
from sentence_transformers.evaluation import TripletEvaluator
#
# Install dependencies at runtime
@dsl.component(packages_to_install=[
'torch>=1.11.0',
'accelerate==1.1.1',
'transformers>=4.34.0',
'sentence-transformers==3.3.1',
'datasets==3.1.0',
'kfp==2.10.1'])
def fine_tune_model(
model_name: str = "sentence-transformers/all-MiniLM-L6-v2",
dataset_name: str = "sentence-transformers/all-nli",
subset: str = "triplet",
output_dir: str = "models/mpnet-base-all-nli-triplet",
data_range: int = 10_000,
num_epochs: int = 1,
train_batch_size: int = 16,
eval_batch_size: int = 16,
):
import subprocess
import sys
# Check installed packages
subprocess.run([sys.executable, "-m", "pip", "freeze"], check=True)
# Import the library
from sentence_transformers import SentenceTransformer
from datasets import load_dataset
from sentence_transformers import (
SentenceTransformer,
SentenceTransformerTrainer,
SentenceTransformerTrainingArguments,
SentenceTransformerModelCardData,
)
from sentence_transformers.losses import MultipleNegativesRankingLoss
from sentence_transformers.training_args import BatchSamplers
from sentence_transformers.evaluation import TripletEvaluator
print("SentenceTransformer module imported successfully!")
from datasets import load_dataset
print("datasets module imported successfully!")
# 1. Load a model to finetune with 2. (Optional) model card data
# model = SentenceTransformer(
# "microsoft/mpnet-base",
# model_card_data=SentenceTransformerModelCardData(
# language="en",
# license="apache-2.0",
# model_name="MPNet base trained on AllNLI triplets",
# )
# )
model = SentenceTransformer(model_name)
# 3. Load a dataset to finetune on
dataset = load_dataset(dataset_name, subset)
train_dataset = dataset["train"].select(range(data_range))
eval_dataset = dataset["dev"]
test_dataset = dataset["test"]
# 4. Define a loss function
loss = MultipleNegativesRankingLoss(model)
# 5. (Optional) Specify training arguments
args = SentenceTransformerTrainingArguments(
# Required parameter:
output_dir=output_dir,
# Optional training parameters:
num_train_epochs=num_epochs,
per_device_train_batch_size=train_batch_size,
per_device_eval_batch_size=eval_batch_size,
warmup_ratio=0.1,
fp16=True, # Set to False if GPU can't handle FP16
bf16=False, # Set to True if GPU supports BF16
batch_sampler=BatchSamplers.NO_DUPLICATES, # MultipleNegativesRankingLoss benefits from no duplicates
# Optional tracking/debugging parameters:
eval_strategy="steps",
eval_steps=100,
save_strategy="steps",
save_steps=100,
save_total_limit=2,
logging_steps=100,
run_name="mpnet-base-all-nli-triplet", # Used in W&B if `wandb` is installed
)
# 6. (Optional) Create an evaluator & evaluate the base model
dev_evaluator = TripletEvaluator(
anchors=eval_dataset["anchor"],
positives=eval_dataset["positive"],
negatives=eval_dataset["negative"],
name="all-nli-dev",
)
dev_evaluator(model)
# 7. Create a trainer & train
trainer = SentenceTransformerTrainer(
model=model,
args=args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
loss=loss,
evaluator=dev_evaluator,
)
trainer.train()
# (Optional) Evaluate the trained model on the test set, after training completes
test_evaluator = TripletEvaluator(
anchors=test_dataset["anchor"],
positives=test_dataset["positive"],
negatives=test_dataset["negative"],
name="all-nli-test",
)
test_evaluator(model)
# 8. Save the trained model
model.save_pretrained("models/mpnet-base-all-nli-triplet/final")
# 9. (Optional) Push it to the Hugging Face Hub
# model.push_to_hub("mpnet-base-all-nli-triplet")
@dsl.component
def say_hello(name: str) -> str:
hello_text = f'Hello, {name}!'
print(hello_text)
return hello_text
@dsl.pipeline
def launch_pipeline(recipient: str) -> str:
hello_task = say_hello(name=recipient)
fine_tune_model()
return hello_task.output
# Compile the pipeline to a JSON file
compiler.Compiler().compile(
pipeline_func=launch_pipeline,
package_path="hello_pipeline.json"
)
print("Pipeline compiled successfully.")