Tinh chỉnh siêu tham số hiệu quả với Ray Tune và YOLO26
Tinh chỉnh siêu tham số tìm kiếm tập hợp siêu tham số giúp model đạt hiệu năng tốt nhất. Quy trình này chạy các lượt thử nghiệm với những giá trị siêu tham số khác nhau và đánh giá hiệu năng của từng lượt.
Tăng tốc quá trình tinh chỉnh với Ultralytics YOLO26 và Ray Tune#
Ultralytics YOLO26 tích hợp Ray Tune để tinh chỉnh siêu tham số. Với Ray Tune, bạn có thể sử dụng các chiến lược tìm kiếm nâng cao, xử lý song song và dừng sớm để tăng tốc quá trình tinh chỉnh.
Ray Tune#
Ray Tune là thư viện tinh chỉnh siêu tham số được thiết kế để đạt hiệu quả và tính linh hoạt. Thư viện hỗ trợ nhiều chiến lược tìm kiếm, xử lý song song và chiến lược dừng sớm, đồng thời tích hợp với các framework machine learning phổ biến, bao gồm Ultralytics YOLO26.
Tích hợp với Weights & Biases#
YOLO26 cũng hỗ trợ tích hợp tùy chọn với Weights & Biases để giám sát quá trình tinh chỉnh.
Cài đặt#
Để cài đặt các package cần thiết, hãy chạy:
# Install and update Ultralytics and Ray Tune packages
pip install -U ultralytics "ray[tune]" optuna
# Optionally install and enable W&B for per-trial logging
pip install wandb
yolo settings wandb=TrueCách sử dụng#
from ultralytics import YOLO
# Tải model YOLO26n
model = YOLO("yolo26n.pt")
# Bắt đầu tinh chỉnh siêu tham số cho quá trình huấn luyện YOLO26n trên bộ dữ liệu COCO8
result_grid = model.tune(data="coco8.yaml", use_ray=True)Các tham số của phương thức tune()#
Phương thức tune() trong YOLO26 cung cấp giao diện dễ sử dụng để tinh chỉnh siêu tham số với Ray Tune. Phương thức này chấp nhận một số đối số cho phép bạn tùy chỉnh quá trình tinh chỉnh. Dưới đây là giải thích chi tiết về từng tham số:
| Tham số | Kiểu | Mô tả | Giá trị mặc định |
|---|---|---|---|
data | str or list | Tệp YAML dataset dùng để chạy tuner, chỉ định đường dẫn đến dữ liệu huấn luyện và validation cùng các cài đặt khác dành riêng cho dataset. Với bài toán phân loại, thay vào đó hãy cung cấp thư mục dataset hoặc tên dataset tích hợp sẵn (ví dụ: imagenet10). Nếu cung cấp danh sách, mỗi trial sẽ được huấn luyện trên từng dataset và báo cáo chỉ số trung bình của tác vụ. | |
space | dict, optional | Một từ điển xác định không gian tìm kiếm siêu tham số cho Ray Tune. Mỗi khóa tương ứng với tên một siêu tham số, còn giá trị xác định phạm vi giá trị cần khảo sát trong quá trình tinh chỉnh. Nếu không được cung cấp, YOLO26 sẽ sử dụng không gian tìm kiếm mặc định với nhiều siêu tham số. | |
grace_period | int, optional | Khoảng thời gian chờ tính theo epoch cho bộ lập lịch ASHA trong Ray Tune. Bộ lập lịch sẽ không dừng bất kỳ trial nào trước khi đạt số epoch này (giới hạn ở epochs). Không dùng với search_alg="bohb". | 10 |
gpu_per_trial | int, optional | Số lượng GPU Ray phân bổ cho mỗi lần thử. Đặt giá trị này một cách tường minh để sử dụng huấn luyện trên GPU; nếu bỏ qua, các lần thử sẽ không được cấp tài nguyên GPU. | None |
iterations | int, optional | Số lần thử tối đa cần chạy trong quá trình tinh chỉnh. Tham số này giúp kiểm soát tổng số tổ hợp siêu tham số được kiểm tra, đảm bảo quá trình tinh chỉnh không chạy vô thời hạn. | 300 |
search_alg | str or Searcher, optional | Chiến lược tìm kiếm Ray Tune cần sử dụng. Bạn có thể truyền trực tiếp đối tượng searcher của Ray hoặc dùng chuỗi được hỗ trợ như optuna, hyperopt, bayesopt, bohb, hebo, nevergrad, zoopt, ax hoặc random. Searcher dạng chuỗi tự động sử dụng metric tác vụ mặc định và mode="max". Mặc định là TPE đa biến của Optuna với các đề xuất có xét đến khả năng chạy song song. | "optuna" |
**train_args | dict, optional | Các đối số bổ sung cần truyền cho phương thức train() trong quá trình tinh chỉnh. Những đối số này có thể bao gồm các cài đặt như số epoch huấn luyện, batch size và các cấu hình khác dành riêng cho quá trình huấn luyện. | {} |
Bằng cách tùy chỉnh các tham số này, bạn có thể tinh chỉnh quy trình tối ưu hóa siêu tham số để đáp ứng nhu cầu cụ thể và phù hợp với tài nguyên tính toán hiện có.
Mô tả không gian tìm kiếm mặc định#
Bảng sau liệt kê các tham số trong không gian tìm kiếm mặc định để tinh chỉnh siêu tham số YOLO26 với Ray Tune. Mỗi tham số có một phạm vi giá trị cụ thể được xác định bởi tune.uniform(), ngoại trừ close_mosaic, tham số này sử dụng tune.randint().
| Tham số | Phạm vi | Mô tả |
|---|---|---|
lr0 | tune.uniform(1e-5, 1e-2) | Tốc độ học ban đầu, kiểm soát kích thước bước trong quá trình tối ưu hóa. Giá trị cao hơn giúp tăng tốc huấn luyện nhưng có thể gây mất ổn định. |
lrf | tune.uniform(0.01, 1.0) | Hệ số tốc độ học cuối, xác định mức giảm của tốc độ học vào cuối quá trình huấn luyện. |
momentum | tune.uniform(0.7, 0.98) | Hệ số momentum của optimizer, giúp tăng tốc huấn luyện và thoát khỏi các cực tiểu cục bộ. |
weight_decay | tune.uniform(0.0, 0.001) | Tham số regularization giúp ngăn overfitting bằng cách phạt các giá trị trọng số lớn. |
warmup_epochs | tune.uniform(0.0, 5.0) | Số epoch có tốc độ học tăng dần để ổn định giai đoạn đầu của quá trình huấn luyện. |
warmup_momentum | tune.uniform(0.0, 0.95) | Giá trị momentum ban đầu, tăng dần trong giai đoạn warmup. |
box | tune.uniform(1.0, 20.0) | Trọng số của thành phần loss bounding box, giúp cân bằng độ chính xác định vị của model. |
cls | tune.uniform(0.1, 4.0) | Trọng số của thành phần loss phân loại, giúp cân bằng độ chính xác dự đoán lớp của model. |
cls_pw | tune.uniform(0.0, 1.0) | Mức độ weighting cho lớp, từ tắt (0.0) đến weighting nghịch đảo tần suất đầy đủ (1.0). |
dfl | tune.uniform(0.4, 12.0) | Trọng số của thành phần hồi quy khoảng cách box, nhấn mạnh việc định vị bounding box chính xác. |
hsv_h | tune.uniform(0.0, 0.1) | Phạm vi augmentation sắc độ, tạo biến thiên màu sắc để giúp model khái quát hóa tốt hơn. |
hsv_s | tune.uniform(0.0, 0.9) | Phạm vi augmentation độ bão hòa, thay đổi cường độ màu để tăng độ bền vững. |
hsv_v | tune.uniform(0.0, 0.9) | Phạm vi augmentation giá trị (độ sáng), giúp model hoạt động tốt trong nhiều điều kiện ánh sáng. |
degrees | tune.uniform(0.0, 45.0) | Phạm vi augmentation xoay tính bằng độ, cải thiện khả năng nhận diện các đối tượng bị xoay. |
translate | tune.uniform(0.0, 0.9) | Phạm vi augmentation tịnh tiến, dịch chuyển ảnh theo chiều ngang và chiều dọc. |
scale | tune.uniform(0.0, 0.95) | Phạm vi augmentation tỷ lệ, mô phỏng các đối tượng ở những khoảng cách khác nhau. |
shear | tune.uniform(0.0, 10.0) | Phạm vi augmentation shear tính bằng độ, mô phỏng sự dịch chuyển phối cảnh. |
perspective | tune.uniform(0.0, 0.001) | Phạm vi augmentation phối cảnh, mô phỏng các thay đổi góc nhìn 3D. |
flipud | tune.uniform(0.0, 1.0) | Xác suất augmentation lật dọc, giúp tăng tính đa dạng của bộ dữ liệu. |
fliplr | tune.uniform(0.0, 1.0) | Xác suất augmentation lật ngang, hữu ích với các đối tượng đối xứng. |
bgr | tune.uniform(0.0, 1.0) | Xác suất augmentation hoán đổi kênh BGR, giúp tăng tính bất biến với màu sắc. |
mosaic | tune.uniform(0.0, 1.0) | Xác suất augmentation mosaic, kết hợp bốn ảnh thành một mẫu huấn luyện. |
mixup | tune.uniform(0.0, 1.0) | Xác suất augmentation Mixup, trộn hai ảnh cùng nhãn của chúng. |
cutmix | tune.uniform(0.0, 1.0) | Xác suất augmentation Cutmix, kết hợp các vùng ảnh trong khi vẫn giữ các đặc trưng cục bộ. |
copy_paste | tune.uniform(0.0, 1.0) | Ở chế độ flip, đây là tỷ lệ đối tượng đủ điều kiện được sao chép vào ảnh; ở chế độ mixup, tham số này còn là xác suất thực hiện thao tác. |
close_mosaic | tune.randint(0, 11) | Tắt mosaic trong N epoch cuối để ổn định quá trình huấn luyện trước khi hoàn tất. |
Ví dụ về không gian tìm kiếm tùy chỉnh#
Ví dụ này minh họa cách sử dụng không gian tìm kiếm tùy chỉnh để tinh chỉnh siêu tham số với Ray Tune và YOLO26. Bằng cách cung cấp không gian tìm kiếm tùy chỉnh, bạn có thể tập trung quá trình tinh chỉnh vào các siêu tham số cụ thể cần quan tâm.
from ray import tune
from ultralytics import YOLO
# Định nghĩa YOLO model
model = YOLO("yolo26n.pt")
# Chạy Ray Tune trên model
result_grid = model.tune(
data="coco8.yaml",
space={"lr0": tune.uniform(1e-5, 1e-2)},
epochs=50,
use_ray=True,
)Đoạn mã trên tạo một model YOLO từ các trọng số YOLO26n đã được huấn luyện trước, sau đó gọi phương thức tune() với cấu hình dataset coco8.yaml. Đoạn mã cung cấp không gian tìm kiếm tùy chỉnh cho tốc độ học ban đầu lr0 dưới dạng từ điển với khóa "lr0" và giá trị tune.uniform(1e-5, 1e-2). Cuối cùng, đoạn mã truyền trực tiếp các đối số huấn luyện bổ sung, chẳng hạn như số epoch, vào phương thức tune dưới dạng epochs=50.
Ví dụ về thuật toán tìm kiếm#
Bạn có thể chọn chiến lược tìm kiếm Ray Tune theo tên. Với các thuật toán tìm kiếm dạng chuỗi, Ultralytics sẽ tự động sử dụng metric tối ưu hóa mặc định của tác vụ hiện tại và mode="max". Nếu không cung cấp search_alg, Ultralytics sẽ sử dụng TPE đa biến của Optuna với các đề xuất có xét đến khả năng chạy song song.
from ultralytics import YOLO
# Định nghĩa YOLO model
model = YOLO("yolo26n.pt")
result_grid = model.tune(
data="coco8.yaml",
epochs=50,
search_alg="optuna",
use_ray=True,
)Nếu cần tùy chỉnh sampler của searcher hoặc ghi đè metric và chế độ tối ưu hóa, hãy truyền đối tượng searcher Ray Tune đã khởi tạo thay vì một chuỗi.
from ray.tune.search.optuna import OptunaSearch
from ultralytics import YOLO
# Định nghĩa YOLO model
model = YOLO("yolo26n.pt")
# Xác định searcher
searcher = OptunaSearch(
metric="metrics/mAP50-95(B)",
mode="max",
)
result_grid = model.tune(
data="coco8.yaml",
epochs=50,
search_alg=searcher,
use_ray=True,
)Tiếp tục phiên tinh chỉnh siêu tham số bị gián đoạn bằng Ray Tune#
Bạn có thể tiếp tục phiên Ray Tune bị gián đoạn bằng cách truyền resume=True. Tùy chọn, bạn có thể truyền thư mục name mà Ray Tune sử dụng thông qua runs/{task} để tiếp tục. Nếu không, phiên bị gián đoạn gần nhất sẽ được tiếp tục. Bạn không cần cung cấp lại iterations và space, nhưng cần cung cấp lại các đối số huấn luyện còn lại, bao gồm data và epochs.
from ultralytics import YOLO
# Định nghĩa YOLO model
model = YOLO("yolo26n.pt")
# Tiếp tục lượt chạy trước
results = model.tune(use_ray=True, data="coco8.yaml", epochs=50, resume=True)
# Tiếp tục lần chạy Ray Tune với tên 'tune_exp_2'
results = model.tune(use_ray=True, data="coco8.yaml", epochs=50, name="tune_exp_2", resume=True)Xử lý kết quả Ray Tune#
Sau khi chạy thử nghiệm tinh chỉnh siêu tham số bằng Ray Tune, bạn có thể muốn thực hiện nhiều phân tích khác nhau trên các kết quả thu được. Hướng dẫn này sẽ trình bày các quy trình phổ biến để xử lý và phân tích những kết quả đó.
Tải kết quả thử nghiệm Tune từ thư mục#
model.tune(use_ray=True) trả về một Ray ResultGrid và lưu thử nghiệm trong runs/{task}/tune, hoặc trong thư mục name mà bạn đã truyền. Để tải các kết quả đó sau khi script ban đầu đã thoát, hãy tiếp tục phiên; thao tác này khôi phục các lần thử đã lưu và trả về cùng ResultGrid:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
result_grid = model.tune(data="coco8.yaml", epochs=50, use_ray=True, resume=True)Phân tích cơ bản ở cấp thử nghiệm#
Xem tổng quan về kết quả của các lần thử. Bạn có thể nhanh chóng kiểm tra xem có lỗi nào xảy ra trong các lần thử hay không.
if result_grid.errors:
print("One or more trials failed!")
else:
print("No errors!")Phân tích cơ bản ở cấp lần thử#
Truy cập cấu hình siêu tham số của từng lần thử và các metric được báo cáo gần nhất.
for i, result in enumerate(result_grid):
print(f"Trial #{i}: Configuration: {result.config}, Last Reported Metrics: {result.metrics}")Vẽ biểu đồ toàn bộ lịch sử metric được báo cáo cho một lần thử#
Bạn có thể vẽ biểu đồ lịch sử metric được báo cáo cho từng lần thử để xem các metric thay đổi theo thời gian như thế nào.
import matplotlib.pyplot as plt
for i, result in enumerate(result_grid):
plt.plot(
result.metrics_dataframe["training_iteration"],
result.metrics_dataframe["metrics/mAP50-95(B)"],
label=f"Trial {i}",
)
plt.xlabel("Training Iterations")
plt.ylabel("mAP50-95")
plt.legend()
plt.show()Tóm tắt#
Trong hướng dẫn này, chúng tôi đã trình bày các quy trình phổ biến để phân tích kết quả thử nghiệm chạy với Ray Tune bằng Ultralytics. Các bước chính bao gồm tải kết quả thử nghiệm từ một thư mục, thực hiện phân tích cơ bản ở cấp thử nghiệm và cấp lần thử, cũng như vẽ biểu đồ metric.
Tìm hiểu thêm trong trang tài liệu Analyze Results của Ray Tune để khai thác tối đa các thử nghiệm tinh chỉnh siêu tham số.
Câu hỏi thường gặp#
Để tinh chỉnh siêu tham số của model Ultralytics YOLO26 bằng Ray Tune, hãy làm theo các bước sau:
-
Cài đặt các package cần thiết:
pip install -U ultralytics "ray[tune]" optuna pip install wandb # optional for logging yolo settings wandb=True -
Tải model YOLO26 và bắt đầu tinh chỉnh:
from ultralytics import YOLO # Nạp model YOLO26 model = YOLO("yolo26n.pt") # Bắt đầu tinh chỉnh với bộ dữ liệu COCO8 result_grid = model.tune(data="coco8.yaml", use_ray=True)
Cách này sử dụng chiến lược tìm kiếm và xử lý song song của Ray Tune để tối ưu hóa hiệu quả các siêu tham số của model.
-
Ultralytics YOLO26 sử dụng các siêu tham số mặc định sau khi tinh chỉnh với Ray Tune:
Tham số Khoảng giá trị Mô tả lr0tune.uniform(1e-5, 1e-2)Tốc độ học ban đầu lrftune.uniform(0.01, 1.0)Hệ số tốc độ học cuối momentumtune.uniform(0.7, 0.98)Momentum weight_decaytune.uniform(0.0, 0.001)Weight decay warmup_epochstune.uniform(0.0, 5.0)Epoch warmup boxtune.uniform(1.0, 20.0)Trọng số loss box clstune.uniform(0.1, 4.0)Trọng số loss lớp cls_pwtune.uniform(0.0, 1.0)Mức độ weighting cho lớp dfltune.uniform(0.4, 12.0)Trọng số loss khoảng cách box hsv_htune.uniform(0.0, 0.1)Phạm vi augmentation sắc độ translatetune.uniform(0.0, 0.9)Phạm vi augmentation tịnh tiến Bạn có thể tùy chỉnh các siêu tham số này để đáp ứng nhu cầu cụ thể. Để xem danh sách đầy đủ và biết thêm chi tiết, hãy tham khảo hướng dẫn Tinh chỉnh siêu tham số.
Để tích hợp Weights & Biases (W&B) vào quy trình tinh chỉnh Ultralytics YOLO26 của bạn:
-
Cài đặt W&B:
pip install wandb wandb login yolo settings wandb=True -
Chạy tuner:
from ultralytics import YOLO # Tải model YOLO model = YOLO("yolo26n.pt") # Mỗi lần thử Ray tạo một lượt chạy W&B riêng trong project này result_grid = model.tune(data="coco8.yaml", project="YOLO-Tuning", use_ray=True)
Thiết lập này cho phép bạn theo dõi quy trình tinh chỉnh, quản lý các cấu hình siêu tham số và trực quan hóa kết quả trong W&B.
-
Ray Tune mang lại nhiều ưu điểm cho việc tối ưu hóa siêu tham số:
- Chiến lược tìm kiếm nâng cao: Sử dụng các thuật toán như Tối ưu hóa Bayesian và HyperOpt để tìm kiếm tham số hiệu quả.
- Xử lý song song: Hỗ trợ thực thi song song nhiều lần thử, giúp tăng đáng kể tốc độ tinh chỉnh.
- Dừng sớm: Sử dụng các chiến lược như ASHA để sớm chấm dứt những lần thử có hiệu suất kém, tiết kiệm tài nguyên tính toán.
Ray Tune được tích hợp sẵn trong Ultralytics YOLO26 thông qua
model.tune(use_ray=True).Để xác định không gian tìm kiếm tùy chỉnh cho việc tinh chỉnh siêu tham số YOLO26 bằng Ray Tune:
from ray import tune from ultralytics import YOLO model = YOLO("yolo26n.pt") search_space = {"lr0": tune.uniform(1e-5, 1e-2), "momentum": tune.uniform(0.7, 0.98)} result_grid = model.tune(data="coco8.yaml", space=search_space, use_ray=True)Cách này tùy chỉnh phạm vi siêu tham số như tốc độ học ban đầu và động lượng để khám phá trong quá trình tinh chỉnh. Để xem các cấu hình nâng cao, hãy tham khảo phần Ví dụ về không gian tìm kiếm tùy chỉnh.
Bình luận40
Đặt câu hỏi, chia sẻ kết quả hoặc giúp đỡ người khác.
supriamir
Hi, I finish the hyperparameter tune, how to use the best parameter in best_hyperparameters.ymal for training?
Currently i manually use the manually copy the htperparameter.
model.train( data=str(dataset_yaml), epochs=epochs, imgsz=imgsz, batch=batch, project=project, name=f"fold_{k}", workers=0, patience=100, exist_ok=True, cache=False, device=0,
lr0= 0.00254, lrf= 0.02718, momentum= 0.83225, weight_decay= 0.001, warmup_epochs= 2.22741, warmup_momentum= 0.72834, box= 8.86345, cls= 0.52365, dfl= 0.45493, hsv_h= 0.01544, hsv_s= 0.44438, hsv_v= 0.37867, degrees= 0.01115, translate= 0.10045, scale= 0.33157, shear= 0.0075, perspective= 6.0e-05, flipud= 0.00882, fliplr= 0.34916, bgr= 9.0e-05, mosaic= 0.63841, mixup= 0.00099, cutmix= 0.00361, copy_paste= 0.00051, close_mosaic= 6, )
Glenn JocherUltralyticsYes — you can load
best_hyperparameters.yamland unpack it directly intomodel.train()instead of copying values by hand; see the Ray Tune integration guide and feel free to keep follow-ups here in Discussions so the Ultralytics team can see them.from pathlib import Path import yaml from ultralytics import YOLO model = YOLO("yolo26n.pt") hyp_path = Path("runs/detect/tune/best_hyperparameters.yaml") with hyp_path.open() as f: hyp = yaml.safe_load(f) model.train( data=str(dataset_yaml), epochs=epochs, imgsz=imgsz, batch=batch, project=project, name=f"fold_{k}", workers=0, patience=100, exist_ok=True, cache=False, device=0, **hyp, )1
Emeyer87
Hello,
I've noticed that every Iteration with use_ray = True is downloading yolo11n.pt. I'm attempting to use this on an existing instance segmentation model I built but wanted to ensure the tuning is running against the model I've assigned, and not a fresh Detection model.
from ultralytics import YOLO from ray import tune
model_path = r"C:/Users/Me/Downloads/NashvilleSegmentation.pt" data_path = r"C:/Users/Me/Downloads/dataset/data.yaml" model=YOLO(model_path)
search_space = { "degrees": tune.uniform(0.0, 12.0) }
results = model.tune( data=data_path, epochs=20, # keep it tiny iterations=20, # exactly one trial optimizer="AdamW", space=search_space, device=0, seed=0, workers=2, amp=True, batch=16, patience=12, plots=False, save=False, project="test_tune", name="degrees_tune_01", lr0=0.00114, use_ray=True, gpu_per_trial=1
)
Emeyer87
Disregard...completely misunderstood what tuning was actually doing.
Glenn JocherUltralyticsGlad it’s sorted—quick tip: to tune your existing segmentation model, load your .pt first (model = YOLO("path/to/your.pt")) and then run model.tune(..., use_ray=True); Ray trials will reuse that same model/task—verify in the logs that task=segment.
Fatima-khanjar
Subject: Questions Regarding Using Ray Tune for YOLOv11 Hyperparameter Tuning
Hello!
I hope this message finds you well.
#hyperparameter tuning using tune() from ray import tune from ray.tune import ResultGrid from ray.tune.examples.mnist_pytorch import train_mnist from ultralytics import YOLO import os import torch import matplotlib.pyplot as plt # Define a YOLO model model = YOLO("yolo11s.pt").to('cuda') tune_dir = 'ray_results' os.makedirs(tune_dir, exist_ok=True) # Tune hyperparameters using ray tune result_grid = model.tune( data= "data.yaml", epochs=10, iterations=10, batch = 16, device = 0, workers=0, use_ray=True, gpu_per_trial =1, name = "tuning", project = tune_dir ) Now, load the results after the tuning experiment is finished exp_name = "tuning" experiment_path = f"{tune_dir}/{exp_name}" # Get the name of the experiment print(f"Loading results from {experiment_path}...") restored_tuner = tune.Tuner.restore(experiment_path, trainable=train_mnist) result_grid = restored_tuner.get_results() # Basic Experiment-Level Analysis: Check for errors if result_grid.errors: print("One or more trials failed!") else: print("No errors!") # Basic Trial-Level Analysis: Print configurations and last reported metrics for each trial for i, result in enumerate(result_grid): print(f"Trial #{i}: Configuration: {result.config}, Last Reported Metrics: {result.metrics}") # Plotting the Entire History of Reported Metrics for a Trial # Assuming "mean_accuracy" is part of the metrics for i, result in enumerate(result_grid): plt.plot( result.metrics_dataframe["training_iteration"], result.metrics_dataframe["mean_accuracy"], # Modify this depending on your metrics label=f"Trial {i}", ) plt.xlabel("Training Iterations") plt.ylabel("Mean Accuracy") plt.legend() plt.show()
#hyperparameter tuning using tuner.fit() import os from ray import tune from ray.tune import ResultGrid from ray.tune.examples.mnist_pytorch import train_mnist from ray.tune import Result from pathlib import Path tune_dir = Path("ray_results").resolve().as_uri() exp_name = "tune_analyzing_results" tuner = tune.Tuner( trainable=train_mnist, param_space={ "lr": tune.uniform(0.001, 0.1), "momentum": tune.uniform(0.1, 0.9), }, run_config=tune.RunConfig( name=exp_name, stop={"training_iteration": 100}, checkpoint_config=tune.CheckpointConfig( checkpoint_score_attribute="mean_accuracy", num_to_keep = 5, ), storage_path=tune_dir, ), tune_config=tune.TuneConfig(mode="max", metric="mean_accuracy", num_samples=3), ) result_grid: ResultGrid = tuner.fit() experiment_path = os.path.join(tune_dir, 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() # Check if there have been errors if result_grid.errors: print("One of the trials failed!") else: print("No errors!") num_results = len(result_grid) print("Number of results:", num_results) # Iterate over results for i, result in enumerate(result_grid): if result.error: print(f"Trial #{i} had an error:", result.error) continue print( f"Trial #{i} finished successfully with a mean accuracy metric of:", result.metrics["mean_accuracy"] ) results_df = result_grid.get_dataframe() results_df[["training_iteration", "mean_accuracy"]] print("Shortest training time:", results_df["time_total_s"].min()) print("Longest training time:", results_df["time_total_s"].max()) best_result_df = result_grid.get_dataframe( filter_metric="mean_accuracy", filter_mode="max" ) best_result_df[["training_iteration", "mean_accuracy"]] # Get the result with the maximum test set `mean_accuracy` best_result: Result = result_grid.get_best_result() # Get the result with the minimum `mean_accuracy` worst_performing_result: Result = result_grid.get_best_result( metric="mean_accuracy", mode="min" ) best_result.config best_result.path # Get the last Checkpoint associated with the best-performing trial best_result.checkpoint # Get the last reported set of metrics best_result.metrics result_df = best_result.metrics_dataframe result_df[["training_iteration", "mean_accuracy", "time_total_s"]] best_result.metrics_dataframe.plot("training_iteration", "mean_accuracy") ax = None for result in result_grid: label = f"lr={result.config['lr']:.3f}, momentum={result.config['momentum']}" if ax is None: ax = result.metrics_dataframe.plot("training_iteration", "mean_accuracy", label=label) else: result.metrics_dataframe.plot("training_iteration", "mean_accuracy", ax=ax, label=label) ax.set_title("Mean Accuracy vs. Training Iteration for All Trials") ax.set_ylabel("Mean Test Accuracy")
I have been following your guide on using Ray Tune for hyperparameter tuning with YOLOv11. I was able to run the experiment using the use_ray=True argument, and it worked successfully—thank you for the helpful explanation!
However, I still have a few questions and points of confusion:
-
Naming the Trials: How can I change or customize the names of the individual trials when using model.tune(..., use_ray=True)? Right now, the trials are auto-named, and I’d like more meaningful names to help keep track of different configurations.
-
Retrieving the Best Hyperparameters: After the tuning process is complete, I would like to extract the best hyperparameter configuration to reuse it for future training. I noticed in other examples (e.g., train_mnist) that you use tuner.fit() to retrieve and analyze results, including the best configuration. So my question is: when using model.tune() directly (as in the case of YOLOv11), is there a method to extract the best hyperparameters without using tuner.fit()? Or is it necessary to re-structure the experiment using tune.Tuner to get access to that kind of detailed analysis?
-
Using tune.Tuner() with YOLOv11: In your other examples, the tuning process is managed using tune.Tuner(...), but I’m not sure how to apply this approach to YOLOv11, since there’s no explicit trainable function like train_mnist. Should we always use model.tune() for YOLO models, or is there a way to integrate YOLOv11 into a Tuner workflow for more advanced customization and analysis?
Thank you so much for your time and support! I would really appreciate any clarification or guidance on these points.
Best regards,
Glenn JocherUltralytics@Fatima-khanjar Thank you for your detailed questions about Ray Tune integration with YOLO11!
-
Naming Trials: Currently, the high-level
model.tune()API doesn't provide direct control over individual trial naming. Ray Tune automatically generates these names. You can use thenameparameter to name the overall experiment (as you've done with "tuning"), but individual trial names remain auto-generated. -
Retrieving Best Hyperparameters: When using
model.tune()with Ray Tune, the best hyperparameters are automatically saved toruns/[task]/tune/best_hyperparameters.yaml. This file contains the optimal configuration and can be loaded for future use. You can also examinetune_results.csvfor all trial results. -
Using tune.Tuner(): While possible, creating a custom trainable function for YOLO with the low-level Ray Tune API requires more work. You'd need to wrap the YOLO training process in a function that configures and trains the model while reporting metrics to Ray Tune. For most users, the high-level
model.tune()API is recommended as it handles this integration automatically.
For more advanced customization, you might consider extending the Ray Tune integration in Ultralytics by referring to the source code in the
ultralytics/utils/tuner.pyfile.-
Fatima-khanjar
Hello! Thank you for your clarification. I will continue using model.tune() and use the following line to retrieve the best hyperparameters, since the best_hyperparameters.yaml file wasn’t automatically saved in the output directory of the Ray tuning:
best_config = analysis.get_best_config(metric="metrics/mAP50(B)",mode="max")`I have a question: I read that Optuna uses the TPE (Tree-structured Parzen Estimator) search algorithm, which is more powerful than the default search algorithms in Ray Tune. Since Ray Tune provides scalability and distributed tuning, is it possible to combine both—using Optuna’s TPE algorithm with Ray Tune while still calling model.tune()? If so, how can I integrate them?
I also have another question that’s unrelated. I noticed that YOLOv11 comes in different versions, from n to xl. I understand that the choice depends on the dataset size and the task complexity. But what are the actual criteria used to determine the complexity of a task?
best regrads,
Glenn JocherUltralytics@Fatima-khanjar
Regarding using TPE with Ray Tune - yes, it's possible! Ray Tune already supports TPE through the HyperOpt integration. You can use it by installing the HyperOpt package and specifying the search algorithm:
pip install hyperopt from ray.tune.search.hyperopt import HyperOptSearch from ray.tune.search import ConcurrencyLimiter hyperopt_search = HyperOptSearch(metric="metrics/mAP50(B)", mode="max") limited_search = ConcurrencyLimiter(hyperopt_search, max_concurrent=4) # Then in your model.tune() call model.tune( data="data.yaml", search_alg=limited_search, use_ray=True, # other parameters )For your question about YOLO11 model size selection, the criteria typically include:
- Computational resources: Larger models (l, x, xl) require more GPU memory and processing power
- Dataset complexity: More complex datasets with small/numerous objects benefit from larger models
- Inference speed requirements: Smaller models (n, s) offer faster inference for real-time applications
- Accuracy needs: Larger models generally provide higher accuracy at the cost of speed
You can check the performance trade-offs in the Ultralytics documentation to make an informed decision based on your specific constraints.
1Fatima-khanjar(đã chỉnh sửa)
Hello, I hope this message finds you well.
I followed your instructions to integrate Ray Tune with the TPE algorithm using HyperOpt:
hyperopt_search = HyperOptSearch(metric="metrics/mAP50(B)", mode="max") limited_search = ConcurrencyLimiter(hyperopt_search, max_concurrent=1)Then, I used the following code to tune hyperparameters with Ray Tune:
tuning_results = model.tune( data="data.yaml", epochs=50, # Number of epochs for each tuning iteration iterations=100, # Total number of tuning iterations batch=16, device=0, workers=0, grace_period=30, search_alg=limited_search, use_ray=True, gpu_per_trial=1, project=tune_dir )However, I encountered a syntax error: SyntaxError: 'search_alg' is not a valid YOLO argument. Could you please advise me on how to fix this?
I have another question regarding the output directory of Ray Tune. It shows that inside the runs folder, there are subfolders named train (equal to the number of iterations) and a tune folder that contains subdirectories also equal to the number of iterations.
My question is: should I focus on the train directories? Why are they generated, and what's their purpose?
Also, if I want to monitor the overall progress of the fine-tuning process — for example, in genetic tuning, we usually look at a graph of the fitness score vs. iteration — where should I look for that kind of visualization or information?
best regards,
Glenn JocherUltralytics(đã chỉnh sửa)@Fatima-khanjar
Regarding your issues with HyperOptSearch and Ray Tune integration:
-
The
search_algargument is passed throughmodel.tune(use_ray=True). It defaults to"optuna"(TPE) and accepts either a string (such as"optuna","hyperopt","bohb"or"random") or a Ray Tune searcher instance like yourHyperOptSearch, so you do not need to modifyultralytics/utils/tuner.py. -
About the directory structure:
- The
traindirectories (train1, train2, etc.) contain individual training runs for each trial with different hyperparameter sets - The
tunedirectory contains the aggregated results of all trials and should be your primary focus
- The
-
For monitoring progress:
- Check
tune/tune_results.csvfor all trial results - Look for
tune/best_fitness.pngwhich shows fitness score progression over iterations tune/best_hyperparameters.yamlcontains the optimal configuration found
- Check
The plots in the
tunedirectory (especiallytune_scatter_plots.pngif available) provide valuable visualizations of the hyperparameter search space and how different parameters affected model performance.-
-
Fatima-khanjar
Hello!
I hope this message finds you well.I'm trying to use Ray Tune for hyperparameter optimization with the following code:
results = model.tune( data="data.yaml", epochs=30, iterations=150, batch=16, optimizer="AdamW", plots=False, save=False, val=False, device=0, workers=8, use_ray=True, project="ray_results" )However, I'm getting a path-related error that I can't figure out:
FileNotFoundError: [WinError 3] The system cannot find the path specified...It seems to be related to the length of the path Ray is trying to create. Do you know how I can fix this?
Also, I have a question. I came across Ray Tune while working with Genetic Algorithms, and I was wondering: would you recommend using Ray Tune or Genetic Algorithms for hyperparameter optimization? Are they similar in how they work, or are there major differences between them? What advantages does Ray Tune offer over Genetic Algorithms?
Thank you for your help!
Fatima-khanjar
Hello Community!!
Just following up on my own post — I managed to solve the issue on Windows 11.
Here’s what worked for me:
- Opened gpedit.msc as Administrator
- Navigated to: Computer Configuration > Administrative Templates > System > Filesystem
- Enabled the setting “Enable Win32 long paths"
After doing this, the problem was resolved.
Posting this in case it helps someone else!
Glenn JocherUltralytics@Fatima-khanjar Thank you for sharing your solution to the Windows path length issue! This is helpful information that could benefit other users experiencing similar problems.
Regarding your question about Ray Tune versus Genetic Algorithms: They're different approaches to hyperparameter optimization. Ray Tune offers several advantages including:
- Multiple search strategies beyond genetic algorithms (Bayesian optimization, grid search, random search)
- Built-in parallel execution that efficiently utilizes available resources
- Early stopping via ASHA scheduler to terminate underperforming trials
- Distributed computing capabilities for scaling across multiple machines
Ultralytics actually supports both approaches - the internal tuner uses genetic algorithms focusing on mutation, while the Ray Tune integration provides more advanced search strategies and better parallelization. Ray Tune is generally recommended for more complex search spaces and when you have multiple GPUs available.
1
wisrovi
como lo combino con MLFlow?
wisrovi
tambien necesito:
model.add_callback("on_train_start", self.on_train_start) model.add_callback("on_train_end", self.on_train_end)
pero dichas funciones no se disparan
wisrovi
agradezco mucho sus valiosas aportaciones, de verdad que es una funcionalidad increible y magnifica
Glenn JocherUltralytics@wisrovi to integrate MLFlow with Ultralytics YOLO hyperparameter tuning, you'll need to create a custom Ray Tune reporter that logs metrics to MLFlow. While we don't have native MLFlow integration like Weights & Biases, you can implement it by adding MLFlow logging callbacks to your tuning script. The Ray Tune documentation provides guidance on MLFlow integration that you can adapt for YOLO workflows.
NegroAmigo
Which versions of YOLO are supported by Ray Tune? I have project with YOLOv8, will it be suitable to use with Ray Tune?
Glenn JocherUltralytics@NegroAmigo yes, YOLOv8 fully supports Ray Tune integration for hyperparameter tuning. You can use the same
model.tune()method shown in our Ray Tune integration guide by simply loading your YOLOv8 model (YOLO('yolov8n.pt')). The tuning process works identically across supported YOLO versions. For implementation details, see the Ultralytics Ray Tune documentation.
alifazeli00
Why is there no mention of beta 2(Adamw) in ultralithic documents?
Glenn JocherUltralytics@alifazeli00 the documentation currently focuses on the default hyperparameters and their tuning ranges. If you're looking for specific details on beta2 for AdamW, it might not be explicitly covered. For more information on hyperparameter tuning, you can explore the Ray Tune documentation linked in the guide.
alifazeli00
thank you, It has been mentioned that momentum is essentially beta1. Is this the same for beta2?
Glenn JocherUltralyticsBeta2 is not explicitly mentioned in the documentation as it typically defaults to 0.999 in AdamW, which is a common standard setting. For specific adjustments, you may need to modify the optimizer settings directly in your training script.
1
sirtris
Hi, you mention that the
.tune()function integrates well with wandb. Are there any plans to make it work with mlflow as well? When I try to use it now no model metric, parameters or artifacts, etc. are logged. It would also be nice to have one hyperparameter sweep as a parent run and the individual runs as child runs of that parent run. Best,
Glenn JocherUltralytics@sirtris currently, there are no plans to integrate the
.tune()function with MLflow, but we appreciate your feedback and will consider it for future updates.sirtris
Could you point me to some resources so I could maybe look into it doing it myself?
Glenn JocherUltralyticsFor resources on integrating MLflow with Ray Tune, I recommend checking the Ray Tune documentation for any updates or community contributions. This might provide insights into logging metrics and managing runs with MLflow.
sachmatkris
unfortunately that is not the issue because the results are exactly the same for different learning rates - impossible.
On Fri, 27 Sept 2024 at 19:06, Glenn Jocher @.***> wrote:
@sachmatkris https://github.com/sachmatkris it seems like the issue might be with the search space configuration. Ensure that the hyperparameters have enough variability and that the dataset path is correctly set. If the problem persists, consider adjusting the search space or reviewing the dataset configuration. For more details, you can refer to the Ray Tune documentation https://docs.ultralytics.com/integrations/ray-tune/.
— Reply to this email directly, view it on GitHub https://github.com/orgs/ultralytics/discussions/16505#discussioncomment-10777716, or unsubscribe https://github.com/notifications/unsubscribe-auth/A3WH6HFTKYE2WLTJVGR6HWTZYV7A5AVCNFSM6AAAAABO5HD4QCVHI2DSMVQWIX3LMV43URDJONRXK43TNFXW4Q3PNVWWK3TUHMYTANZXG43TCNQ . You are receiving this because you were mentioned.Message ID: @.*** com>
Glenn JocherUltralytics@sachmatkris if you're seeing identical results for different learning rates, it might be worth checking the hyperparameter search space and ensuring the dataset configuration is correct. Adjusting these settings could help resolve the issue. For further guidance, please refer to the Ray Tune documentation.
sachmatkris
I found out the issue was setting device = 0 in the model.tune() and specifying absolute path for the .data.yaml, which is not the same what YOLO does when started from within an opened folder on VScode.
sachmatkris(đã chỉnh sửa)
@sachmatkris it seems like you've identified the issue with the device setting and path specification. If you need further assistance, feel free to ask!
Another issue I have is using the following call all of my experiments with ray_tune return the same metrics:
search_space = { 'lr0': tune.loguniform(1e-5, 1e-1), 'momentum': tune.uniform(0.6, 0.95), }result_grid = model.tune(data = 'C:/Users/Kristijonas/Desktop/Mokslo šaknys karčios/AI/Projects/masinu_numeriai/formated_dataset_new/data.yaml', imgsz = 1280, space = search_space, batch = 16, epochs = 50, patience = 5, use_ray = True, iterations = 20, device='cuda' )e.g.
Glenn JocherUltralytics@sachmatkris it seems like the issue might be with the search space configuration. Ensure that the hyperparameters have enough variability and that the dataset path is correctly set. If the problem persists, consider adjusting the search space or reviewing the dataset configuration. For more details, you can refer to the Ray Tune documentation.