Дальнейшая настройка модели 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()
Другие вопросы по тегам