wandb 0.18.0__py3-none-win32.whl → 0.18.1__py3-none-win32.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. wandb/__init__.py +2 -2
  2. wandb/__init__.pyi +1 -1
  3. wandb/apis/public/runs.py +2 -0
  4. wandb/bin/wandb-core +0 -0
  5. wandb/cli/cli.py +0 -2
  6. wandb/data_types.py +9 -2019
  7. wandb/env.py +0 -5
  8. wandb/{sklearn → integration/sklearn}/calculate/calibration_curves.py +7 -7
  9. wandb/{sklearn → integration/sklearn}/calculate/class_proportions.py +1 -1
  10. wandb/{sklearn → integration/sklearn}/calculate/confusion_matrix.py +3 -2
  11. wandb/{sklearn → integration/sklearn}/calculate/elbow_curve.py +6 -6
  12. wandb/{sklearn → integration/sklearn}/calculate/learning_curve.py +2 -2
  13. wandb/{sklearn → integration/sklearn}/calculate/outlier_candidates.py +2 -2
  14. wandb/{sklearn → integration/sklearn}/calculate/residuals.py +8 -8
  15. wandb/{sklearn → integration/sklearn}/calculate/silhouette.py +2 -2
  16. wandb/{sklearn → integration/sklearn}/calculate/summary_metrics.py +2 -2
  17. wandb/{sklearn → integration/sklearn}/plot/classifier.py +5 -5
  18. wandb/{sklearn → integration/sklearn}/plot/clusterer.py +10 -6
  19. wandb/{sklearn → integration/sklearn}/plot/regressor.py +5 -5
  20. wandb/{sklearn → integration/sklearn}/plot/shared.py +3 -3
  21. wandb/{sklearn → integration/sklearn}/utils.py +8 -8
  22. wandb/{wandb_torch.py → integration/torch/wandb_torch.py} +36 -32
  23. wandb/proto/v3/wandb_base_pb2.py +2 -1
  24. wandb/proto/v3/wandb_internal_pb2.py +2 -1
  25. wandb/proto/v3/wandb_server_pb2.py +2 -1
  26. wandb/proto/v3/wandb_settings_pb2.py +2 -1
  27. wandb/proto/v3/wandb_telemetry_pb2.py +2 -1
  28. wandb/proto/v4/wandb_base_pb2.py +2 -1
  29. wandb/proto/v4/wandb_internal_pb2.py +2 -1
  30. wandb/proto/v4/wandb_server_pb2.py +2 -1
  31. wandb/proto/v4/wandb_settings_pb2.py +2 -1
  32. wandb/proto/v4/wandb_telemetry_pb2.py +2 -1
  33. wandb/proto/v5/wandb_base_pb2.py +3 -2
  34. wandb/proto/v5/wandb_internal_pb2.py +3 -2
  35. wandb/proto/v5/wandb_server_pb2.py +3 -2
  36. wandb/proto/v5/wandb_settings_pb2.py +3 -2
  37. wandb/proto/v5/wandb_telemetry_pb2.py +3 -2
  38. wandb/sdk/data_types/audio.py +165 -0
  39. wandb/sdk/data_types/bokeh.py +70 -0
  40. wandb/sdk/data_types/graph.py +405 -0
  41. wandb/sdk/data_types/image.py +156 -0
  42. wandb/sdk/data_types/table.py +1204 -0
  43. wandb/sdk/data_types/trace_tree.py +2 -2
  44. wandb/sdk/data_types/utils.py +49 -0
  45. wandb/sdk/service/service.py +2 -9
  46. wandb/sdk/service/streams.py +0 -7
  47. wandb/sdk/wandb_init.py +10 -3
  48. wandb/sdk/wandb_run.py +6 -152
  49. wandb/sdk/wandb_setup.py +1 -1
  50. wandb/sklearn.py +35 -0
  51. wandb/util.py +6 -2
  52. {wandb-0.18.0.dist-info → wandb-0.18.1.dist-info}/METADATA +1 -1
  53. {wandb-0.18.0.dist-info → wandb-0.18.1.dist-info}/RECORD +61 -57
  54. wandb/sdk/lib/console.py +0 -39
  55. /wandb/{sklearn → integration/sklearn}/__init__.py +0 -0
  56. /wandb/{sklearn → integration/sklearn}/calculate/__init__.py +0 -0
  57. /wandb/{sklearn → integration/sklearn}/calculate/decision_boundaries.py +0 -0
  58. /wandb/{sklearn → integration/sklearn}/calculate/feature_importances.py +0 -0
  59. /wandb/{sklearn → integration/sklearn}/plot/__init__.py +0 -0
  60. {wandb-0.18.0.dist-info → wandb-0.18.1.dist-info}/WHEEL +0 -0
  61. {wandb-0.18.0.dist-info → wandb-0.18.1.dist-info}/entry_points.txt +0 -0
  62. {wandb-0.18.0.dist-info → wandb-0.18.1.dist-info}/licenses/LICENSE +0 -0
