Ayush Chaurasia glenn-jocher commited on
Commit
540ef0d
·
unverified ·
1 Parent(s): 80cfaf4

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 # for export
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
- print("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,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
- print("Saving model artifact on epoch ", epoch + 1)
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
- print("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,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
- wandb.log(self.log_dict)
 
 
 
 
 
 
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: