Итак, я настраиваю предварительно обученную модель LLaMa2. Я хочу проверить, отличается ли настроенная мной модель от оригинала. Я хочу проверить разницу между base_model и model. Есть ли способ проверить, есть ли разница в весах или параметрах после тренировки?
from google.colab import drive
# Mount Google Drive
drive.mount('/content/drive')
# Path to your saved model in Google Drive
model_path_in_drive = '/content/drive/MyDrive/Mod/llama-2-7b-miniguanaco'
# Reload model in FP16 and merge it with LoRA weights
base_model = AutoModelForCausalLM.from_pretrained(
model_name,
low_cpu_mem_usage=True,
return_dict=True,
torch_dtype=torch.float16,
device_map=device_map,
)
# Load your PeftModel from the saved checkpoint in Google Drive
model = PeftModel.from_pretrained(base_model, model_path_in_drive)
model = model.merge_and_unload()
#mark_only_lora_as_trainable(lora_model)
# Reload tokenizer to save it
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"
Я попробовала некоторые методы из этой статьи, но мне это совершенно не помогло.
Просто прокрутите параметры и сравните их с факелом.allclose. Для ответа я использовал DistilBertModel, используйте соответствующие классы из вашего примера, которые также упоминаются в комментариях:
import torch
from transformers import DistilBertModel
# AutoModelForCausalLM in your case
base_model = DistilBertModel.from_pretrained("distilbert/distilbert-base-uncased")
# PeftModel.merge_and_unload() in your case
finetuned_model = DistilBertModel.from_pretrained("distilbert/distilbert-base-uncased-finetuned-sst-2-english")
for base_param, finetuned_param in zip(base_model.named_parameters(), finetuned_model.named_parameters()):
if not torch.allclose(base_param[1], finetuned_param[1]):
print(base_param[0])
Выход:
embeddings.word_embeddings.weight
embeddings.position_embeddings.weight
embeddings.LayerNorm.weight
embeddings.LayerNorm.bias
transformer.layer.0.attention.q_lin.weight
transformer.layer.0.attention.q_lin.bias
transformer.layer.0.attention.k_lin.weight
transformer.layer.0.attention.k_lin.bias
transformer.layer.0.attention.v_lin.weight
transformer.layer.0.attention.v_lin.bias
transformer.layer.0.attention.out_lin.weight
transformer.layer.0.attention.out_lin.bias
transformer.layer.0.sa_layer_norm.weight
transformer.layer.0.sa_layer_norm.bias
transformer.layer.0.ffn.lin1.weight
transformer.layer.0.ffn.lin1.bias
transformer.layer.0.ffn.lin2.weight
transformer.layer.0.ffn.lin2.bias
transformer.layer.0.output_layer_norm.weight
transformer.layer.0.output_layer_norm.bias
...
transformer.layer.5.attention.q_lin.weight
transformer.layer.5.attention.q_lin.bias
transformer.layer.5.attention.k_lin.weight
transformer.layer.5.attention.k_lin.bias
transformer.layer.5.attention.v_lin.weight
transformer.layer.5.attention.v_lin.bias
transformer.layer.5.attention.out_lin.weight
transformer.layer.5.attention.out_lin.bias
transformer.layer.5.sa_layer_norm.weight
transformer.layer.5.sa_layer_norm.bias
transformer.layer.5.ffn.lin1.weight
transformer.layer.5.ffn.lin1.bias
transformer.layer.5.ffn.lin2.weight
transformer.layer.5.ffn.lin2.bias
transformer.layer.5.output_layer_norm.weight
transformer.layer.5.output_layer_norm.bias
Честно говоря, это звучит крайне маловероятно. Пожалуйста, проверьте свой обучающий код и загрузите правильные контрольные точки. Если это возможно, вы также можете загрузить гири, и я посмотрю. @СартхакШарма
Спасибо за информацию! Итак, когда я это делаю, ничего не было напечатано, что означает, что модель в основном такая же, как и предварительно обученная, и не было никакой реальной выгоды от ее точной настройки?