Work/Web

[ํŒŒ์ด์ฌ] ๋…ธ๋‹ต ๋””์ž์ด๋„ˆ์˜ ์ฝ”๋”ฉ ๋ฐฐ์šฐ๊ธฐ - LLM ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ (์ดˆ์‹ฌ์ž ๊ฐœ๋… ์ •๋ฆฌ)

๋ชฌ์กฐ 2025. 2. 4. 21:47
์†”์งํžˆ mps๋‹ˆ .to(device)๋‹ˆ ํ† ํฌ๋‚˜์ด์ € ๋“ฑ๋“ฑ ๋ชจ๋ฅด๋Š” ๋‹จ์–ด๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์„œ overwhelmed ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„ ์‚ด๋ ค์ค˜ ๐Ÿ˜ญ

๐Ÿ˜ญ ์™„์ „ ๊ณต๊ฐ… ๋„ˆ๋ฌด ๋งŽ์€ ๊ฐœ๋…์ด ํ•œ๊บผ๋ฒˆ์— ์Ÿ์•„์ง€๋ฉด ๋ฉ˜๋ถ• ์˜ค๋Š” ๊ฑฐ ์ง„์งœ ๋‹น์—ฐํ•œ ๊ฑฐ์•ผ!

๐Ÿ‘‰ ์ง€๊ธˆ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฑด “์ „์ฒด ๊ฐœ๋…์„ ์žก๊ณ , ํ•˜๋‚˜์”ฉ ์ตํžˆ๋Š” ๊ฒƒ!”

๐Ÿ‘‰ ๋„ˆ๋ฌด ๊ธ‰ํ•˜๊ฒŒ ๋‹ค ์ดํ•ดํ•˜๋ ค๊ณ  ํ•˜์ง€ ๋ง๊ณ , ์ฒœ์ฒœํžˆ ํ•ต์‹ฌ ๊ฐœ๋…๋ถ€ํ„ฐ ์ตํžˆ๋ฉด ๋ผ! ๐Ÿ˜Ž๐Ÿ”ฅ

 

๐Ÿ”ฅ LLM ๋ชจ๋ธ ์ฝ”๋”ฉ์—์„œ ๊ผญ ์•Œ์•„์•ผ ํ•  ๊ฐœ๋… 5๊ฐ€์ง€ (์ดˆ์‹ฌ์ž์šฉ ๊ฐœ๋… ์ •๋ฆฌ!)

 

๐Ÿ’ก ์ง€๊ธˆ ๋„ค๊ฐ€ ๊ฒช๊ณ  ์žˆ๋Š” MPS, to(device), ํ† ํฌ๋‚˜์ด์ € ๊ฐ™์€ ๊ฐœ๋…๋“ค์„ ์‰ฝ๊ฒŒ ์ •๋ฆฌํ•ด์ค„๊ฒŒ!

๐Ÿ’ก ์ด 5๊ฐ€์ง€๋งŒ ์•Œ๋ฉด, ๋‚˜๋จธ์ง€๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ดํ•ด๋  ๊ฑฐ์•ผ!

 

1๏ธโƒฃ MPS → Mac์—์„œ GPU๋ฅผ ์“ฐ๋Š” ๋ฐฉ๋ฒ•!

โœ… **MPS(Metal Performance Shaders)**๋Š” Mac์—์„œ GPU ๊ฐ€์†์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ!
โœ… Windows์˜ CUDA(์—”๋น„๋””์•„ GPU) ๋Œ€์‹ , Mac์—์„œ๋Š” MPS๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ!

๐Ÿ‘‰ ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด?
โœ” Windows์—์„œ๋Š” cuda๋ฅผ ์จ์•ผ ํ•˜๊ณ ,
โœ” Mac์—์„œ๋Š” mps๋ฅผ ์จ์•ผ GPU ๊ฐ€์†์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ!

๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์ œ

import torch

device = torch.device("mps" if torch.backends.mps.is_available() else "cpu")
print(device)  # "mps" ๋˜๋Š” "cpu" ์ถœ๋ ฅ๋จ!

