Skip to content

Commit a9c73a9

Browse files
author
Harikrishnan V
committed
finetune pipeline added
1 parent 90aee78 commit a9c73a9

22 files changed

Lines changed: 207 additions & 40244 deletions

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ wheels/
88

99
# Virtual environments
1010
.venv
11-
model_checkpoints/
11+
checkpoints/
1212
data/
13+
model_checkpoints/

check.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from transformers import PreTrainedTokenizerFast, AutoTokenizer
2+
from src.utils.paths import TOKENIZER_DIR
3+
from pathlib import Path
4+
5+
6+
tok = AutoTokenizer.from_pretrained("tokenizer_checkpoint")
7+
8+
# tok = AutoTokenizer.from_pretrained(TOKENIZER_DIR)

configs/model.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,21 @@ def __init__(
1414
ffn_multiple=128,
1515
tie_word_embeddings=True,
1616
rmsnorm_eps=1e-6,
17+
rope_base=10000,
1718
**kwargs
1819
):
1920
assert emb_dim % head_count == 0, "emb_dim must be divisible by head_count"
2021
self.vocab_size = vocab_size
2122
self.emb_dim = emb_dim
2223
self.num_blocks = num_blocks
2324
self.head_count = head_count
25+
self.rmsnorm_eps = rmsnorm_eps
2426
self.seq_length = seq_length
2527
self.ffn_multiple = ffn_multiple
28+
self.rope_base = rope_base
29+
self.head_dim = self.emb_dim // self.head_count
30+
self.architectures = ["BetterGPTModel"]
2631

2732
# Initialize the Hugging Face base config
28-
super().__init__(tie_word_embeddings=tie_word_embeddings, **kwargs)
33+
super().__init__(tie_word_embeddings=tie_word_embeddings, **kwargs)
34+

scripts/finetune_alpaca.py

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import torch
2+
3+
from trl import SFTTrainer
4+
from transformers import EarlyStoppingCallback
5+
from transformers import PreTrainedTokenizerFast,EarlyStoppingCallback
6+
from datasets import load_dataset
7+
8+
from configs.ft_config import sft_config
9+
from src.utils.model_loader import load_model
10+
from src.utils.ft_tokenizer_helper import prepare_tokenizer
11+
from src.utils.prepare_alpaca_dataset import convert_alpaca_format
12+
from src.utils.paths import CHECKPOINT_DIR, TOKENIZER_DIR
13+
from src.utils.data_splitter import split_dataset
14+
from configs.tokenizer_config import TokenizerConfig
15+
from src.utils.logger import get_logger
16+
17+
18+
logger = get_logger(__name__)
19+
20+
# model_path = CHECKPOINT_DIR
21+
# tokenizer_path = TOKENIZER_DIR
22+
model_path = "./checkpoints/model.pt"
23+
tokenizer_path = "./tokenizer_checkpoint"
24+
25+
def main():
26+
try:
27+
logger.info("Starting fine-tuning process")
28+
dataset = load_dataset("yahma/alpaca-cleaned", split="train")
29+
logger.info("Alpaca Dataset loaded successfully")
30+
except Exception as e:
31+
logger.error(f"Error occurred while loading dataset or tokenizer: {e}")
32+
raise
33+
try:
34+
dataset = dataset.map(convert_alpaca_format, batched=True)
35+
logger.info("Alpaca Dataset converted to chat format successfully")
36+
except Exception as e:
37+
logger.error(f"Error occurred while converting dataset to chat format: {e}")
38+
raise
39+
try:
40+
train_dataset, eval_dataset = split_dataset(dataset)
41+
logger.info("Alpaca Dataset split into training and validation sets successfully")
42+
except Exception as e:
43+
logger.error(f"Error occurred while splitting dataset: {e}")
44+
raise
45+
try:
46+
tokenizer = PreTrainedTokenizerFast.from_pretrained(tokenizer_path)
47+
logger.info("Tokenizer loaded successfully")
48+
except Exception as e:
49+
logger.error(f"Error occurred while loading tokenizer: {e}")
50+
raise
51+
try:
52+
tokenizer = prepare_tokenizer(tokenizer)
53+
logger.info("Tokenizer prepared successfully")
54+
except Exception as e:
55+
logger.error(f"Error occurred while preparing tokenizer: {e}")
56+
raise
57+
try:
58+
model = load_model(model_path, tokenizer)
59+
logger.info("Model retied and loaded successfully")
60+
except Exception as e:
61+
logger.error(f"Error occurred while loading model: {e}")
62+
raise
63+
return model, train_dataset, eval_dataset, tokenizer
64+
65+
66+
if __name__ == "__main__":
67+
model, train_dataset, eval_dataset, tokenizer = main()
68+
69+
model = load_model(model_path,tokenizer)
70+
71+
num_params = sum(p.numel() for p in model.parameters())
72+
logger.info(f"{num_params/1e6:.2f}M parameters")
73+
74+
trainer = SFTTrainer(
75+
model=model,
76+
args=sft_config,
77+
train_dataset=train_dataset,
78+
eval_dataset=eval_dataset,
79+
processing_class=tokenizer,
80+
callbacks=[EarlyStoppingCallback(early_stopping_patience=3)]
81+
)
82+
83+
trainer.train()
84+
logger.info("Fine-tuning completed successfully. Saving model and tokenizer...")
85+
86+
trainer.save_model(model_path)
87+
tokenizer.save_pretrained(tokenizer_path)
88+
89+
90+

