W&B refactor, handle exceptions, CI example (#5618)
Browse files* handle exceptions| attempt CI
* update
* Pre-commit manual run
* yaml one-liner
* Update ci-testing.yml
* Comment W&B CI
Leave as example for future separate CI
* Update ci-testing.yml
Co-authored-by: Glenn Jocher <[email protected]>
.github/workflows/ci-testing.yml
CHANGED
@@ -51,12 +51,15 @@ jobs:
|
|
51 |
run: |
|
52 |
python -m pip install --upgrade pip
|
53 |
pip install -qr requirements.txt -f https://download.pytorch.org/whl/cpu/torch_stable.html
|
54 |
-
pip install -q onnx tensorflow-cpu keras==2.6.0 #
|
55 |
python --version
|
56 |
pip --version
|
57 |
pip list
|
58 |
shell: bash
|
59 |
|
|
|
|
|
|
|
60 |
- name: Download data
|
61 |
run: |
|
62 |
# curl -L -o tmp.zip https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128.zip
|
|
|
51 |
run: |
|
52 |
python -m pip install --upgrade pip
|
53 |
pip install -qr requirements.txt -f https://download.pytorch.org/whl/cpu/torch_stable.html
|
54 |
+
pip install -q onnx tensorflow-cpu keras==2.6.0 # wandb # extras
|
55 |
python --version
|
56 |
pip --version
|
57 |
pip list
|
58 |
shell: bash
|
59 |
|
60 |
+
# - name: W&B login
|
61 |
+
# run: wandb login 345011b3fb26dc8337fd9b20e53857c1d403f2aa
|
62 |
+
|
63 |
- name: Download data
|
64 |
run: |
|
65 |
# curl -L -o tmp.zip https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128.zip
|
utils/loggers/wandb/log_dataset.py
CHANGED
@@ -2,11 +2,15 @@ import argparse
|
|
2 |
|
3 |
from wandb_utils import WandbLogger
|
4 |
|
|
|
|
|
5 |
WANDB_ARTIFACT_PREFIX = 'wandb-artifact://'
|
6 |
|
7 |
|
8 |
def create_dataset_artifact(opt):
|
9 |
logger = WandbLogger(opt, None, job_type='Dataset Creation') # TODO: return value unused
|
|
|
|
|
10 |
|
11 |
|
12 |
if __name__ == '__main__':
|
|
|
2 |
|
3 |
from wandb_utils import WandbLogger
|
4 |
|
5 |
+
from utils.general import LOGGER
|
6 |
+
|
7 |
WANDB_ARTIFACT_PREFIX = 'wandb-artifact://'
|
8 |
|
9 |
|
10 |
def create_dataset_artifact(opt):
|
11 |
logger = WandbLogger(opt, None, job_type='Dataset Creation') # TODO: return value unused
|
12 |
+
if not logger.wandb:
|
13 |
+
LOGGER.info("install wandb using `pip install wandb` to log the dataset")
|
14 |
|
15 |
|
16 |
if __name__ == '__main__':
|
utils/loggers/wandb/wandb_utils.py
CHANGED
@@ -17,7 +17,7 @@ if str(ROOT) not in sys.path:
|
|
17 |
sys.path.append(str(ROOT)) # add ROOT to PATH
|
18 |
|
19 |
from utils.datasets import LoadImagesAndLabels, img2label_paths
|
20 |
-
from utils.general import check_dataset, check_file
|
21 |
|
22 |
try:
|
23 |
import wandb
|
@@ -203,7 +203,7 @@ class WandbLogger():
|
|
203 |
config_path = self.log_dataset_artifact(opt.data,
|
204 |
opt.single_cls,
|
205 |
'YOLOv5' if opt.project == 'runs/train' else Path(opt.project).stem)
|
206 |
-
|
207 |
with open(config_path, errors='ignore') as f:
|
208 |
wandb_data_dict = yaml.safe_load(f)
|
209 |
return wandb_data_dict
|
@@ -316,7 +316,7 @@ class WandbLogger():
|
|
316 |
model_artifact.add_file(str(path / 'last.pt'), name='last.pt')
|
317 |
wandb.log_artifact(model_artifact,
|
318 |
aliases=['latest', 'last', 'epoch ' + str(self.current_epoch), 'best' if best_model else ''])
|
319 |
-
|
320 |
|
321 |
def log_dataset_artifact(self, data_file, single_cls, project, overwrite_config=False):
|
322 |
"""
|
@@ -368,7 +368,7 @@ class WandbLogger():
|
|
368 |
Useful for - referencing artifacts for evaluation.
|
369 |
"""
|
370 |
self.val_table_path_map = {}
|
371 |
-
|
372 |
for i, data in enumerate(tqdm(self.val_table.data)):
|
373 |
self.val_table_path_map[data[3]] = data[0]
|
374 |
|
@@ -488,7 +488,13 @@ class WandbLogger():
|
|
488 |
with all_logging_disabled():
|
489 |
if self.bbox_media_panel_images:
|
490 |
self.log_dict["BoundingBoxDebugger"] = self.bbox_media_panel_images
|
491 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
492 |
self.log_dict = {}
|
493 |
self.bbox_media_panel_images = []
|
494 |
if self.result_artifact:
|
|
|
17 |
sys.path.append(str(ROOT)) # add ROOT to PATH
|
18 |
|
19 |
from utils.datasets import LoadImagesAndLabels, img2label_paths
|
20 |
+
from utils.general import LOGGER, check_dataset, check_file
|
21 |
|
22 |
try:
|
23 |
import wandb
|
|
|
203 |
config_path = self.log_dataset_artifact(opt.data,
|
204 |
opt.single_cls,
|
205 |
'YOLOv5' if opt.project == 'runs/train' else Path(opt.project).stem)
|
206 |
+
LOGGER.info(f"Created dataset config file {config_path}")
|
207 |
with open(config_path, errors='ignore') as f:
|
208 |
wandb_data_dict = yaml.safe_load(f)
|
209 |
return wandb_data_dict
|
|
|
316 |
model_artifact.add_file(str(path / 'last.pt'), name='last.pt')
|
317 |
wandb.log_artifact(model_artifact,
|
318 |
aliases=['latest', 'last', 'epoch ' + str(self.current_epoch), 'best' if best_model else ''])
|
319 |
+
LOGGER.info(f"Saving model artifact on epoch {epoch + 1}")
|
320 |
|
321 |
def log_dataset_artifact(self, data_file, single_cls, project, overwrite_config=False):
|
322 |
"""
|
|
|
368 |
Useful for - referencing artifacts for evaluation.
|
369 |
"""
|
370 |
self.val_table_path_map = {}
|
371 |
+
LOGGER.info("Mapping dataset")
|
372 |
for i, data in enumerate(tqdm(self.val_table.data)):
|
373 |
self.val_table_path_map[data[3]] = data[0]
|
374 |
|
|
|
488 |
with all_logging_disabled():
|
489 |
if self.bbox_media_panel_images:
|
490 |
self.log_dict["BoundingBoxDebugger"] = self.bbox_media_panel_images
|
491 |
+
try:
|
492 |
+
wandb.log(self.log_dict)
|
493 |
+
except BaseException as e:
|
494 |
+
LOGGER.info(f"An error occurred in wandb logger. The training will proceed without interruption. More info\n{e}")
|
495 |
+
self.wandb_run.finish()
|
496 |
+
self.wandb_run = None
|
497 |
+
|
498 |
self.log_dict = {}
|
499 |
self.bbox_media_panel_images = []
|
500 |
if self.result_artifact:
|