Back to Blog List

MLOps๋ž€?

โ†Study

MLOps (๋จธ์‹ ๋Ÿฌ๋‹ ์šด์˜)

Blog Image

Design

๋จธ์‹ ๋Ÿฌ๋‹์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ์š”์†Œ (configuration)

  • Dataset : ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ํ•™์Šต ์‹œํ‚ค๊ธฐ ์œ„ํ•œย ๋ฐ์ดํ„ฐ.
  • Metric : ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ์ธก์ •์„ ์œ„ํ•œย ํ‰๊ฐ€ ์ง€ํ‘œ.
  • Model : ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” Task์˜ ์ข…๋ฅ˜์™€ Data์˜ ํŠน์„ฑ์— ๋งž๋Š”ย ์•Œ๊ณ ๋ฆฌ์ฆ˜.
  • Hyper-parameter : ๋ชจ๋ธ๋ง ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ย ์ง์ ‘ ์„ธํŒ…ํ•ด์ฃผ๋Š” ๊ฐ’.

Model development

์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ hyper-parameter ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉฐย ๋‹ค์–‘ํ•œ ์‹คํ—˜์„ ํ•ด์•ผํ•จ

โ†’ ์—ฌ๋Ÿฌ ์‹คํ—˜ ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ดย ์ •๋ฆฌํ•˜๋Š” ๊ณผ์ •์ด ๋ฒˆ๊ฑฐ๋กœ์šธ ์ˆ˜ ์žˆ์Œ

WandB

W and B (Weights & Biases)

โ†’ ๋”ฅ๋Ÿฌ๋‹ ์‹คํ—˜ ๊ณผ์ •์„ ์†์‰ฝ๊ฒŒ Trackingํ•˜๊ณ , ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ๋Š” Tool

  • hyperparameter๋ณ„ ๊ฒฐ๊ณผ ๋น„๊ต
  • ํ•™์Šต ๊ณผ์ • visualization
  • system ๋ชจ๋‹ˆํ„ฐ๋ง
  • ํ˜‘์—…
  • ๊ณผ๊ฑฐ ์‹คํ—˜ parameter ๋ณต์ œ
Blog Image

์šฐ์„  wandb ํšŒ์›๊ฐ€์ž… ์ง„ํ–‰ (https://wandb.ai/site)

wandb install

bash
pip install wandb pip3 install wandb # pip๊ฐ€ ์—†๋‹ค๊ณ  ๋œจ๋ฉด ์ด๊ฑธ๋กœ
bash
wandb login

๊ทธ ํ›„ API Key๋ฅผ ์ž…๋ ฅํ•˜๋ผ๊ณ  ํ•จ

โ†’ ย https://wandb.ai/authorize ์—์„œ ๋ณต์‚ฌํ•ด์„œ ๋ถ™์—ฌ๋„ฃ์œผ๋ฉด ๋จ

python
# ๋‚ด API Key e60e3a61bebeec0beccabf93a087ef2fd3e8786f
Blog Image

Test

uailab-unist_ ์ด๋ฆ„์˜ ํŒ€์—์„œ ๋‚ด Project๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ณ  test ํ•ด๋ณด๊ธฐ

Blog Image

Create new project๋กœ ๋‚ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

Blog Image

๊ทธ๋Ÿผ ์œ„ ํ™”๋ฉด์ฒ˜๋Ÿผ ์นœ์ ˆํ•˜๊ฒŒ ์ฒซ ์‹œ์ž‘ ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค€๋‹ค.

๋กœ๊ทธ์ธ์€ ์•„๊นŒ ํ–ˆ์œผ๋‹ˆ, ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ๋ณด์ž.

wandb.init ์ด ์ค‘์š”ํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ์˜ต์…˜๋„ ์ถ”๊ฐ€ํ•ด๋ดค๋‹ค.

python
import wandb import random wandb.login() # start a new wandb run to track this script wandb.init( # ํ”„๋กœ์ ํŠธ ์ด๋ฆ„ project="tinyllm_hoon", # ํŒ€ ๋˜๋Š” ์‚ฌ์šฉ์ž ์ด๋ฆ„ # ์ด๊ฑฐ ์™œ ์•ˆ๋˜๋Š”๊ฑฐ์ง€? # entity="hoonably", # ์‹คํ—˜ ์ด๋ฆ„ name="test1", # ์‹คํ–‰์— ๋Œ€ํ•œ ์„ค๋ช… notes="trainging test", # ์‹คํ—˜์„ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ํƒœ๊ทธ tags=["tag1", "tag2"], # offline mode๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด mode="offline"์œผ๋กœ ์„ค์ • # mode="online", # hyperparameter ์„ค์ •๊ฐ’ config={ "learning_rate": 0.02, "architecture": "CNN", "dataset": "CIFAR-100", "epochs": 10, } ) # simulate training epochs = 10 offset = random.random() / 5 for epoch in range(2, epochs): acc = 1 - 2 ** -epoch - random.random() / epoch - offset loss = 2 ** -epoch + random.random() / epoch + offset # log metrics to wandb wandb.log({"acc": acc, "loss": loss}) # [optional] finish the wandb run, necessary in notebooks wandb.finish()
Blog Image

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ฑ๊ณตํ•˜๋ฉด, wandb ๋ผ๋Š” ํด๋”๊ฐ€ ๊ฐ™์€ ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒ์„ฑ๋˜๋ฉฐ ๋กœ๊ทธ๊ฐ€ ๋‚จ๋Š”๋‹ค.

Blog Image

๋˜ํ•œ ๋™์‹œ์— wandb ํŽ˜์ด์ง€์— ์˜จ๋ผ์ธ์œผ๋กœ๋„ ๊ฒฐ๊ณผ๊ฐ€ ์ „์†ก๋˜์–ด ์ €์žฅ๋œ๋‹ค.

Blog Image

Blog Image

๊ฒฐ๊ณผ

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค.

Blog Image
๊ฐ ๋ฐ์ดํ„ฐ๊ฐ€ 10๊ฐœ๋งŒ ๋ณด์ด๋Š”๋ฐ,

ํ†ฑ๋‹ˆ๋ฐ”ํ€ด ๋ˆ„๋ฅด๊ณ  Max runs to show๋ฅผ ์˜ฌ๋ ค์ฃผ๋ฉด ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค.

Blog Image

Tag์— ์ •๋ณด๋ฅผ ๋„ฃ์ž

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •๋ณด๋ฅผ ๋„ฃ์œผ๋ฉด Tag๋ฅผ ๋ˆŒ๋Ÿฌ ๋น„๊ตํ•˜๊ธฐ ์ข‹๋‹ค.

python
# Device ์„ค์ • device = 'cuda' if torch.cuda.is_available() else 'cpu' # GPU ๋ชจ๋ธ๋ช… ํ™•์ธ gpu_name = torch.cuda.get_device_name(0) ... run = wandb.init( project="TinyLLM", name=f"{model_name} in {dataset_name}", notes="", tags=[gpu_name, model_name, dataset_name], mode="online" )