| # ๋ชจ๋์ ํธ๋์คํฌ๋จธ [[modular-transformers]] | |
| `transformers`๋ opinionated(์๊ธฐ ์๊ฒฌ์ด ๊ฐํ) ํ๋ ์์ํฌ์ด๋ฉฐ, ์ฐ๋ฆฌ์ ์ฒ ํ์ ๋ค์์ [๊ฐ๋ ๊ฐ์ด๋](./philosophy)์ ์ ์๋์ด ์์ต๋๋ค. | |
| ์ด ์ฒ ํ์ ํต์ฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ [๋จ์ผ ๋ชจ๋ธ, ๋จ์ผ ํ์ผ](https://huggingface.co/blog/transformers-design-philosophy) ์ธก๋ฉด์์ ์ ๋ํ๋ฉ๋๋ค. ์ด ๊ตฌ์ฑ ์์์ ๋จ์ ์ ํ์ผ ๊ฐ์ ๊ตฌ์ฑ ์์์ ์์๊ณผ ์ํฌํธ ๊ฐ๋ฅ์ฑ์ ์ ํํ๋ค๋ ๊ฒ์ ๋๋ค. | |
| ๊ทธ ๊ฒฐ๊ณผ, ๋ชจ๋ธ ๊ตฌ์ฑ ์์๊ฐ ์ฌ๋ฌ ํ์ผ์ ๊ฑธ์ณ ๋ฐ๋ณต๋๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. `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` ํ์ผ์ ๋ชจ๋ธ๋ง ๋ฐ ๊ตฌ์ฑ ํด๋์ค๋ฅผ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์๊ฒผ์ต๋๋ค. (์์๋ฅผ ์ํด, ํ ํฌ๋์ด์ ๋ ๋งค์ฐ ๋ค๋ฅด๋ฏ๋ก ์ผ๋จ ๋ฌด์ํฉ๋๋ค.) | |
| ```python | |
| 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) | |
| ``` | |
| ์ ์ํ ์ข ์์ฑ์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค: | |
| ```bash | |
| 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` ํ์ผ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. | |