wandb 0.22.1__py3-none-win_arm64.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/_analytics.py +65 -0
- wandb/_iterutils.py +73 -0
- wandb/_pydantic/__init__.py +30 -0
- wandb/_pydantic/base.py +108 -0
- wandb/_pydantic/field_types.py +29 -0
- wandb/_pydantic/utils.py +80 -0
- wandb/_pydantic/v1_compat.py +301 -0
- wandb/_strutils.py +40 -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 +50 -0
- wandb/apis/attrs.py +52 -0
- wandb/apis/importers/__init__.py +1 -0
- wandb/apis/importers/internals/internal.py +375 -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 +241 -0
- wandb/apis/normalize.py +83 -0
- wandb/apis/paginator.py +138 -0
- wandb/apis/public/__init__.py +78 -0
- wandb/apis/public/api.py +2513 -0
- wandb/apis/public/artifacts.py +1050 -0
- wandb/apis/public/automations.py +86 -0
- wandb/apis/public/const.py +6 -0
- wandb/apis/public/files.py +411 -0
- wandb/apis/public/history.py +203 -0
- wandb/apis/public/integrations.py +203 -0
- wandb/apis/public/jobs.py +744 -0
- wandb/apis/public/projects.py +278 -0
- wandb/apis/public/query_generator.py +179 -0
- wandb/apis/public/registries/__init__.py +7 -0
- wandb/apis/public/registries/_freezable_list.py +176 -0
- wandb/apis/public/registries/_utils.py +139 -0
- wandb/apis/public/registries/registries_search.py +353 -0
- wandb/apis/public/registries/registry.py +370 -0
- wandb/apis/public/reports.py +597 -0
- wandb/apis/public/runs.py +1438 -0
- wandb/apis/public/sweeps.py +441 -0
- wandb/apis/public/teams.py +237 -0
- wandb/apis/public/users.py +179 -0
- wandb/apis/public/utils.py +211 -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 +182 -0
- wandb/automations/_filters/operators.py +259 -0
- wandb/automations/_filters/run_metrics.py +330 -0
- wandb/automations/_generated/__init__.py +104 -0
- wandb/automations/_generated/create_automation.py +17 -0
- wandb/automations/_generated/create_generic_webhook_integration.py +37 -0
- wandb/automations/_generated/delete_automation.py +15 -0
- wandb/automations/_generated/enums.py +35 -0
- wandb/automations/_generated/fragments.py +293 -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 +185 -0
- wandb/automations/actions.py +220 -0
- wandb/automations/automations.py +85 -0
- wandb/automations/events.py +284 -0
- wandb/automations/integrations.py +45 -0
- wandb/automations/scopes.py +78 -0
- wandb/beta/workflows.py +324 -0
- wandb/bin/gpu_stats.exe +0 -0
- wandb/bin/wandb-core +0 -0
- wandb/cli/__init__.py +0 -0
- wandb/cli/beta.py +93 -0
- wandb/cli/beta_sync.py +224 -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/dspy/__init__.py +5 -0
- wandb/integration/dspy/dspy.py +422 -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 +118 -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 +1738 -0
- wandb/proto/v3/wandb_server_pb2.py +209 -0
- wandb/proto/v3/wandb_settings_pb2.py +122 -0
- wandb/proto/v3/wandb_sync_pb2.py +100 -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 +384 -0
- wandb/proto/v4/wandb_server_pb2.py +64 -0
- wandb/proto/v4/wandb_settings_pb2.py +47 -0
- wandb/proto/v4/wandb_sync_pb2.py +42 -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 +385 -0
- wandb/proto/v5/wandb_server_pb2.py +65 -0
- wandb/proto/v5/wandb_settings_pb2.py +48 -0
- wandb/proto/v5/wandb_sync_pb2.py +43 -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 +395 -0
- wandb/proto/v6/wandb_server_pb2.py +75 -0
- wandb/proto/v6/wandb_settings_pb2.py +58 -0
- wandb/proto/v6/wandb_sync_pb2.py +53 -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 +50 -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_sync_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 +22 -0
- wandb/sdk/artifacts/_generated/__init__.py +208 -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 +524 -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 +1253 -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 +31 -0
- wandb/sdk/artifacts/_generated/run_output_artifacts.py +31 -0
- wandb/sdk/artifacts/_generated/type_info.py +19 -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/_gqlutils.py +47 -0
- wandb/sdk/artifacts/_internal_artifact.py +54 -0
- wandb/sdk/artifacts/_models/__init__.py +4 -0
- wandb/sdk/artifacts/_models/base_model.py +20 -0
- wandb/sdk/artifacts/_validators.py +338 -0
- wandb/sdk/artifacts/artifact.py +2683 -0
- wandb/sdk/artifacts/artifact_download_logger.py +45 -0
- wandb/sdk/artifacts/artifact_file_cache.py +256 -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 +315 -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 +72 -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 +112 -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 +340 -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/_factories.py +63 -0
- wandb/sdk/artifacts/storage_policies/register.py +1 -0
- wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +525 -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 +91 -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 +985 -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 +1093 -0
- wandb/sdk/interface/interface_queue.py +50 -0
- wandb/sdk/interface/interface_shared.py +473 -0
- wandb/sdk/interface/interface_sock.py +55 -0
- wandb/sdk/interface/summary_record.py +67 -0
- wandb/sdk/internal/__init__.py +0 -0
- wandb/sdk/internal/_generated/__init__.py +5 -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 +40 -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 +315 -0
- wandb/sdk/launch/inputs/manage.py +113 -0
- wandb/sdk/launch/inputs/schema.py +70 -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 +1290 -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 +827 -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 +278 -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 +76 -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 +108 -0
- wandb/sdk/lib/preinit.py +42 -0
- wandb/sdk/lib/printer.py +567 -0
- wandb/sdk/lib/printer_asyncio.py +48 -0
- wandb/sdk/lib/progress.py +325 -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 +102 -0
- wandb/sdk/lib/service/service_connection.py +238 -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 +134 -0
- wandb/sdk/mailbox/response_handle.py +99 -0
- wandb/sdk/mailbox/wait_with_progress.py +100 -0
- wandb/sdk/projects/_generated/__init__.py +26 -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 +1601 -0
- wandb/sdk/wandb_login.py +358 -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 +4102 -0
- wandb/sdk/wandb_settings.py +2197 -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 +457 -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 +611 -0
- wandb/wandb_controller.py +719 -0
- wandb/wandb_run.py +8 -0
- wandb-0.22.1.dist-info/METADATA +223 -0
- wandb-0.22.1.dist-info/RECORD +919 -0
- wandb-0.22.1.dist-info/WHEEL +4 -0
- wandb-0.22.1.dist-info/entry_points.txt +3 -0
- wandb-0.22.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,72 @@
|
|
1
|
+
"""Artifact exceptions."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
from typing import TYPE_CHECKING, TypeVar
|
6
|
+
|
7
|
+
from wandb import errors
|
8
|
+
from wandb._strutils import nameof
|
9
|
+
|
10
|
+
if TYPE_CHECKING:
|
11
|
+
from wandb.sdk.artifacts.artifact import Artifact
|
12
|
+
|
13
|
+
ArtifactT = TypeVar("ArtifactT", bound=Artifact)
|
14
|
+
|
15
|
+
|
16
|
+
class ArtifactStatusError(AttributeError):
|
17
|
+
"""Raised when an artifact is in an invalid state for the requested operation."""
|
18
|
+
|
19
|
+
def __init__(
|
20
|
+
self,
|
21
|
+
msg: str = "Artifact is in an invalid state for the requested operation.",
|
22
|
+
name: str | None = None,
|
23
|
+
obj: ArtifactT | None = None,
|
24
|
+
):
|
25
|
+
# Follow the same pattern as AttributeError in python 3.10+ by `name/obj` attributes
|
26
|
+
# See: https://docs.python.org/3/library/exceptions.html#AttributeError
|
27
|
+
try:
|
28
|
+
super().__init__(msg, name=name, obj=obj)
|
29
|
+
except TypeError:
|
30
|
+
# The `name`/`obj` keyword args and attributes were only added in python >= 3.10
|
31
|
+
super().__init__(msg)
|
32
|
+
self.name = name or ""
|
33
|
+
self.obj = obj
|
34
|
+
|
35
|
+
|
36
|
+
class ArtifactNotLoggedError(ArtifactStatusError):
|
37
|
+
"""Raised for Artifact methods or attributes only available after logging."""
|
38
|
+
|
39
|
+
def __init__(self, fullname: str, obj: ArtifactT):
|
40
|
+
*_, name = fullname.split(".")
|
41
|
+
msg = (
|
42
|
+
f"{fullname!r} used prior to logging artifact or while in offline mode. "
|
43
|
+
f"Call {nameof(obj.wait)}() before accessing logged artifact properties."
|
44
|
+
)
|
45
|
+
super().__init__(msg=msg, name=name, obj=obj)
|
46
|
+
|
47
|
+
|
48
|
+
class ArtifactFinalizedError(ArtifactStatusError):
|
49
|
+
"""Raised for Artifact methods or attributes that can't be changed after logging."""
|
50
|
+
|
51
|
+
def __init__(self, fullname: str, obj: ArtifactT):
|
52
|
+
*_, name = fullname.split(".")
|
53
|
+
msg = f"{fullname!r} used on logged artifact. Can't modify finalized artifact."
|
54
|
+
super().__init__(msg=msg, name=name, obj=obj)
|
55
|
+
|
56
|
+
|
57
|
+
class WaitTimeoutError(errors.Error):
|
58
|
+
"""Raised when wait() timeout occurs before process is finished."""
|
59
|
+
|
60
|
+
|
61
|
+
class TooFewItemsError(ValueError):
|
62
|
+
"""Raised when there are fewer items than expected in a collection.
|
63
|
+
|
64
|
+
Intended for internal use only.
|
65
|
+
"""
|
66
|
+
|
67
|
+
|
68
|
+
class TooManyItemsError(ValueError):
|
69
|
+
"""Raised when there are more items than expected in a collection.
|
70
|
+
|
71
|
+
Intended for internal use only.
|
72
|
+
"""
|
@@ -0,0 +1,27 @@
|
|
1
|
+
"""Manages artifact file staging.
|
2
|
+
|
3
|
+
Artifact files are copied to the staging area as soon as they are added to an artifact
|
4
|
+
in order to avoid file changes corrupting the artifact. Once the upload is complete, the
|
5
|
+
file should be moved to the artifact cache.
|
6
|
+
"""
|
7
|
+
|
8
|
+
from __future__ import annotations
|
9
|
+
|
10
|
+
import os
|
11
|
+
|
12
|
+
from wandb import env
|
13
|
+
from wandb.sdk.lib.filesystem import mkdir_exists_ok
|
14
|
+
from wandb.sdk.lib.paths import FilePathStr
|
15
|
+
|
16
|
+
|
17
|
+
def get_staging_dir() -> FilePathStr:
|
18
|
+
path = os.path.join(env.get_data_dir(), "artifacts", "staging")
|
19
|
+
try:
|
20
|
+
mkdir_exists_ok(path)
|
21
|
+
except OSError as e:
|
22
|
+
raise PermissionError(
|
23
|
+
f"Unable to write staging files to {path}. To fix this problem, please set "
|
24
|
+
f"{env.DATA_DIR} to a directory where you have the necessary write access."
|
25
|
+
) from e
|
26
|
+
|
27
|
+
return FilePathStr(os.path.abspath(os.path.expanduser(path)))
|
@@ -0,0 +1,62 @@
|
|
1
|
+
"""Storage handler."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
from typing import TYPE_CHECKING, Sequence
|
6
|
+
|
7
|
+
from wandb.sdk.lib.paths import FilePathStr, URIStr
|
8
|
+
|
9
|
+
if TYPE_CHECKING:
|
10
|
+
from urllib.parse import ParseResult
|
11
|
+
|
12
|
+
from wandb.sdk.artifacts.artifact import Artifact
|
13
|
+
from wandb.sdk.artifacts.artifact_manifest_entry import ArtifactManifestEntry
|
14
|
+
|
15
|
+
DEFAULT_MAX_OBJECTS = 10**7
|
16
|
+
|
17
|
+
|
18
|
+
class StorageHandler:
|
19
|
+
def can_handle(self, parsed_url: ParseResult) -> bool:
|
20
|
+
"""Checks whether this handler can handle the given url.
|
21
|
+
|
22
|
+
Returns:
|
23
|
+
Whether this handler can handle the given url.
|
24
|
+
"""
|
25
|
+
raise NotImplementedError
|
26
|
+
|
27
|
+
def load_path(
|
28
|
+
self,
|
29
|
+
manifest_entry: ArtifactManifestEntry,
|
30
|
+
local: bool = False,
|
31
|
+
) -> URIStr | FilePathStr:
|
32
|
+
"""Load a file or directory given the corresponding index entry.
|
33
|
+
|
34
|
+
Args:
|
35
|
+
manifest_entry: The index entry to load
|
36
|
+
local: Whether to load the file locally or not
|
37
|
+
|
38
|
+
Returns:
|
39
|
+
A path to the file represented by `index_entry`
|
40
|
+
"""
|
41
|
+
raise NotImplementedError
|
42
|
+
|
43
|
+
def store_path(
|
44
|
+
self,
|
45
|
+
artifact: Artifact,
|
46
|
+
path: URIStr | FilePathStr,
|
47
|
+
name: str | None = None,
|
48
|
+
checksum: bool = True,
|
49
|
+
max_objects: int | None = None,
|
50
|
+
) -> Sequence[ArtifactManifestEntry]:
|
51
|
+
"""Store the file or directory at the given path to the specified artifact.
|
52
|
+
|
53
|
+
Args:
|
54
|
+
path: The path to store
|
55
|
+
name: If specified, the logical name that should map to `path`
|
56
|
+
checksum: Whether to compute the checksum of the file
|
57
|
+
max_objects: The maximum number of objects to store
|
58
|
+
|
59
|
+
Returns:
|
60
|
+
A list of manifest entries to store within the artifact
|
61
|
+
"""
|
62
|
+
raise NotImplementedError
|
File without changes
|
@@ -0,0 +1,214 @@
|
|
1
|
+
"""Azure storage handler."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
from pathlib import PurePosixPath
|
6
|
+
from types import ModuleType
|
7
|
+
from typing import TYPE_CHECKING, Sequence
|
8
|
+
from urllib.parse import ParseResult, parse_qsl, urlparse
|
9
|
+
|
10
|
+
import wandb
|
11
|
+
from wandb import util
|
12
|
+
from wandb.sdk.artifacts.artifact_file_cache import get_artifact_file_cache
|
13
|
+
from wandb.sdk.artifacts.artifact_manifest_entry import ArtifactManifestEntry
|
14
|
+
from wandb.sdk.artifacts.storage_handler import DEFAULT_MAX_OBJECTS, StorageHandler
|
15
|
+
from wandb.sdk.lib.hashutil import ETag
|
16
|
+
from wandb.sdk.lib.paths import FilePathStr, LogicalPath, StrPath, URIStr
|
17
|
+
|
18
|
+
if TYPE_CHECKING:
|
19
|
+
import azure.identity # type: ignore
|
20
|
+
import azure.storage.blob # type: ignore
|
21
|
+
|
22
|
+
from wandb.sdk.artifacts.artifact import Artifact
|
23
|
+
|
24
|
+
|
25
|
+
class AzureHandler(StorageHandler):
|
26
|
+
def can_handle(self, parsed_url: ParseResult) -> bool:
|
27
|
+
return parsed_url.scheme == "https" and parsed_url.netloc.endswith(
|
28
|
+
".blob.core.windows.net"
|
29
|
+
)
|
30
|
+
|
31
|
+
def __init__(self, scheme: str | None = None) -> None:
|
32
|
+
self._cache = get_artifact_file_cache()
|
33
|
+
|
34
|
+
def load_path(
|
35
|
+
self,
|
36
|
+
manifest_entry: ArtifactManifestEntry,
|
37
|
+
local: bool = False,
|
38
|
+
) -> URIStr | FilePathStr:
|
39
|
+
assert manifest_entry.ref is not None
|
40
|
+
if not local:
|
41
|
+
return manifest_entry.ref
|
42
|
+
|
43
|
+
path, hit, cache_open = self._cache.check_etag_obj_path(
|
44
|
+
URIStr(manifest_entry.ref),
|
45
|
+
ETag(manifest_entry.digest),
|
46
|
+
manifest_entry.size or 0,
|
47
|
+
)
|
48
|
+
if hit:
|
49
|
+
return path
|
50
|
+
|
51
|
+
account_url, container_name, blob_name, query = self._parse_uri(
|
52
|
+
manifest_entry.ref
|
53
|
+
)
|
54
|
+
version_id = manifest_entry.extra.get("versionID")
|
55
|
+
blob_service_client = self._get_module("azure.storage.blob").BlobServiceClient(
|
56
|
+
account_url, credential=self._get_credential(account_url)
|
57
|
+
)
|
58
|
+
blob_client = blob_service_client.get_blob_client(
|
59
|
+
container=container_name, blob=blob_name
|
60
|
+
)
|
61
|
+
if version_id is None:
|
62
|
+
# Try current version, then all versions.
|
63
|
+
try:
|
64
|
+
downloader = blob_client.download_blob(
|
65
|
+
etag=manifest_entry.digest,
|
66
|
+
match_condition=self._get_module(
|
67
|
+
"azure.core"
|
68
|
+
).MatchConditions.IfNotModified,
|
69
|
+
)
|
70
|
+
except self._get_module("azure.core.exceptions").ResourceModifiedError:
|
71
|
+
container_client = blob_service_client.get_container_client(
|
72
|
+
container_name
|
73
|
+
)
|
74
|
+
for blob_properties in container_client.walk_blobs(
|
75
|
+
name_starts_with=blob_name, include=["versions"]
|
76
|
+
):
|
77
|
+
if (
|
78
|
+
blob_properties.name == blob_name
|
79
|
+
and blob_properties.etag == manifest_entry.digest
|
80
|
+
and blob_properties.version_id is not None
|
81
|
+
):
|
82
|
+
downloader = blob_client.download_blob(
|
83
|
+
version_id=blob_properties.version_id
|
84
|
+
)
|
85
|
+
break
|
86
|
+
else: # didn't break
|
87
|
+
raise ValueError(
|
88
|
+
f"Couldn't find blob version for {manifest_entry.ref} matching "
|
89
|
+
f"etag {manifest_entry.digest}."
|
90
|
+
)
|
91
|
+
else:
|
92
|
+
downloader = blob_client.download_blob(version_id=version_id)
|
93
|
+
with cache_open(mode="wb") as f:
|
94
|
+
downloader.readinto(f)
|
95
|
+
return path
|
96
|
+
|
97
|
+
def store_path(
|
98
|
+
self,
|
99
|
+
artifact: Artifact,
|
100
|
+
path: URIStr | FilePathStr,
|
101
|
+
name: StrPath | None = None,
|
102
|
+
checksum: bool = True,
|
103
|
+
max_objects: int | None = None,
|
104
|
+
) -> Sequence[ArtifactManifestEntry]:
|
105
|
+
account_url, container_name, blob_name, query = self._parse_uri(path)
|
106
|
+
path = URIStr(f"{account_url}/{container_name}/{blob_name}")
|
107
|
+
|
108
|
+
if not checksum:
|
109
|
+
return [
|
110
|
+
ArtifactManifestEntry(path=name or blob_name, digest=path, ref=path)
|
111
|
+
]
|
112
|
+
|
113
|
+
blob_service_client = self._get_module("azure.storage.blob").BlobServiceClient(
|
114
|
+
account_url, credential=self._get_credential(account_url)
|
115
|
+
)
|
116
|
+
blob_client = blob_service_client.get_blob_client(
|
117
|
+
container=container_name, blob=blob_name
|
118
|
+
)
|
119
|
+
if blob_client.exists(version_id=query.get("versionId")):
|
120
|
+
blob_properties = blob_client.get_blob_properties(
|
121
|
+
version_id=query.get("versionId")
|
122
|
+
)
|
123
|
+
|
124
|
+
if not self._is_directory_stub(blob_properties):
|
125
|
+
return [
|
126
|
+
self._create_entry(
|
127
|
+
blob_properties,
|
128
|
+
path=name or PurePosixPath(blob_name).name,
|
129
|
+
ref=URIStr(
|
130
|
+
f"{account_url}/{container_name}/{blob_properties.name}"
|
131
|
+
),
|
132
|
+
)
|
133
|
+
]
|
134
|
+
|
135
|
+
entries: list[ArtifactManifestEntry] = []
|
136
|
+
container_client = blob_service_client.get_container_client(container_name)
|
137
|
+
max_objects = max_objects or DEFAULT_MAX_OBJECTS
|
138
|
+
for blob_properties in container_client.list_blobs(
|
139
|
+
name_starts_with=f"{blob_name}/"
|
140
|
+
):
|
141
|
+
if len(entries) >= max_objects:
|
142
|
+
wandb.termwarn(
|
143
|
+
f"Found more than {max_objects} objects under path, limiting upload "
|
144
|
+
f"to {max_objects} objects. Increase max_objects to upload more"
|
145
|
+
)
|
146
|
+
break
|
147
|
+
if not self._is_directory_stub(blob_properties):
|
148
|
+
suffix = PurePosixPath(blob_properties.name).relative_to(blob_name)
|
149
|
+
entries.append(
|
150
|
+
self._create_entry(
|
151
|
+
blob_properties,
|
152
|
+
path=LogicalPath(name) / suffix if name else suffix,
|
153
|
+
ref=URIStr(
|
154
|
+
f"{account_url}/{container_name}/{blob_properties.name}"
|
155
|
+
),
|
156
|
+
)
|
157
|
+
)
|
158
|
+
|
159
|
+
return entries
|
160
|
+
|
161
|
+
def _get_module(self, name: str) -> ModuleType:
|
162
|
+
module = util.get_module(
|
163
|
+
name,
|
164
|
+
lazy=False,
|
165
|
+
required="Azure references require the azure library, run "
|
166
|
+
"pip install wandb[azure]",
|
167
|
+
)
|
168
|
+
assert isinstance(module, ModuleType)
|
169
|
+
return module
|
170
|
+
|
171
|
+
def _get_credential(
|
172
|
+
self, account_url: str
|
173
|
+
) -> azure.identity.DefaultAzureCredential | str:
|
174
|
+
# NOTE: Always returns default credential for reinit="create_new" runs.
|
175
|
+
if (
|
176
|
+
wandb.run
|
177
|
+
and wandb.run.settings.azure_account_url_to_access_key is not None
|
178
|
+
and account_url in wandb.run.settings.azure_account_url_to_access_key
|
179
|
+
):
|
180
|
+
return wandb.run.settings.azure_account_url_to_access_key[account_url]
|
181
|
+
return self._get_module("azure.identity").DefaultAzureCredential()
|
182
|
+
|
183
|
+
def _parse_uri(self, uri: str) -> tuple[str, str, str, dict[str, str]]:
|
184
|
+
parsed_url = urlparse(uri)
|
185
|
+
query = dict(parse_qsl(parsed_url.query))
|
186
|
+
account_url = f"{parsed_url.scheme}://{parsed_url.netloc}"
|
187
|
+
_, container_name, blob_name = parsed_url.path.split("/", 2)
|
188
|
+
return account_url, container_name, blob_name, query
|
189
|
+
|
190
|
+
def _create_entry(
|
191
|
+
self,
|
192
|
+
blob_properties: azure.storage.blob.BlobProperties,
|
193
|
+
path: StrPath,
|
194
|
+
ref: URIStr,
|
195
|
+
) -> ArtifactManifestEntry:
|
196
|
+
extra = {"etag": blob_properties.etag.strip('"')}
|
197
|
+
if blob_properties.version_id:
|
198
|
+
extra["versionID"] = blob_properties.version_id
|
199
|
+
return ArtifactManifestEntry(
|
200
|
+
path=path,
|
201
|
+
ref=ref,
|
202
|
+
digest=blob_properties.etag.strip('"'),
|
203
|
+
size=blob_properties.size,
|
204
|
+
extra=extra,
|
205
|
+
)
|
206
|
+
|
207
|
+
def _is_directory_stub(
|
208
|
+
self, blob_properties: azure.storage.blob.BlobProperties
|
209
|
+
) -> bool:
|
210
|
+
return (
|
211
|
+
blob_properties.has_key("metadata")
|
212
|
+
and "hdi_isfolder" in blob_properties.metadata
|
213
|
+
and blob_properties.metadata["hdi_isfolder"] == "true"
|
214
|
+
)
|
@@ -0,0 +1,224 @@
|
|
1
|
+
"""GCS storage handler."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
import time
|
6
|
+
from pathlib import PurePosixPath
|
7
|
+
from typing import TYPE_CHECKING, Sequence
|
8
|
+
from urllib.parse import ParseResult, urlparse
|
9
|
+
|
10
|
+
from wandb import util
|
11
|
+
from wandb.errors.term import termlog
|
12
|
+
from wandb.sdk.artifacts.artifact_file_cache import get_artifact_file_cache
|
13
|
+
from wandb.sdk.artifacts.artifact_manifest_entry import ArtifactManifestEntry
|
14
|
+
from wandb.sdk.artifacts.storage_handler import DEFAULT_MAX_OBJECTS, StorageHandler
|
15
|
+
from wandb.sdk.lib.hashutil import ETag
|
16
|
+
from wandb.sdk.lib.paths import FilePathStr, StrPath, URIStr
|
17
|
+
|
18
|
+
if TYPE_CHECKING:
|
19
|
+
import google.cloud.storage as gcs_module # type: ignore
|
20
|
+
|
21
|
+
from wandb.sdk.artifacts.artifact import Artifact
|
22
|
+
|
23
|
+
|
24
|
+
class _GCSIsADirectoryError(Exception):
|
25
|
+
"""Raised when we try to download a GCS folder."""
|
26
|
+
|
27
|
+
|
28
|
+
class GCSHandler(StorageHandler):
|
29
|
+
_client: gcs_module.client.Client | None
|
30
|
+
|
31
|
+
def __init__(self, scheme: str | None = None) -> None:
|
32
|
+
self._scheme = scheme or "gs"
|
33
|
+
self._client = None
|
34
|
+
self._cache = get_artifact_file_cache()
|
35
|
+
|
36
|
+
def can_handle(self, parsed_url: ParseResult) -> bool:
|
37
|
+
return parsed_url.scheme == self._scheme
|
38
|
+
|
39
|
+
def init_gcs(self) -> gcs_module.client.Client:
|
40
|
+
if self._client is not None:
|
41
|
+
return self._client
|
42
|
+
storage = util.get_module(
|
43
|
+
"google.cloud.storage",
|
44
|
+
required="gs:// references requires the google-cloud-storage library, run pip install wandb[gcp]",
|
45
|
+
)
|
46
|
+
self._client = storage.Client()
|
47
|
+
return self._client
|
48
|
+
|
49
|
+
def _parse_uri(self, uri: str) -> tuple[str, str, str | None]:
|
50
|
+
url = urlparse(uri)
|
51
|
+
bucket = url.netloc
|
52
|
+
key = url.path[1:]
|
53
|
+
version = url.fragment if url.fragment else None
|
54
|
+
return bucket, key, version
|
55
|
+
|
56
|
+
def load_path(
|
57
|
+
self,
|
58
|
+
manifest_entry: ArtifactManifestEntry,
|
59
|
+
local: bool = False,
|
60
|
+
) -> URIStr | FilePathStr:
|
61
|
+
assert manifest_entry.ref is not None
|
62
|
+
if not local:
|
63
|
+
return manifest_entry.ref
|
64
|
+
|
65
|
+
path, hit, cache_open = self._cache.check_etag_obj_path(
|
66
|
+
url=URIStr(manifest_entry.ref),
|
67
|
+
etag=ETag(manifest_entry.digest),
|
68
|
+
size=manifest_entry.size or 0,
|
69
|
+
)
|
70
|
+
if hit:
|
71
|
+
return path
|
72
|
+
|
73
|
+
self.init_gcs()
|
74
|
+
assert self._client is not None # mypy: unwraps optionality
|
75
|
+
assert manifest_entry.ref is not None
|
76
|
+
bucket, key, _ = self._parse_uri(manifest_entry.ref)
|
77
|
+
version = manifest_entry.extra.get("versionID")
|
78
|
+
|
79
|
+
if self._is_dir(manifest_entry):
|
80
|
+
raise _GCSIsADirectoryError(
|
81
|
+
f"Unable to download GCS folder {manifest_entry.ref!r}, skipping"
|
82
|
+
)
|
83
|
+
|
84
|
+
obj = None
|
85
|
+
# First attempt to get the generation specified, this will return None if versioning is not enabled
|
86
|
+
if version is not None:
|
87
|
+
obj = self._client.bucket(bucket).get_blob(key, generation=version)
|
88
|
+
|
89
|
+
if obj is None:
|
90
|
+
# Object versioning is disabled on the bucket, so just get
|
91
|
+
# the latest version and make sure the MD5 matches.
|
92
|
+
obj = self._client.bucket(bucket).get_blob(key)
|
93
|
+
if obj is None:
|
94
|
+
raise ValueError(
|
95
|
+
f"Unable to download object {manifest_entry.ref} with generation {version}"
|
96
|
+
)
|
97
|
+
if obj.etag != manifest_entry.digest:
|
98
|
+
raise ValueError(
|
99
|
+
f"Digest mismatch for object {manifest_entry.ref}: "
|
100
|
+
f"expected {manifest_entry.digest} but found {obj.etag}"
|
101
|
+
)
|
102
|
+
|
103
|
+
with cache_open(mode="wb") as f:
|
104
|
+
obj.download_to_file(f)
|
105
|
+
return path
|
106
|
+
|
107
|
+
def store_path(
|
108
|
+
self,
|
109
|
+
artifact: Artifact,
|
110
|
+
path: URIStr | FilePathStr,
|
111
|
+
name: StrPath | None = None,
|
112
|
+
checksum: bool = True,
|
113
|
+
max_objects: int | None = None,
|
114
|
+
) -> Sequence[ArtifactManifestEntry]:
|
115
|
+
self.init_gcs()
|
116
|
+
assert self._client is not None # mypy: unwraps optionality
|
117
|
+
|
118
|
+
# After parsing any query params / fragments for additional context,
|
119
|
+
# such as version identifiers, pare down the path to just the bucket
|
120
|
+
# and key.
|
121
|
+
bucket, key, version = self._parse_uri(path)
|
122
|
+
path = URIStr(f"{self._scheme}://{bucket}/{key}")
|
123
|
+
max_objects = max_objects or DEFAULT_MAX_OBJECTS
|
124
|
+
|
125
|
+
if not checksum:
|
126
|
+
return [ArtifactManifestEntry(path=name or key, ref=path, digest=path)]
|
127
|
+
|
128
|
+
start_time = None
|
129
|
+
obj = self._client.bucket(bucket).get_blob(key, generation=version)
|
130
|
+
if obj is None and version is not None:
|
131
|
+
raise ValueError(f"Object does not exist: {path}#{version}")
|
132
|
+
multi = obj is None
|
133
|
+
if multi:
|
134
|
+
start_time = time.time()
|
135
|
+
termlog(
|
136
|
+
f'Generating checksum for up to {max_objects} objects with prefix "{key}"... ',
|
137
|
+
newline=False,
|
138
|
+
)
|
139
|
+
objects = self._client.bucket(bucket).list_blobs(
|
140
|
+
prefix=key, max_results=max_objects
|
141
|
+
)
|
142
|
+
else:
|
143
|
+
objects = [obj]
|
144
|
+
|
145
|
+
entries = [
|
146
|
+
self._entry_from_obj(obj, path, name, prefix=key, multi=multi)
|
147
|
+
for obj in objects
|
148
|
+
if not obj.name.endswith("/")
|
149
|
+
]
|
150
|
+
if start_time is not None:
|
151
|
+
termlog("Done. %.1fs" % (time.time() - start_time), prefix=False)
|
152
|
+
if len(entries) > max_objects:
|
153
|
+
raise ValueError(
|
154
|
+
f"Exceeded {max_objects} objects tracked, pass max_objects to add_reference"
|
155
|
+
)
|
156
|
+
return entries
|
157
|
+
|
158
|
+
def _entry_from_obj(
|
159
|
+
self,
|
160
|
+
obj: gcs_module.blob.Blob,
|
161
|
+
path: str,
|
162
|
+
name: StrPath | None = None,
|
163
|
+
prefix: str = "",
|
164
|
+
multi: bool = False,
|
165
|
+
) -> ArtifactManifestEntry:
|
166
|
+
"""Create an ArtifactManifestEntry from a GCS object.
|
167
|
+
|
168
|
+
Args:
|
169
|
+
obj: The GCS object
|
170
|
+
path: The GCS-style path (e.g.: "gs://bucket/file.txt")
|
171
|
+
name: The user assigned name, or None if not specified
|
172
|
+
prefix: The prefix to add (will be the same as `path` for directories)
|
173
|
+
multi: Whether or not this is a multi-object add.
|
174
|
+
"""
|
175
|
+
bucket, key, _ = self._parse_uri(path)
|
176
|
+
|
177
|
+
# Always use posix paths, since that's what S3 uses.
|
178
|
+
posix_key = PurePosixPath(obj.name) # the bucket key
|
179
|
+
posix_path = PurePosixPath(bucket) / PurePosixPath(
|
180
|
+
key
|
181
|
+
) # the path, with the scheme stripped
|
182
|
+
posix_prefix = PurePosixPath(prefix) # the prefix, if adding a prefix
|
183
|
+
posix_name = PurePosixPath(name or "")
|
184
|
+
posix_ref = posix_path
|
185
|
+
|
186
|
+
if name is None:
|
187
|
+
# We're adding a directory (prefix), so calculate a relative path.
|
188
|
+
if str(posix_prefix) in str(posix_key) and posix_prefix != posix_key:
|
189
|
+
posix_name = posix_key.relative_to(posix_prefix)
|
190
|
+
posix_ref = posix_path / posix_name
|
191
|
+
else:
|
192
|
+
posix_name = PurePosixPath(posix_key.name)
|
193
|
+
posix_ref = posix_path
|
194
|
+
elif multi:
|
195
|
+
# We're adding a directory with a name override.
|
196
|
+
relpath = posix_key.relative_to(posix_prefix)
|
197
|
+
posix_name = posix_name / relpath
|
198
|
+
posix_ref = posix_path / relpath
|
199
|
+
return ArtifactManifestEntry(
|
200
|
+
path=posix_name,
|
201
|
+
ref=URIStr(f"{self._scheme}://{posix_ref}"),
|
202
|
+
digest=obj.etag,
|
203
|
+
size=obj.size,
|
204
|
+
extra={"versionID": obj.generation},
|
205
|
+
)
|
206
|
+
|
207
|
+
def _is_dir(
|
208
|
+
self,
|
209
|
+
manifest_entry: ArtifactManifestEntry,
|
210
|
+
) -> bool:
|
211
|
+
assert self._client is not None
|
212
|
+
assert manifest_entry.ref is not None
|
213
|
+
bucket, key, _ = self._parse_uri(manifest_entry.ref)
|
214
|
+
bucket_obj = self._client.bucket(bucket)
|
215
|
+
# A gcs bucket key should end with a forward slash on gcloud, but
|
216
|
+
# we save these refs without the forward slash in the manifest entry
|
217
|
+
# so we check the size and extension, make sure its not referring to
|
218
|
+
# an actual file with this reference, and that the ref with the slash
|
219
|
+
# exists on gcloud
|
220
|
+
return key.endswith("/") or (
|
221
|
+
not (manifest_entry.size or PurePosixPath(key).suffix)
|
222
|
+
and bucket_obj.get_blob(key) is None
|
223
|
+
and bucket_obj.get_blob(f"{key}/") is not None
|
224
|
+
)
|