μ½˜ν…μΈ λ‘œ κ±΄λ„ˆλ›°κΈ°

레이 νŠ μ„ ν†΅ν•œ 효율적인 ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹ 및 YOLOv8

Hyperparameter tuning is vital in achieving peak model performance by discovering the optimal set of hyperparameters. This involves running trials with different hyperparameters and evaluating each trial's performance.

Ultralytics YOLOv8 및 레이 튠으둜 νŠœλ‹μ„ κ°€μ†ν™”ν•˜μ„Έμš”.

Ultralytics YOLOv8 λŠ” ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹μ„ μœ„ν•œ 레이 νŠ μ„ ν†΅ν•©ν•˜μ—¬ YOLOv8 λͺ¨λΈ ν•˜μ΄νΌνŒŒλΌλ―Έν„°μ˜ μ΅œμ ν™”λ₯Ό κ°„μ†Œν™”ν•©λ‹ˆλ‹€. 레이 νŠ μ„ μ‚¬μš©ν•˜λ©΄ κ³ κΈ‰ 검색 μ „λž΅, 병렬 처리, μ‘°κΈ° 쀑지λ₯Ό ν™œμš©ν•˜μ—¬ νŠœλ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹ μ†ν•˜κ²Œ 진행할 수 μžˆμŠ΅λ‹ˆλ‹€.

레이 튠

레이 튠 κ°œμš”

레이 νŠ μ€ νš¨μœ¨μ„±κ³Ό μœ μ—°μ„±μ„ μœ„ν•΄ μ„€κ³„λœ ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹ λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€. λ‹€μ–‘ν•œ 검색 μ „λž΅, 병렬 처리, μ‘°κΈ° 쀑지 μ „λž΅μ„ μ§€μ›ν•˜λ©° Ultralytics YOLOv8 을 λΉ„λ‘―ν•œ 인기 μžˆλŠ” λ¨Έμ‹  λŸ¬λ‹ ν”„λ ˆμž„μ›Œν¬μ™€ μ›ν™œν•˜κ²Œ ν†΅ν•©λ©λ‹ˆλ‹€.

λ‹€μŒκ³Όμ˜ 톡합 Weights & Biases

YOLOv8 와 μ„ νƒμ μœΌλ‘œ ν†΅ν•©ν•˜μ—¬ Weights & Biases 와 μ„ νƒμ μœΌλ‘œ 톡합할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

μ„€μΉ˜

ν•„μš”ν•œ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•˜λ €λ©΄ μ‹€ν–‰ν•©λ‹ˆλ‹€:

μ„€μΉ˜

# Install and update Ultralytics and Ray Tune packages
pip install -U ultralytics "ray[tune]"

# Optionally install W&B for logging
pip install wandb

μ‚¬μš©λ²•

μ‚¬μš©λ²•

from ultralytics import YOLO

# Load a YOLOv8n model
model = YOLO("yolov8n.pt")

# Start tuning hyperparameters for YOLOv8n training on the COCO8 dataset
result_grid = model.tune(data="coco8.yaml", use_ray=True)

tune() λ©”μ„œλ“œ λ§€κ°œλ³€μˆ˜

그리고 tune() λ©”μ„œλ“œ( YOLOv8 )λŠ” 레이 νŠœλ‹μ„ ν†΅ν•œ ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹μ„ μœ„ν•œ μ‚¬μš©ν•˜κΈ° μ‰¬μš΄ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. νŠœλ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‚¬μš©μž 지정할 수 μžˆλŠ” μ—¬λŸ¬ 인수λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜λŠ” 각 νŒŒλΌλ―Έν„°μ— λŒ€ν•œ μžμ„Έν•œ μ„€λͺ…μž…λ‹ˆλ‹€:

