wandb 0.18.6__py3-none-win_amd64.whl → 0.19.0__py3-none-win_amd64.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 (120) hide show
  1. package_readme.md +8 -0
  2. wandb/__init__.py +5 -7
  3. wandb/__init__.pyi +51 -30
  4. wandb/analytics/sentry.py +4 -10
  5. wandb/apis/importers/internals/internal.py +6 -6
  6. wandb/apis/importers/internals/protocols.py +11 -7
  7. wandb/apis/public/api.py +5 -1
  8. wandb/apis/public/jobs.py +1 -7
  9. wandb/apis/public/reports.py +6 -17
  10. wandb/apis/public/runs.py +12 -10
  11. wandb/bin/gpu_stats.exe +0 -0
  12. wandb/bin/wandb-core +0 -0
  13. wandb/cli/cli.py +9 -45
  14. wandb/env.py +3 -5
  15. wandb/errors/links.py +1 -1
  16. wandb/errors/term.py +1 -6
  17. wandb/filesync/dir_watcher.py +3 -3
  18. wandb/filesync/step_upload.py +2 -5
  19. wandb/integration/fastai/__init__.py +1 -6
  20. wandb/integration/gym/__init__.py +1 -7
  21. wandb/integration/keras/callbacks/metrics_logger.py +1 -8
  22. wandb/integration/keras/callbacks/model_checkpoint.py +1 -8
  23. wandb/integration/keras/keras.py +3 -5
  24. wandb/integration/lightgbm/__init__.py +1 -1
  25. wandb/integration/sb3/sb3.py +1 -7
  26. wandb/integration/sklearn/utils.py +1 -1
  27. wandb/integration/tensorboard/log.py +1 -2
  28. wandb/integration/torch/wandb_torch.py +1 -1
  29. wandb/integration/ultralytics/bbox_utils.py +9 -2
  30. wandb/jupyter.py +4 -4
  31. wandb/proto/v3/wandb_internal_pb2.py +31 -31
  32. wandb/proto/v3/wandb_settings_pb2.py +2 -2
  33. wandb/proto/v3/wandb_telemetry_pb2.py +4 -4
  34. wandb/proto/v4/wandb_internal_pb2.py +31 -31
  35. wandb/proto/v4/wandb_settings_pb2.py +2 -2
  36. wandb/proto/v4/wandb_telemetry_pb2.py +4 -4
  37. wandb/proto/v5/wandb_internal_pb2.py +31 -31
  38. wandb/proto/v5/wandb_settings_pb2.py +2 -2
  39. wandb/proto/v5/wandb_telemetry_pb2.py +4 -4
  40. wandb/proto/wandb_deprecated.py +3 -11
  41. wandb/proto/wandb_generate_deprecated.py +3 -7
  42. wandb/sdk/artifacts/artifact.py +3 -11
  43. wandb/sdk/artifacts/artifact_file_cache.py +2 -5
  44. wandb/sdk/artifacts/artifact_saver.py +2 -6
  45. wandb/sdk/artifacts/storage_handlers/gcs_handler.py +2 -4
  46. wandb/sdk/artifacts/storage_handlers/local_file_handler.py +2 -4
  47. wandb/sdk/artifacts/storage_handlers/s3_handler.py +2 -4
  48. wandb/sdk/backend/backend.py +1 -1
  49. wandb/sdk/data_types/base_types/wb_value.py +20 -10
  50. wandb/sdk/data_types/histogram.py +1 -3
  51. wandb/sdk/data_types/object_3d.py +2 -6
  52. wandb/sdk/data_types/table.py +1 -1
  53. wandb/sdk/data_types/utils.py +1 -2
  54. wandb/sdk/data_types/video.py +15 -4
  55. wandb/sdk/integration_utils/auto_logging.py +1 -8
  56. wandb/sdk/interface/interface.py +12 -5
  57. wandb/sdk/interface/interface_queue.py +0 -6
  58. wandb/sdk/interface/interface_shared.py +9 -0
  59. wandb/sdk/interface/router.py +1 -2
  60. wandb/sdk/interface/router_queue.py +0 -3
  61. wandb/sdk/interface/router_relay.py +0 -2
  62. wandb/sdk/internal/file_stream.py +1 -4
  63. wandb/sdk/internal/flow_control.py +1 -1
  64. wandb/sdk/internal/handler.py +8 -5
  65. wandb/sdk/internal/internal.py +3 -17
  66. wandb/sdk/internal/internal_api.py +3 -10
  67. wandb/sdk/internal/internal_util.py +0 -3
  68. wandb/sdk/internal/job_builder.py +20 -12
  69. wandb/sdk/internal/progress.py +1 -5
  70. wandb/sdk/internal/sender.py +9 -15
  71. wandb/sdk/internal/settings_static.py +4 -10
  72. wandb/sdk/internal/system/assets/cpu.py +2 -2
  73. wandb/sdk/internal/system/assets/disk.py +3 -3
  74. wandb/sdk/internal/system/assets/gpu.py +7 -7
  75. wandb/sdk/internal/system/assets/gpu_amd.py +1 -7
  76. wandb/sdk/internal/system/assets/interfaces.py +11 -13
  77. wandb/sdk/internal/system/assets/ipu.py +1 -1
  78. wandb/sdk/internal/system/assets/memory.py +2 -2
  79. wandb/sdk/internal/system/assets/open_metrics.py +2 -8
  80. wandb/sdk/internal/system/assets/trainium.py +3 -9
  81. wandb/sdk/internal/system/system_info.py +14 -13
  82. wandb/sdk/internal/system/system_monitor.py +5 -12
  83. wandb/sdk/internal/tb_watcher.py +1 -1
  84. wandb/sdk/internal/writer.py +2 -4
  85. wandb/sdk/launch/__init__.py +2 -1
  86. wandb/sdk/launch/agent/run_queue_item_file_saver.py +1 -7
  87. wandb/sdk/launch/create_job.py +2 -3
  88. wandb/sdk/launch/runner/abstract.py +1 -6
  89. wandb/sdk/launch/runner/kubernetes_monitor.py +2 -4
  90. wandb/sdk/lib/apikey.py +2 -6
  91. wandb/sdk/lib/fsm.py +12 -6
  92. wandb/sdk/lib/ipython.py +1 -6
  93. wandb/sdk/lib/module.py +0 -3
  94. wandb/sdk/lib/progress.py +2 -3
  95. wandb/sdk/lib/run_moment.py +1 -7
  96. wandb/sdk/lib/server.py +10 -24
  97. wandb/sdk/lib/sock_client.py +0 -5
  98. wandb/sdk/service/server.py +3 -12
  99. wandb/sdk/service/server_sock.py +0 -2
  100. wandb/sdk/service/service.py +5 -5
  101. wandb/sdk/wandb_init.py +215 -166
  102. wandb/sdk/wandb_login.py +17 -27
  103. wandb/sdk/wandb_run.py +129 -161
  104. wandb/sdk/wandb_settings.py +978 -1760
  105. wandb/sdk/wandb_setup.py +87 -94
  106. wandb/sdk/wandb_watch.py +1 -1
  107. wandb/sync/sync.py +1 -2
  108. wandb/util.py +7 -40
  109. wandb/wandb_controller.py +10 -12
  110. {wandb-0.18.6.dist-info → wandb-0.19.0.dist-info}/METADATA +14 -4
  111. {wandb-0.18.6.dist-info → wandb-0.19.0.dist-info}/RECORD +114 -120
  112. {wandb-0.18.6.dist-info → wandb-0.19.0.dist-info}/WHEEL +1 -1
  113. wandb/integration/magic.py +0 -556
  114. wandb/magic.py +0 -3
  115. wandb/sdk/lib/_settings_toposort_generate.py +0 -159
  116. wandb/sdk/lib/_settings_toposort_generated.py +0 -250
  117. wandb/sdk/lib/reporting.py +0 -99
  118. wandb/sdk/lib/tracelog.py +0 -255
  119. {wandb-0.18.6.dist-info → wandb-0.19.0.dist-info}/entry_points.txt +0 -0
  120. {wandb-0.18.6.dist-info → wandb-0.19.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,5 +1,6 @@
1
1
  from typing import TYPE_CHECKING, Any, ClassVar, Dict, List, Optional, Type, Union
2
2
 
3
+ import wandb
3
4
  from wandb import util
4
5
 
5
6
  if TYPE_CHECKING: # pragma: no cover
@@ -13,16 +14,25 @@ if TYPE_CHECKING: # pragma: no cover
13
14
  def _server_accepts_client_ids() -> bool:
14
15
  from wandb.util import parse_version
15
16
 
16
- # First, if we are offline, assume the backend server cannot
17
- # accept client IDs. Unfortunately, this is the best we can do
18
- # until we are sure that all local versions are > "0.11.0" max_cli_version.
19
- # The practical implication is that tables logged in offline mode
20
- # will not show up in the workspace (but will still show up in artifacts). This
21
- # means we never lose data, and we can still view using weave. If we decided
22
- # to use client ids in offline mode, then the manifests and artifact data
23
- # would never be resolvable and would lead to failed uploads. Our position
24
- # is to never lose data - and instead take the tradeoff in the UI.
25
- if util._is_offline():
17
+ # There are versions of W&B Server that cannot accept client IDs. Those versions of
18
+ # the backend have a max_cli_version of less than "0.11.0." If the backend cannot
19
+ # accept client IDs, manifests and artifact data would never be resolvable and lead
20
+ # to failed uploads. Our position in 2021/06/29 was to never lose data - and instead take the
21
+ # tradeoff in the UI. The results in tables not displaying media correctly, but
22
+ # the table can still be accessed via the .artifact op.
23
+ #
24
+ # The latest SDK version that is < "0.11.0" was released on 2021/06/29.
25
+ # AS OF NOW, 2024/11/06, we assume that all customer's server deployments accept
26
+ # client IDs.
27
+ #
28
+ # If there are any users with issues on an older backend, customers can disable the
29
+ # setting `allow_offline_artifacts` to revert the SDK's behavior back to not
30
+ # using client IDs in offline mode.
31
+ if (
32
+ util._is_offline()
33
+ and wandb.run
34
+ and not wandb.run.settings.allow_offline_artifacts
35
+ ):
26
36
  return False
27
37
 
28
38
  # If the script is online, request the max_cli_version and ensure the server
@@ -78,9 +78,7 @@ class Histogram(WBValue):
78
78
  self.histogram = self.histogram.tolist()
79
79
  self.bins = self.bins.tolist()
80
80
  if len(self.histogram) > self.MAX_LENGTH:
81
- raise ValueError(
82
- "The maximum length of a histogram is %i" % self.MAX_LENGTH
83
- )
81
+ raise ValueError(f"The maximum length of a histogram is {self.MAX_LENGTH}")
84
82
  if len(self.histogram) + 1 != len(self.bins):
85
83
  raise ValueError("len(bins) must be len(histogram) + 1")
86
84
 
@@ -2,24 +2,20 @@ import codecs
2
2
  import itertools
3
3
  import json
4
4
  import os
5
- import sys
6
5
  from typing import (
7
6
  TYPE_CHECKING,
8
7
  ClassVar,
8
+ Literal,
9
9
  Optional,
10
10
  Sequence,
11
11
  Set,
12
12
  TextIO,
13
13
  Tuple,
14
14
  Type,
15
+ TypedDict,
15
16
  Union,
16
17
  )
17
18
 
18
- if sys.version_info >= (3, 8):
19
- from typing import Literal, TypedDict
20
- else:
21
- from typing_extensions import Literal, TypedDict
22
-
23
19
  import wandb
24
20
  from wandb import util
25
21
  from wandb.sdk.lib import runid
@@ -490,7 +490,7 @@ class Table(Media):
490
490
  f"the limit with `wandb.Table.MAX_ARTIFACT_ROWS = X` and try again. Note: "
491
491
  f"this may cause slower queries in the W&B UI."
492
492
  )
