Hugging Face์—์„œ ๐Ÿค— `transformers` ์‚ฌ์šฉํ•˜๊ธฐ

Hugging Face์—์„œ ๐Ÿค— transformers ์‚ฌ์šฉํ•˜๊ธฐ

๐Ÿค— transformers๋Š” Hugging Face์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, PyTorch, TensorFlow, JAX๋ฅผ ์œ„ํ•œ ์ตœ์‹ (state-of-the-art) ๋จธ์‹ ๋Ÿฌ๋‹์„ ์ œ๊ณตํ•ด์š”. ํ…์ŠคํŠธ, ๋น„์ „, ์˜ค๋””์˜ค ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋ชจ๋‹ฌ๋ฆฌํ‹ฐ์˜ ํƒœ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ฒœ ๊ฐœ์˜ ์‚ฌ์ „ ํ•™์Šต ๋ชจ๋ธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์†Œ ํŽธํ–ฅ์ ์ด๊ธด ํ•˜์ง€๋งŒ ์ €ํฌ๋Š” ๐Ÿค— transformers๋ฅผ ์ •๋ง ์ข‹์•„ํ•ด์š”!

์ถœ์ฒ˜: ๋ฌธ์„œ

๋ณธ๋ฌธ

ํ—ˆ๋ธŒ์—์„œ ๐Ÿค— transformers ํƒ์ƒ‰ํ•˜๊ธฐ

ํ—ˆ๋ธŒ์—๋Š” 630,000๊ฐœ ์ด์ƒ์˜ transformers ๋ชจ๋ธ์ด ์žˆ์œผ๋ฉฐ, ๋ชจ๋ธ ํŽ˜์ด์ง€ ์™ผ์ชฝ์˜ ํ•„ํ„ฐ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด์š”.

๋‹ค์–‘ํ•œ ํƒœ์Šคํฌ์˜ ๋ชจ๋ธ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋ฌธ๋งฅ์—์„œ ๋‹ต ์ถ”์ถœ (question-answering)
  • ํฐ ํ…์ŠคํŠธ์—์„œ ์š”์•ฝ ์ƒ์„ฑ (summarization)
  • ํ…์ŠคํŠธ ๋ถ„๋ฅ˜(์˜ˆ: ์ŠคํŒธ ์—ฌ๋ถ€, text-classification)
  • GPT ๊ฐ™์€ ๋ชจ๋ธ๋กœ ์ƒˆ ํ…์ŠคํŠธ ์ƒ์„ฑ (text-generation)
  • ๋ฌธ์žฅ์—์„œ ํ’ˆ์‚ฌ(๋™์‚ฌ, ์ฃผ์–ด ๋“ฑ)๋‚˜ ๊ฐœ์ฒด(๊ตญ๊ฐ€, ์กฐ์ง ๋“ฑ) ์‹๋ณ„ (token-classification)
  • ์˜ค๋””์˜ค ํŒŒ์ผ์„ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ (automatic-speech-recognition)
  • ์˜ค๋””์˜ค ํŒŒ์ผ์˜ ํ™”์ž ๋˜๋Š” ์–ธ์–ด ๋ถ„๋ฅ˜ (audio-classification)
  • ์ด๋ฏธ์ง€์—์„œ ๊ฐ์ฒด ๊ฐ์ง€ (object-detection)
  • ์ด๋ฏธ์ง€ ๋ถ„ํ•  (image-segmentation)
  • ๊ฐ•ํ™”ํ•™์Šต ์ˆ˜ํ–‰ (reinforcement-learning)!

๋ธŒ๋ผ์šฐ์ € ๋‚ด ์œ„์ ฏ ๋•๋ถ„์— ๋‹ค์šด๋กœ๋“œ ์—†์ด ๋ฐ”๋กœ ๋ชจ๋ธ์„ ์‹œํ—˜ํ•ด ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•ด ๋ณผ ์ˆ˜๋„ ์žˆ์–ด์š”!

Transformers ์ €์žฅ์†Œ ํŒŒ์ผ

Transformers ๋ชจ๋ธ ์ €์žฅ์†Œ์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋ธ ํŒŒ์ผ๊ณผ ์ „์ฒ˜๋ฆฌ๊ธฐ(preprocessor) ํŒŒ์ผ์ด ๋“ค์–ด ์žˆ์–ด์š”.

