Объект ‘BertEmbeddings’ не имеет атрибута ‘bias’ при преобразовании контрольной точки tf

#python #tensorflow #pytorch #bert-language-model #huggingface-transformers

#питон #тензорный поток #pytorch #bert-language-model #huggingface-трансформеры

Вопрос:

При попытке преобразовать контрольную точку самоподготовленной модели tensorflow BERT (используяcreate-pretraining.py скрипт из Google) в модель pytorch с использованием convert_bert_original_tf_checkpoint_to_pytorch.py от Huggingface.

Я всегда получаю следующую ошибку: AttributeError: объект ‘BertEmbeddings’ не имеет атрибута ‘bias’

Имена init_vars (только первые) выглядят следующим образом:

 ['bert/embeddings/layer_normalization/beta', 'bert/embeddings/layer_normalization/beta/adam_m', 'bert/embeddings/layer_normalization/beta/adam_v', 'bert/embeddings/layer_normalization/gamma', 'bert/embeddings/layer_normalization/gamma/adam_m', 'bert/embeddings/layer_normalization/gamma/adam_v']
  

Код, который выдает ошибку, выглядит следующим образом:

 for m_name in name:                                                     
            if re.fullmatch(r"[A-Za-z] _d ", m_name):                          
                scope_names = re.split(r"_(d )", m_name)                       
            else:                                                               
                scope_names = [m_name]                                          
            if scope_names[0] == "kernel" or scope_names[0] == "gamma":         
                pointer = getattr(pointer, "weight")                            
            elif scope_names[0] == "output_bias" or scope_names[0] == "beta":   
                print(scope_names)                                              
                pointer = getattr(pointer, "bias")                              
            elif scope_names[0] == "output_weights":                            
                pointer = getattr(pointer, "weight")                            
            elif scope_names[0] == "squad":                                     
                pointer = getattr(pointer, "classifier")                        
            else:                                                               
                try:                                                            
                    pointer = getattr(pointer, scope_names[0])                  
                except AttributeError:                                          
                    logger.info("Skipping {}".format("/".join(name)))
  

Просматриваем все имена и получаем правильные атрибуты из модели. Когда дело доходит до нормализации слоя в BertEmbeddings, скрипт выдает ошибку. Кто-нибудь еще сталкивался с этой ошибкой раньше? Как вы это исправили?

Здесь снова весь stacktrace:

 Traceback (most recent call last):
  File "convert_bert_original_tf_checkpoint_to_pytorch.py", line 62, in <module>
    convert_tf_checkpoint_to_pytorch(args.tf_checkpoint_path, args.bert_config_file, args.pytorch_dump_path)
  File "convert_bert_original_tf_checkpoint_to_pytorch.py", line 37, in convert_tf_checkpoint_to_pytorch
    load_tf_weights_in_bert(model, config, tf_checkpoint_path)
  File "/modeling_bert.py", line 136, in load_tf_weights_in_bert
    pointer = getattr(pointer, "bias")
  File "module.py", line 594, in __getattr__
    type(self).__name__, name))
AttributeError: 'BertEmbeddings' object has no attribute 'bias'
  

Конфигурация Bert выглядит следующим образом:

 Building PyTorch model from configuration: BertConfig {
  "attention_probs_dropout_prob": 0.1,
  "gradient_checkpointing": false,
  "hidden_act": "gelu",
  "hidden_dropout_prob": 0.1,
  "hidden_size": 512,
  "initializer_range": 0.02,
  "intermediate_size": 2048,
  "layer_norm_eps": 1e-12,
  "max_position_embeddings": 512,
  "model_type": "bert",
  "num_attention_heads": 8,
  "num_hidden_layers": 8,
  "pad_token_id": 0,
  "type_vocab_size": 2,
  "vocab_size": 30522
}
  

Ответ №1:

Оказывается, это просто обозначение «layer_normalization» вместо «LayerNorm». Я просто изменил сценарий, и теперь он работает.

Ответ №2:

Чтобы добавить в @blueberry-cake666, переименование переменных tf в контрольной точке с «layer_normalization» на «LayerNorm» сработало. Вы можете переименовать переменные tf с помощью этого скрипта (https://gist.github.com/fvisin/578089ae098424590d3f25567b6ee255 )

Ответ №3:

параметры модели tensorflow»output_bias» и «output_weight» сопоставляются с pytorch BertForSequenceClassification «классификатор / смещение» «классификатор / веса». Итак, измените коды, как показано ниже, чтобы исправить это:

 elif l[0] == 'output_bias':
    pointer = getattr(pointer, 'classifier')
    pointer = getattr(pointer, 'bias')