@@ -14,9 +14,9 @@ from enum import Enum
14
14
  from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
15
15
 
16
16
  import wandb
17
- import wandb.data_types
18
17
  from wandb.sdk.data_types import _dtypes
19
18
  from wandb.sdk.data_types.base_types.media import Media
19
+ from wandb.sdk.data_types.utils import _json_helper
20
20
 
21
21
  if TYPE_CHECKING: # pragma: no cover
22
22
  from wandb.sdk.artifacts.artifact import Artifact
@@ -142,7 +142,7 @@ def _fallback_serialize(obj: Any) -> str:
142
142
  def _safe_serialize(obj: dict) -> str:
143
143
  try:
144
144
  return json.dumps(
145
- wandb.data_types._json_helper(obj, None),
145
+ _json_helper(obj, None),
146
146
  skipkeys=True,
147
147
  default=_fallback_serialize,
148
148
  )
@@ -1,6 +1,8 @@
1
+ import datetime
1
2
  import logging
2
3
  import os
3
4
  import re
5
+ from decimal import Decimal
4
6
  from typing import TYPE_CHECKING, Optional, Sequence, Union, cast
5
7
 
6
8
  import wandb
@@ -178,3 +180,50 @@ def _prune_max_seq(seq: Sequence["BatchableMedia"]) -> Sequence["BatchableMedia"
178
180
  )
179
181
  items = seq[: seq[0].MAX_ITEMS]
180
182
  return items
183
+
184
+
185
+ def _json_helper(val, artifact):
186
+ if isinstance(val, WBValue):
187
+ return val.to_json(artifact)
188
+ elif val.__class__ is dict:
189
+ res = {}
190
+ for key in val:
191
+ res[key] = _json_helper(val[key], artifact)
192
+ return res
193
+
194
+ if hasattr(val, "tolist"):
195
+ py_val = val.tolist()
196
+ if val.__class__.__name__ == "datetime64" and isinstance(py_val, int):
197
+ # when numpy datetime64 .tolist() returns an int, it is nanoseconds.
198
+ # need to convert to milliseconds
199
+ return _json_helper(py_val / int(1e6), artifact)
200
+ return _json_helper(py_val, artifact)
201
+ elif hasattr(val, "item"):
202
+ return _json_helper(val.item(), artifact)
203
+
204
+ if isinstance(val, datetime.datetime):
205
+ if val.tzinfo is None:
206
+ val = datetime.datetime(
207
+ val.year,
208
+ val.month,
209
+ val.day,
210
+ val.hour,
211
+ val.minute,
212
+ val.second,
213
+ val.microsecond,
214
+ tzinfo=datetime.timezone.utc,
215
+ )
216
+ return int(val.timestamp() * 1000)
217
+ elif isinstance(val, datetime.date):
218
+ return int(
219
+ datetime.datetime(
220
+ val.year, val.month, val.day, tzinfo=datetime.timezone.utc
221
+ ).timestamp()
222
+ * 1000
223
+ )
224
+ elif isinstance(val, (list, tuple)):
225
+ return [_json_helper(i, artifact) for i in val]
226
+ elif isinstance(val, Decimal):
227
+ return float(val)
228
+ else:
229
+ return util.json_friendly(val)[0]
@@ -15,11 +15,7 @@ import time
15
15
  from typing import TYPE_CHECKING, Any, Dict, Optional