๐Ÿ‘‰ ์ด์ œ Mac์—์„œ MPS๊ฐ€ ์ง€์›๋˜๋ฉด ์ž๋™์œผ๋กœ GPU ์‚ฌ์šฉ! ๐Ÿ˜Ž๐Ÿ”ฅ

 

2๏ธโƒฃ to(device) → ๋ฐ์ดํ„ฐ๋ฅผ GPU๋กœ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•!

 

โœ… to(device)๋Š” ๋ชจ๋ธ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ™์€ ์žฅ์น˜(GPU/CPU)์—์„œ ์—ฐ์‚ฐํ•˜๋„๋ก ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜!

 

๐Ÿ‘‰ ์™œ ํ•„์š”ํ• ๊นŒ?

๐Ÿ”ฅ ๋ชจ๋ธ์ด GPU(mps)์— ์žˆ๋Š”๋ฐ, ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ CPU์— ์žˆ์œผ๋ฉด ์ถฉ๋Œ(์—๋Ÿฌ) ๋ฐœ์ƒ!

๐Ÿ”ฅ ๊ทธ๋ž˜์„œ ๋ชจ๋ธ๊ณผ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ™์€ ๊ณณ(GPU/CPU)์œผ๋กœ ๋ณด๋‚ด์•ผ ํ•จ!

 

๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์ œ

model.to(device)  # ๋ชจ๋ธ์„ GPU(MPS)๋กœ ์ด๋™!
inputs = tokenizer("์•ˆ๋…•ํ•˜์„ธ์š”", return_tensors="pt").to(device)  # ๋ฐ์ดํ„ฐ๋„ GPU๋กœ ์ด๋™!

๐Ÿ”ฅ ์ด์ œ ๋ชจ๋ธ๊ณผ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ™์€ ์žฅ์น˜์—์„œ ์‹คํ–‰๋จ! (์—๋Ÿฌ ๋ฐฉ์ง€!)

 

3๏ธโƒฃ ํ† ํฌ๋‚˜์ด์ €(Tokenization) → ํ…์ŠคํŠธ๋ฅผ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •!

 

โœ… LLM ๋ชจ๋ธ์€ ํ…์ŠคํŠธ๋ฅผ ์ดํ•ด ๋ชป ํ•˜๊ณ , ์ˆซ์ž๋งŒ ์ดํ•ดํ•จ!

โœ… ๊ทธ๋ž˜์„œ ํ† ํฌ๋‚˜์ด์ €(tokenizer)๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์žฅ์„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•จ!

 

๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์ œ

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("beomi/kcbert-base")  # ํ•œ๊ตญ์–ด ์ „์šฉ ํ† ํฌ๋‚˜์ด์ €!
tokens = tokenizer.tokenize("์•ˆ๋…•ํ•˜์„ธ์š”!")
print(tokens)  # ['์•ˆ', '##๋…•', '##ํ•˜์„ธ์š”', '!']

๐Ÿ”ฅ ์ฆ‰, ํ† ํฌ๋‚˜์ด์ €๋Š” ๋ฌธ์žฅ์„ ์ž‘์€ ์กฐ๊ฐ(ํ† ํฐ)์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•ด์คŒ! ๐Ÿ˜Ž

 

4๏ธโƒฃ AutoModelForMaskedLM → ๋งˆ์Šคํฌ(MASK)๋œ ๋‹จ์–ด๋ฅผ ์˜ˆ์ธกํ•˜๋Š” ๋ชจ๋ธ!

 

โœ… AutoModelForMaskedLM์€ ๋ฌธ์žฅ์—์„œ ๊ฐ€๋ ค์ง„ [MASK] ๋‹จ์–ด๋ฅผ ๋งž์ถ”๋Š” ๋ชจ๋ธ!

โœ… BERT ๊ฐ™์€ ๋ชจ๋ธ์ด ์ด๋Ÿฐ Masked Language Modeling(MLM) ๊ธฐ๋Šฅ์„ ๊ฐ€์ง.

 

๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์ œ

from transformers import AutoModelForMaskedLM

model = AutoModelForMaskedLM.from_pretrained("beomi/kcbert-base")

