Возобновление и итерации
Точно возобнови прерванный запуск, начни новый раунд с best.pt и задай рабочую скорость обучения, а затем сравни запуски рядом.
Реальные проекты состоят из серии запусков обучения. Некоторые прерываются на полпути — из-за закрытого ноутбука, обрыва SSH-соединения или отзыва облачного GPU, — и перезапуск с нуля означает потерю нескольких часов работы. Другие запуски завершаются, и следующий раунд должен опираться на их результаты, а не начинаться заново с COCO.
В этом уроке ты прервёшь запуск и возобновишь его, начнёшь второй раунд с best.pt, задав действительно применяемую скорость обучения, и сравнишь все запуски в одной таблице. Ты также узнаешь о двух особенностях работы resume, из-за которых незаметно теряются ресурсы.
Практические занятия
Выбери подходящий тип запуска#

| Ситуация | Тип запуска | Начинает с |
|---|---|---|
| Отключение электричества, потеря соединения или нехватка памяти посреди запуска | Возобновление | last.pt вместе с состоянием оптимизатора и расписанием обучения |
| Запуск завершён; добавлены данные, исправлена разметка или требуется более длительное обучение | Дообучение с хороших весов | best.pt в качестве предобученной модели |
Добавлены или удалены классы, изменена большая часть разметки или существенно изменился imgsz | Запуск с нуля | yolo26n.pt |
Пример: возобновление прерванного запуска#
resume=True восстанавливает модель, состояние оптимизатора, расписание скорости обучения и счётчик эпох из last.pt, а затем продолжает выполнение исходного плана:
yolo train resume=True model=runs/detect/pills_resume/weights/last.ptРеальный вывод запуска на 5 эпох, остановленного после второй эпохи:
Resuming training runs/detect/pills_resume/weights/last.pt from epoch 3 to 5 total epochs
3/5 0G 1.232 2.393 0.005478 206 320: 100% 6/6 4.5s
4/5 0G 1.345 1.859 0.005833 208 320: 100% 6/6 4.5s
5/5 0G 1.31 1.625 0.005854 191 320: 100% 6/6 4.4s
3 epochs completed in 0.004 hours.from epoch 3 to 5 total epochs: запуск продолжился точно с момента последней сохранённой эпохи, с первоначальным целевым числом эпох.- Ты не передавал
dataилиepochs: все аргументы были взяты из контрольной точки. Некоторые параметры среды выполнения, напримерbatch,deviceиworkers, можно переопределить при возобновлении; остальные игнорируются с предупреждениемResume ignores ....
Пример: дообучение во втором раунде#
Большинство экспериментов в духе «следующего раунда» — это не возобновление, а новые запуски с последней удачной моделью: обычное переносное обучение в рамках собственного проекта. Задай более низкую скорость обучения, чтобы модель уточняла знания, а не училась заново:
from ultralytics import YOLO
model = YOLO("runs/detect/pills_v1/weights/best.pt") # начать с весов первого раунда
model.train(
data="my_dataset/data.yaml",
epochs=5,
imgsz=320,
optimizer="AdamW", # задать явно: optimizer="auto" игнорирует lr0
lr0=0.0005, # ниже, чем автоматически выбранное значение 0.002 в первом раунде
name="pills_v2_warm",
)В журнале подтверждается, что настройка применена: optimizer: AdamW(lr=0.0005, momentum=0.937). В руководстве по тонкой настройке описаны заморозка слоёв и двухэтапное обучение; в руководстве по настройке гиперпараметров — поиск по сетке.
Пример: сравнение запусков#
Называй каждый запуск по внесённому изменению — pills_v2_warm, pills_v3_imgsz640, pills_v4_edge_frames, — а не train2 или final. Каждый запуск сохраняет results.csv, поэтому для сравнения хватит нескольких строк:
from pathlib import Path
import pandas as pd
for csv in sorted(Path("runs/detect").glob("*/results.csv")):
df = pd.read_csv(csv)
best = df["metrics/mAP50-95(B)"].max()
print(f"{csv.parent.name:<14} epochs={len(df):<3} best mAP50-95={best:.3f}")pills_resume epochs=5 best mAP50-95=0.579
pills_v1 epochs=10 best mAP50-95=0.659
pills_v2_warm epochs=5 best mAP50-95=0.694Пять эпох дообучения с хороших весов повысили mAP50-95 с 0.659 до 0.694, тогда как пять эпох с весами COCO (pills_resume) дали лишь 0.579. Дообучение с хороших весов — более быстрый путь к улучшению, если классы и разметка не изменились. После нескольких запусков начинает окупаться система отслеживания экспериментов: Ultralytics Platform (см. Сравнение запусков и выбор лучшего) или интеграции с Comet и Weights & Biases автоматически регистрируют каждый запуск.
Сократи затраты на каждый раунд#
Большинство раундов отвечают на один вопрос, например: «помогли ли новые кадры?». Эти аргументы ускорят получение ответов на этапе экспериментов:
| Аргумент | Пример | Эффект |
|---|---|---|
fraction | fraction=0.5 | Обучает модель на первой половине обучающих изображений (отсортированных по имени файла) |
time | time=0.25 | Останавливает запуск через 0.25 часа, переопределяя epochs |
patience | patience=10 | Останавливает запуск, если качество на валидации не улучшалось в течение 10 эпох |
imgsz | imgsz=320 | Использует вчетверо меньше пикселей, чем размер 640; сравнивай запуски только при одинаковом размере |
cache | cache=True | Сохраняет декодированные изображения в RAM, чтобы ускорить их загрузку в следующих эпохах |
Меняй по одному параметру за раунд и проверь лучший вариант на полном размере перед выпуском. Если понадобится начать с нуля, используй тот же вызов, указав предобученные веса:
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # вернуться к весам, предобученным на COCO
model.train(data="my_dataset/data.yaml", epochs=10, imgsz=320, name="pills_v3_relabeled")Избегай этих ошибок#
Симптом: WARNING ⚠️ model '.../last.pt' is not a resumable training checkpoint ... Starting new training instead, за которым следует совершенно новый запуск — на датасете coco8 по умолчанию, если ты не передал data. Причина: resume=True продолжает только запуски, остановленные раньше времени. Решение: останови его и намеренно начни новый запуск с best.pt.
Симптом: optimizer: 'optimizer=auto' found, ignoring 'lr0=0.0005' and determining best 'optimizer' and 'lr0' automatically... Причина: optimizer=auto по умолчанию выбирает собственную скорость обучения. Решение: явно задай optimizer (например, "AdamW" или "SGD"), если задаёшь lr0, и проверь строку журнала optimizer:.
Повторный запуск обучения с name="pills_v1" запишет результаты в pills_v1-2, и впоследствии их будет легко перепутать. Используй для каждого запуска новое описательное имя.
Показать решение
Если на быстром компьютере сложно поймать момент для Ctrl+C, callback может остановить запуск после 2-й эпохи:
from ultralytics import YOLO
def power_cut(trainer):
if trainer.epoch == 1: # Индексация с нуля: остановить после сохранения 2-й эпохи
raise KeyboardInterrupt
model = YOLO("yolo26n.pt")
model.add_callback("on_model_save", power_cut)
model.train(data="my_dataset/data.yaml", epochs=5, imgsz=320, name="pills_resume")yolo train resume=True model=runs/detect/pills_resume/weights/last.pt
python round2.py
python compare_runs.pypills_v2_warm has the best mAP50-95 (0.694 vs 0.659 for pills_v1), with the same
classes and labels, so round three warm-starts from pills_v2_warm/weights/best.pt.