493
- logging.warning("Truncating wandb.Table object to %i rows." % max_rows)
493
+ logging.warning(f"Truncating wandb.Table object to {max_rows} rows.")
494
494
  return {"columns": self.columns, "data": self.data[:max_rows]}
495
495
 
496
496
  def bind_to_run(self, *args, **kwargs):
@@ -175,8 +175,7 @@ def _prune_max_seq(seq: Sequence["BatchableMedia"]) -> Sequence["BatchableMedia"
175
175
  items = seq
176
176
  if hasattr(seq[0], "MAX_ITEMS") and seq[0].MAX_ITEMS < len(seq):
177
177
  logging.warning(
178
- "Only %i %s will be uploaded."
179
- % (seq[0].MAX_ITEMS, seq[0].__class__.__name__)
178
+ f"Only {seq[0].MAX_ITEMS} {seq[0].__class__.__name__} will be uploaded."
180
179
  )
181
180
  items = seq[: seq[0].MAX_ITEMS]
182
181
  return items
@@ -138,10 +138,21 @@ class Video(BatchableMedia):
138
138
  self.encode(fps=fps)
139
139
 
140
140
  def encode(self, fps: int = 4) -> None:
141
- mpy = util.get_module(
142
- "moviepy.editor",
143
- required='wandb.Video requires moviepy when passing raw data. Install with "pip install wandb[media]"',
144
- )
141
+ # Try to import ImageSequenceClip from the appropriate MoviePy module
142
+ mpy = None
143
+ try:
144
+ # Attempt to load moviepy.editor for MoviePy < 2.0
145
+ mpy = util.get_module(
146
+ "moviepy.editor",
147
+ required='wandb.Video requires moviepy when passing raw data. Install with "pip install wandb[media]"',
148
+ )
149
+ except wandb.Error:
150
+ # Fallback to moviepy for MoviePy >= 2.0
151
+ mpy = util.get_module(
152
+ "moviepy",
153
+ required='wandb.Video requires moviepy when passing raw data. Install with "pip install wandb[media]"',
154
+ )
155
+
145
156
  tensor = self._prepare_video(self.data)
146
157
  _, self._height, self._width, self._channels = tensor.shape # type: ignore
147
158
 
@@ -2,20 +2,13 @@ import asyncio
2
2
  import functools
3
3
  import inspect
4
4
  import logging
5
- import sys
6
- from typing import Any, Dict, Optional, Sequence, TypeVar
5
+ from typing import Any, Dict, Optional, Protocol, Sequence, TypeVar
7
6
 
8
7
  import wandb.sdk
9
8
  import wandb.util
10
9
  from wandb.sdk.lib import telemetry as wb_telemetry
11
10
  from wandb.sdk.lib.timer import Timer
12
11
 
13
- if sys.version_info >= (3, 8):
14
- from typing import Protocol
15
- else:
16
- from typing_extensions import Protocol
17
-
18
-
19
12
  logger = logging.getLogger(__name__)
20
13
 
21
14
 
@@ -11,7 +11,6 @@ InterfaceRelay: Responses are routed to a relay queue (not matching uuids)
11
11
  import gzip
12
12
  import logging
13
13
  import os
14
- import sys
15
14
  import time
16
15
  from abc import abstractmethod
17
16
  from pathlib import Path
@@ -22,9 +21,11 @@ from typing import (
22
21
  Dict,
23
22
  Iterable,
24
23
  List,
24
+ Literal,
25
25
  NewType,
26
26
  Optional,
27
27
  Tuple,
28
+ TypedDict,
28
29
  Union,
29
30
  )
30
31
 
@@ -54,10 +55,6 @@ MANIFEST_FILE_SIZE_THRESHOLD = 100_000
54
55
 
55
56
  GlobStr = NewType("GlobStr", str)
56
57
 
57
- if sys.version_info >= (3, 8):
58
- from typing import Literal, TypedDict
59
- else:
60
- from typing_extensions import Literal, TypedDict
61
58
 
62
59
  PolicyName = Literal["now", "live", "end"]
63
60
 
@@ -953,6 +950,16 @@ class InterfaceBase:
953
950
  def _deliver_poll_exit(self, poll_exit: pb.PollExitRequest) -> MailboxHandle:
954
951
  raise NotImplementedError
955
952
 
953
+ def deliver_finish_without_exit(self) -> MailboxHandle:
954
+ run_finish_without_exit = pb.RunFinishWithoutExitRequest()
955
+ return self._deliver_finish_without_exit(run_finish_without_exit)
956
+
957
+ @abstractmethod
958
+ def _deliver_finish_without_exit(
959
+ self, run_finish_without_exit: pb.RunFinishWithoutExitRequest
960
+ ) -> MailboxHandle:
961
+ raise NotImplementedError
962
+
956
963
  def deliver_request_sampled_history(self) -> MailboxHandle:
957
964
  sampled_history = pb.SampledHistoryRequest()
958
965
  return self._deliver_request_sampled_history(sampled_history)
@@ -8,7 +8,6 @@ import logging
8
8
  from multiprocessing.process import BaseProcess
9
9
  from typing import TYPE_CHECKING, Optional
10
10
 
11
- from ..lib import tracelog
12
11
  from ..lib.mailbox import Mailbox
13
12
  from .interface_shared import InterfaceShared
14
13
  from .router_queue import MessageQueueRouter
@@ -37,10 +36,6 @@ class InterfaceQueue(InterfaceShared):
37
36
  ) -> None:
