wandb 0.15.3__py3-none-any.whl → 0.15.5__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (156) hide show
  1. wandb/__init__.py +1 -1
  2. wandb/analytics/sentry.py +1 -0
  3. wandb/apis/importers/base.py +20 -5
  4. wandb/apis/importers/mlflow.py +7 -1
  5. wandb/apis/internal.py +12 -0
  6. wandb/apis/public.py +247 -1387
  7. wandb/apis/reports/_panels.py +58 -35
  8. wandb/beta/workflows.py +6 -7
  9. wandb/cli/cli.py +130 -60
  10. wandb/data_types.py +3 -1
  11. wandb/filesync/dir_watcher.py +21 -27
  12. wandb/filesync/step_checksum.py +8 -8
  13. wandb/filesync/step_prepare.py +23 -10
  14. wandb/filesync/step_upload.py +13 -13
  15. wandb/filesync/upload_job.py +4 -8
  16. wandb/integration/cohere/__init__.py +3 -0
  17. wandb/integration/cohere/cohere.py +21 -0
  18. wandb/integration/cohere/resolver.py +347 -0
  19. wandb/integration/gym/__init__.py +4 -6
  20. wandb/integration/huggingface/__init__.py +3 -0
  21. wandb/integration/huggingface/huggingface.py +18 -0
  22. wandb/integration/huggingface/resolver.py +213 -0
  23. wandb/integration/langchain/wandb_tracer.py +16 -179
  24. wandb/integration/openai/__init__.py +1 -3
  25. wandb/integration/openai/openai.py +11 -143
  26. wandb/integration/openai/resolver.py +111 -38
  27. wandb/integration/sagemaker/config.py +2 -2
  28. wandb/integration/tensorboard/log.py +4 -4
  29. wandb/old/settings.py +24 -7
  30. wandb/proto/v3/wandb_telemetry_pb2.py +12 -12
  31. wandb/proto/v4/wandb_telemetry_pb2.py +12 -12
  32. wandb/proto/wandb_deprecated.py +3 -1
  33. wandb/sdk/__init__.py +1 -1
  34. wandb/sdk/artifacts/__init__.py +0 -0
  35. wandb/sdk/artifacts/artifact.py +2101 -0
  36. wandb/sdk/artifacts/artifact_download_logger.py +42 -0
  37. wandb/sdk/artifacts/artifact_manifest.py +67 -0
  38. wandb/sdk/artifacts/artifact_manifest_entry.py +159 -0
  39. wandb/sdk/artifacts/artifact_manifests/__init__.py +0 -0
  40. wandb/sdk/artifacts/artifact_manifests/artifact_manifest_v1.py +91 -0
  41. wandb/sdk/{internal → artifacts}/artifact_saver.py +6 -5
  42. wandb/sdk/artifacts/artifact_state.py +10 -0
  43. wandb/sdk/{interface/artifacts/artifact_cache.py → artifacts/artifacts_cache.py} +22 -12
  44. wandb/sdk/artifacts/exceptions.py +55 -0
  45. wandb/sdk/artifacts/storage_handler.py +59 -0
  46. wandb/sdk/artifacts/storage_handlers/__init__.py +0 -0
  47. wandb/sdk/artifacts/storage_handlers/azure_handler.py +192 -0
  48. wandb/sdk/artifacts/storage_handlers/gcs_handler.py +224 -0
  49. wandb/sdk/artifacts/storage_handlers/http_handler.py +112 -0
  50. wandb/sdk/artifacts/storage_handlers/local_file_handler.py +134 -0
  51. wandb/sdk/artifacts/storage_handlers/multi_handler.py +53 -0
  52. wandb/sdk/artifacts/storage_handlers/s3_handler.py +301 -0
  53. wandb/sdk/artifacts/storage_handlers/tracking_handler.py +67 -0
  54. wandb/sdk/artifacts/storage_handlers/wb_artifact_handler.py +132 -0
  55. wandb/sdk/artifacts/storage_handlers/wb_local_artifact_handler.py +72 -0
  56. wandb/sdk/artifacts/storage_layout.py +6 -0
  57. wandb/sdk/artifacts/storage_policies/__init__.py +0 -0
  58. wandb/sdk/artifacts/storage_policies/s3_bucket_policy.py +61 -0
  59. wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +386 -0
  60. wandb/sdk/{interface/artifacts/artifact_storage.py → artifacts/storage_policy.py} +5 -57
  61. wandb/sdk/data_types/_dtypes.py +7 -12
  62. wandb/sdk/data_types/base_types/json_metadata.py +3 -2
  63. wandb/sdk/data_types/base_types/media.py +8 -8
  64. wandb/sdk/data_types/base_types/wb_value.py +12 -13
  65. wandb/sdk/data_types/helper_types/bounding_boxes_2d.py +5 -6
  66. wandb/sdk/data_types/helper_types/classes.py +6 -8
  67. wandb/sdk/data_types/helper_types/image_mask.py +5 -6
  68. wandb/sdk/data_types/histogram.py +4 -3
  69. wandb/sdk/data_types/html.py +3 -4
  70. wandb/sdk/data_types/image.py +11 -9
  71. wandb/sdk/data_types/molecule.py +5 -3
  72. wandb/sdk/data_types/object_3d.py +7 -5
  73. wandb/sdk/data_types/plotly.py +3 -2
  74. wandb/sdk/data_types/saved_model.py +11 -11
  75. wandb/sdk/data_types/trace_tree.py +5 -4
  76. wandb/sdk/data_types/utils.py +3 -5
  77. wandb/sdk/data_types/video.py +5 -4
  78. wandb/sdk/integration_utils/auto_logging.py +215 -0
  79. wandb/sdk/interface/interface.py +15 -15
  80. wandb/sdk/internal/file_pusher.py +8 -16
  81. wandb/sdk/internal/file_stream.py +5 -11
  82. wandb/sdk/internal/handler.py +13 -1
  83. wandb/sdk/internal/internal_api.py +287 -13
  84. wandb/sdk/internal/job_builder.py +119 -30
  85. wandb/sdk/internal/sender.py +6 -26
  86. wandb/sdk/internal/settings_static.py +2 -0
  87. wandb/sdk/internal/system/assets/__init__.py +2 -0
  88. wandb/sdk/internal/system/assets/gpu.py +42 -0
  89. wandb/sdk/internal/system/assets/gpu_amd.py +216 -0
  90. wandb/sdk/internal/system/env_probe_helpers.py +13 -0
  91. wandb/sdk/internal/system/system_info.py +3 -3
  92. wandb/sdk/internal/tb_watcher.py +32 -22
  93. wandb/sdk/internal/thread_local_settings.py +18 -0
  94. wandb/sdk/launch/_project_spec.py +57 -11
  95. wandb/sdk/launch/agent/agent.py +147 -65
  96. wandb/sdk/launch/agent/job_status_tracker.py +34 -0
  97. wandb/sdk/launch/agent/run_queue_item_file_saver.py +45 -0
  98. wandb/sdk/launch/builder/abstract.py +5 -1
  99. wandb/sdk/launch/builder/build.py +21 -18
  100. wandb/sdk/launch/builder/docker_builder.py +10 -4
  101. wandb/sdk/launch/builder/kaniko_builder.py +113 -23
  102. wandb/sdk/launch/builder/noop.py +6 -3
  103. wandb/sdk/launch/builder/templates/_wandb_bootstrap.py +46 -14
  104. wandb/sdk/launch/environment/aws_environment.py +3 -2
  105. wandb/sdk/launch/environment/azure_environment.py +124 -0
  106. wandb/sdk/launch/environment/gcp_environment.py +2 -4
  107. wandb/sdk/launch/environment/local_environment.py +1 -1
  108. wandb/sdk/launch/errors.py +19 -0
  109. wandb/sdk/launch/github_reference.py +32 -19
  110. wandb/sdk/launch/launch.py +3 -8
  111. wandb/sdk/launch/launch_add.py +6 -2
  112. wandb/sdk/launch/loader.py +21 -2
  113. wandb/sdk/launch/registry/azure_container_registry.py +132 -0
  114. wandb/sdk/launch/registry/elastic_container_registry.py +39 -5
  115. wandb/sdk/launch/registry/google_artifact_registry.py +68 -26
  116. wandb/sdk/launch/registry/local_registry.py +2 -1
  117. wandb/sdk/launch/runner/abstract.py +24 -3
  118. wandb/sdk/launch/runner/kubernetes_runner.py +479 -26
  119. wandb/sdk/launch/runner/local_container.py +103 -51
  120. wandb/sdk/launch/runner/local_process.py +1 -1
  121. wandb/sdk/launch/runner/sagemaker_runner.py +60 -10
  122. wandb/sdk/launch/runner/vertex_runner.py +10 -5
  123. wandb/sdk/launch/sweeps/__init__.py +7 -9
  124. wandb/sdk/launch/sweeps/scheduler.py +307 -77
  125. wandb/sdk/launch/sweeps/scheduler_sweep.py +2 -1
  126. wandb/sdk/launch/sweeps/utils.py +82 -35
  127. wandb/sdk/launch/utils.py +89 -75
  128. wandb/sdk/lib/_settings_toposort_generated.py +7 -0
  129. wandb/sdk/lib/capped_dict.py +26 -0
  130. wandb/sdk/lib/{git.py → gitlib.py} +76 -59
  131. wandb/sdk/lib/hashutil.py +12 -4
  132. wandb/sdk/lib/paths.py +96 -8
  133. wandb/sdk/lib/sock_client.py +2 -2
  134. wandb/sdk/lib/timer.py +1 -0
  135. wandb/sdk/service/server.py +22 -9
  136. wandb/sdk/service/server_sock.py +1 -1
  137. wandb/sdk/service/service.py +27 -8
  138. wandb/sdk/verify/verify.py +4 -7
  139. wandb/sdk/wandb_config.py +2 -6
  140. wandb/sdk/wandb_init.py +57 -53
  141. wandb/sdk/wandb_require.py +7 -0
  142. wandb/sdk/wandb_run.py +61 -223
  143. wandb/sdk/wandb_settings.py +28 -4
  144. wandb/testing/relay.py +15 -2
  145. wandb/util.py +74 -36
  146. {wandb-0.15.3.dist-info → wandb-0.15.5.dist-info}/METADATA +15 -9
  147. {wandb-0.15.3.dist-info → wandb-0.15.5.dist-info}/RECORD +151 -116
  148. {wandb-0.15.3.dist-info → wandb-0.15.5.dist-info}/entry_points.txt +1 -0
  149. wandb/integration/langchain/util.py +0 -191
  150. wandb/sdk/interface/artifacts/__init__.py +0 -33
  151. wandb/sdk/interface/artifacts/artifact.py +0 -615
  152. wandb/sdk/interface/artifacts/artifact_manifest.py +0 -131
  153. wandb/sdk/wandb_artifacts.py +0 -2226
  154. {wandb-0.15.3.dist-info → wandb-0.15.5.dist-info}/LICENSE +0 -0
  155. {wandb-0.15.3.dist-info → wandb-0.15.5.dist-info}/WHEEL +0 -0
  156. {wandb-0.15.3.dist-info → wandb-0.15.5.dist-info}/top_level.txt +0 -0
