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

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

ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹μ€ 졜적의 ν•˜μ΄νΌνŒŒλΌλ―Έν„° μ„ΈνŠΈλ₯Ό λ°œκ²¬ν•˜μ—¬ 졜고의 λͺ¨λΈ μ„±λŠ₯을 λ‹¬μ„±ν•˜λŠ” 데 ν•„μˆ˜μ μž…λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” λ‹€μ–‘ν•œ ν•˜μ΄νΌνŒŒλΌλ―Έν„°λ‘œ ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜κ³  각 ν…ŒμŠ€νŠΈμ˜ μ„±λŠ₯을 ν‰κ°€ν•˜λŠ” μž‘μ—…μ΄ ν¬ν•¨λ©λ‹ˆλ‹€.

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

레이튠의 κ²°κ³Ό 뢄석 λ¬Έμ„œ νŽ˜μ΄μ§€μ—μ„œ ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹ μ‹€ν—˜μ„ μ΅œλŒ€ν•œ ν™œμš©ν•˜κΈ° μœ„ν•œ μžμ„Έν•œ λ‚΄μš©μ„ μ‚΄νŽ΄λ³΄μ„Έμš”.



생성 2023-11-12, μ—…λ°μ΄νŠΈ 2024-05-06
μž‘μ„±μž: glenn-jocher (5)

λŒ“κΈ€