wandb 0.18.1__py3-none-win32.whl → 0.18.2__py3-none-win32.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. wandb/__init__.py +3 -3
  2. wandb/__init__.pyi +67 -12
  3. wandb/apis/internal.py +3 -0
  4. wandb/apis/public/api.py +128 -2
  5. wandb/apis/public/artifacts.py +11 -7
  6. wandb/apis/public/jobs.py +8 -0
  7. wandb/apis/public/runs.py +16 -5
  8. wandb/bin/wandb-core +0 -0
  9. wandb/cli/cli.py +0 -3
  10. wandb/errors/__init__.py +11 -40
  11. wandb/errors/errors.py +37 -0
  12. wandb/errors/warnings.py +2 -0
  13. wandb/integration/tensorboard/log.py +1 -1
  14. wandb/old/core.py +2 -80
  15. wandb/plot/bar.py +7 -4
  16. wandb/plot/confusion_matrix.py +5 -4
  17. wandb/plot/histogram.py +7 -4
  18. wandb/plot/line.py +7 -4
  19. wandb/proto/v3/wandb_settings_pb2.py +2 -2
  20. wandb/proto/v4/wandb_settings_pb2.py +2 -2
  21. wandb/proto/v5/wandb_settings_pb2.py +2 -2
  22. wandb/sdk/artifacts/_validators.py +48 -3
  23. wandb/sdk/artifacts/artifact.py +157 -183
  24. wandb/sdk/artifacts/artifact_file_cache.py +13 -11
  25. wandb/sdk/artifacts/artifact_instance_cache.py +4 -2
  26. wandb/sdk/artifacts/artifact_manifest.py +13 -11
  27. wandb/sdk/artifacts/artifact_manifest_entry.py +24 -22
  28. wandb/sdk/artifacts/artifact_manifests/artifact_manifest_v1.py +9 -7
  29. wandb/sdk/artifacts/artifact_saver.py +27 -25
  30. wandb/sdk/artifacts/exceptions.py +26 -25
  31. wandb/sdk/artifacts/storage_handler.py +11 -9
  32. wandb/sdk/artifacts/storage_handlers/azure_handler.py +16 -14
  33. wandb/sdk/artifacts/storage_handlers/gcs_handler.py +15 -13
  34. wandb/sdk/artifacts/storage_handlers/http_handler.py +15 -14
  35. wandb/sdk/artifacts/storage_handlers/local_file_handler.py +10 -8
  36. wandb/sdk/artifacts/storage_handlers/multi_handler.py +14 -12
  37. wandb/sdk/artifacts/storage_handlers/s3_handler.py +19 -19
  38. wandb/sdk/artifacts/storage_handlers/tracking_handler.py +10 -8
  39. wandb/sdk/artifacts/storage_handlers/wb_artifact_handler.py +12 -10
  40. wandb/sdk/artifacts/storage_handlers/wb_local_artifact_handler.py +9 -7
  41. wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +31 -29
  42. wandb/sdk/artifacts/storage_policy.py +20 -20
  43. wandb/sdk/backend/backend.py +8 -26
  44. wandb/sdk/data_types/base_types/wb_value.py +1 -3
  45. wandb/sdk/data_types/video.py +2 -2
  46. wandb/sdk/interface/interface.py +0 -24
  47. wandb/sdk/interface/interface_shared.py +0 -12
  48. wandb/sdk/internal/handler.py +0 -10
  49. wandb/sdk/internal/internal_api.py +71 -0
  50. wandb/sdk/internal/sender.py +0 -43
  51. wandb/sdk/internal/tb_watcher.py +1 -1
  52. wandb/sdk/lib/_settings_toposort_generated.py +1 -0
  53. wandb/sdk/lib/hashutil.py +34 -12
  54. wandb/sdk/lib/service_connection.py +216 -0
  55. wandb/sdk/lib/service_token.py +94 -0
  56. wandb/sdk/lib/sock_client.py +7 -3
  57. wandb/sdk/service/server.py +2 -5
  58. wandb/sdk/service/service.py +0 -22
  59. wandb/sdk/wandb_init.py +32 -22
  60. wandb/sdk/wandb_run.py +12 -7
  61. wandb/sdk/wandb_settings.py +2 -0
  62. wandb/sdk/wandb_setup.py +25 -16
  63. wandb/sdk/wandb_sync.py +9 -3
  64. wandb/sdk/wandb_watch.py +31 -15
  65. wandb/util.py +8 -1
  66. {wandb-0.18.1.dist-info → wandb-0.18.2.dist-info}/METADATA +2 -1
  67. {wandb-0.18.1.dist-info → wandb-0.18.2.dist-info}/RECORD +71 -71
  68. wandb/sdk/internal/update.py +0 -113
  69. wandb/sdk/service/service_base.py +0 -50
  70. wandb/sdk/service/service_sock.py +0 -70
  71. wandb/sdk/wandb_manager.py +0 -232
  72. /wandb/{sdk/lib → plot}/viz.py +0 -0
  73. {wandb-0.18.1.dist-info → wandb-0.18.2.dist-info}/WHEEL +0 -0
  74. {wandb-0.18.1.dist-info → wandb-0.18.2.dist-info}/entry_points.txt +0 -0
  75. {wandb-0.18.1.dist-info → wandb-0.18.2.dist-info}/licenses/LICENSE +0 -0