16
16
 
17
17
  from wandb import _sentry, termlog
18
- from wandb.env import (
19
- core_debug,
20
- core_error_reporting_enabled,
21
- is_require_legacy_service,
22
- )
18
+ from wandb.env import core_debug, error_reporting_enabled, is_require_legacy_service
23
19
  from wandb.errors import Error, WandbCoreNotAvailableError
24
20
  from wandb.sdk.lib.wburls import wburls
25
21
  from wandb.util import get_core_path, get_module
@@ -162,9 +158,6 @@ class _Service:
162
158
 
163
159
  executable = self._settings._executable
164
160
  exec_cmd_list = [executable, "-m"]
165
- # Add coverage collection if needed
166
- if os.environ.get("YEA_RUN_COVERAGE") and os.environ.get("COVERAGE_RCFILE"):
167
- exec_cmd_list += ["coverage", "run", "-m"]
168
161
 
169
162
  service_args = []
170
163
 
@@ -176,7 +169,7 @@ class _Service:
176
169
 
177
170
  service_args.extend([core_path])
178
171
 
179
- if not core_error_reporting_enabled(default="True"):
172
+ if not error_reporting_enabled():
180
173
  service_args.append("--no-observability")
181
174
 
182
175
  if core_debug(default="False"):
@@ -317,7 +317,6 @@ class StreamMux:
317
317
  # These could be done in parallel in the future
318
318
  for _sid, stream in started_streams.items():
319
319
  # dispatch all our final requests
320
- server_info_handle = stream.interface.deliver_request_server_info()
321
320
  poll_exit_handle = stream.interface.deliver_poll_exit()
322
321
  final_summary_handle = stream.interface.deliver_get_summary()
323
322
  sampled_history_handle = stream.interface.deliver_request_sampled_history()
@@ -327,11 +326,6 @@ class StreamMux:
327
326
  assert result
328
327
  internal_messages_response = result.response.internal_messages_response
329
328
 
330
- # wait for them, it's ok to do this serially but this can be improved
331
- result = server_info_handle.wait(timeout=-1)
332
- assert result
333
- server_info_response = result.response.server_info_response
334
-
335
329
  result = poll_exit_handle.wait(timeout=-1)
336
330
  assert result
337
331
  poll_exit_response = result.response.poll_exit_response
@@ -348,7 +342,6 @@ class StreamMux:
348
342
  sampled_history=sampled_history,
349
343
  final_summary=final_summary,
350
344
  poll_exit_response=poll_exit_response,
351
- server_info_response=server_info_response,
352
345
  internal_messages_response=internal_messages_response,
353
346
  settings=stream._settings, # type: ignore
354
347
  printer=printer,
wandb/sdk/wandb_init.py CHANGED
@@ -174,12 +174,19 @@ class _WandbInit:
174
174
 
175
175
  # we add this logic to be backward compatible with the old behavior of disable
176
176
  # where it would disable the service if the mode was set to disabled
177
+ # TODO: use the regular settins object to handle this
177
178
  mode = kwargs.get("mode")
178
179
  settings_mode = (kwargs.get("settings") or {}).get("mode") or os.environ.get(
179
- "WANDB_MODE"
180
+ wandb.env.MODE
180
181
  )
