wandb 0.18.5__py3-none-macosx_11_0_arm64.whl → 0.18.6__py3-none-macosx_11_0_arm64.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (129) hide show
  1. wandb/__init__.py +2 -2
  2. wandb/__init__.pyi +21 -19
  3. wandb/agents/pyagent.py +1 -1
  4. wandb/apis/importers/wandb.py +1 -1
  5. wandb/apis/normalize.py +2 -18
  6. wandb/apis/public/api.py +122 -62
  7. wandb/apis/public/artifacts.py +8 -3
  8. wandb/apis/public/files.py +17 -2
  9. wandb/apis/public/jobs.py +2 -2
  10. wandb/apis/public/query_generator.py +1 -1
  11. wandb/apis/public/runs.py +8 -8
  12. wandb/apis/public/teams.py +3 -3
  13. wandb/apis/public/users.py +1 -1
  14. wandb/apis/public/utils.py +68 -0
  15. wandb/bin/gpu_stats +0 -0
  16. wandb/bin/wandb-core +0 -0
  17. wandb/cli/cli.py +12 -3
  18. wandb/data_types.py +1 -1
  19. wandb/docker/__init__.py +2 -1
  20. wandb/docker/auth.py +2 -3
  21. wandb/errors/links.py +73 -0
  22. wandb/errors/term.py +7 -6
  23. wandb/filesync/step_prepare.py +1 -1
  24. wandb/filesync/upload_job.py +1 -1
  25. wandb/integration/catboost/catboost.py +2 -2
  26. wandb/integration/diffusers/pipeline_resolver.py +1 -1
  27. wandb/integration/diffusers/resolvers/multimodal.py +6 -6
  28. wandb/integration/diffusers/resolvers/utils.py +1 -1
  29. wandb/integration/fastai/__init__.py +3 -2
  30. wandb/integration/keras/callbacks/metrics_logger.py +1 -1
  31. wandb/integration/keras/callbacks/model_checkpoint.py +1 -1
  32. wandb/integration/keras/keras.py +1 -1
  33. wandb/integration/kfp/kfp_patch.py +1 -1
  34. wandb/integration/lightgbm/__init__.py +2 -2
  35. wandb/integration/magic.py +2 -2
  36. wandb/integration/metaflow/metaflow.py +1 -1
  37. wandb/integration/sacred/__init__.py +1 -1
  38. wandb/integration/sagemaker/auth.py +1 -1
  39. wandb/integration/sklearn/plot/classifier.py +7 -7
  40. wandb/integration/sklearn/plot/clusterer.py +3 -3
  41. wandb/integration/sklearn/plot/regressor.py +3 -3
  42. wandb/integration/sklearn/plot/shared.py +2 -2
  43. wandb/integration/tensorboard/log.py +2 -2
  44. wandb/integration/ultralytics/callback.py +2 -2
  45. wandb/integration/xgboost/xgboost.py +1 -1
  46. wandb/jupyter.py +0 -1
  47. wandb/plot/__init__.py +17 -8
  48. wandb/plot/bar.py +53 -27
  49. wandb/plot/confusion_matrix.py +151 -70
  50. wandb/plot/custom_chart.py +124 -0
  51. wandb/plot/histogram.py +46 -20
  52. wandb/plot/line.py +57 -26
  53. wandb/plot/line_series.py +148 -60
  54. wandb/plot/pr_curve.py +89 -44
  55. wandb/plot/roc_curve.py +82 -37
  56. wandb/plot/scatter.py +53 -20
  57. wandb/plot/viz.py +20 -102
  58. wandb/sdk/artifacts/artifact.py +280 -328
  59. wandb/sdk/artifacts/artifact_manifest.py +10 -9
  60. wandb/sdk/artifacts/artifact_manifest_entry.py +1 -1
  61. wandb/sdk/artifacts/storage_handlers/azure_handler.py +9 -4
  62. wandb/sdk/artifacts/storage_handlers/gcs_handler.py +1 -3
  63. wandb/sdk/artifacts/storage_handlers/s3_handler.py +1 -1
  64. wandb/sdk/artifacts/storage_handlers/wb_artifact_handler.py +2 -2
  65. wandb/sdk/artifacts/storage_handlers/wb_local_artifact_handler.py +1 -1
  66. wandb/sdk/backend/backend.py +0 -1
  67. wandb/sdk/data_types/audio.py +1 -1
  68. wandb/sdk/data_types/base_types/media.py +66 -5
  69. wandb/sdk/data_types/bokeh.py +1 -1
  70. wandb/sdk/data_types/helper_types/bounding_boxes_2d.py +1 -1
  71. wandb/sdk/data_types/helper_types/image_mask.py +2 -2
  72. wandb/sdk/data_types/histogram.py +1 -1
  73. wandb/sdk/data_types/html.py +1 -1
  74. wandb/sdk/data_types/image.py +1 -1
  75. wandb/sdk/data_types/molecule.py +3 -3
  76. wandb/sdk/data_types/object_3d.py +4 -4
  77. wandb/sdk/data_types/plotly.py +1 -1
  78. wandb/sdk/data_types/saved_model.py +0 -1
  79. wandb/sdk/data_types/table.py +7 -7
  80. wandb/sdk/data_types/trace_tree.py +1 -1
  81. wandb/sdk/data_types/video.py +4 -3
  82. wandb/sdk/interface/router.py +0 -2
  83. wandb/sdk/internal/datastore.py +1 -1
  84. wandb/sdk/internal/file_pusher.py +1 -1
  85. wandb/sdk/internal/file_stream.py +4 -4
  86. wandb/sdk/internal/handler.py +3 -2
  87. wandb/sdk/internal/internal.py +1 -1
  88. wandb/sdk/internal/internal_api.py +178 -63
  89. wandb/sdk/internal/job_builder.py +4 -3
  90. wandb/sdk/internal/system/assets/__init__.py +0 -2
  91. wandb/sdk/internal/tb_watcher.py +11 -10
  92. wandb/sdk/launch/_launch.py +4 -3
  93. wandb/sdk/launch/_launch_add.py +2 -2
  94. wandb/sdk/launch/builder/kaniko_builder.py +0 -1
  95. wandb/sdk/launch/create_job.py +1 -0
  96. wandb/sdk/launch/environment/local_environment.py +0 -1
  97. wandb/sdk/launch/errors.py +0 -6
  98. wandb/sdk/launch/registry/local_registry.py +0 -2
  99. wandb/sdk/launch/runner/abstract.py +0 -5
  100. wandb/sdk/launch/sweeps/__init__.py +0 -2
  101. wandb/sdk/launch/sweeps/scheduler.py +0 -2
  102. wandb/sdk/launch/sweeps/scheduler_sweep.py +0 -1
  103. wandb/sdk/lib/apikey.py +3 -3
  104. wandb/sdk/lib/file_stream_utils.py +1 -1
  105. wandb/sdk/lib/filesystem.py +1 -1
  106. wandb/sdk/lib/ipython.py +16 -9
  107. wandb/sdk/lib/mailbox.py +0 -4
  108. wandb/sdk/lib/printer.py +44 -8
  109. wandb/sdk/lib/retry.py +1 -1
  110. wandb/sdk/service/service.py +3 -3
  111. wandb/sdk/service/streams.py +2 -4
  112. wandb/sdk/wandb_init.py +20 -20
  113. wandb/sdk/wandb_login.py +1 -1
  114. wandb/sdk/wandb_require.py +1 -4
  115. wandb/sdk/wandb_run.py +57 -69
  116. wandb/sdk/wandb_settings.py +3 -4
  117. wandb/sdk/wandb_sync.py +2 -1
  118. wandb/util.py +46 -18
  119. wandb/wandb_agent.py +3 -3
  120. wandb/wandb_controller.py +2 -2
  121. {wandb-0.18.5.dist-info → wandb-0.18.6.dist-info}/METADATA +1 -1
  122. {wandb-0.18.5.dist-info → wandb-0.18.6.dist-info}/RECORD +125 -126
  123. wandb/sdk/internal/system/assets/gpu_apple.py +0 -177
  124. wandb/sdk/lib/_wburls_generate.py +0 -25
  125. wandb/sdk/lib/_wburls_generated.py +0 -22
  126. wandb/sdk/lib/wburls.py +0 -46
  127. {wandb-0.18.5.dist-info → wandb-0.18.6.dist-info}/WHEEL +0 -0
  128. {wandb-0.18.5.dist-info → wandb-0.18.6.dist-info}/entry_points.txt +0 -0
  129. {wandb-0.18.5.dist-info → wandb-0.18.6.dist-info}/licenses/LICENSE +0 -0