38
37
  self.record_q = record_q
39
38
  self.result_q = result_q
40
- if self.record_q:
41
- tracelog.annotate_queue(self.record_q, "record_q")
42
- if self.result_q:
43
- tracelog.annotate_queue(self.result_q, "result_q")
44
39
  super().__init__(process=process, process_check=process_check, mailbox=mailbox)
45
40
 
46
41
  def _init_router(self) -> None:
@@ -55,5 +50,4 @@ class InterfaceQueue(InterfaceShared):
55
50
  if local:
56
51
  record.control.local = local
57
52
  if self.record_q:
58
- tracelog.log_message_queue(record, self.record_q)
59
53
  self.record_q.put(record)
@@ -153,6 +153,7 @@ class InterfaceShared(InterfaceBase):
153
153
  get_system_metrics: Optional[pb.GetSystemMetricsRequest] = None,
154
154
  python_packages: Optional[pb.PythonPackagesRequest] = None,
155
155
  job_input: Optional[pb.JobInputRequest] = None,
156
+ run_finish_without_exit: Optional[pb.RunFinishWithoutExitRequest] = None,
156
157
  ) -> pb.Record:
157
158
  request = pb.Request()
158
159
  if login:
@@ -217,6 +218,8 @@ class InterfaceShared(InterfaceBase):
217
218
  request.python_packages.CopyFrom(python_packages)
