Views
No views yet

1def chatml_format(example):
2
3 # Format system
4 system = ""
5 systemMessage = "Recite the given verse from the Bible."
6 system = "<|im_start|>system\n" + systemMessage + "<|im_end|>\n"
7
8 # Format instruction
9 prompt = "<|im_start|>user\nRecite " + example['citation'] + "<|im_end|>\n<|im_start|>assistant\n"
10
11 # Format chosen answer
12 chosen = example['text'] + "<|im_end|>\n"
13
14 # Format rejected answer
15 rejected = example['rejected'] + "<|im_end|>\n"
16
17 return {
18 "prompt": system + prompt,
19 "chosen": chosen,
20 "rejected": rejected,
21 }
22
23dataset = load_dataset("nbeerbower/bible-dpo")['train']
24
25# Save columns
26original_columns = dataset.column_names
27
28# Tokenizer
29tokenizer = AutoTokenizer.from_pretrained(model_name)
30tokenizer.pad_token = tokenizer.eos_token
31tokenizer.padding_side = "left"
32
33# Format dataset
34dataset = dataset.map(
35 chatml_format,
36 remove_columns=original_columns
37)1# LoRA configuration
2peft_config = LoraConfig(
3 r=16,
4 lora_alpha=16,
5 lora_dropout=0.05,
6 bias="none",
7 task_type="CAUSAL_LM",
8 target_modules=['k_proj', 'gate_proj', 'v_proj', 'up_proj', 'q_proj', 'o_proj', 'down_proj']
9)
10
11# Model to fine-tune
12model = AutoModelForCausalLM.from_pretrained(
13 model_name,
14 torch_dtype=torch.bfloat16,
15 load_in_4bit=True
16)
17model.config.use_cache = False
18
19# Reference model
20ref_model = AutoModelForCausalLM.from_pretrained(
21 model_name,
22 torch_dtype=torch.bfloat16,
23 load_in_4bit=True
24)
25
26# Training arguments
27training_args = TrainingArguments(
28 per_device_train_batch_size=4,
29 gradient_accumulation_steps=4,
30 gradient_checkpointing=True,
31 learning_rate=5e-5,
32 lr_scheduler_type="cosine",
33 max_steps=5000,
34 save_strategy="no",
35 logging_steps=1,
36 output_dir=new_model,
37 optim="paged_adamw_32bit",
38 warmup_steps=100,
39 bf16=True,
40 report_to="wandb",
41)
42
43# Create DPO trainer
44dpo_trainer = DPOTrainer(
45 model,
46 ref_model,
47 args=training_args,
48 train_dataset=dataset,
49 tokenizer=tokenizer,
50 peft_config=peft_config,
51 beta=0.1,
52 max_prompt_length=512,
53 max_length=1536,
54 force_use_ref_model=True
55)
56
57# Fine-tune model with DPO
58dpo_trainer.train()