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,112 @@
|
|
1
|
+
"""HTTP storage handler."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
import os
|
6
|
+
from typing import TYPE_CHECKING, Sequence
|
7
|
+
from urllib.parse import ParseResult
|
8
|
+
|
9
|
+
from wandb.sdk.artifacts.artifact_file_cache import get_artifact_file_cache
|
10
|
+
from wandb.sdk.artifacts.artifact_manifest_entry import ArtifactManifestEntry
|
11
|
+
from wandb.sdk.artifacts.storage_handler import StorageHandler
|
12
|
+
from wandb.sdk.internal.thread_local_settings import _thread_local_api_settings
|
13
|
+
from wandb.sdk.lib.hashutil import ETag
|
14
|
+
from wandb.sdk.lib.paths import FilePathStr, StrPath, URIStr
|
15
|
+
|
16
|
+
if TYPE_CHECKING:
|
17
|
+
import requests
|
18
|
+
from requests.structures import CaseInsensitiveDict
|
19
|
+
|
20
|
+
from wandb.sdk.artifacts.artifact import Artifact
|
21
|
+
|
22
|
+
|
23
|
+
class HTTPHandler(StorageHandler):
|
24
|
+
def __init__(self, session: requests.Session, scheme: str | None = None) -> None:
|
25
|
+
self._scheme = scheme or "http"
|
26
|
+
self._cache = get_artifact_file_cache()
|
27
|
+
self._session = session
|
28
|
+
|
29
|
+
def can_handle(self, parsed_url: ParseResult) -> bool:
|
30
|
+
return parsed_url.scheme == self._scheme
|
31
|
+
|
32
|
+
def load_path(
|
33
|
+
self,
|
34
|
+
manifest_entry: ArtifactManifestEntry,
|
35
|
+
local: bool = False,
|
36
|
+
) -> URIStr | FilePathStr:
|
37
|
+
if not local:
|
38
|
+
assert manifest_entry.ref is not None
|
39
|
+
return manifest_entry.ref
|
40
|
+
|
41
|
+
assert manifest_entry.ref is not None
|
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
|
+
response = self._session.get(
|
52
|
+
manifest_entry.ref,
|
53
|
+
stream=True,
|
54
|
+
cookies=_thread_local_api_settings.cookies,
|
55
|
+
headers=_thread_local_api_settings.headers,
|
56
|
+
)
|
57
|
+
|
58
|
+
digest: ETag | FilePathStr | URIStr | None
|
59
|
+
digest, size, extra = self._entry_from_headers(response.headers)
|
60
|
+
digest = digest or manifest_entry.ref
|
61
|
+
if manifest_entry.digest != digest:
|
62
|
+
raise ValueError(
|
63
|
+
f"Digest mismatch for url {manifest_entry.ref}: expected {manifest_entry.digest} but found {digest}"
|
64
|
+
)
|
65
|
+
|
66
|
+
with cache_open(mode="wb") as file:
|
67
|
+
for data in response.iter_content(chunk_size=16 * 1024):
|
68
|
+
file.write(data)
|
69
|
+
return path
|
70
|
+
|
71
|
+
def store_path(
|
72
|
+
self,
|
73
|
+
artifact: Artifact,
|
74
|
+
path: URIStr | FilePathStr,
|
75
|
+
name: StrPath | None = None,
|
76
|
+
checksum: bool = True,
|
77
|
+
max_objects: int | None = None,
|
78
|
+
) -> Sequence[ArtifactManifestEntry]:
|
79
|
+
name = name or os.path.basename(path)
|
80
|
+
if not checksum:
|
81
|
+
return [ArtifactManifestEntry(path=name, ref=path, digest=path)]
|
82
|
+
|
83
|
+
with self._session.get(
|
84
|
+
path,
|
85
|
+
stream=True,
|
86
|
+
cookies=_thread_local_api_settings.cookies,
|
87
|
+
headers=_thread_local_api_settings.headers,
|
88
|
+
) as response:
|
89
|
+
digest: ETag | FilePathStr | URIStr | None
|
90
|
+
digest, size, extra = self._entry_from_headers(response.headers)
|
91
|
+
digest = digest or path
|
92
|
+
return [
|
93
|
+
ArtifactManifestEntry(
|
94
|
+
path=name, ref=path, digest=digest, size=size, extra=extra
|
95
|
+
)
|
96
|
+
]
|
97
|
+
|
98
|
+
def _entry_from_headers(
|
99
|
+
self, headers: CaseInsensitiveDict
|
100
|
+
) -> tuple[ETag | None, int | None, dict[str, str]]:
|
101
|
+
response_headers = {k.lower(): v for k, v in headers.items()}
|
102
|
+
size = None
|
103
|
+
if response_headers.get("content-length", None):
|
104
|
+
size = int(response_headers["content-length"])
|
105
|
+
|
106
|
+
digest = response_headers.get("etag", None)
|
107
|
+
extra = {}
|
108
|
+
if digest:
|
109
|
+
extra["etag"] = digest
|
110
|
+
if digest and digest[:1] == '"' and digest[-1:] == '"':
|
111
|
+
digest = digest[1:-1] # trim leading and trailing quotes around etag
|
112
|
+
return digest, size, extra
|
@@ -0,0 +1,142 @@
|
|
1
|
+
"""Local file storage handler."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
import os
|
6
|
+
import shutil
|
7
|
+
import time
|
8
|
+
from pathlib import Path
|
9
|
+
from typing import TYPE_CHECKING, Sequence
|
10
|
+
from urllib.parse import ParseResult
|
11
|
+
|
12
|
+
from wandb import util
|
13
|
+
from wandb.errors.term import termlog
|
14
|
+
from wandb.sdk.artifacts.artifact_file_cache import get_artifact_file_cache
|
15
|
+
from wandb.sdk.artifacts.artifact_manifest_entry import ArtifactManifestEntry
|
16
|
+
from wandb.sdk.artifacts.storage_handler import DEFAULT_MAX_OBJECTS, StorageHandler
|
17
|
+
from wandb.sdk.lib import filesystem
|
18
|
+
from wandb.sdk.lib.hashutil import B64MD5, md5_file_b64, md5_string
|
19
|
+
from wandb.sdk.lib.paths import FilePathStr, StrPath, URIStr
|
20
|
+
|
21
|
+
if TYPE_CHECKING:
|
22
|
+
from wandb.sdk.artifacts.artifact import Artifact
|
23
|
+
|
24
|
+
|
25
|
+
class LocalFileHandler(StorageHandler):
|
26
|
+
"""Handles file:// references."""
|
27
|
+
|
28
|
+
def __init__(self, scheme: str | None = None) -> None:
|
29
|
+
"""Track files or directories on a local filesystem.
|
30
|
+
|
31
|
+
Expand directories to create an entry for each file contained.
|
32
|
+
"""
|
33
|
+
self._scheme = scheme or "file"
|
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 load_path(
|
40
|
+
self,
|
41
|
+
manifest_entry: ArtifactManifestEntry,
|
42
|
+
local: bool = False,
|
43
|
+
) -> URIStr | FilePathStr:
|
44
|
+
if manifest_entry.ref is None:
|
45
|
+
raise ValueError(f"Cannot add path with no ref: {manifest_entry.path}")
|
46
|
+
local_path = util.local_file_uri_to_path(str(manifest_entry.ref))
|
47
|
+
if not os.path.exists(local_path):
|
48
|
+
raise ValueError(
|
49
|
+
f"Local file reference: Failed to find file at path {local_path}"
|
50
|
+
)
|
51
|
+
|
52
|
+
path, hit, cache_open = self._cache.check_md5_obj_path(
|
53
|
+
B64MD5(manifest_entry.digest), # TODO(spencerpearson): unsafe cast
|
54
|
+
manifest_entry.size or 0,
|
55
|
+
)
|
56
|
+
if hit:
|
57
|
+
return path
|
58
|
+
|
59
|
+
md5 = md5_file_b64(local_path)
|
60
|
+
if md5 != manifest_entry.digest:
|
61
|
+
raise ValueError(
|
62
|
+
f"Local file reference: Digest mismatch for path {local_path}: expected {manifest_entry.digest} but found {md5}"
|
63
|
+
)
|
64
|
+
|
65
|
+
filesystem.mkdir_exists_ok(os.path.dirname(path))
|
66
|
+
|
67
|
+
with cache_open() as f:
|
68
|
+
shutil.copy(local_path, f.name)
|
69
|
+
return path
|
70
|
+
|
71
|
+
def store_path(
|
72
|
+
self,
|
73
|
+
artifact: Artifact,
|
74
|
+
path: URIStr | FilePathStr,
|
75
|
+
name: StrPath | None = None,
|
76
|
+
checksum: bool = True,
|
77
|
+
max_objects: int | None = None,
|
78
|
+
) -> Sequence[ArtifactManifestEntry]:
|
79
|
+
local_path = util.local_file_uri_to_path(path)
|
80
|
+
max_objects = max_objects or DEFAULT_MAX_OBJECTS
|
81
|
+
# We have a single file or directory
|
82
|
+
# Note, we follow symlinks for files contained within the directory
|
83
|
+
entries = []
|
84
|
+
|
85
|
+
# If checksum=False, the file's hash should only
|
86
|
+
# depend on its absolute path/URI, not its contents
|
87
|
+
|
88
|
+
# Closure func for calculating the file hash from its path
|
89
|
+
def md5(path: str) -> B64MD5:
|
90
|
+
return (
|
91
|
+
md5_file_b64(path)
|
92
|
+
if checksum
|
93
|
+
else md5_string(Path(path).resolve().as_uri())
|
94
|
+
)
|
95
|
+
|
96
|
+
if os.path.isdir(local_path):
|
97
|
+
i = 0
|
98
|
+
start_time = time.time()
|
99
|
+
if checksum:
|
100
|
+
termlog(
|
101
|
+
f'Generating checksum for up to {max_objects} files in "{local_path}"... ',
|
102
|
+
newline=False,
|
103
|
+
)
|
104
|
+
for root, _, files in os.walk(local_path):
|
105
|
+
for sub_path in files:
|
106
|
+
i += 1
|
107
|
+
if i > max_objects:
|
108
|
+
raise ValueError(
|
109
|
+
f"Exceeded {max_objects} objects tracked, pass max_objects to add_reference"
|
110
|
+
)
|
111
|
+
physical_path = os.path.join(root, sub_path)
|
112
|
+
# TODO(spencerpearson): this is not a "logical path" in the sense that
|
113
|
+
# `LogicalPath` returns a "logical path"; it's a relative path
|
114
|
+
# **on the local filesystem**.
|
115
|
+
file_path = os.path.relpath(physical_path, start=local_path)
|
116
|
+
if name is not None:
|
117
|
+
artifact_path = os.path.join(name, file_path)
|
118
|
+
else:
|
119
|
+
artifact_path = file_path
|
120
|
+
|
121
|
+
entry = ArtifactManifestEntry(
|
122
|
+
path=artifact_path,
|
123
|
+
ref=FilePathStr(os.path.join(path, file_path)),
|
124
|
+
size=os.path.getsize(physical_path),
|
125
|
+
digest=md5(physical_path),
|
126
|
+
)
|
127
|
+
entries.append(entry)
|
128
|
+
if checksum:
|
129
|
+
termlog("Done. %.1fs" % (time.time() - start_time), prefix=False)
|
130
|
+
elif os.path.isfile(local_path):
|
131
|
+
name = name or os.path.basename(local_path)
|
132
|
+
entry = ArtifactManifestEntry(
|
133
|
+
path=name,
|
134
|
+
ref=path,
|
135
|
+
size=os.path.getsize(local_path),
|
136
|
+
digest=md5(local_path),
|
137
|
+
)
|
138
|
+
entries.append(entry)
|
139
|
+
else:
|
140
|
+
# TODO: update error message if we don't allow directories.
|
141
|
+
raise ValueError(f'Path "{path}" must be a valid file or directory path')
|
142
|
+
return entries
|
@@ -0,0 +1,56 @@
|
|
1
|
+
"""Multi storage handler."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
from typing import TYPE_CHECKING, Sequence
|
6
|
+
from urllib.parse import urlparse
|
7
|
+
|
8
|
+
from wandb.sdk.artifacts.storage_handler import StorageHandler
|
9
|
+
from wandb.sdk.lib.paths import FilePathStr, URIStr
|
10
|
+
|
11
|
+
if TYPE_CHECKING:
|
12
|
+
from wandb.sdk.artifacts.artifact import Artifact
|
13
|
+
from wandb.sdk.artifacts.artifact_manifest_entry import ArtifactManifestEntry
|
14
|
+
|
15
|
+
|
16
|
+
class MultiHandler(StorageHandler):
|
17
|
+
_handlers: list[StorageHandler]
|
18
|
+
|
19
|
+
def __init__(
|
20
|
+
self,
|
21
|
+
handlers: list[StorageHandler] | None = None,
|
22
|
+
default_handler: StorageHandler | None = None,
|
23
|
+
) -> None:
|
24
|
+
self._handlers = handlers or []
|
25
|
+
self._default_handler = default_handler
|
26
|
+
|
27
|
+
def _get_handler(self, url: FilePathStr | URIStr) -> StorageHandler:
|
28
|
+
parsed_url = urlparse(url)
|
29
|
+
for handler in self._handlers:
|
30
|
+
if handler.can_handle(parsed_url):
|
31
|
+
return handler
|
32
|
+
if self._default_handler is not None:
|
33
|
+
return self._default_handler
|
34
|
+
raise ValueError(f'No storage handler registered for url "{url!s}"')
|
35
|
+
|
36
|
+
def load_path(
|
37
|
+
self,
|
38
|
+
manifest_entry: ArtifactManifestEntry,
|
39
|
+
local: bool = False,
|
40
|
+
) -> URIStr | FilePathStr:
|
41
|
+
assert manifest_entry.ref is not None
|
42
|
+
handler = self._get_handler(manifest_entry.ref)
|
43
|
+
return handler.load_path(manifest_entry, local=local)
|
44
|
+
|
45
|
+
def store_path(
|
46
|
+
self,
|
47
|
+
artifact: Artifact,
|
48
|
+
path: URIStr | FilePathStr,
|
49
|
+
name: str | None = None,
|
50
|
+
checksum: bool = True,
|
51
|
+
max_objects: int | None = None,
|
52
|
+
) -> Sequence[ArtifactManifestEntry]:
|
53
|
+
handler = self._get_handler(path)
|
54
|
+
return handler.store_path(
|
55
|
+
artifact, path, name=name, checksum=checksum, max_objects=max_objects
|
56
|
+
)
|
@@ -0,0 +1,340 @@
|
|
1
|
+
"""S3 storage handler."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
import os
|
6
|
+
import re
|
7
|
+
import time
|
8
|
+
from pathlib import PurePosixPath
|
9
|
+
from typing import TYPE_CHECKING, Sequence
|
10
|
+
from urllib.parse import parse_qsl, urlparse
|
11
|
+
|
12
|
+
from wandb import util
|
13
|
+
from wandb._strutils import ensureprefix
|
14
|
+
from wandb.errors import CommError
|
15
|
+
from wandb.errors.term import termlog
|
16
|
+
from wandb.sdk.artifacts.artifact_file_cache import get_artifact_file_cache
|
17
|
+
from wandb.sdk.artifacts.artifact_manifest_entry import ArtifactManifestEntry
|
18
|
+
from wandb.sdk.artifacts.storage_handler import DEFAULT_MAX_OBJECTS, StorageHandler
|
19
|
+
from wandb.sdk.lib.hashutil import ETag
|
20
|
+
from wandb.sdk.lib.paths import FilePathStr, StrPath, URIStr
|
21
|
+
|
22
|
+
if TYPE_CHECKING:
|
23
|
+
from urllib.parse import ParseResult
|
24
|
+
|
25
|
+
# We could probably use https://pypi.org/project/boto3-stubs/ or something
|
26
|
+
# instead of `type:ignore`ing these boto imports, but it's nontrivial:
|
27
|
+
# for some reason, despite being actively maintained as of 2022-09-30,
|
28
|
+
# the latest release of boto3-stubs doesn't include all the features we use.
|
29
|
+
import boto3 # type: ignore
|
30
|
+
import boto3.resources.base # type: ignore
|
31
|
+
import boto3.s3 # type: ignore
|
32
|
+
import boto3.session # type: ignore
|
33
|
+
|
34
|
+
from wandb.sdk.artifacts.artifact import Artifact
|
35
|
+
|
36
|
+
|
37
|
+
class S3Handler(StorageHandler):
|
38
|
+
_s3: boto3.resources.base.ServiceResource | None
|
39
|
+
_scheme: str
|
40
|
+
|
41
|
+
def __init__(self, scheme: str | None = None) -> None:
|
42
|
+
self._scheme = scheme or "s3"
|
43
|
+
self._s3 = None
|
44
|
+
self._cache = get_artifact_file_cache()
|
45
|
+
|
46
|
+
def can_handle(self, parsed_url: ParseResult) -> bool:
|
47
|
+
return parsed_url.scheme == self._scheme
|
48
|
+
|
49
|
+
def init_boto(self) -> boto3.resources.base.ServiceResource:
|
50
|
+
if self._s3 is not None:
|
51
|
+
return self._s3
|
52
|
+
boto: boto3 = util.get_module(
|
53
|
+
"boto3",
|
54
|
+
required="s3:// references requires the boto3 library, run pip install wandb[aws]",
|
55
|
+
lazy=False,
|
56
|
+
)
|
57
|
+
|
58
|
+
from botocore.client import Config # type: ignore
|
59
|
+
|
60
|
+
s3_endpoint = os.getenv("AWS_S3_ENDPOINT_URL")
|
61
|
+
config = (
|
62
|
+
Config(s3={"addressing_style": "virtual"})
|
63
|
+
if s3_endpoint and self._is_coreweave_endpoint(s3_endpoint)
|
64
|
+
else None
|
65
|
+
)
|
66
|
+
self._s3 = boto.session.Session().resource(
|
67
|
+
"s3",
|
68
|
+
endpoint_url=s3_endpoint,
|
69
|
+
region_name=os.getenv("AWS_REGION"),
|
70
|
+
config=config,
|
71
|
+
)
|
72
|
+
self._botocore = util.get_module("botocore")
|
73
|
+
return self._s3
|
74
|
+
|
75
|
+
def _parse_uri(self, uri: str) -> tuple[str, str, str | None]:
|
76
|
+
url = urlparse(uri)
|
77
|
+
query = dict(parse_qsl(url.query))
|
78
|
+
|
79
|
+
bucket = url.netloc
|
80
|
+
key = url.path[1:] # strip leading slash
|
81
|
+
version = query.get("versionId")
|
82
|
+
|
83
|
+
return bucket, key, version
|
84
|
+
|
85
|
+
def load_path(
|
86
|
+
self,
|
87
|
+
manifest_entry: ArtifactManifestEntry,
|
88
|
+
local: bool = False,
|
89
|
+
) -> URIStr | FilePathStr:
|
90
|
+
if not local:
|
91
|
+
assert manifest_entry.ref is not None
|
92
|
+
return manifest_entry.ref
|
93
|
+
|
94
|
+
assert manifest_entry.ref is not None
|
95
|
+
|
96
|
+
path, hit, cache_open = self._cache.check_etag_obj_path(
|
97
|
+
URIStr(manifest_entry.ref),
|
98
|
+
ETag(manifest_entry.digest),
|
99
|
+
manifest_entry.size or 0,
|
100
|
+
)
|
101
|
+
if hit:
|
102
|
+
return path
|
103
|
+
|
104
|
+
self.init_boto()
|
105
|
+
assert self._s3 is not None # mypy: unwraps optionality
|
106
|
+
bucket, key, _ = self._parse_uri(manifest_entry.ref)
|
107
|
+
version = manifest_entry.extra.get("versionID")
|
108
|
+
|
109
|
+
extra_args = {}
|
110
|
+
if version:
|
111
|
+
obj_version = self._s3.ObjectVersion(bucket, key, version)
|
112
|
+
extra_args["VersionId"] = version
|
113
|
+
obj = obj_version.Object()
|
114
|
+
else:
|
115
|
+
obj = self._s3.Object(bucket, key)
|
116
|
+
|
117
|
+
try:
|
118
|
+
etag = (
|
119
|
+
obj_version.head()["ETag"][1:-1] # escape leading and trailing
|
120
|
+
if version
|
121
|
+
else self._etag_from_obj(obj)
|
122
|
+
)
|
123
|
+
except self._botocore.exceptions.ClientError as e:
|
124
|
+
if e.response["Error"]["Code"] == "404":
|
125
|
+
raise FileNotFoundError(
|
126
|
+
f"Unable to find {manifest_entry.path} at s3://{bucket}/{key}"
|
127
|
+
) from e
|
128
|
+
raise
|
129
|
+
|
130
|
+
if etag != manifest_entry.digest:
|
131
|
+
# Try to match the etag with some other version.
|
132
|
+
if version:
|
133
|
+
raise ValueError(
|
134
|
+
f"Digest mismatch for object {manifest_entry.ref} with version {version}: expected {manifest_entry.digest} but found {etag}"
|
135
|
+
)
|
136
|
+
obj = None
|
137
|
+
object_versions = self._s3.Bucket(bucket).object_versions.filter(Prefix=key)
|
138
|
+
for object_version in object_versions:
|
139
|
+
if manifest_entry.extra.get("etag") == self._etag_from_obj(
|
140
|
+
object_version
|
141
|
+
):
|
142
|
+
obj = object_version.Object()
|
143
|
+
extra_args["VersionId"] = object_version.version_id
|
144
|
+
break
|
145
|
+
if obj is None:
|
146
|
+
raise FileNotFoundError(
|
147
|
+
"Couldn't find object version for {}/{} matching etag {}".format(
|
148
|
+
bucket, key, manifest_entry.extra.get("etag")
|
149
|
+
)
|
150
|
+
)
|
151
|
+
|
152
|
+
with cache_open(mode="wb") as f:
|
153
|
+
obj.download_fileobj(f, ExtraArgs=extra_args)
|
154
|
+
return path
|
155
|
+
|
156
|
+
def store_path(
|
157
|
+
self,
|
158
|
+
artifact: Artifact,
|
159
|
+
path: URIStr | FilePathStr,
|
160
|
+
name: StrPath | None = None,
|
161
|
+
checksum: bool = True,
|
162
|
+
max_objects: int | None = None,
|
163
|
+
) -> Sequence[ArtifactManifestEntry]:
|
164
|
+
self.init_boto()
|
165
|
+
assert self._s3 is not None # mypy: unwraps optionality
|
166
|
+
|
167
|
+
# The passed in path might have query string parameters.
|
168
|
+
# We only need to care about a subset, like version, when
|
169
|
+
# parsing. Once we have that, we can store the rest of the
|
170
|
+
# metadata in the artifact entry itself.
|
171
|
+
bucket, key, version = self._parse_uri(path)
|
172
|
+
path = URIStr(f"{self._scheme}://{bucket}/{key}")
|
173
|
+
|
174
|
+
max_objects = max_objects or DEFAULT_MAX_OBJECTS
|
175
|
+
if not checksum:
|
176
|
+
entry_path = name or (key if key != "" else bucket)
|
177
|
+
return [ArtifactManifestEntry(path=entry_path, ref=path, digest=path)]
|
178
|
+
|
179
|
+
# If an explicit version is specified, use that. Otherwise, use the head version.
|
180
|
+
objs = (
|
181
|
+
[self._s3.ObjectVersion(bucket, key, version).Object()]
|
182
|
+
if version
|
183
|
+
else [self._s3.Object(bucket, key)]
|
184
|
+
)
|
185
|
+
start_time = None
|
186
|
+
multi = False
|
187
|
+
if key != "":
|
188
|
+
try:
|
189
|
+
objs[0].load()
|
190
|
+
# S3 doesn't have real folders, however there are cases where the folder key has a valid file which will not
|
191
|
+
# trigger a recursive upload.
|
192
|
+
# we should check the object's metadata says it is a directory and do a multi file upload if it is
|
193
|
+
if "x-directory" in objs[0].content_type:
|
194
|
+
multi = True
|
195
|
+
except self._botocore.exceptions.ClientError as e:
|
196
|
+
if e.response["Error"]["Code"] == "404":
|
197
|
+
multi = True
|
198
|
+
else:
|
199
|
+
raise CommError(
|
200
|
+
f"Unable to connect to S3 ({e.response['Error']['Code']}): "
|
201
|
+
f"{e.response['Error']['Message']}. Check that your "
|
202
|
+
"authentication credentials are valid and that your region is "
|
203
|
+
"set correctly."
|
204
|
+
)
|
205
|
+
else:
|
206
|
+
multi = True
|
207
|
+
|
208
|
+
if multi:
|
209
|
+
start_time = time.time()
|
210
|
+
termlog(
|
211
|
+
f'Generating checksum for up to {max_objects} objects in "{bucket}/{key}"... ',
|
212
|
+
newline=False,
|
213
|
+
)
|
214
|
+
if key != "":
|
215
|
+
objs = (
|
216
|
+
self._s3.Bucket(bucket)
|
217
|
+
.objects.filter(Prefix=key)
|
218
|
+
.limit(max_objects)
|
219
|
+
)
|
220
|
+
else:
|
221
|
+
objs = self._s3.Bucket(bucket).objects.limit(max_objects)
|
222
|
+
# Weird iterator scoping makes us assign this to a local function
|
223
|
+
size = self._size_from_obj
|
224
|
+
entries = [
|
225
|
+
self._entry_from_obj(obj, path, name, prefix=key, multi=multi)
|
226
|
+
for obj in objs
|
227
|
+
if size(obj) > 0
|
228
|
+
]
|
229
|
+
if start_time is not None:
|
230
|
+
termlog("Done. %.1fs" % (time.time() - start_time), prefix=False)
|
231
|
+
if len(entries) > max_objects:
|
232
|
+
raise ValueError(
|
233
|
+
f"Exceeded {max_objects} objects tracked, pass max_objects to add_reference"
|
234
|
+
)
|
235
|
+
return entries
|
236
|
+
|
237
|
+
def _size_from_obj(self, obj: boto3.s3.Object | boto3.s3.ObjectSummary) -> int:
|
238
|
+
# ObjectSummary has size, Object has content_length
|
239
|
+
size: int
|
240
|
+
if hasattr(obj, "size"):
|
241
|
+
size = obj.size
|
242
|
+
else:
|
243
|
+
size = obj.content_length
|
244
|
+
return size
|
245
|
+
|
246
|
+
def _entry_from_obj(
|
247
|
+
self,
|
248
|
+
obj: boto3.s3.Object | boto3.s3.ObjectSummary,
|
249
|
+
path: str,
|
250
|
+
name: StrPath | None = None,
|
251
|
+
prefix: str = "",
|
252
|
+
multi: bool = False,
|
253
|
+
) -> ArtifactManifestEntry:
|
254
|
+
"""Create an ArtifactManifestEntry from an S3 object.
|
255
|
+
|
256
|
+
Args:
|
257
|
+
obj: The S3 object
|
258
|
+
path: The S3-style path (e.g.: "s3://bucket/file.txt")
|
259
|
+
name: The user assigned name, or None if not specified
|
260
|
+
prefix: The prefix to add (will be the same as `path` for directories)
|
261
|
+
multi: Whether or not this is a multi-object add.
|
262
|
+
"""
|
263
|
+
bucket, key, _ = self._parse_uri(path)
|
264
|
+
|
265
|
+
# Always use posix paths, since that's what S3 uses.
|
266
|
+
posix_key = PurePosixPath(obj.key) # the bucket key
|
267
|
+
posix_path = PurePosixPath(bucket) / key # the path, with the scheme stripped
|
268
|
+
posix_prefix = PurePosixPath(prefix) # the prefix, if adding a prefix
|
269
|
+
posix_name = PurePosixPath(name or "")
|
270
|
+
posix_ref = posix_path
|
271
|
+
|
272
|
+
if name is None:
|
273
|
+
# We're adding a directory (prefix), so calculate a relative path.
|
274
|
+
if str(posix_prefix) in str(posix_key) and posix_prefix != posix_key:
|
275
|
+
posix_name = posix_key.relative_to(posix_prefix)
|
276
|
+
posix_ref = posix_path / posix_name
|
277
|
+
else:
|
278
|
+
posix_name = PurePosixPath(posix_key.name)
|
279
|
+
posix_ref = posix_path
|
280
|
+
elif multi:
|
281
|
+
# We're adding a directory with a name override.
|
282
|
+
relpath = posix_key.relative_to(posix_prefix)
|
283
|
+
posix_name = posix_name / relpath
|
284
|
+
posix_ref = posix_path / relpath
|
285
|
+
return ArtifactManifestEntry(
|
286
|
+
path=posix_name,
|
287
|
+
ref=URIStr(f"{self._scheme}://{str(posix_ref)}"),
|
288
|
+
digest=ETag(self._etag_from_obj(obj)),
|
289
|
+
size=self._size_from_obj(obj),
|
290
|
+
extra=self._extra_from_obj(obj),
|
291
|
+
)
|
292
|
+
|
293
|
+
@staticmethod
|
294
|
+
def _etag_from_obj(obj: boto3.s3.Object | boto3.s3.ObjectSummary) -> ETag:
|
295
|
+
etag: ETag
|
296
|
+
etag = obj.e_tag[1:-1] # escape leading and trailing quote
|
297
|
+
return etag
|
298
|
+
|
299
|
+
def _extra_from_obj(
|
300
|
+
self, obj: boto3.s3.Object | boto3.s3.ObjectSummary
|
301
|
+
) -> dict[str, str]:
|
302
|
+
extra = {
|
303
|
+
"etag": obj.e_tag[1:-1], # escape leading and trailing quote
|
304
|
+
}
|
305
|
+
if not hasattr(obj, "version_id"):
|
306
|
+
# Convert ObjectSummary to Object to get the version_id.
|
307
|
+
obj = self._s3.Object(obj.bucket_name, obj.key) # type: ignore[union-attr]
|
308
|
+
if hasattr(obj, "version_id") and obj.version_id and obj.version_id != "null":
|
309
|
+
extra["versionID"] = obj.version_id
|
310
|
+
return extra
|
311
|
+
|
312
|
+
_CW_LEGACY_NETLOC_REGEX: re.Pattern[str] = re.compile(
|
313
|
+
r"""
|
314
|
+
# accelerated endpoints like "accel-object.<region>.coreweave.com"
|
315
|
+
accel-object\.[a-z0-9-]+\.coreweave\.com
|
316
|
+
|
|
317
|
+
# URLs like "object.<region>.coreweave.com"
|
318
|
+
object\.[a-z0-9-]+\.coreweave\.com
|
319
|
+
""",
|
320
|
+
flags=re.VERBOSE,
|
321
|
+
)
|
322
|
+
|
323
|
+
def _is_coreweave_endpoint(self, endpoint_url: str) -> bool:
|
324
|
+
if not (url := endpoint_url.strip().rstrip("/")):
|
325
|
+
return False
|
326
|
+
|
327
|
+
# Only http://cwlota.com is supported using HTTP
|
328
|
+
if url == "http://cwlota.com":
|
329
|
+
return True
|
330
|
+
|
331
|
+
# Enforce HTTPS otherwise
|
332
|
+
https_url = ensureprefix(url, "https://")
|
333
|
+
netloc = urlparse(https_url).netloc
|
334
|
+
return bool(
|
335
|
+
# Match for https://cwobject.com
|
336
|
+
(netloc == "cwobject.com")
|
337
|
+
or
|
338
|
+
# Check for legacy endpoints
|
339
|
+
self._CW_LEGACY_NETLOC_REGEX.fullmatch(netloc)
|
340
|
+
)
|