wandb 0.19.2__py3-none-win32.whl → 0.19.3__py3-none-win32.whl
Sign up to get free protection for your applications and to get access to all the features.
- wandb/__init__.py +1 -1
- wandb/__init__.pyi +13 -3
- wandb/bin/gpu_stats.exe +0 -0
- wandb/bin/wandb-core +0 -0
- wandb/integration/metaflow/metaflow.py +7 -9
- wandb/sdk/wandb_init.py +240 -161
- wandb/sdk/wandb_run.py +10 -7
- wandb/sdk/wandb_settings.py +2 -27
- {wandb-0.19.2.dist-info → wandb-0.19.3.dist-info}/METADATA +1 -1
- {wandb-0.19.2.dist-info → wandb-0.19.3.dist-info}/RECORD +13 -13
- {wandb-0.19.2.dist-info → wandb-0.19.3.dist-info}/WHEEL +0 -0
- {wandb-0.19.2.dist-info → wandb-0.19.3.dist-info}/entry_points.txt +0 -0
- {wandb-0.19.2.dist-info → wandb-0.19.3.dist-info}/licenses/LICENSE +0 -0
wandb/__init__.py
CHANGED
wandb/__init__.pyi
CHANGED
@@ -103,7 +103,7 @@ if TYPE_CHECKING:
|
|
103
103
|
import wandb
|
104
104
|
from wandb.plot import CustomChart
|
105
105
|
|
106
|
-
__version__: str = "0.19.
|
106
|
+
__version__: str = "0.19.3"
|
107
107
|
|
108
108
|
run: Run | None
|
109
109
|
config: wandb_config.Config
|
@@ -651,7 +651,12 @@ def log(
|
|
651
651
|
run = wandb.init()
|
652
652
|
examples = []
|
653
653
|
for i in range(3):
|
654
|
-
pixels = np.random.randint(
|
654
|
+
pixels = np.random.randint(
|
655
|
+
low=0,
|
656
|
+
high=256,
|
657
|
+
size=(100, 100, 3),
|
658
|
+
dtype=np.uint8,
|
659
|
+
)
|
655
660
|
pil_image = PILImage.fromarray(pixels, mode="RGB")
|
656
661
|
image = wandb.Image(pil_image, caption=f"random field {i}")
|
657
662
|
examples.append(image)
|
@@ -666,7 +671,12 @@ def log(
|
|
666
671
|
|
667
672
|
run = wandb.init()
|
668
673
|
# axes are (time, channel, height, width)
|
669
|
-
frames = np.random.randint(
|
674
|
+
frames = np.random.randint(
|
675
|
+
low=0,
|
676
|
+
high=256,
|
677
|
+
size=(10, 3, 100, 100),
|
678
|
+
dtype=np.uint8,
|
679
|
+
)
|
670
680
|
run.log({"video": wandb.Video(frames, fps=4)})
|
671
681
|
```
|
672
682
|
|
wandb/bin/gpu_stats.exe
CHANGED
Binary file
|
wandb/bin/wandb-core
CHANGED
Binary file
|
@@ -328,15 +328,13 @@ def wandb_log(
|
|
328
328
|
if not isinstance(settings, wandb.sdk.wandb_settings.Settings):
|
329
329
|
settings = wandb.Settings()
|
330
330
|
|
331
|
-
settings.
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
run_job_type=coalesce(settings.run_job_type, current.step_name),
|
339
|
-
source=wandb.sdk.wandb_settings.Source.INIT,
|
331
|
+
settings.update_from_dict(
|
332
|
+
{
|
333
|
+
"run_group": coalesce(
|
334
|
+
settings.run_group, f"{current.flow_name}/{current.run_id}"
|
335
|
+
),
|
336
|
+
"run_job_type": coalesce(settings.run_job_type, current.step_name),
|
337
|
+
}
|
340
338
|
)
|
341
339
|
|
342
340
|
with wandb.init(settings=settings) as run:
|
wandb/sdk/wandb_init.py
CHANGED
@@ -14,6 +14,7 @@ import copy
|
|
14
14
|
import json
|
15
15
|
import logging
|
16
16
|
import os
|
17
|
+
import pathlib
|
17
18
|
import platform
|
18
19
|
import sys
|
19
20
|
import tempfile
|
@@ -48,14 +49,6 @@ from .wandb_settings import Settings
|
|
48
49
|
if TYPE_CHECKING:
|
49
50
|
from wandb.proto import wandb_internal_pb2 as pb
|
50
51
|
|
51
|
-
logger: wandb_setup.Logger | None = None # logger configured during wandb.init()
|
52
|
-
|
53
|
-
|
54
|
-
def _set_logger(log_object: wandb_setup.Logger | None) -> None:
|
55
|
-
"""Configure module logger."""
|
56
|
-
global logger
|
57
|
-
logger = log_object
|
58
|
-
|
59
52
|
|
60
53
|
def _huggingface_version() -> str | None:
|
61
54
|
if "transformers" in sys.modules:
|
@@ -115,9 +108,10 @@ def _handle_launch_config(settings: Settings) -> dict[str, Any]:
|
|
115
108
|
class _WandbInit:
|
116
109
|
_init_telemetry_obj: telemetry.TelemetryRecord
|
117
110
|
|
118
|
-
def __init__(self) -> None:
|
111
|
+
def __init__(self, wl: wandb_setup._WandbSetup) -> None:
|
112
|
+
self._wl = wl
|
113
|
+
|
119
114
|
self.kwargs = None
|
120
|
-
self.settings: Settings | None = None
|
121
115
|
self.sweep_config: dict[str, Any] = {}
|
122
116
|
self.launch_config: dict[str, Any] = {}
|
123
117
|
self.config: dict[str, Any] = {}
|
@@ -125,7 +119,6 @@ class _WandbInit:
|
|
125
119
|
self.backend: Backend | None = None
|
126
120
|
|
127
121
|
self._teardown_hooks: list[TeardownHook] = []
|
128
|
-
self._wl = wandb.setup()
|
129
122
|
self.notebook: wandb.jupyter.Notebook | None = None # type: ignore
|
130
123
|
self.printer = printer.new_printer()
|
131
124
|
|
@@ -133,6 +126,40 @@ class _WandbInit:
|
|
133
126
|
|
134
127
|
self.deprecated_features_used: dict[str, str] = dict()
|
135
128
|
|
129
|
+
@property
|
130
|
+
def _logger(self) -> wandb_setup.Logger:
|
131
|
+
return self._wl._get_logger()
|
132
|
+
|
133
|
+
def maybe_login(self, init_settings: Settings) -> None:
|
134
|
+
"""Log in if we are not creating an offline or disabled run.
|
135
|
+
|
136
|
+
This may change the W&B singleton settings.
|
137
|
+
|
138
|
+
Args:
|
139
|
+
init_settings: Settings passed to `wandb.init()` or set via
|
140
|
+
keyword arguments.
|
141
|
+
"""
|
142
|
+
# Allow settings passed to init() to override inferred values.
|
143
|
+
#
|
144
|
+
# Calling login() may change settings on the singleton,
|
145
|
+
# so these may not be the final run settings.
|
146
|
+
run_settings = self._wl.settings.model_copy()
|
147
|
+
run_settings.update_from_settings(init_settings)
|
148
|
+
|
149
|
+
# NOTE: _noop or _offline can become true after _login().
|
150
|
+
# _noop happens if _login hits a timeout.
|
151
|
+
# _offline can be selected by the user at the login prompt.
|
152
|
+
if run_settings._noop or run_settings._offline:
|
153
|
+
return
|
154
|
+
|
155
|
+
wandb_login._login(
|
156
|
+
anonymous=run_settings.anonymous,
|
157
|
+
force=run_settings.force,
|
158
|
+
_disable_warning=True,
|
159
|
+
_silent=run_settings.quiet or run_settings.silent,
|
160
|
+
_entity=run_settings.entity,
|
161
|
+
)
|
162
|
+
|
136
163
|
def warn_env_vars_change_after_setup(self) -> None:
|
137
164
|
"""Warn if environment variables change after wandb singleton is initialized.
|
138
165
|
|
@@ -202,24 +229,15 @@ class _WandbInit:
|
|
202
229
|
warn("run_id", init_settings.run_id)
|
203
230
|
init_settings.run_id = None
|
204
231
|
|
205
|
-
def
|
206
|
-
|
207
|
-
init_settings: Settings,
|
208
|
-
config: dict | str | None = None,
|
209
|
-
config_exclude_keys: list[str] | None = None,
|
210
|
-
config_include_keys: list[str] | None = None,
|
211
|
-
allow_val_change: bool | None = None,
|
212
|
-
monitor_gym: bool | None = None,
|
213
|
-
) -> None:
|
214
|
-
"""Complete setup for `wandb.init()`.
|
232
|
+
def compute_run_settings(self, init_settings: Settings) -> Settings:
|
233
|
+
"""Returns the run's settings.
|
215
234
|
|
216
|
-
|
235
|
+
Args:
|
236
|
+
init_settings: Settings passed to `wandb.init()` or set via
|
237
|
+
keyword arguments.
|
217
238
|
"""
|
218
239
|
self.warn_env_vars_change_after_setup()
|
219
240
|
|
220
|
-
_set_logger(self._wl._get_logger())
|
221
|
-
assert logger
|
222
|
-
|
223
241
|
self.clear_run_path_if_sweep_or_launch(init_settings)
|
224
242
|
|
225
243
|
# Inherit global settings.
|
@@ -231,10 +249,121 @@ class _WandbInit:
|
|
231
249
|
# Infer the run ID from SageMaker.
|
232
250
|
if not settings.sagemaker_disable and sagemaker.is_using_sagemaker():
|
233
251
|
if sagemaker.set_run_id(settings):
|
234
|
-
|
252
|
+
self._logger.info("set run ID and group based on SageMaker")
|
235
253
|
with telemetry.context(obj=self._init_telemetry_obj) as tel:
|
236
254
|
tel.feature.sagemaker = True
|
237
255
|
|
256
|
+
# get status of code saving before applying user settings
|
257
|
+
save_code_pre_user_settings = settings.save_code
|
258
|
+
if not settings._offline and not settings._noop:
|
259
|
+
user_settings = self._wl._load_user_settings()
|
260
|
+
if user_settings is not None:
|
261
|
+
settings.update_from_dict(user_settings)
|
262
|
+
|
263
|
+
# ensure that user settings don't set saving to true
|
264
|
+
# if user explicitly set these to false in UI
|
265
|
+
if save_code_pre_user_settings is False:
|
266
|
+
settings.save_code = False
|
267
|
+
|
268
|
+
# TODO: remove this once we refactor the client. This is a temporary
|
269
|
+
# fix to make sure that we use the same project name for wandb-core.
|
270
|
+
# The reason this is not going through the settings object is to
|
271
|
+
# avoid failure cases in other parts of the code that will be
|
272
|
+
# removed with the switch to wandb-core.
|
273
|
+
if settings.project is None:
|
274
|
+
settings.project = wandb.util.auto_project_name(settings.program)
|
275
|
+
|
276
|
+
settings.x_start_time = time.time()
|
277
|
+
|
278
|
+
return settings
|
279
|
+
|
280
|
+
def _load_autoresume_run_id(self, resume_file: pathlib.Path) -> str | None:
|
281
|
+
"""Returns the run_id stored in the auto-resume file, if any.
|
282
|
+
|
283
|
+
Returns None if the file does not exist or is not in a valid format.
|
284
|
+
|
285
|
+
Args:
|
286
|
+
resume_file: The file path to use for resume='auto' mode.
|
287
|
+
"""
|
288
|
+
if not resume_file.exists():
|
289
|
+
return None
|
290
|
+
|
291
|
+
with resume_file.open() as f:
|
292
|
+
try:
|
293
|
+
return json.load(f)["run_id"]
|
294
|
+
|
295
|
+
except json.JSONDecodeError as e:
|
296
|
+
self._logger.exception(
|
297
|
+
f"could not decode {resume_file}, ignoring",
|
298
|
+
exc_info=e,
|
299
|
+
)
|
300
|
+
return None
|
301
|
+
|
302
|
+
except KeyError:
|
303
|
+
self._logger.error(
|
304
|
+
f"resume file at {resume_file} did not store a run_id"
|
305
|
+
)
|
306
|
+
return None
|
307
|
+
|
308
|
+
def _save_autoresume_run_id(
|
309
|
+
self,
|
310
|
+
*,
|
311
|
+
resume_file: pathlib.Path,
|
312
|
+
run_id: str,
|
313
|
+
) -> None:
|
314
|
+
"""Write the run ID to the auto-resume file."""
|
315
|
+
resume_file.parent.mkdir(exist_ok=True)
|
316
|
+
with resume_file.open("w") as f:
|
317
|
+
json.dump({"run_id": run_id}, f)
|
318
|
+
|
319
|
+
def set_run_id(self, settings: Settings) -> None:
|
320
|
+
"""Set the run ID and possibly save it to the auto-resume file.
|
321
|
+
|
322
|
+
After this, `settings.run_id` is guaranteed to be set.
|
323
|
+
|
324
|
+
Args:
|
325
|
+
settings: The run's settings derived from the environment
|
326
|
+
and explicit values passed to `wandb.init()`.
|
327
|
+
"""
|
328
|
+
if settings.resume == "auto" and settings.resume_fname:
|
329
|
+
resume_path = pathlib.Path(settings.resume_fname)
|
330
|
+
else:
|
331
|
+
resume_path = None
|
332
|
+
|
333
|
+
if resume_path:
|
334
|
+
previous_id = self._load_autoresume_run_id(resume_path)
|
335
|
+
|
336
|
+
if not previous_id:
|
337
|
+
pass
|
338
|
+
elif settings.run_id is None:
|
339
|
+
self._logger.info(f"loaded run ID from {resume_path}")
|
340
|
+
settings.run_id = previous_id
|
341
|
+
elif settings.run_id != previous_id:
|
342
|
+
wandb.termwarn(
|
343
|
+
f"Ignoring ID {previous_id} loaded due to resume='auto'"
|
344
|
+
f" because the run ID is set to {settings.run_id}.",
|
345
|
+
)
|
346
|
+
|
347
|
+
# If no run ID was inferred, explicitly set, or loaded from an
|
348
|
+
# auto-resume file, then we generate a new ID.
|
349
|
+
if settings.run_id is None:
|
350
|
+
settings.run_id = runid.generate_id()
|
351
|
+
|
352
|
+
if resume_path:
|
353
|
+
self._save_autoresume_run_id(
|
354
|
+
resume_file=resume_path,
|
355
|
+
run_id=settings.run_id,
|
356
|
+
)
|
357
|
+
|
358
|
+
def setup(
|
359
|
+
self,
|
360
|
+
settings: Settings,
|
361
|
+
config: dict | str | None = None,
|
362
|
+
config_exclude_keys: list[str] | None = None,
|
363
|
+
config_include_keys: list[str] | None = None,
|
364
|
+
monitor_gym: bool | None = None,
|
365
|
+
) -> None:
|
366
|
+
"""Compute the run's config and some telemetry."""
|
238
367
|
with telemetry.context(obj=self._init_telemetry_obj) as tel:
|
239
368
|
if config is not None:
|
240
369
|
tel.feature.set_init_config = True
|
@@ -295,55 +424,6 @@ class _WandbInit:
|
|
295
424
|
with telemetry.context(obj=self._init_telemetry_obj) as tel:
|
296
425
|
tel.feature.tensorboard_sync = True
|
297
426
|
|
298
|
-
if not settings._offline and not settings._noop:
|
299
|
-
wandb_login._login(
|
300
|
-
anonymous=settings.anonymous,
|
301
|
-
force=settings.force,
|
302
|
-
_disable_warning=True,
|
303
|
-
_silent=settings.quiet or settings.silent,
|
304
|
-
_entity=settings.entity,
|
305
|
-
)
|
306
|
-
|
307
|
-
# apply updated global state after login was handled
|
308
|
-
login_settings = {
|
309
|
-
k: v
|
310
|
-
for k, v in {
|
311
|
-
"anonymous": self._wl.settings.anonymous,
|
312
|
-
"api_key": self._wl.settings.api_key,
|
313
|
-
"base_url": self._wl.settings.base_url,
|
314
|
-
"force": self._wl.settings.force,
|
315
|
-
"login_timeout": self._wl.settings.login_timeout,
|
316
|
-
}.items()
|
317
|
-
if v is not None
|
318
|
-
}
|
319
|
-
if login_settings:
|
320
|
-
settings.update_from_dict(login_settings)
|
321
|
-
|
322
|
-
# handle custom resume logic
|
323
|
-
settings.handle_resume_logic()
|
324
|
-
|
325
|
-
# get status of code saving before applying user settings
|
326
|
-
save_code_pre_user_settings = settings.save_code
|
327
|
-
if not settings._offline and not settings._noop:
|
328
|
-
user_settings = self._wl._load_user_settings()
|
329
|
-
if user_settings is not None:
|
330
|
-
settings.update_from_dict(user_settings)
|
331
|
-
|
332
|
-
# ensure that user settings don't set saving to true
|
333
|
-
# if user explicitly set these to false in UI
|
334
|
-
if save_code_pre_user_settings is False:
|
335
|
-
settings.save_code = False
|
336
|
-
|
337
|
-
# TODO: remove this once we refactor the client. This is a temporary
|
338
|
-
# fix to make sure that we use the same project name for wandb-core.
|
339
|
-
# The reason this is not going through the settings object is to
|
340
|
-
# avoid failure cases in other parts of the code that will be
|
341
|
-
# removed with the switch to wandb-core.
|
342
|
-
if settings.project is None:
|
343
|
-
settings.project = wandb.util.auto_project_name(settings.program)
|
344
|
-
|
345
|
-
settings.x_start_time = time.time()
|
346
|
-
|
347
427
|
if not settings._noop:
|
348
428
|
self._log_setup(settings)
|
349
429
|
|
@@ -353,13 +433,10 @@ class _WandbInit:
|
|
353
433
|
if launch_config:
|
354
434
|
self._split_artifacts_from_config(launch_config, self.launch_config)
|
355
435
|
|
356
|
-
self.settings = settings
|
357
|
-
|
358
436
|
def teardown(self) -> None:
|
359
437
|
# TODO: currently this is only called on failed wandb.init attempts
|
360
438
|
# normally this happens on the run object
|
361
|
-
|
362
|
-
logger.info("tearing down wandb.init")
|
439
|
+
self._logger.info("tearing down wandb.init")
|
363
440
|
for hook in self._teardown_hooks:
|
364
441
|
hook.call()
|
365
442
|
|
@@ -372,11 +449,12 @@ class _WandbInit:
|
|
372
449
|
else:
|
373
450
|
config_target.setdefault(k, v)
|
374
451
|
|
375
|
-
def
|
376
|
-
"""
|
452
|
+
def _create_logger(self, log_fname: str) -> logging.Logger:
|
453
|
+
"""Returns a logger configured to write to a file.
|
377
454
|
|
378
|
-
This adds a run_id to the log, in case of multiple processes on the same
|
379
|
-
Currently, there is no way to disable logging after it's
|
455
|
+
This adds a run_id to the log, in case of multiple processes on the same
|
456
|
+
machine. Currently, there is no way to disable logging after it's
|
457
|
+
enabled.
|
380
458
|
"""
|
381
459
|
handler = logging.FileHandler(log_fname)
|
382
460
|
handler.setLevel(logging.INFO)
|
@@ -387,7 +465,8 @@ class _WandbInit:
|
|
387
465
|
)
|
388
466
|
|
389
467
|
handler.setFormatter(formatter)
|
390
|
-
|
468
|
+
|
469
|
+
logger = logging.getLogger("wandb")
|
391
470
|
logger.propagate = False
|
392
471
|
logger.addHandler(handler)
|
393
472
|
# TODO: make me configurable
|
@@ -399,6 +478,8 @@ class _WandbInit:
|
|
399
478
|
)
|
400
479
|
)
|
401
480
|
|
481
|
+
return logger
|
482
|
+
|
402
483
|
def _safe_symlink(
|
403
484
|
self, base: str, target: str, name: str, delete: bool = False
|
404
485
|
) -> None:
|
@@ -429,14 +510,14 @@ class _WandbInit:
|
|
429
510
|
if self.notebook.save_ipynb(): # type: ignore
|
430
511
|
assert self.run is not None
|
431
512
|
res = self.run.log_code(root=None)
|
432
|
-
|
513
|
+
self._logger.info("saved code: %s", res) # type: ignore
|
433
514
|
if self.backend.interface is not None:
|
434
|
-
|
515
|
+
self._logger.info("pausing backend") # type: ignore
|
435
516
|
self.backend.interface.publish_pause()
|
436
517
|
|
437
518
|
def _resume_backend(self, *args: Any, **kwargs: Any) -> None: # noqa
|
438
519
|
if self.backend is not None and self.backend.interface is not None:
|
439
|
-
|
520
|
+
self._logger.info("resuming backend") # type: ignore
|
440
521
|
self.backend.interface.publish_resume()
|
441
522
|
|
442
523
|
def _jupyter_teardown(self) -> None:
|
@@ -447,8 +528,8 @@ class _WandbInit:
|
|
447
528
|
if self.notebook.save_ipynb():
|
448
529
|
assert self.run is not None
|
449
530
|
res = self.run.log_code(root=None)
|
450
|
-
|
451
|
-
|
531
|
+
self._logger.info("saved code and history: %s", res) # type: ignore
|
532
|
+
self._logger.info("cleaning up jupyter logic") # type: ignore
|
452
533
|
# because of how we bind our methods we manually find them to unregister
|
453
534
|
for hook in ipython.events.callbacks["pre_run_cell"]:
|
454
535
|
if "_resume_backend" in hook.__name__:
|
@@ -466,7 +547,7 @@ class _WandbInit:
|
|
466
547
|
|
467
548
|
# Monkey patch ipython publish to capture displayed outputs
|
468
549
|
if not hasattr(ipython.display_pub, "_orig_publish"):
|
469
|
-
|
550
|
+
self._logger.info("configuring jupyter hooks %s", self) # type: ignore
|
470
551
|
ipython.display_pub._orig_publish = ipython.display_pub.publish
|
471
552
|
# Registering resume and pause hooks
|
472
553
|
|
@@ -513,15 +594,9 @@ class _WandbInit:
|
|
513
594
|
delete=True,
|
514
595
|
)
|
515
596
|
|
516
|
-
|
517
|
-
self.
|
518
|
-
|
519
|
-
assert self._wl
|
520
|
-
assert logger
|
521
|
-
|
522
|
-
self._wl._early_logger_flush(logger)
|
523
|
-
logger.info(f"Logging user logs to {settings.log_user}")
|
524
|
-
logger.info(f"Logging internal logs to {settings.log_internal}")
|
597
|
+
self._wl._early_logger_flush(self._create_logger(settings.log_user))
|
598
|
+
self._logger.info(f"Logging user logs to {settings.log_user}")
|
599
|
+
self._logger.info(f"Logging internal logs to {settings.log_internal}")
|
525
600
|
|
526
601
|
def _make_run_disabled(self) -> Run:
|
527
602
|
"""Returns a Run-like object where all methods are no-ops.
|
@@ -635,24 +710,20 @@ class _WandbInit:
|
|
635
710
|
percent_done = handle.percent_done
|
636
711
|
self.printer.progress_update(line, percent_done=percent_done)
|
637
712
|
|
638
|
-
def init(self) -> Run: # noqa: C901
|
639
|
-
|
640
|
-
raise RuntimeError("Logger not initialized")
|
641
|
-
logger.info("calling init triggers")
|
713
|
+
def init(self, settings: Settings) -> Run: # noqa: C901
|
714
|
+
self._logger.info("calling init triggers")
|
642
715
|
trigger.call("on_init")
|
643
716
|
|
644
|
-
assert self.settings is not None
|
645
717
|
assert self._wl is not None
|
646
718
|
|
647
|
-
|
719
|
+
self._logger.info(
|
648
720
|
f"wandb.init called with sweep_config: {self.sweep_config}\nconfig: {self.config}"
|
649
721
|
)
|
650
722
|
|
651
|
-
if
|
723
|
+
if settings._noop:
|
652
724
|
return self._make_run_disabled()
|
653
725
|
if (
|
654
|
-
|
655
|
-
or (self.settings._jupyter and self.settings.reinit is not False)
|
726
|
+
settings.reinit or (settings._jupyter and settings.reinit is not False)
|
656
727
|
) and len(self._wl._global_run_stack) > 0:
|
657
728
|
if len(self._wl._global_run_stack) > 1:
|
658
729
|
wandb.termwarn(
|
@@ -663,39 +734,39 @@ class _WandbInit:
|
|
663
734
|
)
|
664
735
|
|
665
736
|
latest_run = self._wl._global_run_stack[-1]
|
666
|
-
|
737
|
+
self._logger.info(f"found existing run on stack: {latest_run.id}")
|
667
738
|
latest_run.finish()
|
668
739
|
elif wandb.run is not None and os.getpid() == wandb.run._init_pid:
|
669
|
-
|
740
|
+
self._logger.info("wandb.init() called when a run is still active")
|
670
741
|
with telemetry.context() as tel:
|
671
742
|
tel.feature.init_return_run = True
|
672
743
|
return wandb.run
|
673
744
|
|
674
|
-
|
745
|
+
self._logger.info("starting backend")
|
675
746
|
|
676
|
-
if not
|
747
|
+
if not settings.x_disable_service:
|
677
748
|
service = self._wl.ensure_service()
|
678
|
-
|
749
|
+
self._logger.info("sending inform_init request")
|
679
750
|
service.inform_init(
|
680
|
-
settings=
|
681
|
-
run_id=
|
751
|
+
settings=settings.to_proto(),
|
752
|
+
run_id=settings.run_id, # type: ignore
|
682
753
|
)
|
683
754
|
else:
|
684
755
|
service = None
|
685
756
|
|
686
757
|
mailbox = Mailbox()
|
687
758
|
backend = Backend(
|
688
|
-
settings=
|
759
|
+
settings=settings,
|
689
760
|
service=service,
|
690
761
|
mailbox=mailbox,
|
691
762
|
)
|
692
763
|
backend.ensure_launched()
|
693
|
-
|
764
|
+
self._logger.info("backend started and connected")
|
694
765
|
|
695
766
|
# resuming needs access to the server, check server_status()?
|
696
767
|
run = Run(
|
697
768
|
config=self.config,
|
698
|
-
settings=
|
769
|
+
settings=settings,
|
699
770
|
sweep_config=self.sweep_config,
|
700
771
|
launch_config=self.launch_config,
|
701
772
|
)
|
@@ -708,18 +779,18 @@ class _WandbInit:
|
|
708
779
|
hf_version = _huggingface_version()
|
709
780
|
if hf_version:
|
710
781
|
tel.huggingface_version = hf_version
|
711
|
-
if
|
782
|
+
if settings._jupyter:
|
712
783
|
tel.env.jupyter = True
|
713
|
-
if
|
784
|
+
if settings._ipython:
|
714
785
|
tel.env.ipython = True
|
715
|
-
if
|
786
|
+
if settings._colab:
|
716
787
|
tel.env.colab = True
|
717
|
-
if
|
788
|
+
if settings._kaggle:
|
718
789
|
tel.env.kaggle = True
|
719
|
-
if
|
790
|
+
if settings._windows:
|
720
791
|
tel.env.windows = True
|
721
792
|
|
722
|
-
if
|
793
|
+
if settings.launch:
|
723
794
|
tel.feature.launch = True
|
724
795
|
|
725
796
|
for module_name in telemetry.list_telemetry_imports(only_imported=True):
|
@@ -727,8 +798,8 @@ class _WandbInit:
|
|
727
798
|
|
728
799
|
# probe the active start method
|
729
800
|
active_start_method: str | None = None
|
730
|
-
if
|
731
|
-
active_start_method =
|
801
|
+
if settings.start_method == "thread":
|
802
|
+
active_start_method = settings.start_method
|
732
803
|
else:
|
733
804
|
active_start_method = getattr(
|
734
805
|
backend._multiprocessing, "get_start_method", lambda: None
|
@@ -746,7 +817,7 @@ class _WandbInit:
|
|
746
817
|
if os.environ.get("PEX"):
|
747
818
|
tel.env.pex = True
|
748
819
|
|
749
|
-
if
|
820
|
+
if settings._aws_lambda:
|
750
821
|
tel.env.aws_lambda = True
|
751
822
|
|
752
823
|
if os.environ.get(wandb.env._DISABLE_SERVICE):
|
@@ -754,13 +825,13 @@ class _WandbInit:
|
|
754
825
|
|
755
826
|
if service:
|
756
827
|
tel.feature.service = True
|
757
|
-
if
|
828
|
+
if settings.x_flow_control_disabled:
|
758
829
|
tel.feature.flow_control_disabled = True
|
759
|
-
if
|
830
|
+
if settings.x_flow_control_custom:
|
760
831
|
tel.feature.flow_control_custom = True
|
761
|
-
if not
|
832
|
+
if not settings.x_require_legacy_service:
|
762
833
|
tel.feature.core = True
|
763
|
-
if
|
834
|
+
if settings._shared:
|
764
835
|
wandb.termwarn(
|
765
836
|
"The `_shared` feature is experimental and may change. "
|
766
837
|
"Please contact support@wandb.com for guidance and to report any issues."
|
@@ -769,7 +840,7 @@ class _WandbInit:
|
|
769
840
|
|
770
841
|
tel.env.maybe_mp = _maybe_mp_process(backend)
|
771
842
|
|
772
|
-
if not
|
843
|
+
if not settings.label_disable:
|
773
844
|
if self.notebook:
|
774
845
|
run._label_probe_notebook(self.notebook)
|
775
846
|
else:
|
@@ -783,7 +854,7 @@ class _WandbInit:
|
|
783
854
|
run=run,
|
784
855
|
)
|
785
856
|
|
786
|
-
|
857
|
+
self._logger.info("updated telemetry")
|
787
858
|
|
788
859
|
run._set_library(self._wl)
|
789
860
|
run._set_backend(backend)
|
@@ -797,25 +868,27 @@ class _WandbInit:
|
|
797
868
|
# Using GitRepo() blocks & can be slow, depending on user's current git setup.
|
798
869
|
# We don't want to block run initialization/start request, so populate run's git
|
799
870
|
# info beforehand.
|
800
|
-
if not (
|
871
|
+
if not (settings.disable_git or settings.x_disable_machine_info):
|
801
872
|
run._populate_git_info()
|
802
873
|
|
803
874
|
run_result: pb.RunUpdateResult | None = None
|
804
875
|
|
805
|
-
if
|
876
|
+
if settings._offline:
|
806
877
|
with telemetry.context(run=run) as tel:
|
807
878
|
tel.feature.offline = True
|
808
879
|
|
809
|
-
if
|
880
|
+
if settings.resume:
|
810
881
|
wandb.termwarn(
|
811
882
|
"`resume` will be ignored since W&B syncing is set to `offline`. "
|
812
883
|
f"Starting a new run with run id {run.id}."
|
813
884
|
)
|
814
885
|
error: wandb.Error | None = None
|
815
886
|
|
816
|
-
timeout =
|
887
|
+
timeout = settings.init_timeout
|
817
888
|
|
818
|
-
|
889
|
+
self._logger.info(
|
890
|
+
f"communicating run to backend with {timeout} second timeout",
|
891
|
+
)
|
819
892
|
|
820
893
|
run_init_handle = backend.interface.deliver_run(run)
|
821
894
|
result = run_init_handle.wait(
|
@@ -842,7 +915,7 @@ class _WandbInit:
|
|
842
915
|
error = ProtobufErrorHandler.to_exception(run_result.error)
|
843
916
|
|
844
917
|
if error is not None:
|
845
|
-
|
918
|
+
self._logger.error(f"encountered error: {error}")
|
846
919
|
if not service:
|
847
920
|
# Shutdown the backend and get rid of the logger
|
848
921
|
# we don't need to do console cleanup at this point
|
@@ -860,19 +933,19 @@ class _WandbInit:
|
|
860
933
|
)
|
861
934
|
|
862
935
|
if run_result.run.resumed:
|
863
|
-
|
936
|
+
self._logger.info("run resumed")
|
864
937
|
with telemetry.context(run=run) as tel:
|
865
938
|
tel.feature.resumed = run_result.run.resumed
|
866
939
|
run._set_run_obj(run_result.run)
|
867
940
|
|
868
|
-
|
941
|
+
self._logger.info("starting run threads in backend")
|
869
942
|
# initiate run (stats and metadata probing)
|
870
943
|
|
871
944
|
if service:
|
872
|
-
assert
|
945
|
+
assert settings.run_id
|
873
946
|
service.inform_start(
|
874
|
-
settings=
|
875
|
-
run_id=
|
947
|
+
settings=settings.to_proto(),
|
948
|
+
run_id=settings.run_id,
|
876
949
|
)
|
877
950
|
|
878
951
|
assert backend.interface
|
@@ -889,11 +962,11 @@ class _WandbInit:
|
|
889
962
|
|
890
963
|
run._handle_launch_artifact_overrides()
|
891
964
|
if (
|
892
|
-
|
893
|
-
and
|
894
|
-
and os.path.exists(
|
965
|
+
settings.launch
|
966
|
+
and settings.launch_config_path
|
967
|
+
and os.path.exists(settings.launch_config_path)
|
895
968
|
):
|
896
|
-
run.save(
|
969
|
+
run.save(settings.launch_config_path)
|
897
970
|
# put artifacts in run config here
|
898
971
|
# since doing so earlier will cause an error
|
899
972
|
# as the run is not upserted
|
@@ -907,7 +980,7 @@ class _WandbInit:
|
|
907
980
|
|
908
981
|
self.backend = backend
|
909
982
|
run._on_start()
|
910
|
-
|
983
|
+
self._logger.info("run started, returning control to user process")
|
911
984
|
return run
|
912
985
|
|
913
986
|
|
@@ -938,10 +1011,7 @@ def _attach(
|
|
938
1011
|
wandb._assert_is_user_process() # type: ignore
|
939
1012
|
|
940
1013
|
_wl = wandb.setup()
|
941
|
-
|
942
|
-
_set_logger(_wl._get_logger())
|
943
|
-
if logger is None:
|
944
|
-
raise UsageError("logger is not initialized")
|
1014
|
+
logger = _wl._get_logger()
|
945
1015
|
|
946
1016
|
service = _wl.ensure_service()
|
947
1017
|
|
@@ -1276,27 +1346,36 @@ def init( # noqa: C901
|
|
1276
1346
|
if resume_from is not None:
|
1277
1347
|
init_settings.resume_from = resume_from # type: ignore
|
1278
1348
|
|
1349
|
+
wl: wandb_setup._WandbSetup | None = None
|
1350
|
+
|
1279
1351
|
try:
|
1280
|
-
|
1352
|
+
wl = wandb.setup()
|
1353
|
+
|
1354
|
+
wi = _WandbInit(wl)
|
1355
|
+
|
1356
|
+
wi.maybe_login(init_settings)
|
1357
|
+
run_settings = wi.compute_run_settings(init_settings)
|
1358
|
+
wi.set_run_id(run_settings)
|
1359
|
+
|
1281
1360
|
wi.setup(
|
1282
|
-
|
1361
|
+
settings=run_settings,
|
1283
1362
|
config=config,
|
1284
1363
|
config_exclude_keys=config_exclude_keys,
|
1285
1364
|
config_include_keys=config_include_keys,
|
1286
|
-
allow_val_change=allow_val_change,
|
1287
1365
|
monitor_gym=monitor_gym,
|
1288
1366
|
)
|
1289
|
-
|
1367
|
+
|
1368
|
+
return wi.init(run_settings)
|
1290
1369
|
|
1291
1370
|
except KeyboardInterrupt as e:
|
1292
|
-
if
|
1293
|
-
|
1371
|
+
if wl:
|
1372
|
+
wl._get_logger().warning("interrupted", exc_info=e)
|
1294
1373
|
|
1295
1374
|
raise
|
1296
1375
|
|
1297
1376
|
except Exception as e:
|
1298
|
-
if
|
1299
|
-
|
1377
|
+
if wl:
|
1378
|
+
wl._get_logger().exception("error in wandb.init()", exc_info=e)
|
1300
1379
|
|
1301
1380
|
# Need to build delay into this sentry capture because our exit hooks
|
1302
1381
|
# mess with sentry's ability to send out errors before the program ends.
|
wandb/sdk/wandb_run.py
CHANGED
@@ -29,7 +29,6 @@ import wandb.util
|
|
29
29
|
from wandb import trigger
|
30
30
|
from wandb._globals import _datatypes_set_callback
|
31
31
|
from wandb.apis import internal, public
|
32
|
-
from wandb.apis.internal import Api
|
33
32
|
from wandb.apis.public import Api as PublicApi
|
34
33
|
from wandb.errors import CommError, UnsupportedError, UsageError
|
35
34
|
from wandb.errors.links import url_registry
|
@@ -1814,7 +1813,10 @@ class Run:
|
|
1814
1813
|
examples = []
|
1815
1814
|
for i in range(3):
|
1816
1815
|
pixels = np.random.randint(
|
1817
|
-
low=0,
|
1816
|
+
low=0,
|
1817
|
+
high=256,
|
1818
|
+
size=(100, 100, 3),
|
1819
|
+
dtype=np.uint8,
|
1818
1820
|
)
|
1819
1821
|
pil_image = PILImage.fromarray(pixels, mode="RGB")
|
1820
1822
|
image = wandb.Image(pil_image, caption=f"random field {i}")
|
@@ -1831,7 +1833,10 @@ class Run:
|
|
1831
1833
|
run = wandb.init()
|
1832
1834
|
# axes are (time, channel, height, width)
|
1833
1835
|
frames = np.random.randint(
|
1834
|
-
low=0,
|
1836
|
+
low=0,
|
1837
|
+
high=256,
|
1838
|
+
size=(10, 3, 100, 100),
|
1839
|
+
dtype=np.uint8,
|
1835
1840
|
)
|
1836
1841
|
run.log({"video": wandb.Video(frames, fps=4)})
|
1837
1842
|
```
|
@@ -3266,8 +3271,7 @@ class Run:
|
|
3266
3271
|
is_user_created: bool = False,
|
3267
3272
|
use_after_commit: bool = False,
|
3268
3273
|
) -> Artifact:
|
3269
|
-
|
3270
|
-
if api.settings().get("anonymous") in ["allow", "must"]:
|
3274
|
+
if self._settings.anonymous in ["allow", "must"]:
|
3271
3275
|
wandb.termwarn(
|
3272
3276
|
"Artifacts logged anonymously cannot be claimed and expire after 7 days."
|
3273
3277
|
)
|
@@ -3864,8 +3868,7 @@ class Run:
|
|
3864
3868
|
f'{printer.emoji("rocket")} View run at {printer.link(run_url)}',
|
3865
3869
|
)
|
3866
3870
|
|
3867
|
-
|
3868
|
-
if run_name and Api().api.settings().get("anonymous") in ["allow", "must"]:
|
3871
|
+
if run_name and settings.anonymous in ["allow", "must"]:
|
3869
3872
|
printer.display(
|
3870
3873
|
(
|
3871
3874
|
"Do NOT share these links with anyone."
|
wandb/sdk/wandb_settings.py
CHANGED
@@ -34,14 +34,12 @@ from pydantic_core import SchemaValidator, core_schema
|
|
34
34
|
|
35
35
|
import wandb
|
36
36
|
from wandb import env, termwarn, util
|
37
|
-
from wandb.apis.internal import Api
|
38
37
|
from wandb.errors import UsageError
|
39
38
|
from wandb.proto import wandb_settings_pb2
|
40
39
|
|
41
|
-
from .lib import apikey, credentials,
|
40
|
+
from .lib import apikey, credentials, ipython
|
42
41
|
from .lib.gitlib import GitRepo
|
43
42
|
from .lib.run_moment import RunMoment
|
44
|
-
from .lib.runid import generate_id
|
45
43
|
|
46
44
|
|
47
45
|
def _path_convert(*args: str) -> str:
|
@@ -1154,29 +1152,6 @@ class Settings(BaseModel, validate_assignment=True):
|
|
1154
1152
|
|
1155
1153
|
return settings_proto
|
1156
1154
|
|
1157
|
-
def handle_resume_logic(self):
|
1158
|
-
"""Handle logic for resuming runs."""
|
1159
|
-
# handle auto resume logic
|
1160
|
-
if self.resume == "auto":
|
1161
|
-
if os.path.exists(self.resume_fname):
|
1162
|
-
with open(self.resume_fname) as f:
|
1163
|
-
resume_run_id = json.load(f)["run_id"]
|
1164
|
-
if self.run_id is None:
|
1165
|
-
self.run_id = resume_run_id
|
1166
|
-
elif self.run_id != resume_run_id:
|
1167
|
-
wandb.termwarn(
|
1168
|
-
"Tried to auto resume run with "
|
1169
|
-
f"id {resume_run_id} but id {self.run_id} is set.",
|
1170
|
-
)
|
1171
|
-
if self.run_id is None:
|
1172
|
-
self.run_id = generate_id()
|
1173
|
-
|
1174
|
-
# persist run_id in case of failure
|
1175
|
-
if self.resume == "auto" and self.resume_fname is not None:
|
1176
|
-
filesystem.mkdir_exists_ok(self.wandb_dir)
|
1177
|
-
with open(self.resume_fname, "w") as f:
|
1178
|
-
f.write(json.dumps({"run_id": self.run_id}))
|
1179
|
-
|
1180
1155
|
@staticmethod
|
1181
1156
|
def validate_url(url: str) -> None:
|
1182
1157
|
"""Validate a URL string."""
|
@@ -1262,7 +1237,7 @@ class Settings(BaseModel, validate_assignment=True):
|
|
1262
1237
|
def _get_url_query_string(self) -> str:
|
1263
1238
|
"""Construct the query string for project, run, and sweep URLs."""
|
1264
1239
|
# TODO: remove dependency on Api()
|
1265
|
-
if
|
1240
|
+
if self.anonymous not in ["allow", "must"]:
|
1266
1241
|
return ""
|
1267
1242
|
|
1268
1243
|
api_key = apikey.api_key(settings=self)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
package_readme.md,sha256=XGlaq8rMFcoBb21rCr2d5qeSM79ZI4WslLmXqRimTGQ,4395
|
2
|
-
wandb/__init__.py,sha256=
|
3
|
-
wandb/__init__.pyi,sha256=
|
2
|
+
wandb/__init__.py,sha256=6bfGa-Ok_bVjLxHb6qRt7k5PAIsE9vs23fgzlEMhcMo,7234
|
3
|
+
wandb/__init__.pyi,sha256=hFQcodH9-eV92-XyoD3DAzwe4MWuOEWnNTRMgGAb1EA,48229
|
4
4
|
wandb/__main__.py,sha256=uHY6OxHT6RtTH34zC8_UC1GsCTkndgbdsHXv-t7dOMI,67
|
5
5
|
wandb/_globals.py,sha256=NwgYSB2tl2Z5t1Tn1xpLtfkcmPy_dF01u-xxgnCbzoc,721
|
6
6
|
wandb/data_types.py,sha256=4zXwzPgwHuMjyxzNbVQZANnHM0FoqEOn1jlLvnkdPAc,2342
|
@@ -49,8 +49,8 @@ wandb/apis/reports/v1/__init__.py,sha256=nxs3gJlbvVc0b_pV5DUypk1amMkRSq_M-xUw7qP
|
|
49
49
|
wandb/apis/reports/v2/__init__.py,sha256=vlF0ZRVHS-Qd7mBllcZri-gWE0TtjhiDSA6h5XPRVLU,271
|
50
50
|
wandb/apis/workspaces/__init__.py,sha256=XsF4ccNRUCTmI9ANjlrj_dYU1OcOi5N354Wg2Qkkaqo,273
|
51
51
|
wandb/beta/workflows.py,sha256=ENy_lmIyn3k_FHdD2ZO8HBaXdeoLrsPVbEfL_KYW8Ps,10527
|
52
|
-
wandb/bin/gpu_stats.exe,sha256=
|
53
|
-
wandb/bin/wandb-core,sha256=
|
52
|
+
wandb/bin/gpu_stats.exe,sha256=zzNA92_Q82V4yzPtsVFSo6pO4pbeaIox8u6lmftIPNc,8208896
|
53
|
+
wandb/bin/wandb-core,sha256=DKT4UChpAdWjIZI6-0sEHCciXO4eAvsGN2ingeOU5SE,47137792
|
54
54
|
wandb/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
55
55
|
wandb/cli/beta.py,sha256=_wbqhk6J2yjnNuVQAGlYbYZ9-j0sFE73zMIXVkQYlXA,5619
|
56
56
|
wandb/cli/cli.py,sha256=a3aXT1tAMH5v0_BW1r4Bo6AT2YZ7e1hTz6K4ZnEcz9k,95536
|
@@ -105,7 +105,7 @@ wandb/integration/lightning/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
|
|
105
105
|
wandb/integration/lightning/fabric/__init__.py,sha256=_KF_WmU4ynBy9WT8EVXZw0cwDtF2t1TQ_GzUDQLXeAg,97
|
106
106
|
wandb/integration/lightning/fabric/logger.py,sha256=d-vODZybasjWRWfxgea2zt8M8fX54sx1jWu3FuxB0iQ,28015
|
107
107
|
wandb/integration/metaflow/__init__.py,sha256=yoTkbO85zdlJwL5f8HmXXVVNDTcIPyYwuHNhysTzkv4,112
|
108
|
-
wandb/integration/metaflow/metaflow.py,sha256=
|
108
|
+
wandb/integration/metaflow/metaflow.py,sha256=PQ_k9IFiq86jWxcmU2Bnbbjp8cSgPiFYd_-MF5ZtL-M,12185
|
109
109
|
wandb/integration/openai/__init__.py,sha256=negbYxbmhe4hA7Zl41FA5FnZ1JP6G6IYUTK4lS4YSqs,69
|
110
110
|
wandb/integration/openai/fine_tuning.py,sha256=k58OEjNRrHuiwCzmXRhNIb18Jz8QDjorv9_hZZC0r7s,19035
|
111
111
|
wandb/integration/openai/openai.py,sha256=43Lm8sk_VksyRf8g6TJqbNlTlwA3ujaZxF5wfhqtjQk,518
|
@@ -204,14 +204,14 @@ wandb/sdk/__init__.py,sha256=6lzqckLZUs7GpFZIwpgxGJwJDvhuyo-XCQnSrtZqE1c,850
|
|
204
204
|
wandb/sdk/wandb_alerts.py,sha256=f6ygzuXTDT0IvMLcKlgatmXKx5HMPsm8sYwvPocl0Js,205
|
205
205
|
wandb/sdk/wandb_config.py,sha256=TxH6SD8DCfFU3yhmy03yewXQ4Gvgn3avZ0qbwpZJKt8,11178
|
206
206
|
wandb/sdk/wandb_helper.py,sha256=kc5Ib648to7cEGEwAuJus07rsHudL1Ux7FWPPSRnKy8,1878
|
207
|
-
wandb/sdk/wandb_init.py,sha256=
|
207
|
+
wandb/sdk/wandb_init.py,sha256=qP1D1HuG0WoEdR0FU34HQA6qNM9i6IPGhV0JeSJef8Q,57867
|
208
208
|
wandb/sdk/wandb_login.py,sha256=OupHHFIAg-EwP-3jp67rR_dlcFoVd8Qu_J1gtC26p18,11305
|
209
209
|
wandb/sdk/wandb_metadata.py,sha256=kcF7MhTM4Cnlw8d5rSp-WzKNDfy2NtUhd8FFuB2i3pY,20658
|
210
210
|
wandb/sdk/wandb_metric.py,sha256=oI6NQJJ_tyZ3YcnO0Xg5avDVr3Dh6tpTvHuPEMda30A,3378
|
211
211
|
wandb/sdk/wandb_require.py,sha256=06Mgqdd5r5u4UUpIU3T2JIAn0elkFfaWRtNwyaLu8jc,3044
|
212
212
|
wandb/sdk/wandb_require_helpers.py,sha256=4PUXmVw86_XaKj3rn20s5DAjBMO8L0m26KqnTLaQJNc,1375
|
213
|
-
wandb/sdk/wandb_run.py,sha256=
|
214
|
-
wandb/sdk/wandb_settings.py,sha256=
|
213
|
+
wandb/sdk/wandb_run.py,sha256=p9uPY-nE6EFhBUsl0jU1xxNijeTSL_1yliDPThfHZNk,159829
|
214
|
+
wandb/sdk/wandb_settings.py,sha256=vSRyZPLORsM7Gca-pgQEUNNyo5uNXbm07wkbiNZHGoU,48543
|
215
215
|
wandb/sdk/wandb_setup.py,sha256=44YSZ2o_uFGN9cRQOcbwq25EFI5VC8EJOyOLOXGxubs,13417
|
216
216
|
wandb/sdk/wandb_summary.py,sha256=eEV3hvHhbc1XQus0MUqFmvhXCzd3SPjvVVVg_fVZ1QM,4686
|
217
217
|
wandb/sdk/wandb_sweep.py,sha256=FhjfRmWS_Ffn7CwT9kjVAnvTJFnaB50mUwaGOLb2WrU,4147
|
@@ -817,8 +817,8 @@ wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/importlib2.py,sha256=kX0rdVmTDL
|
|
817
817
|
wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/platform.py,sha256=7fpTDfxSYvSRtHvyog-plRdLR5A6k1QVY_AL0gVhhPM,1563
|
818
818
|
wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/unicode_paths.py,sha256=xzyQmuba2gns1s3Qemu9SXaKV5zeTL3TP9--xOi541g,2254
|
819
819
|
wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/win32stat.py,sha256=R48kuuEIi7XzCJBJ6Xo7v6DJIbOP5EwcsWaPf5Axn_g,3951
|
820
|
-
wandb-0.19.
|
821
|
-
wandb-0.19.
|
822
|
-
wandb-0.19.
|
823
|
-
wandb-0.19.
|
824
|
-
wandb-0.19.
|
820
|
+
wandb-0.19.3.dist-info/METADATA,sha256=e19bSAZtoEB6YW4CHgz1zBmQbw5uKTC88F-KZgBokLg,10282
|
821
|
+
wandb-0.19.3.dist-info/WHEEL,sha256=F7luzo77gHneG2SMTaD6iIlqNT8oVz1uotn5Zigp4o8,89
|
822
|
+
wandb-0.19.3.dist-info/entry_points.txt,sha256=v4FCOZ9gW7Pc6KLsmgQqpCiKTrA1wh2XHmNf-NUP1-I,67
|
823
|
+
wandb-0.19.3.dist-info/licenses/LICENSE,sha256=rJ7p1acqNi17WFOAJ9WqsImXZtKZDA3i_gzdDVGRuFQ,1102
|
824
|
+
wandb-0.19.3.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|