wandb 0.21.0__py3-none-win_amd64.whl → 0.21.2__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 (153) hide show
  1. wandb/__init__.py +16 -14
  2. wandb/__init__.pyi +427 -450
  3. wandb/agents/pyagent.py +41 -12
  4. wandb/analytics/sentry.py +7 -2
  5. wandb/apis/importers/mlflow.py +1 -1
  6. wandb/apis/public/__init__.py +1 -1
  7. wandb/apis/public/api.py +525 -360
  8. wandb/apis/public/artifacts.py +207 -13
  9. wandb/apis/public/automations.py +19 -3
  10. wandb/apis/public/files.py +172 -33
  11. wandb/apis/public/history.py +67 -15
  12. wandb/apis/public/integrations.py +25 -2
  13. wandb/apis/public/jobs.py +90 -2
  14. wandb/apis/public/projects.py +130 -79
  15. wandb/apis/public/query_generator.py +11 -1
  16. wandb/apis/public/registries/_utils.py +14 -16
  17. wandb/apis/public/registries/registries_search.py +183 -304
  18. wandb/apis/public/reports.py +96 -15
  19. wandb/apis/public/runs.py +299 -105
  20. wandb/apis/public/sweeps.py +222 -22
  21. wandb/apis/public/teams.py +41 -4
  22. wandb/apis/public/users.py +45 -4
  23. wandb/automations/_generated/delete_automation.py +1 -3
  24. wandb/automations/_generated/enums.py +13 -11
  25. wandb/beta/workflows.py +66 -30
  26. wandb/bin/gpu_stats.exe +0 -0
  27. wandb/bin/wandb-core +0 -0
  28. wandb/cli/cli.py +127 -3
  29. wandb/env.py +8 -0
  30. wandb/errors/errors.py +4 -1
  31. wandb/integration/lightning/fabric/logger.py +3 -4
  32. wandb/integration/metaflow/__init__.py +6 -0
  33. wandb/integration/metaflow/data_pandas.py +74 -0
  34. wandb/integration/metaflow/data_pytorch.py +75 -0
  35. wandb/integration/metaflow/data_sklearn.py +76 -0
  36. wandb/integration/metaflow/errors.py +13 -0
  37. wandb/integration/metaflow/metaflow.py +167 -223
  38. wandb/integration/openai/fine_tuning.py +1 -2
  39. wandb/integration/weave/__init__.py +6 -0
  40. wandb/integration/weave/interface.py +49 -0
  41. wandb/integration/weave/weave.py +63 -0
  42. wandb/jupyter.py +5 -5
  43. wandb/plot/custom_chart.py +30 -7
  44. wandb/proto/v3/wandb_internal_pb2.py +281 -280
  45. wandb/proto/v3/wandb_telemetry_pb2.py +4 -4
  46. wandb/proto/v4/wandb_internal_pb2.py +280 -280
  47. wandb/proto/v4/wandb_telemetry_pb2.py +4 -4
  48. wandb/proto/v5/wandb_internal_pb2.py +280 -280
  49. wandb/proto/v5/wandb_telemetry_pb2.py +4 -4
  50. wandb/proto/v6/wandb_internal_pb2.py +280 -280
  51. wandb/proto/v6/wandb_telemetry_pb2.py +4 -4
  52. wandb/proto/wandb_deprecated.py +6 -0
  53. wandb/sdk/artifacts/_factories.py +17 -0
  54. wandb/sdk/artifacts/_generated/__init__.py +221 -13
  55. wandb/sdk/artifacts/_generated/artifact_by_id.py +17 -0
  56. wandb/sdk/artifacts/_generated/artifact_by_name.py +22 -0
  57. wandb/sdk/artifacts/_generated/artifact_collection_membership_file_urls.py +43 -0
  58. wandb/sdk/artifacts/_generated/artifact_created_by.py +47 -0
  59. wandb/sdk/artifacts/_generated/artifact_file_urls.py +22 -0
  60. wandb/sdk/artifacts/_generated/artifact_type.py +31 -0
  61. wandb/sdk/artifacts/_generated/artifact_used_by.py +43 -0
  62. wandb/sdk/artifacts/_generated/artifact_via_membership_by_name.py +26 -0
  63. wandb/sdk/artifacts/_generated/delete_artifact.py +28 -0
  64. wandb/sdk/artifacts/_generated/enums.py +5 -0
  65. wandb/sdk/artifacts/_generated/fetch_artifact_manifest.py +38 -0
  66. wandb/sdk/artifacts/_generated/fetch_registries.py +32 -0
  67. wandb/sdk/artifacts/_generated/fragments.py +279 -41
  68. wandb/sdk/artifacts/_generated/link_artifact.py +6 -0
  69. wandb/sdk/artifacts/_generated/operations.py +654 -51
  70. wandb/sdk/artifacts/_generated/registry_collections.py +34 -0
  71. wandb/sdk/artifacts/_generated/registry_versions.py +34 -0
  72. wandb/sdk/artifacts/_generated/unlink_artifact.py +25 -0
  73. wandb/sdk/artifacts/_graphql_fragments.py +3 -86
  74. wandb/sdk/artifacts/_internal_artifact.py +19 -8
  75. wandb/sdk/artifacts/_validators.py +14 -4
  76. wandb/sdk/artifacts/artifact.py +512 -618
  77. wandb/sdk/artifacts/artifact_file_cache.py +10 -6
  78. wandb/sdk/artifacts/artifact_manifest.py +10 -9
  79. wandb/sdk/artifacts/artifact_manifest_entry.py +9 -10
  80. wandb/sdk/artifacts/artifact_manifests/artifact_manifest_v1.py +5 -3
  81. wandb/sdk/artifacts/storage_handlers/http_handler.py +1 -1
  82. wandb/sdk/artifacts/storage_handlers/s3_handler.py +1 -1
  83. wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +1 -1
  84. wandb/sdk/data_types/audio.py +38 -10
  85. wandb/sdk/data_types/base_types/media.py +6 -56
  86. wandb/sdk/data_types/graph.py +48 -14
  87. wandb/sdk/data_types/helper_types/bounding_boxes_2d.py +1 -3
  88. wandb/sdk/data_types/helper_types/image_mask.py +1 -3
  89. wandb/sdk/data_types/histogram.py +34 -21
  90. wandb/sdk/data_types/html.py +35 -12
  91. wandb/sdk/data_types/image.py +104 -68
  92. wandb/sdk/data_types/molecule.py +32 -19
  93. wandb/sdk/data_types/object_3d.py +36 -17
  94. wandb/sdk/data_types/plotly.py +18 -5
  95. wandb/sdk/data_types/saved_model.py +4 -6
  96. wandb/sdk/data_types/table.py +59 -30
  97. wandb/sdk/data_types/video.py +53 -26
  98. wandb/sdk/integration_utils/auto_logging.py +2 -2
  99. wandb/sdk/interface/interface_queue.py +1 -4
  100. wandb/sdk/interface/interface_shared.py +26 -37
  101. wandb/sdk/interface/interface_sock.py +24 -14
  102. wandb/sdk/internal/internal_api.py +6 -0
  103. wandb/sdk/internal/job_builder.py +6 -0
  104. wandb/sdk/internal/settings_static.py +2 -3
  105. wandb/sdk/launch/agent/agent.py +8 -1
  106. wandb/sdk/launch/agent/run_queue_item_file_saver.py +2 -2
  107. wandb/sdk/launch/create_job.py +15 -2
  108. wandb/sdk/launch/inputs/internal.py +3 -4
  109. wandb/sdk/launch/inputs/schema.py +1 -0
  110. wandb/sdk/launch/runner/kubernetes_monitor.py +1 -0
  111. wandb/sdk/launch/runner/kubernetes_runner.py +323 -1
  112. wandb/sdk/launch/sweeps/scheduler.py +2 -3
  113. wandb/sdk/lib/asyncio_compat.py +19 -16
  114. wandb/sdk/lib/asyncio_manager.py +252 -0
  115. wandb/sdk/lib/deprecate.py +1 -7
  116. wandb/sdk/lib/disabled.py +1 -1
  117. wandb/sdk/lib/hashutil.py +27 -5
  118. wandb/sdk/lib/module.py +7 -13
  119. wandb/sdk/lib/printer.py +2 -2
  120. wandb/sdk/lib/printer_asyncio.py +3 -1
  121. wandb/sdk/lib/progress.py +0 -19
  122. wandb/sdk/lib/retry.py +185 -78
  123. wandb/sdk/lib/service/service_client.py +106 -0
  124. wandb/sdk/lib/service/service_connection.py +20 -26
  125. wandb/sdk/lib/service/service_token.py +30 -13
  126. wandb/sdk/mailbox/mailbox.py +13 -5
  127. wandb/sdk/mailbox/mailbox_handle.py +22 -13
  128. wandb/sdk/mailbox/response_handle.py +42 -106
  129. wandb/sdk/mailbox/wait_with_progress.py +7 -42
  130. wandb/sdk/wandb_init.py +77 -116
  131. wandb/sdk/wandb_login.py +19 -15
  132. wandb/sdk/wandb_metric.py +2 -0
  133. wandb/sdk/wandb_run.py +497 -469
  134. wandb/sdk/wandb_settings.py +145 -4
  135. wandb/sdk/wandb_setup.py +204 -124
  136. wandb/sdk/wandb_sweep.py +14 -13
  137. wandb/sdk/wandb_watch.py +4 -6
  138. wandb/sync/sync.py +10 -0
  139. wandb/util.py +58 -1
  140. wandb/wandb_run.py +1 -2
  141. {wandb-0.21.0.dist-info → wandb-0.21.2.dist-info}/METADATA +1 -1
  142. {wandb-0.21.0.dist-info → wandb-0.21.2.dist-info}/RECORD +145 -129
  143. wandb/sdk/interface/interface_relay.py +0 -38
  144. wandb/sdk/interface/router.py +0 -89
  145. wandb/sdk/interface/router_queue.py +0 -43
  146. wandb/sdk/interface/router_relay.py +0 -50
  147. wandb/sdk/interface/router_sock.py +0 -32
  148. wandb/sdk/lib/sock_client.py +0 -236
  149. wandb/vendor/pynvml/__init__.py +0 -0
  150. wandb/vendor/pynvml/pynvml.py +0 -4779
  151. {wandb-0.21.0.dist-info → wandb-0.21.2.dist-info}/WHEEL +0 -0
  152. {wandb-0.21.0.dist-info → wandb-0.21.2.dist-info}/entry_points.txt +0 -0
  153. {wandb-0.21.0.dist-info → wandb-0.21.2.dist-info}/licenses/LICENSE +0 -0
@@ -1,19 +1,18 @@
1
- """InterfaceSock - Derived from InterfaceShared using a socket to send to internal thread.
2
-
3
- See interface.py for how interface classes relate to each other.
4
-
5
- """
1
+ from __future__ import annotations
6
2
 
7
3
  import logging
8
- from typing import TYPE_CHECKING, Any, Optional
4
+ from typing import TYPE_CHECKING, Any
5
+
6
+ from typing_extensions import override
9
7
 
10
- from wandb.sdk.mailbox import Mailbox
8
+ from wandb.proto import wandb_server_pb2 as spb
11
9
 
12
- from ..lib.sock_client import SockClient
13
10
  from .interface_shared import InterfaceShared
14
11
 
15
12
  if TYPE_CHECKING:
16
13
  from wandb.proto import wandb_internal_pb2 as pb
14
+ from wandb.sdk.lib.service.service_client import ServiceClient
15
+ from wandb.sdk.mailbox import MailboxHandle
17
16
 
18
17
 
19
18
  logger = logging.getLogger("wandb")
@@ -22,18 +21,29 @@ logger = logging.getLogger("wandb")
22
21
  class InterfaceSock(InterfaceShared):
23
22
  def __init__(
24
23
  self,
25
- sock_client: SockClient,
26
- mailbox: Mailbox,
24
+ client: ServiceClient,
27
25
  stream_id: str,
28
26
  ) -> None:
29
- super().__init__(mailbox=mailbox)
30
- self._sock_client = sock_client
27
+ super().__init__()
28
+ self._client = client
31
29
  self._stream_id = stream_id
32
30
 
33
31
  def _assign(self, record: Any) -> None:
34
32
  assert self._stream_id
35
33
  record._info.stream_id = self._stream_id
36
34
 
37
- def _publish(self, record: "pb.Record", local: Optional[bool] = None) -> None:
35
+ @override
36
+ def _publish(self, record: pb.Record, local: bool | None = None) -> None:
38
37
  self._assign(record)
39
- self._sock_client.send_record_publish(record)
38
+ request = spb.ServerRequest()
39
+ request.record_publish.CopyFrom(record)
40
+ self._client.publish(request)
41
+
42
+ @override
43
+ def _deliver(self, record: pb.Record) -> MailboxHandle[pb.Result]:
44
+ self._assign(record)
45
+ request = spb.ServerRequest()
46
+ request.record_publish.CopyFrom(record)
47
+
48
+ handle = self._client.deliver(request)
49
+ return handle.map(lambda response: response.result_communicate)
@@ -284,6 +284,7 @@ class Api:
284
284
  self._extra_http_headers.update(_thread_local_api_settings.headers or {})
285
285
 
286
286
  auth = None
287
+ api_key = api_key or self.default_settings.get("api_key")
287
288
  if api_key:
288
289
  auth = ("api", api_key)
289
290
  elif self.access_token is not None:
@@ -3234,6 +3235,7 @@ class Api:
3234
3235
  entity: Optional[str] = None,
3235
3236
  state: Optional[str] = None,
3236
3237
  prior_runs: Optional[List[str]] = None,
3238
+ display_name: Optional[str] = None,
3237
3239
  template_variable_values: Optional[Dict[str, Any]] = None,
3238
3240
  ) -> Tuple[str, List[str]]:
3239
3241
  """Upsert a sweep object.
@@ -3248,6 +3250,7 @@ class Api:
3248
3250
  entity (str): entity to use
3249
3251
  state (str): state
3250
3252
  prior_runs (list): IDs of existing runs to add to the sweep
3253
+ display_name (str): display name for the sweep
3251
3254
  template_variable_values (dict): template variable values
3252
3255
  """
3253
3256
  project_query = """
@@ -3271,6 +3274,7 @@ class Api:
3271
3274
  $scheduler: JSONString,
3272
3275
  $state: String,
3273
3276
  $priorRunsFilters: JSONString,
3277
+ $displayName: String,
3274
3278
  ) {
3275
3279
  upsertSweep(input: {
3276
3280
  id: $id,
@@ -3282,6 +3286,7 @@ class Api:
3282
3286
  scheduler: $scheduler,
3283
3287
  state: $state,
3284
3288
  priorRunsFilters: $priorRunsFilters,
3289
+ displayName: $displayName,
3285
3290
  }) {
3286
3291
  sweep {
3287
3292
  name
@@ -3358,6 +3363,7 @@ class Api:
3358
3363
  "templateVariableValues": json.dumps(template_variable_values),
3359
3364
  "scheduler": scheduler,
3360
3365
  "priorRunsFilters": filters,
3366
+ "displayName": display_name,
3361
3367
  }
3362
3368
  if state:
3363
3369
  variables["state"] = state
@@ -109,6 +109,7 @@ class JobSourceDict(TypedDict, total=False):
109
109
  input_types: Dict[str, Any]
110
110
  output_types: Dict[str, Any]
111
111
  runtime: Optional[str]
112
+ services: Dict[str, str]
112
113
 
113
114
 
114
115
  class ArtifactInfoForJob(TypedDict):
@@ -143,6 +144,7 @@ class JobBuilder:
143
144
  _job_version_alias: Optional[str]
144
145
  _is_notebook_run: bool
145
146
  _verbose: bool
147
+ _services: Dict[str, str]
146
148
 
147
149
  def __init__(self, settings: SettingsStatic, verbose: bool = False):
148
150
  self._settings = settings
@@ -162,6 +164,7 @@ class JobBuilder:
162
164
  self._is_notebook_run = self._get_is_notebook_run()
163
165
  self._verbose = verbose
164
166
  self._partial = False
167
+ self._services = {}
165
168
 
166
169
  def set_config(self, config: Dict[str, Any]) -> None:
167
170
  self._config = config
@@ -544,6 +547,9 @@ class JobBuilder:
544
547
  "runtime": runtime,
545
548
  }
546
549
 
550
+ if self._services:
551
+ source_info["services"] = self._services
552
+
547
553
  assert source_info is not None
548
554
  assert name is not None
549
555
 
@@ -4,7 +4,7 @@ from typing import Any, Iterable
4
4
 
5
5
  from wandb.proto import wandb_settings_pb2
6
6
  from wandb.sdk.lib import RunMoment
7
- from wandb.sdk.wandb_settings import Settings
7
+ from wandb.sdk.wandb_settings import CLIENT_ONLY_SETTINGS, Settings
8
8
 
9
9
 
10
10
  class SettingsStatic(Settings):
@@ -41,8 +41,7 @@ class SettingsStatic(Settings):
41
41
 
42
42
  forks_specified: list[str] = []
43
43
  for key in fields:
44
- # Skip Python-only keys that do not exist on the proto.
45
- if key in ("reinit",):
44
+ if key in CLIENT_ONLY_SETTINGS:
46
45
  continue
47
46
 
48
47
  value: Any = None
@@ -1,6 +1,7 @@
1
1
  """Implementation of launch agent."""
2
2
 
3
3
  import asyncio
4
+ import copy
4
5
  import logging
5
6
  import os
6
7
  import pprint
@@ -421,6 +422,7 @@ class LaunchAgent:
421
422
  """Removes the job from our list for now."""
422
423
  with self._jobs_lock:
423
424
  job_and_run_status = self._jobs[thread_id]
425
+
424
426
  if (
425
427
  job_and_run_status.entity is not None
426
428
  and job_and_run_status.entity != self._entity
@@ -516,7 +518,11 @@ class LaunchAgent:
516
518
  Arguments:
517
519
  job: Job to run.
518
520
  """
519
- _msg = f"{LOG_PREFIX}Launch agent received job:\n{pprint.pformat(job)}\n"
521
+ job_copy = copy.deepcopy(job)
522
+ if "runSpec" in job_copy and "_wandb_api_key" in job_copy["runSpec"]:
523
+ job_copy["runSpec"]["_wandb_api_key"] = "<redacted>"
524
+
525
+ _msg = f"{LOG_PREFIX}Launch agent received job:\n{pprint.pformat(job_copy)}\n"
520
526
  wandb.termlog(_msg)
521
527
  _logger.info(_msg)
522
528
  # update agent status
@@ -727,6 +733,7 @@ class LaunchAgent:
727
733
  backend = loader.runner_from_config(
728
734
  resource, api, backend_config, environment, registry
729
735
  )
736
+
730
737
  if not (
731
738
  project.docker_image
732
739
  or project.job_base_image
@@ -11,7 +11,7 @@ FileSubtypes = Literal["warning", "error"]
11
11
  class RunQueueItemFileSaver:
12
12
  def __init__(
13
13
  self,
14
- agent_run: Optional["wandb.sdk.wandb_run.Run"],
14
+ agent_run: Optional["wandb.Run"],
15
15
  run_queue_item_id: str,
16
16
  ):
17
17
  self.run_queue_item_id = run_queue_item_id
@@ -20,7 +20,7 @@ class RunQueueItemFileSaver:
20
20
  def save_contents(
21
21
  self, contents: str, fname: str, file_sub_type: FileSubtypes
22
22
  ) -> Optional[List[str]]:
23
- if not isinstance(self.run, wandb.sdk.wandb_run.Run):
23
+ if not isinstance(self.run, wandb.Run):
24
24
  wandb.termwarn("Not saving file contents because agent has no run")
25
25
  return None
26
26
  root_dir = self.run._settings.files_dir
@@ -11,6 +11,7 @@ from wandb.apis.internal import Api
11
11
  from wandb.sdk.artifacts.artifact import Artifact
12
12
  from wandb.sdk.internal.job_builder import JobBuilder
13
13
  from wandb.sdk.launch.git_reference import GitReference
14
+ from wandb.sdk.launch.inputs.internal import _validate_schema
14
15
  from wandb.sdk.launch.utils import (
15
16
  _is_git_uri,
16
17
  get_current_python_version,
@@ -115,6 +116,8 @@ def _create_job(
115
116
  build_context: Optional[str] = None,
116
117
  dockerfile: Optional[str] = None,
117
118
  base_image: Optional[str] = None,
119
+ services: Optional[Dict[str, str]] = None,
120
+ schema: Optional[Dict[str, Any]] = None,
118
121
  ) -> Tuple[Optional[Artifact], str, List[str]]:
119
122
  wandb.termlog(f"Creating launch job of type: {job_type}...")
120
123
 
@@ -169,6 +172,7 @@ def _create_job(
169
172
 
170
173
  job_builder = _configure_job_builder_for_partial(tempdir.name, job_source=job_type)
171
174
  job_builder._settings.job_name = name
175
+ job_builder._services = services or {}
172
176
  if job_type == "code":
173
177
  assert entrypoint is not None
174
178
  job_name = _make_code_artifact(
@@ -204,6 +208,15 @@ def _create_job(
204
208
  if "latest" not in aliases:
205
209
  aliases += ["latest"]
206
210
 
211
+ metadata = {"_partial": True}
212
+ if schema:
213
+ _validate_schema(schema)
214
+ metadata = {
215
+ "input_schemas": {
216
+ "@wandb.config": schema,
217
+ }
218
+ }
219
+
207
220
  res, _ = api.create_artifact(
208
221
  artifact_type_name="job",
209
222
  artifact_collection_name=name,
@@ -214,7 +227,7 @@ def _create_job(
214
227
  project_name=project,
215
228
  run_name=run.id, # type: ignore # run will be deleted after creation
216
229
  description=description,
217
- metadata={"_partial": True},
230
+ metadata=metadata,
218
231
  is_user_created=True,
219
232
  aliases=[{"artifactCollectionName": name, "alias": a} for a in aliases],
220
233
  )
@@ -421,7 +434,7 @@ def _configure_job_builder_for_partial(tmpdir: str, job_source: str) -> JobBuild
421
434
  def _make_code_artifact(
422
435
  api: Api,
423
436
  job_builder: JobBuilder,
424
- run: "wandb.sdk.wandb_run.Run",
437
+ run: "wandb.Run",
425
438
  path: str,
426
439
  entrypoint: str,
427
440
  entity: Optional[str],
@@ -17,7 +17,6 @@ import wandb
17
17
  import wandb.data_types
18
18
  from wandb.sdk.launch.errors import LaunchError
19
19
  from wandb.sdk.launch.inputs.schema import META_SCHEMA
20
- from wandb.sdk.wandb_run import Run
21
20
  from wandb.util import get_module
22
21
 
23
22
  from .files import config_path_is_valid, override_file
@@ -93,7 +92,7 @@ class StagedLaunchInputs:
93
92
  ):
94
93
  self._staged_inputs.append(input_arguments)
95
94
 
96
- def apply(self, run: Run):
95
+ def apply(self, run: wandb.Run):
97
96
  """Apply the staged inputs to the given run."""
98
97
  for input in self._staged_inputs:
99
98
  _publish_job_input(input, run)
@@ -101,13 +100,13 @@ class StagedLaunchInputs:
101
100
 
102
101
  def _publish_job_input(
103
102
  input: JobInputArguments,
104
- run: Run,
103
+ run: wandb.Run,
105
104
  ) -> None:
106
105
  """Publish a job input to the backend interface of the given run.
107
106
 
108
107
  Arguments:
109
108
  input (JobInputArguments): The arguments for the job input.
110
- run (Run): The run to publish the job input to.
109
+ run (wandb.Run): The run to publish the job input to.
111
110
  """
112
111
  assert run._backend is not None
113
112
  assert run._backend.interface is not None
@@ -7,6 +7,7 @@ META_SCHEMA = {
7
7
  },
8
8
  "title": {"type": "string"},
9
9
  "description": {"type": "string"},
10
+ "format": {"type": "string"},
10
11
  "enum": {"type": "array", "items": {"type": ["integer", "number", "string"]}},
11
12
  "properties": {"type": "object", "patternProperties": {".*": {"$ref": "#"}}},
12
13
  "allOf": {"type": "array", "items": {"$ref": "#"}},
@@ -27,6 +27,7 @@ WANDB_K8S_LABEL_NAMESPACE = "wandb.ai"
27
27
  WANDB_K8S_RUN_ID = f"{WANDB_K8S_LABEL_NAMESPACE}/run-id"
28
28
  WANDB_K8S_LABEL_AGENT = f"{WANDB_K8S_LABEL_NAMESPACE}/agent"
29
29
  WANDB_K8S_LABEL_MONITOR = f"{WANDB_K8S_LABEL_NAMESPACE}/monitor"
30
+ WANDB_K8S_LABEL_AUXILIARY_RESOURCE = f"{WANDB_K8S_LABEL_NAMESPACE}/auxiliary-resource"
30
31
 
31
32
 
32
33
  class Resources: