|
36 | 36 | PROFILER_STEP_NAME = "ProfilerStep" |
37 | 37 |
|
38 | 38 |
|
| 39 | +class _NumpyEncoder(json.JSONEncoder): |
| 40 | + """ |
| 41 | + Json encoder for numpy types (np.int, np.float, np.array etc.) |
| 42 | + Returns default encoder if numpy is not available |
| 43 | + """ |
| 44 | + |
| 45 | + def default(self, obj): |
| 46 | + """Encode NumPy types to JSON""" |
| 47 | + try: |
| 48 | + import numpy as np |
| 49 | + except ImportError: |
| 50 | + return json.JSONEncoder.default(self, obj) |
| 51 | + if isinstance(obj, np.integer): |
| 52 | + return int(obj) |
| 53 | + elif isinstance(obj, np.floating): |
| 54 | + return float(obj) |
| 55 | + elif isinstance(obj, np.ndarray): |
| 56 | + return obj.tolist() |
| 57 | + else: |
| 58 | + return json.JSONEncoder.default(self, obj) |
| 59 | + |
| 60 | + |
39 | 61 | def supported_activities(): |
40 | 62 | """ |
41 | 63 | Returns a set of supported profiler tracing activities. |
@@ -187,7 +209,9 @@ def start_trace(self): |
187 | 209 | if kineto_available(): |
188 | 210 | dist_info = self._get_distributed_info() |
189 | 211 | if dist_info: |
190 | | - self.add_metadata_json("distributedInfo", json.dumps(dist_info)) |
| 212 | + self.add_metadata_json( |
| 213 | + "distributedInfo", json.dumps(dist_info, cls=_NumpyEncoder) |
| 214 | + ) |
191 | 215 |
|
192 | 216 | if hasattr(torch, "_inductor"): |
193 | 217 | import torch._inductor.config as inductor_config |
@@ -931,5 +955,6 @@ def _record_pg_config(self) -> None: |
931 | 955 | ): |
932 | 956 | pg_config_info = torch.distributed.distributed_c10d._world.pg_config_info |
933 | 957 | torch.autograd._record_function_with_args_enter( |
934 | | - "## process_group:init ##", json.dumps(pg_config_info) |
| 958 | + "## process_group:init ##", |
| 959 | + json.dumps(pg_config_info, cls=_NumpyEncoder), |
935 | 960 | ) |
0 commit comments