본문 바로가기
필기 노트/Huggingface Transformers

[Huggingface] PreTrainedModel class

by misconstructed 2021. 7. 16.
728x90

최근들어 Huggingface에서 제공하는 Transformers 라이브러리를 많이 사용하는데, 구체적인 동작 방식을 이해하고 사용하면 좋은 것 같아서 기초부터 차근차근 정리해본다. 간단하게 정히한거라, 공식 문서와 코드를 참고하면 더 도움이 될 듯!


PreTrainedModel

공식 문서 : https://huggingface.co/transformers/main_classes/model.html

코드 : https://huggingface.co/transformers/_modules/transformers/modeling_utils.html

 

모델의 configuration을 저장하고, 모델을 불러오고 저장하는 역할을 수행한다. 추가적으로, 임베딩의 크기를 바꿔주는 역할, self-attention head를 pruning하는 역할을 수행한다.

 

- from_pretrained()

Pretrained model을 intantiate 한다. 기본적으로 model.eval() 로 설정되어있기 때문에 학습을 하기 위해서는 model.train()으로 모드를 변경해줘야 한다.

pretrained_model_name_or_path : model id (bert-base-cased 등 과 같이 우리가 자주 사용하는!), save_pretrained() 를 통해서 지정한 모델을 저장한 디렉토리의 경로, None (config, state_dict를 모두 제공하는 경우) 등

config : PreTrainedConfig를 상속받은 클래스

state_dict : Dict[str, torch.Tensor)

 

- save_pretrained()

모델과 해당 모델의 configuration을 특정한 디렉토리에 저장한다. save_directory 로 해당 값들을 저장할 위치를 지정할 수 있다. 

load config → load model → instantiate model (load weights) → model.eval() (gradient 계산하지 않도록) 

 

- get_input_embeddings() , get_output_embeddings()

Input embedding은 vocabulary 에서 hidden state로 mapping하고, output embedding은 hidden state에서 vocabulary로 mapping하는 역할을 수행한다.

 

- set_input_embeddings()

모델의 input embedding을 새로 지정한다. 

 

- resize_token_embeddings()

new_num_tokens 로 지정한 크기만큼의 임베딩을 생성한다. 기존의 임베딩 크기보다 new_num_tokens가 더 크다면 임베딩 제일 뒤에 새로운 임베딩들을 추가하고, 더 작다면 뒤에서부터 임베딩을 삭제해서 임베딩의 크기를 줄인다. new_num_tokens를 지정하지 않는 경우는 그냥 임베딩의 포인터를 리턴한다.

 

- tie_weights()

input embedding과 output embedding을 묶는다. (input weight를 가지고와서 output weight으로 지정해준다.) (output.weight = input.weight) torchscript flag가 config 파일에 지정되어 있다면, input weight을 clone해서 output weight으로 지정해준다. 

728x90

댓글