Minimize GitHub assets API calls (#4523)

pull/4519/head
Glenn Jocher 1 year ago committed by GitHub
parent 7e1f7a9d28
commit a7419617a6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      ultralytics/engine/model.py
  2. 4
      ultralytics/hub/utils.py
  3. 44
      ultralytics/utils/downloads.py

@ -12,7 +12,7 @@ from ultralytics.nn.tasks import attempt_load_one_weight, guess_model_task, nn,
from ultralytics.utils import (ASSETS, DEFAULT_CFG, DEFAULT_CFG_DICT, DEFAULT_CFG_KEYS, LOGGER, RANK, callbacks, emojis, from ultralytics.utils import (ASSETS, DEFAULT_CFG, DEFAULT_CFG_DICT, DEFAULT_CFG_KEYS, LOGGER, RANK, callbacks, emojis,
yaml_load) yaml_load)
from ultralytics.utils.checks import check_file, check_imgsz, check_pip_update_available, check_yaml from ultralytics.utils.checks import check_file, check_imgsz, check_pip_update_available, check_yaml
from ultralytics.utils.downloads import GITHUB_ASSET_STEMS from ultralytics.utils.downloads import GITHUB_ASSETS_STEMS
from ultralytics.utils.torch_utils import smart_inference_mode from ultralytics.utils.torch_utils import smart_inference_mode
@ -86,7 +86,7 @@ class Model:
# Load or create new YOLO model # Load or create new YOLO model
suffix = Path(model).suffix suffix = Path(model).suffix
if not suffix and Path(model).stem in GITHUB_ASSET_STEMS: if not suffix and Path(model).stem in GITHUB_ASSETS_STEMS:
model, suffix = Path(model).with_suffix('.pt'), '.pt' # add suffix, i.e. yolov8n -> yolov8n.pt model, suffix = Path(model).with_suffix('.pt'), '.pt' # add suffix, i.e. yolov8n -> yolov8n.pt
if suffix in ('.yaml', '.yml'): if suffix in ('.yaml', '.yml'):
self._new(model, task) self._new(model, task)

@ -13,7 +13,7 @@ from tqdm import tqdm
from ultralytics.utils import (ENVIRONMENT, LOGGER, ONLINE, RANK, SETTINGS, TESTS_RUNNING, TQDM_BAR_FORMAT, TryExcept, from ultralytics.utils import (ENVIRONMENT, LOGGER, ONLINE, RANK, SETTINGS, TESTS_RUNNING, TQDM_BAR_FORMAT, TryExcept,
__version__, colorstr, get_git_origin_url, is_colab, is_git_dir, is_pip_package) __version__, colorstr, get_git_origin_url, is_colab, is_git_dir, is_pip_package)
from ultralytics.utils.downloads import GITHUB_ASSET_NAMES from ultralytics.utils.downloads import GITHUB_ASSETS_NAMES
PREFIX = colorstr('Ultralytics HUB: ') PREFIX = colorstr('Ultralytics HUB: ')
HELP_MSG = 'If this issue persists please visit https://github.com/ultralytics/hub/issues for assistance.' HELP_MSG = 'If this issue persists please visit https://github.com/ultralytics/hub/issues for assistance.'
@ -197,7 +197,7 @@ class Events:
if len(self.events) < 25: # Events list limited to 25 events (drop any events past this) if len(self.events) < 25: # Events list limited to 25 events (drop any events past this)
params = { params = {
**self.metadata, 'task': cfg.task, **self.metadata, 'task': cfg.task,
'model': cfg.model if cfg.model in GITHUB_ASSET_NAMES else 'custom'} 'model': cfg.model if cfg.model in GITHUB_ASSETS_NAMES else 'custom'}
if cfg.mode == 'export': if cfg.mode == 'export':
params['format'] = cfg.format params['format'] = cfg.format
self.events.append({'name': cfg.mode, 'params': params}) self.events.append({'name': cfg.mode, 'params': params})

@ -15,15 +15,17 @@ from tqdm import tqdm
from ultralytics.utils import LOGGER, TQDM_BAR_FORMAT, checks, clean_url, emojis, is_online, url2file from ultralytics.utils import LOGGER, TQDM_BAR_FORMAT, checks, clean_url, emojis, is_online, url2file
GITHUB_ASSET_NAMES = [f'yolov8{k}{suffix}.pt' for k in 'nsmlx' for suffix in ('', '6', '-cls', '-seg', '-pose')] + \ # Define Ultralytics GitHub assets maintained at https://github.com/ultralytics/assets
[f'yolov5{k}u.pt' for k in 'nsmlx'] + \ GITHUB_ASSETS_REPO = 'ultralytics/assets'
[f'yolov3{k}u.pt' for k in ('', '-spp', '-tiny')] + \ GITHUB_ASSETS_NAMES = [f'yolov8{k}{suffix}.pt' for k in 'nsmlx' for suffix in ('', '6', '-cls', '-seg', '-pose')] + \
[f'yolo_nas_{k}.pt' for k in 'sml'] + \ [f'yolov5{k}u.pt' for k in 'nsmlx'] + \
[f'sam_{k}.pt' for k in 'bl'] + \ [f'yolov3{k}u.pt' for k in ('', '-spp', '-tiny')] + \
[f'FastSAM-{k}.pt' for k in 'sx'] + \ [f'yolo_nas_{k}.pt' for k in 'sml'] + \
[f'rtdetr-{k}.pt' for k in 'lx'] + \ [f'sam_{k}.pt' for k in 'bl'] + \
['mobile_sam.pt'] [f'FastSAM-{k}.pt' for k in 'sx'] + \
GITHUB_ASSET_STEMS = [Path(k).stem for k in GITHUB_ASSET_NAMES] [f'rtdetr-{k}.pt' for k in 'lx'] + \
['mobile_sam.pt']
GITHUB_ASSETS_STEMS = [Path(k).stem for k in GITHUB_ASSETS_NAMES]
def is_url(url, check=True): def is_url(url, check=True):
@ -327,7 +329,7 @@ def get_github_assets(repo='ultralytics/assets', version='latest', retry=False):
version = f'tags/{version}' # i.e. tags/v6.2 version = f'tags/{version}' # i.e. tags/v6.2
url = f'https://api.github.com/repos/{repo}/releases/{version}' url = f'https://api.github.com/repos/{repo}/releases/{version}'
r = requests.get(url) # github api r = requests.get(url) # github api
if r.status_code != 200 and retry: if r.status_code != 200 and r.reason != 'rate limit exceeded' and retry: # failed and not 403 rate limit exceeded
r = requests.get(url) # try again r = requests.get(url) # try again
if r.status_code != 200: if r.status_code != 200:
LOGGER.warning(f' GitHub assets check failure for {url}: {r.status_code} {r.reason}') LOGGER.warning(f' GitHub assets check failure for {url}: {r.status_code} {r.reason}')
@ -358,24 +360,16 @@ def attempt_download_asset(file, repo='ultralytics/assets', release='v0.0.0'):
LOGGER.info(f'Found {clean_url(url)} locally at {file}') # file already exists LOGGER.info(f'Found {clean_url(url)} locally at {file}') # file already exists
else: else:
safe_download(url=url, file=file, min_bytes=1E5) safe_download(url=url, file=file, min_bytes=1E5)
return file
# GitHub assets elif repo == GITHUB_ASSETS_REPO and name in GITHUB_ASSETS_NAMES:
assets = GITHUB_ASSET_NAMES safe_download(url=f'https://github.com/{repo}/releases/download/{release}/{name}', file=file, min_bytes=1E5)
try:
else:
tag, assets = get_github_assets(repo, release) tag, assets = get_github_assets(repo, release)
except Exception: if not assets:
try:
tag, assets = get_github_assets(repo) # latest release tag, assets = get_github_assets(repo) # latest release
except Exception: if name in assets:
try: safe_download(url=f'https://github.com/{repo}/releases/download/{tag}/{name}', file=file, min_bytes=1E5)
tag = subprocess.check_output(['git', 'tag']).decode().split()[-1]
except Exception:
tag = release
file.parent.mkdir(parents=True, exist_ok=True) # make parent dir (if required)
if name in assets:
safe_download(url=f'https://github.com/{repo}/releases/download/{tag}/{name}', file=file, min_bytes=1E5)
return str(file) return str(file)

Loading…
Cancel
Save