wandb/testing/relay.py CHANGED
@@ -4,6 +4,7 @@ import logging
4
4
  import socket
5
5
  import sys
6
6
  import threading
7
+ import traceback
7
8
  import urllib.parse
8
9
  from collections import defaultdict, deque
9
10
  from copy import deepcopy
@@ -294,7 +295,9 @@ class QueryResolver:
294
295
  }
295
296
  post_processed_data = {
296
297
  "name": name,
297
- "dropped": [request_data["dropped"]],
298
+ "dropped": [request_data["dropped"]]
299
+ if "dropped" in request_data
300
+ else [],
298
301
  "files": files,
299
302
  }
300
303
  return post_processed_data
@@ -642,7 +645,17 @@ class RelayServer:
642
645
  }
643
646
  self.context.raw_data.append(raw_data)
644
647
 
645
- snooped_context = self.resolver.resolve(request_data, response_data, **kwargs)
648
+ try:
649
+ snooped_context = self.resolver.resolve(
650
+ request_data,
651
+ response_data,
652
+ **kwargs,
653
+ )
654
+ except Exception as e:
655
+ print("Failed to resolve context: ", e)
656
+ traceback.print_exc()
657
+ snooped_context = None
658
+
646
659
  if snooped_context is not None:
647
660
  self.context.upsert(snooped_context)