wandb/sdk/wandb_run.py CHANGED
@@ -44,6 +44,7 @@ from wandb.apis.internal import Api
44
44
  from wandb.apis.public import Api as PublicApi
45
45
  from wandb.errors import CommError
46
46
  from wandb.integration.torch import wandb_torch
47
+ from wandb.plot.viz import CustomChart, Visualize, custom_chart
47
48
  from wandb.proto.wandb_internal_pb2 import (
48
49
  MetricRecord,
49
50
  PollExitResponse,
@@ -57,7 +58,6 @@ from wandb.sdk.lib.import_hooks import (
57
58
  unregister_post_import_hook,
58
59
  )
59
60
  from wandb.sdk.lib.paths import FilePathStr, LogicalPath, StrPath
60
- from wandb.sdk.lib.viz import CustomChart, Visualize, custom_chart
61
61
  from wandb.util import (
62
62
  _is_artifact_object,
63
63
  _is_artifact_string,
@@ -592,12 +592,14 @@ class Run:
592
592
  ) -> None:
593
593
  # pid is set, so we know if this run object was initialized by this process
594
594
  self._init_pid = os.getpid()
595
- self._settings = settings
596
595
 
597
596
  if settings._noop:
597
+ # TODO: properly handle setting for disabled mode
598
+ self._settings = settings
598
599
  return
599
600
 
600
601
  self._init(
602
+ settings=settings,
601
603
  config=config,
602
604
  sweep_config=sweep_config,
603
605
  launch_config=launch_config,
@@ -605,10 +607,13 @@ class Run:
605
607
 
606
608
  def _init(
607
609
  self,
610
+ settings: Settings,
608
611
  config: Optional[Dict[str, Any]] = None,
609
612
  sweep_config: Optional[Dict[str, Any]] = None,
610
613
  launch_config: Optional[Dict[str, Any]] = None,
611
614
  ) -> None:
615
+ self._settings = settings
616
+
612
617
  self._config = wandb_config.Config()
613
618
  self._config._set_callback(self._config_callback)
614
619
  self._config._set_artifact_callback(self._config_artifact_callback)
@@ -2194,9 +2199,9 @@ class Run:
2194
2199
  # Inform the service that we're done sending messages for this run.
2195
2200
  #
2196
2201
  # TODO: Why not do this in _atexit_cleanup()?
2197
- manager = self._wl and self._wl._get_manager()
2198
- if manager:
2199
- manager._inform_finish(run_id=self._run_id)
2202
+ service = self._wl and self._wl.service
2203
+ if service:
2204
+ service.inform_finish(run_id=self._run_id)
2200
2205
 
2201
2206
  finally:
2202
2207
  module.unset_globals()
@@ -2459,8 +2464,8 @@ class Run:
2459
2464
  logger.info("atexit reg")
2460
2465
  self._hooks = ExitHooks()
2461
2466
 
2462
- manager = self._wl and self._wl._get_manager()
2463
- if not manager:
2467
+ service = self._wl and self._wl.service
2468
+ if not service:
2464
2469
  self._hooks.hook()
2465
2470
  # NB: manager will perform atexit hook like behavior for outstanding runs
2466
2471
  atexit.register(lambda: self._atexit_cleanup())
@@ -315,6 +315,7 @@ class SettingsData:
315
315
  _executable: str
316
316
  _extra_http_headers: Mapping[str, str]
317
317
  _file_stream_max_bytes: int # max size for filestream requests in core
318
+ _file_stream_transmit_interval: float # tx interval for filestream requests in core
318
319
  # file stream retry client configuration
319
320
  _file_stream_retry_max: int # max number of retries
320
321
  _file_stream_retry_wait_min_seconds: float # min wait time between retries
@@ -664,6 +665,7 @@ class Settings(SettingsData):
664
665
  _disable_viewer={"preprocessor": _str_as_bool},
665
666
  _extra_http_headers={"preprocessor": _str_as_json},
666
667
  _file_stream_max_bytes={"preprocessor": int},
668
+ _file_stream_transmit_interval={"preprocessor": float},
667
669
  _file_stream_retry_max={"preprocessor": int},
668
670
  _file_stream_retry_wait_min_seconds={"preprocessor": float},
669
671
  _file_stream_retry_wait_max_seconds={"preprocessor": float},
wandb/sdk/wandb_setup.py CHANGED
@@ -20,7 +20,7 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
20
20
  import wandb
21
21
  from wandb.sdk.lib import import_hooks
22
22
 
23
- from . import wandb_manager, wandb_settings
23
+ from . import wandb_settings
24
24
  from .lib import config_util, server, tracelog
25
25
 
26
26
  Settings = Union["wandb.sdk.wandb_settings.Settings", Dict[str, Any]]
@@ -28,6 +28,8 @@ Settings = Union["wandb.sdk.wandb_settings.Settings", Dict[str, Any]]
28
28
  Logger = Union[logging.Logger, "_EarlyLogger"]
29
29
 
30
30
  if TYPE_CHECKING:
31
+ from wandb.sdk.lib import service_connection
32
+
31
33
  from . import wandb_run
32
34
 
33
35
  # logger will be configured to be either a standard logger instance or _EarlyLogger
@@ -82,20 +84,18 @@ class _EarlyLogger:
82
84
  class _WandbSetup__WandbSetup: # noqa: N801
83
85
  """Inner class of _WandbSetup."""
84
86
 
85
- _manager: Optional[wandb_manager._Manager]
86
- _pid: int
87
-
88
87
  def __init__(
89
88
  self,
90
89
  pid: int,
91
90
  settings: Optional[Settings] = None,
92
91
  environ: Optional[Dict[str, Any]] = None,
93
92
  ) -> None:
93
+ self._connection: Optional[service_connection.ServiceConnection] = None
94
+
94
95
  self._environ = environ or dict(os.environ)
95
96
  self._sweep_config: Optional[Dict[str, Any]] = None
96
97
  self._config: Optional[Dict[str, Any]] = None
97
98
  self._server: Optional[server.Server] = None
98
- self._manager: Optional[wandb_manager._Manager] = None
99
99
  self._pid = pid
100
100
 
101
101
  # keep track of multiple runs, so we can unwind with join()s
@@ -248,7 +248,10 @@ class _WandbSetup__WandbSetup: # noqa: N801
248
248
  print("frozen, could be trouble")
249
249
 
250
250
  def _setup(self) -> None:
251
- self._setup_manager()
251
+ if not self._settings._noop and not self._settings._disable_service:
252
+ from wandb.sdk.lib import service_connection
253
+
254
+ self._connection = service_connection.connect_to_service(self._settings)
252
255
 
253
256
  sweep_path = self._settings.sweep_param_path
254
257
  if sweep_path:
@@ -271,22 +274,21 @@ class _WandbSetup__WandbSetup: # noqa: N801
271
274
  def _teardown(self, exit_code: Optional[int] = None) -> None:
272
275
  import_hooks.unregister_all_post_import_hooks()
273
276
 
274
- if not self._manager:
277
+ if not self._connection:
275
278
  return
276
279
 
277
- internal_exit_code = self._manager._teardown(exit_code or 0)
278
- self._manager = None
280
+ internal_exit_code = self._connection.teardown(exit_code or 0)
281
+
282
+ # Reset to None so that setup() creates a new connection.
283
+ self._connection = None
279
284
 
280
285
  if internal_exit_code != 0:
281
286
  sys.exit(internal_exit_code)
282
287
 
283
- def _setup_manager(self) -> None:
284
- if self._settings._noop or self._settings._disable_service:
285
- return
286
- self._manager = wandb_manager._Manager(settings=self._settings)
287
-
288
- def _get_manager(self) -> Optional[wandb_manager._Manager]:
289
- return self._manager
288
+ @property
289
+ def service(self) -> "Optional[service_connection.ServiceConnection]":
290
+ """Returns a connection to the service process, if it exists."""
291
+ return self._connection
290
292
 
291
293
 
292
294
  class _WandbSetup:
@@ -305,6 +307,13 @@ class _WandbSetup:
305
307
  return
306
308
  _WandbSetup._instance = _WandbSetup__WandbSetup(settings=settings, pid=pid)
307
309
 
310
+ @property
311
+ def service(self) -> "Optional[service_connection.ServiceConnection]":
312
+ """Returns a connection to the service process, if it exists."""
313
+ if not self._instance:
314
+ return None
315
+ return self._instance.service
316
+
308
317
  def __getattr__(self, name: str) -> Any:
309
318
  return getattr(self._instance, name)
310
319
 
wandb/sdk/wandb_sync.py CHANGED
@@ -37,11 +37,17 @@ def _sync(
37
37
  if append:
38
38
  settings.resume.value = "allow"
39
39
 
40
- manager = wl._get_manager()
41
- manager._inform_init(settings=settings, run_id=stream_id)
40
+ service = wl.service
41
+ assert service
42
+
43
+ service.inform_init(settings=settings, run_id=stream_id)
42
44
 
43
45
  mailbox = Mailbox()
44
- backend = Backend(settings=wl.settings, manager=manager, mailbox=mailbox)
46
+ backend = Backend(
47
+ settings=wl.settings,
48
+ service=service,
49
+ mailbox=mailbox,
50
+ )
45
51
  backend.ensure_launched()
46
52
 
47
53
  assert backend.interface
wandb/sdk/wandb_watch.py CHANGED
@@ -1,7 +1,9 @@
1
1
  """watch."""
2
2
 
3
+ from __future__ import annotations
4
+
3
5
  import logging
4
- from typing import Optional
6
+ from typing import TYPE_CHECKING, Sequence
5
7
 
6
8
  try:
7
9
  from typing import Literal
@@ -12,36 +14,50 @@ import wandb
12
14
 
13
15
  from .lib import telemetry
14
16
 
17
+ if TYPE_CHECKING:
18
+ import torch # type: ignore [import-not-found]
19
+
15
20
  logger = logging.getLogger("wandb")
16
21
 
17
22
  _global_watch_idx = 0
18
23
 
19
24
 
20
25
  def watch(
21
- models,
22
- criterion=None,
23
- log: Optional[Literal["gradients", "parameters", "all"]] = "gradients",
26
+ models: torch.nn.Module | Sequence[torch.nn.Module],
27
+ criterion: torch.F | None = None,
28
+ log: Literal["gradients", "parameters", "all"] | None = "gradients",
24
29
  log_freq: int = 1000,
25
- idx: Optional[int] = None,
30
+ idx: int | None = None,
26
31
  log_graph: bool = False,
27
32
  ):
28
- """Hook into the torch model to collect gradients and the topology.
33
+ """Hooks into the given PyTorch model(s) to monitor gradients and the model's computational graph.
29
34
 
30
- Should be extended to accept arbitrary ML models.
35
+ This function can track parameters, gradients, or both during training. It should be
36
+ extended to support arbitrary machine learning models in the future.
31
37
 
32
38
  Args:
33
- models: (torch.Module) The model to hook, can be a tuple
34
- criterion: (torch.F) An optional loss value being optimized
35
- log: (str) One of "gradients", "parameters", "all", or None
36
- log_freq: (int) log gradients and parameters every N batches
37
- idx: (int) an index to be used when calling wandb.watch on multiple models
38
- log_graph: (boolean) log graph topology
39
+ models (Union[torch.nn.Module, Sequence[torch.nn.Module]]):
40
+ A single model or a sequence of models to be monitored.
41
+ criterion (Optional[torch.F]):
42
+ The loss function being optimized (optional).
43
+ log (Optional[Literal["gradients", "parameters", "all"]]):
44
+ Specifies whether to log "gradients", "parameters", or "all".
45
+ Set to None to disable logging. (default="gradients")
46
+ log_freq (int):
47
+ Frequency (in batches) to log gradients and parameters. (default=1000)
48
+ idx (Optional[int]):
49
+ Index used when tracking multiple models with `wandb.watch`. (default=None)
50
+ log_graph (bool):
51
+ Whether to log the model's computational graph. (default=False)
39
52
 
40
53
  Returns:
41
- `wandb.Graph`: The graph object that will populate after the first backward pass
54
+ wandb.Graph:
55
+ The graph object, which will be populated after the first backward pass.
42
56
 
43
57
  Raises:
44
- ValueError: If called before `wandb.init` or if any of models is not a torch.nn.Module.
58
+ ValueError:
59
+ If `wandb.init` has not been called or if any of the models are not instances
60
+ of `torch.nn.Module`.
45
61
  """
46
62
  global _global_watch_idx
47
63
 
wandb/util.py CHANGED
@@ -1888,7 +1888,14 @@ def working_set() -> Iterable[InstalledDistribution]:
1888
1888
  from importlib_metadata import distributions # type: ignore
1889
1889
 
1890
1890
  for d in distributions():
1891
- yield InstalledDistribution(key=d.metadata["Name"], version=d.version)
1891
+ try:
1892
+ # In some distributions, the "Name" attribute may not be present,
1893
+ # which can raise a KeyError. To handle this, we catch the exception
1894
+ # and skip those distributions.
1895
+ # For additional context, see: https://github.com/python/importlib_metadata/issues/371.
1896
+ yield InstalledDistribution(key=d.metadata["Name"], version=d.version)
1897
+ except KeyError:
1898
+ pass
1892
1899
 
1893
1900
 
1894
1901
  def parse_version(version: str) -> "packaging.version.Version":
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wandb
3
- Version: 0.18.1
3
+ Version: 0.18.2
4
4
  Summary: A CLI and library for interacting with the Weights & Biases API.
5
5
  Project-URL: Source, https://github.com/wandb/wandb
6
6
  Project-URL: Bug Reports, https://github.com/wandb/wandb/issues
@@ -105,6 +105,7 @@ Requires-Dist: tomli; extra == 'launch'
105
105
  Requires-Dist: typing-extensions; extra == 'launch'
106
106
  Provides-Extra: media
107
107
  Requires-Dist: bokeh; extra == 'media'
108
+ Requires-Dist: imageio; extra == 'media'
108
109
  Requires-Dist: moviepy; extra == 'media'
109
110
  Requires-Dist: numpy; extra == 'media'
110
111
  Requires-Dist: pillow; extra == 'media'