Auto Class
허깅 페이스는 정말 다양한 모델들이 있다고 말씀드렸었죠. 만약에 이 모델들을 불러올 때마다 다 다르게 선언해 줘야 한다면, 매우매우 복잡할 것입니다. 현재 약 15만건 정도 올라와 있는 것으로 보이는데, 그러면 15만개의 모델로 각각 불러와야합니다.
매번 새 모델마다 코드를 다시 짜야하기 때문에 정말 귀찮은 일이 생기죠ㅠ..ㅠ
그래서 허깅 페이스에는 단 하나의 함수로! 이름만 주면! 바~~~로 모델을 불러올 수 있습니다.
그렇기 때문에 Auto Class라고도 부릅니다.
허깅 페이스에는 텍스트, 이미지, 멀티모달 등등 정말 다양한 모델들이 있는데요.
저는 텍스트 위주로 보겠습니다.
Auto Class는 아래와 같이 총 3가지가 있습니다. (텍스트에서 사용하기 위해서)
- AutoConfig
- AutoTokenizer
- AutoModel
이제 하나씩 알아보도록 하겠습니다.
AutoConfig
딥러닝 학습을 할 때 config라고 하면, 학습에 필요한 파라미터들을 정의해주는 파일을 뜻하죠.
비슷한 의미를 가집니다. 우리가 불러오려고 하는 모델의 설정이 어떠했는지, 그 정보를 불러오는 함수입니다.
class transformers.AutoConfig 클래스를 이용합니다.
▶ from_pretrained(pretrained_model_name_or_path, **kwargs)
함수 명에도 보이듯, pretrained 모델로 부터 불러오겠다! 하는 메소드입니다.
파라미터들을 하나씩 살펴보겠습니다.
빨간색 부분만 필수 파라미터입니다.
- pretrained_model_name(str or os.PathLike) : 불러올 pretrained 모델을 뜻합니다. (정말 간단하게는 이것만 써주면 사용하실 수 있습니다.)
- cache_dir(str or os.PathLike) : 파일이 캐싱될 경로를 지정합니다. 처음 다운로드하고 캐시한 후 다시 사용할 때 속도를 높이는 데 유용합니다.
- force_download(bool, defaults to False) : 파일을 강제로 다운로드 할지 여부를 지정합니다.
- resume_download(bool, defaults to False) : 이전 중당된 다운로드를 다시 시작할지 여부를 지정합니다.
- proxies(Dict[str, str]) : 다운로드 하는 동안 http 또는 socks 프록시를 사용해야 하는 경우 지정됩니다.
- revision(str, defaults to "main") : 모델 체크포인트의 특정 리비전을 지정합니다.
- return_unused_kwargs(bool, defaults to False) : 사용되지 않은 키워드 인수를 반환할 지 여부를 지정합니다. (True일 경우 모든 키워드 인수를 사전 형태로 반환)
- trust_remote_code(bool, defaults to False) : 다운로드된 코드가 안전한지 여부를 확인합니다. True일 경우 모델 다운로드에 대한 검증 절차가 생략)
- output_attentions(bool, defaults to False) : 모든 레이어에서 출력되는 어텐션 가중치를 반환할지 여부를 지정합니다.
- output_hidden_states(bool, defaults to False) : 모든 레이어에서 출력되는 hidden state를 반환할지 여부를 지정합니다.
- from_tf(bool, defaults to False) : tensorflow 체크 포인트에서 모델을 불러올 때 사용합니다.
- return_dict(bool, defaults to False) : 출력 결과를 딕셔너리 형식으로 반환할지 여부를 지정합니다.
사용 방법은 정말 간단합니다. 아래 코드를 참고해주세요.
rom transformers import AutoConfig
# bert-base-uncased 모델의 config를 불러올 경우
config = AutoConfig.from_pretrained("bert-base-uncased")
# dbmdz/bert-base-german-cased 모델의 config를 불러올 경우
config = AutoConfig.from_pretrained("dbmdz/bert-base-german-cased")
# 컴공누나가 학습시킨 comgong-nu-na-bert 불러오기
config = AutoConfig.from_pretrained("folder/comgong-nu-na-bert")
▶ register(model_type, config)
이 함수를 이용하면 새로운 모델 아키텍처에 대한 클래스를 만들 수 있습니다.
즉, 본인이 직접 학습시키고 등록하는 것이라고 생각하시면 됩니다.
- configuration_class(PretrainedConfig) : 등록하려는 클래스를 지정합니다. 이 클래스는 Pretrainedconfig 클래스를 상속해야합니다.
- model_type(str) : 등록하려는 모델의 아키텍쳐 이름을 지정합니다.
- force(bool, defaults to False) : 기존에 등록된 모델 아키텍처와 이름이 충돌할 경우 덮어쓸지 여부를 지정합니다
from transformers import AutoConfig
AutoConfig.register("new-model", NewModelConfig)
AutoTokenizer
위에서는 Config를 자동으로 가져 왔듯, 여기서는 Tokenizer를 자동으로 가져와주는 클래스입니다.
▶ from_pretrained(pretrained_model_name_or_path, **kwargs)
Config에서와 같은 역할을 합니다.
- pretrained_model_name(str or os.PathLike) : 불러올 pretrained 모델을 뜻합니다. (정말 간단하게는 이것만 써주면 사용하실 수 있습니다.)
- tokenizer_type(str) : 로드할 토크나이저의 클래스입니다. 지정할 경우 AutoTokenizer에서 선택하는 기본 클래스가 아닌 사용자 정의 클래스를 지정할 수 있습니다.
- cache_dir(str or os.PathLike) : 모델 다운로드 및 캐싱에 사용될 로드 디렉토리 경로입니다.
- user_fast(bool, defaults to False) : True인 경우 토크나이저가 빠르게 동작하는 것으로 알려진 구현을 사용합니다.
- revision(str, defaults to "main") : 모델 체크포인트의 특정 리비전을 지정합니다.
- local_files_only(bool, defaults to False) : 모델을 다운로드 하지 않고 로컬 파일 시스템에서만 모델을 로드합니다.
from transformers import AutoTokenizer
# bert-base-uncased 모델의 토크나이저를 가져오는 경우
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
# dbmdz/bert-base-german-cased 모델의 토크나이저를 가져오는 경우
tokenizer = AutoTokenizer.from_pretrained("dbmdz/bert-base-german-cased")
▶ register(config_class, slow_tokenizer_class = None, fast_tokenizer_class = None)
이 함수를 이용하면 새로운 모델 아키텍처에 대한 클래스를 만들 수 있습니다.
즉, 본인이 직접 학습시키고 등록하는 것이라고 생각하시면 됩니다.
- config_class(PretrainedConfig) : 등록하려는 클래스를 지정합니다. 이 클래스는 Pretrainedconfig 클래스를 상속해야합니다.
- slow_tokenizer_class(PretrainedTokenizer, defaults to None) : 로드하는 데 많은 시간이 소요되는 모델에 대해 느리게 작동하는 토크나이저 클래스를 등록합니다. AutoTokenizer.from_pretrained의 use_fast=False일 경우 사용합니다.
- fast_tokenizer_class(PretrainedTokenizerFast, defaults to None) : 로드하는 데 적은 시간이 소요되는 모델에 대해 빠르게 작동하는 토크나이저 클래스를 등록합니다. 위와 반대일 경우 사용합니다.
from transformers import AutoModel
AutoModel.register(NewModelConfig, NewModel)
AutoModel
AutoModel은 드디어 모델을 불러올 수 있는 클래스입니다. 사실 AutoModel로 시작하는 정말 다양한 클래스들이있는데요. 저는 정말 기본적인 AutoModel을 살펴보겠습니다.
사실 거의 클래스가 비슷해서, 이거 하나만 알더라도 많이 활용하실 수 있을겁니다.
▶ from_config(config)
위의 두 클래스와 같은 역할을 합니다.
- config(PretrainedConfig) : AutoConfig로부터 받아온 Config를 넣어줍니다.
from transformers import AutoConfig, AutoModel
# bert-base-cased 모델을 불러오는 경우
config = AutoConfig.from_pretrained("bert-base-cased")
model = AutoModel.from_config(config)
▶ from_pretrained(pretrained_model_name_or_path, **kwargs)
위의 두 클래스와 같은 역할을 합니다.
- pretrained_model_name(str or os.PathLike) : 불러올 pretrained 모델을 뜻합니다. (정말 간단하게는 이것만 써주면 사용하실 수 있습니다.)
- config(PretrainedConfig, str, os.PathLike defaults to None) : 모델 아키텍처 설정 파일의 경로 또는 PretraiendConfig 객체를 지정합니다.
from transformers import AutoModel
# bert-base-cased 모델을 다운받는 경우
model = AutoModel.from_pretrained("bert-base-cased")
전체 코드
이제 전체 코드를 한번 살펴보겠습니다.
보시면 아시겠지만, 전체 코드는 크게 두 가지로 작성해 볼 수 있습니다.
1. 모델을 from_config()로 불러오는 경우
from transformers import AutoConfig, AutoModel
# 모델 아키텍처 설정 파일 불러오기
config = AutoConfig.from_pretrained('bert-base-cased')
# 모델 객체 생성
model = AutoModel.from_config(config)
2. 모델을 from_pretrained()로 불러오는 경우
from transformers import AutoModel
# 미리 훈련된 BERT 모델 불러오기
model = AutoModel.from_pretrained('bert-base-cased')
맛보기
아직 설명은 안했지만, 실제로 각각 config, tokenizer, model을 정의한 뒤 아래의 코드처럼 사용할 수 있습니다.
아래 코드는 config를 사용하지 않고, 모델에서 from_pretrained를 불러서 사용하는 예시입니다.
from transformers import AutoTokenizer, AutoModel
# 토크나이저 불러오기
tokenizer = AutoTokenizer.from_pretrained('bert-base-cased')
# 모델 객체 생성
model = AutoModel.from_pretrained('bert-base-cased')
# 입력 텍스트 인코딩
sample_text = "테스트용 문장입니다."
input = tokenizer.encode_plus(sample_text, padding=True, truncation=True, return_tensors='pt')
# 모델에 입력
results = model(input['input_ids'],input['attention_mask'])
'인공지능공부 > 자연어처리' 카테고리의 다른 글
word2vec의 모든 것 (0) | 2023.03.18 |
---|---|
[huggingface🤗] 3.Trainer사용해보기 (0) | 2023.03.14 |
[huggingface🤗] 1.허깅페이스란? (0) | 2023.03.09 |
[NLP이론]3.텍스트 분류-영어 텍스트 분류 (0) | 2021.01.28 |
[NLP실습]2.자연어 처리 개요-유사도 및 문제들 (0) | 2021.01.21 |