Transformers
pipeline()
๋ชจ๋ธ inference๋ฅผ ์ํด ์ฌ์ฉ
from transformers import pipeline pipe = pipeline("text-classification") pipe("This restaurant is awesome") # [{'label': 'POSITIVE', 'score': 0.9998743534088135}]
from transformers๋ก Github(๐โฌ) transformer์์ ํจ์๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๋ค:
๋ถ๋ฌ์ค๋ ํจ์์ ๊ฒฝ์ฐ, __init__.py๋ฅผ ํ์ธํ๋ฉด ์ ์ ์๋๋ฐ, ์๋ ์ฌ์ง์ฒ๋ผ pipeline์ด from .pipelines import pipeline์ด๋ผ ์ ํ์์์ ํ์ธ๊ฐ๋ฅํ๋ค.
์ ์ข์ธก์ฌ์ง์์ ํ์ธํ ์ ์๋ฏ, pipelinesํด๋์ pipelineํจ์๋ฅผ ๋ถ๋ฌ์ค๋๊ฒ์ ํ์ธํ ์ ์์ผ๋ฉฐ,
์ค์ ๋ก ํด๋น ํด๋์ ๋ค์ด๊ฐ๋ณด๋ฉด ์ฐ์ธก์ฒ๋ผ pipelineํจ์๊ฐ ์ ์๋๊ณ , ์ด ํํ๋ transformers.pipeline docs๋ด์ฉ๊ณผ ์ผ์นํจ์ ํ์ธ๊ฐ๋ฅํ๋ค.
Auto Classes
from_pretrained() Method๋ก ์ถ๋ก ์ด ๊ฐ๋ฅํ๋ฉฐ, AutoClasses๋ ์ด๋ฐ ์์ ์ ์ํ, ์ฌ์ ํ๋ จ๋ AutoConfig, AutoModel, AutoTokenizer์ค ํ๋๋ฅผ ์๋์ผ๋ก ์์ฑ๊ฐ๋ฅํ๋ค:
ex)from transformers import AutoConfig, AutoModel model = AutoModel.from_pretrained("google-bert/bert-base-cased")
โ AutoConfig
generic Cofigurationํด๋์ค๋ก from_pretrained()๋ผ๋ ํด๋์ค๋ฉ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์ ํด๋์ค ์ค ํ๋๋ก ์ธ์คํด์คํ๋๋ค.
์ด ํด๋์ค๋ '__init__()'์ ์ฌ์ฉํด ์ง์ ์ธ์คํด์คํ ์ ์๋ค!!์ ์ฌ์ง์ ๋ณด๋ฉด, transformers/srcํ์ผ์ ๋ฐ๊ณ ๋ค์ด๊ฐ ๊ฒฐ๊ณผ, ์ต์ข ์ ์ผ๋ก from_pretrained()ํจ์๋ฅผ ์ฐพ์ ์ ์์๋ค.
ํด๋น ๊นํ์ฝ๋(๊ฐ์ฅ ์ฐ์ธก์ฌ์ง)๋ฅผ ๋ณด๋ฉด, __init__()ํจ์์ ๋ํด raise EnvironmentError๊ฐ ๊ฑธ๋ ค์์์ด ํ์ธ๊ฐ๋ฅํ๋ค.config = AutoConfig.from_pretrained("bert-base-uncased") print(config) # BertConfig { # "_name_or_path": "bert-base-uncased", # "architectures": [ # "BertForMaskedLM" # ], # "attention_probs_dropout_prob": 0.1, # "classifier_dropout": null, # "gradient_checkpointing": false, # "hidden_act": "gelu", # "hidden_dropout_prob": 0.1, # "hidden_size": 768, # "initializer_range": 0.02, # "intermediate_size": 3072, # "layer_norm_eps": 1e-12, # "max_position_embeddings": 512, # "model_type": "bert", # "num_attention_heads": 12, # "num_hidden_layers": 12, # "pad_token_id": 0, # "position_embedding_type": "absolute", # "transformers_version": "4.41.2", # "type_vocab_size": 2, # "use_cache": true, # "vocab_size": 30522 # }
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด, Config๋ ๋ชจ๋ธ ํ์ต์ ์ํ jsonํ์ผ๋ก ๋์ด์์์ ํ์ธ๊ฐ๋ฅํ๋ค.
batch_size, learning_rate, weight_decay ๋ฑ train์ ํ์ํ ๊ฒ๋ค๊ณผ
tokenizer์ ํน์ํ ํฐ๋ค์ ๋ฏธ๋ฆฌ ์ค์ ํ๋ ๋ฑ ์ค์ ๊ด๋ จ ๋ด์ฉ์ด ๋ค์ด์๋ค.
๋ํ, save_pretrained()๋ฅผ ์ด์ฉํ๋ฉด ๋ชจ๋ธ์ checkpointํ ํจ๊ป ์ ์ฅ๋๋ค!
๊ทธ๋ ๊ธฐ์, ๋ง์ฝ ์ค์ ์ ๋ณ๊ฒฝํ๊ณ ์ถ๊ฑฐ๋ Model Proposal๋ฑ์ ์ํฉ์์๋ configํ์ผ์ ์ง์ ๋ถ๋ฌ์์ผํ๋ค!
โ AutoTokenizer, (blobs, refs, snapshots)
generic Tokenizerํด๋์ค๋ก AutoTokenizer.from_pretrained()๋ผ๋ ํด๋์ค๋ฉ์๋.
์์ฑ ์, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ ํฌ๋์ด์ ํด๋์ค ์ค ํ๋๋ก ์ธ์คํด์คํ๋๋ค.
์ฐธ๊ณ )https://chan4im.tistory.com/#%E2%88%99input-ids
์ด ํด๋์ค๋ '__init__()'์ ์ฌ์ฉํด ์ง์ ์ธ์คํด์คํ ์ ์๋ค!!์ ์ฌ์ง์ ๋ณด๋ฉด, transformers/srcํ์ผ์ ๋ฐ๊ณ ๋ค์ด๊ฐ ๊ฒฐ๊ณผ, ์ต์ข ์ ์ผ๋ก from_pretrained()ํจ์๋ฅผ ์ฐพ์ ์ ์์๋ค.
ํด๋น ๊นํ์ฝ๋(๊ฐ์ฅ ์ฐ์ธก์ฌ์ง)๋ฅผ ๋ณด๋ฉด, __init__()ํจ์์ ๋ํด raise EnvironmentError๊ฐ ๊ฑธ๋ ค์์์ด ํ์ธ๊ฐ๋ฅํ๋ค.from transformers import AutoTokenizer # Download vocabulary from huggingface.co and cache. tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-uncased") # If vocabulary files are in a directory # (e.g. tokenizer was saved using *save_pretrained('./test/saved_model/')*) tokenizer = AutoTokenizer.from_pretrained("./test/bert_saved_model/") # Download vocabulary from huggingface.co and define model-specific arguments tokenizer = AutoTokenizer.from_pretrained("FacebookAI/roberta-base", add_prefix_space=True) tokenizer # BertTokenizerFast(name_or_path='google-bert/bert-base-uncased', vocab_size=30522, model_max_length=512, is_fast=True, padding_side='right', truncation_side='right', special_tokens={'unk_token': '[UNK]', 'sep_token': '[SEP]', 'pad_token': '[PAD]', 'cls_token': '[CLS]', 'mask_token': '[MASK]'}, clean_up_tokenization_spaces=True), added_tokens_decoder={ # 0: AddedToken("[PAD]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True), # 100: AddedToken("[UNK]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True), # 101: AddedToken("[CLS]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True), # 102: AddedToken("[SEP]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True), # 103: AddedToken("[MASK]", rstrip=False, lstrip=False, single_word=False, normalized=False, special=True), # }
๊ทธ๋ฐ๋ฐ ํ๊ฐ์ง ๊ถ๊ธํ์ง ์์๊ฐ?
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-uncased")
์ ์ฝ๋๋ฅผ ์์ฑํ ์คํํ๋ฉด ์ฝ์์ฐฝ์ ์ ์๋์ ๊ฐ์ ํ๋ฉด์ด ๋์ค๋ ๊ฒ์ผ๊น?????
๋ฏธ๋ฆฌ ์ค๋ช :
tokenizer_config.json์๋ token์ ๋ํ ์ค์ ๋ค์ด,
config.json์๋ ๋ชจ๋ธ๊ด๋ จ ์ค์ ์ด,
vocab.txt๋ subword๋ค์ด ๋ค์ด์๊ณ ,
tokenizer.json์ config๋ ๊ฐ๋ค์ ๋ํด ๋์ดํ ๊ฒ์ด๋ค.
๋ณธ์ธ์ ๊ฒฝ์ฐ, ์๋์ ๊ฐ์ด cache_dir์ ์ง์ ์ ํ๋ฉด, ํด๋น ๋๋ ํ ๋ฆฌ์ hub๋ผ๋ ํ์ผ์ด ์๊ธฐ๋ฉฐ, ๊ทธ์์ ๋ชจ๋ธ๊ด๋ จ ํ์ผ์ด ์๊ธด๋ค.parser.add_argument('--cache_dir', default="/data/huggingface_models")
ํ๊ณ ๋ค์ด๊ฐ๋ค ๋ณด๋ฉด ์ด 3๊ฐ์ง ํด๋๊ฐ ๋์จ๋ค: blobs, refs, snapshots
blobs: ํด์๊ฐ์ผ๋ก ๋ํ๋์ ธ ์์์ ํ์ธ๊ฐ๋ฅํ๋ค. ํด๋นํ์ผ์๋ ์๋์ ๊ฐ์ ํ์ผ์ด ์กด์ฌํ๋ค:
Configํด๋์ค๊ด๋ จํ์ผ, Model๊ด๋ จ ํด๋์คํ์ผ๋ค, tokenizer์ค์ ๊ด๋ จ jsonํ์ผ, weight๊ด๋ จ ํ์ผ๋ค ๋ฑ๋ฑ ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ๋ง์ ํ์ผ๋ค์ด ์ฝ๋ํ๋์ด ๋ค์ด์๋ค:
refs: ๋จ์ํ main์ด๋ผ๋ ํ์ผ๋ง ์กด์ฌํ๋ค:ํด๋น ํ์ผ์๋ snapshots์์ ์๋ ๋๋ ํ ๋ฆฌ์ ์ด๋ฆ๊ณผ ๋์ผํ ์ด๋ฆ์ด ์ ํ์๋ค.
snapshots: ๋ฐ๋ก ์ด๊ณณ์!! tokenizer_config.json, config.json, vocab.txt, tokenizer.jsonํ์ผ์ด ์์์ ํ์ธํ ์ ์๋ค!!!
๊ทธ๋ฐ๋ฐ ๋ญ๊ฐ ์ด์ํ์ง ์์๊ฐ??
์์ blobs์ ๋์์๋ ์ฌ์ง์ ์ฝ๋์ snapshots์ ์ฝ๋๊ฐ ๋ชจ๋ ์ผ์นํ๋ค๋ ์ฌ์ค!!๊ทธ๋ ๋ค! ์ฆ, blobs๋ snapshots ๋ด์ฉ์ ํด์๊ฐํํ๋ก ์ ์ฅํ ๊ฒ์ด์๋ค!!!
์ฌ์ค ์ด์งํ๋ค์์ ๊ตฌ๊ธ์ ์น๋๊น ๋ฐ๋ก ์๊ธดํ์๋ค..(https://huggingface.co/docs/huggingface_hub/v0.16.3/en/guides/manage-cache)
ํ๊น ํ์ด์ค ์ค๋ช ์์ฝ:Refs refs ํด๋๋ ์ฃผ์ด์ง ์ฐธ์กฐ์ ์ต์ ๋ฆฌ๋น์ ์ ๋ํ๋ด๋ ํ์ผ์ ํฌํจํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ด์ ์ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ฉ์ธ ๋ธ๋์น์์ ํ์ผ์ ๊ฐ์ ธ์จ ๊ฒฝ์ฐ, refs ํด๋์๋ main์ด๋ผ๋ ํ์ผ์ด ์์ผ๋ฉฐ, ํ์ฌ ํค๋์ ์ปค๋ฐ ์๋ณ์๋ฅผ ํฌํจํฉ๋๋ค.
๋ง์ฝ ์ต์ ์ปค๋ฐ์ด aaaaaa๋ผ๋ ์๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ํด๋น ํ์ผ์ aaaaaa๋ฅผ ํฌํจํ ๊ฒ์ ๋๋ค.
๋์ผํ ๋ธ๋์น๊ฐ ์๋ก์ด ์ปค๋ฐ bbbbbb๋ก ์ ๋ฐ์ดํธ๋ ๊ฒฝ์ฐ, ํด๋น ์ฐธ์กฐ์์ ํ์ผ์ ๋ค์ ๋ค์ด๋ก๋ํ๋ฉด refs/main ํ์ผ์ด bbbbbb๋ก ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
Blobs blobs ํด๋๋ ์ค์ ๋ก ๋ค์ด๋ก๋๋ ํ์ผ์ ํฌํจํฉ๋๋ค. ๊ฐ ํ์ผ์ ์ด๋ฆ์ ํด๋น ํ์ผ์ ํด์์ ๋๋ค.
Snapshots snapshots ํด๋๋ ์์ blobs์์ ์ธ๊ธํ ํ์ผ์ ๋ํ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ํฌํจํฉ๋๋ค. ์์ฒด์ ์ผ๋ก ์๋ ค์ง ๊ฐ ๋ฆฌ๋น์ ์ ๋ํด ์ฌ๋ฌ ํด๋๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
cf) ๋ํ cache๋ ์๋์ ๊ฐ์ tree๊ตฌ์กฐ๋ฅผ ๊ฐ์ง:[ 96] . โโโ [ 160] models--julien-c--EsperBERTo-small โโโ [ 160] blobs โ โโโ [321M] 403450e234d65943a7dcf7e05a771ce3c92faa84dd07db4ac20f592037a1e4bd โ โโโ [ 398] 7cb18dc9bafbfcf74629a4b760af1b160957a83e โ โโโ [1.4K] d7edf6bd2a681fb0175f7735299831ee1b22b812 โโโ [ 96] refs โ โโโ [ 40] main โโโ [ 128] snapshots โโโ [ 128] 2439f60ef33a0d46d85da5001d52aeda5b00ce9f โ โโโ [ 52] README.md -> ../../blobs/d7edf6bd2a681fb0175f7735299831ee1b22b812 โ โโโ [ 76] pytorch_model.bin -> ../../blobs/403450e234d65943a7dcf7e05a771ce3c92faa84dd07db4ac20f592037a1e4bd โโโ [ 128] bbc77c8132af1cc5cf678da3f1ddf2de43606d48 โโโ [ 52] README.md -> ../../blobs/7cb18dc9bafbfcf74629a4b760af1b160957a83e โโโ [ 76] pytorch_model.bin -> ../../blobs/403450e234d65943a7dcf7e05a771ce3c92faa84dd07db4ac20f592037a1e4bd
โ AutoModel
๋น์ฐํ ์์ ๊ฐ์ด, ์๋์ฌ์ง์ฒ๋ผ ์ฐพ์๊ฐ ์ ์๋ค.
๋จผ์ AutoModel.from_configํจ์๋ฅผ ์ดํด๋ณด์.
from transformers import AutoConfig, AutoModel # Download configuration from huggingface.co and cache. config = AutoConfig.from_pretrained("google-bert/bert-base-cased") model = AutoModel.from_config(config) @classmethod def from_config(cls, config, **kwargs): trust_remote_code = kwargs.pop("trust_remote_code", None) has_remote_code = hasattr(config, "auto_map") and cls.__name__ in config.auto_map has_local_code = type(config) in cls._model_mapping.keys() trust_remote_code = resolve_trust_remote_code( trust_remote_code, config._name_or_path, has_local_code, has_remote_code ) if has_remote_code and trust_remote_code: class_ref = config.auto_map[cls.__name__] if "--" in class_ref: repo_id, class_ref = class_ref.split("--") else: repo_id = config.name_or_path model_class = get_class_from_dynamic_module(class_ref, repo_id, **kwargs) if os.path.isdir(config._name_or_path): model_class.register_for_auto_class(cls.__name__) else: cls.register(config.__class__, model_class, exist_ok=True) _ = kwargs.pop("code_revision", None) return model_class._from_config(config, **kwargs) elif type(config) in cls._model_mapping.keys(): model_class = _get_model_class(config, cls._model_mapping) return model_class._from_config(config, **kwargs) raise ValueError( f"Unrecognized configuration class {config.__class__} for this kind of AutoModel: {cls.__name__}.\n" f"Model type should be one of {', '.join(c.__name__ for c in cls._model_mapping.keys())}."
Data Collator
Data Collator
์ผ๋ จ์ sample list๋ฅผ "single training mini-batch"์ Tensorํํ๋ก ๋ฌถ์ด์ค.
Default Data Collator์ด๋ ์๋์ฒ๋ผ train_dataset์ด data_collator๋ฅผ ์ด์ฉํด mini-batch๋ก ๋ฌถ์ฌ ๋ชจ๋ธ๋ก ๋ค์ด๊ฐ ํ์ตํ๋๋ฐ ๋์์ด ๋๋ค.
trainer = Trainer( model=model, train_dataset=train_dataset, eval_dataset=eval_dataset, data_collator=data_collator,โ
batch["input_ids"] , batch["labels"] ?
๋ค๋ง, ์์ ๋ฌ๋ฆฌ ๋๋ถ๋ถ์ Data Collatorํจ์๋ฅผ ๋ณด๋ฉด ์๋์ ๊ฐ์ ์ฝ๋์ ํํ๋ฅผ ๋ ๋๋ฐ, ์ฌ๊ธฐ์ input_ids์ label์ด๋ผ๋ ์กฐ๊ธ ์์ํ ๋จ์ด๊ฐ ์๋ค:
class MyDataCollator: def __init__(self, processor): self.processor = processor def __call__(self, examples): texts = [] images = [] for example in examples: image, question, answer = example messages = [{"role": "user", "content": question}, {"role": "assistant", "content": answer}] # <-- ์ฌ๊ธฐ๊น์ง ์ ๋ค์ด๊ฐ๋๊ฒ ํ์ธ์๋ฃ. text = self.processor.tokenizer.apply_chat_template(messages, add_generation_prompt=False) texts.append(text) images.append(image) batch = self.processor(text=text, images=image, return_tensors="pt", padding=True) labels = batch["input_ids"].clone() if self.processor.tokenizer.pad_token_id is not None: labels[labels == self.processor.tokenizer.pad_token_id] = -100 batch["labels"] = labels return batch data_collator = MyDataCollator(processor)โ
๊ณผ์ฐ batch["input_ids"]์ batch["labels"]๊ฐ ๋ญ๊น?
์ ์ ํ๋ data_collator๋ ์๋์ ๊ฐ์ ํ์์ ๋ ๋๋ฐ, ์ฌ๊ธฐ์๋ ๋ณด๋ฉด inputs์ labels๊ฐ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋ชจ๋ ๋ชจ๋ธ์ ๋ค๋ฅด์ง๋ง, ๋ค๋ฅธ๋ชจ๋ธ๊ณผ ์ ์ฌํ์ ์ ๊ณต์ ํ๋ค
= ๋๋ถ๋ถ์ ๋ชจ๋ธ์ ๋์ผํ ์ ๋ ฅ์ ์ฌ์ฉํ๋ค!
โInput IDs
Input ID๋ ๋ชจ๋ธ์ ์ ๋ ฅ์ผ๋ก ์ ๋ฌ๋๋ "์ ์ผํ ํ์ ๋งค๊ฐ๋ณ์"์ธ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
Input ID๋ token_index๋ก, ์ฌ์ฉํ sequence(๋ฌธ์ฅ)๋ฅผ ๊ตฌ์ฑํ๋ token์ ์ซ์ํํ์ด๋ค.
๊ฐ tokenizer๋ ๋ค๋ฅด๊ฒ ์๋ํ์ง๋ง "๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ์ ๋์ผ"ํ๋ค.
ex)from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained("bert-base-cased") sequence = "A Titan RTX has 24GB of VRAM"
tokenizer๋ sequence(๋ฌธ์ฅ)๋ฅผ tokenizer vocab์ ์๋ Token์ผ๋ก ๋ถํ ํ๋ค:tokenized_sequence = tokenizer.tokenize(sequence)
token์ word๋ subword ๋์ค ํ๋์ด๋ค:print(tokenized_sequence) # ์ถ๋ ฅ: ['A', 'Titan', 'R', '##T', '##X', 'has', '24', '##GB', 'of', 'V', '##RA', '##M'] # ์๋ฅผ ๋ค์ด, "VRAM"์ ๋ชจ๋ธ ์ดํ์ ์์ด์ "V", "RA" ๋ฐ "M"์ผ๋ก ๋ถํ ๋จ. # ์ด๋ฌํ ํ ํฐ์ด ๋ณ๋์ ๋จ์ด๊ฐ ์๋๋ผ ๋์ผํ ๋จ์ด์ ์ผ๋ถ์์ ๋ํ๋ด๊ธฐ ์ํด์๋? # --> "RA"์ "M" ์์ ์ด์คํด์(##) ์ ๋์ฌ๊ฐ ์ถ๊ฐ๋ฉ inputs = tokenizer(sequence)
์ด๋ฅผ ํตํด token์ ๋ชจ๋ธ์ด ์ดํด๊ฐ๋ฅํ ID๋ก ๋ณํ๋ ์ ์๋ค.
์ด๋, ๋ชจ๋ธ๋ด๋ถ์์ ์๋ํ๊ธฐ ์ํด์๋ input_ids๋ฅผ key๋ก, ID๊ฐ์ value๋ก ํ๋ "๋์ ๋๋ฆฌ"ํํ๋ก ๋ฐํํด์ผํ๋ค:encoded_sequence = inputs["input_ids"] print(encoded_sequence) # ์ถ๋ ฅ: [101, 138, 18696, 155, 1942, 3190, 1144, 1572, 13745, 1104, 159, 9664, 2107, 102]
๋ํ, ๋ชจ๋ธ์ ๋ฐ๋ผ์ ์๋์ผ๋ก "special token"์ ์ถ๊ฐํ๋๋ฐ,
์ฌ๊ธฐ์๋ ๋ชจ๋ธ์ด ๊ฐ๋ ์ฌ์ฉํ๋ "special IDs"๊ฐ ์ถ๊ฐ๋๋ค.decoded_sequence = tokenizer.decode(encoded_sequence) print(decoded_sequence) # ์ถ๋ ฅ: [CLS] A Titan RTX has 24GB of VRAM [SEP]
โAttention Mask
Attention Mask๋ Sequence๋ฅผ batch๋ก ๋ฌถ์ ๋ ์ฌ์ฉํ๋ Optionalํ ์ธ์๋ก
"๋ชจ๋ธ์ด ์ด๋ค token์ ์ฃผ๋ชฉํ๊ณ ํ์ง ๋ง์์ผ ํ๋์ง"๋ฅผ ๋ํ๋ธ๋ค.
ex)
์๋ฅผ ๋ณด๋ฉด, encoding๋ ๊ธธ์ด๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ "๋์ผํ Tensor๋ก ๋ฌถ์ ์๊ฐ ์๋ค."from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained("bert-base-cased") sequence_a = "This is a short sequence." sequence_b = "This is a rather long sequence. It is at least longer than the sequence A." encoded_sequence_a = tokenizer(sequence_a)["input_ids"] encoded_sequence_b = tokenizer(sequence_b)["input_ids"] len(encoded_sequence_a), len(encoded_sequence_b) # ์ถ๋ ฅ: (8, 19)
--> padding์ด๋ truncation์ด ํ์ํจ.
attention_mask๋ tokenizer๊ฐ ๋ฐํํ๋ dictionary์ "attention_mask" key์ ์กด์ฌํ๋ค.padded_sequences = tokenizer([sequence_a, sequence_b], padding=True) padded_sequences["input_ids"] # ์ถ๋ ฅ: [[101, 1188, 1110, 170, 1603, 4954, 119, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [101, 1188, 1110, 170, 1897, 1263, 4954, 119, 1135, 1110, 1120, 1655, 2039, 1190, 1103, 4954, 138, 119, 102]] padded_sequences["attention_mask"] # ์ถ๋ ฅ: [[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
โToken Types IDs
์ด๋ค ๋ชจ๋ธ์ ๋ชฉ์ ์ classification์ด๋ QA์ด๋ค.
์ด๋ฐ ๋ชจ๋ธ์ 2๊ฐ์ "๋ค๋ฅธ ๋ชฉ์ ์ ๋จ์ผ input_ids"ํญ๋ชฉ์ผ๋ก ๊ฒฐํฉํด์ผํ๋ค.
= [CLS], [SEP] ๋ฑ์ ํน์ํ ํฐ์ ์ด์ฉํด ์ํ๋จ.
ex)
์์ ์์ ์์ tokenizer๋ฅผ ์ด์ฉํด 2๊ฐ์ sequence๊ฐ 2๊ฐ์ ์ธ์๋ก ์ ๋ฌ๋์ด ์๋์ผ๋ก ์์๊ฐ์ ๋ฌธ์ฅ์ ์์ฑํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.# [CLS] SEQUENCE_A [SEP] SEQUENCE_B [SEP] from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained("bert-base-cased") sequence_a = "HuggingFace is based in NYC" sequence_b = "Where is HuggingFace based?" encoded_dict = tokenizer(sequence_a, sequence_b) decoded = tokenizer.decode(encoded_dict["input_ids"]) print(decoded) # ์ถ๋ ฅ: [CLS] HuggingFace is based in NYC [SEP] Where is HuggingFace based? [SEP]
์ด๋ seq์ดํ์ ๋์ค๋ seq์ ์์์์น๋ฅผ ์๊ธฐ์๋ ์ข๋ค.
๋ค๋ง, ๋ค๋ฅธ ๋ชจ๋ธ์ token_types_ids๋ ์ฌ์ฉํ๋ฉฐ, token_type_ids๋ก ์ด MASK๋ฅผ ๋ฐํํ๋ค.
encoded_dict['token_type_ids'] # ์ถ๋ ฅ: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]
์ง๋ฌธ์ ์ฌ์ฉ๋๋ context๋ ๋ชจ๋ 0์ผ๋ก,
์ง๋ฌธ์ ํด๋น๋๋ sequence๋ ๋ชจ๋ 1๋ก ์ค์ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
โPosition IDs
RNN: ๊ฐ ํ ํฐ์ ์์น๊ฐ ๋ด์ฅ.
Transformer: ๊ฐ ํ ํฐ์ ์์น๋ฅผ ์ธ์ โ
∴ position_ids๋ ๋ชจ๋ธ์ด ๊ฐ ํ ํฐ์ ์์น๋ฅผ list์์ ์๋ณํ๋ ๋ฐ ์ฌ์ฉ๋๋ optional ๋งค๊ฐ๋ณ์.๋ชจ๋ธ์ position_ids๊ฐ ์ ๋ฌ๋์ง ์์ผ๋ฉด, ID๋ ์๋์ผ๋ก Absolute positional embeddings์ผ๋ก ์์ฑ:
Absolute positional embeddings์ [0, config.max_position_embeddings - 1] ๋ฒ์์์ ์ ํ.
์ผ๋ถ ๋ชจ๋ธ์ sinusoidal position embeddings์ด๋ relative position embeddings๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ ํ์ positional embedding์ ์ฌ์ฉ.
โLabels
Labels๋ ๋ชจ๋ธ์ด ์์ฒด์ ์ผ๋ก ์์ค์ ๊ณ์ฐํ๋๋ก ์ ๋ฌ๋ ์ ์๋ Optional์ธ์์ด๋ค.
์ฆ, Labels๋ ๋ชจ๋ธ์ ์์ ์์ธก๊ฐ์ด์ด์ผ ํ๋ค: ํ์ค ์์ค์ ์ฌ์ฉํ์ฌ ์์ธก๊ฐ๊ณผ ์์๊ฐ(๋ ์ด๋ธ) ๊ฐ์ ์์ค์ ๊ณ์ฐ.
์ด๋, Labels๋ Model Head์ ๋ฐ๋ผ ๋ค๋ฅด๋ค:
- AutoModelForSequenceClassification: ๋ชจ๋ธ์ (batch_size)์ฐจ์ํ ์๋ฅผ ๊ธฐ๋ํ๋ฉฐ, batch์ ๊ฐ ๊ฐ์ ์ ์ฒด ์ํ์ค์ ์์ label์ ํด๋น.
- AutoModelForTokenClassification: ๋ชจ๋ธ์ (batch_size, seq_length)์ฐจ์ํ ์๋ฅผ ๊ธฐ๋ํ๋ฉฐ, ๊ฐ ๊ฐ์ ๊ฐ๋ณ ํ ํฐ์ ์์ label์ ํด๋น
- AutoModelForMaskedLM: ๋ชจ๋ธ์ (batch_size, seq_length)์ฐจ์ํ ์๋ฅผ ๊ธฐ๋ํ๋ฉฐ, ๊ฐ ๊ฐ์ ๊ฐ๋ณ ํ ํฐ์ ์์ ๋ ์ด๋ธ์ ํด๋น: label์ ๋ง์คํน๋ token_ids์ด๋ฉฐ, ๋๋จธ์ง๋ ๋ฌด์ํ ๊ฐ(๋ณดํต -100).
- AutoModelForConditionalGeneration: ๋ชจ๋ธ์ (batch_size, tgt_seq_length)์ฐจ์ํ ์๋ฅผ ๊ธฐ๋ํ๋ฉฐ, ๊ฐ ๊ฐ์ ๊ฐ ์ ๋ ฅ ์ํ์ค์ ์ฐ๊ด๋ ๋ชฉํ ์ํ์ค๋ฅผ ๋ํ๋ ๋๋ค. ํ๋ จ ์ค์๋ BART์ T5๊ฐ ์ ์ ํ ๋์ฝ๋ ์ ๋ ฅ ID์ ๋์ฝ๋ ์ดํ ์ ๋ง์คํฌ๋ฅผ ๋ด๋ถ์ ์ผ๋ก ๋ง๋ค๊ธฐ์ ๋ณดํต ์ ๊ณตํ ํ์X. ์ด๋ Encoder-Decoder ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ธ์๋ ์ ์ฉ๋์ง ์์. ๊ฐ ๋ชจ๋ธ์ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ฌ ๊ฐ ํน์ ๋ชจ๋ธ์ ๋ ์ด๋ธ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ํ์ธํ์ธ์.
๊ธฐ๋ณธ ๋ชจ๋ธ(BertModel ๋ฑ)์ Labels๋ฅผ ๋ฐ์๋ค์ด์ง ๋ชปํ๋๋ฐ, ์ด๋ฌํ ๋ชจ๋ธ์ ๊ธฐ๋ณธ ํธ๋์คํฌ๋จธ ๋ชจ๋ธ๋ก์ ๋จ์ํ ํน์ง๋ค๋ง ์ถ๋ ฅํ๋ค.
โ Decoder input IDs
์ด ์ ๋ ฅ์ ์ธ์ฝ๋-๋์ฝ๋ ๋ชจ๋ธ์ ํนํ๋์ด ์์ผ๋ฉฐ, ๋์ฝ๋์ ์ ๋ ฅ๋ ์ ๋ ฅ ID๋ฅผ ํฌํจํฉ๋๋ค.
์ด๋ฌํ ์ ๋ ฅ์ ๋ฒ์ญ ๋๋ ์์ฝ๊ณผ ๊ฐ์ ์ํ์ค-ํฌ-์ํ์ค ์์ ์ ์ฌ์ฉ๋๋ฉฐ, ๋ณดํต ๊ฐ ๋ชจ๋ธ์ ํน์ ํ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.๋๋ถ๋ถ์ ์ธ์ฝ๋-๋์ฝ๋ ๋ชจ๋ธ(BART, T5)์ ๋ ์ด๋ธ์์ ๋์ฝ๋ ์ ๋ ฅ ID๋ฅผ ์์ฒด์ ์ผ๋ก ์์ฑํฉ๋๋ค.
์ด๋ฌํ ๋ชจ๋ธ์์๋ ๋ ์ด๋ธ์ ์ ๋ฌํ๋ ๊ฒ์ด ํ๋ จ์ ์ฒ๋ฆฌํ๋ ์ ํธ ๋ฐฉ๋ฒ์ ๋๋ค.
์ํ์ค-ํฌ-์ํ์ค ํ๋ จ์ ์ํ ์ด๋ฌํ ์ ๋ ฅ ID๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ํ์ธํ๋ ค๋ฉด ๊ฐ ๋ชจ๋ธ์ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
โFeed Forward Chunking
ํธ๋์คํฌ๋จธ์ ๊ฐ ์์ฐจ ์ดํ ์ ๋ธ๋ก์์ ์ ํ ์ดํ ์ ๋ ์ด์ด๋ ๋ณดํต 2๊ฐ์ ํผ๋ ํฌ์๋ ๋ ์ด์ด ๋ค์์ ์์นํฉ๋๋ค.
ํผ๋ ํฌ์๋ ๋ ์ด์ด์ ์ค๊ฐ ์๋ฒ ๋ฉ ํฌ๊ธฐ๋ ์ข ์ข ๋ชจ๋ธ์ ์จ๊ฒจ์ง ํฌ๊ธฐ๋ณด๋ค ํฝ๋๋ค(์: bert-base-uncased).ํฌ๊ธฐ [batch_size, sequence_length]์ ์ ๋ ฅ์ ๋ํด ์ค๊ฐ ํผ๋ ํฌ์๋ ์๋ฒ ๋ฉ์ ์ ์ฅํ๋ ๋ฐ ํ์ํ ๋ฉ๋ชจ๋ฆฌ [batch_size, sequence_length, config.intermediate_size]๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํฐ ๋ถ๋ถ์ ์ฐจ์งํ ์ ์์ต๋๋ค.
Reformer: The Efficient Transformer์ ์ ์๋ค์ ๊ณ์ฐ์ด sequence_length ์ฐจ์๊ณผ ๋ ๋ฆฝ์ ์ด๋ฏ๋ก ๋ ํผ๋ ํฌ์๋ ๋ ์ด์ด์ ์ถ๋ ฅ ์๋ฒ ๋ฉ [batch_size, config.hidden_size]_0, ..., [batch_size, config.hidden_size]_n์ ๊ฐ๋ณ์ ์ผ๋ก ๊ณ์ฐํ๊ณ n = sequence_length์ ํจ๊ป [batch_size, sequence_length, config.hidden_size]๋ก ๊ฒฐํฉํ๋ ๊ฒ์ด ์ํ์ ์ผ๋ก ๋์ผํ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๋ ๋์ ๊ณ์ฐ ์๊ฐ์ ์ฆ๊ฐ์ํค๋ ๊ฑฐ๋๋ฅผ ํ์ง๋ง, ์ํ์ ์ผ๋ก ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.apply_chunking_to_forward() ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ธ์ ๊ฒฝ์ฐ, chunk_size๋ ๋ณ๋ ฌ๋ก ๊ณ์ฐ๋๋ ์ถ๋ ฅ ์๋ฒ ๋ฉ์ ์๋ฅผ ์ ์ํ๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ์ ์๊ฐ ๋ณต์ก์ฑ ๊ฐ์ ๊ฑฐ๋๋ฅผ ์ ์ํฉ๋๋ค. chunk_size๊ฐ 0์ผ๋ก ์ค์ ๋๋ฉด ํผ๋ ํฌ์๋ ์ฒญํน์ ์ํ๋์ง ์์ต๋๋ค.
Optimization
AdamW
ํํ๋ค ์๋ฌป๋ฐ Adam๋ง ์ฌ์ฉํด๋ผ! ๋ผ๋ ๊ฒฉ์ธ์ด ์์์ ๋๋ก ๋ง๋ฅ optimizer๊ฐ์ง๋ง,
CV์ผ๋ถ Task์์๋ SGD๊ฐ ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ด๋ ๊ฒฝ์ฐ๊ฐ ์๋นํ ์กด์ฌํ๋ค.
AdamW๋ ผ๋ฌธ์์๋ L2 Regularization๊ณผ Weight Decay๊ด์ ์์ SGD์ ๋นํด Adam์ด ์ผ๋ฐํ ๋ฅ๋ ฅ์ด ๋จ์ด์ง๋ ์ด์ ๋ฅผ ์ค๋ช ํ๋ค.
L2 Regularization: weight๊ฐ ๋น์ ์์ ์ผ๋ก ์ปค์ง์ ๋ฐฉ์ง. (weight๊ฐ์ด ์ปค์ง๋ฉด ์์คํจ์๋ ์ปค์ง๊ฒ ๋จ.)
= weight๊ฐ ๋๋ฌด ์ปค์ง์ง ์๋ ์ ์์ ๊ธฐ์กด ์์คํจ์๋ฅผ ์ต์๋ก ๋ง๋ค์ด์ฃผ๋ weight๋ฅผ ๋ชจ๋ธ์ด ํ์ต.
weight decay: weight update ์, ์ด์ weightํฌ๊ธฐ๋ฅผ ์ผ์ ๋น์จ ๊ฐ์์์ผ overfitting๋ฐฉ์ง.
SGD: L2 = weight_decay
Adam: L2 ≠ weight_decay (adaptive learning rate๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ SGD์๋ ๋ค๋ฅธ weight update์์ ์ฌ์ฉํจ.)
∴ ์ฆ, L2 Regularization์ด ํฌํจ๋ ์์คํจ์๋ก Adam์ต์ ํ ์, ์ผ๋ฐํ ํจ๊ณผ๋ฅผ ๋ ๋ณด๊ฒ ๋๋ค. (decay rate๊ฐ ๋ ์์์ง๊ฒ๋จ.)
์ ์๋ L2 regularzation์ ์ํ weight decay ํจ๊ณผ ๋ฟ๋ง ์๋๋ผ weight ์ ๋ฐ์ดํธ ์์ ์ง์ ์ ์ผ๋ก weight decay ํ ์ ์ถ๊ฐํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. L2 regularization๊ณผ ๋ถ๋ฆฌ๋ weight decay๋ผ๊ณ ํ์ฌ decoupled weight decay๋ผ๊ณ ๋งํ๋ ๊ฒ์ด๋ค.
SGDW์ AdamW์ ์๊ณ ๋ฆฌ์ฆ:
์ง๊ธ๊น์ง ์ค๋ช ํ์ง ์์๋ ๐๊ฐ ์๋๋ฐ, ์ด๋ ๋งค weight ์ ๋ฐ์ดํธ๋ง๋ค learning rate๋ฅผ ์ผ์ ๋น์จ ๊ฐ์์์ผ์ฃผ๋ learning rate schedule ์์๋ฅผ ์๋ฏธํ๋ค.
์ด๋ก์์ผ๋ก ํ์๋ ๋ถ๋ถ์ด ์๋ค๋ฉด L2 regularization์ ํฌํจํ ์์คํจ์์ SGD์ Adam์ ์ ์ฉํ ๊ฒ๊ณผ ๋๊ฐ๋ค.
ํ์ง๋ง ์ด๋ก์ ๋ถ๋ถ์ ์ง์ ์ ์ผ๋ก weight ์ ๋ฐ์ดํธ ์์ ์ถ๊ฐ์์ผ weight decay ํจ๊ณผ๋ฅผ ๋ณผ ์ ์๊ฒ ๋ง๋ค์๋ค.
optimizer = AdamW(model.parameters(),lr=1e-3, eps=(1e-30, 1e-3),weight_decay=0.0,)
cf) model.parameters()๋ weight์ bias๋ฅผ ๋๋ ค์ค.
์ด์ github ์ฝ๋๋ฅผ ํตํด ์์ ์์์ ๋ํด ์ดํด๋ณด๋๋ก ํ์:
cf) optimizer์ state_dict()์ ํํ๋ ์๋์ ๊ฐ๋ค:class AdamW(Optimizer): """ Implements Adam algorithm with weight decay fix as introduced in [Decoupled Weight Decay Regularization](https://arxiv.org/abs/1711.05101). Parameters: params (`Iterable[nn.parameter.Parameter]`): Iterable of parameters to optimize or dictionaries defining parameter groups. lr (`float`, *optional*, defaults to 0.001): The learning rate to use. betas (`Tuple[float,float]`, *optional*, defaults to `(0.9, 0.999)`): Adam's betas parameters (b1, b2). eps (`float`, *optional*, defaults to 1e-06): Adam's epsilon for numerical stability. weight_decay (`float`, *optional*, defaults to 0.0): Decoupled weight decay to apply. correct_bias (`bool`, *optional*, defaults to `True`): Whether or not to correct bias in Adam (for instance, in Bert TF repository they use `False`). no_deprecation_warning (`bool`, *optional*, defaults to `False`): A flag used to disable the deprecation warning (set to `True` to disable the warning). """ def __init__( self, params: Iterable[nn.parameter.Parameter], lr: float = 1e-3, betas: Tuple[float, float] = (0.9, 0.999), eps: float = 1e-6, weight_decay: float = 0.0, correct_bias: bool = True, no_deprecation_warning: bool = False, ): if not no_deprecation_warning: warnings.warn( "This implementation of AdamW is deprecated and will be removed in a future version. Use the PyTorch" " implementation torch.optim.AdamW instead, or set `no_deprecation_warning=True` to disable this" " warning", FutureWarning, ) require_version("torch>=1.5.0") # add_ with alpha if lr < 0.0: raise ValueError(f"Invalid learning rate: {lr} - should be >= 0.0") if not 0.0 <= betas[0] < 1.0: raise ValueError(f"Invalid beta parameter: {betas[0]} - should be in [0.0, 1.0)") if not 0.0 <= betas[1] < 1.0: raise ValueError(f"Invalid beta parameter: {betas[1]} - should be in [0.0, 1.0)") if not 0.0 <= eps: raise ValueError(f"Invalid epsilon value: {eps} - should be >= 0.0") defaults = {"lr": lr, "betas": betas, "eps": eps, "weight_decay": weight_decay, "correct_bias": correct_bias} super().__init__(params, defaults) @torch.no_grad() def step(self, closure: Callable = None): """ Performs a single optimization step. Arguments: closure (`Callable`, *optional*): A closure that reevaluates the model and returns the loss. """ loss = None if closure is not None: loss = closure() for group in self.param_groups: for p in group["params"]: if p.grad is None: continue grad = p.grad if grad.is_sparse: raise RuntimeError("Adam does not support sparse gradients, please consider SparseAdam instead") state = self.state[p] # State initialization if len(state) == 0: state["step"] = 0 # Exponential moving average of gradient values state["exp_avg"] = torch.zeros_like(p) # Exponential moving average of squared gradient values state["exp_avg_sq"] = torch.zeros_like(p) exp_avg, exp_avg_sq = state["exp_avg"], state["exp_avg_sq"] beta1, beta2 = group["betas"] state["step"] += 1 # Decay the first and second moment running average coefficient # In-place operations to update the averages at the same time exp_avg.mul_(beta1).add_(grad, alpha=(1.0 - beta1)) exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1.0 - beta2) denom = exp_avg_sq.sqrt().add_(group["eps"]) step_size = group["lr"] if group["correct_bias"]: # No bias correction for Bert bias_correction1 = 1.0 - beta1 ** state["step"] bias_correction2 = 1.0 - beta2 ** state["step"] step_size = step_size * math.sqrt(bias_correction2) / bias_correction1 p.addcdiv_(exp_avg, denom, value=-step_size) # Just adding the square of the weights to the loss function is *not* # the correct way of using L2 regularization/weight decay with Adam, # since that will interact with the m and v parameters in strange ways. # # Instead we want to decay the weights in a manner that doesn't interact # with the m/v parameters. This is equivalent to adding the square # of the weights to the loss with plain (non-momentum) SGD. # Add weight decay at the end (fixed version) if group["weight_decay"] > 0.0: p.add_(p, alpha=(-group["lr"] * group["weight_decay"])) return loss
์ด๋ฅผ ํตํด ์ดํด๋ณด๋ฉด, Optimizer๋ผ๋ ํด๋์ค๋ก๋ถํฐ AdamW๋ ์์์ ๋ฐ์ ์ดํ,{ 'state': { 0: {'momentum_buffer': tensor(...), ...}, 1: {'momentum_buffer': tensor(...), ...}, 2: {'momentum_buffer': tensor(...), ...}, 3: {'momentum_buffer': tensor(...), ...} }, 'param_groups': [ { 'lr': 0.01, 'weight_decay': 0, ... 'params': [0] }, { 'lr': 0.001, 'weight_decay': 0.5, ... 'params': [1, 2, 3] } ] }
์์ state_dictํํ๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ, if len(state) == 0์ด๋ผ๋ ๋ป์ state๊ฐ ์์์ ํ๋๋ ํ์ง ์์์์ ์๋ฏธํ๋ค.
exp_avg๋ m์, exp_avg_sq๋ vt๋ฅผ ์๋ฏธํ๋ฉฐ p.addcdiv_์ if group["weight_decay"]์ชฝ์์ ์ต์ข parameter์ ๋ํ update๊ฐ ๋จ์ ํ์ธํ ์ ์๋ค.
LR-Schedules &. Learning rate Annealing
LR Schedule: ๋ฏธ๋ฆฌ ์ ํด์ง ์ค์ผ์ค๋๋ก lr์ ๋ฐ๊ฟ๊ฐ๋ฉฐ ์ฌ์ฉ.
ํ๋ จ ๋์ค learning rate๋ฅผ ์ฆ๊ฐ์์ผ์ฃผ๋๊ฒ ์ฐจ์ด์ !
warmup restart๋ก ๊ทธ๋ฆผ์ฒ๋ผ local minimum์์ ๋น ์ ธ๋์ฌ ๊ธฐํ๋ฅผ ์ ๊ณตํ๋ค.
LR Annealing: lr schedule๊ณผ ํผ์ฉ๋์ด ์ฌ์ฉ๋๋ iteration์ ๋ฐ๋ผ monotonicํ๊ฒ ๊ฐ์ํ๋๊ฒ์ ์๋ฏธ.
์ง๊ด์ ์ผ๋ก๋ ์ฒ์์๋ ๋์ learning rate๋ก ์ข์ ์๋ ด ์ง์ ์ ๋นก์ธ๊ฒ ์ฐพ๊ณ ,
๋ง์ง๋ง์๋ ๋ฎ์ learning rate๋ก ์๋ ด ์ง์ ์ ์ ๋ฐํ๊ฒ ์์ฐฉํ ์ ์๊ฒ ๋ง๋ค์ด์ฃผ๋ ์ญํ ์ ํ๋ค.
Model Outputs
ModelOutput
๋ชจ๋ ๋ชจ๋ธ์ ModelOutput์ subclass์ instance์ถ๋ ฅ์ ๊ฐ๋๋ค.
outputs๊ฐ์ฒด๋ ํํ loss์ logits๋ฅผ ๊ฐ๊ธฐ์ (outputs.loss, outputs.logits) ํํ์ ๋ฐํํ๋ค.from transformers import BertTokenizer, BertForSequenceClassification import torch tokenizer = BertTokenizer.from_pretrained("google-bert/bert-base-uncased") model = BertForSequenceClassification.from_pretrained("google-bert/bert-base-uncased") inputs = tokenizer("Hello, my dog is cute", return_tensors="pt") labels = torch.tensor([1]).unsqueeze(0) # ๋ฐฐ์น ํฌ๊ธฐ 1 outputs = model(**inputs, labels=labels) # SequenceClassifierOutput(loss=tensor(0.4267, grad_fn=<NllLossBackward0>), # logits=tensor([[-0.0658, 0.5650]], grad_fn=<AddmmBackward0>), # hidden_states=None, attentions=None)
Cf)
CuasalLM์ ๊ฒฝ์ฐ:
loss: Language modeling loss (for next-token prediction).
logits: Prediction scores of the LM_Head (scores for each vocabulary token before SoftMax)
= raw prediction values and are not bounded to a specific range
transformers output word๋ฅผ ์ํด์ : project linearly->apply softmax ๋จ๊ณ๋ฅผ ๊ฑฐ์นจ.
์ด๋, LM_Head๋ pre-training์ด ์๋, Fine-Tuning์์ ์ฌ์ฉ๋จ.
LM_Head๋, ๋ชจ๋ธ์ ์ถ๋ ฅ hidden_state๋ฅผ ๋ฐ์ prediction์ ์ํํ๋ ๊ฒ์ ์๋ฏธ.
ex) BERT
from transformers import BertModel, BertTokenizer, BertForMaskedLM import torch tokenizer = BertTokenizer.from_pretrained("bert-base-uncased") model = BertForMaskedLM.from_pretrained("bert-base-uncased") inputs = tokenizer("The capital of France is [MASK].", return_tensors="pt") outputs = model(**inputs) logits = outputs.logits print(f'logits: {logits}') # `torch.FloatTensor` of shape `(batch_size, sequence_length, vocab_size) # [MASK] ํ ํฐ์ ๋ํ ์์ธก ๊ฒฐ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค. masked_index = (inputs.input_ids == tokenizer.mask_token_id).nonzero(as_tuple=True)[1] print(f'masked_index: {masked_index}') # `torch.LongTensor` of shape `(1,) MASK_token = logits[0, masked_index] # batch์ ์ฒซ๋ฌธ์ฅ์์ MASK token์ ๊ฐ์ ธ์ด. print(f'MASK_Token: {MASK_token}') predicted_token_id = MASK_token.argmax(axis=-1) # ์ฃผ์ด์ง ์ฐจ์์์ ๊ฐ์ฅ ํฐ ๊ฐ์ index๋ฅผ ๋ฐํ. = ๋ชจ๋ธ์ด ํด๋น์์น์์ ์์ธกํ ๋จ์ด์ token_id print(f'predicted_token_id: {predicted_token_id}') predicted_token = tokenizer.decode(predicted_token_id) print(predicted_token) # paris ์ถ๋ ฅ # logits: tensor([[[ -6.4346, -6.4063, -6.4097, ..., -5.7691, -5.6326, -3.7883], # [-14.0119, -14.7240, -14.2120, ..., -11.6976, -10.7304, -12.7618], # [ -9.6561, -10.3125, -9.7459, ..., -8.7782, -6.6036, -12.6596], # ..., # [ -3.7861, -3.8572, -3.5644, ..., -2.5593, -3.1093, -4.3820], # [-11.6598, -11.4274, -11.9267, ..., -9.8772, -10.2103, -4.7594], # [-11.7267, -11.7509, -11.8040, ..., -10.5943, -10.9407, -7.5151]]], # grad_fn=<ViewBackward0>) # masked_index: tensor([6]) # MASK_Token: tensor([[-3.7861, -3.8572, -3.5644, ..., -2.5593, -3.1093, -4.3820]], # grad_fn=<IndexBackward0>) # predicted_token_id: tensor([3000]) # paris
cf) ์ฐธ๊ณ ๋ก argmax๊ฐ ๋ฐํํ index๋ vocabulary์ Index์์ ์๋๋ฅผ ํตํด ํ์ธํ ์ ์๋ค.for word, idx in list(vocab.items())[:5]: # ์ดํ์ ์ฒ์ 10๊ฐ ํญ๋ชฉ ์ถ๋ ฅ print(f"{word}: {idx}") for word, idx in list(vocab.items())[2990:3010]: # ์ดํ์ ์ฒ์ 10๊ฐ ํญ๋ชฉ ์ถ๋ ฅ print(f"{word}: {idx}") # [PAD]: 0 # [unused0]: 1 # [unused1]: 2 # [unused2]: 3 # [unused3]: 4 # jack: 2990 # fall: 2991 # raised: 2992 # itself: 2993 # stay: 2994 # true: 2995 # studio: 2996 # 1988: 2997 # sports: 2998 # replaced: 2999 # paris: 3000 # systems: 3001 # saint: 3002 # leader: 3003 # theatre: 3004 # whose: 3005 # market: 3006 # capital: 3007 # parents: 3008 # spanish: 3009
Trainer
Trainer
Trainerํด๋์ค๋ ๐ค Transformers ๋ชจ๋ธ์ ์ต์ ํ๋์ด ์๋ค
= ๋ชจ๋ธ์ด ํญ์ tuple(= ์ฒซ์์๋ก loss๋ฐํ) , ModelOutput์ subclass๋ฅผ ๋ฐํํด์ผํจ์ ์๋ฏธ
= labels์ธ์๊ฐ ์ ๊ณต๋๋ฉด Loss๋ฅผ ๊ณ์ฐํ ์ ์์.
Trainer๋ TrainingArguments๋ก ํ์์ธ์๋ฅผ ์ ๋ฌํด์ฃผ๋ฉด, ์ฌ์ฉ์๊ฐ ์ง์ train_loop์์ฑํ ํ์์์ด ํ์ต์ ์์ํ ์ ์๋ค.
๋ํ, TRL ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ SFTTrainer์ ๊ฒฝ์ฐ, ์ด Trainerํด๋์ค๋ฅผ ๊ฐ์ธ๊ณ ์์ผ๋ฉฐ, LoRA, Quantizing๊ณผ DeepSpeed ๋ฑ์ ๊ธฐ๋ฅ์ ํตํด ์ด๋ค ๋ชจ๋ธ ํฌ๊ธฐ์๋ ํจ์จ์ ์ธ ํ์ฅ์ด ๊ฐ๋ฅํ๋ค.
๋จผ์ , ์์์ ์์ ๋ถ์ฐํ๊ฒฝ์ ์ํด์๋ Accelerate๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ผํ๋ค!
pip install accelerate pip install accelerate --upgrade
Basic Usage
"hugใ ใ ในใด
Checkpoints
"hugใ ใ ในใด
Customizing
"hugใ ใ ในใด
Callbacks & Logging
"hugใ ใ ในใด
Accelerate & Trainer
"hugใ ใ ในใด
TrainingArguments
์ฐธ๊ณ )
output_dir (str): ๋ชจ๋ธ ์์ธก๊ณผ ์ฒดํฌํฌ์ธํธ๊ฐ ์์ฑ๋ ์ถ๋ ฅ ๋๋ ํ ๋ฆฌ์ ๋๋ค. eval_strategy (str ๋๋ [~trainer_utils.IntervalStrategy], optional, ๊ธฐ๋ณธ๊ฐ์ "no"): ํ๋ จ ์ค ์ฑํํ ํ๊ฐ ์ ๋ต์ ๋ํ๋ ๋๋ค. ๊ฐ๋ฅํ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: • "no": ํ๋ จ ์ค ํ๊ฐ๋ฅผ ํ์ง ์์ต๋๋ค. • "steps": eval_steps๋ง๋ค ํ๊ฐ๋ฅผ ์ํํ๊ณ ๊ธฐ๋กํฉ๋๋ค. • "epoch": ๊ฐ ์ํฌํฌ๊ฐ ๋๋ ๋๋ง๋ค ํ๊ฐ๋ฅผ ์ํํฉ๋๋ค. per_device_train_batch_size (int, optional, ๊ธฐ๋ณธ๊ฐ์ 8): ํ๋ จ ์ GPU/XPU/TPU/MPS/NPU ์ฝ์ด/CPU๋น ๋ฐฐ์น ํฌ๊ธฐ์ ๋๋ค. per_device_eval_batch_size (int, optional, ๊ธฐ๋ณธ๊ฐ์ 8): ํ๊ฐ ์ GPU/XPU/TPU/MPS/NPU ์ฝ์ด/CPU๋น ๋ฐฐ์น ํฌ๊ธฐ์ ๋๋ค. gradient_accumulation_steps (int, optional, ๊ธฐ๋ณธ๊ฐ์ 1): ์ญ์ ํ/์ ๋ฐ์ดํธ๋ฅผ ์ํํ๊ธฐ ์ ์ ๊ทธ๋๋์ธํธ๋ฅผ ๋์ ํ ์ ๋ฐ์ดํธ ๋จ๊ณ ์์ ๋๋ค. eval_accumulation_steps (int, optional): ๊ฒฐ๊ณผ๋ฅผ CPU๋ก ์ด๋์ํค๊ธฐ ์ ์ ์ถ๋ ฅ ํ ์๋ฅผ ๋์ ํ ์์ธก ๋จ๊ณ ์์ ๋๋ค. ์ค์ ํ์ง ์์ผ๋ฉด ์ ์ฒด ์์ธก์ด GPU/NPU/TPU์์ ๋์ ๋ ํ CPU๋ก ์ด๋๋ฉ๋๋ค(๋ ๋น ๋ฅด์ง๋ง ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค). learning_rate (float, optional, ๊ธฐ๋ณธ๊ฐ์ 5e-5): [AdamW] ์ตํฐ๋ง์ด์ ์ ์ด๊ธฐ ํ์ต๋ฅ ์ ๋๋ค. weight_decay (float, optional, ๊ธฐ๋ณธ๊ฐ์ 0): [AdamW] ์ตํฐ๋ง์ด์ ์์ ๋ชจ๋ ๋ ์ด์ด์(๋ฐ์ด์ด์ค ๋ฐ LayerNorm ๊ฐ์ค์น๋ ์ ์ธ) ์ ์ฉํ ๊ฐ์ค์น ๊ฐ์ ์ ๋๋ค. max_grad_norm (float, optional, ๊ธฐ๋ณธ๊ฐ์ 1.0): ์ต๋ ๊ทธ๋๋์ธํธ ๋ ธ๋ฆ(๊ทธ๋๋์ธํธ ํด๋ฆฌํ์ ์ํ)์ ๋๋ค. num_train_epochs(float, optional, ๊ธฐ๋ณธ๊ฐ์ 3.0): ์ํํ ์ด ํ๋ จ ์ํฌํฌ ์์ ๋๋ค(์ ์๊ฐ ์๋ ๊ฒฝ์ฐ ๋ง์ง๋ง ์ํฌํฌ์ ๋ฐฑ๋ถ์จ์ ์ํํ ํ ํ๋ จ์ ์ค์งํฉ๋๋ค). max_steps (int, optional, ๊ธฐ๋ณธ๊ฐ์ -1): ์์ ์ ์๋ก ์ค์ ๋ ๊ฒฝ์ฐ, ์ํํ ์ด ํ๋ จ ๋จ๊ณ ์์ ๋๋ค. num_train_epochs๋ฅผ ๋ฌด์ํฉ๋๋ค. ์ ํํ ๋ฐ์ดํฐ ์ธํธ์ ๊ฒฝ์ฐ, max_steps์ ๋๋ฌํ ๋๊น์ง ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ฐ๋ณตํฉ๋๋ค. eval_steps (int ๋๋ float, optional): eval_strategy="steps"์ธ ๊ฒฝ์ฐ ๋ ํ๊ฐ ์ฌ์ด์ ์ ๋ฐ์ดํธ ๋จ๊ณ ์์ ๋๋ค. ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ, logging_steps์ ๋์ผํ ๊ฐ์ผ๋ก ๊ธฐ๋ณธ ์ค์ ๋ฉ๋๋ค. ์ ์ ๋๋ [0,1) ๋ฒ์์ ๋ถ๋ ์์์ ์์ฌ์ผ ํฉ๋๋ค. 1๋ณด๋ค ์์ผ๋ฉด ์ ์ฒด ํ๋ จ ๋จ๊ณ์ ๋น์จ๋ก ํด์๋ฉ๋๋ค. lr_scheduler_type (str ๋๋ [SchedulerType], optional, ๊ธฐ๋ณธ๊ฐ์ "linear"): ์ฌ์ฉํ ์ค์ผ์ค๋ฌ ์ ํ์ ๋๋ค. ๋ชจ๋ ๊ฐ๋ฅํ ๊ฐ์ [SchedulerType]์ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์. lr_scheduler_kwargs ('dict', optional, ๊ธฐ๋ณธ๊ฐ์ {}): lr_scheduler์ ๋ํ ์ถ๊ฐ ์ธ์์ ๋๋ค. ๊ฐ ์ค์ผ์ค๋ฌ์ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ฌ ๊ฐ๋ฅํ ๊ฐ์ ํ์ธํ์ธ์. warmup_ratio (float, optional, ๊ธฐ๋ณธ๊ฐ์ 0.0): 0์์ learning_rate๋ก์ ์ ํ ์์ ์ ์ฌ์ฉ๋๋ ์ด ํ๋ จ ๋จ๊ณ์ ๋น์จ์ ๋๋ค. warmup_steps (int, optional, ๊ธฐ๋ณธ๊ฐ์ 0): 0์์ learning_rate๋ก์ ์ ํ ์์ ์ ์ฌ์ฉ๋๋ ๋จ๊ณ ์์ ๋๋ค. warmup_ratio์ ์ํฅ์ ๋ฌด์ํฉ๋๋ค. logging_dir (str, optional): TensorBoard ๋ก๊ทธ ๋๋ ํ ๋ฆฌ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ output_dir/runs/CURRENT_DATETIME_HOSTNAME์ ๋๋ค. logging_strategy (str ๋๋ [~trainer_utils.IntervalStrategy], optional, ๊ธฐ๋ณธ๊ฐ์ "steps"): ํ๋ จ ์ค ์ฑํํ ๋ก๊น ์ ๋ต์ ๋ํ๋ ๋๋ค. ๊ฐ๋ฅํ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: • "no": ํ๋ จ ์ค ๋ก๊น ์ ํ์ง ์์ต๋๋ค. • "epoch": ๊ฐ ์ํฌํฌ๊ฐ ๋๋ ๋๋ง๋ค ๋ก๊น ์ ํฉ๋๋ค. • "steps": logging_steps๋ง๋ค ๋ก๊น ์ ํฉ๋๋ค. logging_first_step (bool, optional, ๊ธฐ๋ณธ๊ฐ์ False): ์ฒซ ๋ฒ์งธ global_step์ ๋ก๊น ํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. logging_steps (int ๋๋ float, optional, ๊ธฐ๋ณธ๊ฐ์ 500): logging_strategy="steps"์ธ ๊ฒฝ์ฐ ๋ ๋ก๊ทธ ์ฌ์ด์ ์ ๋ฐ์ดํธ ๋จ๊ณ ์์ ๋๋ค. ์ ์ ๋๋ [0,1) ๋ฒ์์ ๋ถ๋ ์์์ ์์ฌ์ผ ํฉ๋๋ค. 1๋ณด๋ค ์์ผ๋ฉด ์ ์ฒด ํ๋ จ ๋จ๊ณ์ ๋น์จ๋ก ํด์๋ฉ๋๋ค. run_name (str, optional, ๊ธฐ๋ณธ๊ฐ์ output_dir): ์คํ์ ๋ํ ์ค๋ช ์์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก wandb ๋ฐ mlflow ๋ก๊น ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ output_dir๊ณผ ๋์ผํฉ๋๋ค. save_strategy (str ๋๋ [~trainer_utils.IntervalStrategy], optional, ๊ธฐ๋ณธ๊ฐ์ "steps"): ํ๋ จ ์ค ์ฒดํฌํฌ์ธํธ๋ฅผ ์ ์ฅํ ์ ๋ต์ ๋ํ๋ ๋๋ค. ๊ฐ๋ฅํ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: • "no": ํ๋ จ ์ค ์ ์ฅํ์ง ์์ต๋๋ค. • "epoch": ๊ฐ ์ํฌํฌ๊ฐ ๋๋ ๋๋ง๋ค ์ ์ฅํฉ๋๋ค. • "steps": save_steps๋ง๋ค ์ ์ฅํฉ๋๋ค. "epoch" ๋๋ "steps"๊ฐ ์ ํ๋ ๊ฒฝ์ฐ, ํญ์ ํ๋ จ์ด ๋๋ ๋ ์ ์ฅ์ด ์ํ๋ฉ๋๋ค. save_total_limit (int, optional): ๊ฐ์ด ์ ๋ฌ๋๋ฉด ์ฒดํฌํฌ์ธํธ์ ์ด ์๋ฅผ ์ ํํฉ๋๋ค. output_dir์ ์๋ ์ค๋๋ ์ฒดํฌํฌ์ธํธ๋ฅผ ์ญ์ ํฉ๋๋ค. load_best_model_at_end๊ฐ ํ์ฑํ๋๋ฉด metric_for_best_model์ ๋ฐ๋ผ "์ต๊ณ " ์ฒดํฌํฌ์ธํธ๋ ํญ์ ๊ฐ์ฅ ์ต๊ทผ์ ์ฒดํฌํฌ์ธํธ์ ํจ๊ป ์ ์ง๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, save_total_limit=5 ๋ฐ load_best_model_at_end์ธ ๊ฒฝ์ฐ, ๋ง์ง๋ง ๋ค ๊ฐ์ ์ฒดํฌํฌ์ธํธ๋ ํญ์ ์ต๊ณ ๋ชจ๋ธ๊ณผ ํจ๊ป ์ ์ง๋ฉ๋๋ค. save_total_limit=1 ๋ฐ load_best_model_at_end์ธ ๊ฒฝ์ฐ, ๋ง์ง๋ง ์ฒดํฌํฌ์ธํธ์ ์ต๊ณ ์ฒดํฌํฌ์ธํธ๊ฐ ์๋ก ๋ค๋ฅด๋ฉด ๋ ๊ฐ์ ์ฒดํฌํฌ์ธํธ๊ฐ ์ ์ฅ๋ ์ ์์ต๋๋ค. save_safetensors (bool, optional, ๊ธฐ๋ณธ๊ฐ์ True): state_dict๋ฅผ ์ ์ฅํ๊ณ ๋ก๋ํ ๋ ๊ธฐ๋ณธ torch.load ๋ฐ torch.save ๋์ safetensors๋ฅผ ์ฌ์ฉํฉ๋๋ค. save_on_each_node (bool, optional, ๊ธฐ๋ณธ๊ฐ์ False): ๋ฉํฐ๋ ธ๋ ๋ถ์ฐ ํ๋ จ์ ์ํํ ๋, ๋ชจ๋ธ๊ณผ ์ฒดํฌํฌ์ธํธ๋ฅผ ๊ฐ ๋ ธ๋์ ์ ์ฅํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ์ธ ๋ ธ๋์๋ง ์ ์ฅ๋ฉ๋๋ค. seed (int, optional, ๊ธฐ๋ณธ๊ฐ์ 42): ํ๋ จ ์์ ์ ์ค์ ๋ ๋๋ค ์๋์ ๋๋ค. ์คํ ๊ฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ค๋ฉด ๋ชจ๋ธ์ ๋ฌด์์๋ก ์ด๊ธฐํ๋ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๊ฒฝ์ฐ [~Trainer.model_init] ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ์ธ์คํด์คํํ์ธ์. data_seed (int, optional): ๋ฐ์ดํฐ ์ํ๋ฌ์ ์ฌ์ฉํ ๋๋ค ์๋์ ๋๋ค. ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ์ํ๋ง์ ์ํ Random sampler๋ seed์ ๋์ผํ ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ๊ฐ์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ธ ์๋์๋ ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐ์ดํฐ ์ํ๋ง์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. bf16 (bool, optional, ๊ธฐ๋ณธ๊ฐ์ False): 32๋นํธ ํ๋ จ ๋์ bf16 16๋นํธ(ํผํฉ) ์ ๋ฐ๋ ํ๋ จ์ ์ฌ์ฉํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. Ampere ์ด์ NVIDIA ์ํคํ ์ฒ ๋๋ CPU(์ฌ์ฉ_cpu) ๋๋ Ascend NPU๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด๋ ์คํ์ API์ด๋ฉฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. fp16 (bool, optional, ๊ธฐ๋ณธ๊ฐ์ False): 32๋นํธ ํ๋ จ ๋์ fp16 16๋นํธ(ํผํฉ) ์ ๋ฐ๋ ํ๋ จ์ ์ฌ์ฉํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. half_precision_backend (str, optional, ๊ธฐ๋ณธ๊ฐ์ "auto"): ํผํฉ ์ ๋ฐ๋ ํ๋ จ์ ์ํ ๋ฐฑ์๋์ ๋๋ค. "auto", "apex", "cpu_amp" ์ค ํ๋์ฌ์ผ ํฉ๋๋ค. "auto"๋ ๊ฐ์ง๋ PyTorch ๋ฒ์ ์ ๋ฐ๋ผ CPU/CUDA AMP ๋๋ APEX๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๋ค๋ฅธ ์ ํ์ง๋ ์์ฒญ๋ ๋ฐฑ์๋๋ฅผ ๊ฐ์ ๋ก ์ฌ์ฉํฉ๋๋ค. bf16_full_eval (bool, optional, ๊ธฐ๋ณธ๊ฐ์ False): 32๋นํธ ๋์ ์ ์ฒด bfloat16 ํ๊ฐ๋ฅผ ์ฌ์ฉํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. ์ด๋ ๋ ๋น ๋ฅด๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ์ง๋ง ๋ฉํธ๋ฆญ ๊ฐ์ ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ์ด๋ ์คํ์ API์ด๋ฉฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. fp16_full_eval (bool, optional, ๊ธฐ๋ณธ๊ฐ์ False): 32๋นํธ ๋์ ์ ์ฒด float16 ํ๊ฐ๋ฅผ ์ฌ์ฉํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. ์ด๋ ๋ ๋น ๋ฅด๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ์ง๋ง ๋ฉํธ๋ฆญ ๊ฐ์ ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค. tf32 (bool, optional): Ampere ๋ฐ ์ต์ GPU ์ํคํ ์ฒ์์ ์ฌ์ฉํ TF32 ๋ชจ๋๋ฅผ ํ์ฑํํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ torch.backends.cuda.matmul.allow_tf32์ ๊ธฐ๋ณธ๊ฐ์ ๋ฐ๋ฆ ๋๋ค. ์์ธํ ๋ด์ฉ์ TF32 ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์. ์ด๋ ์คํ์ API์ด๋ฉฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. local_rank (int, optional, ๊ธฐ๋ณธ๊ฐ์ -1): ๋ถ์ฐ ํ๋ จ ์ค ํ๋ก์ธ์ค์ ์์๋ฅผ ๋ํ๋ ๋๋ค. ddp_backend (str, optional): ๋ถ์ฐ ํ๋ จ์ ์ฌ์ฉํ ๋ฐฑ์๋๋ฅผ ๋ํ๋ ๋๋ค. "nccl", "mpi", "ccl", "gloo", "hccl" ์ค ํ๋์ฌ์ผ ํฉ๋๋ค. dataloader_drop_last (bool, optional, ๊ธฐ๋ณธ๊ฐ์ False): ๋ฐ์ดํฐ ์ธํธ์ ๊ธธ์ด๊ฐ ๋ฐฐ์น ํฌ๊ธฐ๋ก ๋๋์ด๋จ์ด์ง์ง ์๋ ๊ฒฝ์ฐ ๋ง์ง๋ง ๋ถ์์ ํ ๋ฐฐ์น๋ฅผ ์ญ์ ํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. dataloader_num_workers (int, optional, ๊ธฐ๋ณธ๊ฐ์ 0): ๋ฐ์ดํฐ ๋ก๋ฉ์ ์ฌ์ฉํ ํ์ ํ๋ก์ธ์ค ์์ ๋๋ค(PyTorch ์ ์ฉ). 0์ ๋ฐ์ดํฐ๊ฐ ๋ฉ์ธ ํ๋ก์ธ์ค์์ ๋ก๋๋จ์ ์๋ฏธํฉ๋๋ค. remove_unused_columns (bool, optional, ๊ธฐ๋ณธ๊ฐ์ True): ๋ชจ๋ธ์ forward ๋ฉ์๋์์ ์ฌ์ฉ๋์ง ์๋ ์ด์ ์๋์ผ๋ก ์ ๊ฑฐํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. label_names (List[str], optional): input dictionary์์ label์ ํด๋นํ๋ ํค์ ๋ชฉ๋ก์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ๋ชจ๋ธ์ด ์ฌ์ฉํ๋ ๋ ์ด๋ธ ์ธ์์ ๋ชฉ๋ก์ ๋๋ค. load_best_model_at_end (bool, optional, ๊ธฐ๋ณธ๊ฐ์ False): ํ๋ จ์ด ๋๋ ๋ ์ต์์ ๋ชจ๋ธ์ ๋ก๋ํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. ์ด ์ต์ ์ด ํ์ฑํ๋๋ฉด, ์ต์์ ์ฒดํฌํฌ์ธํธ๊ฐ ํญ์ ์ ์ฅ๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ save_total_limit๋ฅผ ์ฐธ์กฐํ์ธ์. <Tip> When set to `True`, the parameters `save_strategy` needs to be the same as `eval_strategy`, and in the case it is "steps", `save_steps` must be a round multiple of `eval_steps`. </Tip> metric_for_best_model (str, optional): load_best_model_at_end์ ํจ๊ป ์ฌ์ฉํ์ฌ ๋ ๋ชจ๋ธ์ ๋น๊ตํ ๋ฉํธ๋ฆญ์ ์ง์ ํฉ๋๋ค. ํ๊ฐ์์ ๋ฐํ๋ ๋ฉํธ๋ฆญ ์ด๋ฆ์ด์ด์ผ ํฉ๋๋ค. ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ "loss"์ด๋ฉฐ, load_best_model_at_end=True์ธ ๊ฒฝ์ฐ eval_loss๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ๊ฐ์ ์ค์ ํ๋ฉด greater_is_better์ ๊ธฐ๋ณธ๊ฐ์ True๊ฐ ๋ฉ๋๋ค. ๋ฉํธ๋ฆญ์ด ๋ฎ์์๋ก ์ข๋ค๋ฉด False๋ก ์ค์ ํ์ธ์. greater_is_better (bool, optional): load_best_model_at_end ๋ฐ metric_for_best_model๊ณผ ํจ๊ป ์ฌ์ฉํ์ฌ ๋ ๋์ ๋ชจ๋ธ์ด ๋ ๋์ ๋ฉํธ๋ฆญ์ ๊ฐ์ ธ์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ์ง์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: • metric_for_best_model์ด "loss"๋ก ๋๋์ง ์๋ ๊ฐ์ผ๋ก ์ค์ ๋ ๊ฒฝ์ฐ True์ ๋๋ค. • metric_for_best_model์ด ์ค์ ๋์ง ์์๊ฑฐ๋ "loss"๋ก ๋๋๋ ๊ฐ์ผ๋ก ์ค์ ๋ ๊ฒฝ์ฐ False์ ๋๋ค. fsdp (bool, str ๋๋ [~trainer_utils.FSDPOption]์ ๋ชฉ๋ก, optional, ๊ธฐ๋ณธ๊ฐ์ ''): PyTorch ๋ถ์ฐ ๋ณ๋ ฌ ํ๋ จ์ ์ฌ์ฉํฉ๋๋ค(๋ถ์ฐ ํ๋ จ ์ ์ฉ). fsdp_config (str ๋๋ dict, optional): fsdp(Pytorch ๋ถ์ฐ ๋ณ๋ ฌ ํ๋ จ)์ ํจ๊ป ์ฌ์ฉํ ์ค์ ์ ๋๋ค. ๊ฐ์ fsdp json ๊ตฌ์ฑ ํ์ผ์ ์์น(e.g., fsdp_config.json) ๋๋ ์ด๋ฏธ ๋ก๋๋ json ํ์ผ(dict)์ผ ์ ์์ต๋๋ค. deepspeed (str ๋๋ dict, optional): Deepspeed๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ์คํ์ ๊ธฐ๋ฅ์ด๋ฉฐ API๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ๊ฐ์ DeepSpeed json ๊ตฌ์ฑ ํ์ผ์ ์์น(e.g., ds_config.json) ๋๋ ์ด๋ฏธ ๋ก๋๋ json ํ์ผ(dict)์ผ ์ ์์ต๋๋ค. accelerator_config (str, dict, ๋๋ AcceleratorConfig, optional): ๋ด๋ถ Accelerator ๊ตฌํ๊ณผ ํจ๊ป ์ฌ์ฉํ ์ค์ ์ ๋๋ค. ๊ฐ์ accelerator json ๊ตฌ์ฑ ํ์ผ์ ์์น(e.g., accelerator_config.json), ์ด๋ฏธ ๋ก๋๋ json ํ์ผ(dict), ๋๋ [~trainer_pt_utils.AcceleratorConfig]์ ์ธ์คํด์ค์ผ ์ ์์ต๋๋ค. label_smoothing_factor (float, optional, ๊ธฐ๋ณธ๊ฐ์ 0.0): ์ฌ์ฉํ ๋ ์ด๋ธ ์ค๋ฌด๋ฉ ํฉํฐ์ ๋๋ค. 0์ label_smoothing์ ์ฌ์ฉํ์ง ์์์ ์๋ฏธ, ๋ค๋ฅธ ๊ฐ์ ์ํซ ์ธ์ฝ๋ฉ๋ ๋ ์ด๋ธ์ ๋ณ๊ฒฝํฉ๋๋ค. optim (str ๋๋ [training_args.OptimizerNames], optional, ๊ธฐ๋ณธ๊ฐ์ "adamw_torch"): ์ฌ์ฉํ ์ตํฐ๋ง์ด์ ๋ฅผ ๋ํ๋ ๋๋ค. adamw_hf, adamw_torch, adamw_torch_fused, adamw_apex_fused, adamw_anyprecision, adafactor ์ค์์ ์ ํํ ์ ์์ต๋๋ค. optim_args (str, optional): AnyPrecisionAdamW์ ์ ๊ณต๋๋ ์ ํ์ ์ธ์์ ๋๋ค. group_by_length (bool, optional, ๊ธฐ๋ณธ๊ฐ์ False): ํ๋ จ ๋ฐ์ดํฐ ์ธํธ์์ ๋๋ต ๊ฐ์ ๊ธธ์ด์ ์ํ์ ๊ทธ๋ฃนํํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค(ํจ๋ฉ์ ์ต์ํํ๊ณ ํจ์จ์ฑ์ ๋์ด๊ธฐ ์ํด). ๋์ ํจ๋ฉ์ ์ ์ฉํ ๋๋ง ์ ์ฉํฉ๋๋ค. report_to (str ๋๋ List[str], optional, ๊ธฐ๋ณธ๊ฐ์ "all"): ๊ฒฐ๊ณผ์ ๋ก๊ทธ๋ฅผ ๋ณด๊ณ ํ ํตํฉ ๋ชฉ๋ก์ ๋๋ค. ์ง์๋๋ ํ๋ซํผ์ "azure_ml", "clearml", "codecarbon", "comet_ml", "dagshub", "dvclive", "flyte", "mlflow", "neptune", "tensorboard", "wandb"์ ๋๋ค. "all"์ ์ค์น๋ ๋ชจ๋ ํตํฉ์ ๋ณด๊ณ ํ๋ฉฐ, "none"์ ํตํฉ์ ๋ณด๊ณ ํ์ง ์์ต๋๋ค. ddp_find_unused_parameters (bool, optional): ๋ถ์ฐ ํ๋ จ์ ์ฌ์ฉํ ๋, DistributedDataParallel์ ์ ๋ฌ๋๋ find_unused_parameters ํ๋๊ทธ์ ๊ฐ์ ๋ํ๋ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ๊ทธ๋๋์ธํธ ์ฒดํฌํฌ์ธํ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ False, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ True์ ๋๋ค. ddp_bucket_cap_mb (int, optional): ๋ถ์ฐ ํ๋ จ์ ์ฌ์ฉํ ๋, DistributedDataParallel์ ์ ๋ฌ๋๋ bucket_cap_mb ํ๋๊ทธ์ ๊ฐ์ ๋ํ๋ ๋๋ค. ddp_broadcast_buffers (bool, optional): ๋ถ์ฐ ํ๋ จ์ ์ฌ์ฉํ ๋, DistributedDataParallel์ ์ ๋ฌ๋๋ broadcast_buffers ํ๋๊ทธ์ ๊ฐ์ ๋ํ๋ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ๊ทธ๋๋์ธํธ ์ฒดํฌํฌ์ธํ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ False, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ True์ ๋๋ค. dataloader_persistent_workers (bool, optional, ๊ธฐ๋ณธ๊ฐ์ False): True๋ก ์ค์ ํ๋ฉด ๋ฐ์ดํฐ ๋ก๋๋ ๋ฐ์ดํฐ ์ธํธ๊ฐ ํ ๋ฒ ์๋น๋ ํ์๋ ์์ ์ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ์ง ์์ต๋๋ค. ์ด๋ ์์ ์ ๋ฐ์ดํฐ ์ธํธ ์ธ์คํด์ค๋ฅผ ์ ์งํ ์ ์์ต๋๋ค. ํ๋ จ ์๋๋ฅผ ๋์ผ ์ ์์ง๋ง RAM ์ฌ์ฉ๋์ด ์ฆ๊ฐํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ False์ ๋๋ค. push_to_hub (bool, optional, ๊ธฐ๋ณธ๊ฐ์ False): ๋ชจ๋ธ์ด ์ ์ฅ๋ ๋๋ง๋ค ๋ชจ๋ธ์ ํ๋ธ๋ก ํธ์ํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. ์ด ์ต์ ์ด ํ์ฑํ๋๋ฉด output_dir์ git ๋๋ ํ ๋ฆฌ๊ฐ ๋์ด ์ ์ฅ์ด ํธ๋ฆฌ๊ฑฐ๋ ๋๋ง๋ค ์ฝํ ์ธ ๊ฐ ํธ์๋ฉ๋๋ค(save_strategy์ ๋ฐ๋ผ ๋ค๋ฆ). [~Trainer.save_model]์ ํธ์ถํ๋ฉด ํธ์๊ฐ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค. resume_from_checkpoint (str, optional): ๋ชจ๋ธ์ ์ ํจํ ์ฒดํฌํฌ์ธํธ๊ฐ ์๋ ํด๋์ ๊ฒฝ๋ก์ ๋๋ค. ์ด ์ธ์๋ ์ง์ ์ ์ผ๋ก [Trainer]์์ ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ, ๋์ ํ๋ จ/ํ๊ฐ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉ๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฐธ์กฐํ์ธ์. hub_model_id (str, optional): ๋ก์ปฌ output_dir๊ณผ ๋๊ธฐํํ ์ ์ฅ์์ ์ด๋ฆ์ ๋๋ค. ๋จ์ํ ๋ชจ๋ธ ID์ผ ์ ์์ผ๋ฉฐ, ์ด ๊ฒฝ์ฐ ๋ชจ๋ธ์ ๋ค์์คํ์ด์ค์ ํธ์๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ์ฒด ์ ์ฅ์ ์ด๋ฆ์ด์ด์ผ ํฉ๋๋ค(e.g., "user_name/model"). ๊ธฐ๋ณธ๊ฐ์ user_name/output_dir_name์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ output_dir์ ์ด๋ฆ์ ๋๋ค. hub_strategy (str ๋๋ [~trainer_utils.HubStrategy], optional, ๊ธฐ๋ณธ๊ฐ์ "every_save"): ํ๋ธ๋ก ํธ์ํ ๋ฒ์์ ์์ ์ ์ ์ํฉ๋๋ค. ๊ฐ๋ฅํ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: • "end": ๋ชจ๋ธ, ๊ตฌ์ฑ, ํ ํฌ๋์ด์ (์ ๋ฌ๋ ๊ฒฝ์ฐ), ๋ชจ๋ธ ์นด๋ ์ด์์ ํธ์ํฉ๋๋ค. • "every_save": ๋ชจ๋ธ, ๊ตฌ์ฑ, ํ ํฌ๋์ด์ (์ ๋ฌ๋ ๊ฒฝ์ฐ), ๋ชจ๋ธ ์นด๋ ์ด์์ ์ ์ฅํ ๋๋ง๋ค ํธ์ํฉ๋๋ค. ํธ์๋ ๋น๋๊ธฐ์ ์ผ๋ก ์ํ๋๋ฉฐ, ์ ์ฅ์ด ๋งค์ฐ ๋น๋ฒํ ๊ฒฝ์ฐ ์ด์ ํธ์๊ฐ ์๋ฃ๋๋ฉด ์๋ก์ด ํธ์๊ฐ ์๋๋ฉ๋๋ค. ํ๋ จ์ด ๋๋ ๋ ์ต์ข ๋ชจ๋ธ๋ก ๋ง์ง๋ง ํธ์๊ฐ ์ํ๋ฉ๋๋ค. • "checkpoint": "every_save"์ ์ ์ฌํ์ง๋ง ์ต์ ์ฒดํฌํฌ์ธํธ๋ last-checkpoint๋ผ๋ ํ์ ํด๋์ ํธ์ํ์ฌ trainer.train(resume_from_checkpoint="last-checkpoint")์ผ๋ก ํ๋ จ์ ์ฝ๊ฒ ์ฌ๊ฐํ ์ ์์ต๋๋ค. • "all_checkpoints": "checkpoint"์ ์ ์ฌํ์ง๋ง ์ต์ข ์ ์ฅ์์์ ๋ํ๋๋ ๋๋ก ๋ชจ๋ ์ฒดํฌํฌ์ธํธ๋ฅผ ํธ์ํฉ๋๋ค(๋ฐ๋ผ์ ์ต์ข ์ ์ฅ์์๋ ํด๋๋ง๋ค ํ๋์ ์ฒดํฌํฌ์ธํธ ํด๋๊ฐ ์์ต๋๋ค). hub_token (str, optional): ๋ชจ๋ธ์ ํ๋ธ๋ก ํธ์ํ ๋ ์ฌ์ฉํ ํ ํฐ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ huggingface-cli login์ผ๋ก ์ป์ ์บ์ ํด๋์ ํ ํฐ์ ๋๋ค. hub_private_repo (bool, optional, ๊ธฐ๋ณธ๊ฐ์ False): True๋ก ์ค์ ํ๋ฉด ํ๋ธ ์ ์ฅ์๊ฐ ๋น๊ณต๊ฐ๋ก ์ค์ ๋ฉ๋๋ค. hub_always_push (bool, optional, ๊ธฐ๋ณธ๊ฐ์ False): True๊ฐ ์๋ ๊ฒฝ์ฐ, ์ด์ ํธ์๊ฐ ์๋ฃ๋์ง ์์ผ๋ฉด ์ฒดํฌํฌ์ธํธ ํธ์๋ฅผ ๊ฑด๋๋๋๋ค. gradient_checkpointing (bool, optional, ๊ธฐ๋ณธ๊ฐ์ False): ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ๊ธฐ ์ํด ๊ทธ๋๋์ธํธ ์ฒดํฌํฌ์ธํ ์ ์ฌ์ฉํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. ์ญ์ ํ ์๋๊ฐ ๋๋ ค์ง๋๋ค. auto_find_batch_size (bool, optional, ๊ธฐ๋ณธ๊ฐ์ False): ๋ฉ๋ชจ๋ฆฌ์ ๋ง๋ ๋ฐฐ์น ํฌ๊ธฐ๋ฅผ ์๋์ผ๋ก ์ฐพ์ CUDA ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ค๋ฅ๋ฅผ ํผํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. accelerate๊ฐ ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค(pip install accelerate). ray_scope (str, optional, ๊ธฐ๋ณธ๊ฐ์ "last"): Ray๋ฅผ ์ฌ์ฉํ ํ์ดํผํ๋ผ๋ฏธํฐ ๊ฒ์ ์ ์ฌ์ฉํ ๋ฒ์์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ "last"์ ๋๋ค. Ray๋ ๋ชจ๋ ์๋์ ๋ง์ง๋ง ์ฒดํฌํฌ์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋น๊ตํ๊ณ ์ต์์ ์ฒดํฌํฌ์ธํธ๋ฅผ ์ ํํฉ๋๋ค. ๋ค๋ฅธ ์ต์ ๋ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ Ray ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์. ddp_timeout (int, optional, ๊ธฐ๋ณธ๊ฐ์ 1800): torch.distributed.init_process_group ํธ์ถ์ ํ์์์์ ๋๋ค. ๋ถ์ฐ ์คํ ์ GPU ์์ผ ํ์์์์ ํผํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ PyTorch ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์. torch_compile (bool, optional, ๊ธฐ๋ณธ๊ฐ์ False): PyTorch 2.0 torch.compile์ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ์ปดํ์ผํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. ์ด๋ torch.compile API์ ๋ํ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํฉ๋๋ค. torch_compile_backend ๋ฐ torch_compile_mode ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉ์ ์ง์ ํ ์ ์์ง๋ง, ๋ชจ๋ ๊ฐ์ด ์๋ํ ๊ฒ์ด๋ผ๊ณ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ด ํ๋๊ทธ์ ์ ์ฒด ์ปดํ์ผ API๋ ์คํ์ ์ด๋ฉฐ ํฅํ ๋ฆด๋ฆฌ์ค์์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. torch_compile_backend (str, optional): torch.compile์์ ์ฌ์ฉํ ๋ฐฑ์๋์ ๋๋ค. ๊ฐ์ ์ค์ ํ๋ฉด torch_compile์ด True๋ก ์ค์ ๋ฉ๋๋ค. ๊ฐ๋ฅํ ๊ฐ์ PyTorch ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์. ์ด๋ ์คํ์ ์ด๋ฉฐ ํฅํ ๋ฆด๋ฆฌ์ค์์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. torch_compile_mode (str, optional): torch.compile์์ ์ฌ์ฉํ ๋ชจ๋์ ๋๋ค. ๊ฐ์ ์ค์ ํ๋ฉด torch_compile์ด True๋ก ์ค์ ๋ฉ๋๋ค. ๊ฐ๋ฅํ ๊ฐ์ PyTorch ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์. ์ด๋ ์คํ์ ์ด๋ฉฐ ํฅํ ๋ฆด๋ฆฌ์ค์์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. split_batches (bool, optional): ๋ถ์ฐ ํ๋ จ ์ค ๋ฐ์ดํฐ ๋ก๋๊ฐ ์์ฑํ๋ ๋ฐฐ์น๋ฅผ ์ฅ์น์ ๋ถํ ํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. True๋ก ์ค์ ํ๋ฉด ์ฌ์ฉ๋ ์ค์ ๋ฐฐ์น ํฌ๊ธฐ๋ ๋ชจ๋ ์ข ๋ฅ์ ๋ถ์ฐ ํ๋ก์ธ์ค์์ ๋์ผํ์ง๋ง, ์ฌ์ฉ ์ค์ธ ํ๋ก์ธ์ค ์์ ์ ์ ๋ฐฐ์ฌ์ผ ํฉ๋๋ค.
DeepSpeed
trust_remote_code=True
์ค๊ตญ๋ชจ๋ธ์์ ํํ๋ณด์ด๋ trust_remote_code=True ์ค์ , ๊ณผ์ฐ ์ด๊ฑด ๋ญ๊น?
์ด๋ "huggingface/transformers"์ Model Architecture๊ฐ ์์ง ์ถ๊ฐ๋์ง ์์๊ฒฝ์ฐ:
"huggingface repo 'internlm/internlm-chat-7b'์์ ๋ชจ๋ธ ์ฝ๋๋ฅผ ๋ค์ด๋ก๋ํ๊ณ , ๊ฐ์ค์น์ ํจ๊ป ์คํํ๋ค"๋ ์๋ฏธ์ด๋ค.from transformers import AutoTokenizer, AutoModel model = AutoModel.from_pretrained("internlm/internlm-chat-7b", trust_remote_code=True, device='cuda')
๋ง์ฝ ์ด ๊ฐ์ด False๋ผ๋ฉด, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ huggingface/transformers์ ๋ด์ฅ๋ ๋ชจ๋ธ ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ๊ณ ๊ฐ์ค์น๋ง ๋ค์ด๋ก๋ํ๋๊ฒ์ ์๋ฏธํ๋ค.
rue
์ค๊ตญ๋ชจ๋ธ์์ ํํollatorํจ์๋ฅผ ๋ณด๋ฉด ์๋์ ๊ฐ์ ์ฝ๋์ ํํ๋ฅผ ๋ ๋๋ฐ, ์ฌ๊ธฐ์ input_ids์ label์ด๋ผ๋ ์กฐ๊ธ ์์ํ ๋จ
'HuggingFace๐ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Data Preprocessing] - Data Collator (1) | 2024.07.14 |
---|---|
QLoRA ์ค์ต & Trainer vs SFTTrainer (0) | 2024.07.12 |
[QLoRA] & [PEFT] & deepspeed, DDP (0) | 2024.07.09 |