218
219
  elif job_input:
219
220
  request.job_input.CopyFrom(job_input)
221
+ elif run_finish_without_exit:
222
+ request.run_finish_without_exit.CopyFrom(run_finish_without_exit)
220
223
  else:
221
224
  raise Exception("Invalid request")
222
225
  record = self._make_record(request=request)
@@ -482,6 +485,12 @@ class InterfaceShared(InterfaceBase):
482
485
  record = self._make_request(poll_exit=poll_exit)
483
486
  return self._deliver_record(record)
484
487
 
488
+ def _deliver_finish_without_exit(
489
+ self, run_finish_without_exit: pb.RunFinishWithoutExitRequest
490
+ ) -> MailboxHandle:
491
+ record = self._make_request(run_finish_without_exit=run_finish_without_exit)
492
+ return self._deliver_record(record)
493
+
485
494
  def _deliver_stop_status(self, stop_status: pb.StopStatusRequest) -> MailboxHandle:
486
495
  record = self._make_request(stop_status=stop_status)
487
496
  return self._deliver_record(record)
@@ -10,7 +10,7 @@ import uuid
10
10
  from abc import abstractmethod
11
11
  from typing import TYPE_CHECKING, Dict, Optional
12
12
 
13
- from ..lib import mailbox, tracelog
13
+ from ..lib import mailbox
14
14
  from .message_future import MessageFuture