๐Ÿ”ฅ ์ด์ œ ๋‚˜๋Š” [MASK]๋ฅผ ์ข‹์•„ํ•ด ๊ฐ™์€ ๋ฌธ์žฅ์„ ์ฃผ๋ฉด, AI๊ฐ€ [MASK]์— ๋“ค์–ด๊ฐˆ ๋‹จ์–ด๋ฅผ ์˜ˆ์ธกํ•ด์คŒ!

 

5๏ธโƒฃ torch.argmax() → ๊ฐ€์žฅ ํ™•๋ฅ  ๋†’์€ ๋‹จ์–ด ์ฐพ๊ธฐ!

 

โœ… torch.argmax()๋Š” AI๊ฐ€ ์˜ˆ์ธกํ•œ ๊ฒฐ๊ณผ ์ค‘์—์„œ ๊ฐ€์žฅ ํ™•๋ฅ  ๋†’์€ ๋‹จ์–ด๋ฅผ ์„ ํƒํ•˜๋Š” ํ•จ์ˆ˜!

 

๐Ÿ“Œ ์ฝ”๋“œ ์˜ˆ์ œ

import torch

predictions = torch.tensor([[0.1, 0.3, 0.8, 0.2]])  # ์˜ˆ์ธก ํ™•๋ฅ ๊ฐ’๋“ค
best_index = torch.argmax(predictions, dim=-1)  # ๊ฐ€์žฅ ๋†’์€ ํ™•๋ฅ ๊ฐ’์˜ ์œ„์น˜ ์ฐพ๊ธฐ
print(best_index)  # ์ถœ๋ ฅ: tensor([2]) (๊ฐ€์žฅ ํ™•๋ฅ  ๋†’์€ ์ธ๋ฑ์Šค)

๐Ÿ”ฅ ์ฆ‰, torch.argmax()๋Š” “์ด ์ค‘์—์„œ ๊ฐ€์žฅ ํ™•๋ฅ  ๋†’์€ ๊ฑฐ ๊ณจ๋ผ์ค˜!” ๋ผ๊ณ  ํ•  ๋•Œ ์”€! ๐Ÿ˜Ž๐Ÿ”ฅ

 


๐Ÿ”ฅ ๊ฒฐ๋ก : ์ด 5๊ฐ€์ง€๋งŒ ๊ธฐ์–ตํ•˜๋ฉด ๋!

 

๊ฐœ๋… ์„ค๋ช…
1๏ธโƒฃ MPS Mac์—์„œ GPU ๊ฐ€์†์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ (Windows๋Š” CUDA)
2๏ธโƒฃ to(device) ๋ชจ๋ธ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ™์€ ์žฅ์น˜(GPU/CPU)์—์„œ ์‹คํ–‰ํ•˜๋„๋ก ๋งž์ถ”๊ธฐ
3๏ธโƒฃ ํ† ํฌ๋‚˜์ด์ € ๋ฌธ์žฅ์„ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋„๊ตฌ
4๏ธโƒฃ AutoModelForMaskedLM [MASK] ๋ถ€๋ถ„์„ ์˜ˆ์ธกํ•˜๋Š” ๋ชจ๋ธ (BERT ๊ธฐ๋ฐ˜)
5๏ธโƒฃ torch.argmax() ๊ฐ€์žฅ ํ™•๋ฅ  ๋†’์€ ์˜ˆ์ธก ๊ฒฐ๊ณผ๋ฅผ ์„ ํƒํ•˜๋Š” ํ•จ์ˆ˜

 

๐Ÿ”ฅ ์ด์ œ ํ•˜๋‚˜์”ฉ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋ฉด์„œ ์ฒœ์ฒœํžˆ ์ง„ํ–‰ํ•˜๋ฉด ๋ผ!

๐Ÿ”ฅ ๋„ˆ๋ฌด ๋ถ€๋‹ด ๊ฐ–์ง€ ๋ง๊ณ , “์ดํ•ด ์•ˆ ๊ฐ€๋ฉด ๋ฌผ์–ด๋ณด๋ฉด ๋œ๋‹ค!” ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ผ!