181
- _disable_service = mode == "disabled" or settings_mode == "disabled"
182
- setup_settings = {"_disable_service": _disable_service}
182
+ settings__disable_service = (kwargs.get("settings") or {}).get(
183
+ "_disable_service"
184
+ ) or os.environ.get(wandb.env._DISABLE_SERVICE)
185
+
186
+ setup_settings = {
187
+ "mode": mode or settings_mode,
188
+ "_disable_service": settings__disable_service,
189
+ }
183
190
 
184
191
  self._wl = wandb_setup.setup(settings=setup_settings)
185
192
  # Make sure we have a logger setup (might be an early logger)
wandb/sdk/wandb_run.py CHANGED
@@ -43,12 +43,12 @@ from wandb.apis import internal, public
43
43
  from wandb.apis.internal import Api
44
44
  from wandb.apis.public import Api as PublicApi
45
45
  from wandb.errors import CommError
46
+ from wandb.integration.torch import wandb_torch
46
47
  from wandb.proto.wandb_internal_pb2 import (
47
48
  MetricRecord,
48
49
  PollExitResponse,
49
50
  Result,
50
51
  RunRecord,
51
- ServerInfoResponse,
52
52
  )
53
53
  from wandb.sdk.artifacts.artifact import Artifact
54
54
  from wandb.sdk.internal import job_builder
@@ -62,7 +62,7 @@ from wandb.util import (
62
62
  _is_artifact_object,
63
63
  _is_artifact_string,
64
64
  _is_artifact_version_weave_dict,
65
- _is_py_or_dockerfile,
65
+ _is_py_requirements_or_dockerfile,
66
66
  _resolve_aliases,
67
67
  add_import_hook,
68
68
  parse_artifact_string,
@@ -105,7 +105,6 @@ if TYPE_CHECKING:
105
105
  import wandb.sdk.backend.backend
106
106
  import wandb.sdk.interface.interface_queue
107
107
  from wandb.proto.wandb_internal_pb2 import (
108
- CheckVersionResponse,
109
108
  GetSummaryResponse,
110
109
  InternalMessagesResponse,
111
110
  SampledHistoryResponse,
@@ -561,12 +560,10 @@ class Run:
561
560
 
562
561
  _run_status_checker: Optional[RunStatusChecker]
563
562
 
564
- _check_version: Optional["CheckVersionResponse"]
565
563
  _sampled_history: Optional["SampledHistoryResponse"]
566
564
  _final_summary: Optional["GetSummaryResponse"]
567
565
  _poll_exit_handle: Optional[MailboxHandle]
568
566
  _poll_exit_response: Optional[PollExitResponse]
569
- _server_info_response: Optional[ServerInfoResponse]
570
567
  _internal_messages_response: Optional["InternalMessagesResponse"]
571
568
 
572
569
  _stdout_slave_fd: Optional[int]
@@ -624,7 +621,7 @@ class Run:
624
621
  )
625
622
  self.summary._set_update_callback(self._summary_update_callback)
626
623
  self._step = 0
627
- self._torch_history: Optional[wandb.wandb_torch.TorchHistory] = None # type: ignore
624
+ self._torch_history: Optional[wandb_torch.TorchHistory] = None # type: ignore
628
625
 
629
626
  # todo: eventually would be nice to make this configurable using self._settings._start_time
630
627
  # need to test (jhr): if you set start time to 2 days ago and run a test for 15 minutes,
@@ -669,11 +666,9 @@ class Run:
669
666
  # Created when the run "starts".
670
667
  self._run_status_checker = None
671
668
 
672
- self._check_version = None
673
669
  self._sampled_history = None
674
670
  self._final_summary = None
675
671
  self._poll_exit_response = None
676
- self._server_info_response = None
677
672
  self._internal_messages_response = None
678
673
  self._poll_exit_handle = None
679
674
 
@@ -927,9 +922,9 @@ class Run:
927
922
  self.__dict__.update(state)
928
923
 
929
924
  @property
930
- def _torch(self) -> "wandb.wandb_torch.TorchHistory": # type: ignore
925
+ def _torch(self) -> "wandb_torch.TorchHistory": # type: ignore
931
926
  if self._torch_history is None:
932
- self._torch_history = wandb.wandb_torch.TorchHistory() # type: ignore
927
+ self._torch_history = wandb_torch.TorchHistory() # type: ignore
933
928
  return self._torch_history
934
929
 
935
930
  @property
@@ -1152,7 +1147,7 @@ class Run:
1152
1147
  name: Optional[str] = None,
1153
1148
  include_fn: Union[
1154
1149
  Callable[[str, str], bool], Callable[[str], bool]
1155
- ] = _is_py_or_dockerfile,
1150
+ ] = _is_py_requirements_or_dockerfile,
1156
1151
  exclude_fn: Union[
1157
1152
  Callable[[str, str], bool], Callable[[str], bool]
1158
1153
  ] = filenames.exclude_wandb_fn,
