LASSL Tech Blog

Causal Language Modeling with lightning-transformers

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_modelingconf directory 하위에 존재하는 conf/task/nlp/language_modeling.yamlconf/dataset/nlp/language_modeling/wikitext.yamltrain.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_name, dataset_config_name, block_size key에 대응되는 value로 LanguageModelingDataModule class를 instantiate하게 됩니다.

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

또 다른 yaml 파일인 conf/task/nlp/language_modeling.yaml 아래와 같으며 마찬가지로 __target__에 해당하는 lightning_transformers.task.nlp.language_modeling.LanguageModelingTransformerdownstream_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

이와 같이 전달되면 lightning-transformers는 중간과정들을 거쳐 결과적으로 위의 LanguageModelTransformer가 상속하는 HFTransformer__init__ method로 instantiate할 때, backbone.pretrained_model_name_or_path으로 전달되어 value에 맞게 class를 instantiate하게되는 것을 확인할 수 있습니다.

또한 conf/backbone/nlp/default.yaml에서 /tokenizer@_group_: autotokenizer에 대응되는 yaml 파일인 conf/tokenizer/autotokenizer.yaml을 확인해보면, conf/backbone/nlp/default.yamlpretrained_model_name_or_path key의 value인 gpt2conf/tokenizer/autotokenizer.yamlpretrained_model_name_or_path key의 value로 전달되어, 알맞게 tokenizer도 instantiate하는 것을 확인할 수 있습니다.

Language Modeling Using Your Own Files

huggingface datasets library로 바로 이용할 수 있는 corpus가 아닌 custom corpus를 사용해야하는 경우에는 line by line 형식으로 준비하여 활용할 수 있습니다.

text,
this is the first sentence,
this is the second sentence,

위와 같이 corpus가 line by line 형식으로 준비되면 아래와 같이 dataset.cfg.train_file, dataset.cfg.validation_file에 그 경로를 전달하여 활용할 수 있습니다.

python train.py task=nlp/language_modeling dataset.cfg.train_file=train.csv dataset.cfg.validation_file=valid.csv

위와 같이 전달하면 conf/dataset/nlp/default.yamlcfg 하위에 정의된 key인 train_fle, validation_file에 경로들을 value로 기입하는 것과 같습니다. 결과적으로는 관련있는 yaml 파일들이 아래와 같은 상태로 train.py에 전달되는 것과 같습니다.

boseop.kim

boseop.kimFollow
언젠가는 자연어처리, 음성기술 기반으로 사람이 글과 말로 소통하는 것과 같은 수준의 인터페이스를 만들어보고 싶습니다.