λ§€κ°œλ³€μˆ˜ μœ ν˜• μ„€λͺ… κΈ°λ³Έκ°’
data str νŠœλ„ˆλ₯Ό μ‹€ν–‰ν•  데이터 μ„ΈνŠΈ ꡬ성 파일(YAML ν˜•μ‹)μž…λ‹ˆλ‹€. 이 νŒŒμΌμ—λŠ” ν•™μŠ΅ 및 μœ νš¨μ„± 검사 데이터 κ²½λ‘œμ™€ 기타 데이터 μ„ΈνŠΈλ³„ 섀정이 μ§€μ •λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
space dict, optional 레이 튠의 ν•˜μ΄νΌνŒŒλΌλ―Έν„° 검색 곡간을 μ •μ˜ν•˜λŠ” μ‚¬μ „μž…λ‹ˆλ‹€. 각 ν‚€λŠ” ν•˜μ΄νΌνŒŒλΌλ―Έν„° 이름에 ν•΄λ‹Ήν•˜λ©°, 값은 νŠœλ‹ 쀑에 탐색할 κ°’μ˜ λ²”μœ„λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€. μ œκ³΅ν•˜μ§€ μ•ŠμœΌλ©΄ YOLOv8 λ‹€μ–‘ν•œ ν•˜μ΄νΌνŒŒλΌλ―Έν„°κ°€ ν¬ν•¨λœ κΈ°λ³Έ 검색 곡간을 μ‚¬μš©ν•©λ‹ˆλ‹€.
grace_period int, optional 레이 νŠ μ—μ„œ ASHA μŠ€μΌ€μ€„λŸ¬μ˜ 에포크 λ‹¨μœ„ 유예 κΈ°κ°„μž…λ‹ˆλ‹€. μŠ€μΌ€μ€„λŸ¬λŠ” 이 에포크 수 μ΄μ „μ—λŠ” μ–΄λ–€ μ‹œν—˜λ„ μ’…λ£Œν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λͺ¨λΈμ΄ μ‘°κΈ° 쀑단을 κ²°μ •ν•˜κΈ° 전에 μ΅œμ†Œν•œμ˜ ν›ˆλ ¨μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 10
gpu_per_trial int, optional νŠœλ‹ 쀑 ν‰κ°€νŒλ‹Ή ν• λ‹Ήν•  GPU μˆ˜μž…λ‹ˆλ‹€. μ΄λŠ” 특히 λ©€ν‹° GPU ν™˜κ²½μ—μ„œ GPU μ‚¬μš©λŸ‰μ„ κ΄€λ¦¬ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€. μ œκ³΅ν•˜μ§€ μ•ŠμœΌλ©΄ νŠœλ„ˆλŠ” μ‚¬μš© κ°€λŠ₯ν•œ λͺ¨λ“  GPUλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μ—†μŒ
iterations int, optional νŠœλ‹ 쀑에 μ‹€ν–‰ν•  μ΅œλŒ€ νŠΈλΌμ΄μ–Ό νšŸμˆ˜μž…λ‹ˆλ‹€. 이 맀개 λ³€μˆ˜λŠ” ν…ŒμŠ€νŠΈλ˜λŠ” 총 ν•˜μ΄νΌνŒŒλΌλ―Έν„° μ‘°ν•© 수λ₯Ό μ œμ–΄ν•˜μ—¬ νŠœλ‹ ν”„λ‘œμ„ΈμŠ€κ°€ λ¬΄ν•œμ • μ‹€ν–‰λ˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€. 10
**train_args dict, optional 에 전달할 μΆ”κ°€ μΈμˆ˜λŠ” train() λ©”μ„œλ“œμ— 전달할 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μΈμˆ˜μ—λŠ” νŠΈλ ˆμ΄λ‹ 에포크 수, 배치 크기 및 기타 νŠΈλ ˆμ΄λ‹ κ΄€λ ¨ ꡬ성과 같은 섀정이 포함될 수 μžˆμŠ΅λ‹ˆλ‹€. {}

μ΄λŸ¬ν•œ νŒŒλΌλ―Έν„°λ₯Ό μ‚¬μš©μž μ§€μ •ν•˜λ©΄ νŠΉμ • μš”κ΅¬ 사항과 μ‚¬μš© κ°€λŠ₯ν•œ μ»΄ν“¨νŒ… λ¦¬μ†ŒμŠ€μ— 맞게 ν•˜μ΄νΌνŒŒλΌλ―Έν„° μ΅œμ ν™” ν”„λ‘œμ„ΈμŠ€λ₯Ό λ―Έμ„Έ μ‘°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κΈ°λ³Έ 검색 곡간 μ„€λͺ…

λ‹€μŒ ν‘œμ—λŠ” Ray Tune을 μ‚¬μš©ν•œ ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹μ„ μœ„ν•œ κΈ°λ³Έ 검색 곡간 λ§€κ°œλ³€μˆ˜( YOLOv8 )κ°€ λ‚˜μ™€ μžˆμŠ΅λ‹ˆλ‹€. 각 λ§€κ°œλ³€μˆ˜μ—λŠ” λ‹€μŒκ³Ό 같이 μ •μ˜λœ νŠΉμ • κ°’ λ²”μœ„κ°€ μžˆμŠ΅λ‹ˆλ‹€. tune.uniform().