@@ -2453,8 +2448,6 @@ class Run:
2453
2448
  sampled_history=self._sampled_history,
2454
2449
  final_summary=self._final_summary,
2455
2450
  poll_exit_response=self._poll_exit_response,
2456
- server_info_response=self._server_info_response,
2457
- check_version_response=self._check_version,
2458
2451
  internal_messages_response=self._internal_messages_response,
2459
2452
  reporter=self._reporter,
2460
2453
  quiet=self._quiet,
@@ -2676,25 +2669,6 @@ class Run:
2676
2669
 
2677
2670
  assert self._backend and self._backend.interface
2678
2671
 
2679
- if not self._settings._disable_update_check:
2680
- logger.info("communicating current version")
2681
- version_handle = self._backend.interface.deliver_check_version(
2682
- current_version=wandb.__version__
2683
- )
2684
- version_result = version_handle.wait(timeout=10)
2685
- if not version_result:
2686
- version_handle.abandon()
2687
- else:
2688
- self._check_version = version_result.response.check_version_response
2689
- logger.info("got version response %s", self._check_version)
2690
-
2691
- # get the server info before starting the defer state machine as
2692
- # it will stop communication with the server
2693
- server_info_handle = self._backend.interface.deliver_request_server_info()
2694
- result = server_info_handle.wait(timeout=-1)
2695
- assert result
2696
- self._server_info_response = result.response.server_info_response
2697
-
2698
2672
  exit_handle = self._backend.interface.deliver_exit(self._exit_code)
2699
2673
  exit_handle.add_probe(on_probe=self._on_probe_exit)
2700
2674
 
@@ -3712,27 +3686,6 @@ class Run:
3712
3686
  Run._header_sync_info(settings=settings, printer=printer)
3713
3687
  Run._header_run_info(settings=settings, printer=printer)
3714
3688
 
3715
- @staticmethod
3716
- def _header_version_check_info(
3717
- check_version: Optional["CheckVersionResponse"] = None,
3718
- *,
3719
- settings: "Settings",
3720
- printer: Union["PrinterTerm", "PrinterJupyter"],
3721
- ) -> None:
3722
- if not check_version or settings._offline:
3723
- return
3724
-
3725
- if check_version.delete_message:
3726
- printer.display(check_version.delete_message, level="error")
3727
- elif check_version.yank_message:
3728
- printer.display(check_version.yank_message, level="warn")
3729
-
3730
- printer.display(
3731
- check_version.upgrade_message,
3732
- off=not check_version.upgrade_message,
3733
- level="warn",
3734
- )
3735
-
3736
3689
  @staticmethod
