๋ชจ๋์ ํธ๋์คํฌ๋จธ [[modular-transformers]]
transformers๋ opinionated(์๊ธฐ ์๊ฒฌ์ด ๊ฐํ) ํ๋ ์์ํฌ์ด๋ฉฐ, ์ฐ๋ฆฌ์ ์ฒ ํ์ ๋ค์์ ๊ฐ๋
๊ฐ์ด๋์ ์ ์๋์ด ์์ต๋๋ค.
์ด ์ฒ ํ์ ํต์ฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋จ์ผ ๋ชจ๋ธ, ๋จ์ผ ํ์ผ ์ธก๋ฉด์์ ์ ๋ํ๋ฉ๋๋ค. ์ด ๊ตฌ์ฑ ์์์ ๋จ์ ์ ํ์ผ ๊ฐ์ ๊ตฌ์ฑ ์์์ ์์๊ณผ ์ํฌํธ ๊ฐ๋ฅ์ฑ์ ์ ํํ๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ ๊ฒฐ๊ณผ, ๋ชจ๋ธ ๊ตฌ์ฑ ์์๊ฐ ์ฌ๋ฌ ํ์ผ์ ๊ฑธ์ณ ๋ฐ๋ณต๋๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. transformers์๋ ๋ชจ๋ธ ์๋งํผ ๋ง์ ์ดํ
์
๋ ์ด์ด๊ฐ ์ ์๋์ด ์์ผ๋ฉฐ, ๊ทธ ์ค ์๋น์๋ ์๋ก ๋์ผํฉ๋๋ค. ์ํ๊น๊ฒ๋, ์์ ๊ณผ ๋ณ๊ฒฝ ์ฌํญ์ด ์ฝ๋์ ํน์ ๋ถ๋ถ์ ์ ์ฉ๋๋ฉด์ ๋
๋ฆฝ์ ์ธ ๊ตฌํ๋ค์ด ์๋ก ๋ถ๊ธฐ๋๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ ์ ํ ํด๊ฒฐํ๊ธฐ ์ํด, ์ฐ๋ฆฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฒด์ "๋ณต์ฌ๋ณธ"์ ๊ฐ๋ ์ ๋์ ํ์ต๋๋ค. ์ฝ๋๊ฐ ๋ค๋ฅธ ์ฝ๋์ ๋ณต์ฌ๋ณธ์์ ๋ํ๋ด๋ ์ฃผ์์ ์ถ๊ฐํจ์ผ๋ก์จ, CI ๋ฐ ๋ก์ปฌ ๋ช ๋ น์ ํตํด ๋ณต์ฌ๋ณธ์ด ๋ถ๊ธฐ๋์ง ์๋๋ก ๊ฐ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ณต์ก์ฑ์ด ๋ฎ๋๋ผ๋ ์ด๋ ์ข ์ข ๋งค์ฐ ๋ฒ๊ฑฐ๋ก์ด ์์ ์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ์ด ๋ฐฉ์์ ์ฐ๋ฆฌ๊ฐ ์ค์ด๊ณ ์ ํ๋ ์๋นํ ์ค๋ฒํค๋๋ฅผ ๋ชจ๋ธ ๊ธฐ์ฌ ๊ณผ์ ์ ์ถ๊ฐํ๊ฒ ๋ฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ข
์ข
๋ชจ๋ธ ๊ธฐ์ฌ์ ๋ชจ๋ธ๋ง ์ฝ๋(1,000์ค), ํ๋ก์ธ์(500์ค), ํ
์คํธ, ๋ฌธ์ ๋ฑ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ๋ชจ๋ธ ๊ธฐ์ฌ PR์ ๋๋ถ๋ถ 3,000~5,000์ค ์ด์์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ฉฐ, ์ด ์ค ๋ง์ ๋ถ๋ถ์ด ๋ณด์ผ๋ฌํ๋ ์ดํธ(boilerplate) ์ฝ๋์
๋๋ค.
์ด๋ ๊ธฐ์ฌ์ ์ฅ๋ฒฝ์ ๋์ด๋ฉฐ, ๋ชจ๋์ ํธ๋์คํฌ๋จธ๋ฅผ ํตํด ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์ฅ๋ฒฝ์ ํจ์ฌ ๋ ์์ฉ ๊ฐ๋ฅํ ์์ค์ผ๋ก ๋ฎ์ถ๊ณ ์ ํฉ๋๋ค.
๋ฌด์์ธ๊ฐ์ [[what-is-it]]
๋ชจ๋์ ํธ๋์คํฌ๋จธ๋ ๋ชจ๋ธ ํด๋์ "๋ชจ๋์" ํ์ผ์ ๊ฐ๋ ์ ๋์ ํฉ๋๋ค. ์ด ๋ชจ๋์ ํ์ผ์ ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ธ๋ง/ํ๋ก์ธ์ฑ ํ์ผ์์ ํ์ฉ๋์ง ์๋ ์ฝ๋๋ฅผ ํ์ฉํ๋ฉฐ, ์ด๋ ์ธ์ ํ ๋ชจ๋ธ๋ก๋ถํฐ์ ์ํฌํธ์ ํด๋์ค ๊ฐ์ ์์์ ํ์ฉํฉ๋๋ค.
์ด ๋ชจ๋์ ํ์ผ์ ๊ฐ๊ฐ์ ๋ณ๋์ ๋ชจ๋์์ ์ ์๋์์ ๋ชจ๋ธ, ํ๋ก์ธ์ ๋ฐ ๊ตฌ์ฑ ํด๋์ค๋ฅผ ์ ์ํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ์ด ๊ธฐ๋ฅ์ ๋ชจ๋์ ํ์ผ์ "ํ์ด๋ด์ด" ๋จ์ผ ๋ชจ๋ธ, ๋จ์ผ ํ์ผ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ก ๋ณํํ๋ ์๋ก์ด linter๋ฅผ ๋์
ํฉ๋๋ค. ์ด ํ์ผ๋ค์ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋ ๋๋ง๋ค ์๋์ผ๋ก ์์ฑ๋๋ฉฐ, ๊ธฐ์ฌํด์ผ ํ ๋ด์ฉ์ ๋ชจ๋์ ํ์ผ, ๊ทธ๋ฆฌ๊ณ ๊ธฐ์ฌ๋ ๋ชจ๋ธ๊ณผ ๋ค๋ฅธ ๋ชจ๋ธ ๊ฐ์ ์ฐจ์ด์ ์ผ๋ก๋ง ์ค์ฌ์ค๋๋ค.
๋ชจ๋ธ ์ฌ์ฉ์๋ ๋จ์ผ ํ์ผ ์ธํฐํ์ด์ค๋ฅผ ์ํฌํธํ๊ณ ์ฌ์ฉํ๊ฒ ๋๋ฏ๋ก, ์ฌ๊ธฐ์๋ ๋ณํ๊ฐ ์์ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋จํ ๊ธฐ์ฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ฉด์๋ ์ฐ๋ฆฌ์ ์ฒ ํ์ ์ ์งํ๋ ์์ชฝ์ ์ฅ์ ์ ๊ฒฐํฉํ๊ณ ์ ํฉ๋๋ค.
๋ฐ๋ผ์ ์ด๋ # Copied from ๋ง์ปค์ ๋์ฒดํ์ด๋ฉฐ, ์ด์ ์ ๊ธฐ์ฌ๋ ๋ชจ๋ธ์ ์์ผ๋ก ๋ช ๋ฌ ๋ด์ ์๋ก์ด ๋ชจ๋์ ํธ๋์คํฌ๋จธ ํ์์ผ๋ก ์ ํ๋ ์์ ์
๋๋ค.
์์ธํ ๋ด์ฉ [[details]]
โlinterโ๋ ์์ ๊ตฌ์กฐ๋ฅผ ํ์ด์ ๋ชจ๋ํ๋ ํ์ผ๋ก๋ถํฐ ๋ชจ๋ ๋จ์ผ ํ์ผ์ ์์ฑํ๋ฉฐ, Python ์ฌ์ฉ์๋ค์๊ฒ๋ ๊ทธ ๊ณผ์ ์ด ๋ณด์ด์ง ์๋๋ก ๋์ํฉ๋๋ค. ํ์ฌ linter๋ ๋จ์ผ ์์ค์ ์์๋ง์ ํํํํฉ๋๋ค.
์๋ฅผ ๋ค์ด:
- ๊ตฌ์ฑ ํด๋์ค๊ฐ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์ํ๊ณ ์ธ์๋ฅผ ์ถ๊ฐ/์ญ์ ํ๋ ๊ฒฝ์ฐ, ์์ฑ๋ ํ์ผ์ ์ง์ ์ฐธ์กฐ(์ถ๊ฐ์ ๊ฒฝ์ฐ)ํ๊ฑฐ๋ ์์ ํ ์ ๊ฑฐํฉ๋๋ค(์ญ์ ์ ๊ฒฝ์ฐ).
- ํด๋์ค๊ฐ ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์ํ๋ ๊ฒฝ์ฐ, ์๋ฅผ ๋ค์ด class GemmaModel(LlamaModel): ์ ๊ฒฝ์ฐ, ์ข ์์ฑ์ด ์๋์ผ๋ก ์ถ๋ก ๋ฉ๋๋ค. ๋ชจ๋ ์๋ธ๋ชจ๋์ ์ํผํด๋์ค๋ก๋ถํฐ ์๋์ผ๋ก ์ถ๋ก ๋ฉ๋๋ค.
ํ ํฌ๋์ด์ , ์ด๋ฏธ์ง ํ๋ก์ธ์, ๋ชจ๋ธ, ๊ตฌ์ฑ ๋ฑ์ ์ด modular ํ์ผ์ ๋ชจ๋ ์์ฑํ ์ ์์ผ๋ฉฐ, ํด๋น ํ์ผ๋ค์ด ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.
์ํ [[enforcement]]
[TODO] ์ฐ๋ฆฌ๋ ์๋ก์ด ํ
์คํธ๋ฅผ ๋์
ํ์ฌ ์์ฑ๋ ์ฝํ
์ธ ๊ฐ modular_xxxx.py์ ์๋ ๋ด์ฉ๊ณผ ์ผ์นํ๋์ง ํ์ธํฉ๋๋ค.
์์ [[examples]]
์ฌ๊ธฐ BERT์ RoBERTa์ ๊ฐ๋จํ ์๊ฐ ์์ต๋๋ค. ๋ ๋ชจ๋ธ์ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋์ด ์์ผ๋ฉฐ, ๋ชจ๋ธ ๊ตฌํ์ ์ฐจ์ด๋ ์๋ฒ ๋ฉ ๋ ์ด์ด์ ๋ณ๊ฒฝ์์๋ง ์์ต๋๋ค.
๋ชจ๋ธ์ ์์ ํ ์ฌ์ ์ํ๋ ๋์ , modular_roberta.py ํ์ผ์ ๋ชจ๋ธ๋ง ๋ฐ ๊ตฌ์ฑ ํด๋์ค๋ฅผ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์๊ฒผ์ต๋๋ค. (์์๋ฅผ ์ํด, ํ ํฌ๋์ด์ ๋ ๋งค์ฐ ๋ค๋ฅด๋ฏ๋ก ์ผ๋จ ๋ฌด์ํฉ๋๋ค.)
from torch import nn
from ..bert.configuration_bert import BertConfig
from ..bert.modeling_bert import (
BertModel,
BertEmbeddings,
BertForMaskedLM
)
# RoBERTa ๊ตฌ์ฑ์ BERT์ ๊ตฌ์ฑ๊ณผ ๋์ผํฉ๋๋ค
class RobertaConfig(BertConfig):
model_type = 'roberta'
# ์ฌ๊ธฐ์ ํจ๋ฉ ID ์ฐจ์ด๋ฅผ ๊ฐ์กฐํ๊ธฐ ์ํด ์๋ฒ ๋ฉ์ ์ฌ์ ์ํ๊ณ , ์์น ์๋ฒ ๋ฉ์ ์ฌ์ ์ํฉ๋๋ค
class RobertaEmbeddings(BertEmbeddings):
def __init__(self, config):
super().__init__(config())
self.padding_idx = config.pad_token_id
self.position_embeddings = nn.Embedding(
config.max_position_embeddings, config.hidden_size, padding_idx=self.padding_idx
)
# RoBERTa ๋ชจ๋ธ์ ์๋ฒ ๋ฉ ๋ ์ด์ด๋ฅผ ์ ์ธํ๋ฉด BERT ๋ชจ๋ธ๊ณผ ๋์ผํฉ๋๋ค.
# ์์์ ์๋ฒ ๋ฉ์ ์ฌ์ ์ํ์ผ๋ฏ๋ก, ์ฌ๊ธฐ์๋ ์ถ๊ฐ ์์
์ด ํ์ ์์ต๋๋ค
class RobertaModel(BertModel):
def __init__(self, config):
super().__init__(config)
self.embeddings = RobertaEmbeddings(config)
# ํค๋๋ ์ด์ ๋ด๋ถ์์ ์ฌ๋ฐ๋ฅธ `RobertaModel`์ ์ฌ์ ์ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค
class RobertaForMaskedLM(BertForMaskedLM):
def __init__(self, config):
super().__init__(config)
self.model = RobertaModel(config)
์ ์ํ ์ข ์์ฑ์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค:
ValueError: You defined `RobertaEmbeddings` in the modular_roberta.py, it should be used
when you define `BertModel`, as it is one of it's direct dependencies. Make sure
you use it in the `__init__` function.
๋ํ, ๋ค์์์ ์์ ๋ชฉ๋ก์ ์ฐพ์ ์ ์์ต๋๋ค:
๋ฌด์์ด ์๋๊ฐ์ [[what-it-is-not]]
(์์ง์?) ๋ชจ๋ธ๋ง ์ฝ๋๋ฅผ ๋์ฒดํ๋ ๊ฒ์ ์๋๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ๋ถ์ ๋ชจ๋ธ์ด ์ง๊ธ๊น์ง ์กด์ฌํ๋ ๋ค๋ฅธ ์ด๋ค ๊ฒ์๋ ๊ธฐ๋ฐํ์ง ์๋๋ค๋ฉด, ๊ธฐ์กด๊ณผ ๊ฐ์ด modeling ํ์ผ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.