ClearML ν΅ν©
μ 보 ClearML
ClearML λ μκ°μ μ μ½ν μ μλλ‘ μ€κ³λ μ€νμμ€ λꡬ μμ β±οΈ.
π¨ μ€ν κ΄λ¦¬μμμ λͺ¨λ YOLOv5 κ΅μ‘ μ€νμ μΆμ νμΈμ.
π§ ν΅ν©λ ClearML λ°μ΄ν° λ²μ κ΄λ¦¬ λκ΅¬λ‘ μ¬μ©μ μ§μ κ΅μ‘ λ°μ΄ν°λ₯Ό λ²μ κ΄λ¦¬νκ³ μ½κ² μ‘μΈμ€νμΈμ.
ClearML μμ΄μ νΈλ₯Ό μ¬μ©νμ¬ YOLOv5 νΈλ μ΄λ μ€νμ μ격μΌλ‘ νλ ¨νκ³ λͺ¨λν°λ§ν©λλ€.
ClearML νμ΄νΌνλΌλ―Έν° μ΅μ νλ₯Ό μ¬μ©νμ¬ μ΅μμ 맡μ μ»μΌμΈμ.
ClearML μλΉμ μ¬μ©νμ¬ λͺ κ°μ§ λͺ λ Ήλ§μΌλ‘ μλ‘ νμ΅λ YOLOv5 λͺ¨λΈμ APIλ‘ μ ννμΈμ.
κ·Έλ¦¬κ³ ν¨μ¬ λ λ§μ΅λλ€. μ΄λ¬ν λꡬ μ€ λͺ κ°λ₯Ό μ¬μ©ν μ§λ μ€ν κ΄λ¦¬μλ§ μ¬μ©ν μλ μκ³ , λͺ¨λ ν¨κ» μ°κ²°νμ¬ μΈμμ μΈ νμ΄νλΌμΈμΌλ‘ λ§λ€ μλ μμ΅λλ€!
π¦Ύ μ€μ νκΈ°
μ€ν λ°/λλ λ°μ΄ν°λ₯Ό μΆμ νλ €λ©΄ ClearML μλ²μ ν΅μ ν΄μΌ ν©λλ€. μ΄λ₯Ό μν λ κ°μ§ μ΅μ μ΄ μμ΅λλ€:
ClearML νΈμ€ν μλΉμ€μ 무λ£λ‘ κ°μ νκ±°λ μ¬κΈ°λ₯Ό μ°Έμ‘°νμ¬ μ§μ μλ²λ₯Ό μ€μ ν μ μμ΅λλ€. μλ²λ μ€ν μμ€μ΄λ―λ‘ λ―Όκ°ν λ°μ΄ν°λ₯Ό λ€λ£¨λ κ²½μ°μλ μμ¬νκ³ μ¬μ©ν μ μμ΅λλ€!
-
μ€μΉ
clearml
python ν¨ν€μ§μ λλ€: -
μ격 μ¦λͺ μ μμ±νμ¬ ClearML SDKλ₯Ό μλ²μ μ°κ²°ν λ€μ(μ€λ₯Έμͺ½ μλ¨μμ μ€μ -> μν¬μ€νμ΄μ€ -> μ μ격 μ¦λͺ μμ±μΌλ‘ μ΄λ) μλ λͺ λ Ήμ μ€ννκ³ μ§μΉ¨μ λ°λ¦ λλ€:
λλ¬μ΅λλ€! μλ£λμμ΅λλ€ π
π κ΅μ‘ YOLOv5 ν¨κ» ClearML
ClearML μ€ν μΆμ μ μ¬μ©νλ €λ©΄ ClearML pip ν¨ν€μ§λ₯Ό μ€μΉνκΈ°λ§ νλ©΄ λ©λλ€.
μ΄λ κ² νλ©΄ YOLOv5 κ΅μ‘ μ€ν¬λ¦½νΈμ ν΅ν©ν μ μμ΅λλ€. μ΄μ λΆν° μ€νλλ λͺ¨λ κ΅μ‘μ ClearML μ€ν κ΄λ¦¬μκ° μΊ‘μ²νμ¬ μ μ₯ν©λλ€.
λ³κ²½νλ €λ κ²½μ° project_name
λλ task_name
λ₯Ό μ¬μ©νμ¬ --project
κ·Έλ¦¬κ³ --name
μΈμμ train.py
μ€ν¬λ¦½νΈλ₯Ό νΈμΆνλ©΄ κΈ°λ³Έμ μΌλ‘ νλ‘μ νΈλ YOLOv5
λ° μμ
Training
. μ°Έκ³ : ClearML μ¬μ© /
λ₯Ό νμ νλ‘μ νΈμ κ΅¬λΆ κΈ°νΈλ‘ μ¬μ©ν λ μ£Όμν΄μΌ ν©λλ€. /
λ₯Ό νλ‘μ νΈ μ΄λ¦μ λ£μΌμΈμ!
λλ μ¬μ©μ μ§μ νλ‘μ νΈ λ° μμ μ΄λ¦μ μ¬μ©ν©λλ€:
python train.py --project my_project --name my_training --img 640 --batch 16 --epochs 3 --data coco8.yaml --weights yolov5s.pt --cache
μ΄λ κ² νλ©΄ μΊ‘μ²λ©λλ€:
- μμ€ μ½λ + 컀λ°λμ§ μμ λ³κ²½ μ¬ν
- μ€μΉλ ν¨ν€μ§
- (νμ΄νΌ)맀κ°λ³μ
- λͺ¨λΈ νμΌ(μ¬μ©
--save-period n
λ₯Ό μ¬μ©νμ¬ n μν¬ν¬λ§λ€ 체ν¬ν¬μΈνΈλ₯Ό μ μ₯ν©λλ€.) - μ½μ μΆλ ₯
- μ€μΉΌλΌ(mAP_0.5, mAP_0.5:0.95, μ λ°λ, 리μ½, μμ€, νμ΅λ₯ , ...)
- λ¨Έμ μΈλΆ μ 보, λ°νμ, μμ± λ μ§ λ±κ³Ό κ°μ μΌλ° μ 보λ₯Ό μ 곡ν©λλ€.
- λΌλ²¨ μκ΄λ λ° νΌλ νλ ¬κ³Ό κ°μ λͺ¨λ μμ±λ νλ‘―
- μλλ³ κ²½κ³ μμκ° μλ μ΄λ―Έμ§
- μλλ³ λͺ¨μμ΄ν¬
- μλλ³ μ ν¨μ± κ²μ¬ μ΄λ―Έμ§
λ§μ΄ λ§μ£ ? μ΄μ ClearML UIμμ μ΄ λͺ¨λ μ 보λ₯Ό μκ°ννμ¬ νλ ¨ μ§ν μν©μ νλμ νμ ν μ μμ΅λλ€. ν μ΄λΈ 보기μ μ¬μ©μ μ§μ μ΄(μ: mAP_0.5)μ μΆκ°νμ¬ κ°μ₯ μ±κ³Όκ° μ’μ λͺ¨λΈμ μ½κ² μ λ ¬ν μ μμ΅λλ€. λλ μ¬λ¬ μ€νμ μ ννμ¬ μ§μ λΉκ΅ν μλ μμ΅λλ€!
νμ΄νΌνλΌλ―Έν° μ΅μ ν λ° μ격 μ€νκ³Ό κ°μ΄ μ΄ λͺ¨λ μ λ³΄λ‘ ν μ μλ μΌμ΄ ν¨μ¬ λ λ§μΌλ κ·Έ λ°©λ²μ μκ³ μΆλ€λ©΄ κ³μ μ½μ΄λ³΄μΈμ!
π λ°μ΄ν° μΈνΈ λ²μ κ΄λ¦¬
λ°μ΄ν°λ₯Ό μ½λμ λ³λλ‘ λ²μ κ΄λ¦¬νλ κ²μ μΌλ°μ μΌλ‘ μ’μ μκ°μ΄λ©° μ΅μ λ²μ μ μ½κ² μ»μ μ μμ΅λλ€. μ΄ λ¦¬ν¬μ§ν 리λ λ°μ΄ν° μ§ν© λ²μ ID μ 곡μ μ§μνλ©°, μμ§ λ²μ μ΄ μλ κ²½μ° λ°μ΄ν°λ₯Ό κ°μ Έμ¬ μ μλλ‘ ν©λλ€. λν μ΄ μν¬νλ‘λ μ¬μ©λ λ°μ΄ν° μΈνΈ IDλ₯Ό μμ 맀κ°λ³μμ μΌλΆλ‘ μ μ₯νλ―λ‘ μ΄λ€ λ°μ΄ν°κ° μ΄λ€ μ€νμ μ¬μ©λμλμ§ νμ μ μ μμ΅λλ€!
λ°μ΄ν° μ§ν© μ€λΉ
YOLOv5 리ν¬μ§ν 리λ ν΄λΉ μ λ³΄κ° ν¬ν¨λ YAML νμΌμ μ¬μ©νμ¬ λ€μν λ°μ΄ν° μ§ν©μ μ§μν©λλ€. κΈ°λ³Έμ μΌλ‘ λ°μ΄ν° μΈνΈλ λ€μ μμΉμ λ€μ΄λ‘λλ©λλ€. ../datasets
ν΄λλ₯Ό 리ν¬μ§ν 리 λ£¨νΈ ν΄λμ μ°κ²°ν©λλ€. λ°λΌμ coco128
λ°μ΄ν° μ§ν©μ λν λ§ν¬λ₯Ό μ¬μ©νκ±°λ yolov5 μμ μ 곡νλ μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νλ©΄ μ΄ ν΄λ ꡬ쑰λ₯Ό μ»μ μ μμ΅λλ€:
νμ§λ§ μνλ λ°μ΄ν° μΈνΈλ 무μμ΄λ μκ΄μμ΅λλ€. μ΄ ν΄λ ꡬ쑰λ₯Ό μ§ν€κΈ°λ§ νλ€λ©΄ μμ λ‘κ² μ¬μ©ν΄λ λ©λλ€.
κ·Έλ° λ€μ,ν΄λΉ YAML νμΌμ folderβ οΈ λ°μ΄ν° μ§ν©μ 루νΈμ β οΈcopy μ λ‘λν©λλ€.μ΄ YAML νμΌμλ ClearML μμ λ°μ΄ν°μΈνΈλ₯Ό μ¬λ°λ₯΄κ² μ¬μ©νλ λ° νμν μ λ³΄κ° ν¬ν¨λμ΄ μμ΅λλ€. λ¬Όλ‘ μμ YAMLμ ꡬ쑰λ₯Ό λ°λΌ μ§μ λ§λ€ μλ μμ΅λλ€.
κΈ°λ³Έμ μΌλ‘ λ€μ ν€κ° νμν©λλ€: path
, train
, test
, val
, nc
, names
.
..
|_ yolov5
|_ datasets
|_ coco128
|_ images
|_ labels
|_ coco128.yaml # <---- HERE!
|_ LICENSE
|_ README.txt
λ°μ΄ν° μΈνΈ μ λ‘λ
μ΄ λ°μ΄ν° μ§ν©μ ClearML μ λ²μ μ΄ μ§μ λ λ°μ΄ν° μ§ν©μΌλ‘ κ°μ Έμ€λ €λ©΄ λ°μ΄ν° μ§ν© λ£¨νΈ ν΄λλ‘ μ΄λνμ¬ λ€μ λͺ λ Ήμ μ€νν©λλ€:
λͺ
λ Ή clearml-data sync
λ μ¬μ€ μκΈ° λͺ
λ Ήμ
λλ€. μ΄λ¬ν λͺ
λ Ήμ μ°¨λ‘λ‘ μ€νν μλ μμ΅λλ€:
# Optionally add --parent <parent_dataset_id> if you want to base
# this version on another dataset version, so no duplicate files are uploaded!
clearml-data create --name coco128 --project YOLOv5
clearml-data add --files .
clearml-data close
ClearML λ°μ΄ν° μΈνΈλ₯Ό μ¬μ©νμ¬ κ΅μ‘ μ€ν
μ΄μ ClearML λ°μ΄ν° μΈνΈκ° μμΌλ―λ‘ μ΄λ₯Ό μ¬μ©νμ¬ λ§€μ° κ°λ¨νκ² μ¬μ©μ μ§μ YOLOv5 π λͺ¨λΈμ νλ ¨ν μ μμ΅λλ€!
python train.py --img 640 --batch 16 --epochs 3 --data clearml://<your_dataset_id> --weights yolov5s.pt --cache
π νμ΄νΌνλΌλ―Έν° μ΅μ ν
μ΄μ μ€νκ³Ό λ°μ΄ν°μ λ²μ μ΄ μ ν΄μ‘μΌλ, κ·Έ μμ 무μμ ꡬμΆν μ μλμ§ μ΄ν΄λ³Ό μ°¨λ‘μ λλ€!
μ½λ μ 보, μ€μΉλ ν¨ν€μ§ λ° νκ²½ μΈλΆ μ 보λ₯Ό μ¬μ©νμ¬ μ΄μ μ€ν μ체λ₯Ό μμ ν μ¬νν μ μμ΅λλ€. μ€μ λ‘ ClearML μμ μ€νμ 볡μ νκ³ λ§€κ°λ³μκΉμ§ λ³κ²½ν μ μμ΅λλ€. κ·Έλ° λ€μ μλ‘μ΄ λ§€κ°λ³μλ‘ μ€νμ μλμΌλ‘ λ€μ μ€ννλ©΄ λ©λλ€. μ΄κ²μ΄ λ°λ‘ HPOκ° νλ μΌμ λλ€!
νμ΄νΌνλΌλ―Έν° μ΅μ νλ₯Ό λ‘컬μμ μ€ννκΈ° μν΄ λ―Έλ¦¬ λ§λ€μ΄μ§ μ€ν¬λ¦½νΈκ° ν¬ν¨λμ΄ μμ΅λλ€. νΈλ μ΄λ μμ μ ν λ² μ΄μ μ€νν μ μ΄ μλμ§ νμΈνκ³ ClearML μ€ν κ΄λ¦¬μμμ ν΄λΉ μμ μ 볡μ νκ³ νμ΄νΌνλΌλ―Έν°λ₯Ό λ³κ²½νκΈ°λ§ νλ©΄ λ©λλ€.
μ΄ IDλ₯Ό μ
λ ₯ν΄μΌ ν©λλ€. template task
μμ μ°Ύμ μ μλ μ€ν¬λ¦½νΈμμ utils/loggers/clearml/hpo.py
λ₯Ό ν΄λ¦ν λ€μ μ€ννμΈμ :) λ³κ²½ν μ μμ΅λλ€. task.execute_locally()
μ task.execute()
λ₯Ό μ¬μ©νμ¬ ClearML λκΈ°μ΄μ λ£κ³ μ격 μλ΄μμ΄ λμ μμ
νλλ‘ ν©λλ€.
# To use optuna, install it first, otherwise you can change the optimizer to just be RandomSearch
pip install optuna
python utils/loggers/clearml/hpo.py
π€― μ격 μ€ν(κ³ κΈ)
λ‘컬μμ HPOλ₯Ό μ€ννλ κ²μ μ λ§ νΈλ¦¬νμ§λ§, λμ μ격 μ»΄ν¨ν°μμ μ€νμ μ€ννκ³ μΆλ€λ©΄ μ΄λ»κ² ν΄μΌ ν κΉμ? νμ₯μμ λ§€μ° κ°λ ₯ν GPU λ¨Έμ μ μ‘μΈμ€ν μ μκ±°λ ν΄λΌμ°λ GPUλ₯Ό μ¬μ©ν μ μλ μμ°μ΄ μμ μλ μμ΅λλ€. μ΄λ ClearML μμ΄μ νΈκ° νμν©λλ€. μ¬κΈ°μμ μμ΄μ νΈκ° 무μμ ν μ μλμ§ νμΈνμΈμ:
κ°λ¨ν λ§ν΄, μ€ν κ΄λ¦¬μκ° μΆμ νλ λͺ¨λ μ€νμλ λ€λ₯Έ λ¨Έμ μμ μ¬νν μ μλ μΆ©λΆν μ 보(μ€μΉλ ν¨ν€μ§, 컀λ°λμ§ μμ λ³κ²½ μ¬ν λ±)κ° ν¬ν¨λμ΄ μμ΅λλ€. λ°λΌμ ClearML μμ΄μ νΈλ μμ λκΈ°μ΄μμ λ€μ΄μ€λ μμ μ κΈ°λ€λ¦¬λ€κ° μμ μ λ°κ²¬νλ©΄ νκ²½μ μ¬ννκ³ μ€ννλ©΄μ μ€μΉΌλΌ, νλ‘― λ±μ μ€ν κ΄λ¦¬μμκ² λ³΄κ³ ν©λλ€.
ν΄λΌμ°λ VM, λ‘컬 GPU λ¨Έμ , κ°μΈ λ ΈνΈλΆ λ± μ΄λ€ λ¨Έμ μ΄λ κ°λ¨ν μ€ννμ¬ ClearML μμ΄μ νΈλ‘ μ νν μ μμ΅λλ€:
볡μ , νΈμ§ λ° ν λκΈ°
μμ΄μ νΈκ° μ€νλλ©΄ μμ΄μ νΈμ μμ μ λΆμ¬ν μ μμ΅λλ€. HPO μΉμ μμ μμ μ 볡μ νκ³ νμ΄νΌνλΌλ―Έν°λ₯Ό νΈμ§ν μ μλ€λ κ²μ κΈ°μ΅νμλμ? μΈν°νμ΄μ€μμλ μ΄ μμ μ μνν μ μμ΅λλ€!
μ€νμ λ§μ°μ€ μ€λ₯Έμͺ½ λ²νΌμΌλ‘ ν΄λ¦νμ¬ λ³΅μ ν©λλ€.
π― νμ΄νΌνλΌλ―Έν°λ₯Ό μνλ λλ‘ νΈμ§ν©λλ€.
μμ μ λ§μ°μ€ μ€λ₯Έμͺ½ λ²νΌμΌλ‘ ν΄λ¦νμ¬ λκΈ°μ΄μ λκΈ°μ΄μ μΆκ°ν©λλ€.
μ격μΌλ‘ μμ μ€ννκΈ°
μ΄μ μμμ μ€λͺ
ν λλ‘ μμ
μ 볡μ νκ±°λ νμ¬ μ€ν¬λ¦½νΈμ task.execute_remotely()
μ€νλλ©΄ μμ΄μ νΈκ° μμ
μ μμν μ μλλ‘ λκΈ°μ΄μ λ£μ΅λλ€!
YOLOv5 κ΅μ‘ μ€ν¬λ¦½νΈλ₯Ό μ격μΌλ‘ μ€ννλ €λ©΄ clearml λ‘κ±°λ₯Ό μΈμ€ν΄μ€νν ν training.py μ€ν¬λ¦½νΈμ μ΄ μ€μ μΆκ°νκΈ°λ§ νλ©΄ λ©λλ€:
# ...
# Loggers
data_dict = None
if RANK in {-1, 0}:
loggers = Loggers(save_dir, weights, opt, hyp, LOGGER) # loggers instance
if loggers.clearml:
loggers.clearml.task.execute_remotely(queue="my_queue") # <------ ADD THIS LINE
# Data_dict is either None is user did not choose for ClearML dataset or is filled in by ClearML
data_dict = loggers.clearml.data_dict
# ...
μ΄ λ³κ²½ ν νΈλ μ΄λ μ€ν¬λ¦½νΈλ₯Ό μ€ννλ©΄ python μ΄ ν΄λΉ μ€κΉμ§ μ€ν¬λ¦½νΈλ₯Ό μ€ννκ³ κ·Έ μ΄νμλ μ½λλ₯Ό ν¨ν€μ§νμ¬ λκΈ°μ΄λ‘ λμ μ μ‘ν©λλ€!
μλ νμ₯ μμ μ
ClearML μλ μ€ν μ€μΌμΌλ¬λ ν¨κ» μ 곡λ©λλ€! μ΄ λꡬλ λκΈ°μ΄μμ μ€νμ΄ κ°μ§λ λλ§λ€ μ νν ν΄λΌμ°λ(AWS, GCP, Azure)μμ μ μ격 λ¨Έμ μ μλμΌλ‘ μ€νμ νκ³ ClearML μμ΄μ νΈλ‘ μ νν©λλ€. μμ μ΄ μ²λ¦¬λλ©΄ μ€ν μ€μΌμΌλ¬κ° μ격 λ¨Έμ μ μλμΌλ‘ μ’ λ£νκ³ μκΈ μ§λΆμ μ€λ¨λ©λλ€!
μλμμ μ€ν μ€μΌμΌλ¬ μμνκΈ° λμμμ νμΈνμΈμ.