src/finetuning/alpaca_ft.py

Whitespace-only changes.

src/finetuning/finetune_model.py

Lines changed: 0 additions & 60 deletions
This file was deleted.

src/models/attention.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from torch.nn.functional import scaled_dot_product_attention
55

66
from src.models.positional_embeddings import RoPESplitHalf
7-
from configs.model import ModelConfig
7+
from configs.model import BetterGPTConfig as ModelConfig
88
from src.utils.logger import get_logger
99
from src.utils.rope_helper import rotate_half, apply_rotary_pos_emb
1010

@@ -20,9 +20,9 @@ class MHAttention(nn.Module):
2020

2121
def __init__(
2222
self,
23-
emb_dim: int= ModelConfig.emb_dim,
24-
head_count: int= ModelConfig.head_count,
25-
head_dim: int= ModelConfig.head_dim
23+
emb_dim: int,
24+
head_count: int,
25+
head_dim: int
2626
):
2727
"""
2828
Args:

src/models/layer_normalization.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import torch
22
import torch.nn as nn
33

4-
from configs.model import ModelConfig
4+
from configs.model import BetterGPTConfig as ModelConfig
55

66
class RMSNorm(nn.Module):
77
"""Root Mean Square Layer Normalization.
@@ -11,7 +11,7 @@ class RMSNorm(nn.Module):
1111
avoid precision loss with bfloat16 inputs.
1212
"""
1313

14-
def __init__(self, emb_dim, eps: float = ModelConfig.rmsnorm_eps):
14+
def __init__(self, emb_dim, eps: float = ModelConfig().rmsnorm_eps):
1515
"""
1616
Args:
1717
emb_dim: Size of the last dimension to normalize over.

src/models/positional_embeddings.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import torch
22
import torch.nn as nn
33

4-
from configs.model import ModelConfig
4+
from configs.model import BetterGPTConfig as ModelConfig
55

66

77
class RoPESplitHalf(nn.Module):
@@ -10,9 +10,7 @@ class RoPESplitHalf(nn.Module):
1010
half with the negated second half. compute sin/cos tables on the fly up to
1111
seq_len of each batch.
1212
"""
13-
def __init__(self,
14-
head_dim: int = ModelConfig.head_dim,
15-
base: int = ModelConfig.rope_base):
13+
def __init__(self, head_dim: int, base: float):
1614
"""
1715
Args:
1816
head_dim: Per-head dimension; must be even.
@@ -40,4 +38,8 @@ def forward(self, x, seq_len):
4038
self._cos_cached, self._sin_cached = emb.cos(), emb.sin()
4139
self._cached_len = seq_len
4240
return self._cos_cached[:seq_len], self._sin_cached[:seq_len]
43-
41+
42+
if __name__ == "__main__":
43+
# config = ModelConfig()
44+
print(f"RoPESplitHalf: head_dim={ModelConfig().head_dim}, rope_base={ModelConfig().rope_base}")
45+
# RoPE = RoPESplitHalf(head_dim=config.head_dim, base=config.rope_base)

0 commit comments

Comments
 (0)