๋ชจ๋ธ (Model)

  • config.json ํŒŒ์ผ์€ ์€๋‹‰ ๋ ˆ์ด์–ด ์ˆ˜, ์–ดํœ˜ ํฌ๊ธฐ, ์–ดํ…์…˜ ํ—ค๋“œ ์ˆ˜, ๊ฐ ํ—ค๋“œ์˜ ์ฐจ์› ๋“ฑ ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด์š”. ์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋ธ์˜ ์ฒญ์‚ฌ์ง„์ด์—์š”.

  • model.safetensors ํŒŒ์ผ์€ ๋ชจ๋ธ์˜ ์‚ฌ์ „ ํ•™์Šต ๋ ˆ์ด์–ด์™€ ๊ฐ€์ค‘์น˜๋ฅผ ์ €์žฅํ•ด์š”. ํฐ ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ ๋กœ๋“œ์— ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด safetensors ํŒŒ์ผ์„ ์ƒค๋”ฉ(sharding)ํ•ฉ๋‹ˆ๋‹ค. model.safetensors.index.json ํŒŒ์ผ์„ ์—ด์–ด ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๊ฐ€ ์–ด๋–ค safetensors ํŒŒ์ผ์—์„œ ๋กœ๋“œ๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

    {
    "metadata": {
      "total_size": 16060522496
    },
    "weight_map": {
      "lm_head.weight": "model-00004-of-00004.safetensors",
      "model.embed_tokens.weight": "model-00001-of-00004.safetensors",
      ...
      }
    }
    

    ๋ชจ๋ธ ์นด๋“œ์˜ โ†— ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด ์ด ๋งคํ•‘์„ ์‹œ๊ฐํ™”ํ•  ์ˆ˜๋„ ์žˆ์–ด์š”.

    Safetensors๋Š” pickle๋ณด๋‹ค ๋” ์•ˆ์ „ํ•˜๊ณ  ๋น ๋ฅธ, ๋ชจ๋ธ ๊ฐ€์ค‘์น˜ ์ €์žฅ์šฉ ์ง๋ ฌํ™” ํ˜•์‹์ด์—์š”. bin, pth, ckpt ๊ฐ™์€ ํ˜•์‹์˜ ํ”ผํด ๊ฐ€์ค‘์น˜๋ฅผ ๋งŒ๋‚  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, safetensors๋Š” ๋” ๋‚˜์€ ๋Œ€์•ˆ์œผ๋กœ ๋ชจ๋ธ ์ƒํƒœ๊ณ„์—์„œ ์ ์  ๋” ์ฑ„ํƒ๋˜๊ณ  ์žˆ์–ด์š”.

  • ๋ชจ๋ธ์—๋Š” ์ƒ˜ํ”Œ๋ง ์—ฌ๋ถ€, ์ƒ˜ํ”Œ๋งํ•  ์ƒ์œ„ ํ† ํฐ, temperature, ์ƒ์„ฑ ์‹œ์ž‘ยท์ข…๋ฃŒ์šฉ ํŠน์ˆ˜ ํ† ํฐ ๋“ฑ ํ…์ŠคํŠธ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” generation_config.json ํŒŒ์ผ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ์–ด์š”.

์ „์ฒ˜๋ฆฌ๊ธฐ (Preprocessor)

  • tokenizer_config.json ํŒŒ์ผ์€ ๋ชจ๋ธ์ด ์ถ”๊ฐ€ํ•œ ํŠน์ˆ˜ ํ† ํฐ์„ ์ €์žฅํ•ด์š”. ์ด ํŠน์ˆ˜ ํ† ํฐ์€ ๋ฌธ์žฅ์˜ ์‹œ์ž‘, ์ฑ„ํŒ… ํ…œํ”Œ๋ฆฟ์„ ์œ„ํ•œ ํŠน์ • ํ˜•์‹, ์ด๋ฏธ์ง€ ํ‘œ์‹œ ๋“ฑ ๋งŽ์€ ๊ฒƒ์„ ๋ชจ๋ธ์— ์•Œ๋ ค ์ค˜์š”. ์ด ํŒŒ์ผ์€ ๋ชจ๋ธ์ด ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ž…๋ ฅ ์‹œํ€€์Šค ๊ธธ์ด, ์ „์ฒ˜๋ฆฌ๊ธฐ ํด๋ž˜์Šค, ๋ฐ˜ํ™˜ํ•˜๋Š” ์ถœ๋ ฅ๋„ ๋ณด์—ฌ์ค˜์š”.
  • tokenizer.json ํŒŒ์ผ์€ ๋ชจ๋ธ์˜ ํ•™์Šต๋œ ์–ดํœ˜(vocabulary)๋ฅผ ์ €์žฅํ•ด์š”.
  • **special_tokens_map.json**์€ ํŠน์ˆ˜ ํ† ํฐ์˜ ๋งคํ•‘์ด์—์š”. ์˜ˆ๋ฅผ ๋“ค์–ด Llama 3.1-8B-Instruct์—์„œ ๋ฌธ์ž์—ด ์‹œ์ž‘ ํ† ํฐ์€ "<|begin_of_text|>"์˜ˆ์š”.

