wandb 0.21.2__py3-none-macosx_12_0_x86_64.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.
- package_readme.md +97 -0
- wandb/__init__.py +248 -0
- wandb/__init__.pyi +1230 -0
- wandb/__main__.py +3 -0
- wandb/_iterutils.py +65 -0
- wandb/_pydantic/__init__.py +30 -0
- wandb/_pydantic/base.py +128 -0
- wandb/_pydantic/utils.py +80 -0
- wandb/_pydantic/v1_compat.py +284 -0
- wandb/agents/__init__.py +0 -0
- wandb/agents/pyagent.py +386 -0
- wandb/analytics/__init__.py +3 -0
- wandb/analytics/sentry.py +267 -0
- wandb/apis/__init__.py +48 -0
- wandb/apis/attrs.py +50 -0
- wandb/apis/importers/__init__.py +1 -0
- wandb/apis/importers/internals/internal.py +382 -0
- wandb/apis/importers/internals/protocols.py +103 -0
- wandb/apis/importers/internals/util.py +78 -0
- wandb/apis/importers/mlflow.py +254 -0
- wandb/apis/importers/validation.py +108 -0
- wandb/apis/importers/wandb.py +1608 -0
- wandb/apis/internal.py +239 -0
- wandb/apis/normalize.py +81 -0
- wandb/apis/paginator.py +138 -0
- wandb/apis/public/__init__.py +35 -0
- wandb/apis/public/api.py +2449 -0
- wandb/apis/public/artifacts.py +1046 -0
- wandb/apis/public/automations.py +85 -0
- wandb/apis/public/const.py +4 -0
- wandb/apis/public/files.py +402 -0
- wandb/apis/public/history.py +201 -0
- wandb/apis/public/integrations.py +203 -0
- wandb/apis/public/jobs.py +742 -0
- wandb/apis/public/projects.py +276 -0
- wandb/apis/public/query_generator.py +176 -0
- wandb/apis/public/registries/__init__.py +0 -0
- wandb/apis/public/registries/_freezable_list.py +179 -0
- wandb/apis/public/registries/_utils.py +138 -0
- wandb/apis/public/registries/registries_search.py +347 -0
- wandb/apis/public/registries/registry.py +358 -0
- wandb/apis/public/reports.py +595 -0
- wandb/apis/public/runs.py +1216 -0
- wandb/apis/public/sweeps.py +440 -0
- wandb/apis/public/teams.py +235 -0
- wandb/apis/public/users.py +177 -0
- wandb/apis/public/utils.py +210 -0
- wandb/apis/reports/__init__.py +1 -0
- wandb/apis/reports/v1/__init__.py +8 -0
- wandb/apis/reports/v2/__init__.py +8 -0
- wandb/apis/workspaces/__init__.py +8 -0
- wandb/automations/__init__.py +73 -0
- wandb/automations/_filters/__init__.py +40 -0
- wandb/automations/_filters/expressions.py +181 -0
- wandb/automations/_filters/operators.py +258 -0
- wandb/automations/_filters/run_metrics.py +330 -0
- wandb/automations/_generated/__init__.py +177 -0
- wandb/automations/_generated/create_automation.py +17 -0
- wandb/automations/_generated/create_generic_webhook_integration.py +43 -0
- wandb/automations/_generated/delete_automation.py +15 -0
- wandb/automations/_generated/enums.py +35 -0
- wandb/automations/_generated/fragments.py +358 -0
- wandb/automations/_generated/generic_webhook_integrations_by_entity.py +22 -0
- wandb/automations/_generated/get_automations.py +24 -0
- wandb/automations/_generated/get_automations_by_entity.py +26 -0
- wandb/automations/_generated/input_types.py +104 -0
- wandb/automations/_generated/integrations_by_entity.py +22 -0
- wandb/automations/_generated/operations.py +647 -0
- wandb/automations/_generated/slack_integrations_by_entity.py +22 -0
- wandb/automations/_generated/update_automation.py +17 -0
- wandb/automations/_utils.py +235 -0
- wandb/automations/_validators.py +165 -0
- wandb/automations/actions.py +218 -0
- wandb/automations/automations.py +85 -0
- wandb/automations/events.py +285 -0
- wandb/automations/integrations.py +45 -0
- wandb/automations/scopes.py +78 -0
- wandb/beta/workflows.py +324 -0
- wandb/bin/gpu_stats +0 -0
- wandb/bin/wandb-core +0 -0
- wandb/cli/__init__.py +0 -0
- wandb/cli/beta.py +175 -0
- wandb/cli/cli.py +2883 -0
- wandb/data_types.py +66 -0
- wandb/docker/__init__.py +290 -0
- wandb/docker/names.py +40 -0
- wandb/docker/wandb-entrypoint.sh +33 -0
- wandb/env.py +535 -0
- wandb/errors/__init__.py +17 -0
- wandb/errors/errors.py +40 -0
- wandb/errors/links.py +73 -0
- wandb/errors/term.py +415 -0
- wandb/errors/util.py +57 -0
- wandb/errors/warnings.py +2 -0
- wandb/filesync/__init__.py +0 -0
- wandb/filesync/dir_watcher.py +404 -0
- wandb/filesync/stats.py +100 -0
- wandb/filesync/step_checksum.py +142 -0
- wandb/filesync/step_prepare.py +179 -0
- wandb/filesync/step_upload.py +287 -0
- wandb/filesync/upload_job.py +142 -0
- wandb/integration/__init__.py +0 -0
- wandb/integration/catboost/__init__.py +5 -0
- wandb/integration/catboost/catboost.py +182 -0
- wandb/integration/cohere/__init__.py +3 -0
- wandb/integration/cohere/cohere.py +21 -0
- wandb/integration/cohere/resolver.py +347 -0
- wandb/integration/diffusers/__init__.py +3 -0
- wandb/integration/diffusers/autologger.py +76 -0
- wandb/integration/diffusers/pipeline_resolver.py +50 -0
- wandb/integration/diffusers/resolvers/__init__.py +9 -0
- wandb/integration/diffusers/resolvers/multimodal.py +881 -0
- wandb/integration/diffusers/resolvers/utils.py +102 -0
- wandb/integration/fastai/__init__.py +243 -0
- wandb/integration/gym/__init__.py +98 -0
- wandb/integration/huggingface/__init__.py +3 -0
- wandb/integration/huggingface/huggingface.py +18 -0
- wandb/integration/huggingface/resolver.py +213 -0
- wandb/integration/keras/__init__.py +11 -0
- wandb/integration/keras/callbacks/__init__.py +5 -0
- wandb/integration/keras/callbacks/metrics_logger.py +129 -0
- wandb/integration/keras/callbacks/model_checkpoint.py +188 -0
- wandb/integration/keras/callbacks/tables_builder.py +228 -0
- wandb/integration/keras/keras.py +1086 -0
- wandb/integration/kfp/__init__.py +6 -0
- wandb/integration/kfp/helpers.py +28 -0
- wandb/integration/kfp/kfp_patch.py +335 -0
- wandb/integration/kfp/wandb_logging.py +182 -0
- wandb/integration/langchain/__init__.py +3 -0
- wandb/integration/langchain/wandb_tracer.py +49 -0
- wandb/integration/lightgbm/__init__.py +239 -0
- wandb/integration/lightning/__init__.py +0 -0
- wandb/integration/lightning/fabric/__init__.py +3 -0
- wandb/integration/lightning/fabric/logger.py +763 -0
- wandb/integration/metaflow/__init__.py +9 -0
- wandb/integration/metaflow/data_pandas.py +74 -0
- wandb/integration/metaflow/data_pytorch.py +75 -0
- wandb/integration/metaflow/data_sklearn.py +76 -0
- wandb/integration/metaflow/errors.py +13 -0
- wandb/integration/metaflow/metaflow.py +327 -0
- wandb/integration/openai/__init__.py +3 -0
- wandb/integration/openai/fine_tuning.py +480 -0
- wandb/integration/openai/openai.py +22 -0
- wandb/integration/openai/resolver.py +240 -0
- wandb/integration/prodigy/__init__.py +3 -0
- wandb/integration/prodigy/prodigy.py +291 -0
- wandb/integration/sacred/__init__.py +117 -0
- wandb/integration/sagemaker/__init__.py +14 -0
- wandb/integration/sagemaker/auth.py +29 -0
- wandb/integration/sagemaker/config.py +58 -0
- wandb/integration/sagemaker/files.py +2 -0
- wandb/integration/sagemaker/resources.py +63 -0
- wandb/integration/sb3/__init__.py +3 -0
- wandb/integration/sb3/sb3.py +147 -0
- wandb/integration/sklearn/__init__.py +37 -0
- wandb/integration/sklearn/calculate/__init__.py +32 -0
- wandb/integration/sklearn/calculate/calibration_curves.py +125 -0
- wandb/integration/sklearn/calculate/class_proportions.py +68 -0
- wandb/integration/sklearn/calculate/confusion_matrix.py +93 -0
- wandb/integration/sklearn/calculate/decision_boundaries.py +40 -0
- wandb/integration/sklearn/calculate/elbow_curve.py +55 -0
- wandb/integration/sklearn/calculate/feature_importances.py +67 -0
- wandb/integration/sklearn/calculate/learning_curve.py +64 -0
- wandb/integration/sklearn/calculate/outlier_candidates.py +69 -0
- wandb/integration/sklearn/calculate/residuals.py +86 -0
- wandb/integration/sklearn/calculate/silhouette.py +118 -0
- wandb/integration/sklearn/calculate/summary_metrics.py +62 -0
- wandb/integration/sklearn/plot/__init__.py +35 -0
- wandb/integration/sklearn/plot/classifier.py +329 -0
- wandb/integration/sklearn/plot/clusterer.py +146 -0
- wandb/integration/sklearn/plot/regressor.py +121 -0
- wandb/integration/sklearn/plot/shared.py +91 -0
- wandb/integration/sklearn/utils.py +184 -0
- wandb/integration/tensorboard/__init__.py +10 -0
- wandb/integration/tensorboard/log.py +351 -0
- wandb/integration/tensorboard/monkeypatch.py +186 -0
- wandb/integration/tensorflow/__init__.py +5 -0
- wandb/integration/tensorflow/estimator_hook.py +54 -0
- wandb/integration/torch/__init__.py +0 -0
- wandb/integration/torch/wandb_torch.py +554 -0
- wandb/integration/ultralytics/__init__.py +11 -0
- wandb/integration/ultralytics/bbox_utils.py +215 -0
- wandb/integration/ultralytics/callback.py +528 -0
- wandb/integration/ultralytics/classification_utils.py +83 -0
- wandb/integration/ultralytics/mask_utils.py +202 -0
- wandb/integration/ultralytics/pose_utils.py +103 -0
- wandb/integration/weave/__init__.py +6 -0
- wandb/integration/weave/interface.py +49 -0
- wandb/integration/weave/weave.py +63 -0
- wandb/integration/xgboost/__init__.py +11 -0
- wandb/integration/xgboost/xgboost.py +189 -0
- wandb/integration/yolov8/__init__.py +0 -0
- wandb/integration/yolov8/yolov8.py +284 -0
- wandb/jupyter.py +538 -0
- wandb/mpmain/__init__.py +0 -0
- wandb/mpmain/__main__.py +1 -0
- wandb/old/__init__.py +0 -0
- wandb/old/core.py +53 -0
- wandb/old/settings.py +176 -0
- wandb/old/summary.py +438 -0
- wandb/plot/__init__.py +30 -0
- wandb/plot/bar.py +71 -0
- wandb/plot/confusion_matrix.py +185 -0
- wandb/plot/custom_chart.py +147 -0
- wandb/plot/histogram.py +66 -0
- wandb/plot/line.py +75 -0
- wandb/plot/line_series.py +173 -0
- wandb/plot/pr_curve.py +186 -0
- wandb/plot/roc_curve.py +163 -0
- wandb/plot/scatter.py +66 -0
- wandb/plot/utils.py +184 -0
- wandb/plot/viz.py +41 -0
- wandb/proto/__init__.py +0 -0
- wandb/proto/v3/__init__.py +0 -0
- wandb/proto/v3/wandb_base_pb2.py +55 -0
- wandb/proto/v3/wandb_internal_pb2.py +1728 -0
- wandb/proto/v3/wandb_server_pb2.py +228 -0
- wandb/proto/v3/wandb_settings_pb2.py +122 -0
- wandb/proto/v3/wandb_telemetry_pb2.py +106 -0
- wandb/proto/v4/__init__.py +0 -0
- wandb/proto/v4/wandb_base_pb2.py +30 -0
- wandb/proto/v4/wandb_internal_pb2.py +382 -0
- wandb/proto/v4/wandb_server_pb2.py +67 -0
- wandb/proto/v4/wandb_settings_pb2.py +47 -0
- wandb/proto/v4/wandb_telemetry_pb2.py +41 -0
- wandb/proto/v5/wandb_base_pb2.py +31 -0
- wandb/proto/v5/wandb_internal_pb2.py +383 -0
- wandb/proto/v5/wandb_server_pb2.py +68 -0
- wandb/proto/v5/wandb_settings_pb2.py +48 -0
- wandb/proto/v5/wandb_telemetry_pb2.py +42 -0
- wandb/proto/v6/wandb_base_pb2.py +41 -0
- wandb/proto/v6/wandb_internal_pb2.py +393 -0
- wandb/proto/v6/wandb_server_pb2.py +78 -0
- wandb/proto/v6/wandb_settings_pb2.py +58 -0
- wandb/proto/v6/wandb_telemetry_pb2.py +52 -0
- wandb/proto/wandb_base_pb2.py +12 -0
- wandb/proto/wandb_deprecated.py +59 -0
- wandb/proto/wandb_generate_deprecated.py +30 -0
- wandb/proto/wandb_generate_proto.py +49 -0
- wandb/proto/wandb_internal_pb2.py +18 -0
- wandb/proto/wandb_server_pb2.py +12 -0
- wandb/proto/wandb_settings_pb2.py +12 -0
- wandb/proto/wandb_telemetry_pb2.py +12 -0
- wandb/py.typed +0 -0
- wandb/sdk/__init__.py +37 -0
- wandb/sdk/artifacts/__init__.py +0 -0
- wandb/sdk/artifacts/_factories.py +17 -0
- wandb/sdk/artifacts/_generated/__init__.py +508 -0
- wandb/sdk/artifacts/_generated/add_aliases.py +21 -0
- wandb/sdk/artifacts/_generated/artifact_by_id.py +17 -0
- wandb/sdk/artifacts/_generated/artifact_by_name.py +22 -0
- wandb/sdk/artifacts/_generated/artifact_collection_membership_file_urls.py +43 -0
- wandb/sdk/artifacts/_generated/artifact_collection_membership_files.py +43 -0
- wandb/sdk/artifacts/_generated/artifact_created_by.py +47 -0
- wandb/sdk/artifacts/_generated/artifact_file_urls.py +22 -0
- wandb/sdk/artifacts/_generated/artifact_type.py +31 -0
- wandb/sdk/artifacts/_generated/artifact_used_by.py +43 -0
- wandb/sdk/artifacts/_generated/artifact_version_files.py +36 -0
- wandb/sdk/artifacts/_generated/artifact_via_membership_by_name.py +26 -0
- wandb/sdk/artifacts/_generated/create_artifact_collection_tag_assignments.py +36 -0
- wandb/sdk/artifacts/_generated/delete_aliases.py +21 -0
- wandb/sdk/artifacts/_generated/delete_artifact.py +28 -0
- wandb/sdk/artifacts/_generated/delete_artifact_collection_tag_assignments.py +25 -0
- wandb/sdk/artifacts/_generated/delete_artifact_portfolio.py +35 -0
- wandb/sdk/artifacts/_generated/delete_artifact_sequence.py +35 -0
- wandb/sdk/artifacts/_generated/enums.py +22 -0
- wandb/sdk/artifacts/_generated/fetch_artifact_manifest.py +38 -0
- wandb/sdk/artifacts/_generated/fetch_linked_artifacts.py +67 -0
- wandb/sdk/artifacts/_generated/fetch_registries.py +32 -0
- wandb/sdk/artifacts/_generated/fragments.py +459 -0
- wandb/sdk/artifacts/_generated/input_types.py +46 -0
- wandb/sdk/artifacts/_generated/link_artifact.py +27 -0
- wandb/sdk/artifacts/_generated/move_artifact_collection.py +35 -0
- wandb/sdk/artifacts/_generated/operations.py +1223 -0
- wandb/sdk/artifacts/_generated/project_artifact_collection.py +101 -0
- wandb/sdk/artifacts/_generated/project_artifact_collections.py +33 -0
- wandb/sdk/artifacts/_generated/project_artifact_type.py +24 -0
- wandb/sdk/artifacts/_generated/project_artifact_types.py +24 -0
- wandb/sdk/artifacts/_generated/project_artifacts.py +42 -0
- wandb/sdk/artifacts/_generated/registry_collections.py +34 -0
- wandb/sdk/artifacts/_generated/registry_versions.py +34 -0
- wandb/sdk/artifacts/_generated/run_input_artifacts.py +51 -0
- wandb/sdk/artifacts/_generated/run_output_artifacts.py +51 -0
- wandb/sdk/artifacts/_generated/unlink_artifact.py +25 -0
- wandb/sdk/artifacts/_generated/update_artifact.py +26 -0
- wandb/sdk/artifacts/_generated/update_artifact_portfolio.py +35 -0
- wandb/sdk/artifacts/_generated/update_artifact_sequence.py +35 -0
- wandb/sdk/artifacts/_graphql_fragments.py +19 -0
- wandb/sdk/artifacts/_internal_artifact.py +54 -0
- wandb/sdk/artifacts/_validators.py +309 -0
- wandb/sdk/artifacts/artifact.py +2702 -0
- wandb/sdk/artifacts/artifact_download_logger.py +45 -0
- wandb/sdk/artifacts/artifact_file_cache.py +251 -0
- wandb/sdk/artifacts/artifact_instance_cache.py +17 -0
- wandb/sdk/artifacts/artifact_manifest.py +76 -0
- wandb/sdk/artifacts/artifact_manifest_entry.py +258 -0
- wandb/sdk/artifacts/artifact_manifests/__init__.py +0 -0
- wandb/sdk/artifacts/artifact_manifests/artifact_manifest_v1.py +94 -0
- wandb/sdk/artifacts/artifact_saver.py +277 -0
- wandb/sdk/artifacts/artifact_state.py +13 -0
- wandb/sdk/artifacts/artifact_ttl.py +9 -0
- wandb/sdk/artifacts/exceptions.py +71 -0
- wandb/sdk/artifacts/staging.py +27 -0
- wandb/sdk/artifacts/storage_handler.py +62 -0
- wandb/sdk/artifacts/storage_handlers/__init__.py +0 -0
- wandb/sdk/artifacts/storage_handlers/azure_handler.py +214 -0
- wandb/sdk/artifacts/storage_handlers/gcs_handler.py +224 -0
- wandb/sdk/artifacts/storage_handlers/http_handler.py +114 -0
- wandb/sdk/artifacts/storage_handlers/local_file_handler.py +142 -0
- wandb/sdk/artifacts/storage_handlers/multi_handler.py +56 -0
- wandb/sdk/artifacts/storage_handlers/s3_handler.py +339 -0
- wandb/sdk/artifacts/storage_handlers/tracking_handler.py +68 -0
- wandb/sdk/artifacts/storage_handlers/wb_artifact_handler.py +131 -0
- wandb/sdk/artifacts/storage_handlers/wb_local_artifact_handler.py +74 -0
- wandb/sdk/artifacts/storage_layout.py +8 -0
- wandb/sdk/artifacts/storage_policies/__init__.py +4 -0
- wandb/sdk/artifacts/storage_policies/register.py +1 -0
- wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +580 -0
- wandb/sdk/artifacts/storage_policy.py +75 -0
- wandb/sdk/backend/__init__.py +0 -0
- wandb/sdk/backend/backend.py +57 -0
- wandb/sdk/data_types/__init__.py +0 -0
- wandb/sdk/data_types/_dtypes.py +914 -0
- wandb/sdk/data_types/_private.py +10 -0
- wandb/sdk/data_types/audio.py +208 -0
- wandb/sdk/data_types/base_types/__init__.py +0 -0
- wandb/sdk/data_types/base_types/json_metadata.py +55 -0
- wandb/sdk/data_types/base_types/media.py +339 -0
- wandb/sdk/data_types/base_types/wb_value.py +295 -0
- wandb/sdk/data_types/bokeh.py +87 -0
- wandb/sdk/data_types/graph.py +439 -0
- wandb/sdk/data_types/helper_types/__init__.py +0 -0
- wandb/sdk/data_types/helper_types/bounding_boxes_2d.py +327 -0
- wandb/sdk/data_types/helper_types/classes.py +159 -0
- wandb/sdk/data_types/helper_types/image_mask.py +251 -0
- wandb/sdk/data_types/histogram.py +107 -0
- wandb/sdk/data_types/html.py +165 -0
- wandb/sdk/data_types/image.py +974 -0
- wandb/sdk/data_types/molecule.py +250 -0
- wandb/sdk/data_types/object_3d.py +495 -0
- wandb/sdk/data_types/plotly.py +95 -0
- wandb/sdk/data_types/saved_model.py +435 -0
- wandb/sdk/data_types/table.py +1468 -0
- wandb/sdk/data_types/table_decorators.py +108 -0
- wandb/sdk/data_types/trace_tree.py +440 -0
- wandb/sdk/data_types/utils.py +260 -0
- wandb/sdk/data_types/video.py +303 -0
- wandb/sdk/integration_utils/__init__.py +0 -0
- wandb/sdk/integration_utils/auto_logging.py +232 -0
- wandb/sdk/integration_utils/data_logging.py +475 -0
- wandb/sdk/interface/__init__.py +0 -0
- wandb/sdk/interface/constants.py +4 -0
- wandb/sdk/interface/interface.py +1056 -0
- wandb/sdk/interface/interface_queue.py +40 -0
- wandb/sdk/interface/interface_shared.py +471 -0
- wandb/sdk/interface/interface_sock.py +49 -0
- wandb/sdk/interface/summary_record.py +67 -0
- wandb/sdk/internal/__init__.py +0 -0
- wandb/sdk/internal/_generated/__init__.py +15 -0
- wandb/sdk/internal/_generated/enums.py +4 -0
- wandb/sdk/internal/_generated/input_types.py +4 -0
- wandb/sdk/internal/_generated/operations.py +15 -0
- wandb/sdk/internal/_generated/server_features_query.py +27 -0
- wandb/sdk/internal/context.py +89 -0
- wandb/sdk/internal/datastore.py +293 -0
- wandb/sdk/internal/file_pusher.py +177 -0
- wandb/sdk/internal/file_stream.py +686 -0
- wandb/sdk/internal/handler.py +854 -0
- wandb/sdk/internal/incremental_table_util.py +53 -0
- wandb/sdk/internal/internal_api.py +4723 -0
- wandb/sdk/internal/job_builder.py +639 -0
- wandb/sdk/internal/profiler.py +79 -0
- wandb/sdk/internal/progress.py +77 -0
- wandb/sdk/internal/run.py +27 -0
- wandb/sdk/internal/sample.py +70 -0
- wandb/sdk/internal/sender.py +1692 -0
- wandb/sdk/internal/sender_config.py +203 -0
- wandb/sdk/internal/settings_static.py +120 -0
- wandb/sdk/internal/tb_watcher.py +519 -0
- wandb/sdk/internal/thread_local_settings.py +18 -0
- wandb/sdk/launch/__init__.py +15 -0
- wandb/sdk/launch/_launch.py +331 -0
- wandb/sdk/launch/_launch_add.py +255 -0
- wandb/sdk/launch/_project_spec.py +565 -0
- wandb/sdk/launch/agent/__init__.py +5 -0
- wandb/sdk/launch/agent/agent.py +931 -0
- wandb/sdk/launch/agent/config.py +296 -0
- wandb/sdk/launch/agent/job_status_tracker.py +55 -0
- wandb/sdk/launch/agent/run_queue_item_file_saver.py +39 -0
- wandb/sdk/launch/builder/__init__.py +0 -0
- wandb/sdk/launch/builder/abstract.py +156 -0
- wandb/sdk/launch/builder/build.py +296 -0
- wandb/sdk/launch/builder/context_manager.py +235 -0
- wandb/sdk/launch/builder/docker_builder.py +177 -0
- wandb/sdk/launch/builder/kaniko_builder.py +595 -0
- wandb/sdk/launch/builder/noop.py +58 -0
- wandb/sdk/launch/builder/templates/_wandb_bootstrap.py +188 -0
- wandb/sdk/launch/builder/templates/dockerfile.py +92 -0
- wandb/sdk/launch/create_job.py +541 -0
- wandb/sdk/launch/environment/abstract.py +29 -0
- wandb/sdk/launch/environment/aws_environment.py +322 -0
- wandb/sdk/launch/environment/azure_environment.py +105 -0
- wandb/sdk/launch/environment/gcp_environment.py +334 -0
- wandb/sdk/launch/environment/local_environment.py +65 -0
- wandb/sdk/launch/errors.py +13 -0
- wandb/sdk/launch/git_reference.py +109 -0
- wandb/sdk/launch/inputs/files.py +148 -0
- wandb/sdk/launch/inputs/internal.py +314 -0
- wandb/sdk/launch/inputs/manage.py +113 -0
- wandb/sdk/launch/inputs/schema.py +40 -0
- wandb/sdk/launch/loader.py +249 -0
- wandb/sdk/launch/registry/abstract.py +48 -0
- wandb/sdk/launch/registry/anon.py +29 -0
- wandb/sdk/launch/registry/azure_container_registry.py +124 -0
- wandb/sdk/launch/registry/elastic_container_registry.py +192 -0
- wandb/sdk/launch/registry/google_artifact_registry.py +219 -0
- wandb/sdk/launch/registry/local_registry.py +65 -0
- wandb/sdk/launch/runner/__init__.py +0 -0
- wandb/sdk/launch/runner/abstract.py +185 -0
- wandb/sdk/launch/runner/kubernetes_monitor.py +473 -0
- wandb/sdk/launch/runner/kubernetes_runner.py +1285 -0
- wandb/sdk/launch/runner/local_container.py +301 -0
- wandb/sdk/launch/runner/local_process.py +78 -0
- wandb/sdk/launch/runner/sagemaker_runner.py +424 -0
- wandb/sdk/launch/runner/vertex_runner.py +225 -0
- wandb/sdk/launch/sweeps/__init__.py +37 -0
- wandb/sdk/launch/sweeps/scheduler.py +739 -0
- wandb/sdk/launch/sweeps/scheduler_sweep.py +90 -0
- wandb/sdk/launch/sweeps/utils.py +324 -0
- wandb/sdk/launch/utils.py +746 -0
- wandb/sdk/launch/wandb_reference.py +138 -0
- wandb/sdk/lib/__init__.py +5 -0
- wandb/sdk/lib/apikey.py +334 -0
- wandb/sdk/lib/asyncio_compat.py +213 -0
- wandb/sdk/lib/asyncio_manager.py +252 -0
- wandb/sdk/lib/capped_dict.py +26 -0
- wandb/sdk/lib/config_util.py +101 -0
- wandb/sdk/lib/console_capture.py +219 -0
- wandb/sdk/lib/credentials.py +141 -0
- wandb/sdk/lib/deprecate.py +27 -0
- wandb/sdk/lib/disabled.py +30 -0
- wandb/sdk/lib/exit_hooks.py +54 -0
- wandb/sdk/lib/file_stream_utils.py +118 -0
- wandb/sdk/lib/filenames.py +64 -0
- wandb/sdk/lib/filesystem.py +372 -0
- wandb/sdk/lib/fsm.py +165 -0
- wandb/sdk/lib/gitlib.py +240 -0
- wandb/sdk/lib/gql_request.py +65 -0
- wandb/sdk/lib/handler_util.py +21 -0
- wandb/sdk/lib/hashutil.py +106 -0
- wandb/sdk/lib/import_hooks.py +275 -0
- wandb/sdk/lib/interrupt.py +37 -0
- wandb/sdk/lib/ipython.py +126 -0
- wandb/sdk/lib/json_util.py +75 -0
- wandb/sdk/lib/lazyloader.py +63 -0
- wandb/sdk/lib/module.py +72 -0
- wandb/sdk/lib/paths.py +106 -0
- wandb/sdk/lib/preinit.py +42 -0
- wandb/sdk/lib/printer.py +571 -0
- wandb/sdk/lib/printer_asyncio.py +48 -0
- wandb/sdk/lib/progress.py +320 -0
- wandb/sdk/lib/proto_util.py +90 -0
- wandb/sdk/lib/redirect.py +876 -0
- wandb/sdk/lib/retry.py +395 -0
- wandb/sdk/lib/run_moment.py +82 -0
- wandb/sdk/lib/runid.py +12 -0
- wandb/sdk/lib/server.py +58 -0
- wandb/sdk/lib/service/ipc_support.py +13 -0
- wandb/sdk/lib/service/service_client.py +106 -0
- wandb/sdk/lib/service/service_connection.py +192 -0
- wandb/sdk/lib/service/service_port_file.py +105 -0
- wandb/sdk/lib/service/service_process.py +111 -0
- wandb/sdk/lib/service/service_token.py +181 -0
- wandb/sdk/lib/sparkline.py +44 -0
- wandb/sdk/lib/telemetry.py +100 -0
- wandb/sdk/lib/timed_input.py +133 -0
- wandb/sdk/lib/timer.py +19 -0
- wandb/sdk/lib/wb_logging.py +161 -0
- wandb/sdk/mailbox/__init__.py +23 -0
- wandb/sdk/mailbox/mailbox.py +143 -0
- wandb/sdk/mailbox/mailbox_handle.py +132 -0
- wandb/sdk/mailbox/response_handle.py +99 -0
- wandb/sdk/mailbox/wait_with_progress.py +100 -0
- wandb/sdk/projects/_generated/__init__.py +47 -0
- wandb/sdk/projects/_generated/delete_project.py +22 -0
- wandb/sdk/projects/_generated/enums.py +4 -0
- wandb/sdk/projects/_generated/fetch_registry.py +22 -0
- wandb/sdk/projects/_generated/fragments.py +41 -0
- wandb/sdk/projects/_generated/input_types.py +13 -0
- wandb/sdk/projects/_generated/operations.py +88 -0
- wandb/sdk/projects/_generated/rename_project.py +27 -0
- wandb/sdk/projects/_generated/upsert_registry_project.py +27 -0
- wandb/sdk/verify/__init__.py +0 -0
- wandb/sdk/verify/verify.py +555 -0
- wandb/sdk/wandb_alerts.py +12 -0
- wandb/sdk/wandb_config.py +323 -0
- wandb/sdk/wandb_helper.py +54 -0
- wandb/sdk/wandb_init.py +1581 -0
- wandb/sdk/wandb_login.py +332 -0
- wandb/sdk/wandb_metric.py +112 -0
- wandb/sdk/wandb_require.py +88 -0
- wandb/sdk/wandb_require_helpers.py +44 -0
- wandb/sdk/wandb_run.py +4088 -0
- wandb/sdk/wandb_settings.py +2105 -0
- wandb/sdk/wandb_setup.py +560 -0
- wandb/sdk/wandb_summary.py +150 -0
- wandb/sdk/wandb_sweep.py +120 -0
- wandb/sdk/wandb_sync.py +71 -0
- wandb/sdk/wandb_watch.py +146 -0
- wandb/sklearn.py +35 -0
- wandb/sync/__init__.py +3 -0
- wandb/sync/sync.py +452 -0
- wandb/trigger.py +29 -0
- wandb/util.py +2040 -0
- wandb/vendor/__init__.py +0 -0
- wandb/vendor/gql-0.2.0/setup.py +40 -0
- wandb/vendor/gql-0.2.0/tests/__init__.py +0 -0
- wandb/vendor/gql-0.2.0/tests/starwars/__init__.py +0 -0
- wandb/vendor/gql-0.2.0/tests/starwars/fixtures.py +96 -0
- wandb/vendor/gql-0.2.0/tests/starwars/schema.py +146 -0
- wandb/vendor/gql-0.2.0/tests/starwars/test_dsl.py +293 -0
- wandb/vendor/gql-0.2.0/tests/starwars/test_query.py +355 -0
- wandb/vendor/gql-0.2.0/tests/starwars/test_validation.py +171 -0
- wandb/vendor/gql-0.2.0/tests/test_client.py +31 -0
- wandb/vendor/gql-0.2.0/tests/test_transport.py +89 -0
- wandb/vendor/gql-0.2.0/wandb_gql/__init__.py +4 -0
- wandb/vendor/gql-0.2.0/wandb_gql/client.py +75 -0
- wandb/vendor/gql-0.2.0/wandb_gql/dsl.py +152 -0
- wandb/vendor/gql-0.2.0/wandb_gql/gql.py +10 -0
- wandb/vendor/gql-0.2.0/wandb_gql/transport/__init__.py +0 -0
- wandb/vendor/gql-0.2.0/wandb_gql/transport/http.py +6 -0
- wandb/vendor/gql-0.2.0/wandb_gql/transport/local_schema.py +15 -0
- wandb/vendor/gql-0.2.0/wandb_gql/transport/requests.py +46 -0
- wandb/vendor/gql-0.2.0/wandb_gql/utils.py +21 -0
- wandb/vendor/graphql-core-1.1/setup.py +86 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/__init__.py +287 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/__init__.py +6 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/base.py +42 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/format_error.py +11 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/located_error.py +29 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/syntax_error.py +36 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/__init__.py +26 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/base.py +311 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executor.py +398 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/asyncio.py +53 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/gevent.py +22 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/process.py +32 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/sync.py +7 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/thread.py +35 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/utils.py +6 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/executor.py +66 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/fragment.py +252 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/resolver.py +151 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/utils.py +7 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/middleware.py +57 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/values.py +145 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/graphql.py +60 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/ast.py +1349 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/base.py +19 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/lexer.py +435 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/location.py +30 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/parser.py +779 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/printer.py +193 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/source.py +18 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor.py +222 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor_meta.py +82 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/cached_property.py +17 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/contain_subset.py +28 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/default_ordered_dict.py +40 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/ordereddict.py +8 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/pair_set.py +43 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/version.py +78 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/__init__.py +67 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/definition.py +619 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/directives.py +132 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/introspection.py +440 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/scalars.py +131 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/schema.py +100 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/typemap.py +145 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/assert_valid_name.py +9 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_from_value.py +65 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_code.py +49 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_dict.py +24 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/base.py +75 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_ast_schema.py +291 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_client_schema.py +250 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/concat_ast.py +9 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/extend_schema.py +357 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_field_def.py +27 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_operation_ast.py +21 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/introspection_query.py +90 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_literal_value.py +67 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_value.py +66 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/quoted_or_list.py +21 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/schema_printer.py +168 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/suggestion_list.py +56 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_comparators.py +69 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_from_ast.py +21 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_info.py +149 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/value_from_ast.py +69 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/__init__.py +4 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/__init__.py +79 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/arguments_of_correct_type.py +24 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/base.py +8 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/default_values_of_correct_type.py +44 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fields_on_correct_type.py +113 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fragments_on_composite_types.py +33 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_argument_names.py +70 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_directives.py +97 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_fragment_names.py +19 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_type_names.py +43 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/lone_anonymous_operation.py +23 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_fragment_cycles.py +59 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_undefined_variables.py +36 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_fragments.py +38 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_variables.py +37 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/overlapping_fields_can_be_merged.py +529 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/possible_fragment_spreads.py +44 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/provided_non_null_arguments.py +46 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/scalar_leafs.py +33 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_argument_names.py +32 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_fragment_names.py +28 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_input_field_names.py +33 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_operation_names.py +31 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_variable_names.py +27 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_are_input_types.py +21 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_in_allowed_position.py +53 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/validation.py +158 -0
- wandb/vendor/promise-2.3.0/conftest.py +30 -0
- wandb/vendor/promise-2.3.0/setup.py +64 -0
- wandb/vendor/promise-2.3.0/tests/__init__.py +0 -0
- wandb/vendor/promise-2.3.0/tests/conftest.py +8 -0
- wandb/vendor/promise-2.3.0/tests/test_awaitable.py +32 -0
- wandb/vendor/promise-2.3.0/tests/test_awaitable_35.py +47 -0
- wandb/vendor/promise-2.3.0/tests/test_benchmark.py +116 -0
- wandb/vendor/promise-2.3.0/tests/test_complex_threads.py +23 -0
- wandb/vendor/promise-2.3.0/tests/test_dataloader.py +452 -0
- wandb/vendor/promise-2.3.0/tests/test_dataloader_awaitable_35.py +99 -0
- wandb/vendor/promise-2.3.0/tests/test_dataloader_extra.py +65 -0
- wandb/vendor/promise-2.3.0/tests/test_extra.py +670 -0
- wandb/vendor/promise-2.3.0/tests/test_issues.py +132 -0
- wandb/vendor/promise-2.3.0/tests/test_promise_list.py +70 -0
- wandb/vendor/promise-2.3.0/tests/test_spec.py +584 -0
- wandb/vendor/promise-2.3.0/tests/test_thread_safety.py +115 -0
- wandb/vendor/promise-2.3.0/tests/utils.py +3 -0
- wandb/vendor/promise-2.3.0/wandb_promise/__init__.py +38 -0
- wandb/vendor/promise-2.3.0/wandb_promise/async_.py +135 -0
- wandb/vendor/promise-2.3.0/wandb_promise/compat.py +32 -0
- wandb/vendor/promise-2.3.0/wandb_promise/dataloader.py +326 -0
- wandb/vendor/promise-2.3.0/wandb_promise/iterate_promise.py +12 -0
- wandb/vendor/promise-2.3.0/wandb_promise/promise.py +848 -0
- wandb/vendor/promise-2.3.0/wandb_promise/promise_list.py +151 -0
- wandb/vendor/promise-2.3.0/wandb_promise/pyutils/__init__.py +0 -0
- wandb/vendor/promise-2.3.0/wandb_promise/pyutils/version.py +83 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/__init__.py +0 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/asyncio.py +22 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/gevent.py +21 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/immediate.py +27 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/thread.py +18 -0
- wandb/vendor/promise-2.3.0/wandb_promise/utils.py +56 -0
- wandb/vendor/pygments/__init__.py +90 -0
- wandb/vendor/pygments/cmdline.py +568 -0
- wandb/vendor/pygments/console.py +74 -0
- wandb/vendor/pygments/filter.py +74 -0
- wandb/vendor/pygments/filters/__init__.py +350 -0
- wandb/vendor/pygments/formatter.py +95 -0
- wandb/vendor/pygments/formatters/__init__.py +153 -0
- wandb/vendor/pygments/formatters/_mapping.py +85 -0
- wandb/vendor/pygments/formatters/bbcode.py +109 -0
- wandb/vendor/pygments/formatters/html.py +851 -0
- wandb/vendor/pygments/formatters/img.py +600 -0
- wandb/vendor/pygments/formatters/irc.py +182 -0
- wandb/vendor/pygments/formatters/latex.py +482 -0
- wandb/vendor/pygments/formatters/other.py +160 -0
- wandb/vendor/pygments/formatters/rtf.py +147 -0
- wandb/vendor/pygments/formatters/svg.py +153 -0
- wandb/vendor/pygments/formatters/terminal.py +136 -0
- wandb/vendor/pygments/formatters/terminal256.py +309 -0
- wandb/vendor/pygments/lexer.py +871 -0
- wandb/vendor/pygments/lexers/__init__.py +329 -0
- wandb/vendor/pygments/lexers/_asy_builtins.py +1645 -0
- wandb/vendor/pygments/lexers/_cl_builtins.py +232 -0
- wandb/vendor/pygments/lexers/_cocoa_builtins.py +72 -0
- wandb/vendor/pygments/lexers/_csound_builtins.py +1346 -0
- wandb/vendor/pygments/lexers/_lasso_builtins.py +5327 -0
- wandb/vendor/pygments/lexers/_lua_builtins.py +295 -0
- wandb/vendor/pygments/lexers/_mapping.py +500 -0
- wandb/vendor/pygments/lexers/_mql_builtins.py +1172 -0
- wandb/vendor/pygments/lexers/_openedge_builtins.py +2547 -0
- wandb/vendor/pygments/lexers/_php_builtins.py +4756 -0
- wandb/vendor/pygments/lexers/_postgres_builtins.py +621 -0
- wandb/vendor/pygments/lexers/_scilab_builtins.py +3094 -0
- wandb/vendor/pygments/lexers/_sourcemod_builtins.py +1163 -0
- wandb/vendor/pygments/lexers/_stan_builtins.py +532 -0
- wandb/vendor/pygments/lexers/_stata_builtins.py +419 -0
- wandb/vendor/pygments/lexers/_tsql_builtins.py +1004 -0
- wandb/vendor/pygments/lexers/_vim_builtins.py +1939 -0
- wandb/vendor/pygments/lexers/actionscript.py +240 -0
- wandb/vendor/pygments/lexers/agile.py +24 -0
- wandb/vendor/pygments/lexers/algebra.py +221 -0
- wandb/vendor/pygments/lexers/ambient.py +76 -0
- wandb/vendor/pygments/lexers/ampl.py +87 -0
- wandb/vendor/pygments/lexers/apl.py +101 -0
- wandb/vendor/pygments/lexers/archetype.py +318 -0
- wandb/vendor/pygments/lexers/asm.py +641 -0
- wandb/vendor/pygments/lexers/automation.py +374 -0
- wandb/vendor/pygments/lexers/basic.py +500 -0
- wandb/vendor/pygments/lexers/bibtex.py +160 -0
- wandb/vendor/pygments/lexers/business.py +612 -0
- wandb/vendor/pygments/lexers/c_cpp.py +252 -0
- wandb/vendor/pygments/lexers/c_like.py +541 -0
- wandb/vendor/pygments/lexers/capnproto.py +78 -0
- wandb/vendor/pygments/lexers/chapel.py +102 -0
- wandb/vendor/pygments/lexers/clean.py +288 -0
- wandb/vendor/pygments/lexers/compiled.py +34 -0
- wandb/vendor/pygments/lexers/configs.py +833 -0
- wandb/vendor/pygments/lexers/console.py +114 -0
- wandb/vendor/pygments/lexers/crystal.py +393 -0
- wandb/vendor/pygments/lexers/csound.py +366 -0
- wandb/vendor/pygments/lexers/css.py +689 -0
- wandb/vendor/pygments/lexers/d.py +251 -0
- wandb/vendor/pygments/lexers/dalvik.py +125 -0
- wandb/vendor/pygments/lexers/data.py +555 -0
- wandb/vendor/pygments/lexers/diff.py +165 -0
- wandb/vendor/pygments/lexers/dotnet.py +691 -0
- wandb/vendor/pygments/lexers/dsls.py +878 -0
- wandb/vendor/pygments/lexers/dylan.py +289 -0
- wandb/vendor/pygments/lexers/ecl.py +125 -0
- wandb/vendor/pygments/lexers/eiffel.py +65 -0
- wandb/vendor/pygments/lexers/elm.py +121 -0
- wandb/vendor/pygments/lexers/erlang.py +533 -0
- wandb/vendor/pygments/lexers/esoteric.py +277 -0
- wandb/vendor/pygments/lexers/ezhil.py +69 -0
- wandb/vendor/pygments/lexers/factor.py +344 -0
- wandb/vendor/pygments/lexers/fantom.py +250 -0
- wandb/vendor/pygments/lexers/felix.py +273 -0
- wandb/vendor/pygments/lexers/forth.py +177 -0
- wandb/vendor/pygments/lexers/fortran.py +205 -0
- wandb/vendor/pygments/lexers/foxpro.py +428 -0
- wandb/vendor/pygments/lexers/functional.py +21 -0
- wandb/vendor/pygments/lexers/go.py +101 -0
- wandb/vendor/pygments/lexers/grammar_notation.py +213 -0
- wandb/vendor/pygments/lexers/graph.py +80 -0
- wandb/vendor/pygments/lexers/graphics.py +553 -0
- wandb/vendor/pygments/lexers/haskell.py +843 -0
- wandb/vendor/pygments/lexers/haxe.py +936 -0
- wandb/vendor/pygments/lexers/hdl.py +382 -0
- wandb/vendor/pygments/lexers/hexdump.py +103 -0
- wandb/vendor/pygments/lexers/html.py +602 -0
- wandb/vendor/pygments/lexers/idl.py +270 -0
- wandb/vendor/pygments/lexers/igor.py +288 -0
- wandb/vendor/pygments/lexers/inferno.py +96 -0
- wandb/vendor/pygments/lexers/installers.py +322 -0
- wandb/vendor/pygments/lexers/int_fiction.py +1343 -0
- wandb/vendor/pygments/lexers/iolang.py +63 -0
- wandb/vendor/pygments/lexers/j.py +146 -0
- wandb/vendor/pygments/lexers/javascript.py +1525 -0
- wandb/vendor/pygments/lexers/julia.py +333 -0
- wandb/vendor/pygments/lexers/jvm.py +1573 -0
- wandb/vendor/pygments/lexers/lisp.py +2621 -0
- wandb/vendor/pygments/lexers/make.py +202 -0
- wandb/vendor/pygments/lexers/markup.py +595 -0
- wandb/vendor/pygments/lexers/math.py +21 -0
- wandb/vendor/pygments/lexers/matlab.py +663 -0
- wandb/vendor/pygments/lexers/ml.py +769 -0
- wandb/vendor/pygments/lexers/modeling.py +358 -0
- wandb/vendor/pygments/lexers/modula2.py +1561 -0
- wandb/vendor/pygments/lexers/monte.py +204 -0
- wandb/vendor/pygments/lexers/ncl.py +894 -0
- wandb/vendor/pygments/lexers/nimrod.py +159 -0
- wandb/vendor/pygments/lexers/nit.py +64 -0
- wandb/vendor/pygments/lexers/nix.py +136 -0
- wandb/vendor/pygments/lexers/oberon.py +105 -0
- wandb/vendor/pygments/lexers/objective.py +504 -0
- wandb/vendor/pygments/lexers/ooc.py +85 -0
- wandb/vendor/pygments/lexers/other.py +41 -0
- wandb/vendor/pygments/lexers/parasail.py +79 -0
- wandb/vendor/pygments/lexers/parsers.py +835 -0
- wandb/vendor/pygments/lexers/pascal.py +644 -0
- wandb/vendor/pygments/lexers/pawn.py +199 -0
- wandb/vendor/pygments/lexers/perl.py +620 -0
- wandb/vendor/pygments/lexers/php.py +267 -0
- wandb/vendor/pygments/lexers/praat.py +294 -0
- wandb/vendor/pygments/lexers/prolog.py +306 -0
- wandb/vendor/pygments/lexers/python.py +939 -0
- wandb/vendor/pygments/lexers/qvt.py +152 -0
- wandb/vendor/pygments/lexers/r.py +453 -0
- wandb/vendor/pygments/lexers/rdf.py +270 -0
- wandb/vendor/pygments/lexers/rebol.py +431 -0
- wandb/vendor/pygments/lexers/resource.py +85 -0
- wandb/vendor/pygments/lexers/rnc.py +67 -0
- wandb/vendor/pygments/lexers/roboconf.py +82 -0
- wandb/vendor/pygments/lexers/robotframework.py +560 -0
- wandb/vendor/pygments/lexers/ruby.py +519 -0
- wandb/vendor/pygments/lexers/rust.py +220 -0
- wandb/vendor/pygments/lexers/sas.py +228 -0
- wandb/vendor/pygments/lexers/scripting.py +1222 -0
- wandb/vendor/pygments/lexers/shell.py +794 -0
- wandb/vendor/pygments/lexers/smalltalk.py +195 -0
- wandb/vendor/pygments/lexers/smv.py +79 -0
- wandb/vendor/pygments/lexers/snobol.py +83 -0
- wandb/vendor/pygments/lexers/special.py +103 -0
- wandb/vendor/pygments/lexers/sql.py +681 -0
- wandb/vendor/pygments/lexers/stata.py +108 -0
- wandb/vendor/pygments/lexers/supercollider.py +90 -0
- wandb/vendor/pygments/lexers/tcl.py +145 -0
- wandb/vendor/pygments/lexers/templates.py +2283 -0
- wandb/vendor/pygments/lexers/testing.py +207 -0
- wandb/vendor/pygments/lexers/text.py +25 -0
- wandb/vendor/pygments/lexers/textedit.py +169 -0
- wandb/vendor/pygments/lexers/textfmts.py +297 -0
- wandb/vendor/pygments/lexers/theorem.py +458 -0
- wandb/vendor/pygments/lexers/trafficscript.py +54 -0
- wandb/vendor/pygments/lexers/typoscript.py +226 -0
- wandb/vendor/pygments/lexers/urbi.py +133 -0
- wandb/vendor/pygments/lexers/varnish.py +190 -0
- wandb/vendor/pygments/lexers/verification.py +111 -0
- wandb/vendor/pygments/lexers/web.py +24 -0
- wandb/vendor/pygments/lexers/webmisc.py +988 -0
- wandb/vendor/pygments/lexers/whiley.py +116 -0
- wandb/vendor/pygments/lexers/x10.py +69 -0
- wandb/vendor/pygments/modeline.py +44 -0
- wandb/vendor/pygments/plugin.py +68 -0
- wandb/vendor/pygments/regexopt.py +92 -0
- wandb/vendor/pygments/scanner.py +105 -0
- wandb/vendor/pygments/sphinxext.py +158 -0
- wandb/vendor/pygments/style.py +155 -0
- wandb/vendor/pygments/styles/__init__.py +80 -0
- wandb/vendor/pygments/styles/abap.py +29 -0
- wandb/vendor/pygments/styles/algol.py +63 -0
- wandb/vendor/pygments/styles/algol_nu.py +63 -0
- wandb/vendor/pygments/styles/arduino.py +98 -0
- wandb/vendor/pygments/styles/autumn.py +65 -0
- wandb/vendor/pygments/styles/borland.py +51 -0
- wandb/vendor/pygments/styles/bw.py +49 -0
- wandb/vendor/pygments/styles/colorful.py +81 -0
- wandb/vendor/pygments/styles/default.py +73 -0
- wandb/vendor/pygments/styles/emacs.py +72 -0
- wandb/vendor/pygments/styles/friendly.py +72 -0
- wandb/vendor/pygments/styles/fruity.py +42 -0
- wandb/vendor/pygments/styles/igor.py +29 -0
- wandb/vendor/pygments/styles/lovelace.py +97 -0
- wandb/vendor/pygments/styles/manni.py +75 -0
- wandb/vendor/pygments/styles/monokai.py +106 -0
- wandb/vendor/pygments/styles/murphy.py +80 -0
- wandb/vendor/pygments/styles/native.py +65 -0
- wandb/vendor/pygments/styles/paraiso_dark.py +125 -0
- wandb/vendor/pygments/styles/paraiso_light.py +125 -0
- wandb/vendor/pygments/styles/pastie.py +75 -0
- wandb/vendor/pygments/styles/perldoc.py +69 -0
- wandb/vendor/pygments/styles/rainbow_dash.py +89 -0
- wandb/vendor/pygments/styles/rrt.py +33 -0
- wandb/vendor/pygments/styles/sas.py +44 -0
- wandb/vendor/pygments/styles/stata.py +40 -0
- wandb/vendor/pygments/styles/tango.py +141 -0
- wandb/vendor/pygments/styles/trac.py +63 -0
- wandb/vendor/pygments/styles/vim.py +63 -0
- wandb/vendor/pygments/styles/vs.py +38 -0
- wandb/vendor/pygments/styles/xcode.py +51 -0
- wandb/vendor/pygments/token.py +213 -0
- wandb/vendor/pygments/unistring.py +217 -0
- wandb/vendor/pygments/util.py +388 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/__init__.py +17 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/events.py +615 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/__init__.py +98 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/api.py +369 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents.py +172 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents2.py +239 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify.py +218 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_buffer.py +81 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_c.py +575 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/kqueue.py +730 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/polling.py +145 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/read_directory_changes.py +133 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/winapi.py +348 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/patterns.py +265 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/tricks/__init__.py +174 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/__init__.py +151 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/bricks.py +249 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/compat.py +29 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/decorators.py +198 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/delayed_queue.py +88 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/dirsnapshot.py +293 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/echo.py +157 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/event_backport.py +41 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/importlib2.py +40 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/platform.py +57 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/unicode_paths.py +64 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/win32stat.py +123 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/version.py +28 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/watchmedo.py +577 -0
- wandb/wandb_agent.py +580 -0
- wandb/wandb_controller.py +719 -0
- wandb/wandb_run.py +8 -0
- wandb-0.21.2.dist-info/METADATA +223 -0
- wandb-0.21.2.dist-info/RECORD +904 -0
- wandb-0.21.2.dist-info/WHEEL +4 -0
- wandb-0.21.2.dist-info/entry_points.txt +3 -0
- wandb-0.21.2.dist-info/licenses/LICENSE +21 -0
wandb/sdk/lib/retry.py
ADDED
@@ -0,0 +1,395 @@
|
|
1
|
+
import abc
|
2
|
+
import asyncio
|
3
|
+
import datetime
|
4
|
+
import functools
|
5
|
+
import logging
|
6
|
+
import os
|
7
|
+
import random
|
8
|
+
import threading
|
9
|
+
import time
|
10
|
+
from typing import Any, Awaitable, Callable, Generic, Optional, Tuple, Type, TypeVar
|
11
|
+
|
12
|
+
from requests import HTTPError
|
13
|
+
|
14
|
+
import wandb
|
15
|
+
import wandb.errors
|
16
|
+
from wandb.util import CheckRetryFnType
|
17
|
+
|
18
|
+
logger = logging.getLogger(__name__)
|
19
|
+
|
20
|
+
|
21
|
+
# To let tests mock out the retry logic's now()/sleep() funcs, this file
|
22
|
+
# should only use these variables, not call the stdlib funcs directly.
|
23
|
+
NOW_FN = datetime.datetime.now
|
24
|
+
SLEEP_FN = time.sleep
|
25
|
+
SLEEP_ASYNC_FN = asyncio.sleep
|
26
|
+
|
27
|
+
|
28
|
+
class RetryCancelledError(wandb.errors.Error):
|
29
|
+
"""A retry did not occur because it was cancelled."""
|
30
|
+
|
31
|
+
|
32
|
+
class TransientError(Exception):
|
33
|
+
"""Exception type designated for errors that may only be temporary.
|
34
|
+
|
35
|
+
Can have its own message and/or wrap another exception.
|
36
|
+
"""
|
37
|
+
|
38
|
+
def __init__(
|
39
|
+
self, msg: Optional[str] = None, exc: Optional[BaseException] = None
|
40
|
+
) -> None:
|
41
|
+
super().__init__(msg)
|
42
|
+
self.message = msg
|
43
|
+
self.exception = exc
|
44
|
+
|
45
|
+
|
46
|
+
_R = TypeVar("_R")
|
47
|
+
|
48
|
+
|
49
|
+
class Retry(Generic[_R]):
|
50
|
+
"""Create a retryable version of a function.
|
51
|
+
|
52
|
+
Calling this will call the passed function, retrying if any exceptions in
|
53
|
+
retryable_exceptions are caught, with exponential backoff.
|
54
|
+
"""
|
55
|
+
|
56
|
+
MAX_SLEEP_SECONDS = 5 * 60
|
57
|
+
|
58
|
+
def __init__(
|
59
|
+
self,
|
60
|
+
call_fn: Callable[..., _R],
|
61
|
+
retry_timedelta: Optional[datetime.timedelta] = None,
|
62
|
+
retry_cancel_event: Optional[threading.Event] = None,
|
63
|
+
num_retries: Optional[int] = None,
|
64
|
+
check_retry_fn: CheckRetryFnType = lambda e: True,
|
65
|
+
retryable_exceptions: Optional[Tuple[Type[Exception], ...]] = None,
|
66
|
+
error_prefix: str = "Network error",
|
67
|
+
retry_callback: Optional[Callable[[int, str], Any]] = None,
|
68
|
+
) -> None:
|
69
|
+
self._call_fn = call_fn
|
70
|
+
self._check_retry_fn = check_retry_fn
|
71
|
+
self._error_prefix = error_prefix
|
72
|
+
self._last_print = datetime.datetime.now() - datetime.timedelta(minutes=1)
|
73
|
+
self._retry_timedelta = retry_timedelta
|
74
|
+
self._retry_cancel_event = retry_cancel_event
|
75
|
+
self._num_retries = num_retries
|
76
|
+
if retryable_exceptions is not None:
|
77
|
+
self._retryable_exceptions = retryable_exceptions
|
78
|
+
else:
|
79
|
+
self._retryable_exceptions = (TransientError,)
|
80
|
+
self._index = 0
|
81
|
+
self.retry_callback = retry_callback
|
82
|
+
|
83
|
+
def _sleep_check_cancelled(
|
84
|
+
self, wait_seconds: float, cancel_event: Optional[threading.Event]
|
85
|
+
) -> bool:
|
86
|
+
if not cancel_event:
|
87
|
+
SLEEP_FN(wait_seconds)
|
88
|
+
return False
|
89
|
+
cancelled = cancel_event.wait(wait_seconds)
|
90
|
+
return cancelled
|
91
|
+
|
92
|
+
@property
|
93
|
+
def num_iters(self) -> int:
|
94
|
+
"""The number of iterations the previous __call__ retried."""
|
95
|
+
return self._num_iter
|
96
|
+
|
97
|
+
def __call__(
|
98
|
+
self,
|
99
|
+
*args: Any,
|
100
|
+
num_retries: Optional[int] = None,
|
101
|
+
retry_timedelta: Optional[datetime.timedelta] = None,
|
102
|
+
retry_sleep_base: Optional[float] = None,
|
103
|
+
retry_cancel_event: Optional[threading.Event] = None,
|
104
|
+
check_retry_fn: Optional[CheckRetryFnType] = None,
|
105
|
+
**kwargs: Any,
|
106
|
+
) -> _R:
|
107
|
+
"""Call the wrapped function, with retries.
|
108
|
+
|
109
|
+
Args:
|
110
|
+
num_retries: The number of retries after which to give up.
|
111
|
+
retry_timedelta: An amount of time after which to give up.
|
112
|
+
retry_sleep_base: Number of seconds to sleep for the first retry.
|
113
|
+
This is used as the base for exponential backoff.
|
114
|
+
retry_cancel_event: An event that causes this to raise
|
115
|
+
a RetryCancelledException on the next attempted retry.
|
116
|
+
check_retry_fn: A custom check for deciding whether an exception
|
117
|
+
should be retried. Retrying is prevented if this returns a falsy
|
118
|
+
value, even if more retries are left. This may also return a
|
119
|
+
timedelta that represents a shorter timeout: retrying is
|
120
|
+
prevented if the value is less than the amount of time that has
|
121
|
+
passed since the last timedelta was returned.
|
122
|
+
"""
|
123
|
+
if os.environ.get("WANDB_TEST"):
|
124
|
+
max_retries = 0
|
125
|
+
elif num_retries is not None:
|
126
|
+
max_retries = num_retries
|
127
|
+
elif self._num_retries is not None:
|
128
|
+
max_retries = self._num_retries
|
129
|
+
else:
|
130
|
+
max_retries = 1000000
|
131
|
+
|
132
|
+
if retry_timedelta is not None:
|
133
|
+
timeout = retry_timedelta
|
134
|
+
elif self._retry_timedelta is not None:
|
135
|
+
timeout = self._retry_timedelta
|
136
|
+
else:
|
137
|
+
timeout = datetime.timedelta(days=365)
|
138
|
+
|
139
|
+
if retry_sleep_base is not None:
|
140
|
+
initial_sleep = retry_sleep_base
|
141
|
+
else:
|
142
|
+
initial_sleep = 1
|
143
|
+
|
144
|
+
retry_loop = _RetryLoop(
|
145
|
+
max_retries=max_retries,
|
146
|
+
timeout=timeout,
|
147
|
+
initial_sleep=initial_sleep,
|
148
|
+
max_sleep=self.MAX_SLEEP_SECONDS,
|
149
|
+
cancel_event=retry_cancel_event or self._retry_cancel_event,
|
150
|
+
retry_check=check_retry_fn or self._check_retry_fn,
|
151
|
+
)
|
152
|
+
|
153
|
+
start_time = NOW_FN()
|
154
|
+
self._num_iter = 0
|
155
|
+
|
156
|
+
while True:
|
157
|
+
try:
|
158
|
+
result = self._call_fn(*args, **kwargs)
|
159
|
+
|
160
|
+
except self._retryable_exceptions as e:
|
161
|
+
if not retry_loop.should_retry(e):
|
162
|
+
raise
|
163
|
+
|
164
|
+
if self._num_iter == 2:
|
165
|
+
logger.info("Retry attempt failed:", exc_info=e)
|
166
|
+
self._print_entered_retry_loop(e)
|
167
|
+
|
168
|
+
retry_loop.wait_before_retry()
|
169
|
+
self._num_iter += 1
|
170
|
+
|
171
|
+
else:
|
172
|
+
if self._num_iter > 2:
|
173
|
+
self._print_recovered(start_time)
|
174
|
+
|
175
|
+
return result
|
176
|
+
|
177
|
+
def _print_entered_retry_loop(self, exception: Exception) -> None:
|
178
|
+
"""Emit a message saying we've begun retrying.
|
179
|
+
|
180
|
+
Either calls the retry callback or prints a warning to console.
|
181
|
+
|
182
|
+
Args:
|
183
|
+
exception: The most recent exception we will retry.
|
184
|
+
"""
|
185
|
+
if (
|
186
|
+
isinstance(exception, HTTPError)
|
187
|
+
and exception.response is not None
|
188
|
+
and self.retry_callback is not None
|
189
|
+
):
|
190
|
+
self.retry_callback(
|
191
|
+
exception.response.status_code,
|
192
|
+
exception.response.text,
|
193
|
+
)
|
194
|
+
else:
|
195
|
+
wandb.termlog(
|
196
|
+
f"{self._error_prefix}"
|
197
|
+
f" ({exception.__class__.__name__}), entering retry loop."
|
198
|
+
)
|
199
|
+
|
200
|
+
def _print_recovered(self, start_time: datetime.datetime) -> None:
|
201
|
+
"""Emit a message saying we've recovered after retrying.
|
202
|
+
|
203
|
+
Args:
|
204
|
+
start_time: When we started retrying.
|
205
|
+
"""
|
206
|
+
if not self.retry_callback:
|
207
|
+
return
|
208
|
+
|
209
|
+
now = NOW_FN()
|
210
|
+
if now - self._last_print < datetime.timedelta(minutes=1):
|
211
|
+
return
|
212
|
+
self._last_print = now
|
213
|
+
|
214
|
+
time_to_recover = now - start_time
|
215
|
+
self.retry_callback(
|
216
|
+
200,
|
217
|
+
(
|
218
|
+
f"{self._error_prefix} resolved after"
|
219
|
+
f" {time_to_recover}, resuming normal operation."
|
220
|
+
),
|
221
|
+
)
|
222
|
+
|
223
|
+
|
224
|
+
class _RetryLoop:
|
225
|
+
"""An invocation of a Retry instance."""
|
226
|
+
|
227
|
+
def __init__(
|
228
|
+
self,
|
229
|
+
*,
|
230
|
+
max_retries: int,
|
231
|
+
timeout: datetime.timedelta,
|
232
|
+
initial_sleep: float,
|
233
|
+
max_sleep: float,
|
234
|
+
cancel_event: Optional[threading.Event],
|
235
|
+
retry_check: CheckRetryFnType,
|
236
|
+
) -> None:
|
237
|
+
"""Start a new call of a Retry instance.
|
238
|
+
|
239
|
+
Args:
|
240
|
+
max_retries: The number of retries after which to give up.
|
241
|
+
timeout: An amount of time after which to give up.
|
242
|
+
initial_sleep: Number of seconds to sleep for the first retry.
|
243
|
+
This is used as the base for exponential backoff.
|
244
|
+
max_sleep: Maximum number of seconds to sleep between retries.
|
245
|
+
cancel_event: An event that's set when the function is cancelled.
|
246
|
+
retry_check: A custom check for deciding whether an exception should
|
247
|
+
be retried. Retrying is prevented if this returns a falsy value,
|
248
|
+
even if more retries are left. This may also return a timedelta
|
249
|
+
that represents a shorter timeout: retrying is prevented if the
|
250
|
+
value is less than the amount of time that has passed since the
|
251
|
+
last timedelta was returned.
|
252
|
+
"""
|
253
|
+
self._max_retries = max_retries
|
254
|
+
self._total_retries = 0
|
255
|
+
|
256
|
+
self._timeout = timeout
|
257
|
+
self._start_time = NOW_FN()
|
258
|
+
|
259
|
+
self._next_sleep_time = initial_sleep
|
260
|
+
self._max_sleep = max_sleep
|
261
|
+
self._cancel_event = cancel_event
|
262
|
+
|
263
|
+
self._retry_check = retry_check
|
264
|
+
self._last_custom_timeout: Optional[datetime.datetime] = None
|
265
|
+
|
266
|
+
def should_retry(self, exception: Exception) -> bool:
|
267
|
+
"""Returns whether an exception should be retried."""
|
268
|
+
if self._total_retries >= self._max_retries:
|
269
|
+
return False
|
270
|
+
self._total_retries += 1
|
271
|
+
|
272
|
+
now = NOW_FN()
|
273
|
+
if now - self._start_time >= self._timeout:
|
274
|
+
return False
|
275
|
+
|
276
|
+
retry_check_result = self._retry_check(exception)
|
277
|
+
if not retry_check_result:
|
278
|
+
return False
|
279
|
+
|
280
|
+
if isinstance(retry_check_result, datetime.timedelta):
|
281
|
+
if not self._last_custom_timeout:
|
282
|
+
self._last_custom_timeout = now
|
283
|
+
|
284
|
+
if now - self._last_custom_timeout >= retry_check_result:
|
285
|
+
return False
|
286
|
+
|
287
|
+
return True
|
288
|
+
|
289
|
+
def wait_before_retry(self) -> None:
|
290
|
+
"""Block until the next retry should happen.
|
291
|
+
|
292
|
+
Raises:
|
293
|
+
RetryCancelledError: If the operation is cancelled.
|
294
|
+
"""
|
295
|
+
sleep_amount = self._next_sleep_time * (1 + random.random() * 0.25)
|
296
|
+
|
297
|
+
if self._cancel_event:
|
298
|
+
cancelled = self._cancel_event.wait(sleep_amount)
|
299
|
+
if cancelled:
|
300
|
+
raise RetryCancelledError("Cancelled while retrying.")
|
301
|
+
else:
|
302
|
+
SLEEP_FN(sleep_amount)
|
303
|
+
|
304
|
+
self._next_sleep_time *= 2
|
305
|
+
if self._next_sleep_time > self._max_sleep:
|
306
|
+
self._next_sleep_time = self._max_sleep
|
307
|
+
|
308
|
+
|
309
|
+
_F = TypeVar("_F", bound=Callable)
|
310
|
+
|
311
|
+
|
312
|
+
def retriable(*args: Any, **kargs: Any) -> Callable[[_F], _F]:
|
313
|
+
def decorator(fn: _F) -> _F:
|
314
|
+
retrier: Retry[Any] = Retry(fn, *args, **kargs)
|
315
|
+
|
316
|
+
@functools.wraps(fn)
|
317
|
+
def wrapped_fn(*args: Any, **kargs: Any) -> Any:
|
318
|
+
return retrier(*args, **kargs)
|
319
|
+
|
320
|
+
return wrapped_fn # type: ignore
|
321
|
+
|
322
|
+
return decorator
|
323
|
+
|
324
|
+
|
325
|
+
class Backoff(abc.ABC):
|
326
|
+
"""A backoff strategy: decides whether to sleep or give up when an exception is raised."""
|
327
|
+
|
328
|
+
@abc.abstractmethod
|
329
|
+
def next_sleep_or_reraise(self, exc: Exception) -> datetime.timedelta:
|
330
|
+
raise NotImplementedError # pragma: no cover
|
331
|
+
|
332
|
+
|
333
|
+
class ExponentialBackoff(Backoff):
|
334
|
+
"""Jittered exponential backoff: sleep times increase ~exponentially up to some limit."""
|
335
|
+
|
336
|
+
def __init__(
|
337
|
+
self,
|
338
|
+
initial_sleep: datetime.timedelta,
|
339
|
+
max_sleep: datetime.timedelta,
|
340
|
+
max_retries: Optional[int] = None,
|
341
|
+
timeout_at: Optional[datetime.datetime] = None,
|
342
|
+
) -> None:
|
343
|
+
self._next_sleep = min(max_sleep, initial_sleep)
|
344
|
+
self._max_sleep = max_sleep
|
345
|
+
self._remaining_retries = max_retries
|
346
|
+
self._timeout_at = timeout_at
|
347
|
+
|
348
|
+
def next_sleep_or_reraise(self, exc: Exception) -> datetime.timedelta:
|
349
|
+
if self._remaining_retries is not None:
|
350
|
+
if self._remaining_retries <= 0:
|
351
|
+
raise exc
|
352
|
+
self._remaining_retries -= 1
|
353
|
+
|
354
|
+
if self._timeout_at is not None and NOW_FN() > self._timeout_at:
|
355
|
+
raise exc
|
356
|
+
|
357
|
+
result, self._next_sleep = (
|
358
|
+
self._next_sleep,
|
359
|
+
min(self._max_sleep, self._next_sleep * (1 + random.random())),
|
360
|
+
)
|
361
|
+
|
362
|
+
return result
|
363
|
+
|
364
|
+
|
365
|
+
class FilteredBackoff(Backoff):
|
366
|
+
"""Re-raise any exceptions that fail a predicate; delegate others to another Backoff."""
|
367
|
+
|
368
|
+
def __init__(self, filter: Callable[[Exception], bool], wrapped: Backoff) -> None:
|
369
|
+
self._filter = filter
|
370
|
+
self._wrapped = wrapped
|
371
|
+
|
372
|
+
def next_sleep_or_reraise(self, exc: Exception) -> datetime.timedelta:
|
373
|
+
if not self._filter(exc):
|
374
|
+
raise exc
|
375
|
+
return self._wrapped.next_sleep_or_reraise(exc)
|
376
|
+
|
377
|
+
|
378
|
+
async def retry_async(
|
379
|
+
backoff: Backoff,
|
380
|
+
fn: Callable[..., Awaitable[_R]],
|
381
|
+
*args: Any,
|
382
|
+
on_exc: Optional[Callable[[Exception], None]] = None,
|
383
|
+
**kwargs: Any,
|
384
|
+
) -> _R:
|
385
|
+
"""Call `fn` repeatedly until either it succeeds, or `backoff` decides we should give up.
|
386
|
+
|
387
|
+
Each time `fn` fails, `on_exc` is called with the exception.
|
388
|
+
"""
|
389
|
+
while True:
|
390
|
+
try:
|
391
|
+
return await fn(*args, **kwargs)
|
392
|
+
except Exception as e:
|
393
|
+
if on_exc is not None:
|
394
|
+
on_exc(e)
|
395
|
+
await SLEEP_ASYNC_FN(backoff.next_sleep_or_reraise(e).total_seconds())
|
@@ -0,0 +1,82 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from dataclasses import dataclass
|
4
|
+
from typing import Union
|
5
|
+
from urllib import parse
|
6
|
+
|
7
|
+
|
8
|
+
@dataclass
|
9
|
+
class RunMoment:
|
10
|
+
"""A moment in a run.
|
11
|
+
|
12
|
+
Defines a branching point in a finished run to fork or resume from.
|
13
|
+
A run moment is identified by a run ID and a metric value.
|
14
|
+
Currently, only the metric '_step' is supported.
|
15
|
+
"""
|
16
|
+
|
17
|
+
run: str
|
18
|
+
"""run ID"""
|
19
|
+
|
20
|
+
value: Union[int, float]
|
21
|
+
"""Value of the metric."""
|
22
|
+
|
23
|
+
metric: str = "_step"
|
24
|
+
"""Metric to use to determine the moment in the run.
|
25
|
+
|
26
|
+
Currently, only the metric '_step' is supported.
|
27
|
+
In future, this will be relaxed to be any metric.
|
28
|
+
"""
|
29
|
+
|
30
|
+
def __post_init__(self):
|
31
|
+
if self.metric != "_step":
|
32
|
+
raise ValueError(
|
33
|
+
f"Only the metric '_step' is supported, got '{self.metric}'."
|
34
|
+
)
|
35
|
+
if not isinstance(self.value, (int, float)):
|
36
|
+
raise TypeError(
|
37
|
+
f"Only int or float values are supported, got '{self.value}'."
|
38
|
+
)
|
39
|
+
if not isinstance(self.run, str):
|
40
|
+
raise TypeError(f"Only string run names are supported, got '{self.run}'.")
|
41
|
+
|
42
|
+
@classmethod
|
43
|
+
def from_uri(cls, uri: str) -> RunMoment:
|
44
|
+
parsable = "runmoment://" + uri
|
45
|
+
parse_err = ValueError(
|
46
|
+
f"Could not parse passed run moment string '{uri}', "
|
47
|
+
f"expected format '<run>?<metric>=<numeric_value>'. "
|
48
|
+
f"Currently, only the metric '_step' is supported. "
|
49
|
+
f"Example: 'ans3bsax?_step=123'."
|
50
|
+
)
|
51
|
+
|
52
|
+
try:
|
53
|
+
parsed = parse.urlparse(parsable)
|
54
|
+
except ValueError as e:
|
55
|
+
raise parse_err from e
|
56
|
+
|
57
|
+
if parsed.scheme != "runmoment":
|
58
|
+
raise parse_err
|
59
|
+
|
60
|
+
# extract run, metric, value from parsed
|
61
|
+
if not parsed.netloc:
|
62
|
+
raise parse_err
|
63
|
+
|
64
|
+
run = parsed.netloc
|
65
|
+
|
66
|
+
if parsed.path or parsed.params or parsed.fragment:
|
67
|
+
raise parse_err
|
68
|
+
|
69
|
+
query = parse.parse_qs(parsed.query)
|
70
|
+
if len(query) != 1:
|
71
|
+
raise parse_err
|
72
|
+
|
73
|
+
metric = list(query.keys())[0]
|
74
|
+
if metric != "_step":
|
75
|
+
raise parse_err
|
76
|
+
value: str = query[metric][0]
|
77
|
+
try:
|
78
|
+
num_value = int(value) if value.isdigit() else float(value)
|
79
|
+
except ValueError as e:
|
80
|
+
raise parse_err from e
|
81
|
+
|
82
|
+
return cls(run=run, metric=metric, value=num_value)
|
wandb/sdk/lib/runid.py
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
"""runid util."""
|
2
|
+
|
3
|
+
import secrets
|
4
|
+
import string
|
5
|
+
|
6
|
+
|
7
|
+
def generate_id(length: int = 8) -> str:
|
8
|
+
"""Generate a random base-36 string of `length` digits."""
|
9
|
+
# There are ~2.8T base-36 8-digit strings. If we generate 210k ids,
|
10
|
+
# we'll have a ~1% chance of collision.
|
11
|
+
alphabet = string.ascii_lowercase + string.digits
|
12
|
+
return "".join(secrets.choice(alphabet) for _ in range(length))
|
wandb/sdk/lib/server.py
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
"""module server."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
import json
|
6
|
+
from typing import TYPE_CHECKING, Any
|
7
|
+
|
8
|
+
from wandb import util
|
9
|
+
from wandb.apis import InternalApi
|
10
|
+
|
11
|
+
if TYPE_CHECKING:
|
12
|
+
from wandb.sdk.wandb_settings import Settings
|
13
|
+
|
14
|
+
|
15
|
+
class Server:
|
16
|
+
def __init__(
|
17
|
+
self,
|
18
|
+
settings: Settings,
|
19
|
+
) -> None:
|
20
|
+
self._api = InternalApi(default_settings=settings)
|
21
|
+
self._viewer: dict[str, Any] = {}
|
22
|
+
self._flags: dict[str, Any] = {}
|
23
|
+
self._settings: Settings = settings
|
24
|
+
|
25
|
+
def query_with_timeout(self, timeout: int | float = 5) -> None:
|
26
|
+
if self._settings.x_disable_viewer:
|
27
|
+
return
|
28
|
+
|
29
|
+
async_viewer = util.async_call(self._api.viewer_server_info, timeout=timeout)
|
30
|
+
try:
|
31
|
+
viewer_tuple, viewer_thread = async_viewer()
|
32
|
+
except Exception:
|
33
|
+
return
|
34
|
+
if viewer_thread.is_alive():
|
35
|
+
# this is likely a DNS hang
|
36
|
+
return
|
37
|
+
# TODO(jhr): should we kill the thread?
|
38
|
+
self._viewer, self._serverinfo = viewer_tuple
|
39
|
+
self._flags = json.loads(self._viewer.get("flags", "{}"))
|
40
|
+
|
41
|
+
@property
|
42
|
+
def viewer(self) -> dict[str, Any]:
|
43
|
+
"""Returns information about the currently authenticated user.
|
44
|
+
|
45
|
+
If the API key is valid, the following is returned:
|
46
|
+
- id
|
47
|
+
- entity
|
48
|
+
- username
|
49
|
+
- flags
|
50
|
+
- teams
|
51
|
+
|
52
|
+
If the API key is not valid or the server is not reachable,
|
53
|
+
an empty dict is returned.
|
54
|
+
"""
|
55
|
+
if not self._viewer and not self._settings._offline:
|
56
|
+
self.query_with_timeout()
|
57
|
+
|
58
|
+
return self._viewer
|
@@ -0,0 +1,13 @@
|
|
1
|
+
"""Constants determining what IPC methods are supported."""
|
2
|
+
|
3
|
+
import socket
|
4
|
+
|
5
|
+
SUPPORTS_UNIX = hasattr(socket, "AF_UNIX")
|
6
|
+
"""Whether Unix sockets are supported.
|
7
|
+
|
8
|
+
AF_UNIX is not supported on Windows:
|
9
|
+
https://github.com/python/cpython/issues/77589
|
10
|
+
|
11
|
+
Windows has supported Unix sockets since ~2017, but support in Python is
|
12
|
+
missing as of 2025.
|
13
|
+
"""
|
@@ -0,0 +1,106 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import asyncio
|
4
|
+
import logging
|
5
|
+
import struct
|
6
|
+
|
7
|
+
from wandb.proto import wandb_server_pb2 as spb
|
8
|
+
from wandb.sdk.lib import asyncio_manager
|
9
|
+
from wandb.sdk.mailbox.mailbox import Mailbox
|
10
|
+
from wandb.sdk.mailbox.mailbox_handle import MailboxHandle
|
11
|
+
|
12
|
+
_logger = logging.getLogger(__name__)
|
13
|
+
|
14
|
+
_HEADER_BYTE_INT_LEN = 5
|
15
|
+
_HEADER_BYTE_INT_FMT = "<BI"
|
16
|
+
|
17
|
+
|
18
|
+
class ServiceClient:
|
19
|
+
"""Implements socket communication with the internal service."""
|
20
|
+
|
21
|
+
def __init__(
|
22
|
+
self,
|
23
|
+
asyncer: asyncio_manager.AsyncioManager,
|
24
|
+
reader: asyncio.StreamReader,
|
25
|
+
writer: asyncio.StreamWriter,
|
26
|
+
) -> None:
|
27
|
+
self._asyncer = asyncer
|
28
|
+
self._reader = reader
|
29
|
+
self._writer = writer
|
30
|
+
self._mailbox = Mailbox(asyncer)
|
31
|
+
asyncer.run_soon(
|
32
|
+
self._forward_responses,
|
33
|
+
daemon=True,
|
34
|
+
name="ServiceClient._forward_responses",
|
35
|
+
)
|
36
|
+
|
37
|
+
def publish(self, request: spb.ServerRequest) -> None:
|
38
|
+
"""Send a request without waiting for a response."""
|
39
|
+
self._asyncer.run_soon(lambda: self._send_server_request(request))
|
40
|
+
|
41
|
+
def deliver(
|
42
|
+
self,
|
43
|
+
request: spb.ServerRequest,
|
44
|
+
) -> MailboxHandle[spb.ServerResponse]:
|
45
|
+
"""Send a request and return a handle to wait for a response.
|
46
|
+
|
47
|
+
NOTE: This may mutate the request. The request should not be used
|
48
|
+
after.
|
49
|
+
|
50
|
+
Raises:
|
51
|
+
MailboxClosedError: If used after the client is closed or has
|
52
|
+
stopped due to an error.
|
53
|
+
"""
|
54
|
+
handle = self._mailbox.require_response(request)
|
55
|
+
self._asyncer.run_soon(lambda: self._send_server_request(request))
|
56
|
+
return handle
|
57
|
+
|
58
|
+
async def _send_server_request(self, request: spb.ServerRequest) -> None:
|
59
|
+
header = struct.pack(_HEADER_BYTE_INT_FMT, ord("W"), request.ByteSize())
|
60
|
+
self._writer.write(header)
|
61
|
+
|
62
|
+
data = request.SerializeToString()
|
63
|
+
self._writer.write(data)
|
64
|
+
|
65
|
+
await self._writer.drain()
|
66
|
+
|
67
|
+
def close(self) -> None:
|
68
|
+
"""Flush and close the socket."""
|
69
|
+
self._asyncer.run_soon(self._close)
|
70
|
+
|
71
|
+
async def _close(self) -> None:
|
72
|
+
self._writer.close()
|
73
|
+
await self._writer.wait_closed()
|
74
|
+
|
75
|
+
async def _forward_responses(self) -> None:
|
76
|
+
try:
|
77
|
+
while response := await self._read_server_response():
|
78
|
+
await self._mailbox.deliver(response)
|
79
|
+
|
80
|
+
except Exception:
|
81
|
+
_logger.exception("Error reading server response.")
|
82
|
+
|
83
|
+
else:
|
84
|
+
_logger.info("Reached EOF.")
|
85
|
+
|
86
|
+
finally:
|
87
|
+
self._mailbox.close()
|
88
|
+
|
89
|
+
async def _read_server_response(self) -> spb.ServerResponse | None:
|
90
|
+
try:
|
91
|
+
header = await self._reader.readexactly(_HEADER_BYTE_INT_LEN)
|
92
|
+
except asyncio.IncompleteReadError as e:
|
93
|
+
if e.partial:
|
94
|
+
raise
|
95
|
+
else:
|
96
|
+
return None
|
97
|
+
|
98
|
+
magic, length = struct.unpack(_HEADER_BYTE_INT_FMT, header)
|
99
|
+
|
100
|
+
if magic != ord("W"):
|
101
|
+
raise ValueError(f"Bad header: {header.hex()}")
|
102
|
+
|
103
|
+
data = await self._reader.readexactly(length)
|
104
|
+
response = spb.ServerResponse()
|
105
|
+
response.ParseFromString(data)
|
106
|
+
return response
|