finetune.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import os
  2. # os.environ["CUDA_VISIBLE_DEVICES"] = "0"
  3. import torch
  4. import torch.nn as nn
  5. import bitsandbytes as bnb
  6. from datasets import load_dataset
  7. import transformers
  8. from transformers import AutoTokenizer, AutoConfig, LLaMAForCausalLM, LLaMATokenizer
  9. from peft import prepare_model_for_int8_training, LoraConfig, get_peft_model
  10. model = LLaMAForCausalLM.from_pretrained(
  11. "./7B/llama-7b",
  12. load_in_8bit=True,
  13. max_sequence_length=128, # data length
  14. device_map="auto",
  15. )
  16. tokenizer = LLaMATokenizer.from_pretrained("./7B/tokenizer")
  17. def print_trainable_parameters(model):
  18. """
  19. Prints the number of trainable parameters in the model.
  20. """
  21. trainable_params = 0
  22. all_param = 0
  23. for _, param in model.named_parameters():
  24. all_param += param.numel()
  25. if param.requires_grad:
  26. trainable_params += param.numel()
  27. print(
  28. f"trainable params: {trainable_params} || all params: {all_param} || trainable%: {100 * trainable_params / all_param}"
  29. )
  30. print_trainable_parameters(model)
  31. model = prepare_model_for_int8_training(model)
  32. config = LoraConfig(
  33. r=4,
  34. lora_alpha=16,
  35. target_modules=["q_proj", "v_proj"],
  36. lora_dropout=0.05,
  37. bias="none",
  38. task_type="CAUSAL_LM",
  39. )
  40. model = get_peft_model(model, config)
  41. print_trainable_parameters(model)
  42. tokenizer.pad_token = tokenizer.eos_token
  43. tokenizer.pad_token_id = tokenizer.eos_token_id
  44. data = load_dataset("json", data_files="alpaca_data.json")
  45. def generate_prompt(data_point):
  46. # sorry about the formatting disaster gotta move fast
  47. if data_point["instruction"]:
  48. return f"""Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.
  49. ### Instruction:
  50. {data_point["instruction"]}
  51. ### Input:
  52. {data_point["input"]}
  53. ### Response:"""
  54. else:
  55. return f"""Below is an instruction that describes a task. Write a response that appropriately completes the request.
  56. ### Instruction:
  57. {data_point["instruction"]}
  58. ### Response:"""
  59. data = data.map(
  60. lambda data_point: tokenizer(
  61. generate_prompt(data_point),
  62. truncation=True,
  63. max_length=128,
  64. padding="max_length",
  65. )
  66. )
  67. DATA_SIZE = 51368
  68. MICRO_BATCH_SIZE = 12
  69. BATCH_SIZE = 36
  70. GRADIENT_ACCUMULATION_STEPS = BATCH_SIZE // MICRO_BATCH_SIZE
  71. EPOCHS = 3
  72. LEARNING_RATE = 2e-5
  73. trainer = transformers.Trainer(
  74. model=model,
  75. train_dataset=data["train"],
  76. args=transformers.TrainingArguments(
  77. per_device_train_batch_size=MICRO_BATCH_SIZE,
  78. gradient_accumulation_steps=GRADIENT_ACCUMULATION_STEPS,
  79. warmup_steps=100,
  80. num_train_epochs=EPOCHS,
  81. learning_rate=LEARNING_RATE,
  82. fp16=True,
  83. logging_steps=1,
  84. output_dir="lora-alpaca",
  85. save_total_limit=3,
  86. ),
  87. data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),
  88. )
  89. model.config.use_cache = False
  90. trainer.train(resume_from_checkpoint=False)
  91. model.save_pretrained("lora-alpaca")