3737
3690
  def _header_wandb_version_info(
3738
3691
  *,
@@ -3846,8 +3799,6 @@ class Run:
3846
3799
  sampled_history: Optional["SampledHistoryResponse"] = None,
3847
3800
  final_summary: Optional["GetSummaryResponse"] = None,
3848
3801
  poll_exit_response: Optional[PollExitResponse] = None,
3849
- server_info_response: Optional[ServerInfoResponse] = None,
3850
- check_version_response: Optional["CheckVersionResponse"] = None,
3851
3802
  internal_messages_response: Optional["InternalMessagesResponse"] = None,
3852
3803
  reporter: Optional[Reporter] = None,
3853
3804
  quiet: Optional[bool] = None,
@@ -3870,23 +3821,11 @@ class Run:
3870
3821
  printer=printer,
3871
3822
  )
3872
3823
  Run._footer_log_dir_info(quiet=quiet, settings=settings, printer=printer)
3873
- Run._footer_version_check_info(
3874
- check_version=check_version_response,
3875
- quiet=quiet,
3876
- settings=settings,
3877
- printer=printer,
3878
- )
3879
3824
  Run._footer_notify_wandb_core(
3880
3825
  quiet=quiet,
3881
3826
  settings=settings,
3882
3827
  printer=printer,
3883
3828
  )
