Transformers 새 모델 만들기

Posted on Fri, May 14, 2021 NLP MLDL Framework
공식 Guide: https://github.com/huggingface/transformers/tree/master/templates/adding_a_new_model

Huggingface Transformers 모델 만들기

Huggingface Transformers는 NLP 분야에서 진짜 최고의 패키지 중 하나다. Transformers 덕에 BERT, 그리고 BERTology가 무척 많이 발전했고, 그 덕에 KcBERT나 KcELECTRA같은 모델도 쉽게 확산될 수 있었다.

한편, KcBERT나 KcELECTRA, KcGPT 모두 이미 Transformers 패키지에 구현된 BERT,ELECTRA,GPT-2 모델을 가져다 사용한 것이라 model 구조에서 전혀 차이가 없기도 하고, 이로 인해 내부 config 수정하는 것은 가능하지만 그 이상의 수정을 하는 것은 어렵다.

새로운 논문이 나와서 그걸 구현한다거나, 혹은 새로운 아이디어와 발상이 떠올라 새로운 모델 아키텍처를 사용해야 한다면 이것을 짜는 것 부터가 문제다.

Transformers + CookieCutter 🍪

Transformers 라이브러리는 보다 쉬운 모델 추가를 위해 template을 제공하고 있다. 쿠키커터라는, 템플릿 기반 Code generation 패키지를 사용할 수 있어서 아주 쉽게 Boilerplate를 갖다 쓸 수 있다.

환경 잡기

💡

conda env, 혹은 python venv 등으로 가상환경을 만든 뒤 진행하는게 좋다.

우선 Transformers 개발에 필요한 패키지를 모두 설치해 준다.

git clone https://github.com/huggingface/transformers
cd transformers
pip install -e ".[dev]"

그리고 아래 커맨드로 새 모델 생성을 시작하자.

transformers-cli add-new-model

위 명령어 입력시 아래와 같이 모델 명을 입력하게 하는데, 적당히 convention에 맞게 맞춰주면 된다.

modelname [<ModelNAME>]:
uppercase_modelname [<MODEL_NAME>]: 
lowercase_modelname [<model_name>]: 
camelcase_modelname [<ModelName>]:
authors [The HuggingFace Team]:
checkpoint_identifier [organisation/<model_name>-base-cased]:

그리고 Tokenizer가 BERT처럼 동작하는지 독자 규격을 사용하는지 선택하면..

Select tokenizer_type:
1 - Based on BERT
2 - Standalone
Choose from 1, 2 [1]:

짠, 모델 설명을 위한 .rst 파일을 비롯해 모델 config, modeling py 파일, Tokenization 파일까지 모두 생긴다.

docs/source/model_doc/<model_name>.rst
src/transformers/models/<model_name>/configuration_<model_name>.py
src/transformers/models/<model_name>/modeling_<model_name>.py
src/transformers/models/<model_name>/modeling_tf_<model_name>.py
src/transformers/models/<model_name>/tokenization_<model_name>.py
tests/test_modeling_<model_name>.py
tests/test_modeling_tf_<model_name>.py

그뿐만 아니라, AutoModel, AutoTokenizer 를 사용할 수 있도록 모델 __init__ 에 새로운 모델이 자동으로 추가된다.

어디를 수정할까?

만약 모델에 Position embedding부분만 수정하고 싶다면 아래 부분에서 TiMoBERTEmbeddings 를 수정해주면 된다. (이름이 티모인 이유는 테스트 모델 이름을 티모로 했기 때문이다.)

세부 코드들 역시 BERT 등과 동일하게 구현되어있기 때문에, 필요한 부분만 수정해서 새로운 아이디어를 바로바로 테스트 해볼 수 있다!