wandb/sdk/wandb_run.py CHANGED
@@ -31,14 +31,15 @@ import requests
31
31
 
32
32
  import wandb
33
33
  import wandb.env
34
- from wandb import errors, trigger
34
+ from wandb import trigger
35
35
  from wandb._globals import _datatypes_set_callback
36
36
  from wandb.apis import internal, public
37
37
  from wandb.apis.internal import Api
38
38
  from wandb.apis.public import Api as PublicApi
39
- from wandb.errors import CommError
39
+ from wandb.errors import CommError, UnsupportedError, UsageError
40
+ from wandb.errors.links import url_registry
40
41
  from wandb.integration.torch import wandb_torch
41
- from wandb.plot.viz import CustomChart, Visualize, custom_chart
42
+ from wandb.plot import CustomChart, Visualize, plot_table
42
43
  from wandb.proto.wandb_internal_pb2 import (
43
44
  MetricRecord,
44
45
  PollExitResponse,
@@ -89,7 +90,6 @@ from .lib.gitlib import GitRepo
89
90
  from .lib.mailbox import MailboxError, MailboxHandle, MailboxProbe, MailboxProgress
90
91
  from .lib.proto_util import message_to_dict
91
92
  from .lib.reporting import Reporter
92
- from .lib.wburls import wburls
93
93
  from .wandb_alerts import AlertLevel
94
94
  from .wandb_settings import Settings
95
95
  from .wandb_setup import _WandbSetup
@@ -410,7 +410,7 @@ class _run_decorator: # noqa: N801
410
410
  if only_warn:
411
411
  warnings.warn(resolved_message, UserWarning, stacklevel=2)
412
412
  else:
413
- raise errors.UsageError(resolved_message)
413
+ raise UsageError(resolved_message)
414
414
 
415
415
  return wrapper_fn
416
416
 
@@ -430,11 +430,10 @@ class _run_decorator: # noqa: N801
430
430
  # - for fork case the new process share mem space hence the value would be of parent process.
431
431
  _init_pid = getattr(self, "_init_pid", None)
432
432
  if _init_pid != os.getpid():
433
- message = "`{}` ignored (called from pid={}, `init` called from pid={}). See: {}".format(
434
- func.__name__,
435
- os.getpid(),
436
- _init_pid,
437
- wburls.get("multiprocess"),
433
+ message = (
434
+ f"`{func.__name__}` ignored (called from pid={os.getpid()}, "
435
+ f"`init` called from pid={_init_pid}). "
436
+ f"See: {url_registry.url('multiprocess')}"
438
437
  )
439
438
  # - if this process was pickled in non-service case,
440
439
  # we ignore the attributes (since pickle is not supported)
@@ -443,7 +442,7 @@ class _run_decorator: # noqa: N801
443
442
  settings = getattr(self, "_settings", None)
444
443
  if settings and settings["strict"]:
445
444
  wandb.termerror(message, repeat=False)
446
- raise errors.UnsupportedError(
445
+ raise UnsupportedError(
447
446
  f"`{func.__name__}` does not support multiprocessing"
448
447
  )
449
448
  wandb.termwarn(message, repeat=False)
@@ -633,7 +632,7 @@ class Run:
633
632
 
634
633
  _datatypes_set_callback(self._datatypes_callback)
635
634
 
636
- self._printer = printer.get_printer(self._settings._jupyter)
635
+ self._printer = printer.new_printer()
637
636
  self._wl = None
638
637
  self._reporter: Reporter | None = None
639
638
 
@@ -1158,7 +1157,7 @@ class Run:
1158
1157
 
1159
1158
  By default, it walks the current directory and logs all files that end with `.py`.
1160
1159
 
1161
- Arguments:
1160
+ Args:
1162
1161
  root: The relative (to `os.getcwd()`) or absolute path to recursively find code from.
1163
1162
  name: (str, optional) The name of our code artifact. By default, we'll name
1164
1163
  the artifact `source-$PROJECT_ID-$ENTRYPOINT_RELPATH`. There may be scenarios where you want
@@ -1415,7 +1414,7 @@ class Run:
1415
1414
  if is_id:
1416
1415
  artifact = Artifact._from_id(artifact_string, public_api._client)
1417
1416
  else:
1418
- artifact = public_api.artifact(name=artifact_string)
1417
+ artifact = public_api._artifact(name=artifact_string)
1419
1418
  # in the future we'll need to support using artifacts from
1420
1419
  # different instances of wandb.
1421
1420
 
@@ -1473,36 +1472,27 @@ class Run:
1473
1472
  def _visualization_hack(self, row: dict[str, Any]) -> dict[str, Any]:
1474
1473
  # TODO(jhr): move visualize hack somewhere else
1475
1474
  chart_keys = set()
1476
- split_table_set = set()
1477
- for k in row:
1478
- if isinstance(row[k], Visualize):
1479
- key = row[k].get_config_key(k)
1480
- value = row[k].get_config_value(k)
1481
- row[k] = row[k]._data
1482
- self._config_callback(val=value, key=key)
1483
- elif isinstance(row[k], CustomChart):
1475
+ for k, v in row.items():
1476
+ if isinstance(v, Visualize):
1477
+ row[k] = v.table
1478
+ v.set_key(k)
1479
+ self._config_callback(
1480
+ val=v.spec.config_value,
1481
+ key=v.spec.config_key,
1482
+ )
1483
+ elif isinstance(v, CustomChart):
1484
1484
  chart_keys.add(k)
1485
- key = row[k].get_config_key(k)
1486
- if row[k]._split_table:
1487
- value = row[k].get_config_value(
1488
- "Vega2", row[k].user_query(f"Custom Chart Tables/{k}_table")
1489
- )
1490
- split_table_set.add(k)
1491
- else:
1492
- value = row[k].get_config_value(
1493
- "Vega2", row[k].user_query(f"{k}_table")
1494
- )
1495
- row[k] = row[k]._data
1496
- self._config_callback(val=value, key=key)
1485
+ v.set_key(k)
1486
+ self._config_callback(
1487
+ key=v.spec.config_key,
1488
+ val=v.spec.config_value,
1489
+ )
1497
1490
 
1498
1491
  for k in chart_keys:
1499
1492
  # remove the chart key from the row
1500
- # TODO: is this really the right move? what if the user logs
1501
- # a non-custom chart to this key?
1502
- if k in split_table_set:
1503
- row[f"Custom Chart Tables/{k}_table"] = row.pop(k)
1504
- else:
1505
- row[f"{k}_table"] = row.pop(k)
1493
+ v = row.pop(k)
1494
+ if isinstance(v, CustomChart):
1495
+ row[v.spec.table_key] = v.table
1506
1496
  return row
1507
1497
 
1508
1498
  def _partial_history_callback(
@@ -1707,7 +1697,7 @@ class Run:
1707
1697
  [guides to logging](https://docs.wandb.ai/guides/track/log) for examples,
1708
1698
  from 3D molecular structures and segmentation masks to PR curves and histograms.
1709
1699
  You can use `wandb.Table` to log structured data. See our
1710
- [guide to logging tables](https://docs.wandb.ai/guides/data-vis/log-tables)
1700
+ [guide to logging tables](https://docs.wandb.ai/guides/tables/tables-walkthrough)
1711
1701
  for details.
1712
1702
 
1713
1703
  The W&B UI organizes metrics with a forward slash (`/`) in their name
@@ -1770,7 +1760,7 @@ class Run:
1770
1760
  run.log({"accuracy": 0.9}, step=current_step)
1771
1761
  ```
1772
1762
 
1773
- Arguments:
1763
+ Args:
1774
1764
  data: A `dict` with `str` keys and values that are serializable
1775
1765
  Python objects including: `int`, `float` and `string`;
1776
1766
  any of the `wandb.data_types`; lists, tuples and NumPy arrays
@@ -1923,7 +1913,7 @@ class Run:
1923
1913
  if self._settings._shared and step is not None:
1924
1914
  wandb.termwarn(
1925
1915
  "In shared mode, the use of `wandb.log` with the step argument is not supported "
1926
- f"and will be ignored. Please refer to {wburls.get('wandb_define_metric')} "
1916
+ f"and will be ignored. Please refer to {url_registry.url('define-metric')} "
1927
1917
  "on how to customize your x-axis.",
1928
1918
  repeat=False,
1929
1919
  )
@@ -1971,7 +1961,7 @@ class Run:
1971
1961
  Note: when given an absolute path or glob and no `base_path`, one
1972
1962
  directory level is preserved as in the example above.
1973
1963
 
1974
- Arguments:
1964
+ Args:
1975
1965
  glob_str: A relative or absolute path or Unix glob.
1976
1966
  base_path: A path to use to infer a directory structure; see examples.
1977
1967
  policy: One of `live`, `now`, or `end`.
@@ -1998,9 +1988,7 @@ class Run:
1998
1988
  if isinstance(glob_str, bytes):
1999
1989
  # Preserved for backward compatibility: allow bytes inputs.
2000
1990
  glob_str = glob_str.decode("utf-8")
2001
- if isinstance(glob_str, str) and (
2002
- glob_str.startswith("gs://") or glob_str.startswith("s3://")
2003
- ):
1991
+ if isinstance(glob_str, str) and (glob_str.startswith(("gs://", "s3://"))):
2004
1992
  # Provide a better error message for a common misuse.
2005
1993
  wandb.termlog(f"{glob_str} is a cloud storage url, can't save file to W&B.")
2006
1994
  return []
@@ -2144,7 +2132,7 @@ class Run:
2144
2132
  This is used when creating multiple runs in the same process. We automatically
2145
2133
  call this method when your script exits or if you use the run context manager.
2146
2134
 
2147
- Arguments:
2135
+ Args:
2148
2136
  exit_code: Set to something other than 0 to mark a run as failed
2149
2137
  quiet: Set to true to minimize log output
2150
2138
  """
@@ -2246,11 +2234,11 @@ class Run:
2246
2234
  data_table: Table,
2247
2235
  fields: dict[str, Any],
2248
2236
  string_fields: dict[str, Any] | None = None,
2249
- split_table: bool | None = False,
2237
+ split_table: bool = False,
2250
2238
  ) -> CustomChart:
2251
2239
  """Create a custom plot on a table.
2252
2240
 
2253
- Arguments:
2241
+ Args:
2254
2242
  vega_spec_name: the name of the spec for the plot
2255
2243
  data_table: a wandb.Table object containing the data to
2256
2244
  be used on the visualization
@@ -2261,7 +2249,7 @@ class Run:
2261
2249
  split_table: a boolean that indicates whether the table should be in
2262
2250
  a separate section in the UI
2263
2251
  """
2264
- return custom_chart(
2252
+ return plot_table(
2265
2253
  vega_spec_name, data_table, fields, string_fields or {}, split_table
2266
2254
  )
2267
2255
 
@@ -2751,7 +2739,7 @@ class Run:
2751
2739
  ) -> wandb_metric.Metric:
2752
2740
  """Customize metrics logged with `wandb.log()`.
2753
2741
 
2754
- Arguments:
2742
+ Args:
2755
2743
  name: The name of the metric to customize.
2756
2744
  step_metric: The name of another metric to serve as the X-axis
2757
2745
  for this metric in automatically generated charts.
@@ -2977,10 +2965,10 @@ class Run:
2977
2965
 
2978
2966
  The linked artifact will be visible in the UI for the specified portfolio.
2979
2967
 
2980
- Arguments:
2968
+ Args:
2981
2969
  artifact: the (public or local) artifact which will be linked
2982
- target_path: `str` - takes the following forms: {portfolio}, {project}/{portfolio},
2983
- or {entity}/{project}/{portfolio}
2970
+ target_path: `str` - takes the following forms: `{portfolio}`, `{project}/{portfolio}`,
2971
+ or `{entity}/{project}/{portfolio}`
2984
2972
  aliases: `List[str]` - optional alias(es) that will only be applied on this linked artifact
2985
2973
  inside the portfolio.
2986
2974
  The alias "latest" will always be applied to the latest version of an artifact that is linked.
@@ -3046,7 +3034,7 @@ class Run:
3046
3034
 
3047
3035
  Call `download` or `file` on the returned object to get the contents locally.
3048
3036
 
3049
- Arguments:
3037
+ Args:
3050
3038
  artifact_or_name: (str or Artifact) An artifact name.
3051
3039
  May be prefixed with project/ or entity/project/.
3052
3040
  If no entity is specified in the name, the Run or API setting's entity is used.
@@ -3075,7 +3063,7 @@ class Run:
3075
3063
  else:
3076
3064
  name = artifact_or_name
3077
3065
  public_api = self._public_api()
3078
- artifact = public_api.artifact(type=type, name=name)
3066
+ artifact = public_api._artifact(type=type, name=name)
3079
3067
  if type is not None and type != artifact.type:
3080
3068
  raise ValueError(
3081
3069
  "Supplied type {} does not match type {} of artifact {}".format(
@@ -3155,7 +3143,7 @@ class Run:
3155
3143
  ) -> Artifact:
3156
3144
  """Declare an artifact as an output of a run.
3157
3145
 
3158
- Arguments:
3146
+ Args:
3159
3147
  artifact_or_path: (str or Artifact) A path to the contents of this artifact,
3160
3148
  can be in the following forms:
3161
3149
  - `/local/directory`
@@ -3200,7 +3188,7 @@ class Run:
3200
3188
  Note that you must call run.finish_artifact() to finalize the artifact.
3201
3189
  This is useful when distributed jobs need to all contribute to the same artifact.
3202
3190
 
3203
- Arguments:
3191
+ Args:
3204
3192
  artifact_or_path: (str or Artifact) A path to the contents of this artifact,
3205
3193
  can be in the following forms:
3206
3194
  - `/local/directory`
@@ -3253,7 +3241,7 @@ class Run:
3253
3241
 
3254
3242
  Subsequent "upserts" with the same distributed ID will result in a new version.
3255
3243
 
3256
- Arguments:
3244
+ Args:
3257
3245
  artifact_or_path: (str or Artifact) A path to the contents of this artifact,
3258
3246
  can be in the following forms:
3259
3247
  - `/local/directory`
@@ -3442,7 +3430,7 @@ class Run:
3442
3430
  ) -> None:
3443
3431
  """Logs a model artifact containing the contents inside the 'path' to a run and marks it as an output to this run.
3444
3432
 
3445
- Arguments:
3433
+ Args:
3446
3434
  path: (str) A path to the contents of this model,
3447
3435
  can be in the following forms:
3448
3436
  - `/local/directory`
@@ -3488,7 +3476,7 @@ class Run:
3488
3476
  def use_model(self, name: str) -> FilePathStr:
3489
3477
  """Download the files logged in a model artifact 'name'.
3490
3478
 
3491
- Arguments:
3479
+ Args:
3492
3480
  name: (str) A model artifact name. 'name' must match the name of an existing logged
3493
3481
  model artifact.
3494
3482
  May be prefixed with entity/project/. Valid names
@@ -3558,7 +3546,7 @@ class Run:
3558
3546
  - Link version of model artifact 'name' to registered model, 'registered_model_name'.
3559
3547
  - Attach aliases from 'aliases' list to the newly linked model artifact version.
3560
3548
 
3561
- Arguments:
3549
+ Args:
3562
3550
  path: (str) A path to the contents of this model,
3563
3551
  can be in the following forms:
3564
3552
  - `/local/directory`
@@ -3617,7 +3605,7 @@ class Run:
3617
3605
 
3618
3606
  public_api = self._public_api()
3619
3607
  try:
3620
- artifact = public_api.artifact(name=f"{name}:latest")
3608
+ artifact = public_api._artifact(name=f"{name}:latest")
3621
3609
  assert (
3622
3610
  "model" in str(artifact.type.lower())
3623
3611
  ), "You can only use this method for 'model' artifacts. For an artifact to be a 'model' artifact, its type property must contain the substring 'model'."
@@ -3641,7 +3629,7 @@ class Run:
3641
3629
  ) -> None:
3642
3630
  """Launch an alert with the given title and text.
3643
3631
 
3644
- Arguments:
3632
+ Args:
3645
3633
  title: (str) The title of the alert, must be less than 64 characters long.
3646
3634
  text: (str) The text body of the alert.
3647
3635
  level: (str or AlertLevel, optional) The alert level to use, either: `INFO`, `WARN`, or `ERROR`.
@@ -3815,7 +3803,7 @@ class Run:
3815
3803
 
3816
3804
  # TODO(settings): make settings the source of truth
3817
3805
  if not wandb.jupyter.quiet(): # type: ignore
3818
- doc_html = printer.link(wburls.get("doc_run"), "docs")
3806
+ doc_html = printer.link(url_registry.url("developer-guide"), "docs")
3819
3807
 
3820
3808
  project_html = printer.link(project_url, "Weights & Biases")
3821
3809
  project_line = f"to {project_html} ({doc_html})"
@@ -4058,7 +4046,7 @@ class Run:
4058
4046
  printer.display(
4059
4047
  "The legacy backend is deprecated. In future versions, `wandb-core` will become "
4060
4048
  "the sole backend service, and the `wandb.require('legacy-service')` flag will be removed. "
4061
- "For more information, visit https://wandb.me/wandb-core",
4049
+ f"For more information, visit {url_registry.url('wandb-core')}",
4062
4050
  level="warn",
4063
4051
  )
4064
4052
 
@@ -4103,7 +4091,7 @@ def restore(
4103
4091
  File is placed into the current directory or run directory.
4104
4092
  By default, will only download the file if it doesn't already exist.
4105
4093
 
4106
- Arguments:
4094
+ Args:
4107
4095
  name: the name of the file
4108
4096
  run_path: optional path to a run to pull files from, i.e. `username/project_name/run_id`
4109
4097
  if wandb.init has not been called, this is required.
@@ -4161,7 +4149,7 @@ def finish(exit_code: int | None = None, quiet: bool | None = None) -> None:
4161
4149
  This is used when creating multiple runs in the same process.
4162
4150
  We automatically call this method when your script exits.
4163
4151
 
4164
- Arguments:
4152
+ Args:
4165
4153
  exit_code: Set to something other than 0 to mark a run as failed
4166
4154
  quiet: Set to true to minimize log output
4167
4155
  """
@@ -48,9 +48,8 @@ from wandb.sdk.lib._settings_toposort_generated import SETTINGS_TOPOLOGICALLY_SO
48
48
  from wandb.sdk.lib.run_moment import RunMoment
49
49
  from wandb.sdk.wandb_setup import _EarlyLogger
50
50
 
51
- from .lib import apikey
51
+ from .lib import apikey, ipython
52
52
  from .lib.gitlib import GitRepo
53
- from .lib.ipython import _get_python_type
54
53
  from .lib.runid import generate_id
55
54
 
56
55
  if sys.version_info >= (3, 8):
@@ -690,11 +689,11 @@ class Settings(SettingsData):
690
689
  _internal_check_process={"value": 8, "preprocessor": float},
691
690
  _internal_queue_timeout={"value": 2, "preprocessor": float},
692
691
  _ipython={
693
- "hook": lambda _: _get_python_type() == "ipython",
692
+ "hook": lambda _: ipython.in_ipython(),
694
693
  "auto_hook": True,
695
694
  },
696
695
  _jupyter={
697
- "hook": lambda _: _get_python_type() == "jupyter",
696
+ "hook": lambda _: ipython.in_jupyter(),
698
697
  "auto_hook": True,
699
698
  },
700
699
  _kaggle={"hook": lambda _: util._is_likely_kaggle(), "auto_hook": True},
wandb/sdk/wandb_sync.py CHANGED
@@ -1,7 +1,8 @@
1
1
  import pathlib
2
2
  from typing import TYPE_CHECKING, Optional
3
3
 
4
- from ..errors.term import termerror, termlog
4
+ from wandb.errors.term import termerror, termlog
5
+
5
6
  from . import wandb_setup
6
7
  from .backend.backend import Backend
7
8
  from .lib.mailbox import Mailbox
wandb/util.py CHANGED
@@ -84,7 +84,6 @@ _not_importable = set()
84
84
 
85
85
  MAX_LINE_BYTES = (10 << 20) - (100 << 10) # imposed by back end
86
86
  IS_GIT = os.path.exists(os.path.join(os.path.dirname(__file__), "..", ".git"))
87
- RE_WINFNAMES = re.compile(r'[<>:"\\?*]')
88
87
 
89
88
  # From https://docs.docker.com/engine/reference/commandline/tag/
90
89
  # "Name components may contain lowercase letters, digits and separators.
@@ -881,6 +880,23 @@ def no_retry_4xx(e: Exception) -> bool:
881
880
  raise UsageError(body["errors"][0]["message"])
882
881
 
883
882
 
883
+ def parse_backend_error_messages(response: requests.Response) -> List[str]:
884
+ errors: List[str] = []
885
+ try:
886
+ data = response.json()
887
+ except ValueError:
888
+ return errors
889
+
890
+ if "errors" in data and isinstance(data["errors"], list):
891
+ for error in data["errors"]:
892
+ # Our tests and potentially some api endpoints return a string error?
893
+ if isinstance(error, str):
894
+ error = {"message": error}
895
+ if "message" in error:
896
+ errors.append(error["message"])
897
+ return errors
898
+
899
+
884
900
  def no_retry_auth(e: Any) -> bool:
885
901
  if hasattr(e, "exception"):
886
902
  e = e.exception
@@ -894,7 +910,9 @@ def no_retry_auth(e: Any) -> bool:
894
910
  # Retry all non-forbidden/unauthorized/not-found errors.
895
911
  if e.response.status_code not in (401, 403, 404):
896
912
  return True
897
- # Crash w/message on forbidden/unauthorized errors.
913
+
914
+ # Crash with more informational message on forbidden/unauthorized errors.
915
+ # UnauthorizedError
898
916
  if e.response.status_code == 401:
899
917
  raise AuthenticationError(
900
918
  "The API key you provided is either invalid or missing. "
@@ -904,15 +922,29 @@ def no_retry_auth(e: Any) -> bool:
904
922
  "If you're not sure, you can try logging in again using the 'wandb login --relogin --host [hostname]' command."
905
923
  f"(Error {e.response.status_code}: {e.response.reason})"
906
924
  )
907
- elif wandb.run:
908
- raise CommError(f"Permission denied to access {wandb.run.path}")
909
- else:
910
- raise CommError(
911
- "It appears that you do not have permission to access the requested resource. "
912
- "Please reach out to the project owner to grant you access. "
913
- "If you have the correct permissions, verify that there are no issues with your networking setup."
914
- f"(Error {e.response.status_code}: {e.response.reason})"
915
- )
925
+ # ForbiddenError
926
+ if e.response.status_code == 403:
927
+ if wandb.run:
928
+ raise CommError(f"Permission denied to access {wandb.run.path}")
929
+ else:
930
+ raise CommError(
931
+ "It appears that you do not have permission to access the requested resource. "
932
+ "Please reach out to the project owner to grant you access. "
933
+ "If you have the correct permissions, verify that there are no issues with your networking setup."
934
+ f"(Error {e.response.status_code}: {e.response.reason})"
935
+ )
936
+
937
+ # NotFoundError
938
+ if e.response.status_code == 404:
939
+ # If error message is empty, raise a more generic NotFoundError message.
940
+ if parse_backend_error_messages(e.response):
941
+ return False
942
+ else:
943
+ raise LookupError(
944
+ f"Failed to find resource. Please make sure you have the correct resource path. "
945
+ f"(Error {e.response.status_code}: {e.response.reason})"
946
+ )
947
+ return False
916
948
 
917
949
 
918
950
  def check_retry_conflict(e: Any) -> Optional[bool]:
@@ -956,7 +988,7 @@ def make_check_retry_fn(
956
988
  ) -> CheckRetryFnType:
957
989
  """Return a check_retry_fn which can be used by lib.Retry().
958
990
 
959
- Arguments:
991
+ Args:
960
992
  fallback_fn: Use this function if check_fn didn't decide if a retry should happen.
961
993
  check_fn: Function which returns bool if retry should happen or None if unsure.
962
994
  check_timedelta: Optional retry timeout if we check_fn matches the exception
@@ -978,7 +1010,7 @@ def make_check_retry_fn(
978
1010
  def find_runner(program: str) -> Union[None, list, List[str]]:
979
1011
  """Return a command that will run program.
980
1012
 
981
- Arguments:
1013
+ Args:
982
1014
  program: The string name of the program to try to run.
983
1015
 
984
1016
  Returns:
@@ -1283,7 +1315,7 @@ def prompt_choices(
1283
1315
  def guess_data_type(shape: Sequence[int], risky: bool = False) -> Optional[str]:
1284
1316
  """Infer the type of data based on the shape of the tensors.
1285
1317
 
1286
- Arguments:
1318
+ Args:
1287
1319
  shape (Sequence[int]): The shape of the data
1288
1320
  risky(bool): some guesses are more likely to be wrong.
1289
1321
  """
@@ -1563,10 +1595,6 @@ def _is_py_requirements_or_dockerfile(path: str) -> bool:
1563
1595
  )
1564
1596
 
1565
1597
 
1566
- def check_windows_valid_filename(path: Union[int, str]) -> bool:
1567
- return not bool(re.search(RE_WINFNAMES, path)) # type: ignore
1568
-
1569
-
1570
1598
  def artifact_to_json(artifact: "Artifact") -> Dict[str, Any]:
1571
1599
  return {
1572
1600
  "_type": "artifactVersion",
wandb/wandb_agent.py CHANGED
@@ -19,6 +19,7 @@ from wandb import util, wandb_lib, wandb_sdk
19
19
  from wandb.agents.pyagent import pyagent
20
20
  from wandb.apis import InternalApi
21
21
  from wandb.sdk.launch.sweeps import utils as sweep_utils
22
+ from wandb.sdk.lib import ipython
22
23
 
23
24
  logger = logging.getLogger(__name__)
24
25
 
@@ -546,7 +547,7 @@ def agent(
546
547
  is a part of, what function to execute, and (optionally) how
547
548
  many agents to run.
548
549
 
549
- Arguments:
550
+ Args:
550
551
  sweep_id: The unique identifier for a sweep. A sweep ID
551
552
  is generated by W&B CLI or Python SDK.
552
553
  function: A function to call instead of the "program"
@@ -568,11 +569,10 @@ def agent(
568
569
  wandb_sdk.wandb_login._login(_silent=True)
569
570
  if function:
570
571
  return pyagent(sweep_id, function, entity, project, count)
571
- in_jupyter = wandb.wandb_sdk.lib.ipython._get_python_type() != "python"
572
572
  return run_agent(
573
573
  sweep_id,
574
574
  function=function,
575
- in_jupyter=in_jupyter,
575
+ in_jupyter=ipython.in_jupyter(),
576
576
  entity=entity,
577
577
  project=project,
578
578
  count=count,
wandb/wandb_controller.py CHANGED
@@ -88,8 +88,6 @@ def _id_generator(size=10, chars=string.ascii_lowercase + string.digits):
88
88
  class ControllerError(Exception):
89
89
  """Base class for sweep errors."""
90
90
 
91
- pass
92
-
93
91
 
94
92
  class _WandbController:
95
93
  """Sweep controller class.
@@ -309,6 +307,8 @@ class _WandbController:
309
307
  self._create["parameters"][name]["value"] = value
310
308
  if values is not None:
311
309
  self._create["parameters"][name]["values"] = values
310
+ if distribution is not None:
311
+ self._create["parameters"][name]["distribution"] = distribution
312
312
  if min is not None:
313
313
  self._create["parameters"][name]["min"] = min
314
314
  if max is not None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: wandb
3
- Version: 0.18.5
3
+ Version: 0.18.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