Introduction

lightning-transformers를 활용하여, Causal Language Modeling을 구현하는 방법은 LANGUAGE MODELING에 간략히 소개되어있고, 본 포스트에서는 위의 링크에서 간략히 소개된 내용들이 lightning-transformers 라이브러리 내부에서 어떤 코드에 해당하는 지를 분석하였습니다.

Datasets

실제로 huggingface datasets 라이브러리를 lightning-transformers에서 사용하고있기때문에, https://huggingface.co/datasets 에 등록되어있는 데이터라면 매우 쉽게 사용할 수 있습니다. 예를 들어 아래의 command로 lightning-transformers 라이브러리를 사용한다고 합시다.

python train.py task=nlp/language_modeling dataset=nlp/language_modeling/wikitext

위의 command에서 task=nlp/langague_modeling은 conf directory 하위에 존재하는 conf/task/nlp/language_modeling.yaml과 conf/dataset/nlp/language_modeling/wikitext.yaml를 train.py에 argument로 전달하는 것을 의미합니다. (전체 lightning-transformers 코드 구성에 관한 설명은 Masked Language Modeling with lightning-transformers 를 참고해주세요!)

├── conf
│   ├── __init__.py
│   ├── backbone
│   │   └── nlp
│   │       ├── default.yaml
│   │       └── seq2seq.yaml
│   ├── config.yaml
│   ├── dataset
│   │   ├── default.yaml
│   │   └── nlp
│   │       ├── default.yaml
│   │       ├── language_modeling
│   │       │   ├── default.yaml
│   │       │   └── wikitext.yaml
...
│   ├── task
│   │   ├── default.yaml
│   │   └── nlp
│   │       ├── default.yaml
│   │       ├── language_modeling.yaml
│   │       ├── multiple_choice.yaml
│   │       ├── question_answering.yaml
│   │       ├── summarization.yaml
│   │       ├── text_classification.yaml
│   │       ├── token_classification.yaml
│   │       └── translation.yaml
...
│   ├── tokenizer
│   │   └── autotokenizer.yaml
...

각각의 yaml 파일을 분석해보겠습니다. 먼저 conf/dataset/nlp/language_modeling/wikitext.yaml 아래와 같으며, lighting-transformers가 사용하고있는 hydra에서 지원하는 문법이 적용되어 있음을 확인할 수 있습니다. 특히 아래의 yaml 파일에서 __target__에 python class 명을 적으면 hydra가 알아서 instantiate를 해주는 기능입니다. (자세한 내용은 Instantiating objects with Hydra 를 참고해주세요!)

실제로 위의 yaml 파일에 정의된대로 cfg 하위에 정의된 dataset_namedataset_config_nameblock_size key에 대응되는 value로 LanguageModelingDataModule class를 instantiate하게 됩니다.

LanguageModelingDataModule이 상속하는 class인 HFDataModule의 load_dataset method에서 cfg 하위에 정의된 value들을 사용합니다.

또 다른 yaml 파일인 conf/task/nlp/language_modeling.yaml 아래와 같으며 마찬가지로 __target__에 해당하는 lightning_transformers.task.nlp.language_modeling.LanguageModelingTransformer를 downstream_model_type key의 value인 transformers.AutoModelForCausalLM 전달하여 instantiate 하게됩니다.

예시로든 command에 아래와 같이 backbone.pretrained_model_name_or_path=gpt2를 argument로 전달하면 conf/backbone/nlp/default.yaml에서 pretrained_model_name_or_path key의 value를 gpt2로 설정하여, train.py에 argument로 전달하는 것과 같습니다.

python train.py task=nlp/language_modeling dataset=nlp/language_modeling/wikitext backbone.pretrained_model_name_or_path=gpt2