wandb 0.17.5__py3-none-win_amd64.whl → 0.17.6__py3-none-win_amd64.whl
Sign up to get free protection for your applications and to get access to all the features.
- wandb/__init__.py +3 -1
- wandb/apis/public/api.py +1 -1
- wandb/apis/public/jobs.py +5 -0
- wandb/bin/wandb-core +0 -0
- wandb/data_types.py +2 -1
- wandb/env.py +6 -0
- wandb/integration/lightning/fabric/logger.py +4 -4
- wandb/proto/v3/wandb_internal_pb2.py +226 -226
- wandb/proto/v3/wandb_settings_pb2.py +1 -1
- wandb/proto/v3/wandb_telemetry_pb2.py +10 -10
- wandb/proto/v4/wandb_internal_pb2.py +226 -226
- wandb/proto/v4/wandb_settings_pb2.py +1 -1
- wandb/proto/v4/wandb_telemetry_pb2.py +10 -10
- wandb/proto/v5/wandb_internal_pb2.py +226 -226
- wandb/proto/v5/wandb_settings_pb2.py +1 -1
- wandb/proto/v5/wandb_telemetry_pb2.py +10 -10
- wandb/proto/wandb_deprecated.py +4 -0
- wandb/proto/wandb_internal_pb2.py +6 -0
- wandb/sdk/artifacts/artifact.py +5 -0
- wandb/sdk/artifacts/artifact_manifest_entry.py +31 -0
- wandb/sdk/artifacts/storage_handlers/azure_handler.py +35 -23
- wandb/sdk/data_types/object_3d.py +113 -2
- wandb/sdk/interface/interface.py +23 -0
- wandb/sdk/internal/sender.py +31 -15
- wandb/sdk/launch/_launch.py +4 -2
- wandb/sdk/launch/_project_spec.py +34 -8
- wandb/sdk/launch/agent/agent.py +6 -2
- wandb/sdk/launch/agent/run_queue_item_file_saver.py +2 -4
- wandb/sdk/launch/builder/build.py +4 -2
- wandb/sdk/launch/builder/templates/_wandb_bootstrap.py +2 -1
- wandb/sdk/launch/inputs/internal.py +42 -28
- wandb/sdk/launch/inputs/schema.py +39 -0
- wandb/sdk/launch/runner/kubernetes_runner.py +72 -0
- wandb/sdk/launch/runner/local_container.py +13 -10
- wandb/sdk/launch/runner/sagemaker_runner.py +3 -5
- wandb/sdk/launch/utils.py +2 -0
- wandb/sdk/lib/disabled.py +13 -174
- wandb/sdk/wandb_init.py +23 -27
- wandb/sdk/wandb_login.py +6 -6
- wandb/sdk/wandb_run.py +41 -22
- wandb/sdk/wandb_settings.py +3 -2
- wandb/wandb_agent.py +2 -0
- {wandb-0.17.5.dist-info → wandb-0.17.6.dist-info}/METADATA +3 -2
- {wandb-0.17.5.dist-info → wandb-0.17.6.dist-info}/RECORD +47 -46
- {wandb-0.17.5.dist-info → wandb-0.17.6.dist-info}/WHEEL +0 -0
- {wandb-0.17.5.dist-info → wandb-0.17.6.dist-info}/entry_points.txt +0 -0
- {wandb-0.17.5.dist-info → wandb-0.17.6.dist-info}/licenses/LICENSE +0 -0
wandb/sdk/lib/disabled.py
CHANGED
@@ -1,178 +1,6 @@
|
|
1
|
-
|
1
|
+
from typing import Any
|
2
2
|
|
3
|
-
|
4
|
-
class RunDisabled(str):
|
5
|
-
def __init__(self, *args, **kwargs):
|
6
|
-
object.__setattr__(self, "___dict", {})
|
7
|
-
|
8
|
-
def __add__(self, other):
|
9
|
-
return self
|
10
|
-
|
11
|
-
def __sub__(self, other):
|
12
|
-
return self
|
13
|
-
|
14
|
-
def __mul__(self, other):
|
15
|
-
return self
|
16
|
-
|
17
|
-
def __truediv__(self, other):
|
18
|
-
return self
|
19
|
-
|
20
|
-
def __floordiv__(self, other):
|
21
|
-
return self
|
22
|
-
|
23
|
-
def __mod__(self, other):
|
24
|
-
return self
|
25
|
-
|
26
|
-
def __pow__(self, other, modulo=None):
|
27
|
-
return self
|
28
|
-
|
29
|
-
def __lshift__(self, other):
|
30
|
-
return self
|
31
|
-
|
32
|
-
def __rshift__(self, other):
|
33
|
-
return self
|
34
|
-
|
35
|
-
def __and__(self, other):
|
36
|
-
return self
|
37
|
-
|
38
|
-
def __xor__(self, other):
|
39
|
-
return self
|
40
|
-
|
41
|
-
def __or__(self, other):
|
42
|
-
return self
|
43
|
-
|
44
|
-
def __iadd__(self, other):
|
45
|
-
return self
|
46
|
-
|
47
|
-
def __isub__(self, other):
|
48
|
-
return self
|
49
|
-
|
50
|
-
def __imul__(self, other):
|
51
|
-
return self
|
52
|
-
|
53
|
-
def __idiv__(self, other):
|
54
|
-
return self
|
55
|
-
|
56
|
-
def __ifloordiv__(self, other):
|
57
|
-
return self
|
58
|
-
|
59
|
-
def __imod__(self, other):
|
60
|
-
return self
|
61
|
-
|
62
|
-
def __ipow__(self, other, modulo=None):
|
63
|
-
return self
|
64
|
-
|
65
|
-
def __ilshift__(self, other):
|
66
|
-
return self
|
67
|
-
|
68
|
-
def __irshift__(self, other):
|
69
|
-
return self
|
70
|
-
|
71
|
-
def __iand__(self, other):
|
72
|
-
return self
|
73
|
-
|
74
|
-
def __ixor__(self, other):
|
75
|
-
return self
|
76
|
-
|
77
|
-
def __ior__(self, other):
|
78
|
-
return self
|
79
|
-
|
80
|
-
def __neg__(self):
|
81
|
-
return self
|
82
|
-
|
83
|
-
def __pos__(self):
|
84
|
-
return self
|
85
|
-
|
86
|
-
def __abs__(self):
|
87
|
-
return self
|
88
|
-
|
89
|
-
def __invert__(self):
|
90
|
-
return self
|
91
|
-
|
92
|
-
def __complex__(self):
|
93
|
-
return 1 + 0j
|
94
|
-
|
95
|
-
def __int__(self):
|
96
|
-
return 1
|
97
|
-
|
98
|
-
def __long__(self):
|
99
|
-
return 1
|
100
|
-
|
101
|
-
def __float__(self):
|
102
|
-
return 1.0
|
103
|
-
|
104
|
-
def __oct__(self):
|
105
|
-
return oct(1)
|
106
|
-
|
107
|
-
def __hex__(self):
|
108
|
-
return hex(1)
|
109
|
-
|
110
|
-
def __lt__(self, other):
|
111
|
-
return True
|
112
|
-
|
113
|
-
def __le__(self, other):
|
114
|
-
return True
|
115
|
-
|
116
|
-
def __eq__(self, other):
|
117
|
-
return True
|
118
|
-
|
119
|
-
def __ne__(self, other):
|
120
|
-
return True
|
121
|
-
|
122
|
-
def __gt__(self, other):
|
123
|
-
return True
|
124
|
-
|
125
|
-
def __ge__(self, other):
|
126
|
-
return True
|
127
|
-
|
128
|
-
def __getattr__(self, attr):
|
129
|
-
return self[attr]
|
130
|
-
|
131
|
-
def __getitem__(self, key):
|
132
|
-
d = object.__getattribute__(self, "___dict")
|
133
|
-
try:
|
134
|
-
if key in d:
|
135
|
-
return d[key]
|
136
|
-
except TypeError:
|
137
|
-
key = str(key)
|
138
|
-
if key in d:
|
139
|
-
return d[key]
|
140
|
-
dummy = RunDisabled()
|
141
|
-
d[key] = dummy
|
142
|
-
return dummy
|
143
|
-
|
144
|
-
def __setitem__(self, key, value):
|
145
|
-
object.__getattribute__(self, "___dict")[key] = value
|
146
|
-
|
147
|
-
def __setattr__(self, key, value):
|
148
|
-
self[key] = value
|
149
|
-
|
150
|
-
def __call__(self, *args, **kwargs):
|
151
|
-
return RunDisabled()
|
152
|
-
|
153
|
-
def __len__(self):
|
154
|
-
return 1
|
155
|
-
|
156
|
-
def __str__(self):
|
157
|
-
return ""
|
158
|
-
|
159
|
-
def __enter__(self):
|
160
|
-
return self
|
161
|
-
|
162
|
-
def __exit__(self, exc_type, exc_val, exc_tb):
|
163
|
-
return exc_type is None
|
164
|
-
|
165
|
-
def __repr__(self):
|
166
|
-
return ""
|
167
|
-
|
168
|
-
def __nonzero__(self):
|
169
|
-
return True
|
170
|
-
|
171
|
-
def __bool__(self):
|
172
|
-
return True
|
173
|
-
|
174
|
-
def __getstate__(self):
|
175
|
-
return 1
|
3
|
+
from wandb.sdk.lib import deprecate
|
176
4
|
|
177
5
|
|
178
6
|
class SummaryDisabled(dict):
|
@@ -188,3 +16,14 @@ class SummaryDisabled(dict):
|
|
188
16
|
val = SummaryDisabled(val)
|
189
17
|
self[key] = val
|
190
18
|
return val
|
19
|
+
|
20
|
+
|
21
|
+
class RunDisabled:
|
22
|
+
"""Compatibility class for integrations that explicitly check for wandb.RunDisabled."""
|
23
|
+
|
24
|
+
def __getattr__(self, name: str) -> Any:
|
25
|
+
deprecate.deprecate(
|
26
|
+
field_name=deprecate.Deprecated.run_disabled,
|
27
|
+
warning_message="RunDisabled is deprecated and is a no-op. "
|
28
|
+
'`wandb.init(mode="disabled")` now returns and instance of `wandb.sdk.wandb_run.Run`.',
|
29
|
+
)
|
wandb/sdk/wandb_init.py
CHANGED
@@ -30,15 +30,7 @@ from wandb.util import _is_artifact_representation
|
|
30
30
|
|
31
31
|
from . import wandb_login, wandb_setup
|
32
32
|
from .backend.backend import Backend
|
33
|
-
from .lib import
|
34
|
-
RunDisabled,
|
35
|
-
SummaryDisabled,
|
36
|
-
filesystem,
|
37
|
-
ipython,
|
38
|
-
module,
|
39
|
-
reporting,
|
40
|
-
telemetry,
|
41
|
-
)
|
33
|
+
from .lib import SummaryDisabled, filesystem, ipython, module, reporting, telemetry
|
42
34
|
from .lib.deprecate import Deprecated, deprecate
|
43
35
|
from .lib.mailbox import Mailbox, MailboxProgress
|
44
36
|
from .lib.printer import Printer, get_printer
|
@@ -529,20 +521,18 @@ class _WandbInit:
|
|
529
521
|
logger.info(f"Logging user logs to {settings.log_user}")
|
530
522
|
logger.info(f"Logging internal logs to {settings.log_internal}")
|
531
523
|
|
532
|
-
def _make_run_disabled(self) ->
|
533
|
-
drun =
|
534
|
-
drun.
|
535
|
-
drun.
|
536
|
-
drun.
|
537
|
-
drun.summary = SummaryDisabled()
|
538
|
-
drun.log = lambda data, *_, **__: drun.summary.update(data)
|
539
|
-
drun.finish = lambda *_, **__: module.unset_globals()
|
540
|
-
drun.
|
541
|
-
drun.
|
542
|
-
drun.
|
543
|
-
drun.
|
544
|
-
drun.name = "dummy-" + drun.id
|
545
|
-
drun.dir = tempfile.gettempdir()
|
524
|
+
def _make_run_disabled(self) -> Run:
|
525
|
+
drun = Run(settings=Settings(mode="disabled", files_dir=tempfile.gettempdir()))
|
526
|
+
drun._config = wandb.wandb_sdk.wandb_config.Config()
|
527
|
+
drun._config.update(self.sweep_config)
|
528
|
+
drun._config.update(self.config)
|
529
|
+
drun.summary = SummaryDisabled() # type: ignore
|
530
|
+
drun.log = lambda data, *_, **__: drun.summary.update(data) # type: ignore
|
531
|
+
drun.finish = lambda *_, **__: module.unset_globals() # type: ignore
|
532
|
+
drun._step = 0
|
533
|
+
drun._run_obj = None
|
534
|
+
drun._run_id = runid.generate_id()
|
535
|
+
drun._name = "dummy-" + drun.id
|
546
536
|
module.set_global(
|
547
537
|
run=drun,
|
548
538
|
config=drun.config,
|
@@ -563,7 +553,7 @@ class _WandbInit:
|
|
563
553
|
percent_done = handle.percent_done
|
564
554
|
self.printer.progress_update(line, percent_done=percent_done)
|
565
555
|
|
566
|
-
def init(self) ->
|
556
|
+
def init(self) -> Run: # noqa: C901
|
567
557
|
if logger is None:
|
568
558
|
raise RuntimeError("Logger not initialized")
|
569
559
|
logger.info("calling init triggers")
|
@@ -700,6 +690,12 @@ class _WandbInit:
|
|
700
690
|
tel.feature.flow_control_custom = True
|
701
691
|
if self.settings._require_core:
|
702
692
|
tel.feature.core = True
|
693
|
+
if self.settings._shared:
|
694
|
+
wandb.termwarn(
|
695
|
+
"The `_shared` feature is experimental and may change. "
|
696
|
+
"Please contact support@wandb.com for guidance and to report any issues."
|
697
|
+
)
|
698
|
+
tel.feature.shared_mode = True
|
703
699
|
|
704
700
|
tel.env.maybe_mp = _maybe_mp_process(backend)
|
705
701
|
|
@@ -853,7 +849,7 @@ def _attach(
|
|
853
849
|
run_id: Optional[str] = None,
|
854
850
|
*,
|
855
851
|
run: Optional["Run"] = None,
|
856
|
-
) ->
|
852
|
+
) -> Optional[Run]:
|
857
853
|
"""Attach to a run currently executing in another process/thread.
|
858
854
|
|
859
855
|
Arguments:
|
@@ -907,7 +903,7 @@ def _attach(
|
|
907
903
|
if run is None:
|
908
904
|
run = Run(settings=settings)
|
909
905
|
else:
|
910
|
-
run._init(
|
906
|
+
run._init()
|
911
907
|
run._set_library(_wl)
|
912
908
|
run._set_backend(backend)
|
913
909
|
backend._hack_set_run(run)
|
@@ -957,7 +953,7 @@ def init(
|
|
957
953
|
fork_from: Optional[str] = None,
|
958
954
|
resume_from: Optional[str] = None,
|
959
955
|
settings: Union[Settings, Dict[str, Any], None] = None,
|
960
|
-
) ->
|
956
|
+
) -> Run:
|
961
957
|
r"""Start a new run to track and log to W&B.
|
962
958
|
|
963
959
|
In an ML training pipeline, you could add `wandb.init()`
|
wandb/sdk/wandb_login.py
CHANGED
@@ -54,16 +54,16 @@ def login(
|
|
54
54
|
) -> bool:
|
55
55
|
"""Set up W&B login credentials.
|
56
56
|
|
57
|
-
By default, this will only store
|
57
|
+
By default, this will only store credentials locally without
|
58
58
|
verifying them with the W&B server. To verify credentials, pass
|
59
|
-
verify=True
|
59
|
+
`verify=True`.
|
60
60
|
|
61
61
|
Arguments:
|
62
62
|
anonymous: (string, optional) Can be "must", "allow", or "never".
|
63
|
-
If set to "must"
|
64
|
-
"allow"
|
65
|
-
isn't already logged in.
|
66
|
-
|
63
|
+
If set to "must", always log a user in anonymously. If set to
|
64
|
+
"allow", only create an anonymous user if the user
|
65
|
+
isn't already logged in. If set to "never", never log a
|
66
|
+
user anonymously. Default set to "never".
|
67
67
|
relogin: (bool, optional) If true, will re-prompt for API key.
|
68
68
|
host: (string, optional) The host to connect to.
|
69
69
|
force: (bool, optional) If true, will force a relogin.
|
wandb/sdk/wandb_run.py
CHANGED
@@ -235,10 +235,10 @@ class RunStatusChecker:
|
|
235
235
|
|
236
236
|
with lock:
|
237
237
|
if self._join_event.is_set():
|
238
|
-
|
238
|
+
break
|
239
239
|
set_handle(local_handle)
|
240
240
|
try:
|
241
|
-
result = local_handle.wait(timeout=timeout)
|
241
|
+
result = local_handle.wait(timeout=timeout, release=False)
|
242
242
|
except MailboxError:
|
243
243
|
# background threads are oportunistically getting results
|
244
244
|
# from the internal process but the internal process could
|
@@ -253,6 +253,7 @@ class RunStatusChecker:
|
|
253
253
|
if result:
|
254
254
|
process(result)
|
255
255
|
# if request finished, clear the handle to send on the next interval
|
256
|
+
local_handle.abandon()
|
256
257
|
local_handle = None
|
257
258
|
|
258
259
|
time_elapsed = time.monotonic() - time_probe
|
@@ -591,8 +592,12 @@ class Run:
|
|
591
592
|
) -> None:
|
592
593
|
# pid is set, so we know if this run object was initialized by this process
|
593
594
|
self._init_pid = os.getpid()
|
595
|
+
self._settings = settings
|
596
|
+
|
597
|
+
if settings._noop:
|
598
|
+
return
|
599
|
+
|
594
600
|
self._init(
|
595
|
-
settings=settings,
|
596
601
|
config=config,
|
597
602
|
sweep_config=sweep_config,
|
598
603
|
launch_config=launch_config,
|
@@ -600,12 +605,10 @@ class Run:
|
|
600
605
|
|
601
606
|
def _init(
|
602
607
|
self,
|
603
|
-
settings: Settings,
|
604
608
|
config: Optional[Dict[str, Any]] = None,
|
605
609
|
sweep_config: Optional[Dict[str, Any]] = None,
|
606
610
|
launch_config: Optional[Dict[str, Any]] = None,
|
607
611
|
) -> None:
|
608
|
-
self._settings = settings
|
609
612
|
self._config = wandb_config.Config()
|
610
613
|
self._config._set_callback(self._config_callback)
|
611
614
|
self._config._set_artifact_callback(self._config_artifact_callback)
|
@@ -2703,29 +2706,48 @@ class Run:
|
|
2703
2706
|
summary: Optional[str] = None,
|
2704
2707
|
goal: Optional[str] = None,
|
2705
2708
|
overwrite: Optional[bool] = None,
|
2706
|
-
**kwargs: Any,
|
2707
2709
|
) -> wandb_metric.Metric:
|
2708
|
-
"""
|
2710
|
+
"""Customize metrics logged with `wandb.log()`.
|
2709
2711
|
|
2710
2712
|
Arguments:
|
2711
|
-
name:
|
2712
|
-
step_metric:
|
2713
|
-
|
2714
|
-
|
2713
|
+
name: The name of the metric to customize.
|
2714
|
+
step_metric: The name of another metric to serve as the X-axis
|
2715
|
+
for this metric in automatically generated charts.
|
2716
|
+
step_sync: Automatically insert the last value of step_metric into
|
2717
|
+
`run.log()` if it is not provided explicitly. Defaults to True
|
2718
|
+
if step_metric is specified.
|
2715
2719
|
hidden: Hide this metric from automatic plots.
|
2716
2720
|
summary: Specify aggregate metrics added to summary.
|
2717
|
-
Supported aggregations
|
2718
|
-
|
2719
|
-
|
2720
|
-
|
2721
|
-
|
2721
|
+
Supported aggregations include "min", "max", "mean", "last",
|
2722
|
+
"best", "copy" and "none". "best" is used together with the
|
2723
|
+
goal parameter. "none" prevents a summary from being generated.
|
2724
|
+
"copy" is deprecated and should not be used.
|
2725
|
+
goal: Specify how to interpret the "best" summary type.
|
2726
|
+
Supported options are "minimize" and "maximize".
|
2727
|
+
overwrite: If false, then this call is merged with previous
|
2728
|
+
`define_metric` calls for the same metric by using their
|
2729
|
+
values for any unspecified parameters. If true, then
|
2730
|
+
unspecified parameters overwrite values specified by
|
2731
|
+
previous calls.
|
2722
2732
|
|
2723
2733
|
Returns:
|
2724
|
-
|
2725
|
-
|
2734
|
+
An object that represents this call but can otherwise be discarded.
|
2726
2735
|
"""
|
2736
|
+
if summary and "copy" in summary:
|
2737
|
+
deprecate.deprecate(
|
2738
|
+
deprecate.Deprecated.run__define_metric_copy,
|
2739
|
+
"define_metric(summary='copy') is deprecated and will be removed.",
|
2740
|
+
self,
|
2741
|
+
)
|
2742
|
+
|
2727
2743
|
return self._define_metric(
|
2728
|
-
name,
|
2744
|
+
name,
|
2745
|
+
step_metric,
|
2746
|
+
step_sync,
|
2747
|
+
hidden,
|
2748
|
+
summary,
|
2749
|
+
goal,
|
2750
|
+
overwrite,
|
2729
2751
|
)
|
2730
2752
|
|
2731
2753
|
def _define_metric(
|
@@ -2737,12 +2759,9 @@ class Run:
|
|
2737
2759
|
summary: Optional[str] = None,
|
2738
2760
|
goal: Optional[str] = None,
|
2739
2761
|
overwrite: Optional[bool] = None,
|
2740
|
-
**kwargs: Any,
|
2741
2762
|
) -> wandb_metric.Metric:
|
2742
2763
|
if not name:
|
2743
2764
|
raise wandb.Error("define_metric() requires non-empty name argument")
|
2744
|
-
for k in kwargs:
|
2745
|
-
wandb.termwarn(f"Unhandled define_metric() arg: {k}")
|
2746
2765
|
if isinstance(step_metric, wandb_metric.Metric):
|
2747
2766
|
step_metric = step_metric.name
|
2748
2767
|
for arg_name, arg_val, exp_type in (
|
wandb/sdk/wandb_settings.py
CHANGED
@@ -1882,9 +1882,10 @@ class Settings(SettingsData):
|
|
1882
1882
|
if self.resume_from is None:
|
1883
1883
|
return
|
1884
1884
|
|
1885
|
-
if self.run_id is not None:
|
1885
|
+
if self.run_id is not None and (self.resume_from.run != self.run_id):
|
1886
1886
|
wandb.termwarn(
|
1887
|
-
"
|
1887
|
+
"Both `run_id` and `resume_from` have been specified with different ids. "
|
1888
|
+
"`run_id` will be ignored."
|
1888
1889
|
)
|
1889
1890
|
self.update({"run_id": self.resume_from.run}, source=Source.INIT)
|
1890
1891
|
|
wandb/wandb_agent.py
CHANGED
@@ -43,6 +43,8 @@ class AgentProcess:
|
|
43
43
|
kwargs = dict(creationflags=subprocess.CREATE_NEW_PROCESS_GROUP)
|
44
44
|
else:
|
45
45
|
kwargs = dict(preexec_fn=os.setpgrp)
|
46
|
+
if env.get(wandb.env.SERVICE):
|
47
|
+
env.pop(wandb.env.SERVICE)
|
46
48
|
self._popen = subprocess.Popen(command, env=env, **kwargs)
|
47
49
|
elif function:
|
48
50
|
self._proc = multiprocessing.Process(
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: wandb
|
3
|
-
Version: 0.17.
|
3
|
+
Version: 0.17.6
|
4
4
|
Summary: A CLI and library for interacting with the Weights & Biases API.
|
5
5
|
Project-URL: Source, https://github.com/wandb/wandb
|
6
6
|
Project-URL: Bug Reports, https://github.com/wandb/wandb/issues
|
@@ -71,7 +71,7 @@ Requires-Dist: google-cloud-storage; extra == 'gcp'
|
|
71
71
|
Provides-Extra: importers
|
72
72
|
Requires-Dist: filelock; extra == 'importers'
|
73
73
|
Requires-Dist: mlflow; extra == 'importers'
|
74
|
-
Requires-Dist: polars; extra == 'importers'
|
74
|
+
Requires-Dist: polars<=1.2.1; extra == 'importers'
|
75
75
|
Requires-Dist: rich; extra == 'importers'
|
76
76
|
Requires-Dist: tenacity; extra == 'importers'
|
77
77
|
Provides-Extra: kubeflow
|
@@ -93,6 +93,7 @@ Requires-Dist: google-cloud-artifact-registry; extra == 'launch'
|
|
93
93
|
Requires-Dist: google-cloud-compute; extra == 'launch'
|
94
94
|
Requires-Dist: google-cloud-storage; extra == 'launch'
|
95
95
|
Requires-Dist: iso8601; extra == 'launch'
|
96
|
+
Requires-Dist: jsonschema; extra == 'launch'
|
96
97
|
Requires-Dist: kubernetes; extra == 'launch'
|
97
98
|
Requires-Dist: kubernetes-asyncio; extra == 'launch'
|
98
99
|
Requires-Dist: nbconvert; extra == 'launch'
|