λ§€κ°œλ³€μˆ˜ κ°’ λ²”μœ„ μ„€λͺ…
lr0 tune.uniform(1e-5, 1e-1) 초기 ν•™μŠ΅λ₯ 
lrf tune.uniform(0.01, 1.0) μ΅œμ’… ν•™μŠ΅λ₯  κ³„μˆ˜
momentum tune.uniform(0.6, 0.98) λͺ¨λ©˜ν…€
weight_decay tune.uniform(0.0, 0.001) 체쀑 κ°μ†Œ
warmup_epochs tune.uniform(0.0, 5.0) μ›Œλ°μ—… 에포크
warmup_momentum tune.uniform(0.0, 0.95) μ›Œλ°μ—… λͺ¨λ©˜ν…€
box tune.uniform(0.02, 0.2) λ°•μŠ€ κ°λŸ‰ 무게
cls tune.uniform(0.2, 4.0) 클래슀 κ°λŸ‰ 체쀑
hsv_h tune.uniform(0.0, 0.1) 색쑰 ν™•λŒ€ λ²”μœ„
hsv_s tune.uniform(0.0, 0.9) 채도 증강 λ²”μœ„
hsv_v tune.uniform(0.0, 0.9) κ°’(밝기) ν™•λŒ€ λ²”μœ„
degrees tune.uniform(0.0, 45.0) νšŒμ „ ν™•λŒ€ λ²”μœ„(도)
translate tune.uniform(0.0, 0.9) λ²ˆμ—­ 증강 λ²”μœ„
scale tune.uniform(0.0, 0.9) ν™•μž₯ λ²”μœ„ ν™•λŒ€
shear tune.uniform(0.0, 10.0) 전단 증강 λ²”μœ„(도)
perspective tune.uniform(0.0, 0.001) 원근 증강 λ²”μœ„
flipud tune.uniform(0.0, 1.0) 수직 뒀집기 ν™•λŒ€ ν™•λ₯ 
fliplr tune.uniform(0.0, 1.0) μˆ˜ν‰ 뒀집기 ν™•λŒ€ ν™•λ₯ 
mosaic tune.uniform(0.0, 1.0) λͺ¨μžμ΄ν¬ ν™•λŒ€ ν™•λ₯ 
mixup tune.uniform(0.0, 1.0) λ―ΉμŠ€μ—… 증강 ν™•λ₯ 
copy_paste tune.uniform(0.0, 1.0) 볡사-λΆ™μ—¬λ„£κΈ° ν™•λŒ€ ν™•λ₯ 

μ‚¬μš©μž 지정 검색 곡간 예제

이 μ˜ˆμ—μ„œλŠ” 레이 튠과 YOLOv8 을 μ‚¬μš©ν•˜μ—¬ ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹μ„ μœ„ν•œ μ‚¬μš©μž 지정 검색 곡간을 μ‚¬μš©ν•˜λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€. μ‚¬μš©μž 지정 검색 곡간을 μ œκ³΅ν•˜λ©΄ 관심 μžˆλŠ” νŠΉμ • ν•˜μ΄νΌνŒŒλΌλ―Έν„°μ— νŠœλ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό 집쀑할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ‚¬μš©λ²•

from ultralytics import YOLO

# Define a YOLO model
model = YOLO("yolov8n.pt")

# Run Ray Tune on the model
result_grid = model.tune(
    data="coco8.yaml",
    space={"lr0": tune.uniform(1e-5, 1e-1)},
    epochs=50,
    use_ray=True,
)

μœ„μ˜ μ½”λ“œ μŠ€λ‹ˆνŽ«μ—μ„œλŠ” "yolov8n.pt" 사전 ν•™μŠ΅λœ κ°€μ€‘μΉ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ YOLO λͺ¨λΈμ„ μƒμ„±ν•©λ‹ˆλ‹€. 그런 λ‹€μŒ tune() λ©”μ„œλ“œμ— "coco8.yaml"둜 데이터 μ„ΈνŠΈ ꡬ성을 μ§€μ •ν•©λ‹ˆλ‹€. 초기 ν•™μŠ΅λ₯ μ— λŒ€ν•œ μ‚¬μš©μž μ •μ˜ 검색 곡간을 μ œκ³΅ν•©λ‹ˆλ‹€. lr0 ν‚€ "lr0"κ³Ό κ°’ tune.uniform(1e-5, 1e-1). λ§ˆμ§€λ§‰μœΌλ‘œ, 에포크 μˆ˜μ™€ 같은 μΆ”κ°€ ν›ˆλ ¨ 인수λ₯Ό λ‹€μŒκ³Ό 같이 튠 λ©”μ„œλ“œμ— 직접 μ „λ‹¬ν•©λ‹ˆλ‹€. epochs=50.

레이 튠 결과 처리

레이 νŠœλ‹μœΌλ‘œ ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹ μ‹€ν—˜μ„ μ‹€ν–‰ν•œ ν›„μ—λŠ” 얻은 결과에 λŒ€ν•΄ λ‹€μ–‘ν•œ 뢄석을 μˆ˜ν–‰ν•΄μ•Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 κ°€μ΄λ“œμ—μ„œλŠ” μ΄λŸ¬ν•œ κ²°κ³Όλ₯Ό μ²˜λ¦¬ν•˜κ³  λΆ„μ„ν•˜λŠ” 일반적인 μ›Œν¬ν”Œλ‘œλ₯Ό μ•ˆλ‚΄ν•©λ‹ˆλ‹€.