15
15
 
16
16
  if TYPE_CHECKING:
@@ -108,7 +108,6 @@ class MessageRouter:
108
108
  # TODO (cvp): saw this in tests, seemed benign enough to ignore, but
109
109
  # could point to other issues.
110
110
  if msg.uuid != "":
111
- tracelog.log_message_assert(msg)
112
111
  logger.warning(
113
112
  "No listener found for msg with uuid %s (%s)", msg.uuid, msg
114
113
  )
@@ -7,7 +7,6 @@ Router to manage responses from a queue.
7
7
  import queue
8
8
  from typing import TYPE_CHECKING, Optional
9
9
 
10
- from ..lib import tracelog
11
10
  from ..lib.mailbox import Mailbox
12
11
  from .router import MessageRouter
13
12
 
@@ -36,9 +35,7 @@ class MessageQueueRouter(MessageRouter):
36
35
  msg = self._response_queue.get(timeout=1)
37
36
  except queue.Empty:
38
37
  return None
39
- tracelog.log_message_dequeue(msg, self._response_queue)
40
38
  return msg
41
39
 
42
40
  def _send_message(self, record: "pb.Record") -> None:
43
- tracelog.log_message_queue(record, self._request_queue)
44
41
  self._request_queue.put(record)
@@ -6,7 +6,6 @@ Router to manage responses from a queue with relay.
6
6
 
7
7
  from typing import TYPE_CHECKING
8
8
 
