PythonProject1 / .venv /transformers /docs /source /ko /modular_transformers.md
DrDavis's picture
Upload folder using huggingface_hub
17c6d62 verified

๋ชจ๋“ˆ์‹ ํŠธ๋žœ์Šคํฌ๋จธ [[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 ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.