| import torch |
| import datasets |
| from transformers import TrainingArguments, AutoConfig, AutoTokenizer, AutoModelForCausalLM |
| import trl |
| from transformers import BitsAndBytesConfig |
|
|
| train_dataset = datasets.load_dataset('HuggingFaceTB/cosmopedia-20k', split='train') |
|
|
| args = TrainingArguments( |
| output_dir="./test-sft", |
| max_steps=20000, |
| per_device_train_batch_size=1, |
| optim="adafactor", report_to="none", |
| ) |
|
|
| model_id = "microsoft/phi-2" |
| tokenizer = AutoTokenizer.from_pretrained(model_id) |
| nf4_config = BitsAndBytesConfig( |
| load_in_4bit=True, |
| bnb_4bit_quant_type="nf4", |
| bnb_4bit_use_double_quant=True, |
| bnb_4bit_compute_dtype=torch.bfloat16 |
| ) |
|
|
| model = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=nf4_config,device_map="auto") |
| print(model) |
|
|
| from peft import LoraConfig |
|
|
| peft_config = LoraConfig( |
| lora_alpha=16, |
| lora_dropout=0.1, |
| r=64, target_modules=["q_proj", "v_proj", "k_proj", "dense", "lm_head", "fc1", "fc2"], |
| bias="none", |
| task_type="CAUSAL_LM", |
| ) |
| model.add_adapter(peft_config) |
|
|
| trainer = trl.SFTTrainer( |
| model=model, |
| args=args, |
| train_dataset=train_dataset, |
| dataset_text_field='text', |
| max_seq_length=1024 |
| ) |
|
|
| trainer.train() |
|
|
| trainer.model.save_pretrained("sft", dtype=torch.bfloat16) |
| trainer.tokenizer.save_pretrained("sft") |
|
|