Мой код выглядит следующим образом:
Код: Выделить всё
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, AutoConfig
model_config = AutoConfig.from_pretrained('gpt2-medium', output_hidden_states=True, return_dict_in_generate=True)
model = AutoModelForCausalLM.from_pretrained('gpt2-medium', config=model_config).cuda()
# define hook
def hook(module, fea_in, fea_out): # collect output
nonlocal features_in_hook
features_in_hook = fea_out.clone().detach()
return fea_out
model.eval() # turn dropout and layernorm into eval mode
features_in_hook = None # to save output
for (name, module) in model.named_modules():
if name == 'transformer.h.19.mlp.dropout':
h = module.register_forward_hook(hook=hook)
prompt_tok = tok(["Who are you?", "What university are you in?"], padding=True, return_tensors="pt").to("cuda")
hidden_state = model(**prompt_tok)[2][20]
Если я все сделал правильно, скрытое_состояние должно быть таким же, как Features_in_hook. Поскольку длина model(**prompt_tok)[2] равна 25, а первый — встраивание слов, выходные данные 20-го блока должны иметь индекс 20. Однако два результата, полученные разными способами, не являются такой же. Я сделал что-то не так?
Ссылка: использование Register_forward_hook и output_hidden_state.
Подробнее здесь: https://stackoverflow.com/questions/792 ... -outputs-o
Мобильная версия