From b3c1a93fb01ba579b3dfbd30acad1ffc0723201b Mon Sep 17 00:00:00 2001 From: ZeYi Lin <944270057@qq.com> Date: Wed, 6 May 2026 12:42:47 +0800 Subject: [PATCH 1/2] fix --- swanlab/converter/wb/wb_local_converter.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/swanlab/converter/wb/wb_local_converter.py b/swanlab/converter/wb/wb_local_converter.py index 1df2c64f7..cb8493c7e 100644 --- a/swanlab/converter/wb/wb_local_converter.py +++ b/swanlab/converter/wb/wb_local_converter.py @@ -411,6 +411,12 @@ def _pre_upload_cb(n): continue # Check if key has nested structure (e.g., "table/_type") if '/' in key: + # Try scalar fast path first (e.g. "train/loss" = 0.5) + try: + scalar_dict[key] = float(value_json) + continue + except (ValueError, TypeError): + pass base_key, sub_key = key.split('/', 1) if base_key not in grouped_items: grouped_items[base_key] = {} From 2ab3d18fd30da4bd23f4786d39927f1eced42b06 Mon Sep 17 00:00:00 2001 From: ZeYi Lin <944270057@qq.com> Date: Wed, 6 May 2026 12:48:56 +0800 Subject: [PATCH 2/2] fix --- swanlab/converter/wb/wb_local_converter.py | 52 ++++++++++------------ 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/swanlab/converter/wb/wb_local_converter.py b/swanlab/converter/wb/wb_local_converter.py index cb8493c7e..8490e6c6d 100644 --- a/swanlab/converter/wb/wb_local_converter.py +++ b/swanlab/converter/wb/wb_local_converter.py @@ -409,14 +409,31 @@ def _pre_upload_cb(n): continue if key.startswith('_'): continue - # Check if key has nested structure (e.g., "table/_type") - if '/' in key: - # Try scalar fast path first (e.g. "train/loss" = 0.5) - try: - scalar_dict[key] = float(value_json) + # Fast path: direct float conversion for scalars (all keys) + try: + scalar_dict[key] = float(value_json) + continue + except (ValueError, TypeError): + pass + # Slow path: full JSON parse for media objects (all keys) + try: + value = _json_loads(value_json) + if isinstance(value, int): + scalar_dict[key] = float(value) continue - except (ValueError, TypeError): - pass + elif isinstance(value, dict) and "path" in value: + validated_path = self._validate_path(files_root_dir, value["path"]) + if validated_path and os.path.exists(validated_path): + if value.get("_type") == "image-file": + media_dict[key] = swanlab.Image(validated_path) + continue + elif value.get("_type") == "audio-file": + media_dict[key] = swanlab.Audio(validated_path) + continue + except (ValueError, Exception): + pass + # Grouped path: keys with '/' that weren't handled above (tables, etc.) + if '/' in key: base_key, sub_key = key.split('/', 1) if base_key not in grouped_items: grouped_items[base_key] = {} @@ -424,27 +441,6 @@ def _pre_upload_cb(n): grouped_items[base_key][sub_key] = _json_loads(value_json) except (ValueError, Exception): grouped_items[base_key][sub_key] = value_json - else: - # Fast path: direct float conversion for scalars - try: - scalar_dict[key] = float(value_json) - continue - except (ValueError, TypeError): - pass - # Slow path: full JSON parse - try: - value = _json_loads(value_json) - if isinstance(value, int): - scalar_dict[key] = float(value) - elif isinstance(value, dict) and "path" in value: - validated_path = self._validate_path(files_root_dir, value["path"]) - if validated_path and os.path.exists(validated_path): - if value.get("_type") == "image-file": - media_dict[key] = swanlab.Image(validated_path) - elif value.get("_type") == "audio-file": - media_dict[key] = swanlab.Audio(validated_path) - except (ValueError, Exception): - pass # Second pass: process grouped items for tables and media for base_key, props in grouped_items.items():