648
661
 
wandb/util.py CHANGED
@@ -21,7 +21,9 @@ import tempfile
21
21
  import threading
22
22
  import time
23
23
  import traceback
24
+ import types
24
25
  import urllib
26
+ from dataclasses import asdict, is_dataclass
25
27
  from datetime import date, datetime, timedelta
26
28
  from importlib import import_module
27
29
  from sys import getsizeof
@@ -50,14 +52,14 @@ import yaml
50
52
  import wandb
51
53
  import wandb.env
52
54
  from wandb.errors import AuthenticationError, CommError, UsageError, term
55
+ from wandb.sdk.internal.thread_local_settings import _thread_local_api_settings
53
56
  from wandb.sdk.lib import filesystem, runid
54
- from wandb.sdk.lib.paths import FilePathStr, LogicalFilePathStr, StrPath
57
+ from wandb.sdk.lib.paths import FilePathStr, StrPath
55
58
 
56
59
  if TYPE_CHECKING:
57
- import wandb.apis.public
58
60
  import wandb.sdk.internal.settings_static
59
- import wandb.sdk.wandb_artifacts
60
61
  import wandb.sdk.wandb_settings
62
+ from wandb.sdk.artifacts.artifact import Artifact
61
63
 
62
64
  CheckRetryFnType = Callable[[Exception], Union[bool, timedelta]]
