wandb 0.15.10__py3-none-any.whl → 0.15.11__py3-none-any.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 +2 -1
- wandb/apis/public.py +51 -9
- wandb/apis/reports/blocks.py +1 -0
- wandb/cli/cli.py +14 -9
- wandb/env.py +11 -1
- wandb/integration/xgboost/xgboost.py +3 -3
- wandb/proto/v3/wandb_internal_pb2.py +300 -267
- wandb/proto/v3/wandb_settings_pb2.py +2 -2
- wandb/proto/v3/wandb_telemetry_pb2.py +16 -16
- wandb/proto/v4/wandb_internal_pb2.py +260 -252
- wandb/proto/v4/wandb_settings_pb2.py +2 -2
- wandb/proto/v4/wandb_telemetry_pb2.py +16 -16
- wandb/sdk/artifacts/artifact.py +9 -6
- wandb/sdk/artifacts/storage_handlers/s3_handler.py +12 -7
- wandb/sdk/data_types/image.py +1 -1
- wandb/sdk/internal/file_stream.py +2 -1
- wandb/sdk/internal/handler.py +24 -20
- wandb/sdk/internal/internal_api.py +9 -1
- wandb/sdk/internal/sender.py +4 -1
- wandb/sdk/internal/system/system_info.py +2 -2
- wandb/sdk/launch/__init__.py +5 -0
- wandb/sdk/launch/{launch.py → _launch.py} +53 -54
- wandb/sdk/launch/{launch_add.py → _launch_add.py} +34 -31
- wandb/sdk/launch/agent/agent.py +36 -18
- wandb/sdk/launch/agent/run_queue_item_file_saver.py +6 -4
- wandb/sdk/launch/runner/abstract.py +0 -2
- wandb/sdk/launch/runner/kubernetes_monitor.py +329 -0
- wandb/sdk/launch/runner/kubernetes_runner.py +44 -301
- wandb/sdk/launch/runner/local_container.py +5 -2
- wandb/sdk/launch/sweeps/scheduler.py +14 -10
- wandb/sdk/launch/sweeps/utils.py +5 -3
- wandb/sdk/launch/utils.py +3 -1
- wandb/sdk/lib/_settings_toposort_generated.py +5 -0
- wandb/sdk/lib/gql_request.py +3 -0
- wandb/sdk/lib/ipython.py +4 -0
- wandb/sdk/service/service.py +19 -6
- wandb/sdk/wandb_init.py +7 -2
- wandb/sdk/wandb_run.py +2 -5
- wandb/sdk/wandb_settings.py +48 -2
- wandb/util.py +1 -1
- {wandb-0.15.10.dist-info → wandb-0.15.11.dist-info}/METADATA +4 -1
- {wandb-0.15.10.dist-info → wandb-0.15.11.dist-info}/RECORD +46 -45
- {wandb-0.15.10.dist-info → wandb-0.15.11.dist-info}/LICENSE +0 -0
- {wandb-0.15.10.dist-info → wandb-0.15.11.dist-info}/WHEEL +0 -0
- {wandb-0.15.10.dist-info → wandb-0.15.11.dist-info}/entry_points.txt +0 -0
- {wandb-0.15.10.dist-info → wandb-0.15.11.dist-info}/top_level.txt +0 -0
wandb/__init__.py
CHANGED
@@ -11,7 +11,8 @@ For scripts and interactive notebooks, see https://github.com/wandb/examples.
|
|
11
11
|
|
12
12
|
For reference documentation, see https://docs.wandb.com/ref/python.
|
13
13
|
"""
|
14
|
-
__version__ = "0.15.
|
14
|
+
__version__ = "0.15.11"
|
15
|
+
_minimum_nexus_version = "0.16.0b1"
|
15
16
|
|
16
17
|
# Used with pypi checks and other messages related to pip
|
17
18
|
_wandb_module = "wandb"
|
wandb/apis/public.py
CHANGED
@@ -395,6 +395,9 @@ class Api:
|
|
395
395
|
auth = None
|
396
396
|
if not _thread_local_api_settings.cookies:
|
397
397
|
auth = ("api", self.api_key)
|
398
|
+
proxies = self.settings.get("_proxies") or json.loads(
|
399
|
+
os.environ.get("WANDB__PROXIES", "{}")
|
400
|
+
)
|
398
401
|
self._base_client = Client(
|
399
402
|
transport=GraphQLSession(
|
400
403
|
headers={
|
@@ -409,6 +412,7 @@ class Api:
|
|
409
412
|
auth=auth,
|
410
413
|
url="%s/graphql" % self.settings["base_url"],
|
411
414
|
cookies=_thread_local_api_settings.cookies,
|
415
|
+
proxies=proxies,
|
412
416
|
)
|
413
417
|
)
|
414
418
|
self._client = RetryingClient(self._base_client)
|
@@ -1992,11 +1996,18 @@ class Run(Attrs):
|
|
1992
1996
|
withRuns=False,
|
1993
1997
|
)
|
1994
1998
|
|
1995
|
-
|
1996
|
-
|
1997
|
-
|
1998
|
-
|
1999
|
-
|
1999
|
+
try:
|
2000
|
+
self._attrs["summaryMetrics"] = (
|
2001
|
+
json.loads(self._attrs["summaryMetrics"])
|
2002
|
+
if self._attrs.get("summaryMetrics")
|
2003
|
+
else {}
|
2004
|
+
)
|
2005
|
+
except json.decoder.JSONDecodeError:
|
2006
|
+
# ignore invalid utf-8 or control characters
|
2007
|
+
self._attrs["summaryMetrics"] = json.loads(
|
2008
|
+
self._attrs["summaryMetrics"],
|
2009
|
+
strict=False,
|
2010
|
+
)
|
2000
2011
|
self._attrs["systemMetrics"] = (
|
2001
2012
|
json.loads(self._attrs["systemMetrics"])
|
2002
2013
|
if self._attrs.get("systemMetrics")
|
@@ -2619,8 +2630,6 @@ class QueuedRun:
|
|
2619
2630
|
def wait_until_running(self):
|
2620
2631
|
if self._run is not None:
|
2621
2632
|
return self._run
|
2622
|
-
if self.container_job:
|
2623
|
-
raise LaunchError("Container jobs cannot be waited on")
|
2624
2633
|
|
2625
2634
|
while True:
|
2626
2635
|
# sleep here to hide an ugly warning
|
@@ -2672,6 +2681,7 @@ class RunQueue:
|
|
2672
2681
|
self._default_resource_config = _default_resource_config
|
2673
2682
|
self._type = None
|
2674
2683
|
self._items = None
|
2684
|
+
self._id = None
|
2675
2685
|
|
2676
2686
|
@property
|
2677
2687
|
def name(self):
|
@@ -2703,6 +2713,12 @@ class RunQueue:
|
|
2703
2713
|
self._get_default_resource_config()
|
2704
2714
|
return self._default_resource_config
|
2705
2715
|
|
2716
|
+
@property
|
2717
|
+
def id(self) -> str:
|
2718
|
+
if self._id is None:
|
2719
|
+
self._get_metadata()
|
2720
|
+
return self._id
|
2721
|
+
|
2706
2722
|
@property
|
2707
2723
|
def items(self) -> List[QueuedRun]:
|
2708
2724
|
"""Up to the first 100 queued runs. Modifying this list will not modify the queue or any enqueued items!"""
|
@@ -2711,6 +2727,30 @@ class RunQueue:
|
|
2711
2727
|
self._get_items()
|
2712
2728
|
return self._items
|
2713
2729
|
|
2730
|
+
@normalize_exceptions
|
2731
|
+
def delete(self):
|
2732
|
+
"""Delete the run queue from the wandb backend."""
|
2733
|
+
query = gql(
|
2734
|
+
"""
|
2735
|
+
mutation DeleteRunQueue($id: ID!) {
|
2736
|
+
deleteRunQueues(input: {queueIDs: [$id]}) {
|
2737
|
+
success
|
2738
|
+
clientMutationId
|
2739
|
+
}
|
2740
|
+
}
|
2741
|
+
"""
|
2742
|
+
)
|
2743
|
+
variable_values = {"id": self.id}
|
2744
|
+
res = self._client.execute(query, variable_values)
|
2745
|
+
if res["deleteRunQueues"]["success"]:
|
2746
|
+
self._id = None
|
2747
|
+
self._access = None
|
2748
|
+
self._default_resource_config_id = None
|
2749
|
+
self._default_resource_config = None
|
2750
|
+
self._items = None
|
2751
|
+
else:
|
2752
|
+
raise CommError(f"Failed to delete run queue {self.name}")
|
2753
|
+
|
2714
2754
|
def __repr__(self):
|
2715
2755
|
return f"<RunQueue {self._entity}/{self._name}>"
|
2716
2756
|
|
@@ -2721,6 +2761,7 @@ class RunQueue:
|
|
2721
2761
|
query GetRunQueueMetadata($projectName: String!, $entityName: String!, $runQueue: String!) {
|
2722
2762
|
project(name: $projectName, entityName: $entityName) {
|
2723
2763
|
runQueue(name: $runQueue) {
|
2764
|
+
id
|
2724
2765
|
access
|
2725
2766
|
defaultResourceConfigID
|
2726
2767
|
}
|
@@ -2734,6 +2775,7 @@ class RunQueue:
|
|
2734
2775
|
"runQueue": self._name,
|
2735
2776
|
}
|
2736
2777
|
res = self._client.execute(query, variable_values)
|
2778
|
+
self._id = res["project"]["runQueue"]["id"]
|
2737
2779
|
self._access = res["project"]["runQueue"]["access"]
|
2738
2780
|
self._default_resource_config_id = res["project"]["runQueue"][
|
2739
2781
|
"defaultResourceConfigID"
|
@@ -4830,7 +4872,7 @@ class Job:
|
|
4830
4872
|
resource_args=None,
|
4831
4873
|
project_queue=None,
|
4832
4874
|
):
|
4833
|
-
from wandb.sdk.launch import
|
4875
|
+
from wandb.sdk.launch import _launch_add
|
4834
4876
|
|
4835
4877
|
run_config = {}
|
4836
4878
|
for key, item in config.items():
|
@@ -4850,7 +4892,7 @@ class Job:
|
|
4850
4892
|
if isinstance(assigned_config_type, InvalidType):
|
4851
4893
|
raise TypeError(self._input_types.explain(run_config))
|
4852
4894
|
|
4853
|
-
queued_run =
|
4895
|
+
queued_run = _launch_add.launch_add(
|
4854
4896
|
job=self._name,
|
4855
4897
|
config={"overrides": {"run_config": run_config}},
|
4856
4898
|
project=project or self._project,
|
wandb/apis/reports/blocks.py
CHANGED
wandb/cli/cli.py
CHANGED
@@ -34,8 +34,8 @@ from wandb.apis import InternalApi, PublicApi
|
|
34
34
|
from wandb.integration.magic import magic_install
|
35
35
|
from wandb.sdk.artifacts.artifacts_cache import get_artifacts_cache
|
36
36
|
from wandb.sdk.launch import utils as launch_utils
|
37
|
+
from wandb.sdk.launch._launch_add import _launch_add
|
37
38
|
from wandb.sdk.launch.errors import ExecutionError, LaunchError
|
38
|
-
from wandb.sdk.launch.launch_add import _launch_add
|
39
39
|
from wandb.sdk.launch.sweeps import utils as sweep_utils
|
40
40
|
from wandb.sdk.launch.sweeps.scheduler import Scheduler
|
41
41
|
from wandb.sdk.lib import filesystem
|
@@ -1281,7 +1281,7 @@ def launch(
|
|
1281
1281
|
logger.info(
|
1282
1282
|
f"=== Launch called with kwargs {locals()} CLI Version: {wandb.__version__}==="
|
1283
1283
|
)
|
1284
|
-
from wandb.sdk.launch import
|
1284
|
+
from wandb.sdk.launch._launch import _launch
|
1285
1285
|
|
1286
1286
|
api = _get_cling_api()
|
1287
1287
|
wandb._sentry.configure_scope(process_context="launch_cli")
|
@@ -1291,6 +1291,11 @@ def launch(
|
|
1291
1291
|
"Cannot use both --async and --queue with wandb launch, see help for details."
|
1292
1292
|
)
|
1293
1293
|
|
1294
|
+
if queue and docker_image and not project:
|
1295
|
+
raise LaunchError(
|
1296
|
+
"Cannot use --queue and --docker together without a project. Please specify a project with --project or -p."
|
1297
|
+
)
|
1298
|
+
|
1294
1299
|
if resource_args is not None:
|
1295
1300
|
resource_args = util.load_json_yaml_dict(resource_args)
|
1296
1301
|
if resource_args is None:
|
@@ -1329,19 +1334,19 @@ def launch(
|
|
1329
1334
|
if queue is None:
|
1330
1335
|
# direct launch
|
1331
1336
|
try:
|
1332
|
-
run =
|
1337
|
+
run = _launch(
|
1333
1338
|
api,
|
1334
1339
|
uri,
|
1335
1340
|
job,
|
1336
|
-
entry_point,
|
1337
|
-
git_version,
|
1338
1341
|
project=project,
|
1339
1342
|
entity=entity,
|
1340
1343
|
docker_image=docker_image,
|
1341
1344
|
name=name,
|
1345
|
+
entry_point=entry_point,
|
1346
|
+
version=git_version,
|
1342
1347
|
resource=resource,
|
1343
1348
|
resource_args=resource_args,
|
1344
|
-
|
1349
|
+
launch_config=config,
|
1345
1350
|
synchronous=(not run_async),
|
1346
1351
|
run_id=run_id,
|
1347
1352
|
repository=repository,
|
@@ -1444,11 +1449,11 @@ def launch_agent(
|
|
1444
1449
|
"--url is not supported in this version, upgrade with: pip install -u wandb"
|
1445
1450
|
)
|
1446
1451
|
|
1447
|
-
|
1452
|
+
import wandb.sdk.launch._launch as _launch
|
1448
1453
|
|
1449
1454
|
api = _get_cling_api()
|
1450
1455
|
wandb._sentry.configure_scope(process_context="launch_agent")
|
1451
|
-
agent_config, api =
|
1456
|
+
agent_config, api = _launch.resolve_agent_config(
|
1452
1457
|
entity, project, max_jobs, queues, config
|
1453
1458
|
)
|
1454
1459
|
if agent_config.get("project") is None:
|
@@ -1465,7 +1470,7 @@ def launch_agent(
|
|
1465
1470
|
|
1466
1471
|
wandb.termlog("Starting launch agent ✨")
|
1467
1472
|
try:
|
1468
|
-
|
1473
|
+
_launch.create_and_run_agent(api, agent_config)
|
1469
1474
|
except Exception as e:
|
1470
1475
|
wandb._sentry.exception(e)
|
1471
1476
|
raise e
|
wandb/env.py
CHANGED
@@ -74,6 +74,7 @@ JUPYTER = "WANDB_JUPYTER"
|
|
74
74
|
CONFIG_DIR = "WANDB_CONFIG_DIR"
|
75
75
|
DATA_DIR = "WANDB_DATA_DIR"
|
76
76
|
ARTIFACT_DIR = "WANDB_ARTIFACT_DIR"
|
77
|
+
ARTIFACT_FETCH_FILE_URL_BATCH_SIZE = "WANDB_ARTIFACT_FETCH_FILE_URL_BATCH_SIZE"
|
77
78
|
CACHE_DIR = "WANDB_CACHE_DIR"
|
78
79
|
DISABLE_SSL = "WANDB_INSECURE_DISABLE_SSL"
|
79
80
|
SERVICE = "WANDB_SERVICE"
|
@@ -122,6 +123,7 @@ def immutable_keys() -> List[str]:
|
|
122
123
|
HOST,
|
123
124
|
DATA_DIR,
|
124
125
|
ARTIFACT_DIR,
|
126
|
+
ARTIFACT_FETCH_FILE_URL_BATCH_SIZE,
|
125
127
|
CACHE_DIR,
|
126
128
|
USE_V1_ARTIFACTS,
|
127
129
|
DISABLE_SSL,
|
@@ -193,7 +195,7 @@ def get_docker(
|
|
193
195
|
return env.get(DOCKER, default)
|
194
196
|
|
195
197
|
|
196
|
-
def get_http_timeout(default: int =
|
198
|
+
def get_http_timeout(default: int = 20, env: Optional[Env] = None) -> int:
|
197
199
|
if env is None:
|
198
200
|
env = os.environ
|
199
201
|
|
@@ -380,6 +382,14 @@ def get_artifact_dir(env: Optional[Env] = None) -> str:
|
|
380
382
|
return val
|
381
383
|
|
382
384
|
|
385
|
+
def get_artifact_fetch_file_url_batch_size(env: Optional[Env] = None) -> int:
|
386
|
+
default_batch_size = 5000
|
387
|
+
if env is None:
|
388
|
+
env = os.environ
|
389
|
+
val = int(env.get(ARTIFACT_FETCH_FILE_URL_BATCH_SIZE, default_batch_size))
|
390
|
+
return val
|
391
|
+
|
392
|
+
|
383
393
|
def get_cache_dir(env: Optional[Env] = None) -> Path:
|
384
394
|
env = env or os.environ
|
385
395
|
return Path(env.get(CACHE_DIR, appdirs.user_cache_dir("wandb")))
|
@@ -64,10 +64,10 @@ class WandbCallback(xgb.callback.TrainingCallback):
|
|
64
64
|
Passing `WandbCallback` to XGBoost will:
|
65
65
|
|
66
66
|
- log the booster model configuration to Weights & Biases
|
67
|
-
- log evaluation metrics collected by XGBoost, such as rmse, accuracy etc to Weights & Biases
|
67
|
+
- log evaluation metrics collected by XGBoost, such as rmse, accuracy etc. to Weights & Biases
|
68
68
|
- log training metric collected by XGBoost (if you provide training data to eval_set)
|
69
69
|
- log the best score and the best iteration
|
70
|
-
- save and upload your trained model to
|
70
|
+
- save and upload your trained model to Weights & Biases Artifacts (when `log_model = True`)
|
71
71
|
- log feature importance plot when `log_feature_importance=True` (default).
|
72
72
|
- Capture the best eval metric in `wandb.summary` when `define_metric=True` (default).
|
73
73
|
|
@@ -81,6 +81,7 @@ class WandbCallback(xgb.callback.TrainingCallback):
|
|
81
81
|
alpha=10,
|
82
82
|
n_estimators=10,
|
83
83
|
tree_method="hist",
|
84
|
+
callbacks=[WandbCallback()],
|
84
85
|
)
|
85
86
|
|
86
87
|
xg_reg = xgb.XGBRegressor(**bst_params)
|
@@ -88,7 +89,6 @@ class WandbCallback(xgb.callback.TrainingCallback):
|
|
88
89
|
X_train,
|
89
90
|
y_train,
|
90
91
|
eval_set=[(X_test, y_test)],
|
91
|
-
callbacks=[WandbCallback()],
|
92
92
|
)
|
93
93
|
```
|
94
94
|
"""
|