import torch from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig from peft import LoraConfig, get_peft_model, TaskType from trl import SFTTrainer, SFTConfig from training.dataset import build_sft_dataset MODEL_ID = 'mistralai/Mistral-7B-v0.3' def main(): bnb_cfg = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type='nf4', bnb_4bit_compute_dtype=torch.bfloat16, bnb_4bit_use_double_quant=True, ) tokenizer = AutoTokenizer.from_pretrained(MODEL_ID) tokenizer.pad_token = tokenizer.eos_token model = AutoModelForCausalLM.from_pretrained( MODEL_ID, quantization_config=bnb_cfg, device_map='auto' ) lora_cfg = LoraConfig( r=16, lora_alpha=32, target_modules=['q_proj', 'v_proj'], lora_dropout=0.05, bias='none', task_type=TaskType.CAUSAL_LM, ) model = get_peft_model(model, lora_cfg) model.print_trainable_parameters() dataset = build_sft_dataset('data/raw/arxiv.parquet') trainer = SFTTrainer( model=model, train_dataset=dataset['train'], eval_dataset=dataset['test'], args=SFTConfig( output_dir='./outputs', num_train_epochs=3, per_device_train_batch_size=2, gradient_accumulation_steps=4, learning_rate=2e-4, fp16=True, logging_steps=10, save_strategy='epoch', eval_strategy='epoch', report_to='none', ), ) trainer.train() model.save_pretrained('./lora-adapter') tokenizer.save_pretrained('./lora-adapter') print('Saved to ./lora-adapter') if __name__ == '__main__': main()