wandb 0.15.9__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 +5 -1
- wandb/apis/public.py +137 -17
- wandb/apis/reports/_panels.py +1 -1
- wandb/apis/reports/blocks.py +1 -0
- wandb/apis/reports/report.py +27 -5
- wandb/cli/cli.py +52 -41
- wandb/docker/__init__.py +17 -0
- wandb/docker/auth.py +1 -1
- wandb/env.py +24 -4
- wandb/filesync/step_checksum.py +3 -3
- wandb/integration/openai/openai.py +3 -0
- wandb/integration/ultralytics/__init__.py +9 -0
- wandb/integration/ultralytics/bbox_utils.py +196 -0
- wandb/integration/ultralytics/callback.py +458 -0
- wandb/integration/ultralytics/classification_utils.py +66 -0
- wandb/integration/ultralytics/mask_utils.py +141 -0
- wandb/integration/ultralytics/pose_utils.py +92 -0
- wandb/integration/xgboost/xgboost.py +3 -3
- wandb/integration/yolov8/__init__.py +0 -7
- wandb/integration/yolov8/yolov8.py +22 -3
- wandb/old/settings.py +7 -0
- wandb/plot/line_series.py +0 -1
- wandb/proto/v3/wandb_internal_pb2.py +353 -300
- wandb/proto/v3/wandb_server_pb2.py +37 -41
- 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 +272 -260
- wandb/proto/v4/wandb_server_pb2.py +37 -40
- wandb/proto/v4/wandb_settings_pb2.py +2 -2
- wandb/proto/v4/wandb_telemetry_pb2.py +16 -16
- wandb/proto/wandb_internal_codegen.py +7 -31
- wandb/sdk/artifacts/artifact.py +321 -189
- wandb/sdk/artifacts/artifact_cache.py +14 -0
- wandb/sdk/artifacts/artifact_manifest.py +5 -4
- wandb/sdk/artifacts/artifact_manifest_entry.py +37 -9
- wandb/sdk/artifacts/artifact_manifests/artifact_manifest_v1.py +1 -9
- wandb/sdk/artifacts/artifact_saver.py +13 -50
- wandb/sdk/artifacts/artifact_ttl.py +6 -0
- wandb/sdk/artifacts/artifacts_cache.py +119 -93
- wandb/sdk/artifacts/staging.py +25 -0
- wandb/sdk/artifacts/storage_handlers/s3_handler.py +12 -7
- wandb/sdk/artifacts/storage_handlers/wb_local_artifact_handler.py +2 -3
- wandb/sdk/artifacts/storage_policies/__init__.py +4 -0
- wandb/sdk/artifacts/storage_policies/register.py +1 -0
- wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +4 -3
- wandb/sdk/artifacts/storage_policy.py +4 -2
- wandb/sdk/backend/backend.py +0 -16
- wandb/sdk/data_types/image.py +3 -1
- wandb/sdk/integration_utils/auto_logging.py +38 -13
- wandb/sdk/interface/interface.py +16 -135
- wandb/sdk/interface/interface_shared.py +9 -147
- wandb/sdk/interface/interface_sock.py +0 -26
- wandb/sdk/internal/file_pusher.py +20 -3
- wandb/sdk/internal/file_stream.py +3 -1
- wandb/sdk/internal/handler.py +53 -70
- wandb/sdk/internal/internal_api.py +220 -130
- wandb/sdk/internal/job_builder.py +41 -37
- wandb/sdk/internal/sender.py +7 -25
- wandb/sdk/internal/system/assets/disk.py +144 -11
- wandb/sdk/internal/system/system_info.py +6 -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/_project_spec.py +13 -2
- wandb/sdk/launch/agent/agent.py +103 -59
- wandb/sdk/launch/agent/run_queue_item_file_saver.py +6 -4
- wandb/sdk/launch/builder/build.py +19 -1
- wandb/sdk/launch/builder/docker_builder.py +5 -1
- wandb/sdk/launch/builder/kaniko_builder.py +5 -1
- wandb/sdk/launch/create_job.py +20 -5
- wandb/sdk/launch/loader.py +14 -5
- wandb/sdk/launch/runner/abstract.py +0 -2
- wandb/sdk/launch/runner/kubernetes_monitor.py +329 -0
- wandb/sdk/launch/runner/kubernetes_runner.py +66 -209
- wandb/sdk/launch/runner/local_container.py +5 -2
- wandb/sdk/launch/runner/local_process.py +4 -1
- wandb/sdk/launch/sweeps/scheduler.py +43 -25
- wandb/sdk/launch/sweeps/utils.py +5 -3
- wandb/sdk/launch/utils.py +3 -1
- wandb/sdk/lib/_settings_toposort_generate.py +3 -9
- wandb/sdk/lib/_settings_toposort_generated.py +27 -3
- wandb/sdk/lib/_wburls_generated.py +1 -0
- wandb/sdk/lib/filenames.py +27 -6
- wandb/sdk/lib/filesystem.py +181 -7
- wandb/sdk/lib/fsm.py +5 -3
- wandb/sdk/lib/gql_request.py +3 -0
- wandb/sdk/lib/ipython.py +7 -0
- wandb/sdk/lib/wburls.py +1 -0
- wandb/sdk/service/port_file.py +2 -15
- wandb/sdk/service/server.py +7 -55
- wandb/sdk/service/service.py +56 -26
- wandb/sdk/service/service_base.py +1 -1
- wandb/sdk/service/streams.py +11 -5
- wandb/sdk/verify/verify.py +2 -2
- wandb/sdk/wandb_init.py +8 -2
- wandb/sdk/wandb_manager.py +4 -14
- wandb/sdk/wandb_run.py +143 -53
- wandb/sdk/wandb_settings.py +148 -35
- wandb/testing/relay.py +85 -38
- wandb/util.py +87 -4
- wandb/wandb_torch.py +24 -38
- {wandb-0.15.9.dist-info → wandb-0.15.11.dist-info}/METADATA +48 -23
- {wandb-0.15.9.dist-info → wandb-0.15.11.dist-info}/RECORD +107 -103
- {wandb-0.15.9.dist-info → wandb-0.15.11.dist-info}/WHEEL +1 -1
- wandb/proto/v3/wandb_server_pb2_grpc.py +0 -1422
- wandb/proto/v4/wandb_server_pb2_grpc.py +0 -1422
- wandb/proto/wandb_server_pb2_grpc.py +0 -8
- wandb/sdk/artifacts/storage_policies/s3_bucket_policy.py +0 -61
- wandb/sdk/interface/interface_grpc.py +0 -460
- wandb/sdk/service/server_grpc.py +0 -444
- wandb/sdk/service/service_grpc.py +0 -73
- {wandb-0.15.9.dist-info → wandb-0.15.11.dist-info}/LICENSE +0 -0
- {wandb-0.15.9.dist-info → wandb-0.15.11.dist-info}/entry_points.txt +0 -0
- {wandb-0.15.9.dist-info → wandb-0.15.11.dist-info}/top_level.txt +0 -0
wandb/util.py
CHANGED
@@ -4,6 +4,7 @@ import functools
|
|
4
4
|
import gzip
|
5
5
|
import importlib
|
6
6
|
import importlib.util
|
7
|
+
import itertools
|
7
8
|
import json
|
8
9
|
import logging
|
9
10
|
import math
|
@@ -13,8 +14,10 @@ import platform
|
|
13
14
|
import queue
|
14
15
|
import random
|
15
16
|
import re
|
17
|
+
import secrets
|
16
18
|
import shlex
|
17
19
|
import socket
|
20
|
+
import string
|
18
21
|
import sys
|
19
22
|
import tarfile
|
20
23
|
import tempfile
|
@@ -42,6 +45,7 @@ from typing import (
|
|
42
45
|
Set,
|
43
46
|
TextIO,
|
44
47
|
Tuple,
|
48
|
+
TypeVar,
|
45
49
|
Union,
|
46
50
|
)
|
47
51
|
|
@@ -62,6 +66,7 @@ if TYPE_CHECKING:
|
|
62
66
|
from wandb.sdk.artifacts.artifact import Artifact
|
63
67
|
|
64
68
|
CheckRetryFnType = Callable[[Exception], Union[bool, timedelta]]
|
69
|
+
T = TypeVar("T")
|
65
70
|
|
66
71
|
|
67
72
|
logger = logging.getLogger(__name__)
|
@@ -629,6 +634,9 @@ def json_friendly( # noqa: C901
|
|
629
634
|
obj = None
|
630
635
|
elif isinstance(obj, dict) and np:
|
631
636
|
obj, converted = _sanitize_numpy_keys(obj)
|
637
|
+
elif isinstance(obj, set):
|
638
|
+
# set is not json serializable, so we convert it to tuple
|
639
|
+
obj = tuple(obj)
|
632
640
|
else:
|
633
641
|
converted = False
|
634
642
|
if getsizeof(obj) > VALUE_BYTES_LIMIT:
|
@@ -875,7 +883,7 @@ def no_retry_auth(e: Any) -> bool:
|
|
875
883
|
if not isinstance(e, requests.HTTPError):
|
876
884
|
return True
|
877
885
|
if e.response is None:
|
878
|
-
return True
|
886
|
+
return True # type: ignore
|
879
887
|
# Don't retry bad request errors; raise immediately
|
880
888
|
if e.response.status_code in (400, 409):
|
881
889
|
return False
|
@@ -1315,6 +1323,22 @@ def download_file_from_url(
|
|
1315
1323
|
file.write(data)
|
1316
1324
|
|
1317
1325
|
|
1326
|
+
def download_file_into_memory(source_url: str, api_key: Optional[str] = None) -> bytes:
|
1327
|
+
auth = None
|
1328
|
+
if not _thread_local_api_settings.cookies:
|
1329
|
+
auth = ("api", api_key or "")
|
1330
|
+
response = requests.get(
|
1331
|
+
source_url,
|
1332
|
+
auth=auth,
|
1333
|
+
headers=_thread_local_api_settings.headers,
|
1334
|
+
cookies=_thread_local_api_settings.cookies,
|
1335
|
+
stream=True,
|
1336
|
+
timeout=5,
|
1337
|
+
)
|
1338
|
+
response.raise_for_status()
|
1339
|
+
return response.content
|
1340
|
+
|
1341
|
+
|
1318
1342
|
def isatty(ob: IO) -> bool:
|
1319
1343
|
return hasattr(ob, "isatty") and ob.isatty()
|
1320
1344
|
|
@@ -1484,7 +1508,7 @@ def rand_alphanumeric(
|
|
1484
1508
|
def fsync_open(
|
1485
1509
|
path: StrPath, mode: str = "w", encoding: Optional[str] = None
|
1486
1510
|
) -> Generator[IO[Any], None, None]:
|
1487
|
-
"""Open a path for I/O and
|
1511
|
+
"""Open a path for I/O and guarantee that the file is flushed and synced."""
|
1488
1512
|
with open(path, mode, encoding=encoding) as f:
|
1489
1513
|
yield f
|
1490
1514
|
|
@@ -1526,8 +1550,9 @@ def _is_databricks() -> bool:
|
|
1526
1550
|
return False
|
1527
1551
|
|
1528
1552
|
|
1529
|
-
def
|
1530
|
-
|
1553
|
+
def _is_py_or_dockerfile(path: str) -> bool:
|
1554
|
+
file = os.path.basename(path)
|
1555
|
+
return file.endswith(".py") or file.startswith("Dockerfile")
|
1531
1556
|
|
1532
1557
|
|
1533
1558
|
def check_windows_valid_filename(path: Union[int, str]) -> bool:
|
@@ -1753,3 +1778,61 @@ def cast_dictlike_to_dict(d: Dict[str, Any]) -> Dict[str, Any]:
|
|
1753
1778
|
d[k] = dict(v)
|
1754
1779
|
cast_dictlike_to_dict(d[k])
|
1755
1780
|
return d
|
1781
|
+
|
1782
|
+
|
1783
|
+
def remove_keys_with_none_values(
|
1784
|
+
d: Union[Dict[str, Any], Any]
|
1785
|
+
) -> Union[Dict[str, Any], Any]:
|
1786
|
+
# otherwise iterrows will create a bunch of ugly charts
|
1787
|
+
if not isinstance(d, dict):
|
1788
|
+
return d
|
1789
|
+
|
1790
|
+
if isinstance(d, dict):
|
1791
|
+
new_dict = {}
|
1792
|
+
for k, v in d.items():
|
1793
|
+
new_v = remove_keys_with_none_values(v)
|
1794
|
+
if new_v is not None and not (isinstance(new_v, dict) and len(new_v) == 0):
|
1795
|
+
new_dict[k] = new_v
|
1796
|
+
return new_dict if new_dict else None
|
1797
|
+
|
1798
|
+
|
1799
|
+
def batched(n: int, iterable: Iterable[T]) -> Generator[List[T], None, None]:
|
1800
|
+
i = iter(iterable)
|
1801
|
+
batch = list(itertools.islice(i, n))
|
1802
|
+
while batch:
|
1803
|
+
yield batch
|
1804
|
+
batch = list(itertools.islice(i, n))
|
1805
|
+
|
1806
|
+
|
1807
|
+
def random_string(length: int = 12) -> str:
|
1808
|
+
"""Generate a random string of a given length.
|
1809
|
+
|
1810
|
+
:param length: Length of the string to generate.
|
1811
|
+
:return: Random string.
|
1812
|
+
"""
|
1813
|
+
return "".join(
|
1814
|
+
secrets.choice(string.ascii_lowercase + string.digits) for _ in range(length)
|
1815
|
+
)
|
1816
|
+
|
1817
|
+
|
1818
|
+
def sample_with_exponential_decay_weights(
|
1819
|
+
xs: Union[Iterable, Iterable[Iterable]],
|
1820
|
+
ys: Iterable[Iterable],
|
1821
|
+
keys: Optional[Iterable] = None,
|
1822
|
+
sample_size: int = 1500,
|
1823
|
+
) -> Tuple[List, List, Optional[List]]:
|
1824
|
+
"""Sample from a list of lists with weights that decay exponentially.
|
1825
|
+
|
1826
|
+
May be used with the wandb.plot.line_series function.
|
1827
|
+
"""
|
1828
|
+
xs_array = np.array(xs)
|
1829
|
+
ys_array = np.array(ys)
|
1830
|
+
keys_array = np.array(keys) if keys else None
|
1831
|
+
weights = np.exp(-np.arange(len(xs_array)) / len(xs_array))
|
1832
|
+
weights /= np.sum(weights)
|
1833
|
+
sampled_indices = np.random.choice(len(xs_array), size=sample_size, p=weights)
|
1834
|
+
sampled_xs = xs_array[sampled_indices].tolist()
|
1835
|
+
sampled_ys = ys_array[sampled_indices].tolist()
|
1836
|
+
sampled_keys = keys_array[sampled_indices].tolist() if keys else None
|
1837
|
+
|
1838
|
+
return sampled_xs, sampled_ys, sampled_keys
|
wandb/wandb_torch.py
CHANGED
@@ -147,69 +147,55 @@ class TorchHistory:
|
|
147
147
|
def log_tensor_stats(self, tensor, name):
|
148
148
|
"""Add distribution statistics on a tensor's elements to the current History entry"""
|
149
149
|
# TODO Handle the case of duplicate names.
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
isinstance(tensor[0], tuple) or isinstance(tensor[0], list)
|
150
|
+
if isinstance(tensor, (tuple, list)):
|
151
|
+
while isinstance(tensor, (tuple, list)) and isinstance(
|
152
|
+
tensor[0], (tuple, list)
|
154
153
|
):
|
155
154
|
tensor = [item for sublist in tensor for item in sublist]
|
156
|
-
tensor = torch.cat([t.reshape(-1) for t in tensor])
|
155
|
+
tensor = torch.cat([t.detach().clone().reshape(-1) for t in tensor])
|
157
156
|
|
157
|
+
tensor = tensor.detach().clone()
|
158
158
|
# checking for inheritance from _TensorBase didn't work for some reason
|
159
159
|
if not hasattr(tensor, "shape"):
|
160
160
|
cls = type(tensor)
|
161
161
|
raise TypeError(f"Expected Tensor, not {cls.__module__}.{cls.__name__}")
|
162
162
|
|
163
|
-
# HalfTensors on cpu do not support view(), upconvert to 32bit
|
164
|
-
if isinstance(tensor, torch.HalfTensor):
|
165
|
-
tensor = tensor.clone().type(torch.FloatTensor).detach()
|
166
|
-
|
167
163
|
# Sparse tensors have a bunch of implicit zeros. In order to histo them correctly,
|
168
164
|
# we have to count them up and add them to the histo ourselves.
|
169
165
|
sparse_zeros = None
|
170
166
|
if tensor.is_sparse:
|
171
167
|
# Have to call this on a sparse tensor before most other ops.
|
172
|
-
tensor = tensor.cpu().coalesce()
|
168
|
+
tensor = tensor.cpu().coalesce()
|
173
169
|
|
174
170
|
backing_values = tensor._values()
|
175
|
-
|
176
|
-
all_values = tensor.numel()
|
177
|
-
sparse_zeros = all_values - non_zero_values
|
171
|
+
sparse_zeros = tensor.numel() - backing_values.numel()
|
178
172
|
tensor = backing_values
|
179
173
|
|
180
174
|
flat = tensor.reshape(-1)
|
181
175
|
|
182
|
-
# For pytorch 0.3 we use unoptimized numpy histograms (detach is new in 0.4)
|
183
|
-
if not hasattr(flat, "detach"):
|
184
|
-
tensor = flat.cpu().clone().numpy()
|
185
|
-
wandb.run._log({name: wandb.Histogram(tensor)}, commit=False)
|
186
|
-
return
|
187
|
-
|
188
176
|
if flat.is_cuda:
|
189
|
-
# TODO(jhr): see if pytorch will accept something upstream to check cuda support for ops
|
190
|
-
# until then, we are going to have to catch a specific exception to check for histc support.
|
191
177
|
if self._is_cuda_histc_supported is None:
|
192
|
-
self._is_cuda_histc_supported = True
|
193
|
-
check = torch.cuda.FloatTensor(1).fill_(0)
|
194
178
|
try:
|
195
|
-
|
196
|
-
except RuntimeError
|
197
|
-
# Only work around missing support with specific exception
|
198
|
-
# if str(e).startswith("_th_histc is not implemented"):
|
199
|
-
# self._is_cuda_histc_supported = False
|
200
|
-
# On second thought, 0.4.1 doesnt have support and maybe there are other issues
|
201
|
-
# lets disable more broadly for now
|
179
|
+
flat.histc(bins=self._num_bins)
|
180
|
+
except RuntimeError:
|
202
181
|
self._is_cuda_histc_supported = False
|
203
|
-
|
204
|
-
|
205
|
-
flat = flat.cpu().clone().detach()
|
182
|
+
else:
|
183
|
+
self._is_cuda_histc_supported = True
|
206
184
|
|
207
185
|
# As of torch 1.0.1.post2+nightly, float16 cuda summary ops are not supported (convert to float32)
|
208
|
-
if
|
209
|
-
flat = flat.
|
186
|
+
if not self._is_cuda_histc_supported:
|
187
|
+
flat = flat.cpu()
|
188
|
+
elif not isinstance(
|
189
|
+
flat, (torch.cuda.FloatTensor, torch.cuda.DoubleTensor)
|
190
|
+
):
|
191
|
+
flat = flat.type(torch.cuda.FloatTensor)
|
210
192
|
|
211
|
-
|
212
|
-
|
193
|
+
# Since we use histc, we need to make sure that torch supports the operation on CPU,
|
194
|
+
# otherwise we'll get a runtime error. Hence, we need to upcast to float32.
|
195
|
+
if not flat.is_cuda and not isinstance(
|
196
|
+
flat, (torch.FloatTensor, torch.DoubleTensor)
|
197
|
+
):
|
198
|
+
flat = flat.type(torch.FloatTensor)
|
213
199
|
|
214
200
|
# Skip logging if all values are nan or inf or the tensor is empty.
|
215
201
|
if self._no_finite_values(flat):
|
@@ -229,7 +215,7 @@ class TorchHistory:
|
|
229
215
|
if tmin > tmax:
|
230
216
|
tmin, tmax = tmax, tmin
|
231
217
|
tensor = flat.histc(bins=self._num_bins, min=tmin, max=tmax)
|
232
|
-
tensor = tensor.cpu().
|
218
|
+
tensor = tensor.cpu().detach().clone()
|
233
219
|
bins = torch.linspace(tmin, tmax, steps=self._num_bins + 1)
|
234
220
|
|
235
221
|
# Add back zeroes from a sparse tensor.
|
@@ -1,21 +1,46 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: wandb
|
3
|
-
Version: 0.15.
|
4
|
-
Summary: A CLI and library for interacting with the Weights
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
Version: 0.15.11
|
4
|
+
Summary: A CLI and library for interacting with the Weights & Biases API.
|
5
|
+
Author-email: Weights & Biases <support@wandb.com>
|
6
|
+
License: MIT License
|
7
|
+
|
8
|
+
Copyright (c) 2021 Weights and Biases, Inc.
|
9
|
+
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
12
|
+
in the Software without restriction, including without limitation the rights
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
15
|
+
furnished to do so, subject to the following conditions:
|
16
|
+
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
18
|
+
copies or substantial portions of the Software.
|
19
|
+
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
26
|
+
SOFTWARE.
|
27
|
+
|
28
|
+
Project-URL: Source, https://github.com/wandb/wandb
|
29
|
+
Project-URL: Bug Reports, https://github.com/wandb/wandb/issues
|
30
|
+
Project-URL: Documentation, https://docs.wandb.ai/
|
9
31
|
Classifier: Development Status :: 5 - Production/Stable
|
10
32
|
Classifier: Intended Audience :: Developers
|
11
33
|
Classifier: Intended Audience :: Science/Research
|
12
34
|
Classifier: License :: OSI Approved :: MIT License
|
13
35
|
Classifier: Natural Language :: English
|
14
|
-
Classifier: Programming Language :: Python :: 3
|
36
|
+
Classifier: Programming Language :: Python :: 3
|
15
37
|
Classifier: Programming Language :: Python :: 3.6
|
16
38
|
Classifier: Programming Language :: Python :: 3.7
|
17
39
|
Classifier: Programming Language :: Python :: 3.8
|
18
40
|
Classifier: Programming Language :: Python :: 3.9
|
41
|
+
Classifier: Programming Language :: Python :: 3.10
|
42
|
+
Classifier: Programming Language :: Python :: 3.11
|
43
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
19
44
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
20
45
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
21
46
|
Classifier: Topic :: System :: Logging
|
@@ -23,25 +48,24 @@ Classifier: Topic :: System :: Monitoring
|
|
23
48
|
Requires-Python: >=3.6
|
24
49
|
Description-Content-Type: text/markdown
|
25
50
|
License-File: LICENSE
|
26
|
-
Requires-Dist: Click
|
27
|
-
Requires-Dist: GitPython
|
28
|
-
Requires-Dist: requests
|
29
|
-
Requires-Dist: psutil
|
30
|
-
Requires-Dist: sentry-sdk
|
31
|
-
Requires-Dist: docker-pycreds
|
51
|
+
Requires-Dist: Click !=8.0.0,>=7.1
|
52
|
+
Requires-Dist: GitPython !=3.1.29,>=1.0.0
|
53
|
+
Requires-Dist: requests <3,>=2.0.0
|
54
|
+
Requires-Dist: psutil >=5.0.0
|
55
|
+
Requires-Dist: sentry-sdk >=1.0.0
|
56
|
+
Requires-Dist: docker-pycreds >=0.4.0
|
32
57
|
Requires-Dist: PyYAML
|
33
58
|
Requires-Dist: pathtools
|
34
59
|
Requires-Dist: setproctitle
|
35
60
|
Requires-Dist: setuptools
|
36
|
-
Requires-Dist: appdirs
|
61
|
+
Requires-Dist: appdirs >=1.4.3
|
37
62
|
Requires-Dist: typing-extensions ; python_version < "3.10"
|
38
|
-
Requires-Dist:
|
39
|
-
Requires-Dist: protobuf
|
40
|
-
Requires-Dist: protobuf
|
41
|
-
Requires-Dist: protobuf
|
42
|
-
Requires-Dist: protobuf (!=4.21.0,<5,>=3.19.0) ; sys_platform != "linux"
|
63
|
+
Requires-Dist: protobuf !=4.21.0,<5,>=3.12.0 ; python_version < "3.9" and sys_platform == "linux"
|
64
|
+
Requires-Dist: protobuf !=4.21.0,<5,>=3.15.0 ; python_version == "3.9" and sys_platform == "linux"
|
65
|
+
Requires-Dist: protobuf !=4.21.0,<5,>=3.19.0 ; python_version > "3.9" and sys_platform == "linux"
|
66
|
+
Requires-Dist: protobuf !=4.21.0,<5,>=3.19.0 ; sys_platform != "linux"
|
43
67
|
Provides-Extra: async
|
44
|
-
Requires-Dist: httpx
|
68
|
+
Requires-Dist: httpx >=0.22.0 ; extra == 'async'
|
45
69
|
Provides-Extra: aws
|
46
70
|
Requires-Dist: boto3 ; extra == 'aws'
|
47
71
|
Provides-Extra: azure
|
@@ -49,8 +73,6 @@ Requires-Dist: azure-identity ; extra == 'azure'
|
|
49
73
|
Requires-Dist: azure-storage-blob ; extra == 'azure'
|
50
74
|
Provides-Extra: gcp
|
51
75
|
Requires-Dist: google-cloud-storage ; extra == 'gcp'
|
52
|
-
Provides-Extra: grpc
|
53
|
-
Requires-Dist: grpcio (>=1.27.2) ; extra == 'grpc'
|
54
76
|
Provides-Extra: kubeflow
|
55
77
|
Requires-Dist: kubernetes ; extra == 'kubeflow'
|
56
78
|
Requires-Dist: minio ; extra == 'kubeflow'
|
@@ -74,6 +96,7 @@ Requires-Dist: optuna ; extra == 'launch'
|
|
74
96
|
Requires-Dist: nbconvert ; extra == 'launch'
|
75
97
|
Requires-Dist: nbformat ; extra == 'launch'
|
76
98
|
Requires-Dist: typing-extensions ; extra == 'launch'
|
99
|
+
Requires-Dist: PyYAML >=6.0.0 ; extra == 'launch'
|
77
100
|
Provides-Extra: media
|
78
101
|
Requires-Dist: numpy ; extra == 'media'
|
79
102
|
Requires-Dist: moviepy ; extra == 'media'
|
@@ -84,10 +107,12 @@ Requires-Dist: plotly ; extra == 'media'
|
|
84
107
|
Requires-Dist: rdkit-pypi ; extra == 'media'
|
85
108
|
Provides-Extra: models
|
86
109
|
Requires-Dist: cloudpickle ; extra == 'models'
|
110
|
+
Provides-Extra: nexus
|
111
|
+
Requires-Dist: wandb-core >=0.16.0b1 ; extra == 'nexus'
|
87
112
|
Provides-Extra: perf
|
88
113
|
Requires-Dist: orjson ; extra == 'perf'
|
89
114
|
Provides-Extra: sweeps
|
90
|
-
Requires-Dist: sweeps
|
115
|
+
Requires-Dist: sweeps >=0.2.0 ; extra == 'sweeps'
|
91
116
|
|
92
117
|
<div align="center">
|
93
118
|
<img src="https://i.imgur.com/RUtiVzH.png" width="600" /><br><br>
|