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

Co-authored-by: Ayush Chaurasia <ayush.chaurarsia@gmail.com>
single_channel
Glenn Jocher 2 years ago committed by GitHub
parent 283e334bd4
commit 3d60347755
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

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

@ -1,6 +1,6 @@
# Traces # Events
--- ---
:::ultralytics.hub.utils.Traces :::ultralytics.hub.utils.Events
<br><br> <br><br>
# request_with_credentials # 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 | | warmup_momentum | `tune.uniform(0.0, 0.95)` | Warmup momentum |
| box | `tune.uniform(0.02, 0.2)` | Box loss weight | | box | `tune.uniform(0.02, 0.2)` | Box loss weight |
| cls | `tune.uniform(0.2, 4.0)` | Class 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_h | `tune.uniform(0.0, 0.1)` | Hue augmentation range |
| hsv_s | `tune.uniform(0.0, 0.9)` | Saturation 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 | | hsv_v | `tune.uniform(0.0, 0.9)` | Value (brightness) augmentation range |

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

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

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

@ -281,6 +281,7 @@ class BaseTrainer:
if self.args.close_mosaic: if self.args.close_mosaic:
base_idx = (self.epochs - self.args.close_mosaic) * nb base_idx = (self.epochs - self.args.close_mosaic) * nb
self.plot_idx.extend([base_idx, base_idx + 1, base_idx + 2]) 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): for epoch in range(self.start_epoch, self.epochs):
self.epoch = epoch self.epoch = epoch
self.run_callbacks('on_train_epoch_start') self.run_callbacks('on_train_epoch_start')

@ -605,11 +605,35 @@ def threaded(func):
def set_sentry(): 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): 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: if 'exc_info' in hint:
exc_type, exc_value, tb = hint['exc_info'] exc_type, exc_value, tb = hint['exc_info']
if exc_type in (KeyboardInterrupt, FileNotFoundError) \ if exc_type in (KeyboardInterrupt, FileNotFoundError) \
@ -628,19 +652,19 @@ def set_sentry():
Path(sys.argv[0]).name == 'yolo' and \ Path(sys.argv[0]).name == 'yolo' and \
not TESTS_RUNNING and \ not TESTS_RUNNING and \
ONLINE and \ ONLINE and \
((is_pip_package() and not is_git_dir()) or is_pip_package() and \
(get_git_origin_url() == 'https://github.com/ultralytics/ultralytics.git' and get_git_branch() == 'main')): not is_git_dir():
import sentry_sdk # noqa import sentry_sdk # noqa
sentry_sdk.init( sentry_sdk.init(
dsn='https://f805855f03bb4363bc1e16cb7d87b654@o4504521589325824.ingest.sentry.io/4504521592406016', dsn='https://5ff1556b71594bfea135ff0203a0d290@o4504521589325824.ingest.sentry.io/4504521592406016',
debug=False, debug=False,
traces_sample_rate=1.0, traces_sample_rate=1.0,
release=__version__, release=__version__,
environment='production', # 'dev' or 'production' environment='production', # 'dev' or 'production'
before_send=before_send, before_send=before_send,
ignore_errors=[KeyboardInterrupt, FileNotFoundError]) 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 # Disable all sentry logging
for logger in 'sentry_sdk', 'sentry_sdk.errors': 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 'warmup_momentum': tune.uniform(0.0, 0.95), # warmup initial momentum
'box': tune.uniform(0.02, 0.2), # box loss gain 'box': tune.uniform(0.02, 0.2), # box loss gain
'cls': tune.uniform(0.2, 4.0), # cls loss gain (scale with pixels) '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_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_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) 'hsv_v': tune.uniform(0.0, 0.9), # image HSV-Value augmentation (fraction)

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

Loading…
Cancel
Save