λ””λ ‰ν† λ¦¬μ—μ„œ νŠœλ‹ μ‹€ν—˜ κ²°κ³Ό λ‘œλ“œ

νŠœλ‹ μ‹€ν—˜μ„ μ‹€ν–‰ν•œ ν›„ tuner.fit()λ₯Ό μ‚¬μš©ν•˜λ©΄ λ””λ ‰ν† λ¦¬μ—μ„œ κ²°κ³Όλ₯Ό λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 κΈ°λŠ₯은 특히 초기 ꡐ윑 μŠ€ν¬λ¦½νŠΈκ°€ μ’…λ£Œλœ ν›„ 뢄석을 μˆ˜ν–‰ν•˜λŠ” κ²½μš°μ— μœ μš©ν•©λ‹ˆλ‹€.

experiment_path = f"{storage_path}/{exp_name}"
print(f"Loading results from {experiment_path}...")

restored_tuner = tune.Tuner.restore(experiment_path, trainable=train_mnist)
result_grid = restored_tuner.get_results()

κΈ°λ³Έ μ‹€ν—˜ μˆ˜μ€€ 뢄석

ν‰κ°€νŒμ΄ μ–΄λ–»κ²Œ μˆ˜ν–‰λ˜μ—ˆλŠ”μ§€μ— λŒ€ν•œ κ°œμš”λ₯Ό ν™•μΈν•˜μ„Έμš”. ν‰κ°€νŒ 쀑에 였λ₯˜κ°€ μžˆμ—ˆλŠ”μ§€ λΉ λ₯΄κ²Œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

if result_grid.errors:
    print("One or more trials failed!")
else:
    print("No errors!")

κΈ°λ³Έ ν‰κ°€νŒ μˆ˜μ€€ 뢄석

κ°œλ³„ ν‰κ°€νŒ ν•˜μ΄νΌνŒŒλΌλ―Έν„° ꡬ성 및 λ§ˆμ§€λ§‰μœΌλ‘œ 보고된 μ§€ν‘œμ— μ•‘μ„ΈμŠ€ν•©λ‹ˆλ‹€.

for i, result in enumerate(result_grid):
    print(f"Trial #{i}: Configuration: {result.config}, Last Reported Metrics: {result.metrics}")

ν‰κ°€νŒμ— λŒ€ν•΄ 보고된 μ§€ν‘œμ˜ 전체 기둝 ν”Œλ‘œνŒ…ν•˜κΈ°

각 ν‰κ°€νŒμ— λŒ€ν•΄ 보고된 μ§€ν‘œμ˜ 기둝을 ν”Œλ‘œνŒ…ν•˜μ—¬ μ‹œκ°„μ΄ 지남에 따라 μ§€ν‘œκ°€ μ–΄λ–»κ²Œ λ³€ν™”ν–ˆλŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

import matplotlib.pyplot as plt

for result in result_grid:
    plt.plot(
        result.metrics_dataframe["training_iteration"],
        result.metrics_dataframe["mean_accuracy"],
        label=f"Trial {i}",
    )

plt.xlabel("Training Iterations")
plt.ylabel("Mean Accuracy")
plt.legend()
plt.show()

μš”μ•½

이 λ¬Έμ„œμ—μ„œλŠ” Ultralytics 을 μ‚¬μš©ν•˜μ—¬ 레이 튠으둜 μ‹€ν–‰ν•œ μ‹€ν—˜μ˜ κ²°κ³Όλ₯Ό λΆ„μ„ν•˜λŠ” 일반적인 μ›Œν¬ν”Œλ‘œμš°λ₯Ό λ‹€λ£¨μ—ˆμŠ΅λ‹ˆλ‹€. μ£Όμš” λ‹¨κ³„μ—λŠ” λ””λ ‰ν† λ¦¬μ—μ„œ μ‹€ν—˜ κ²°κ³Όλ₯Ό λ‘œλ“œν•˜κ³ , κΈ°λ³Έ μ‹€ν—˜ μˆ˜μ€€ 및 μ‹œν—˜ μˆ˜μ€€ 뢄석을 μˆ˜ν–‰ν•˜κ³ , λ©”νŠΈλ¦­μ„ ν”Œλ‘œνŒ…ν•˜λŠ” 것이 ν¬ν•¨λ©λ‹ˆλ‹€.

Explore further by looking into Ray Tune's Analyze Results docs page to get the most out of your hyperparameter tuning experiments.



Created 2023-11-12, Updated 2024-06-10
Authors: glenn-jocher (9)

λŒ“κΈ€