63
65
 
@@ -179,25 +181,59 @@ def vendor_import(name: str) -> Any:
179
181
  return module
180
182
 
181
183
 
182
- def import_module_lazy(name: str) -> Any:
184
+ class LazyModuleState:
185
+ def __init__(self, module: types.ModuleType) -> None:
186
+ self.module = module
187
+ self.load_started = False
188
+ self.lock = threading.RLock()
189
+
190
+ def load(self) -> None:
191
+ with self.lock:
192
+ if self.load_started:
193
+ return
194
+ self.load_started = True
195
+ assert self.module.__spec__ is not None
196
+ assert self.module.__spec__.loader is not None
197
+ self.module.__spec__.loader.exec_module(self.module)
198
+ self.module.__class__ = types.ModuleType
199
+
200
+
201
+ class LazyModule(types.ModuleType):
202
+ def __getattribute__(self, name: str) -> Any:
203
+ state = object.__getattribute__(self, "__lazy_module_state__")
204
+ state.load()
205
+ return object.__getattribute__(self, name)
206
+
207
+ def __setattr__(self, name: str, value: Any) -> None:
208
+ state = object.__getattribute__(self, "__lazy_module_state__")
209
+ state.load()
210
+ object.__setattr__(self, name, value)
211
+
212
+ def __delattr__(self, name: str) -> None:
213
+ state = object.__getattribute__(self, "__lazy_module_state__")
214
+ state.load()
215
+ object.__delattr__(self, name)
216
+
217
+
218
+ def import_module_lazy(name: str) -> types.ModuleType:
183
219
  """Import a module lazily, only when it is used.
184
220
 
221
+ Inspired by importlib.util.LazyLoader, but improved so that the module loading is
222
+ thread-safe. Circular dependency between modules can lead to a deadlock if the two
223
+ modules are loaded from different threads.
224
+
185
225
  :param (str) name: Dot-separated module path. E.g., 'scipy.stats'.
186
226
  """
187
227
  try:
188
228
  return sys.modules[name]
189
229
  except KeyError:
190
- module_spec = importlib.util.find_spec(name)
191
- if not module_spec:
230
+ spec = importlib.util.find_spec(name)
231
+ if spec is None:
192
232
  raise ModuleNotFoundError
193
-
194
- module = importlib.util.module_from_spec(module_spec)
233
+ module = importlib.util.module_from_spec(spec)
234
+ module.__lazy_module_state__ = LazyModuleState(module) # type: ignore
235
+ module.__class__ = LazyModule
195
236
  sys.modules[name] = module
196
-
197
- assert module_spec.loader is not None
198
- lazy_loader = importlib.util.LazyLoader(module_spec.loader)
199
- lazy_loader.exec_module(module)
200
-
201
237
  return module
202
238
 
203
239
 
