| import os |
| import torch |
| import pandas as pd |
| from datasets import load_dataset |
| from transformers import ( |
| AutoModelForCausalLM, |
| AutoTokenizer, |
| BitsAndBytesConfig, |
| HfArgumentParser, |
| TrainingArguments, |
| pipeline, |
| logging, |
| ) |
| from peft import LoraConfig, PeftModel |
| from trl import SFTTrainer |
|
|
| def custom_format(row): |
| custom_dict = { |
| 'Text': row['text'], |
| 'Question': row['question'], |
| } |
|
|
| options_columns = ['key_1', 'key_2', 'key_3'] |
|
|
| for column in options_columns: |
| right_key = f"{column}(right)" |
| wrong_key = f"{column}(wrong)" |
| |
| right = f"({row[column]}(right))" |
| wrong = f"({row[column]}(wrong))" |
| |
| custom_dict.update({ |
| right: row[right_key], |
| wrong: row[wrong_key], |
| }) |
|
|
| return custom_dict |
|
|
| if __name__ == "__main__": |
| |
| path = "......." |
| base_model = "path" |
|
|
| |
| dataset = load_dataset('csv', data_files='/home/ubuntu/item_multiple_group/data/main_data_.csv') |
| train_df = pd.DataFrame(dataset['train']) |
| train_df = train_df.astype(str) |
| formatted_dataset = train_df.apply(custom_format, axis=1) |
| |
| |
|
|
| compute_dtype = getattr(torch, "float16") |
|
|
| quant_config = BitsAndBytesConfig( |
| load_in_4bit=True, |
| bnb_4bit_quant_type="nf4", |
| bnb_4bit_compute_dtype=compute_dtype, |
| bnb_4bit_use_double_quant=False, |
| ) |
|
|
|
|
| |
| model = AutoModelForCausalLM.from_pretrained( |
| base_model, |
| quantization_config=quant_config, |
| device_map={"": 0} |
| ) |
| model.config.use_cache = False |
| model.config.pretraining_tp = 1 |
|
|
| |
| tokenizer = AutoTokenizer.from_pretrained(base_model, trust_remote_code=True) |
| tokenizer.pad_token = tokenizer.eos_token |
| tokenizer.padding_side = "right" |
|
|
| |
| peft_args = LoraConfig( |
| lora_alpha=16, |
| lora_dropout=0.1, |
| r=64, |
| bias="none", |
| task_type="CAUSAL_LM", |
| ) |
|
|
| |
| training_params = TrainingArguments( |
| output_dir="./results", |
| num_train_epochs=1, |
| per_device_train_batch_size=4, |
| gradient_accumulation_steps=1, |
| optim="paged_adamw_32bit", |
| save_steps=25, |
| logging_steps=25, |
| learning_rate=2e-4, |
| weight_decay=0.001, |
| fp16=False, |
| bf16=False, |
| max_grad_norm=0.3, |
| max_steps=-1, |
| warmup_ratio=0.03, |
| group_by_length=True, |
| lr_scheduler_type="constant", |
| report_to="tensorboard" |
| ) |
|
|
| |
| trainer = SFTTrainer( |
| model=model, |
| train_dataset=dataset, |
| peft_config=peft_args, |
| dataset_text_field="text", |
| max_seq_length=None, |
| tokenizer=tokenizer, |
| args=training_params, |
| packing=False, |
| ) |
| |
| trainer.train() |
|
|
| |
| trainer.model.save_pretrained(new_model) |