`ultralytics 8.0.86` HUB resume, Classify train and RayTune fixes (#2200)

Co-authored-by: Ayush Chaurasia <ayush.chaurarsia@gmail.com>
main
Glenn Jocher 1 year ago committed by GitHub
parent 283e334bd4
commit 3d60347755
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 19
      docs/build_reference.py
  2. 4
      docs/reference/hub/utils.md
  3. 1
      docs/usage/hyperparameter_tuning.md
  4. 1
      mkdocs.yml
  5. 2
      ultralytics/__init__.py
  6. 11
      ultralytics/hub/utils.py
  7. 1
      ultralytics/yolo/engine/trainer.py
  8. 36
      ultralytics/yolo/utils/__init__.py
  9. 1
      ultralytics/yolo/utils/tuner.py
  10. 2
      ultralytics/yolo/v8/classify/train.py

@ -10,8 +10,11 @@ import os
import re
from collections import defaultdict
from pathlib import Path
from ultralytics.yolo.utils import ROOT
TARGET_DIR = Path('..')
NEW_YAML_DIR = ROOT.parent
CODE_DIR = ROOT
REFERENCE_DIR = ROOT.parent / 'docs/reference'
def extract_classes_and_functions(filepath):
@ -38,7 +41,7 @@ def create_markdown(py_filepath, module_path, classes, functions):
with open(md_filepath, 'w') as file:
file.write(md_content)
return md_filepath.relative_to(TARGET_DIR)
return md_filepath.relative_to(NEW_YAML_DIR)
def nested_dict():
@ -77,26 +80,22 @@ def create_nav_menu_yaml(nav_items):
yaml_str += f"{indent}- {k}: {str(v).replace('docs/', '')}\n"
return yaml_str
with open(TARGET_DIR / 'nav_menu_updated.yml', 'w') as file:
with open(NEW_YAML_DIR / 'nav_menu_updated.yml', 'w') as file:
yaml_str = _dict_to_yaml(nav_tree_sorted)
file.write(yaml_str)
def main():
source_dir = Path("../ultralytics")
target_dir = Path("reference")
nav_items = []
for root, _, files in os.walk(source_dir):
for root, _, files in os.walk(CODE_DIR):
for file in files:
if file.endswith(".py") and file != "__init__.py":
py_filepath = Path(root) / file
classes, functions = extract_classes_and_functions(py_filepath)
if classes or functions:
py_filepath_rel = py_filepath.relative_to(source_dir)
md_filepath = target_dir / py_filepath_rel
py_filepath_rel = py_filepath.relative_to(CODE_DIR)
md_filepath = REFERENCE_DIR / py_filepath_rel
module_path = f"ultralytics.{py_filepath_rel.with_suffix('').as_posix().replace('/', '.')}"
md_rel_filepath = create_markdown(md_filepath, module_path, classes, functions)
nav_items.append(str(md_rel_filepath))

@ -1,6 +1,6 @@
# Traces
# Events
---
:::ultralytics.hub.utils.Traces
:::ultralytics.hub.utils.Events
<br><br>
# request_with_credentials

@ -70,7 +70,6 @@ The following table lists the default search space parameters for hyperparameter
| warmup_momentum | `tune.uniform(0.0, 0.95)` | Warmup momentum |
| box | `tune.uniform(0.02, 0.2)` | Box loss weight |
| cls | `tune.uniform(0.2, 4.0)` | Class loss weight |
| fl_gamma | `tune.uniform(0.0, 2.0)` | Focal loss gamma |
| hsv_h | `tune.uniform(0.0, 0.1)` | Hue augmentation range |
| hsv_s | `tune.uniform(0.0, 0.9)` | Saturation augmentation range |
| hsv_v | `tune.uniform(0.0, 0.9)` | Value (brightness) augmentation range |

@ -200,6 +200,7 @@ nav:
- comet: reference/yolo/utils/callbacks/comet.md
- hub: reference/yolo/utils/callbacks/hub.md
- mlflow: reference/yolo/utils/callbacks/mlflow.md
- neptune: reference/yolo/utils/callbacks/neptune.md
- raytune: reference/yolo/utils/callbacks/raytune.md
- tensorboard: reference/yolo/utils/callbacks/tensorboard.md
- wb: reference/yolo/utils/callbacks/wb.md

@ -1,6 +1,6 @@
# Ultralytics YOLO 🚀, AGPL-3.0 license
__version__ = '8.0.85'
__version__ = '8.0.86'
from ultralytics.hub import start
from ultralytics.yolo.engine.model import YOLO

@ -2,6 +2,7 @@
import os
import platform
import random
import sys
import threading
import time
@ -147,7 +148,7 @@ class Events:
disabled when sync=False. Run 'yolo settings' to see and update settings YAML file.
Attributes:
url (str): The GA4 Measurement Protocol URL.
url (str): The URL to send anonymous events.
rate_limit (float): The rate limit in seconds for sending events.
metadata (dict): A dictionary containing metadata about the environment.
enabled (bool): A flag to enable or disable Events based on certain conditions.
@ -165,9 +166,11 @@ class Events:
self.metadata = {
'cli': Path(sys.argv[0]).name == 'yolo',
'install': 'git' if is_git_dir() else 'pip' if is_pip_package() else 'other',
'python': platform.python_version(),
'python': '.'.join(platform.python_version_tuple()[:2]), # i.e. 3.10
'version': __version__,
'env': ENVIRONMENT}
'env': ENVIRONMENT,
'session_id': round(random.random() * 1E15),
'engagement_time_msec': 1000}
self.enabled = \
SETTINGS['sync'] and \
RANK in (-1, 0) and \
@ -180,7 +183,7 @@ class Events:
Attempts to add a new event to the events list and send events if the rate limit is reached.
Args:
cfg: The configuration object containing mode and task information.
cfg (IterableSimpleNamespace): The configuration object containing mode and task information.
"""
if not self.enabled:
# Events disabled, do nothing

@ -281,6 +281,7 @@ class BaseTrainer:
if self.args.close_mosaic:
base_idx = (self.epochs - self.args.close_mosaic) * nb
self.plot_idx.extend([base_idx, base_idx + 1, base_idx + 2])
epoch = self.epochs # predefine for resume fully trained model edge cases
for epoch in range(self.start_epoch, self.epochs):
self.epoch = epoch
self.run_callbacks('on_train_epoch_start')

@ -605,11 +605,35 @@ def threaded(func):
def set_sentry():
"""
Initialize the Sentry SDK for error tracking and reporting if pytest is not currently running.
Initialize the Sentry SDK for error tracking and reporting. Enabled when sync=True in settings and
disabled when sync=False. Run 'yolo settings' to see and update settings YAML file.
Conditions required to send errors:
- sync=True in YOLO settings
- pytest is not running
- running in a pip package installation
- running in a non-git directory
- running with rank -1 or 0
- online environment
- CLI used to run package (checked with 'yolo' as the name of the main CLI command)
The function also configures Sentry SDK to ignore KeyboardInterrupt and FileNotFoundError
exceptions and to exclude events with 'out of memory' in their exception message.
Additionally, the function sets custom tags and user information for Sentry events.
"""
def before_send(event, hint):
"""A function executed before sending the event to Sentry."""
"""
Modify the event before sending it to Sentry based on specific exception types and messages.
Args:
event (dict): The event dictionary containing information about the error.
hint (dict): A dictionary containing additional information about the error.
Returns:
dict: The modified event or None if the event should not be sent to Sentry.
"""
if 'exc_info' in hint:
exc_type, exc_value, tb = hint['exc_info']
if exc_type in (KeyboardInterrupt, FileNotFoundError) \
@ -628,19 +652,19 @@ def set_sentry():
Path(sys.argv[0]).name == 'yolo' and \
not TESTS_RUNNING and \
ONLINE and \
((is_pip_package() and not is_git_dir()) or
(get_git_origin_url() == 'https://github.com/ultralytics/ultralytics.git' and get_git_branch() == 'main')):
is_pip_package() and \
not is_git_dir():
import sentry_sdk # noqa
sentry_sdk.init(
dsn='https://f805855f03bb4363bc1e16cb7d87b654@o4504521589325824.ingest.sentry.io/4504521592406016',
dsn='https://5ff1556b71594bfea135ff0203a0d290@o4504521589325824.ingest.sentry.io/4504521592406016',
debug=False,
traces_sample_rate=1.0,
release=__version__,
environment='production', # 'dev' or 'production'
before_send=before_send,
ignore_errors=[KeyboardInterrupt, FileNotFoundError])
sentry_sdk.set_user({'id': SETTINGS['uuid']})
sentry_sdk.set_user({'id': SETTINGS['uuid']}) # SHA-256 anonymized UUID hash
# Disable all sentry logging
for logger in 'sentry_sdk', 'sentry_sdk.errors':

@ -21,7 +21,6 @@ default_space = {
'warmup_momentum': tune.uniform(0.0, 0.95), # warmup initial momentum
'box': tune.uniform(0.02, 0.2), # box loss gain
'cls': tune.uniform(0.2, 4.0), # cls loss gain (scale with pixels)
'fl_gamma': tune.uniform(0.0, 2.0), # focal loss gamma (efficientDet default gamma=1.5)
'hsv_h': tune.uniform(0.0, 0.1), # image HSV-Hue augmentation (fraction)
'hsv_s': tune.uniform(0.0, 0.9), # image HSV-Saturation augmentation (fraction)
'hsv_v': tune.uniform(0.0, 0.9), # image HSV-Value augmentation (fraction)

@ -30,7 +30,7 @@ class ClassificationTrainer(BaseTrainer):
if weights:
model.load(weights)
pretrained = False
pretrained = self.args.pretrained
for m in model.modules():
if not pretrained and hasattr(m, 'reset_parameters'):
m.reset_parameters()

Loading…
Cancel
Save