9
- from ..lib import tracelog
10
9
  from ..lib.mailbox import Mailbox
11
10
  from .router_queue import MessageQueueRouter
12
11
 
@@ -33,7 +32,6 @@ class MessageRelayRouter(MessageQueueRouter):
33
32
 
34
33
  def _handle_msg_rcv(self, msg: "pb.Result") -> None:
35
34
  if msg.control.relay_id:
36
- tracelog.log_message_queue(msg, self._relay_queue)
37
35
  self._relay_queue.put(msg)
38
36
  return
39
37
  super()._handle_msg_rcv(msg)
@@ -24,10 +24,7 @@ from typing import (
24
24
  )
25
25
 
26
26
  if TYPE_CHECKING:
27
- if sys.version_info >= (3, 8):
28
- from typing import TypedDict
29
- else:
30
- from typing_extensions import TypedDict
27
+ from typing import TypedDict
31
28
 
32
29
  class ProcessedChunk(TypedDict):
33
30
  offset: int
@@ -88,7 +88,7 @@ class FlowControl:
88
88
  or _threshold_bytes_mid == 0
89
89
  or _threshold_bytes_low == 0
90
90
  ):
91
- threshold = settings._network_buffer or DEFAULT_THRESHOLD
91
+ threshold = settings.x_network_buffer or DEFAULT_THRESHOLD
92
92
  _threshold_bytes_high = threshold
93
93
  _threshold_bytes_mid = threshold // 2
94
94
  _threshold_bytes_low = threshold // 4
@@ -38,7 +38,7 @@ from wandb.proto.wandb_internal_pb2 import (
38
38
  )
39
39
 
40
40
  from ..interface.interface_queue import InterfaceQueue
41
- from ..lib import handler_util, proto_util, tracelog
41
+ from ..lib import handler_util, proto_util
42
42
  from . import context, sample, tb_watcher
43
43
  from .settings_static import SettingsStatic
44
44
  from .system.system_monitor import SystemMonitor
@@ -163,11 +163,9 @@ class HandleManager:
163
163
  def _dispatch_record(self, record: Record, always_send: bool = False) -> None:
164
164
  if always_send:
165
165
  record.control.always_send = True
166
- tracelog.log_message_queue(record, self._writer_q)
167
166
  self._writer_q.put(record)
168
167
 
169
168
  def _respond_result(self, result: Result) -> None:
170
- tracelog.log_message_queue(result, self._result_q)
171
169
  context_id = context.context_id_from_result(result)
172
170
  self._context_keeper.release(context_id)
173
171
  self._result_q.put(result)
@@ -694,9 +692,14 @@ class HandleManager:
694
692
  self._settings,
695
693
  self._interface,
696
694
  )
697
- if not self._settings._disable_stats:
695
+ if not (
696
+ self._settings.x_disable_stats or self._settings.x_disable_machine_info
697
+ ):
698
698
  self._system_monitor.start()
699
- if not self._settings._disable_meta and not run_start.run.resumed:
699
+ if (
700
+ not (self._settings.x_disable_meta or self._settings.x_disable_machine_info)
701
+ and not run_start.run.resumed
702
+ ):
700
703
  self._system_monitor.probe(publish=True)
701
704
 
