wandb 0.18.2__py3-none-musllinux_1_2_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package_readme.md +89 -0
- wandb/__init__.py +245 -0
- wandb/__init__.pyi +1139 -0
- wandb/__main__.py +3 -0
- wandb/_globals.py +19 -0
- wandb/agents/__init__.py +0 -0
- wandb/agents/pyagent.py +363 -0
- wandb/analytics/__init__.py +3 -0
- wandb/analytics/sentry.py +266 -0
- wandb/apis/__init__.py +48 -0
- wandb/apis/attrs.py +40 -0
- wandb/apis/importers/__init__.py +1 -0
- wandb/apis/importers/internals/internal.py +385 -0
- wandb/apis/importers/internals/protocols.py +99 -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 +1603 -0
- wandb/apis/internal.py +232 -0
- wandb/apis/normalize.py +89 -0
- wandb/apis/paginator.py +81 -0
- wandb/apis/public/__init__.py +34 -0
- wandb/apis/public/api.py +1305 -0
- wandb/apis/public/artifacts.py +1090 -0
- wandb/apis/public/const.py +4 -0
- wandb/apis/public/files.py +195 -0
- wandb/apis/public/history.py +149 -0
- wandb/apis/public/jobs.py +659 -0
- wandb/apis/public/projects.py +154 -0
- wandb/apis/public/query_generator.py +166 -0
- wandb/apis/public/reports.py +469 -0
- wandb/apis/public/runs.py +914 -0
- wandb/apis/public/sweeps.py +240 -0
- wandb/apis/public/teams.py +198 -0
- wandb/apis/public/users.py +136 -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/beta/workflows.py +288 -0
- wandb/bin/nvidia_gpu_stats +0 -0
- wandb/bin/wandb-core +0 -0
- wandb/cli/__init__.py +0 -0
- wandb/cli/cli.py +3004 -0
- wandb/data_types.py +63 -0
- wandb/docker/__init__.py +342 -0
- wandb/docker/auth.py +436 -0
- wandb/docker/wandb-entrypoint.sh +33 -0
- wandb/docker/www_authenticate.py +94 -0
- wandb/env.py +514 -0
- wandb/errors/__init__.py +17 -0
- wandb/errors/errors.py +37 -0
- wandb/errors/term.py +103 -0
- wandb/errors/util.py +57 -0
- wandb/errors/warnings.py +2 -0
- wandb/filesync/__init__.py +0 -0
- wandb/filesync/dir_watcher.py +403 -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 +290 -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 +178 -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 +882 -0
- wandb/integration/diffusers/resolvers/utils.py +102 -0
- wandb/integration/fastai/__init__.py +249 -0
- wandb/integration/gym/__init__.py +105 -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 +136 -0
- wandb/integration/keras/callbacks/model_checkpoint.py +195 -0
- wandb/integration/keras/callbacks/tables_builder.py +226 -0
- wandb/integration/keras/keras.py +1091 -0
- wandb/integration/kfp/__init__.py +6 -0
- wandb/integration/kfp/helpers.py +28 -0
- wandb/integration/kfp/kfp_patch.py +324 -0
- wandb/integration/kfp/wandb_logging.py +182 -0
- wandb/integration/langchain/__init__.py +3 -0
- wandb/integration/langchain/wandb_tracer.py +48 -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 +762 -0
- wandb/integration/magic.py +556 -0
- wandb/integration/metaflow/__init__.py +3 -0
- wandb/integration/metaflow/metaflow.py +383 -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 +299 -0
- wandb/integration/sacred/__init__.py +117 -0
- wandb/integration/sagemaker/__init__.py +12 -0
- wandb/integration/sagemaker/auth.py +28 -0
- wandb/integration/sagemaker/config.py +49 -0
- wandb/integration/sagemaker/files.py +3 -0
- wandb/integration/sagemaker/resources.py +34 -0
- wandb/integration/sb3/__init__.py +3 -0
- wandb/integration/sb3/sb3.py +153 -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 +183 -0
- wandb/integration/tensorboard/__init__.py +10 -0
- wandb/integration/tensorboard/log.py +355 -0
- wandb/integration/tensorboard/monkeypatch.py +185 -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 +208 -0
- wandb/integration/ultralytics/callback.py +524 -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/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 +515 -0
- wandb/magic.py +3 -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 +173 -0
- wandb/old/summary.py +440 -0
- wandb/plot/__init__.py +19 -0
- wandb/plot/bar.py +45 -0
- wandb/plot/confusion_matrix.py +100 -0
- wandb/plot/histogram.py +39 -0
- wandb/plot/line.py +43 -0
- wandb/plot/line_series.py +88 -0
- wandb/plot/pr_curve.py +136 -0
- wandb/plot/roc_curve.py +118 -0
- wandb/plot/scatter.py +32 -0
- wandb/plot/utils.py +183 -0
- wandb/plot/viz.py +123 -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 +1608 -0
- wandb/proto/v3/wandb_server_pb2.py +208 -0
- wandb/proto/v3/wandb_settings_pb2.py +112 -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 +360 -0
- wandb/proto/v4/wandb_server_pb2.py +63 -0
- wandb/proto/v4/wandb_settings_pb2.py +45 -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 +361 -0
- wandb/proto/v5/wandb_server_pb2.py +64 -0
- wandb/proto/v5/wandb_settings_pb2.py +46 -0
- wandb/proto/v5/wandb_telemetry_pb2.py +42 -0
- wandb/proto/wandb_base_pb2.py +10 -0
- wandb/proto/wandb_deprecated.py +53 -0
- wandb/proto/wandb_generate_deprecated.py +34 -0
- wandb/proto/wandb_generate_proto.py +49 -0
- wandb/proto/wandb_internal_pb2.py +16 -0
- wandb/proto/wandb_server_pb2.py +10 -0
- wandb/proto/wandb_settings_pb2.py +10 -0
- wandb/proto/wandb_telemetry_pb2.py +10 -0
- wandb/py.typed +0 -0
- wandb/sdk/__init__.py +37 -0
- wandb/sdk/artifacts/__init__.py +0 -0
- wandb/sdk/artifacts/_validators.py +90 -0
- wandb/sdk/artifacts/artifact.py +2389 -0
- wandb/sdk/artifacts/artifact_download_logger.py +43 -0
- wandb/sdk/artifacts/artifact_file_cache.py +253 -0
- wandb/sdk/artifacts/artifact_instance_cache.py +17 -0
- wandb/sdk/artifacts/artifact_manifest.py +74 -0
- wandb/sdk/artifacts/artifact_manifest_entry.py +249 -0
- wandb/sdk/artifacts/artifact_manifests/__init__.py +0 -0
- wandb/sdk/artifacts/artifact_manifests/artifact_manifest_v1.py +92 -0
- wandb/sdk/artifacts/artifact_saver.py +269 -0
- wandb/sdk/artifacts/artifact_state.py +11 -0
- wandb/sdk/artifacts/artifact_ttl.py +7 -0
- wandb/sdk/artifacts/exceptions.py +57 -0
- wandb/sdk/artifacts/staging.py +25 -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 +208 -0
- wandb/sdk/artifacts/storage_handlers/gcs_handler.py +228 -0
- wandb/sdk/artifacts/storage_handlers/http_handler.py +114 -0
- wandb/sdk/artifacts/storage_handlers/local_file_handler.py +141 -0
- wandb/sdk/artifacts/storage_handlers/multi_handler.py +56 -0
- wandb/sdk/artifacts/storage_handlers/s3_handler.py +300 -0
- wandb/sdk/artifacts/storage_handlers/tracking_handler.py +72 -0
- wandb/sdk/artifacts/storage_handlers/wb_artifact_handler.py +135 -0
- wandb/sdk/artifacts/storage_handlers/wb_local_artifact_handler.py +74 -0
- wandb/sdk/artifacts/storage_layout.py +6 -0
- wandb/sdk/artifacts/storage_policies/__init__.py +4 -0
- wandb/sdk/artifacts/storage_policies/register.py +1 -0
- wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +378 -0
- wandb/sdk/artifacts/storage_policy.py +72 -0
- wandb/sdk/backend/__init__.py +0 -0
- wandb/sdk/backend/backend.py +222 -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 +165 -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 +315 -0
- wandb/sdk/data_types/base_types/wb_value.py +272 -0
- wandb/sdk/data_types/bokeh.py +70 -0
- wandb/sdk/data_types/graph.py +405 -0
- wandb/sdk/data_types/helper_types/__init__.py +0 -0
- wandb/sdk/data_types/helper_types/bounding_boxes_2d.py +295 -0
- wandb/sdk/data_types/helper_types/classes.py +159 -0
- wandb/sdk/data_types/helper_types/image_mask.py +235 -0
- wandb/sdk/data_types/histogram.py +96 -0
- wandb/sdk/data_types/html.py +115 -0
- wandb/sdk/data_types/image.py +845 -0
- wandb/sdk/data_types/molecule.py +241 -0
- wandb/sdk/data_types/object_3d.py +474 -0
- wandb/sdk/data_types/plotly.py +82 -0
- wandb/sdk/data_types/saved_model.py +446 -0
- wandb/sdk/data_types/table.py +1204 -0
- wandb/sdk/data_types/trace_tree.py +438 -0
- wandb/sdk/data_types/utils.py +229 -0
- wandb/sdk/data_types/video.py +247 -0
- wandb/sdk/integration_utils/__init__.py +0 -0
- wandb/sdk/integration_utils/auto_logging.py +239 -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 +972 -0
- wandb/sdk/interface/interface_queue.py +59 -0
- wandb/sdk/interface/interface_relay.py +53 -0
- wandb/sdk/interface/interface_shared.py +537 -0
- wandb/sdk/interface/interface_sock.py +61 -0
- wandb/sdk/interface/message_future.py +27 -0
- wandb/sdk/interface/message_future_poll.py +50 -0
- wandb/sdk/interface/router.py +118 -0
- wandb/sdk/interface/router_queue.py +44 -0
- wandb/sdk/interface/router_relay.py +39 -0
- wandb/sdk/interface/router_sock.py +36 -0
- wandb/sdk/interface/summary_record.py +67 -0
- wandb/sdk/internal/__init__.py +0 -0
- wandb/sdk/internal/context.py +89 -0
- wandb/sdk/internal/datastore.py +297 -0
- wandb/sdk/internal/file_pusher.py +181 -0
- wandb/sdk/internal/file_stream.py +695 -0
- wandb/sdk/internal/flow_control.py +263 -0
- wandb/sdk/internal/handler.py +901 -0
- wandb/sdk/internal/internal.py +417 -0
- wandb/sdk/internal/internal_api.py +4358 -0
- wandb/sdk/internal/internal_util.py +100 -0
- wandb/sdk/internal/job_builder.py +629 -0
- wandb/sdk/internal/profiler.py +78 -0
- wandb/sdk/internal/progress.py +83 -0
- wandb/sdk/internal/run.py +25 -0
- wandb/sdk/internal/sample.py +70 -0
- wandb/sdk/internal/sender.py +1686 -0
- wandb/sdk/internal/sender_config.py +197 -0
- wandb/sdk/internal/settings_static.py +90 -0
- wandb/sdk/internal/system/__init__.py +0 -0
- wandb/sdk/internal/system/assets/__init__.py +27 -0
- wandb/sdk/internal/system/assets/aggregators.py +37 -0
- wandb/sdk/internal/system/assets/asset_registry.py +20 -0
- wandb/sdk/internal/system/assets/cpu.py +163 -0
- wandb/sdk/internal/system/assets/disk.py +210 -0
- wandb/sdk/internal/system/assets/gpu.py +416 -0
- wandb/sdk/internal/system/assets/gpu_amd.py +239 -0
- wandb/sdk/internal/system/assets/gpu_apple.py +177 -0
- wandb/sdk/internal/system/assets/interfaces.py +207 -0
- wandb/sdk/internal/system/assets/ipu.py +177 -0
- wandb/sdk/internal/system/assets/memory.py +166 -0
- wandb/sdk/internal/system/assets/network.py +125 -0
- wandb/sdk/internal/system/assets/open_metrics.py +299 -0
- wandb/sdk/internal/system/assets/tpu.py +154 -0
- wandb/sdk/internal/system/assets/trainium.py +399 -0
- wandb/sdk/internal/system/env_probe_helpers.py +13 -0
- wandb/sdk/internal/system/system_info.py +249 -0
- wandb/sdk/internal/system/system_monitor.py +229 -0
- wandb/sdk/internal/tb_watcher.py +518 -0
- wandb/sdk/internal/thread_local_settings.py +18 -0
- wandb/sdk/internal/writer.py +206 -0
- wandb/sdk/launch/__init__.py +14 -0
- wandb/sdk/launch/_launch.py +330 -0
- wandb/sdk/launch/_launch_add.py +255 -0
- wandb/sdk/launch/_project_spec.py +566 -0
- wandb/sdk/launch/agent/__init__.py +5 -0
- wandb/sdk/launch/agent/agent.py +924 -0
- wandb/sdk/launch/agent/config.py +296 -0
- wandb/sdk/launch/agent/job_status_tracker.py +53 -0
- wandb/sdk/launch/agent/run_queue_item_file_saver.py +45 -0
- wandb/sdk/launch/builder/__init__.py +0 -0
- wandb/sdk/launch/builder/abstract.py +156 -0
- wandb/sdk/launch/builder/build.py +297 -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 +528 -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 +335 -0
- wandb/sdk/launch/environment/local_environment.py +66 -0
- wandb/sdk/launch/errors.py +19 -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 +39 -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 +67 -0
- wandb/sdk/launch/runner/__init__.py +0 -0
- wandb/sdk/launch/runner/abstract.py +195 -0
- wandb/sdk/launch/runner/kubernetes_monitor.py +474 -0
- wandb/sdk/launch/runner/kubernetes_runner.py +963 -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 +426 -0
- wandb/sdk/launch/runner/vertex_runner.py +230 -0
- wandb/sdk/launch/sweeps/__init__.py +39 -0
- wandb/sdk/launch/sweeps/scheduler.py +742 -0
- wandb/sdk/launch/sweeps/scheduler_sweep.py +91 -0
- wandb/sdk/launch/sweeps/utils.py +316 -0
- wandb/sdk/launch/utils.py +746 -0
- wandb/sdk/launch/wandb_reference.py +138 -0
- wandb/sdk/lib/__init__.py +5 -0
- wandb/sdk/lib/_settings_toposort_generate.py +159 -0
- wandb/sdk/lib/_settings_toposort_generated.py +250 -0
- wandb/sdk/lib/_wburls_generate.py +25 -0
- wandb/sdk/lib/_wburls_generated.py +22 -0
- wandb/sdk/lib/apikey.py +273 -0
- wandb/sdk/lib/capped_dict.py +26 -0
- wandb/sdk/lib/config_util.py +101 -0
- wandb/sdk/lib/credentials.py +141 -0
- wandb/sdk/lib/deprecate.py +42 -0
- wandb/sdk/lib/disabled.py +29 -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 +174 -0
- wandb/sdk/lib/gitlib.py +239 -0
- wandb/sdk/lib/gql_request.py +65 -0
- wandb/sdk/lib/handler_util.py +21 -0
- wandb/sdk/lib/hashutil.py +84 -0
- wandb/sdk/lib/import_hooks.py +275 -0
- wandb/sdk/lib/ipython.py +146 -0
- wandb/sdk/lib/json_util.py +80 -0
- wandb/sdk/lib/lazyloader.py +63 -0
- wandb/sdk/lib/mailbox.py +460 -0
- wandb/sdk/lib/module.py +69 -0
- wandb/sdk/lib/paths.py +106 -0
- wandb/sdk/lib/preinit.py +42 -0
- wandb/sdk/lib/printer.py +313 -0
- wandb/sdk/lib/proto_util.py +90 -0
- wandb/sdk/lib/redirect.py +845 -0
- wandb/sdk/lib/reporting.py +99 -0
- wandb/sdk/lib/retry.py +289 -0
- wandb/sdk/lib/run_moment.py +78 -0
- wandb/sdk/lib/runid.py +12 -0
- wandb/sdk/lib/server.py +52 -0
- wandb/sdk/lib/service_connection.py +216 -0
- wandb/sdk/lib/service_token.py +94 -0
- wandb/sdk/lib/sock_client.py +295 -0
- wandb/sdk/lib/sparkline.py +45 -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/tracelog.py +255 -0
- wandb/sdk/lib/wburls.py +46 -0
- wandb/sdk/service/__init__.py +0 -0
- wandb/sdk/service/_startup_debug.py +22 -0
- wandb/sdk/service/port_file.py +53 -0
- wandb/sdk/service/server.py +116 -0
- wandb/sdk/service/server_sock.py +276 -0
- wandb/sdk/service/service.py +242 -0
- wandb/sdk/service/streams.py +417 -0
- wandb/sdk/verify/__init__.py +0 -0
- wandb/sdk/verify/verify.py +501 -0
- wandb/sdk/wandb_alerts.py +12 -0
- wandb/sdk/wandb_config.py +322 -0
- wandb/sdk/wandb_helper.py +54 -0
- wandb/sdk/wandb_init.py +1266 -0
- wandb/sdk/wandb_login.py +349 -0
- wandb/sdk/wandb_metric.py +110 -0
- wandb/sdk/wandb_require.py +97 -0
- wandb/sdk/wandb_require_helpers.py +44 -0
- wandb/sdk/wandb_run.py +4236 -0
- wandb/sdk/wandb_settings.py +2001 -0
- wandb/sdk/wandb_setup.py +409 -0
- wandb/sdk/wandb_summary.py +150 -0
- wandb/sdk/wandb_sweep.py +119 -0
- wandb/sdk/wandb_sync.py +81 -0
- wandb/sdk/wandb_watch.py +144 -0
- wandb/sklearn.py +35 -0
- wandb/sync/__init__.py +3 -0
- wandb/sync/sync.py +443 -0
- wandb/trigger.py +29 -0
- wandb/util.py +1956 -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/pynvml/__init__.py +0 -0
- wandb/vendor/pynvml/pynvml.py +4779 -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 +588 -0
- wandb/wandb_controller.py +721 -0
- wandb/wandb_run.py +9 -0
- wandb-0.18.2.dist-info/METADATA +213 -0
- wandb-0.18.2.dist-info/RECORD +827 -0
- wandb-0.18.2.dist-info/WHEEL +5 -0
- wandb-0.18.2.dist-info/entry_points.txt +3 -0
- wandb-0.18.2.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,208 @@
|
|
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 load_path(
|
32
|
+
self,
|
33
|
+
manifest_entry: ArtifactManifestEntry,
|
34
|
+
local: bool = False,
|
35
|
+
) -> URIStr | FilePathStr:
|
36
|
+
assert manifest_entry.ref is not None
|
37
|
+
if not local:
|
38
|
+
return manifest_entry.ref
|
39
|
+
|
40
|
+
path, hit, cache_open = get_artifact_file_cache().check_etag_obj_path(
|
41
|
+
URIStr(manifest_entry.ref),
|
42
|
+
ETag(manifest_entry.digest),
|
43
|
+
manifest_entry.size or 0,
|
44
|
+
)
|
45
|
+
if hit:
|
46
|
+
return path
|
47
|
+
|
48
|
+
account_url, container_name, blob_name, query = self._parse_uri(
|
49
|
+
manifest_entry.ref
|
50
|
+
)
|
51
|
+
version_id = manifest_entry.extra.get("versionID")
|
52
|
+
blob_service_client = self._get_module("azure.storage.blob").BlobServiceClient(
|
53
|
+
account_url, credential=self._get_credential(account_url)
|
54
|
+
)
|
55
|
+
blob_client = blob_service_client.get_blob_client(
|
56
|
+
container=container_name, blob=blob_name
|
57
|
+
)
|
58
|
+
if version_id is None:
|
59
|
+
# Try current version, then all versions.
|
60
|
+
try:
|
61
|
+
downloader = blob_client.download_blob(
|
62
|
+
etag=manifest_entry.digest,
|
63
|
+
match_condition=self._get_module(
|
64
|
+
"azure.core"
|
65
|
+
).MatchConditions.IfNotModified,
|
66
|
+
)
|
67
|
+
except self._get_module("azure.core.exceptions").ResourceModifiedError:
|
68
|
+
container_client = blob_service_client.get_container_client(
|
69
|
+
container_name
|
70
|
+
)
|
71
|
+
for blob_properties in container_client.walk_blobs(
|
72
|
+
name_starts_with=blob_name, include=["versions"]
|
73
|
+
):
|
74
|
+
if (
|
75
|
+
blob_properties.name == blob_name
|
76
|
+
and blob_properties.etag == manifest_entry.digest
|
77
|
+
and blob_properties.version_id is not None
|
78
|
+
):
|
79
|
+
downloader = blob_client.download_blob(
|
80
|
+
version_id=blob_properties.version_id
|
81
|
+
)
|
82
|
+
break
|
83
|
+
else: # didn't break
|
84
|
+
raise ValueError(
|
85
|
+
f"Couldn't find blob version for {manifest_entry.ref} matching "
|
86
|
+
f"etag {manifest_entry.digest}."
|
87
|
+
)
|
88
|
+
else:
|
89
|
+
downloader = blob_client.download_blob(version_id=version_id)
|
90
|
+
with cache_open(mode="wb") as f:
|
91
|
+
downloader.readinto(f)
|
92
|
+
return path
|
93
|
+
|
94
|
+
def store_path(
|
95
|
+
self,
|
96
|
+
artifact: Artifact,
|
97
|
+
path: URIStr | FilePathStr,
|
98
|
+
name: StrPath | None = None,
|
99
|
+
checksum: bool = True,
|
100
|
+
max_objects: int | None = None,
|
101
|
+
) -> Sequence[ArtifactManifestEntry]:
|
102
|
+
account_url, container_name, blob_name, query = self._parse_uri(path)
|
103
|
+
path = URIStr(f"{account_url}/{container_name}/{blob_name}")
|
104
|
+
|
105
|
+
if not checksum:
|
106
|
+
return [
|
107
|
+
ArtifactManifestEntry(path=name or blob_name, digest=path, ref=path)
|
108
|
+
]
|
109
|
+
|
110
|
+
blob_service_client = self._get_module("azure.storage.blob").BlobServiceClient(
|
111
|
+
account_url, credential=self._get_credential(account_url)
|
112
|
+
)
|
113
|
+
blob_client = blob_service_client.get_blob_client(
|
114
|
+
container=container_name, blob=blob_name
|
115
|
+
)
|
116
|
+
if blob_client.exists(version_id=query.get("versionId")):
|
117
|
+
blob_properties = blob_client.get_blob_properties(
|
118
|
+
version_id=query.get("versionId")
|
119
|
+
)
|
120
|
+
|
121
|
+
if not self._is_directory_stub(blob_properties):
|
122
|
+
return [
|
123
|
+
self._create_entry(
|
124
|
+
blob_properties,
|
125
|
+
path=name or PurePosixPath(blob_name).name,
|
126
|
+
ref=URIStr(
|
127
|
+
f"{account_url}/{container_name}/{blob_properties.name}"
|
128
|
+
),
|
129
|
+
)
|
130
|
+
]
|
131
|
+
|
132
|
+
entries: list[ArtifactManifestEntry] = []
|
133
|
+
container_client = blob_service_client.get_container_client(container_name)
|
134
|
+
max_objects = max_objects or DEFAULT_MAX_OBJECTS
|
135
|
+
for blob_properties in container_client.list_blobs(
|
136
|
+
name_starts_with=f"{blob_name}/"
|
137
|
+
):
|
138
|
+
if len(entries) >= max_objects:
|
139
|
+
raise ValueError(
|
140
|
+
f"Exceeded {max_objects} objects tracked, pass max_objects to "
|
141
|
+
f"add_reference"
|
142
|
+
)
|
143
|
+
if not self._is_directory_stub(blob_properties):
|
144
|
+
suffix = PurePosixPath(blob_properties.name).relative_to(blob_name)
|
145
|
+
entries.append(
|
146
|
+
self._create_entry(
|
147
|
+
blob_properties,
|
148
|
+
path=LogicalPath(name) / suffix if name else suffix,
|
149
|
+
ref=URIStr(
|
150
|
+
f"{account_url}/{container_name}/{blob_properties.name}"
|
151
|
+
),
|
152
|
+
)
|
153
|
+
)
|
154
|
+
return entries
|
155
|
+
|
156
|
+
def _get_module(self, name: str) -> ModuleType:
|
157
|
+
module = util.get_module(
|
158
|
+
name,
|
159
|
+
lazy=False,
|
160
|
+
required="Azure references require the azure library, run "
|
161
|
+
"pip install wandb[azure]",
|
162
|
+
)
|
163
|
+
assert isinstance(module, ModuleType)
|
164
|
+
return module
|
165
|
+
|
166
|
+
def _get_credential(
|
167
|
+
self, account_url: str
|
168
|
+
) -> azure.identity.DefaultAzureCredential | str:
|
169
|
+
if (
|
170
|
+
wandb.run
|
171
|
+
and wandb.run.settings.azure_account_url_to_access_key is not None
|
172
|
+
and account_url in wandb.run.settings.azure_account_url_to_access_key
|
173
|
+
):
|
174
|
+
return wandb.run.settings.azure_account_url_to_access_key[account_url]
|
175
|
+
return self._get_module("azure.identity").DefaultAzureCredential()
|
176
|
+
|
177
|
+
def _parse_uri(self, uri: str) -> tuple[str, str, str, dict[str, str]]:
|
178
|
+
parsed_url = urlparse(uri)
|
179
|
+
query = dict(parse_qsl(parsed_url.query))
|
180
|
+
account_url = f"{parsed_url.scheme}://{parsed_url.netloc}"
|
181
|
+
_, container_name, blob_name = parsed_url.path.split("/", 2)
|
182
|
+
return account_url, container_name, blob_name, query
|
183
|
+
|
184
|
+
def _create_entry(
|
185
|
+
self,
|
186
|
+
blob_properties: azure.storage.blob.BlobProperties,
|
187
|
+
path: StrPath,
|
188
|
+
ref: URIStr,
|
189
|
+
) -> ArtifactManifestEntry:
|
190
|
+
extra = {"etag": blob_properties.etag.strip('"')}
|
191
|
+
if blob_properties.version_id:
|
192
|
+
extra["versionID"] = blob_properties.version_id
|
193
|
+
return ArtifactManifestEntry(
|
194
|
+
path=path,
|
195
|
+
ref=ref,
|
196
|
+
digest=blob_properties.etag.strip('"'),
|
197
|
+
size=blob_properties.size,
|
198
|
+
extra=extra,
|
199
|
+
)
|
200
|
+
|
201
|
+
def _is_directory_stub(
|
202
|
+
self, blob_properties: azure.storage.blob.BlobProperties
|
203
|
+
) -> bool:
|
204
|
+
return (
|
205
|
+
blob_properties.has_key("metadata")
|
206
|
+
and "hdi_isfolder" in blob_properties.metadata
|
207
|
+
and blob_properties.metadata["hdi_isfolder"] == "true"
|
208
|
+
)
|
@@ -0,0 +1,228 @@
|
|
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
|
+
pass
|
28
|
+
|
29
|
+
|
30
|
+
class GCSHandler(StorageHandler):
|
31
|
+
_client: gcs_module.client.Client | None
|
32
|
+
|
33
|
+
def __init__(self, scheme: str | None = None) -> None:
|
34
|
+
self._scheme = scheme or "gs"
|
35
|
+
self._client = None
|
36
|
+
self._cache = get_artifact_file_cache()
|
37
|
+
|
38
|
+
def can_handle(self, parsed_url: ParseResult) -> bool:
|
39
|
+
return parsed_url.scheme == self._scheme
|
40
|
+
|
41
|
+
def init_gcs(self) -> gcs_module.client.Client:
|
42
|
+
if self._client is not None:
|
43
|
+
return self._client
|
44
|
+
storage = util.get_module(
|
45
|
+
"google.cloud.storage",
|
46
|
+
required="gs:// references requires the google-cloud-storage library, run pip install wandb[gcp]",
|
47
|
+
)
|
48
|
+
self._client = storage.Client()
|
49
|
+
return self._client
|
50
|
+
|
51
|
+
def _parse_uri(self, uri: str) -> tuple[str, str, str | None]:
|
52
|
+
url = urlparse(uri)
|
53
|
+
bucket = url.netloc
|
54
|
+
key = url.path[1:]
|
55
|
+
version = url.fragment if url.fragment else None
|
56
|
+
return bucket, key, version
|
57
|
+
|
58
|
+
def load_path(
|
59
|
+
self,
|
60
|
+
manifest_entry: ArtifactManifestEntry,
|
61
|
+
local: bool = False,
|
62
|
+
) -> URIStr | FilePathStr:
|
63
|
+
assert manifest_entry.ref is not None
|
64
|
+
if not local:
|
65
|
+
return manifest_entry.ref
|
66
|
+
|
67
|
+
path, hit, cache_open = self._cache.check_etag_obj_path(
|
68
|
+
url=URIStr(manifest_entry.ref),
|
69
|
+
etag=ETag(manifest_entry.digest),
|
70
|
+
size=manifest_entry.size if manifest_entry.size is not None else 0,
|
71
|
+
)
|
72
|
+
if hit:
|
73
|
+
return path
|
74
|
+
|
75
|
+
self.init_gcs()
|
76
|
+
assert self._client is not None # mypy: unwraps optionality
|
77
|
+
assert manifest_entry.ref is not None
|
78
|
+
bucket, key, _ = self._parse_uri(manifest_entry.ref)
|
79
|
+
version = manifest_entry.extra.get("versionID")
|
80
|
+
|
81
|
+
if self._is_dir(manifest_entry):
|
82
|
+
raise _GCSIsADirectoryError(
|
83
|
+
f"Unable to download GCS folder {manifest_entry.ref!r}, skipping"
|
84
|
+
)
|
85
|
+
|
86
|
+
obj = None
|
87
|
+
# First attempt to get the generation specified, this will return None if versioning is not enabled
|
88
|
+
if version is not None:
|
89
|
+
obj = self._client.bucket(bucket).get_blob(key, generation=version)
|
90
|
+
|
91
|
+
if obj is None:
|
92
|
+
# Object versioning is disabled on the bucket, so just get
|
93
|
+
# the latest version and make sure the MD5 matches.
|
94
|
+
obj = self._client.bucket(bucket).get_blob(key)
|
95
|
+
if obj is None:
|
96
|
+
raise ValueError(
|
97
|
+
f"Unable to download object {manifest_entry.ref} with generation {version}"
|
98
|
+
)
|
99
|
+
if obj.etag != manifest_entry.digest:
|
100
|
+
raise ValueError(
|
101
|
+
f"Digest mismatch for object {manifest_entry.ref}: "
|
102
|
+
f"expected {manifest_entry.digest} but found {obj.etag}"
|
103
|
+
)
|
104
|
+
|
105
|
+
with cache_open(mode="wb") as f:
|
106
|
+
obj.download_to_file(f)
|
107
|
+
return path
|
108
|
+
|
109
|
+
def store_path(
|
110
|
+
self,
|
111
|
+
artifact: Artifact,
|
112
|
+
path: URIStr | FilePathStr,
|
113
|
+
name: StrPath | None = None,
|
114
|
+
checksum: bool = True,
|
115
|
+
max_objects: int | None = None,
|
116
|
+
) -> Sequence[ArtifactManifestEntry]:
|
117
|
+
self.init_gcs()
|
118
|
+
assert self._client is not None # mypy: unwraps optionality
|
119
|
+
|
120
|
+
# After parsing any query params / fragments for additional context,
|
121
|
+
# such as version identifiers, pare down the path to just the bucket
|
122
|
+
# and key.
|
123
|
+
bucket, key, version = self._parse_uri(path)
|
124
|
+
path = URIStr(f"{self._scheme}://{bucket}/{key}")
|
125
|
+
max_objects = max_objects or DEFAULT_MAX_OBJECTS
|
126
|
+
|
127
|
+
if not checksum:
|
128
|
+
return [ArtifactManifestEntry(path=name or key, ref=path, digest=path)]
|
129
|
+
|
130
|
+
start_time = None
|
131
|
+
obj = self._client.bucket(bucket).get_blob(key, generation=version)
|
132
|
+
if obj is None and version is not None:
|
133
|
+
raise ValueError(f"Object does not exist: {path}#{version}")
|
134
|
+
multi = obj is None
|
135
|
+
if multi:
|
136
|
+
start_time = time.time()
|
137
|
+
termlog(
|
138
|
+
'Generating checksum for up to %i objects with prefix "%s"... '
|
139
|
+
% (max_objects, key),
|
140
|
+
newline=False,
|
141
|
+
)
|
142
|
+
objects = self._client.bucket(bucket).list_blobs(
|
143
|
+
prefix=key, max_results=max_objects
|
144
|
+
)
|
145
|
+
else:
|
146
|
+
objects = [obj]
|
147
|
+
|
148
|
+
entries = [
|
149
|
+
self._entry_from_obj(obj, path, name, prefix=key, multi=multi)
|
150
|
+
for obj in objects
|
151
|
+
if not obj.name.endswith("/")
|
152
|
+
]
|
153
|
+
if start_time is not None:
|
154
|
+
termlog("Done. %.1fs" % (time.time() - start_time), prefix=False)
|
155
|
+
if len(entries) > max_objects:
|
156
|
+
raise ValueError(
|
157
|
+
"Exceeded %i objects tracked, pass max_objects to add_reference"
|
158
|
+
% max_objects
|
159
|
+
)
|
160
|
+
return entries
|
161
|
+
|
162
|
+
def _entry_from_obj(
|
163
|
+
self,
|
164
|
+
obj: gcs_module.blob.Blob,
|
165
|
+
path: str,
|
166
|
+
name: StrPath | None = None,
|
167
|
+
prefix: str = "",
|
168
|
+
multi: bool = False,
|
169
|
+
) -> ArtifactManifestEntry:
|
170
|
+
"""Create an ArtifactManifestEntry from a GCS object.
|
171
|
+
|
172
|
+
Arguments:
|
173
|
+
obj: The GCS object
|
174
|
+
path: The GCS-style path (e.g.: "gs://bucket/file.txt")
|
175
|
+
name: The user assigned name, or None if not specified
|
176
|
+
prefix: The prefix to add (will be the same as `path` for directories)
|
177
|
+
multi: Whether or not this is a multi-object add.
|
178
|
+
"""
|
179
|
+
bucket, key, _ = self._parse_uri(path)
|
180
|
+
|
181
|
+
# Always use posix paths, since that's what S3 uses.
|
182
|
+
posix_key = PurePosixPath(obj.name) # the bucket key
|
183
|
+
posix_path = PurePosixPath(bucket) / PurePosixPath(
|
184
|
+
key
|
185
|
+
) # the path, with the scheme stripped
|
186
|
+
posix_prefix = PurePosixPath(prefix) # the prefix, if adding a prefix
|
187
|
+
posix_name = PurePosixPath(name or "")
|
188
|
+
posix_ref = posix_path
|
189
|
+
|
190
|
+
if name is None:
|
191
|
+
# We're adding a directory (prefix), so calculate a relative path.
|
192
|
+
if str(posix_prefix) in str(posix_key) and posix_prefix != posix_key:
|
193
|
+
posix_name = posix_key.relative_to(posix_prefix)
|
194
|
+
posix_ref = posix_path / posix_name
|
195
|
+
else:
|
196
|
+
posix_name = PurePosixPath(posix_key.name)
|
197
|
+
posix_ref = posix_path
|
198
|
+
elif multi:
|
199
|
+
# We're adding a directory with a name override.
|
200
|
+
relpath = posix_key.relative_to(posix_prefix)
|
201
|
+
posix_name = posix_name / relpath
|
202
|
+
posix_ref = posix_path / relpath
|
203
|
+
return ArtifactManifestEntry(
|
204
|
+
path=posix_name,
|
205
|
+
ref=URIStr(f"{self._scheme}://{str(posix_ref)}"),
|
206
|
+
digest=obj.etag,
|
207
|
+
size=obj.size,
|
208
|
+
extra={"versionID": obj.generation},
|
209
|
+
)
|
210
|
+
|
211
|
+
def _is_dir(
|
212
|
+
self,
|
213
|
+
manifest_entry: ArtifactManifestEntry,
|
214
|
+
) -> bool:
|
215
|
+
assert self._client is not None
|
216
|
+
assert manifest_entry.ref is not None
|
217
|
+
bucket, key, _ = self._parse_uri(manifest_entry.ref)
|
218
|
+
bucket_obj = self._client.bucket(bucket)
|
219
|
+
# A gcs bucket key should end with a forward slash on gcloud, but
|
220
|
+
# we save these refs without the forward slash in the manifest entry
|
221
|
+
# so we check the size and extension, make sure its not referring to
|
222
|
+
# an actual file with this reference, and that the ref with the slash
|
223
|
+
# exists on gcloud
|
224
|
+
return key.endswith("/") or (
|
225
|
+
not (manifest_entry.size or PurePosixPath(key).suffix)
|
226
|
+
and bucket_obj.get_blob(key) is None
|
227
|
+
and bucket_obj.get_blob(f"{key}/") is not None
|
228
|
+
)
|
@@ -0,0 +1,114 @@
|
|
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), # TODO(spencerpearson): unsafe cast
|
46
|
+
manifest_entry.size if manifest_entry.size is not None else 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
|
+
response.raise_for_status()
|
58
|
+
|
59
|
+
digest: ETag | FilePathStr | URIStr | None
|
60
|
+
digest, size, extra = self._entry_from_headers(response.headers)
|
61
|
+
digest = digest or manifest_entry.ref
|
62
|
+
if manifest_entry.digest != digest:
|
63
|
+
raise ValueError(
|
64
|
+
f"Digest mismatch for url {manifest_entry.ref}: expected {manifest_entry.digest} but found {digest}"
|
65
|
+
)
|
66
|
+
|
67
|
+
with cache_open(mode="wb") as file:
|
68
|
+
for data in response.iter_content(chunk_size=16 * 1024):
|
69
|
+
file.write(data)
|
70
|
+
return path
|
71
|
+
|
72
|
+
def store_path(
|
73
|
+
self,
|
74
|
+
artifact: Artifact,
|
75
|
+
path: URIStr | FilePathStr,
|
76
|
+
name: StrPath | None = None,
|
77
|
+
checksum: bool = True,
|
78
|
+
max_objects: int | None = None,
|
79
|
+
) -> Sequence[ArtifactManifestEntry]:
|
80
|
+
name = name or os.path.basename(path)
|
81
|
+
if not checksum:
|
82
|
+
return [ArtifactManifestEntry(path=name, ref=path, digest=path)]
|
83
|
+
|
84
|
+
with self._session.get(
|
85
|
+
path,
|
86
|
+
stream=True,
|
87
|
+
cookies=_thread_local_api_settings.cookies,
|
88
|
+
headers=_thread_local_api_settings.headers,
|
89
|
+
) as response:
|
90
|
+
response.raise_for_status()
|
91
|
+
digest: ETag | FilePathStr | URIStr | None
|
92
|
+
digest, size, extra = self._entry_from_headers(response.headers)
|
93
|
+
digest = digest or path
|
94
|
+
return [
|
95
|
+
ArtifactManifestEntry(
|
96
|
+
path=name, ref=path, digest=digest, size=size, extra=extra
|
97
|
+
)
|
98
|
+
]
|
99
|
+
|
100
|
+
def _entry_from_headers(
|
101
|
+
self, headers: CaseInsensitiveDict
|
102
|
+
) -> tuple[ETag | None, int | None, dict[str, str]]:
|
103
|
+
response_headers = {k.lower(): v for k, v in headers.items()}
|
104
|
+
size = None
|
105
|
+
if response_headers.get("content-length", None):
|
106
|
+
size = int(response_headers["content-length"])
|
107
|
+
|
108
|
+
digest = response_headers.get("etag", None)
|
109
|
+
extra = {}
|
110
|
+
if digest:
|
111
|
+
extra["etag"] = digest
|
112
|
+
if digest and digest[:1] == '"' and digest[-1:] == '"':
|
113
|
+
digest = digest[1:-1] # trim leading and trailing quotes around etag
|
114
|
+
return digest, size, extra
|
@@ -0,0 +1,141 @@
|
|
1
|
+
"""Local file storage handler."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
import os
|
6
|
+
import shutil
|
7
|
+
import time
|
8
|
+
from typing import TYPE_CHECKING, Sequence
|
9
|
+
from urllib.parse import ParseResult
|
10
|
+
|
11
|
+
from wandb import util
|
12
|
+
from wandb.errors.term import termlog
|
13
|
+
from wandb.sdk.artifacts.artifact_file_cache import get_artifact_file_cache
|
14
|
+
from wandb.sdk.artifacts.artifact_manifest_entry import ArtifactManifestEntry
|
15
|
+
from wandb.sdk.artifacts.storage_handler import DEFAULT_MAX_OBJECTS, StorageHandler
|
16
|
+
from wandb.sdk.lib import filesystem
|
17
|
+
from wandb.sdk.lib.hashutil import B64MD5, md5_file_b64, md5_string
|
18
|
+
from wandb.sdk.lib.paths import FilePathStr, StrPath, URIStr
|
19
|
+
|
20
|
+
if TYPE_CHECKING:
|
21
|
+
from wandb.sdk.artifacts.artifact import Artifact
|
22
|
+
|
23
|
+
|
24
|
+
class LocalFileHandler(StorageHandler):
|
25
|
+
"""Handles file:// references."""
|
26
|
+
|
27
|
+
def __init__(self, scheme: str | None = None) -> None:
|
28
|
+
"""Track files or directories on a local filesystem.
|
29
|
+
|
30
|
+
Expand directories to create an entry for each file contained.
|
31
|
+
"""
|
32
|
+
self._scheme = scheme or "file"
|
33
|
+
self._cache = get_artifact_file_cache()
|
34
|
+
|
35
|
+
def can_handle(self, parsed_url: ParseResult) -> bool:
|
36
|
+
return parsed_url.scheme == self._scheme
|
37
|
+
|
38
|
+
def load_path(
|
39
|
+
self,
|
40
|
+
manifest_entry: ArtifactManifestEntry,
|
41
|
+
local: bool = False,
|
42
|
+
) -> URIStr | FilePathStr:
|
43
|
+
if manifest_entry.ref is None:
|
44
|
+
raise ValueError(f"Cannot add path with no ref: {manifest_entry.path}")
|
45
|
+
local_path = util.local_file_uri_to_path(str(manifest_entry.ref))
|
46
|
+
if not os.path.exists(local_path):
|
47
|
+
raise ValueError(
|
48
|
+
"Local file reference: Failed to find file at path {}".format(
|
49
|
+
local_path
|
50
|
+
)
|
51
|
+
)
|
52
|
+
|
53
|
+
path, hit, cache_open = self._cache.check_md5_obj_path(
|
54
|
+
B64MD5(manifest_entry.digest), # TODO(spencerpearson): unsafe cast
|
55
|
+
manifest_entry.size if manifest_entry.size is not None else 0,
|
56
|
+
)
|
57
|
+
if hit:
|
58
|
+
return path
|
59
|
+
|
60
|
+
md5 = md5_file_b64(local_path)
|
61
|
+
if md5 != manifest_entry.digest:
|
62
|
+
raise ValueError(
|
63
|
+
f"Local file reference: Digest mismatch for path {local_path}: expected {manifest_entry.digest} but found {md5}"
|
64
|
+
)
|
65
|
+
|
66
|
+
filesystem.mkdir_exists_ok(os.path.dirname(path))
|
67
|
+
|
68
|
+
with cache_open() as f:
|
69
|
+
shutil.copy(local_path, f.name)
|
70
|
+
return path
|
71
|
+
|
72
|
+
def store_path(
|
73
|
+
self,
|
74
|
+
artifact: Artifact,
|
75
|
+
path: URIStr | FilePathStr,
|
76
|
+
name: StrPath | None = None,
|
77
|
+
checksum: bool = True,
|
78
|
+
max_objects: int | None = None,
|
79
|
+
) -> Sequence[ArtifactManifestEntry]:
|
80
|
+
local_path = util.local_file_uri_to_path(path)
|
81
|
+
max_objects = max_objects or DEFAULT_MAX_OBJECTS
|
82
|
+
# We have a single file or directory
|
83
|
+
# Note, we follow symlinks for files contained within the directory
|
84
|
+
entries = []
|
85
|
+
|
86
|
+
def md5(path: str) -> B64MD5:
|
87
|
+
return (
|
88
|
+
md5_file_b64(path)
|
89
|
+
if checksum
|
90
|
+
else md5_string(str(os.stat(path).st_size))
|
91
|
+
)
|
92
|
+
|
93
|
+
if os.path.isdir(local_path):
|
94
|
+
i = 0
|
95
|
+
start_time = time.time()
|
96
|
+
if checksum:
|
97
|
+
termlog(
|
98
|
+
'Generating checksum for up to %i files in "%s"...\n'
|
99
|
+
% (max_objects, local_path),
|
100
|
+
newline=False,
|
101
|
+
)
|
102
|
+
for root, _, files in os.walk(local_path):
|
103
|
+
for sub_path in files:
|
104
|
+
i += 1
|
105
|
+
if i > max_objects:
|
106
|
+
raise ValueError(
|
107
|
+
"Exceeded %i objects tracked, pass max_objects to add_reference"
|
108
|
+
% max_objects
|
109
|
+
)
|
110
|
+
physical_path = os.path.join(root, sub_path)
|
111
|
+
# TODO(spencerpearson): this is not a "logical path" in the sense that
|
112
|
+
# `LogicalPath` returns a "logical path"; it's a relative path
|
113
|
+
# **on the local filesystem**.
|
114
|
+
logical_path = os.path.relpath(physical_path, start=local_path)
|
115
|
+
if name is not None:
|
116
|
+
logical_path = os.path.join(name, logical_path)
|
117
|
+
|
118
|
+
entry = ArtifactManifestEntry(
|
119
|
+
path=logical_path,
|
120
|
+
ref=FilePathStr(os.path.join(path, logical_path)),
|
121
|
+
size=os.path.getsize(physical_path),
|
122
|
+
digest=md5(physical_path),
|
123
|
+
)
|
124
|
+
entries.append(entry)
|
125
|
+
if checksum:
|
126
|
+
termlog("Done. %.1fs" % (time.time() - start_time), prefix=False)
|
127
|
+
elif os.path.isfile(local_path):
|
128
|
+
name = name or os.path.basename(local_path)
|
129
|
+
entry = ArtifactManifestEntry(
|
130
|
+
path=name,
|
131
|
+
ref=path,
|
132
|
+
size=os.path.getsize(local_path),
|
133
|
+
digest=md5(local_path),
|
134
|
+
)
|
135
|
+
entries.append(entry)
|
136
|
+
else:
|
137
|
+
# TODO: update error message if we don't allow directories.
|
138
|
+
raise ValueError(
|
139
|
+
'Path "{}" must be a valid file or directory path'.format(path)
|
140
|
+
)
|
141
|
+
return entries
|