[!TIP] ๋‹ค๋ฅธ ๋ชจ๋‹ฌ๋ฆฌํ‹ฐ์˜ ๊ฒฝ์šฐ tokenizer_config.json ํŒŒ์ผ์€ preprocessor_config.json์œผ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด ๋ชจ๋ธ ์‚ฌ์šฉํ•˜๊ธฐ

๋ชจ๋“  transformers ๋ชจ๋ธ์€ ํ•œ ์ค„์ด๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”! ์‚ฌ์šฉ ๋ฐฉ์‹์— ๋”ฐ๋ผ pipeline ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ์ˆ˜์ค€ API๋ฅผ ์“ฐ๊ฑฐ๋‚˜, ๋” ์„ธ๋ฐ€ํ•œ ์ œ์–ด๋ฅผ ์œ„ํ•ด AutoModel์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

# With pipeline, just specify the task and the model id from the Hub.
from transformers import pipeline
pipe = pipeline("text-generation", model="distilbert/distilgpt2")

# If you want more control, you will need to define the tokenizer and model.
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("distilbert/distilgpt2")
model = AutoModelForCausalLM.from_pretrained("distilbert/distilgpt2")

ํŠน์ • ๋ฒ„์ „(์ปค๋ฐ‹ ํ•ด์‹œ, ํƒœ๊ทธ ์ด๋ฆ„, ๋˜๋Š” ๋ธŒ๋žœ์น˜ ๊ธฐ๋ฐ˜)์—์„œ ๋ชจ๋ธ์„ ๋กœ๋“œํ•  ์ˆ˜๋„ ์žˆ์–ด์š”:

model = AutoModel.from_pretrained(
    "julien-c/EsperBERTo-small", revision="v2.0.1"  # tag name, or branch name, or commit hash
)

ํŠน์ • ๋ชจ๋ธ ๋กœ๋“œ ๋ฐฉ๋ฒ•์„ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด Use in Transformers๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘ํ•˜๋Š” ์Šค๋‹ˆํŽซ์„ ์–ป์„ ์ˆ˜ ์žˆ์–ด์š”! ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์Šค๋‹ˆํŽซ ํ•˜๋‹จ์˜ "Read model documentation"์„ ํด๋ฆญํ•  ์ˆ˜๋„ ์žˆ์–ด์š”.

๋ชจ๋ธ ๊ณต์œ ํ•˜๊ธฐ

transformers๋กœ ๋ชจ๋ธ์„ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ „์ฒด ๋‚ด์šฉ์€ ๊ณต์‹ ๋ฌธ์„œ์˜ Share a model ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

transformers์˜ ๋งŽ์€ ํด๋ž˜์Šค(๋ชจ๋ธ, ํ† ํฌ๋‚˜์ด์ € ๋“ฑ)์—๋Š” ์ €์žฅ์†Œ๋กœ ํŒŒ์ผ์„ ์‰ฝ๊ฒŒ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” push_to_hub ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์–ด์š”.

# Pushing model to your own account
model.push_to_hub("my-awesome-model")

# Pushing your tokenizer
tokenizer.push_to_hub("my-awesome-model")

# Pushing all things after training
trainer.push_to_hub()

ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด ํ›จ์”ฌ ๋” ๋งŽ์œผ๋‹ˆ Share a model ๊ฐ€์ด๋“œ๋ฅผ ํ™•์ธํ•ด ๋ณด์‹œ๊ธธ ๊ถŒํ•ด์š”.

์ถ”๊ฐ€ ์ž๋ฃŒ

๋” ์•Œ์•„๋ณด๊ธฐ (Learn more)