702
705
  self._tb_watcher = tb_watcher.TBWatcher(
@@ -28,7 +28,6 @@ import psutil
28
28
  import wandb
29
29
 
30
30
  from ..interface.interface_queue import InterfaceQueue
31
- from ..lib import tracelog
32
31
  from . import context, handler, internal_util, sender, writer
33
32
 
34
33
  if TYPE_CHECKING:
@@ -63,7 +62,6 @@ def wandb_internal(
63
62
  """
64
63
  # mark this process as internal
65
64
  wandb._set_internal_process() # type: ignore
66
- _setup_tracelog()
67
65
  started = time.time()
68
66
 
69
67
  # any sentry events in the internal process will be tagged as such
@@ -77,7 +75,7 @@ def wandb_internal(
77
75
  # Let's make sure we don't modify settings so use a static object
78
76
  _settings = settings
79
77
  if _settings.log_internal:
80
- configure_logging(_settings.log_internal, _settings._log_level)
78
+ configure_logging(_settings.log_internal, _settings.x_log_level)
81
79
 
82
80
  user_pid = user_pid or os.getppid()
83
81
  pid = os.getpid()
@@ -88,8 +86,6 @@ def wandb_internal(
88
86
  datetime.fromtimestamp(started),
89
87
  )
90
88
 
91
- tracelog.annotate_queue(record_q, "record_q")
92
- tracelog.annotate_queue(result_q, "result_q")
93
89
  publish_interface = InterfaceQueue(record_q=record_q)
94
90
 
95
91
  stopped = threading.Event()
@@ -98,10 +94,8 @@ def wandb_internal(
98
94
  context_keeper = context.ContextKeeper()
99
95
 
100
96
  send_record_q: Queue[Record] = queue.Queue()
101
- tracelog.annotate_queue(send_record_q, "send_q")
102
97
 
103
98
  write_record_q: Queue[Record] = queue.Queue()
104
- tracelog.annotate_queue(write_record_q, "write_q")
105
99
 
106
100
  record_sender_thread = SenderThread(
107
101
  settings=_settings,
@@ -175,7 +169,7 @@ def wandb_internal(
175
169
  traceback.print_exception(*exc_info)
176
170
  wandb._sentry.exception(exc_info)
177
171
  wandb.termerror("Internal wandb error: file data was not synced")
178
- if not settings._disable_service:
172
+ if not settings.x_disable_service:
179
173
  # TODO: We can make this more graceful by returning an error to streams.py
180
174
  # and potentially just fail the one stream.
181
175
  os._exit(-1)
@@ -184,14 +178,6 @@ def wandb_internal(
184
178
  close_internal_log()
185
179
 
186
180
 
187
- def _setup_tracelog() -> None:
188
- # TODO: remove this temporary hack, need to find a better way to pass settings
189
- # to the server. for now lets just look at the environment variable we need
190
- tracelog_mode = os.environ.get("WANDB_TRACELOG")
191
- if tracelog_mode:
192
- tracelog.enable(tracelog_mode)
193
-
194
-
195
181
  def configure_logging(
196
182
  log_fname: str, log_level: int, run_id: Optional[str] = None
197
183
  ) -> None:
@@ -394,7 +380,7 @@ class ProcessCheck:
394
380
  self.settings = settings
395
381
  self.pid = user_pid
396
382
  self.check_process_last = None
397
- self.check_process_interval = settings._internal_check_process
383
+ self.check_process_interval = settings.x_internal_check_process
398
384
 
399
385
  def is_dead(self) -> bool:
400
386
  if not self.check_process_interval or not self.pid:
@@ -20,6 +20,7 @@ from typing import (
20
20
  Dict,
21
21
  Iterable,
22
22
  List,
23
+ Literal,
23
24
  Mapping,
24
25
  MutableMapping,
25
26
  NamedTuple,
@@ -30,11 +31,6 @@ from typing import (
30
31
  Union,
31
32
  )
32
33
 
33
- if sys.version_info >= (3, 8):
34
- from typing import Literal
35
- else:
36
- from typing_extensions import Literal
37
-
38
34
  import click
39
35
  import requests
40
36
  import yaml
@@ -63,10 +59,7 @@ logger = logging.getLogger(__name__)
63
59
  LAUNCH_DEFAULT_PROJECT = "model-registry"
64
60
 
65
61
  if TYPE_CHECKING:
66
- if sys.version_info >= (3, 8):
67
- from typing import Literal, TypedDict
68
- else:
69
- from typing_extensions import Literal, TypedDict
62
+ from typing import Literal, TypedDict
70
63
 
71
64
  from .progress import ProgressFn
72
65
 
@@ -4557,7 +4550,7 @@ class Api:
4557
4550
  check_httpclient_logger_handler()
4558
4551
  return requests.put(
4559
4552
  url=url,
4560
- headers={"Content-Length": "0", "Content-Range": "bytes */%i" % length},
4553
+ headers={"Content-Length": "0", "Content-Range": f"bytes */{length}"},
4561
4554
  )
4562
4555
 
4563
4556
  def _flatten_edges(self, response: "_Response") -> List[Dict]:
@@ -11,8 +11,6 @@ import threading
11
11
  import time
12
12
  from typing import TYPE_CHECKING, Optional, Tuple, Type, Union
13
13
 
14
- from ..lib import tracelog
15
-
16
14
  if TYPE_CHECKING:
17
15
  from queue import Queue
18
16
  from threading import Event
@@ -95,6 +93,5 @@ class RecordLoopThread(ExceptionThread):
95
93
  record = self._input_record_q.get(timeout=1)
96
94
  except queue.Empty:
97
95
  continue
98
- tracelog.log_message_dequeue(record, self._input_record_q)
99
96
  self._process(record)
100
97
  self._finish()
@@ -5,7 +5,18 @@ import logging
5
5
  import os
6
6
  import re
7
7
  import sys
8
- from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Tuple, Union
8
+ from typing import (
9
+ TYPE_CHECKING,
10
+ Any,
11
+ Callable,
12
+ Dict,
13
+ List,
14
+ Literal,
15
+ Optional,
16
+ Tuple,
17
+ TypedDict,
18
+ Union,
19
+ )
9
20
 
10
21
  import wandb
11
22
  from wandb.sdk.artifacts.artifact import Artifact
@@ -16,11 +27,6 @@ from wandb.util import make_artifact_name_safe
16
27
 
17
28
  from .settings_static import SettingsStatic
18
29
 
19
- if sys.version_info >= (3, 8):
20
- from typing import Literal, TypedDict
21
- else:
22
- from typing_extensions import Literal, TypedDict
23
-
24
30
  _logger = logging.getLogger(__name__)
25
31
 
26
32
  if TYPE_CHECKING:
@@ -152,7 +158,7 @@ class JobBuilder:
152
158
  self._logged_code_artifact = None
153
159
  self._job_seq_id = None
154
160
  self._job_version_alias = None
155
- self._disable = settings.disable_job_creation
161
+ self._disable = settings.disable_job_creation or settings.x_disable_machine_info
156
162
  self._partial_source_id = None
157
163
  self._aliases = []
158
164
  self._source_type: Optional[Literal["repo", "artifact", "image"]] = (
@@ -228,16 +234,16 @@ class JobBuilder:
228
234
  ):
229
235
  return None, None
230
236
 
231
- if root is None or self._settings._jupyter_root is None:
237
+ if root is None or self._settings.x_jupyter_root is None:
232
238
  _logger.info("target path does not exist, exiting")
233
239
  return None, None
234
- assert self._settings._jupyter_root is not None
240
+ assert self._settings.x_jupyter_root is not None
235
241
  # git notebooks set the root to the git root,
236
242
  # jupyter_root contains the path where the jupyter notebook was started
237
243
  # program_relpath contains the path from jupyter_root to the file
238
244
  # full program path here is actually the relpath from the program to the git root
239
245
  full_program_path = os.path.join(
240
- os.path.relpath(str(self._settings._jupyter_root), root),
246
+ os.path.relpath(str(self._settings.x_jupyter_root), root),
241
247
  program_relpath,
242
248
  )
243
249
  full_program_path = os.path.normpath(full_program_path)
@@ -476,7 +482,8 @@ class JobBuilder:
476
482
  # can't build a job without a python version
477
483
  if runtime is None:
478
484
  self._log_if_verbose(
479
- "No python version found in metadata, not creating job artifact. See https://docs.wandb.ai/guides/launch/create-job",
485
+ "No python version found in metadata, not creating job artifact. "
486
+ "See https://docs.wandb.ai/guides/launch/create-job",
480
487
  "warn",
481
488
  )
482
489
  return None
@@ -505,7 +512,8 @@ class JobBuilder:
505
512
  program_relpath = self._get_program_relpath(source_type, metadata)
506
513
  if not self._partial and source_type != "image" and not program_relpath:
507
514
  self._log_if_verbose(
508
- "No program path found, not creating job artifact. See https://docs.wandb.ai/guides/launch/create-job",
515
+ "No program path found, not creating job artifact. "
516
+ "See https://docs.wandb.ai/guides/launch/create-job",
509
517
  "warn",
510
518
  )
511
519
  return None
@@ -1,16 +1,12 @@
1
1
  """progress."""
2
2
 
3
3
  import os
4
- import sys
5
4
  from typing import IO, TYPE_CHECKING, Optional
6
5
 
7
6
  from wandb.errors import CommError
8
7
 
9
8
  if TYPE_CHECKING:
10
- if sys.version_info >= (3, 8):
11
- from typing import Protocol
12
- else:
13
- from typing_extensions import Protocol
9
+ from typing import Protocol
14
10
 
15
11
  class ProgressFn(Protocol):
16
12
  def __call__(self, new_bytes: int, total_bytes: int) -> None: