wandb 0.19.1rc1__py3-none-win32.whl → 0.19.3__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.
- wandb/__init__.py +1 -7
- wandb/__init__.pyi +15 -7
- wandb/agents/pyagent.py +1 -1
- wandb/apis/importers/wandb.py +1 -1
- wandb/apis/public/files.py +1 -1
- wandb/apis/public/jobs.py +1 -1
- wandb/apis/public/runs.py +2 -7
- wandb/apis/reports/v1/__init__.py +1 -1
- wandb/apis/reports/v2/__init__.py +1 -1
- wandb/apis/workspaces/__init__.py +1 -1
- wandb/bin/gpu_stats.exe +0 -0
- wandb/bin/wandb-core +0 -0
- wandb/cli/beta.py +7 -4
- wandb/cli/cli.py +5 -7
- wandb/docker/__init__.py +4 -4
- wandb/integration/fastai/__init__.py +4 -6
- wandb/integration/keras/keras.py +5 -3
- wandb/integration/metaflow/metaflow.py +14 -16
- wandb/integration/prodigy/prodigy.py +3 -11
- wandb/integration/sagemaker/__init__.py +5 -3
- wandb/integration/sagemaker/config.py +17 -8
- wandb/integration/sagemaker/files.py +0 -1
- wandb/integration/sagemaker/resources.py +47 -18
- wandb/integration/torch/wandb_torch.py +1 -1
- wandb/proto/v3/wandb_internal_pb2.py +273 -235
- wandb/proto/v4/wandb_internal_pb2.py +222 -214
- wandb/proto/v5/wandb_internal_pb2.py +222 -214
- wandb/sdk/artifacts/artifact.py +3 -9
- wandb/sdk/backend/backend.py +1 -1
- wandb/sdk/data_types/base_types/wb_value.py +1 -1
- wandb/sdk/data_types/graph.py +2 -2
- wandb/sdk/data_types/saved_model.py +1 -1
- wandb/sdk/data_types/video.py +1 -1
- wandb/sdk/interface/interface.py +25 -25
- wandb/sdk/interface/interface_shared.py +21 -5
- wandb/sdk/internal/handler.py +19 -1
- wandb/sdk/internal/internal.py +1 -1
- wandb/sdk/internal/internal_api.py +4 -5
- wandb/sdk/internal/sample.py +2 -2
- wandb/sdk/internal/sender.py +1 -2
- wandb/sdk/internal/settings_static.py +3 -1
- wandb/sdk/internal/system/assets/disk.py +4 -4
- wandb/sdk/internal/system/assets/gpu.py +1 -1
- wandb/sdk/internal/system/assets/memory.py +1 -1
- wandb/sdk/internal/system/system_info.py +1 -1
- wandb/sdk/internal/system/system_monitor.py +3 -1
- wandb/sdk/internal/tb_watcher.py +1 -1
- wandb/sdk/launch/_project_spec.py +3 -3
- wandb/sdk/launch/builder/abstract.py +1 -1
- wandb/sdk/lib/apikey.py +2 -3
- wandb/sdk/lib/fsm.py +1 -1
- wandb/sdk/lib/gitlib.py +1 -1
- wandb/sdk/lib/gql_request.py +1 -1
- wandb/sdk/lib/interrupt.py +37 -0
- wandb/sdk/lib/lazyloader.py +1 -1
- wandb/sdk/lib/progress.py +7 -1
- wandb/sdk/lib/service_connection.py +1 -1
- wandb/sdk/lib/telemetry.py +1 -1
- wandb/sdk/service/_startup_debug.py +1 -1
- wandb/sdk/service/server_sock.py +3 -2
- wandb/sdk/service/service.py +1 -1
- wandb/sdk/service/streams.py +19 -17
- wandb/sdk/verify/verify.py +13 -13
- wandb/sdk/wandb_init.py +316 -246
- wandb/sdk/wandb_login.py +1 -1
- wandb/sdk/wandb_metadata.py +547 -0
- wandb/sdk/wandb_run.py +134 -39
- wandb/sdk/wandb_settings.py +7 -63
- wandb/sdk/wandb_setup.py +83 -82
- wandb/sdk/wandb_sweep.py +2 -2
- wandb/sdk/wandb_sync.py +15 -18
- wandb/sync/sync.py +10 -10
- wandb/util.py +11 -3
- wandb/wandb_agent.py +11 -16
- wandb/wandb_controller.py +7 -7
- {wandb-0.19.1rc1.dist-info → wandb-0.19.3.dist-info}/METADATA +3 -2
- {wandb-0.19.1rc1.dist-info → wandb-0.19.3.dist-info}/RECORD +80 -78
- {wandb-0.19.1rc1.dist-info → wandb-0.19.3.dist-info}/WHEEL +0 -0
- {wandb-0.19.1rc1.dist-info → wandb-0.19.3.dist-info}/entry_points.txt +0 -0
- {wandb-0.19.1rc1.dist-info → wandb-0.19.3.dist-info}/licenses/LICENSE +0 -0
wandb/sdk/wandb_run.py
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
import _thread as thread
|
4
3
|
import atexit
|
5
4
|
import functools
|
6
5
|
import glob
|
@@ -30,13 +29,13 @@ import wandb.util
|
|
30
29
|
from wandb import trigger
|
31
30
|
from wandb._globals import _datatypes_set_callback
|
32
31
|
from wandb.apis import internal, public
|
33
|
-
from wandb.apis.internal import Api
|
34
32
|
from wandb.apis.public import Api as PublicApi
|
35
33
|
from wandb.errors import CommError, UnsupportedError, UsageError
|
36
34
|
from wandb.errors.links import url_registry
|
37
35
|
from wandb.integration.torch import wandb_torch
|
38
36
|
from wandb.plot import CustomChart, Visualize
|
39
37
|
from wandb.proto.wandb_internal_pb2 import (
|
38
|
+
MetadataRequest,
|
40
39
|
MetricRecord,
|
41
40
|
PollExitResponse,
|
42
41
|
Result,
|
@@ -73,6 +72,7 @@ from .lib import (
|
|
73
72
|
deprecate,
|
74
73
|
filenames,
|
75
74
|
filesystem,
|
75
|
+
interrupt,
|
76
76
|
ipython,
|
77
77
|
module,
|
78
78
|
printer,
|
@@ -84,6 +84,7 @@ from .lib import (
|
|
84
84
|
from .lib.exit_hooks import ExitHooks
|
85
85
|
from .lib.mailbox import MailboxError, MailboxHandle, MailboxProbe, MailboxProgress
|
86
86
|
from .wandb_alerts import AlertLevel
|
87
|
+
from .wandb_metadata import Metadata
|
87
88
|
from .wandb_settings import Settings
|
88
89
|
from .wandb_setup import _WandbSetup
|
89
90
|
|
@@ -287,7 +288,7 @@ class RunStatusChecker:
|
|
287
288
|
# TODO(frz): This check is required
|
288
289
|
# until WB-3606 is resolved on server side.
|
289
290
|
if not wandb.agents.pyagent.is_running(): # type: ignore
|
290
|
-
|
291
|
+
interrupt.interrupt_main()
|
291
292
|
return
|
292
293
|
|
293
294
|
try:
|
@@ -595,15 +596,17 @@ class Run:
|
|
595
596
|
self._config._set_artifact_callback(self._config_artifact_callback)
|
596
597
|
self._config._set_settings(self._settings)
|
597
598
|
|
598
|
-
#
|
599
|
+
# TODO: perhaps this should be a property that is a noop on a finished run
|
599
600
|
self.summary = wandb_summary.Summary(
|
600
601
|
self._summary_get_current_summary_callback,
|
601
602
|
)
|
602
603
|
self.summary._set_update_callback(self._summary_update_callback)
|
603
604
|
|
605
|
+
self.__metadata: Metadata | None = None
|
606
|
+
|
604
607
|
self._step = 0
|
605
608
|
self._starting_step = 0
|
606
|
-
#
|
609
|
+
# TODO: eventually would be nice to make this configurable using self._settings._start_time
|
607
610
|
# need to test (jhr): if you set start time to 2 days ago and run a test for 15 minutes,
|
608
611
|
# does the total time get calculated right (not as 2 days and 15 minutes)?
|
609
612
|
self._start_time = time.time()
|
@@ -1359,32 +1362,68 @@ class Run:
|
|
1359
1362
|
files: FilesDict = dict(files=[(GlobStr(glob.escape(fname)), "now")])
|
1360
1363
|
self._backend.interface.publish_files(files)
|
1361
1364
|
|
1362
|
-
def
|
1363
|
-
|
1364
|
-
|
1365
|
+
def _pop_all_charts(
|
1366
|
+
self,
|
1367
|
+
data: dict[str, Any],
|
1368
|
+
key_prefix: str | None = None,
|
1369
|
+
) -> dict[str, Any]:
|
1370
|
+
"""Pops all charts from a dictionary including nested charts.
|
1365
1371
|
|
1366
|
-
|
1372
|
+
This function will return a mapping of the charts and a dot-separated
|
1373
|
+
key for each chart. Indicating the path to the chart in the data dictionary.
|
1374
|
+
"""
|
1375
|
+
keys_to_remove = set()
|
1376
|
+
charts: dict[str, Any] = {}
|
1367
1377
|
for k, v in data.items():
|
1378
|
+
key = f"{key_prefix}.{k}" if key_prefix else k
|
1368
1379
|
if isinstance(v, Visualize):
|
1369
|
-
|
1370
|
-
v
|
1371
|
-
self._config_callback(
|
1372
|
-
val=v.spec.config_value,
|
1373
|
-
key=v.spec.config_key,
|
1374
|
-
)
|
1380
|
+
keys_to_remove.add(k)
|
1381
|
+
charts[key] = v
|
1375
1382
|
elif isinstance(v, CustomChart):
|
1376
|
-
|
1377
|
-
v
|
1378
|
-
|
1379
|
-
|
1380
|
-
|
1381
|
-
|
1383
|
+
keys_to_remove.add(k)
|
1384
|
+
charts[key] = v
|
1385
|
+
elif isinstance(v, dict):
|
1386
|
+
nested_charts = self._pop_all_charts(v, key)
|
1387
|
+
charts.update(nested_charts)
|
1388
|
+
|
1389
|
+
for k in keys_to_remove:
|
1390
|
+
data.pop(k)
|
1391
|
+
|
1392
|
+
return charts
|
1393
|
+
|
1394
|
+
def _serialize_custom_charts(
|
1395
|
+
self,
|
1396
|
+
data: dict[str, Any],
|
1397
|
+
) -> dict[str, Any]:
|
1398
|
+
"""Process and replace chart objects with their underlying table values.
|
1399
|
+
|
1400
|
+
This processes the chart objects passed to `run.log()`, replacing their entries
|
1401
|
+
in the given dictionary (which is saved to the run's history) and adding them
|
1402
|
+
to the run's config.
|
1403
|
+
|
1404
|
+
Args:
|
1405
|
+
data: Dictionary containing data that may include plot objects
|
1406
|
+
Plot objects can be nested in dictionaries, which will be processed recursively.
|
1407
|
+
|
1408
|
+
Returns:
|
1409
|
+
The processed dictionary with custom charts transformed into tables.
|
1410
|
+
"""
|
1411
|
+
if not data:
|
1412
|
+
return data
|
1413
|
+
|
1414
|
+
charts = self._pop_all_charts(data)
|
1415
|
+
for k, v in charts.items():
|
1416
|
+
v.set_key(k)
|
1417
|
+
self._config_callback(
|
1418
|
+
val=v.spec.config_value,
|
1419
|
+
key=v.spec.config_key,
|
1420
|
+
)
|
1382
1421
|
|
1383
|
-
for k in chart_keys:
|
1384
|
-
# remove the chart key from the row
|
1385
|
-
v = data.pop(k)
|
1386
1422
|
if isinstance(v, CustomChart):
|
1387
1423
|
data[v.spec.table_key] = v.table
|
1424
|
+
elif isinstance(v, Visualize):
|
1425
|
+
data[k] = v.table
|
1426
|
+
|
1388
1427
|
return data
|
1389
1428
|
|
1390
1429
|
def _partial_history_callback(
|
@@ -1774,7 +1813,10 @@ class Run:
|
|
1774
1813
|
examples = []
|
1775
1814
|
for i in range(3):
|
1776
1815
|
pixels = np.random.randint(
|
1777
|
-
low=0,
|
1816
|
+
low=0,
|
1817
|
+
high=256,
|
1818
|
+
size=(100, 100, 3),
|
1819
|
+
dtype=np.uint8,
|
1778
1820
|
)
|
1779
1821
|
pil_image = PILImage.fromarray(pixels, mode="RGB")
|
1780
1822
|
image = wandb.Image(pil_image, caption=f"random field {i}")
|
@@ -1791,7 +1833,10 @@ class Run:
|
|
1791
1833
|
run = wandb.init()
|
1792
1834
|
# axes are (time, channel, height, width)
|
1793
1835
|
frames = np.random.randint(
|
1794
|
-
low=0,
|
1836
|
+
low=0,
|
1837
|
+
high=256,
|
1838
|
+
size=(10, 3, 100, 100),
|
1839
|
+
dtype=np.uint8,
|
1795
1840
|
)
|
1796
1841
|
run.log({"video": wandb.Video(frames, fps=4)})
|
1797
1842
|
```
|
@@ -2133,8 +2178,9 @@ class Run:
|
|
2133
2178
|
# Inform the service that we're done sending messages for this run.
|
2134
2179
|
#
|
2135
2180
|
# TODO: Why not do this in _atexit_cleanup()?
|
2136
|
-
|
2137
|
-
|
2181
|
+
if self._settings.run_id:
|
2182
|
+
assert self._wl
|
2183
|
+
service = self._wl.assert_service()
|
2138
2184
|
service.inform_finish(run_id=self._settings.run_id)
|
2139
2185
|
|
2140
2186
|
finally:
|
@@ -2313,7 +2359,7 @@ class Run:
|
|
2313
2359
|
self._err_redir = err_redir
|
2314
2360
|
logger.info("Redirects installed.")
|
2315
2361
|
except Exception as e:
|
2316
|
-
|
2362
|
+
wandb.termwarn(f"Failed to redirect: {e}")
|
2317
2363
|
logger.error("Failed to redirect.", exc_info=e)
|
2318
2364
|
return
|
2319
2365
|
|
@@ -2374,8 +2420,7 @@ class Run:
|
|
2374
2420
|
logger.info("atexit reg")
|
2375
2421
|
self._hooks = ExitHooks()
|
2376
2422
|
|
2377
|
-
|
2378
|
-
if not service:
|
2423
|
+
if self.settings.x_disable_service:
|
2379
2424
|
self._hooks.hook()
|
2380
2425
|
# NB: manager will perform atexit hook like behavior for outstanding runs
|
2381
2426
|
atexit.register(lambda: self._atexit_cleanup())
|
@@ -2388,10 +2433,6 @@ class Run:
|
|
2388
2433
|
self._output_writer.close()
|
2389
2434
|
self._output_writer = None
|
2390
2435
|
|
2391
|
-
def _on_init(self) -> None:
|
2392
|
-
if self._settings._offline:
|
2393
|
-
return
|
2394
|
-
|
2395
2436
|
def _on_start(self) -> None:
|
2396
2437
|
# would like to move _set_global to _on_ready to unify _on_start and _on_attach
|
2397
2438
|
# (we want to do the set globals after attach)
|
@@ -3230,8 +3271,7 @@ class Run:
|
|
3230
3271
|
is_user_created: bool = False,
|
3231
3272
|
use_after_commit: bool = False,
|
3232
3273
|
) -> Artifact:
|
3233
|
-
|
3234
|
-
if api.settings().get("anonymous") == "true":
|
3274
|
+
if self._settings.anonymous in ["allow", "must"]:
|
3235
3275
|
wandb.termwarn(
|
3236
3276
|
"Artifacts logged anonymously cannot be claimed and expire after 7 days."
|
3237
3277
|
)
|
@@ -3665,6 +3705,62 @@ class Run:
|
|
3665
3705
|
logger.error("Error getting system metrics: %s", e)
|
3666
3706
|
return {}
|
3667
3707
|
|
3708
|
+
@property
|
3709
|
+
@_run_decorator._attach
|
3710
|
+
@_run_decorator._noop_on_finish()
|
3711
|
+
def _metadata(self) -> Metadata | None:
|
3712
|
+
"""The metadata associated with this run.
|
3713
|
+
|
3714
|
+
NOTE: Automatically collected metadata can be overridden by the user.
|
3715
|
+
"""
|
3716
|
+
if not self._backend or not self._backend.interface:
|
3717
|
+
return self.__metadata
|
3718
|
+
|
3719
|
+
# Initialize the metadata object if it doesn't exist.
|
3720
|
+
if self.__metadata is None:
|
3721
|
+
self.__metadata = Metadata()
|
3722
|
+
self.__metadata._set_callback(self._metadata_callback)
|
3723
|
+
|
3724
|
+
handle = self._backend.interface.deliver_get_system_metadata()
|
3725
|
+
result = handle.wait(timeout=1)
|
3726
|
+
|
3727
|
+
if not result:
|
3728
|
+
logger.error("Error getting run metadata: no result")
|
3729
|
+
return None
|
3730
|
+
|
3731
|
+
try:
|
3732
|
+
response = result.response.get_system_metadata_response
|
3733
|
+
|
3734
|
+
# Temporarily disable the callback to prevent triggering
|
3735
|
+
# an update call to wandb-core with the callback.
|
3736
|
+
with self.__metadata.disable_callback():
|
3737
|
+
# Values stored in the metadata object take precedence.
|
3738
|
+
self.__metadata.update_from_proto(response.metadata, skip_existing=True)
|
3739
|
+
|
3740
|
+
return self.__metadata
|
3741
|
+
except Exception as e:
|
3742
|
+
logger.error("Error getting run metadata: %s", e)
|
3743
|
+
|
3744
|
+
return None
|
3745
|
+
|
3746
|
+
@_run_decorator._noop_on_finish()
|
3747
|
+
@_run_decorator._attach
|
3748
|
+
def _metadata_callback(
|
3749
|
+
self,
|
3750
|
+
metadata: MetadataRequest,
|
3751
|
+
) -> None:
|
3752
|
+
"""Callback to publish Metadata to wandb-core upon user updates."""
|
3753
|
+
# ignore updates if the attached to another run
|
3754
|
+
if self._is_attached:
|
3755
|
+
wandb.termwarn(
|
3756
|
+
"Metadata updates are ignored when attached to another run.",
|
3757
|
+
repeat=False,
|
3758
|
+
)
|
3759
|
+
return
|
3760
|
+
|
3761
|
+
if self._backend and self._backend.interface:
|
3762
|
+
self._backend.interface.publish_metadata(metadata)
|
3763
|
+
|
3668
3764
|
# ------------------------------------------------------------------------------
|
3669
3765
|
# HEADER
|
3670
3766
|
# ------------------------------------------------------------------------------
|
@@ -3772,8 +3868,7 @@ class Run:
|
|
3772
3868
|
f'{printer.emoji("rocket")} View run at {printer.link(run_url)}',
|
3773
3869
|
)
|
3774
3870
|
|
3775
|
-
|
3776
|
-
if run_name and Api().api.settings().get("anonymous") == "true":
|
3871
|
+
if run_name and settings.anonymous in ["allow", "must"]:
|
3777
3872
|
printer.display(
|
3778
3873
|
(
|
3779
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:
|
@@ -305,7 +303,7 @@ class Settings(BaseModel, validate_assignment=True):
|
|
305
303
|
x_save_requirements: bool = True
|
306
304
|
x_service_transport: str | None = None
|
307
305
|
x_service_wait: float = 30.0
|
308
|
-
x_show_operation_stats: bool =
|
306
|
+
x_show_operation_stats: bool = True
|
309
307
|
# The start time of the run in seconds since the Unix epoch.
|
310
308
|
x_start_time: float | None = None
|
311
309
|
# PID of the process that started the wandb-core process to collect system stats for.
|
@@ -349,7 +347,7 @@ class Settings(BaseModel, validate_assignment=True):
|
|
349
347
|
@model_validator(mode="before")
|
350
348
|
@classmethod
|
351
349
|
def catch_private_settings(cls, values):
|
352
|
-
"""Check if a private field is provided and assign to the
|
350
|
+
"""Check if a private field is provided and assign to the corresponding public one.
|
353
351
|
|
354
352
|
This is a compatibility layer to handle previous versions of the settings.
|
355
353
|
"""
|
@@ -961,7 +959,7 @@ class Settings(BaseModel, validate_assignment=True):
|
|
961
959
|
# The Settings class does not track the source of the settings,
|
962
960
|
# so it is up to the developer to ensure that the settings are applied
|
963
961
|
# in the correct order. Most of the updates are done in
|
964
|
-
# wandb/sdk/wandb_setup.py::
|
962
|
+
# wandb/sdk/wandb_setup.py::_WandbSetup._settings_setup.
|
965
963
|
|
966
964
|
def update_from_system_config_file(self):
|
967
965
|
"""Update settings from the system config file."""
|
@@ -1063,7 +1061,8 @@ class Settings(BaseModel, validate_assignment=True):
|
|
1063
1061
|
)
|
1064
1062
|
self.x_executable = _executable
|
1065
1063
|
|
1066
|
-
self.docker
|
1064
|
+
if self.docker is None:
|
1065
|
+
self.docker = env.get_docker(util.image_id_from_k8s())
|
1067
1066
|
|
1068
1067
|
# proceed if not in CLI mode
|
1069
1068
|
if self.x_cli_only_mode:
|
@@ -1153,61 +1152,6 @@ class Settings(BaseModel, validate_assignment=True):
|
|
1153
1152
|
|
1154
1153
|
return settings_proto
|
1155
1154
|
|
1156
|
-
def handle_resume_logic(self):
|
1157
|
-
"""Handle logic for resuming runs."""
|
1158
|
-
# handle auto resume logic
|
1159
|
-
if self.resume == "auto":
|
1160
|
-
if os.path.exists(self.resume_fname):
|
1161
|
-
with open(self.resume_fname) as f:
|
1162
|
-
resume_run_id = json.load(f)["run_id"]
|
1163
|
-
if self.run_id is None:
|
1164
|
-
self.run_id = resume_run_id
|
1165
|
-
elif self.run_id != resume_run_id:
|
1166
|
-
wandb.termwarn(
|
1167
|
-
"Tried to auto resume run with "
|
1168
|
-
f"id {resume_run_id} but id {self.run_id} is set.",
|
1169
|
-
)
|
1170
|
-
if self.run_id is None:
|
1171
|
-
self.run_id = generate_id()
|
1172
|
-
|
1173
|
-
# persist run_id in case of failure
|
1174
|
-
if self.resume == "auto" and self.resume_fname is not None:
|
1175
|
-
filesystem.mkdir_exists_ok(self.wandb_dir)
|
1176
|
-
with open(self.resume_fname, "w") as f:
|
1177
|
-
f.write(json.dumps({"run_id": self.run_id}))
|
1178
|
-
|
1179
|
-
def handle_sweep_logic(self):
|
1180
|
-
"""Update settings based on sweep context.
|
1181
|
-
|
1182
|
-
When running a sweep, the project, entity, and run_id are handled externally,
|
1183
|
-
and should be ignored if they are set.
|
1184
|
-
"""
|
1185
|
-
if self.sweep_id is None:
|
1186
|
-
return
|
1187
|
-
|
1188
|
-
for key in ("project", "entity", "run_id"):
|
1189
|
-
value = getattr(self, key)
|
1190
|
-
if value is not None:
|
1191
|
-
wandb.termwarn(f"Ignoring {key} {value!r} when running a sweep.")
|
1192
|
-
setattr(self, key, None)
|
1193
|
-
|
1194
|
-
def handle_launch_logic(self):
|
1195
|
-
"""Update settings based on launch context.
|
1196
|
-
|
1197
|
-
When running in a launch context, the project, entity, and run_id are handled
|
1198
|
-
externally, and should be ignored if they are set.
|
1199
|
-
"""
|
1200
|
-
if not self.launch:
|
1201
|
-
return
|
1202
|
-
|
1203
|
-
for key in ("project", "entity", "run_id"):
|
1204
|
-
value = getattr(self, key)
|
1205
|
-
if value is not None:
|
1206
|
-
wandb.termwarn(
|
1207
|
-
f"Ignoring {key} {value!r} when running from wandb launch context."
|
1208
|
-
)
|
1209
|
-
setattr(self, key, None)
|
1210
|
-
|
1211
1155
|
@staticmethod
|
1212
1156
|
def validate_url(url: str) -> None:
|
1213
1157
|
"""Validate a URL string."""
|
@@ -1293,7 +1237,7 @@ class Settings(BaseModel, validate_assignment=True):
|
|
1293
1237
|
def _get_url_query_string(self) -> str:
|
1294
1238
|
"""Construct the query string for project, run, and sweep URLs."""
|
1295
1239
|
# TODO: remove dependency on Api()
|
1296
|
-
if
|
1240
|
+
if self.anonymous not in ["allow", "must"]:
|
1297
1241
|
return ""
|
1298
1242
|
|
1299
1243
|
api_key = apikey.api_key(settings=self)
|