Дальнейшая настройка модели CausalLM, настроенной Peft/LoRA.
Я немного не уверен, как действовать в отношении упомянутой темы.
Базовой является модель, созданная с помощью библиотеки Huggingface как модель AutoModelForCausalLM, PEFT и подход LoRA с последующим объединением весов.
Теперь я хочу провести дальнейшую тонкую настройку модели без потери ее первоначальных свойств - в данном случае с помощью инструкции по тонкой настройке/настройке префикса.
Мой подход был бы следующим:
model = AutoModelForCausalLM.from_pretrained(
model_id,
use_cache=False if gradient_checkpointing else True
device_map="auto",
load_in_8bit=True,
)
model = create_peft_config(model)
output_dir = "/tmp"
training_args = TrainingArguments(
output_dir=output_dir,
overwrite_output_dir=True,
per_device_train_batch_size=per_device_train_batch_size,
per_device_eval_batch_size=per_device_train_batch_size,
bf16=bf16,
learning_rate=lr,
num_train_epochs=epochs,
gradient_checkpointing=gradient_checkpointing,
gradient_accumulation_steps=2,
logging_dir=f"{output_dir}/logs",
logging_strategy="steps",
logging_steps=10,
optim="adafactor",
save_strategy="epoch",
save_total_limit=3,
evaluation_strategy="epoch",
load_best_model_at_end=False,
no_cuda=False,
auto_find_batch_size=True
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset_train,
compute_metrics=compute_metrics,
preprocess_logits_for_metrics=preprocess_logits_for_metrics,
eval_dataset=dataset_eval,
data_collator=default_data_collator
)
trainer.train()
trainer.model.save_pretrained(output_dir)
del model
del trainer
peft_config = PeftConfig.from_pretrained(output_dir)
model = AutoModelForCausalLM.from_pretrained(
peft_config.base_model_name_or_path,
load_in_8bit=False,
return_dict=True,
device_map="auto",
torch_dtype=torch.float16,
low_cpu_mem_usage=True,
)
model = PeftModel.from_pretrained(
model,
output_dir,
torch_dtype=torch.float16,
device_map="auto",
)
model.eval()
os.makedirs("lora", exist_ok=True)
merged_model = model.merge_and_unload()
merged_model.save_pretrained('lora')
tokenizer = AutoTokenizer.from_pretrained(model_id)
tokenizer.save_pretrained('lora')
В принципе, я загружаю исходную модель с объединенными весами, настраиваю ее на новых данных аналогичным образом с помощью PEFT и LoRA, а затем снова объединяю веса с базовой моделью.
Разумный ли это подход или есть что-то, что можно предположить, например, что я могу даже существенно поставить под угрозу исходные возможности, поступая таким образом? Если что-то говорит против этого, какой подход будет лучшим?
С уважением и заранее спасибо
После обучения в течение 3 эпох примерно на 15000 пар инструкций модель создается правильно, применяются веса и впоследствии ее можно загрузить.
К сожалению, отчетливо видно, что модель утратила свои первоначальные возможности. Подсказки, которые работали раньше, не работают. Видно, что модель старается подойти к подсказкам правильно, но не качественно.
1 ответ
в исходной документации отсутствует способ загрузки модели https://huggingface.co/blog/4bit-transformers-bitsandbytes
trainer.model.save_pretrained('./bits')
...
tokenizer = AutoTokenizer.from_pretrained(model_id)
#model_id = '/root/.cache/huggingface/hub/models--EleutherAI--gpt-neo-1.3B/snapshots/0f35a20339a9e208bc061570981180cfb87c9572'
peft_config = PeftConfig.from_pretrained('bits')
model = AutoModelForCausalLM.from_pretrained(
peft_config.base_model_name_or_path,
quantization_config=bnb_config, device_map={"":0}
#load_in_8bit=False,
#return_dict=True,
#device_map="auto",
#torch_dtype=torch.float16,
#low_cpu_mem_usage=True,
)
однако здесь также есть несколько шагов, если вы используете peftmodel https://github.com/huggingface/blog/blob/main/peft.md
peft_config = LoraConfig(task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1)
model = AutoModelForSeq2SeqLM.from_pretrained(model_name_or_path)
+ model = get_peft_model(model, peft_config)
+ model.print_trainable_parameters()