3884
- Run._footer_local_warn(
3885
- server_info_response=server_info_response,
3886
- quiet=quiet,
3887
- settings=settings,
3888
- printer=printer,
3889
- )
3890
3829
  Run._footer_internal_messages(
3891
3830
  internal_messages_response=internal_messages_response,
3892
3831
  quiet=quiet,
@@ -3896,12 +3835,6 @@ class Run:
3896
3835
  Run._footer_reporter_warn_err(
3897
3836
  reporter=reporter, quiet=quiet, settings=settings, printer=printer
3898
3837
  )
3899
- Run._footer_server_messages(
3900
- server_info_response=server_info_response,
3901
- quiet=quiet,
3902
- settings=settings,
3903
- printer=printer,
3904
- )
3905
3838
 
3906
3839
  # fixme: Temporary hack until we move to rich which allows multiple spinners
3907
3840
  @staticmethod
@@ -4156,33 +4089,6 @@ class Run:
4156
4089
  if panel:
4157
4090
  printer.display(printer.panel(panel))
4158
4091
 
4159
- @staticmethod
4160
- def _footer_local_warn(
4161
- server_info_response: Optional[ServerInfoResponse] = None,
4162
- quiet: Optional[bool] = None,
4163
- *,
4164
- settings: "Settings",
4165
- printer: Union["PrinterTerm", "PrinterJupyter"],
4166
- ) -> None:
4167
- if (quiet or settings.quiet) or settings.silent:
4168
- return
4169
-
4170
- if settings._offline:
4171
- return
4172
-
4173
- if not server_info_response or not server_info_response.local_info:
4174
- return
4175
-
4176
- if settings.is_local:
4177
- local_info = server_info_response.local_info
4178
- latest_version, out_of_date = local_info.version, local_info.out_of_date
4179
- if out_of_date:
4180
- printer.display(
4181
- f"Upgrade to the {latest_version} version of W&B Server to get the latest features. "
4182
- f"Learn more: {printer.link(wburls.get('upgrade_server'))}",
4183
- level="warn",
4184
- )
4185
-
4186
4092
  @staticmethod
4187
4093
  def _footer_internal_messages(
4188
4094
  internal_messages_response: Optional["InternalMessagesResponse"] = None,
@@ -4200,58 +4106,6 @@ class Run:
4200
4106
  for message in internal_messages_response.messages.warning:
4201
4107
  printer.display(message, level="warn")
4202
4108
 
4203
- @staticmethod
4204
- def _footer_server_messages(
4205
- server_info_response: Optional[ServerInfoResponse] = None,
4206
- quiet: Optional[bool] = None,
4207
- *,
4208
- settings: "Settings",
4209
- printer: Union["PrinterTerm", "PrinterJupyter"],
4210
- ) -> None:
4211
- if (quiet or settings.quiet) or settings.silent:
4212
- return
4213
-
4214
- if settings.disable_hints:
4215
- return
4216
-
4217
- if server_info_response and server_info_response.server_messages:
4218
- for message in server_info_response.server_messages.item:
4219
- printer.display(
4220
- message.html_text if printer._html else message.utf_text,
4221
- default_text=message.plain_text,
4222
- level=message.level,
4223
- off=message.type.lower() != "footer",
4224
- )
4225
-
4226
- @staticmethod
4227
- def _footer_version_check_info(
4228
- check_version: Optional["CheckVersionResponse"] = None,
4229
- quiet: Optional[bool] = None,
4230
- *,
4231
- settings: "Settings",
4232
- printer: Union["PrinterTerm", "PrinterJupyter"],
4233
- ) -> None:
4234
- if not check_version:
4235
- return
4236
-
4237
- if settings._offline:
4238
- return
4239
-
4240
- if (quiet or settings.quiet) or settings.silent:
4241
- return
4242
-
4243
- if check_version.delete_message:
4244
- printer.display(check_version.delete_message, level="error")
4245
- elif check_version.yank_message:
4246
- printer.display(check_version.yank_message, level="warn")
4247
-
4248
- # only display upgrade message if packages are bad
4249
- if check_version.upgrade_message:
4250
- printer.display(
4251
- check_version.upgrade_message,
4252
- level="warn",
4253
- )
4254
-
4255
4109
  @staticmethod
4256
4110
  def _footer_notify_wandb_core(
4257
4111
  *,
wandb/sdk/wandb_setup.py CHANGED
@@ -281,7 +281,7 @@ class _WandbSetup__WandbSetup: # noqa: N801
281
281
  sys.exit(internal_exit_code)
282
282
 
283
283
  def _setup_manager(self) -> None:
284
- if self._settings._disable_service:
284
+ if self._settings._noop or self._settings._disable_service:
285
285
  return
286
286
  self._manager = wandb_manager._Manager(settings=self._settings)
287
287
 
wandb/sklearn.py ADDED
@@ -0,0 +1,35 @@
1
+ from wandb.integration.sklearn import (
2
+ plot_calibration_curve,
3
+ plot_class_proportions,
4
+ plot_classifier,
5
+ plot_clusterer,
6
+ plot_confusion_matrix,
7
+ plot_elbow_curve,
8
+ plot_feature_importances,
9
+ plot_learning_curve,
10
+ plot_outlier_candidates,
11
+ plot_precision_recall,
12
+ plot_regressor,
13
+ plot_residuals,
14
+ plot_roc,
15
+ plot_silhouette,
16
+ plot_summary_metrics,
17
+ )
18
+
19
+ __all__ = (
20
+ "plot_classifier",
21
+ "plot_clusterer",
22
+ "plot_regressor",
23
+ "plot_summary_metrics",
24
+ "plot_learning_curve",
25
+ "plot_feature_importances",
26
+ "plot_class_proportions",
27
+ "plot_calibration_curve",
28
+ "plot_roc",
29
+ "plot_precision_recall",
30
+ "plot_confusion_matrix",
31
+ "plot_elbow_curve",
32
+ "plot_silhouette",
33
+ "plot_residuals",
34
+ "plot_outlier_candidates",
35
+ )
wandb/util.py CHANGED
@@ -1554,9 +1554,13 @@ def _is_databricks() -> bool:
1554
1554
  return False
1555
1555
 
1556
1556
 
1557
- def _is_py_or_dockerfile(path: str) -> bool:
1557
+ def _is_py_requirements_or_dockerfile(path: str) -> bool:
1558
1558
  file = os.path.basename(path)
1559
- return file.endswith(".py") or file.startswith("Dockerfile")
1559
+ return (
1560
+ file.endswith(".py")
1561
+ or file.startswith("Dockerfile")
1562
+ or file == "requirements.txt"
1563
+ )
1560
1564
 
1561
1565
 
1562
1566
  def check_windows_valid_filename(path: Union[int, str]) -> bool:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wandb
3
- Version: 0.18.0
3
+ Version: 0.18.1
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