wandb 0.15.10__py3-none-any.whl → 0.15.11__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
"""
|