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.
Files changed (114) hide show
  1. wandb/__init__.py +5 -1
  2. wandb/apis/public.py +137 -17
  3. wandb/apis/reports/_panels.py +1 -1
  4. wandb/apis/reports/blocks.py +1 -0
  5. wandb/apis/reports/report.py +27 -5
  6. wandb/cli/cli.py +52 -41
  7. wandb/docker/__init__.py +17 -0
  8. wandb/docker/auth.py +1 -1
  9. wandb/env.py +24 -4
  10. wandb/filesync/step_checksum.py +3 -3
  11. wandb/integration/openai/openai.py +3 -0
  12. wandb/integration/ultralytics/__init__.py +9 -0
  13. wandb/integration/ultralytics/bbox_utils.py +196 -0
  14. wandb/integration/ultralytics/callback.py +458 -0
  15. wandb/integration/ultralytics/classification_utils.py +66 -0
  16. wandb/integration/ultralytics/mask_utils.py +141 -0
  17. wandb/integration/ultralytics/pose_utils.py +92 -0
  18. wandb/integration/xgboost/xgboost.py +3 -3
  19. wandb/integration/yolov8/__init__.py +0 -7
  20. wandb/integration/yolov8/yolov8.py +22 -3
  21. wandb/old/settings.py +7 -0
  22. wandb/plot/line_series.py +0 -1
  23. wandb/proto/v3/wandb_internal_pb2.py +353 -300
  24. wandb/proto/v3/wandb_server_pb2.py +37 -41
  25. wandb/proto/v3/wandb_settings_pb2.py +2 -2
  26. wandb/proto/v3/wandb_telemetry_pb2.py +16 -16
  27. wandb/proto/v4/wandb_internal_pb2.py +272 -260
  28. wandb/proto/v4/wandb_server_pb2.py +37 -40
  29. wandb/proto/v4/wandb_settings_pb2.py +2 -2
  30. wandb/proto/v4/wandb_telemetry_pb2.py +16 -16
  31. wandb/proto/wandb_internal_codegen.py +7 -31
  32. wandb/sdk/artifacts/artifact.py +321 -189
  33. wandb/sdk/artifacts/artifact_cache.py +14 -0
  34. wandb/sdk/artifacts/artifact_manifest.py +5 -4
  35. wandb/sdk/artifacts/artifact_manifest_entry.py +37 -9
  36. wandb/sdk/artifacts/artifact_manifests/artifact_manifest_v1.py +1 -9
  37. wandb/sdk/artifacts/artifact_saver.py +13 -50
  38. wandb/sdk/artifacts/artifact_ttl.py +6 -0
  39. wandb/sdk/artifacts/artifacts_cache.py +119 -93
  40. wandb/sdk/artifacts/staging.py +25 -0
  41. wandb/sdk/artifacts/storage_handlers/s3_handler.py +12 -7
  42. wandb/sdk/artifacts/storage_handlers/wb_local_artifact_handler.py +2 -3
  43. wandb/sdk/artifacts/storage_policies/__init__.py +4 -0
  44. wandb/sdk/artifacts/storage_policies/register.py +1 -0
  45. wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +4 -3
  46. wandb/sdk/artifacts/storage_policy.py +4 -2
  47. wandb/sdk/backend/backend.py +0 -16
  48. wandb/sdk/data_types/image.py +3 -1
  49. wandb/sdk/integration_utils/auto_logging.py +38 -13
  50. wandb/sdk/interface/interface.py +16 -135
  51. wandb/sdk/interface/interface_shared.py +9 -147
  52. wandb/sdk/interface/interface_sock.py +0 -26
  53. wandb/sdk/internal/file_pusher.py +20 -3
  54. wandb/sdk/internal/file_stream.py +3 -1
  55. wandb/sdk/internal/handler.py +53 -70
  56. wandb/sdk/internal/internal_api.py +220 -130
  57. wandb/sdk/internal/job_builder.py +41 -37
  58. wandb/sdk/internal/sender.py +7 -25
  59. wandb/sdk/internal/system/assets/disk.py +144 -11
  60. wandb/sdk/internal/system/system_info.py +6 -2
  61. wandb/sdk/launch/__init__.py +5 -0
  62. wandb/sdk/launch/{launch.py → _launch.py} +53 -54
  63. wandb/sdk/launch/{launch_add.py → _launch_add.py} +34 -31
  64. wandb/sdk/launch/_project_spec.py +13 -2
  65. wandb/sdk/launch/agent/agent.py +103 -59
  66. wandb/sdk/launch/agent/run_queue_item_file_saver.py +6 -4
  67. wandb/sdk/launch/builder/build.py +19 -1
  68. wandb/sdk/launch/builder/docker_builder.py +5 -1
  69. wandb/sdk/launch/builder/kaniko_builder.py +5 -1
  70. wandb/sdk/launch/create_job.py +20 -5
  71. wandb/sdk/launch/loader.py +14 -5
  72. wandb/sdk/launch/runner/abstract.py +0 -2
  73. wandb/sdk/launch/runner/kubernetes_monitor.py +329 -0
  74. wandb/sdk/launch/runner/kubernetes_runner.py +66 -209
  75. wandb/sdk/launch/runner/local_container.py +5 -2
  76. wandb/sdk/launch/runner/local_process.py +4 -1
  77. wandb/sdk/launch/sweeps/scheduler.py +43 -25
  78. wandb/sdk/launch/sweeps/utils.py +5 -3
  79. wandb/sdk/launch/utils.py +3 -1
  80. wandb/sdk/lib/_settings_toposort_generate.py +3 -9
  81. wandb/sdk/lib/_settings_toposort_generated.py +27 -3
  82. wandb/sdk/lib/_wburls_generated.py +1 -0
  83. wandb/sdk/lib/filenames.py +27 -6
  84. wandb/sdk/lib/filesystem.py +181 -7
  85. wandb/sdk/lib/fsm.py +5 -3
  86. wandb/sdk/lib/gql_request.py +3 -0
  87. wandb/sdk/lib/ipython.py +7 -0
  88. wandb/sdk/lib/wburls.py +1 -0
  89. wandb/sdk/service/port_file.py +2 -15
  90. wandb/sdk/service/server.py +7 -55
  91. wandb/sdk/service/service.py +56 -26
  92. wandb/sdk/service/service_base.py +1 -1
  93. wandb/sdk/service/streams.py +11 -5
  94. wandb/sdk/verify/verify.py +2 -2
  95. wandb/sdk/wandb_init.py +8 -2
  96. wandb/sdk/wandb_manager.py +4 -14
  97. wandb/sdk/wandb_run.py +143 -53
  98. wandb/sdk/wandb_settings.py +148 -35
  99. wandb/testing/relay.py +85 -38
  100. wandb/util.py +87 -4
  101. wandb/wandb_torch.py +24 -38
  102. {wandb-0.15.9.dist-info → wandb-0.15.11.dist-info}/METADATA +48 -23
  103. {wandb-0.15.9.dist-info → wandb-0.15.11.dist-info}/RECORD +107 -103
  104. {wandb-0.15.9.dist-info → wandb-0.15.11.dist-info}/WHEEL +1 -1
  105. wandb/proto/v3/wandb_server_pb2_grpc.py +0 -1422
  106. wandb/proto/v4/wandb_server_pb2_grpc.py +0 -1422
  107. wandb/proto/wandb_server_pb2_grpc.py +0 -8
  108. wandb/sdk/artifacts/storage_policies/s3_bucket_policy.py +0 -61
  109. wandb/sdk/interface/interface_grpc.py +0 -460
  110. wandb/sdk/service/server_grpc.py +0 -444
  111. wandb/sdk/service/service_grpc.py +0 -73
  112. {wandb-0.15.9.dist-info → wandb-0.15.11.dist-info}/LICENSE +0 -0
  113. {wandb-0.15.9.dist-info → wandb-0.15.11.dist-info}/entry_points.txt +0 -0
  114. {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 guarante that the file is flushed and synced."""
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 _is_py_path(path: str) -> bool:
1530
- return path.endswith(".py")
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
- if isinstance(tensor, tuple) or isinstance(tensor, list):
152
- while (isinstance(tensor, tuple) or isinstance(tensor, list)) and (
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().clone().detach()
168
+ tensor = tensor.cpu().coalesce()
173
169
 
174
170
  backing_values = tensor._values()
175
- non_zero_values = backing_values.numel()
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
- check = flat.histc(bins=self._num_bins)
196
- except RuntimeError as e:
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
- if not self._is_cuda_histc_supported:
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 isinstance(flat, torch.cuda.HalfTensor):
209
- flat = flat.clone().type(torch.cuda.FloatTensor).detach()
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
- if isinstance(flat, torch.HalfTensor):
212
- flat = flat.clone().type(torch.FloatTensor).detach()
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().clone().detach()
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.9
4
- Summary: A CLI and library for interacting with the Weights and Biases API.
5
- Home-page: https://github.com/wandb/wandb
6
- Author: Weights & Biases
7
- Author-email: support@wandb.com
8
- License: MIT license
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 :: Only
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 (!=8.0.0,>=7.1)
27
- Requires-Dist: GitPython (!=3.1.29,>=1.0.0)
28
- Requires-Dist: requests (<3,>=2.0.0)
29
- Requires-Dist: psutil (>=5.0.0)
30
- Requires-Dist: sentry-sdk (>=1.0.0)
31
- Requires-Dist: docker-pycreds (>=0.4.0)
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 (>=1.4.3)
61
+ Requires-Dist: appdirs >=1.4.3
37
62
  Requires-Dist: typing-extensions ; python_version < "3.10"
38
- Requires-Dist: dataclasses ; python_version < "3.7"
39
- Requires-Dist: protobuf (!=4.21.0,<5,>=3.12.0) ; python_version < "3.9" and sys_platform == "linux"
40
- Requires-Dist: protobuf (!=4.21.0,<5,>=3.15.0) ; python_version == "3.9" and sys_platform == "linux"
41
- Requires-Dist: protobuf (!=4.21.0,<5,>=3.19.0) ; python_version > "3.9" and sys_platform == "linux"
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 (>=0.22.0) ; extra == 'async'
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 (>=0.2.0) ; extra == '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>