@@ -595,7 +631,7 @@ def json_friendly( # noqa: C901
595
631
 
596
632
 
597
633
  def json_friendly_val(val: Any) -> Any:
598
- """Make any value (including dict, slice, sequence, etc) JSON friendly."""
634
+ """Make any value (including dict, slice, sequence, dataclass) JSON friendly."""
599
635
  converted: Union[dict, list]
600
636
  if isinstance(val, dict):
601
637
  converted = {}
@@ -613,6 +649,9 @@ def json_friendly_val(val: Any) -> Any:
613
649
  for value in val:
614
650
  converted.append(json_friendly_val(value))
615
651
  return converted
652
+ if is_dataclass(val) and not isinstance(val, type):
653
+ converted = asdict(val)
654
+ return converted
616
655
  else:
617
656
  if val.__class__.__module__ not in ("builtins", "__builtin__"):
618
657
  val = str(val)
@@ -1246,7 +1285,17 @@ def guess_data_type(shape: Sequence[int], risky: bool = False) -> Optional[str]:
1246
1285
  def download_file_from_url(
1247
1286
  dest_path: str, source_url: str, api_key: Optional[str] = None
1248
1287
  ) -> None:
1249
- response = requests.get(source_url, auth=("api", api_key), stream=True, timeout=5) # type: ignore
1288
+ auth = None
1289
+ if not _thread_local_api_settings.cookies:
1290
+ auth = ("api", api_key or "")
1291
+ response = requests.get(
1292
+ source_url,
1293
+ auth=auth,
1294
+ headers=_thread_local_api_settings.headers,
1295
+ cookies=_thread_local_api_settings.cookies,
1296
+ stream=True,
1297
+ timeout=5,
1298
+ )
1250
1299
  response.raise_for_status()
1251
1300
 
1252
1301
  if os.sep in dest_path:
@@ -1289,7 +1338,9 @@ def from_human_size(size: str, units: Optional[List[Tuple[str, Any]]] = None) ->
1289
1338
 
1290
1339
  def auto_project_name(program: Optional[str]) -> str:
1291
1340
  # if we're in git, set project name to git repo name + relative path within repo
1292
- root_dir = wandb.wandb_sdk.lib.git.GitRepo().root_dir
1341
+ from wandb.sdk.lib.gitlib import GitRepo
1342
+
1343
+ root_dir = GitRepo().root_dir
1293
1344
  if root_dir is None:
1294
1345
  return "uncategorized"
1295
1346
  # On windows, GitRepo returns paths in unix style, but os.path is windows
@@ -1311,10 +1362,10 @@ def auto_project_name(program: Optional[str]) -> str:
1311
1362
 
1312
1363
 
1313
1364
  # TODO(hugh): Deprecate version here and use wandb/sdk/lib/paths.py
1314
- def to_forward_slash_path(path: str) -> LogicalFilePathStr:
1365
+ def to_forward_slash_path(path: str) -> str:
1315
1366
  if platform.system() == "Windows":
1316
1367
  path = path.replace("\\", "/")
1317
- return LogicalFilePathStr(path)
1368
+ return path
1318
1369
 
1319
1370
 
1320
1371
  # TODO(hugh): Deprecate version here and use wandb/sdk/lib/paths.py
@@ -1487,23 +1538,14 @@ def check_windows_valid_filename(path: Union[int, str]) -> bool:
1487
1538
  return not bool(re.search(RE_WINFNAMES, path)) # type: ignore
1488
1539
 
1489
1540
 
1490
- def artifact_to_json(
1491
- artifact: Union["wandb.sdk.wandb_artifacts.Artifact", "wandb.apis.public.Artifact"]
1492
- ) -> Dict[str, Any]:
1493
- # public.Artifact has the _sequence name, instances of wandb.Artifact
1494
- # just have the name
1495
- if hasattr(artifact, "_sequence_name"):
1496
- sequence_name = artifact._sequence_name
1497
- else:
1498
- sequence_name = artifact.name.split(":")[0]
1499
-
1541
+ def artifact_to_json(artifact: "Artifact") -> Dict[str, Any]:
1500
1542
  return {
1501
1543
  "_type": "artifactVersion",
1502
1544
  "_version": "v0",
1503
1545
  "id": artifact.id,
1504
1546
  "version": artifact.source_version,
1505
- "sequenceName": sequence_name,
1506
- "usedAs": artifact._use_as,
1547
+ "sequenceName": artifact.source_name.split(":")[0],
1548
+ "usedAs": artifact.use_as,
1507
1549
  }
1508
1550
 
1509
1551
 
@@ -1513,11 +1555,7 @@ def check_dict_contains_nested_artifact(d: dict, nested: bool = False) -> bool:
1513
1555
  contains_artifacts = check_dict_contains_nested_artifact(item, True)
1514
1556
  if contains_artifacts:
1515
1557
  return True
1516
- elif (
1517
- isinstance(item, wandb.Artifact)
1518
- or isinstance(item, wandb.apis.public.Artifact)
1519
- or _is_artifact_string(item)
1520
- ) and nested:
1558
+ elif (isinstance(item, wandb.Artifact) or _is_artifact_string(item)) and nested:
1521
1559
  return True
1522
1560
  return False
1523
1561
 
@@ -1597,7 +1635,7 @@ def _resolve_aliases(aliases: Optional[Union[str, Iterable[str]]]) -> List[str]:
1597
1635
 
1598
1636
 
1599
1637
  def _is_artifact_object(v: Any) -> bool:
1600
- return isinstance(v, wandb.Artifact) or isinstance(v, wandb.apis.public.Artifact)
1638
+ return isinstance(v, wandb.Artifact)
1601
1639
 
1602
1640
 
1603
1641
  def _is_artifact_string(v: Any) -> bool:
@@ -1,11 +1,12 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wandb
3
- Version: 0.15.3
3
+ Version: 0.15.5
4
4
  Summary: A CLI and library for interacting with the Weights and Biases API.
5
5
  Home-page: https://github.com/wandb/wandb
6
6
  Author: Weights & Biases
7
7
  Author-email: support@wandb.com
8
8
  License: MIT license
9
+ Platform: UNKNOWN
9
10
  Classifier: Development Status :: 5 - Production/Stable
10
11
  Classifier: Intended Audience :: Developers
11
12
  Classifier: Intended Audience :: Science/Research
@@ -23,7 +24,7 @@ Classifier: Topic :: System :: Monitoring
23
24
  Requires-Python: >=3.6
24
25
  Description-Content-Type: text/markdown
25
26
  License-File: LICENSE
26
- Requires-Dist: Click (!=8.0.0,>=7.0)
27
+ Requires-Dist: Click (!=8.0.0,>=7.1)
27
28
  Requires-Dist: GitPython (!=3.1.29,>=1.0.0)
28
29
  Requires-Dist: requests (<3,>=2.0.0)
29
30
  Requires-Dist: psutil (>=5.0.0)
@@ -58,18 +59,22 @@ Requires-Dist: google-cloud-storage ; extra == 'kubeflow'
58
59
  Requires-Dist: sh ; extra == 'kubeflow'
59
60
  Provides-Extra: launch
60
61
  Requires-Dist: awscli ; extra == 'launch'
61
- Requires-Dist: nbconvert ; extra == 'launch'
62
- Requires-Dist: nbformat ; extra == 'launch'
63
- Requires-Dist: chardet ; extra == 'launch'
64
- Requires-Dist: iso8601 ; extra == 'launch'
65
- Requires-Dist: typing-extensions ; extra == 'launch'
62
+ Requires-Dist: azure-identity ; extra == 'launch'
63
+ Requires-Dist: azure-containerregistry ; extra == 'launch'
64
+ Requires-Dist: azure-storage-blob ; extra == 'launch'
66
65
  Requires-Dist: boto3 ; extra == 'launch'
67
66
  Requires-Dist: botocore ; extra == 'launch'
67
+ Requires-Dist: chardet ; extra == 'launch'
68
68
  Requires-Dist: google-auth ; extra == 'launch'
69
+ Requires-Dist: google-cloud-artifact-registry ; extra == 'launch'
69
70
  Requires-Dist: google-cloud-compute ; extra == 'launch'
70
71
  Requires-Dist: google-cloud-storage ; extra == 'launch'
71
- Requires-Dist: google-cloud-artifact-registry ; extra == 'launch'
72
+ Requires-Dist: iso8601 ; extra == 'launch'
72
73
  Requires-Dist: kubernetes ; extra == 'launch'
74
+ Requires-Dist: optuna ; extra == 'launch'
75
+ Requires-Dist: nbconvert ; extra == 'launch'
76
+ Requires-Dist: nbformat ; extra == 'launch'
77
+ Requires-Dist: typing-extensions ; extra == 'launch'
73
78
  Provides-Extra: media
74
79
  Requires-Dist: numpy ; extra == 'media'
75
80
  Requires-Dist: moviepy ; extra == 'media'
@@ -80,7 +85,6 @@ Requires-Dist: plotly ; extra == 'media'
80
85
  Requires-Dist: rdkit-pypi ; extra == 'media'
81
86
  Provides-Extra: models
82
87
  Requires-Dist: cloudpickle ; extra == 'models'
83
- Provides-Extra: service
84
88
  Provides-Extra: sweeps
85
89
  Requires-Dist: sweeps (>=0.2.0) ; extra == 'sweeps'
86
90
 
@@ -179,3 +183,5 @@ Got questions, feedback or want to join a community of ML engineers working on e
179
183
  <a href="https://bit.ly/wb-slack"><img src="https://svgshare.com/i/M93.svg" alt="slack" width="55"/></a> Join our [slack](https://bit.ly/wb-slack) community.
180
184
 
181
185
  [![Twitter](https://img.shields.io/twitter/follow/weights_biases?style=social)](https://twitter.com/weights_biases) Follow us on [Twitter](https://twitter.com/weights_biases).
186
+
187
+