DPO Fine-tuning
In [1]:
Copied!
pip install -q datasets trl peft bitsandbytes sentencepiece wandb huggingface_hub
pip install -q datasets trl peft bitsandbytes sentencepiece wandb huggingface_hub
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv Note: you may need to restart the kernel to use updated packages.
In [1]:
Copied!
from huggingface_hub import notebook_login
notebook_login()
from huggingface_hub import notebook_login
notebook_login()
VBox(children=(HTML(value='<center> <img\nsrc=https://huggingface.co/front/assets/huggingface_logo-noborder.sv…
In [1]:
Copied!
import os
import gc
import torch
import transformers
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, BitsAndBytesConfig
from datasets import load_dataset
from peft import LoraConfig, PeftModel, get_peft_model, prepare_model_for_kbit_training
from trl import DPOTrainer
import bitsandbytes as bnb
import wandb
wandb.login()
%env WANDB_PROJECT=hindi_dpo_test
model_name = "TinyLlama/TinyLlama-1.1B-Chat-v1.0"
new_model = "Hindi-SentenceRetrieval-Tinyllama-1.1B"
import os
import gc
import torch
import transformers
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, BitsAndBytesConfig
from datasets import load_dataset
from peft import LoraConfig, PeftModel, get_peft_model, prepare_model_for_kbit_training
from trl import DPOTrainer
import bitsandbytes as bnb
import wandb
wandb.login()
%env WANDB_PROJECT=hindi_dpo_test
model_name = "TinyLlama/TinyLlama-1.1B-Chat-v1.0"
new_model = "Hindi-SentenceRetrieval-Tinyllama-1.1B"
Failed to detect the name of this notebook, you can set it manually with the WANDB_NOTEBOOK_NAME environment variable to enable code saving. wandb: Currently logged in as: ahm-rimer. Use `wandb login --relogin` to force relogin
env: WANDB_PROJECT=hindi_dpo_test
In [2]:
Copied!
def chatml_format(example):
# Format system
if len(example['task']) > 0:
message = {"role": "system", "content": example['task']}
system = tokenizer.apply_chat_template([message], tokenize=False)
else:
system = ""
# Format instruction
message = {"role": "user", "content": example['query']}
prompt = tokenizer.apply_chat_template([message], tokenize=False, add_generation_prompt=True)
# Format chosen answer
chosen = example['pos'] + "<|im_end|>\n"
# Format rejected answer
rejected = example['neg'] + "<|im_end|>\n"
return {
"prompt": system + prompt,
"chosen": chosen,
"rejected": rejected,
}
# Load dataset
dataset = load_dataset("TokenBender/e5_FT_sentence_retrieval_task_Hindi_mini")['train']
# Save columns
original_columns = dataset.column_names
# Tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "left"
# Format dataset
dataset = dataset.map(
chatml_format,
remove_columns=original_columns
)
def chatml_format(example):
# Format system
if len(example['task']) > 0:
message = {"role": "system", "content": example['task']}
system = tokenizer.apply_chat_template([message], tokenize=False)
else:
system = ""
# Format instruction
message = {"role": "user", "content": example['query']}
prompt = tokenizer.apply_chat_template([message], tokenize=False, add_generation_prompt=True)
# Format chosen answer
chosen = example['pos'] + "<|im_end|>\n"
# Format rejected answer
rejected = example['neg'] + "<|im_end|>\n"
return {
"prompt": system + prompt,
"chosen": chosen,
"rejected": rejected,
}
# Load dataset
dataset = load_dataset("TokenBender/e5_FT_sentence_retrieval_task_Hindi_mini")['train']
# Save columns
original_columns = dataset.column_names
# Tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "left"
# Format dataset
dataset = dataset.map(
chatml_format,
remove_columns=original_columns
)
In [10]:
Copied!
dataset
dataset
Out[10]:
Dataset({ features: ['prompt', 'chosen', 'rejected'], num_rows: 6633 })
In [13]:
Copied!
print(dataset[0])
print(dataset[0])
{'prompt': '<|system|>\nप्रश्न के रूप में एक सेलिब्रिटी का नाम दिए जाने पर, साक्षात्कार और जीवनी पुनर्प्राप्त करें।</s>\n<|user|>\nलियोनार्डो डिकैप्रियो एक अमेरिकी अभिनेता, फिल्म निर्माता और पर्यावरण कार्यकर्ता हैं। उन्हें छह अकादमी पुरस्कारों, चार ब्रिटिश अकादमी फिल्म पुरस्कारों और नौ स्क्रीन एक्टर्स गिल्ड पुरस्कारों के लिए नामांकित किया गया है, जिनमें से प्रत्येक पुरस्कार में से एक और ग्यारह नामांकनों में से तीन गोल्डन ग्लोब पुरस्कार जीते हैं। डिकैप्रियो ने 1980 के दशक के अंत में टेलीविजन विज्ञापनों में दिखाई देकर अपने करियर की शुरुआत की। इसके बाद उन्होंने विभिन्न टेलीविजन श्रृंखलाओं में आवर्ती भूमिकाएँ निभाईं, जैसे कि सोप ओपेरा सांता बारबरा और सिटकॉम ग्रोइंग पेन्स। उन्होंने रॉबर्ट डी नीरो के साथ संस्मरण दिस बॉयज़ लाइफ के फिल्म रूपांतरण में अभिनय करने से पहले क्रिटर्स 3 में जोश के रूप में अभिनय करके अपने फिल्म करियर की शुरुआत की। डिकैप्रियो को नाटक वॉट्स ईटिंग गिल्बर्ट ग्रेप (1993) में उनकी सहायक भूमिका के लिए सराहा गया था, और जेम्स कैमरून के महाकाव्य रोमांस टाइटैनिक (1997) के साथ अंतर्राष्ट्रीय प्रसिद्धि प्राप्त करने से पहले, द बास्केटबॉल डायरीज़ (1995) और रोमांटिक ड्रामा रोमियो + जूलियट (1996) नाटक में प्रमुख भूमिकाओं के साथ सार्वजनिक पहचान प्राप्त की, जो उस समय तक की सबसे अधिक कमाई करने वाली फिल्म बन गई। 2000 के दशक से, डिकैप्रियो को फिल्म शैलियों की एक विस्तृत श्रृंखला में उनके काम के लिए आलोचनात्मक प्रशंसा मिली है। उनकी बाद की फिल्मों में द मैन इन द आयरन मास्क (1998), जीवनी अपराध नाटक कैच मी इफ यू कैन (2002) और महाकाव्य ऐतिहासिक नाटक गैंग्स ऑफ न्यूयॉर्क (2002) शामिल हैं, जो निर्देशक मार्टिन स्कॉर्सेज़ के साथ उनके कई सहयोगों में से पहली थी। डिकैप्रियो को राजनीतिक युद्ध थ्रिलर ब्लड डायमंड (2006), नियो-नॉयर क्राइम ड्रामा द डिपार्टेड (2006), जासूसी थ्रिलर बॉडी ऑफ लाइज़ (2008), ड्रामा रिवोल्यूशनरी रोड (2008), मनोवैज्ञानिक थ्रिलर शटर आइलैंड (2010), विज्ञान कथा थ्रिलर इंसेप्शन (2010), जीवनी फिल्म जे. एडगर (2011), पश्चिमी जांगो अनचेन्ड (2012) और पीरियड ड्रामा द ग्रेट गैट्सबी (2013) में उनके प्रदर्शन के लिए सराहा गया था। द एविएटर (2004) में हॉवर्ड ह्यूजेस और द रेवनेंट (2015) में ह्यूग ग्लास के डिकैप्रियो के चित्रण ने उन्हें सर्वश्रेष्ठ अभिनेता-मोशन पिक्चर ड्रामा के लिए गोल्डन ग्लोब पुरस्कार दिलाया। द वुल्फ ऑफ वॉल स्ट्रीट (2013) में जॉर्डन बेल्फोर्ट के रूप में उनके प्रदर्शन ने उन्हें सर्वश्रेष्ठ अभिनेता-मोशन पिक्चर म्यूजिकल या कॉमेडी के लिए गोल्डन ग्लोब पुरस्कार दिलाया। उन्होंने द रेवनेंट के लिए सर्वश्रेष्ठ अभिनेता का अपना पहला अकादमी पुरस्कार भी जीता। डिकैप्रियो एपियन वे प्रोडक्शंस के संस्थापक हैं-एक निर्माण कंपनी जिसने उनकी कुछ फिल्मों और वृत्तचित्र श्रृंखला ग्रीन्सबर्ग (2008-2010) का निर्माण किया है-और पर्यावरण जागरूकता को बढ़ावा देने के लिए समर्पित एक गैर-लाभकारी संगठन लियोनार्डो डिकैप्रियो फाउंडेशन। वह एक प्रतिबद्ध पर्यावरण कार्यकर्ता भी हैं। 2016 में, उन्हें जलवायु परिवर्तन के लिए संयुक्त राष्ट्र शांति दूत नामित किया गया था और जलवायु परिवर्तन से निपटने के लिए उनके काम के लिए विश्व आर्थिक मंच में क्रिस्टल पुरस्कार प्राप्त हुआ था। 2018 में, जल भृंग की एक प्रजाति का नाम उनकी पर्यावरणीय सक्रियता की मान्यता में उनके नाम पर रखा गया था, ग्रौवेलिनस लियोनार्डोडिकाप्रियोई। डिकैप्रियो के पास लॉस फेलिज़, लॉस एंजिल्स में एक घर और बैटरी पार्क सिटी, लोअर मैनहट्टन में एक अपार्टमेंट है। वह जलवायु परिवर्तन पर कार्रवाई के लिए एक मुखर अधिवक्ता रहे हैं और उन्हें पर्यावरण समूहों से प्रशंसा मिली है। जलवायु परिवर्तन के खतरों के बारे में जागरूकता बढ़ाने के उनके प्रयासों और अक्षय ऊर्जा में उनके निवेश के लिए उनकी विशेष रूप से प्रशंसा की गई है। डिकैप्रियो 1992 से शाकाहारी रहे हैं और पर्यावरणवाद और मानवीय कारणों के प्रति अपने समर्पण के लिए जाने जाते हैं। वह पर्यावरण के मुद्दों के बारे में जागरूकता बढ़ाने के अभियानों में शामिल रहे हैं और टीएजी ह्यूअर के ब्रांड एंबेसडर के रूप में कार्य किया है। वह द 11थ आवर जैसे वृत्तचित्रों के निर्माण में भी शामिल रहे हैं। 2010 में, उन्होंने भूकंप के बाद हैती में राहत प्रयासों के लिए $1 मिलियन का दान दिया। 2017 में, उन्होंने तूफान हार्वे के पीड़ितों को $1 मिलियन का दान दिया। 2018 में, उन्होंने गंभीर रूप से लुप्तप्राय सुमात्रा हाथी के संरक्षण और संरक्षण का समर्थन करने के लिए लियोनार्डो डिकैप्रियो फाउंडेशन को $30 लाख का दान दिया। 2020 में, उन्होंने गंभीर रूप से लुप्तप्राय सुमात्रा हाथी के संरक्षण और संरक्षण का समर्थन करने के लिए लियोनार्डो डिकैप्रियो फाउंडेशन को $30 लाख का दान दिया। 2021 में, उन्होंने गंभीर रूप से लुप्तप्राय सुमात्रा हाथी के संरक्षण और संरक्षण का समर्थन करने के लिए लियोनार्डो डिकैप्रियो फाउंडेशन को $43 मिलियन का दान दिया।</s>\n<|assistant|>\n', 'chosen': 'लियोनार्डो डिकैप्रियो एक प्रतिभाशाली अभिनेता हैं जिन्हें टाइटैनिक और द रेवनेंट जैसी फिल्मों में उनकी भूमिकाओं के लिए जाना जाता है। ओ पर्यावरण सक्रियतामे सेहो शामिल रहल छथि आ अपन प्रदर्शनक लेल कतेको पुरस्कार प्राप्त कयने छथि। डिकैप्रियो जलवायु परिवर्तन पर कार्रवाई के लिए एक मुखर अधिवक्ता रहे हैं और उन्हें पर्यावरण समूहों से प्रशंसा मिली है। जलवायु परिवर्तन के खतरों के बारे में जागरूकता बढ़ाने के उनके प्रयासों और अक्षय ऊर्जा में उनके निवेश के लिए उनकी विशेष रूप से प्रशंसा की गई है। डिकैप्रियो 1992 से शाकाहारी रहे हैं और पर्यावरणवाद और मानवीय कारणों के प्रति अपने समर्पण के लिए जाने जाते हैं। वह पर्यावरण के मुद्दों के बारे में जागरूकता बढ़ाने के अभियानों में शामिल रहे हैं और टीएजी ह्यूअर के ब्रांड एंबेसडर के रूप में कार्य किया है। वह द 11थ आवर जैसे वृत्तचित्रों के निर्माण में भी शामिल रहे हैं। 2010 में, उन्होंने भूकंप के बाद हैती में राहत प्रयासों के लिए $1 मिलियन का दान दिया। 2017 में, उन्होंने तूफान हार्वे के पीड़ितों को $1 मिलियन का दान दिया। 2018 में, उन्होंने गंभीर रूप से लुप्तप्राय सुमात्रा हाथी के संरक्षण और संरक्षण का समर्थन करने के लिए लियोनार्डो डिकैप्रियो फाउंडेशन को $30 लाख का दान दिया। 2020 में, उन्होंने गंभीर रूप से लुप्तप्राय सुमात्रा हाथी के संरक्षण और संरक्षण का समर्थन करने के लिए लियोनार्डो डिकैप्रियो फाउंडेशन को $30 लाख का दान दिया। 2021 में, उन्होंने गंभीर रूप से लुप्तप्राय सुमात्रा हाथी के संरक्षण और संरक्षण का समर्थन करने के लिए लियोनार्डो डिकैप्रियो फाउंडेशन को $43 मिलियन का दान दिया।<|im_end|>\n', 'rejected': 'प्रसिद्ध अभिनेता और परोपकारी, लियोनार्डो डिकैप्रियो के साक्षात्कार और जीवनी खोजें, जो अपनी पर्यावरणीय सक्रियता और टाइटैनिक और द रेवनेंट जैसी फिल्मों में पुरस्कार विजेता प्रदर्शन के लिए जाने जाते हैं।<|im_end|>\n'}
In [3]:
Copied!
# LoRA configuration
peft_config = LoraConfig(
r=16,
lora_alpha=16,
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
target_modules=['k_proj', 'gate_proj', 'v_proj', 'up_proj', 'q_proj', 'o_proj', 'down_proj']
)
# LoRA configuration
peft_config = LoraConfig(
r=16,
lora_alpha=16,
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
target_modules=['k_proj', 'gate_proj', 'v_proj', 'up_proj', 'q_proj', 'o_proj', 'down_proj']
)
In [4]:
Copied!
# Model to fine-tune
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16,
load_in_4bit=True
)
model.config.use_cache = False
# Reference model
ref_model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16,
load_in_4bit=True
)
# Model to fine-tune
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16,
load_in_4bit=True
)
model.config.use_cache = False
# Reference model
ref_model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16,
load_in_4bit=True
)
In [ ]:
Copied!
# Training arguments
training_args = TrainingArguments(
per_device_train_batch_size=,
gradient_accumulation_steps=4,
gradient_checkpointing=True,
learning_rate=5e-5,
lr_scheduler_type="cosine",
num_train_epochs=3,
save_strategy="no",
logging_steps=1,
output_dir=new_model,
optim="paged_adamw_32bit",
warmup_steps=100,
bf16=True,
report_to="wandb",
)
# Create DPO trainer
dpo_trainer = DPOTrainer(
model,
ref_model,
args=training_args,
train_dataset=dataset,
tokenizer=tokenizer,
peft_config=peft_config,
beta=0.1,
max_prompt_length=1024,
max_length=1536,
)
# Fine-tune model with DPO
dpo_trainer.train()
# Training arguments
training_args = TrainingArguments(
per_device_train_batch_size=,
gradient_accumulation_steps=4,
gradient_checkpointing=True,
learning_rate=5e-5,
lr_scheduler_type="cosine",
num_train_epochs=3,
save_strategy="no",
logging_steps=1,
output_dir=new_model,
optim="paged_adamw_32bit",
warmup_steps=100,
bf16=True,
report_to="wandb",
)
# Create DPO trainer
dpo_trainer = DPOTrainer(
model,
ref_model,
args=training_args,
train_dataset=dataset,
tokenizer=tokenizer,
peft_config=peft_config,
beta=0.1,
max_prompt_length=1024,
max_length=1536,
)
# Fine-tune model with DPO
dpo_trainer.train()
/opt/conda/lib/python3.10/site-packages/trl/trainer/dpo_trainer.py:314: UserWarning: When using DPODataCollatorWithPadding, you should set `remove_unused_columns=False` in your TrainingArguments we have set it for you, but you should do it yourself in the future. warnings.warn(
Map: 0%| | 0/6633 [00:00<?, ? examples/s]
Token indices sequence length is longer than the specified maximum sequence length for this model (4632 > 2048). Running this sequence through the model will result in indexing errors Detected kernel version 5.4.0, which is below the recommended minimum of 5.5.0; this can cause the process to hang. It is recommended to upgrade the kernel to the minimum version or higher.
Changes to your `wandb` environment variables will be ignored because your `wandb` session has already started. For more information on how to modify your settings with `wandb.init()` arguments, please refer to the W&B docs.
Tracking run with wandb version 0.16.2
Run data is saved locally in
/workspace/wandb/run-20240128_065712-os8qoadz
View project at https://wandb.ai/ahm-rimer/hindi_dpo_test
/opt/conda/lib/python3.10/site-packages/bitsandbytes/nn/modules.py:226: UserWarning: Input type into Linear4bit is torch.float16, but bnb_4bit_compute_dtype=torch.float32 (default). This will lead to slow inference or training speed. warnings.warn(f'Input type into Linear4bit is torch.float16, but bnb_4bit_compute_dtype=torch.float32 (default). This will lead to slow inference or training speed.') Could not estimate the number of tokens of the input, floating-point operations will not be computed
[ 92/621 1:09:37 < 6:49:13, 0.02 it/s, Epoch 0.44/3]
Step | Training Loss |
---|---|
1 | 0.703000 |
2 | 0.698300 |
3 | 0.703000 |
4 | 0.675100 |
5 | 0.694200 |
6 | 0.675100 |
7 | 0.675300 |
8 | 0.658600 |
9 | 0.641100 |
10 | 0.634400 |
11 | 0.609300 |
12 | 0.606500 |
13 | 0.607200 |
14 | 0.560900 |
15 | 0.563000 |
16 | 0.527200 |
17 | 0.473300 |
18 | 0.486900 |
19 | 0.454200 |
20 | 0.426300 |
21 | 0.381000 |
22 | 0.361900 |
23 | 0.344100 |
24 | 0.298400 |
25 | 0.298100 |
26 | 0.256600 |
27 | 0.245600 |
28 | 0.214800 |
29 | 0.190200 |
30 | 0.163100 |
31 | 0.148100 |
32 | 0.136700 |
33 | 0.117100 |
34 | 0.097800 |
35 | 0.105300 |
36 | 0.072300 |
37 | 0.077200 |
38 | 0.056100 |
39 | 0.051000 |
40 | 0.041900 |
41 | 0.035800 |
42 | 0.031700 |
43 | 0.013200 |
44 | 0.014600 |
45 | 0.036300 |
46 | 0.012200 |
47 | 0.012500 |
48 | 0.011200 |
49 | 0.013500 |
50 | 0.008400 |
51 | 0.004900 |
52 | 0.006900 |
53 | 0.010800 |
54 | 0.006800 |
55 | 0.003900 |
56 | 0.005600 |
57 | 0.002100 |
58 | 0.001800 |
59 | 0.004600 |
60 | 0.001600 |
61 | 0.002000 |
62 | 0.001400 |
63 | 0.001000 |
64 | 0.002900 |
65 | 0.000800 |
66 | 0.004300 |
67 | 0.000700 |
68 | 0.002700 |
69 | 0.000500 |
70 | 0.002600 |
71 | 0.000600 |
72 | 0.000400 |
73 | 0.000800 |
74 | 0.000700 |
75 | 0.000400 |
76 | 0.000600 |
77 | 0.000900 |
78 | 0.000300 |
79 | 0.001000 |
80 | 0.000300 |
81 | 0.002800 |
82 | 0.000900 |
83 | 0.000300 |
84 | 0.000200 |
85 | 0.000300 |
86 | 0.010300 |
87 | 0.001800 |
88 | 0.000400 |
89 | 0.000300 |
90 | 0.000200 |
In [ ]:
Copied!