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,43 @@
|
|
1
|
+
"""Artifact download logger."""
|
2
|
+
|
3
|
+
import multiprocessing.dummy
|
4
|
+
import time
|
5
|
+
from typing import Callable
|
6
|
+
|
7
|
+
from wandb.errors.term import termlog
|
8
|
+
|
9
|
+
|
10
|
+
class ArtifactDownloadLogger:
|
11
|
+
def __init__(
|
12
|
+
self,
|
13
|
+
nfiles: int,
|
14
|
+
clock_for_testing: Callable[[], float] = time.monotonic,
|
15
|
+
termlog_for_testing: Callable[..., None] = termlog,
|
16
|
+
) -> None:
|
17
|
+
self._nfiles = nfiles
|
18
|
+
self._clock = clock_for_testing
|
19
|
+
self._termlog = termlog_for_testing
|
20
|
+
|
21
|
+
self._n_files_downloaded = 0
|
22
|
+
self._spinner_index = 0
|
23
|
+
self._last_log_time = self._clock()
|
24
|
+
self._lock = multiprocessing.dummy.Lock()
|
25
|
+
|
26
|
+
def notify_downloaded(self) -> None:
|
27
|
+
with self._lock:
|
28
|
+
self._n_files_downloaded += 1
|
29
|
+
if self._n_files_downloaded == self._nfiles:
|
30
|
+
self._termlog(
|
31
|
+
f" {self._nfiles} of {self._nfiles} files downloaded. ",
|
32
|
+
# ^ trailing spaces to wipe out ellipsis from previous logs
|
33
|
+
newline=True,
|
34
|
+
)
|
35
|
+
self._last_log_time = self._clock()
|
36
|
+
elif self._clock() - self._last_log_time > 0.1:
|
37
|
+
self._spinner_index += 1
|
38
|
+
spinner = r"-\|/"[self._spinner_index % 4]
|
39
|
+
self._termlog(
|
40
|
+
f"{spinner} {self._n_files_downloaded} of {self._nfiles} files downloaded...\r",
|
41
|
+
newline=False,
|
42
|
+
)
|
43
|
+
self._last_log_time = self._clock()
|
@@ -0,0 +1,253 @@
|
|
1
|
+
"""Artifact cache."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
import contextlib
|
6
|
+
import errno
|
7
|
+
import hashlib
|
8
|
+
import os
|
9
|
+
import shutil
|
10
|
+
import subprocess
|
11
|
+
import sys
|
12
|
+
from pathlib import Path
|
13
|
+
from tempfile import NamedTemporaryFile
|
14
|
+
from typing import IO, TYPE_CHECKING, ContextManager, Iterator
|
15
|
+
|
16
|
+
import wandb
|
17
|
+
from wandb import env, util
|
18
|
+
from wandb.errors import term
|
19
|
+
from wandb.sdk.lib.filesystem import files_in
|
20
|
+
from wandb.sdk.lib.hashutil import B64MD5, ETag, b64_to_hex_id
|
21
|
+
from wandb.sdk.lib.paths import FilePathStr, StrPath, URIStr
|
22
|
+
|
23
|
+
if TYPE_CHECKING:
|
24
|
+
if sys.version_info >= (3, 8):
|
25
|
+
from typing import Protocol
|
26
|
+
else:
|
27
|
+
from typing_extensions import Protocol
|
28
|
+
|
29
|
+
class Opener(Protocol):
|
30
|
+
def __call__(self, mode: str = ...) -> ContextManager[IO]:
|
31
|
+
pass
|
32
|
+
|
33
|
+
|
34
|
+
def _get_sys_umask_threadsafe() -> int:
|
35
|
+
# Workaround to get the current system umask, since
|
36
|
+
# - `os.umask()` isn't thread-safe
|
37
|
+
# - we don't want to inadvertently change the umask of the current process
|
38
|
+
# See: https://stackoverflow.com/questions/53227072/reading-umask-thread-safe
|
39
|
+
umask_cmd = (sys.executable, "-c", "import os; print(os.umask(22))")
|
40
|
+
return int(subprocess.check_output(umask_cmd))
|
41
|
+
|
42
|
+
|
43
|
+
class ArtifactFileCache:
|
44
|
+
def __init__(self, cache_dir: StrPath) -> None:
|
45
|
+
self._cache_dir = Path(cache_dir)
|
46
|
+
self._obj_dir = self._cache_dir / "obj"
|
47
|
+
self._temp_dir = self._cache_dir / "tmp"
|
48
|
+
self._ensure_write_permissions()
|
49
|
+
|
50
|
+
# NamedTemporaryFile sets the file mode to 600 [1], we reset to the default.
|
51
|
+
# [1] https://stackoverflow.com/questions/10541760/can-i-set-the-umask-for-tempfile-namedtemporaryfile-in-python
|
52
|
+
self._sys_umask = _get_sys_umask_threadsafe()
|
53
|
+
|
54
|
+
self._override_cache_path: StrPath | None = None
|
55
|
+
|
56
|
+
def check_md5_obj_path(
|
57
|
+
self, b64_md5: B64MD5, size: int
|
58
|
+
) -> tuple[FilePathStr, bool, Opener]:
|
59
|
+
# Check if we're using vs skipping the cache
|
60
|
+
if self._override_cache_path is not None:
|
61
|
+
skip_cache = True
|
62
|
+
path = Path(self._override_cache_path)
|
63
|
+
else:
|
64
|
+
skip_cache = False
|
65
|
+
hex_md5 = b64_to_hex_id(b64_md5)
|
66
|
+
path = self._obj_dir / "md5" / hex_md5[:2] / hex_md5[2:]
|
67
|
+
return self._check_or_create(path, size, skip_cache=skip_cache)
|
68
|
+
|
69
|
+
# TODO(spencerpearson): this method at least needs its signature changed.
|
70
|
+
# An ETag is not (necessarily) a checksum.
|
71
|
+
def check_etag_obj_path(
|
72
|
+
self,
|
73
|
+
url: URIStr,
|
74
|
+
etag: ETag,
|
75
|
+
size: int,
|
76
|
+
) -> tuple[FilePathStr, bool, Opener]:
|
77
|
+
# Check if we're using vs skipping the cache
|
78
|
+
if self._override_cache_path is not None:
|
79
|
+
skip_cache = True
|
80
|
+
path = Path(self._override_cache_path)
|
81
|
+
else:
|
82
|
+
skip_cache = False
|
83
|
+
hexhash = hashlib.sha256(
|
84
|
+
hashlib.sha256(url.encode("utf-8")).digest()
|
85
|
+
+ hashlib.sha256(etag.encode("utf-8")).digest()
|
86
|
+
).hexdigest()
|
87
|
+
path = self._obj_dir / "etag" / hexhash[:2] / hexhash[2:]
|
88
|
+
return self._check_or_create(path, size, skip_cache=skip_cache)
|
89
|
+
|
90
|
+
def _check_or_create(
|
91
|
+
self, path: Path, size: int, skip_cache: bool = False
|
92
|
+
) -> tuple[FilePathStr, bool, Opener]:
|
93
|
+
opener = self._opener(path, size, skip_cache=skip_cache)
|
94
|
+
hit = path.is_file() and path.stat().st_size == size
|
95
|
+
return FilePathStr(str(path)), hit, opener
|
96
|
+
|
97
|
+
def cleanup(
|
98
|
+
self,
|
99
|
+
target_size: int | None = None,
|
100
|
+
remove_temp: bool = False,
|
101
|
+
target_fraction: float | None = None,
|
102
|
+
) -> int:
|
103
|
+
"""Clean up the cache, removing the least recently used files first.
|
104
|
+
|
105
|
+
Args:
|
106
|
+
target_size: The target size of the cache in bytes. If the cache is larger
|
107
|
+
than this, we will remove the least recently used files until the cache
|
108
|
+
is smaller than this size.
|
109
|
+
remove_temp: Whether to remove temporary files. Temporary files are files
|
110
|
+
that are currently being written to the cache. If remove_temp is True,
|
111
|
+
all temp files will be removed, regardless of the target_size or
|
112
|
+
target_fraction.
|
113
|
+
target_fraction: The target fraction of the cache to reclaim. If the cache
|
114
|
+
is larger than this, we will remove the least recently used files until
|
115
|
+
the cache is smaller than this fraction of its current size. It is an
|
116
|
+
error to specify both target_size and target_fraction.
|
117
|
+
|
118
|
+
Returns:
|
119
|
+
The number of bytes reclaimed.
|
120
|
+
"""
|
121
|
+
if target_size is None and target_fraction is None:
|
122
|
+
# Default to clearing the entire cache.
|
123
|
+
target_size = 0
|
124
|
+
if target_size is not None and target_fraction is not None:
|
125
|
+
raise ValueError("Cannot specify both target_size and target_fraction")
|
126
|
+
if target_size is not None and target_size < 0:
|
127
|
+
raise ValueError("target_size must be non-negative")
|
128
|
+
if target_fraction is not None and (target_fraction < 0 or target_fraction > 1):
|
129
|
+
raise ValueError("target_fraction must be between 0 and 1")
|
130
|
+
|
131
|
+
bytes_reclaimed = 0
|
132
|
+
total_size = 0
|
133
|
+
temp_size = 0
|
134
|
+
|
135
|
+
# Remove all temporary files if requested. Otherwise sum their size.
|
136
|
+
for entry in files_in(self._temp_dir):
|
137
|
+
size = entry.stat().st_size
|
138
|
+
total_size += size
|
139
|
+
if remove_temp:
|
140
|
+
try:
|
141
|
+
os.remove(entry.path)
|
142
|
+
bytes_reclaimed += size
|
143
|
+
except OSError:
|
144
|
+
pass
|
145
|
+
else:
|
146
|
+
temp_size += size
|
147
|
+
if temp_size:
|
148
|
+
wandb.termwarn(
|
149
|
+
f"Cache contains {util.to_human_size(temp_size)} of temporary files. "
|
150
|
+
"Run `wandb artifact cleanup --remove-temp` to remove them."
|
151
|
+
)
|
152
|
+
|
153
|
+
entries = []
|
154
|
+
for file_entry in files_in(self._obj_dir):
|
155
|
+
total_size += file_entry.stat().st_size
|
156
|
+
entries.append(file_entry)
|
157
|
+
|
158
|
+
if target_fraction is not None:
|
159
|
+
target_size = int(total_size * target_fraction)
|
160
|
+
assert target_size is not None
|
161
|
+
|
162
|
+
for entry in sorted(entries, key=lambda x: x.stat().st_atime):
|
163
|
+
if total_size <= target_size:
|
164
|
+
return bytes_reclaimed
|
165
|
+
try:
|
166
|
+
os.remove(entry.path)
|
167
|
+
except OSError:
|
168
|
+
pass
|
169
|
+
total_size -= entry.stat().st_size
|
170
|
+
bytes_reclaimed += entry.stat().st_size
|
171
|
+
|
172
|
+
if total_size > target_size:
|
173
|
+
wandb.termerror(
|
174
|
+
f"Failed to reclaim enough space in {self._cache_dir}. Try running"
|
175
|
+
" `wandb artifact cleanup --remove-temp` to remove temporary files."
|
176
|
+
)
|
177
|
+
|
178
|
+
return bytes_reclaimed
|
179
|
+
|
180
|
+
def _free_space(self) -> int:
|
181
|
+
"""Return the number of bytes of free space in the cache directory."""
|
182
|
+
return shutil.disk_usage(self._cache_dir)[2]
|
183
|
+
|
184
|
+
def _reserve_space(self, size: int) -> None:
|
185
|
+
"""If a `size` write would exceed disk space, remove cached items to make space.
|
186
|
+
|
187
|
+
Raises:
|
188
|
+
OSError: If there is not enough space to write `size` bytes, even after
|
189
|
+
removing cached items.
|
190
|
+
"""
|
191
|
+
if size <= self._free_space():
|
192
|
+
return
|
193
|
+
|
194
|
+
term.termwarn("Cache size exceeded. Attempting to reclaim space...")
|
195
|
+
self.cleanup(target_fraction=0.5)
|
196
|
+
if size <= self._free_space():
|
197
|
+
return
|
198
|
+
|
199
|
+
self.cleanup(target_size=0)
|
200
|
+
if size > self._free_space():
|
201
|
+
raise OSError(errno.ENOSPC, f"Insufficient free space in {self._cache_dir}")
|
202
|
+
|
203
|
+
def _opener(self, path: Path, size: int, skip_cache: bool = False) -> Opener:
|
204
|
+
@contextlib.contextmanager
|
205
|
+
def atomic_open(mode: str = "w") -> Iterator[IO]:
|
206
|
+
if "a" in mode:
|
207
|
+
raise ValueError("Appending to cache files is not supported")
|
208
|
+
|
209
|
+
if skip_cache:
|
210
|
+
# We skip the cache, but we'll still need an intermediate, temporary file to ensure atomicity.
|
211
|
+
# Put the temp file in the same root as the destination file in an attempt to avoid moving/copying
|
212
|
+
# across filesystems.
|
213
|
+
temp_dir = path.parent
|
214
|
+
else:
|
215
|
+
self._reserve_space(size)
|
216
|
+
temp_dir = self._temp_dir
|
217
|
+
|
218
|
+
temp_dir.mkdir(parents=True, exist_ok=True)
|
219
|
+
temp_file = NamedTemporaryFile(dir=temp_dir, mode=mode, delete=False)
|
220
|
+
try:
|
221
|
+
yield temp_file
|
222
|
+
temp_file.close()
|
223
|
+
os.chmod(temp_file.name, 0o666 & ~self._sys_umask)
|
224
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
225
|
+
os.replace(temp_file.name, path)
|
226
|
+
except Exception:
|
227
|
+
os.remove(temp_file.name)
|
228
|
+
raise
|
229
|
+
|
230
|
+
return atomic_open
|
231
|
+
|
232
|
+
def _ensure_write_permissions(self) -> None:
|
233
|
+
"""Raise an error if we cannot write to the cache directory."""
|
234
|
+
try:
|
235
|
+
self._temp_dir.mkdir(parents=True, exist_ok=True)
|
236
|
+
with NamedTemporaryFile(dir=self._temp_dir) as f:
|
237
|
+
f.write(b"wandb")
|
238
|
+
except PermissionError as e:
|
239
|
+
raise PermissionError(
|
240
|
+
f"Unable to write to {self._cache_dir}. "
|
241
|
+
"Ensure that the current user has write permissions."
|
242
|
+
) from e
|
243
|
+
|
244
|
+
|
245
|
+
_artifact_file_cache: ArtifactFileCache | None = None
|
246
|
+
|
247
|
+
|
248
|
+
def get_artifact_file_cache() -> ArtifactFileCache:
|
249
|
+
global _artifact_file_cache
|
250
|
+
cache_dir = env.get_cache_dir() / "artifacts"
|
251
|
+
if _artifact_file_cache is None or _artifact_file_cache._cache_dir != cache_dir:
|
252
|
+
_artifact_file_cache = ArtifactFileCache(cache_dir)
|
253
|
+
return _artifact_file_cache
|
@@ -0,0 +1,17 @@
|
|
1
|
+
"""Recent Artifact storage.
|
2
|
+
|
3
|
+
Artifacts are registered in the cache to ensure they won't be immediately garbage
|
4
|
+
collected and can be retrieved by their ID.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from __future__ import annotations
|
8
|
+
|
9
|
+
from typing import TYPE_CHECKING
|
10
|
+
|
11
|
+
from wandb.sdk.lib.capped_dict import CappedDict
|
12
|
+
|
13
|
+
if TYPE_CHECKING:
|
14
|
+
from wandb.sdk.artifacts.artifact import Artifact
|
15
|
+
|
16
|
+
# There is nothing special about the artifact cache, it's just a global capped dict.
|
17
|
+
artifact_instance_cache: dict[str, Artifact] = CappedDict(100)
|
@@ -0,0 +1,74 @@
|
|
1
|
+
"""Artifact manifest."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
from typing import TYPE_CHECKING, Mapping
|
6
|
+
|
7
|
+
from wandb.sdk.internal.internal_api import Api as InternalApi
|
8
|
+
from wandb.sdk.lib.hashutil import HexMD5
|
9
|
+
|
10
|
+
if TYPE_CHECKING:
|
11
|
+
from wandb.sdk.artifacts.artifact_manifest_entry import ArtifactManifestEntry
|
12
|
+
from wandb.sdk.artifacts.storage_policy import StoragePolicy
|
13
|
+
|
14
|
+
|
15
|
+
class ArtifactManifest:
|
16
|
+
entries: dict[str, ArtifactManifestEntry]
|
17
|
+
|
18
|
+
@classmethod
|
19
|
+
def from_manifest_json(
|
20
|
+
cls, manifest_json: dict, api: InternalApi | None = None
|
21
|
+
) -> ArtifactManifest:
|
22
|
+
if "version" not in manifest_json:
|
23
|
+
raise ValueError("Invalid manifest format. Must contain version field.")
|
24
|
+
version = manifest_json["version"]
|
25
|
+
for sub in cls.__subclasses__():
|
26
|
+
if sub.version() == version:
|
27
|
+
return sub.from_manifest_json(manifest_json, api=api)
|
28
|
+
raise ValueError("Invalid manifest version.")
|
29
|
+
|
30
|
+
@classmethod
|
31
|
+
def version(cls) -> int:
|
32
|
+
raise NotImplementedError
|
33
|
+
|
34
|
+
def __init__(
|
35
|
+
self,
|
36
|
+
storage_policy: StoragePolicy,
|
37
|
+
entries: Mapping[str, ArtifactManifestEntry] | None = None,
|
38
|
+
) -> None:
|
39
|
+
self.storage_policy = storage_policy
|
40
|
+
self.entries = dict(entries) if entries else {}
|
41
|
+
|
42
|
+
def __len__(self) -> int:
|
43
|
+
return len(self.entries)
|
44
|
+
|
45
|
+
def to_manifest_json(self) -> dict:
|
46
|
+
raise NotImplementedError
|
47
|
+
|
48
|
+
def digest(self) -> HexMD5:
|
49
|
+
raise NotImplementedError
|
50
|
+
|
51
|
+
def add_entry(self, entry: ArtifactManifestEntry) -> None:
|
52
|
+
if (
|
53
|
+
entry.path in self.entries
|
54
|
+
and entry.digest != self.entries[entry.path].digest
|
55
|
+
):
|
56
|
+
raise ValueError("Cannot add the same path twice: {}".format(entry.path))
|
57
|
+
self.entries[entry.path] = entry
|
58
|
+
|
59
|
+
def remove_entry(self, entry: ArtifactManifestEntry) -> None:
|
60
|
+
if entry.path not in self.entries:
|
61
|
+
raise FileNotFoundError(f"Cannot remove missing entry: '{entry.path}'")
|
62
|
+
del self.entries[entry.path]
|
63
|
+
|
64
|
+
def get_entry_by_path(self, path: str) -> ArtifactManifestEntry | None:
|
65
|
+
return self.entries.get(path)
|
66
|
+
|
67
|
+
def get_entries_in_directory(self, directory: str) -> list[ArtifactManifestEntry]:
|
68
|
+
return [
|
69
|
+
self.entries[entry_key]
|
70
|
+
for entry_key in self.entries
|
71
|
+
if entry_key.startswith(
|
72
|
+
directory + "/"
|
73
|
+
) # entries use forward slash even for windows
|
74
|
+
]
|
@@ -0,0 +1,249 @@
|
|
1
|
+
"""Artifact manifest entry."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
import json
|
6
|
+
import logging
|
7
|
+
import os
|
8
|
+
from pathlib import Path
|
9
|
+
from typing import TYPE_CHECKING
|
10
|
+
from urllib.parse import urlparse
|
11
|
+
|
12
|
+
from wandb.sdk.lib import filesystem
|
13
|
+
from wandb.sdk.lib.deprecate import Deprecated, deprecate
|
14
|
+
from wandb.sdk.lib.hashutil import (
|
15
|
+
B64MD5,
|
16
|
+
ETag,
|
17
|
+
b64_to_hex_id,
|
18
|
+
hex_to_b64_id,
|
19
|
+
md5_file_b64,
|
20
|
+
)
|
21
|
+
from wandb.sdk.lib.paths import FilePathStr, LogicalPath, StrPath, URIStr
|
22
|
+
|
23
|
+
logger = logging.getLogger(__name__)
|
24
|
+
|
25
|
+
if TYPE_CHECKING:
|
26
|
+
from typing_extensions import TypedDict
|
27
|
+
|
28
|
+
from wandb.sdk.artifacts.artifact import Artifact
|
29
|
+
|
30
|
+
class ArtifactManifestEntryDict(TypedDict, total=False):
|
31
|
+
path: str
|
32
|
+
digest: str
|
33
|
+
skip_cache: bool
|
34
|
+
ref: str
|
35
|
+
birthArtifactID: str
|
36
|
+
size: int
|
37
|
+
extra: dict
|
38
|
+
local_path: str
|
39
|
+
|
40
|
+
|
41
|
+
class ArtifactManifestEntry:
|
42
|
+
"""A single entry in an artifact manifest."""
|
43
|
+
|
44
|
+
path: LogicalPath
|
45
|
+
digest: B64MD5 | URIStr | FilePathStr | ETag
|
46
|
+
skip_cache: bool
|
47
|
+
ref: FilePathStr | URIStr | None
|
48
|
+
birth_artifact_id: str | None
|
49
|
+
size: int | None
|
50
|
+
extra: dict
|
51
|
+
local_path: str | None
|
52
|
+
|
53
|
+
_parent_artifact: Artifact | None = None
|
54
|
+
_download_url: str | None = None
|
55
|
+
|
56
|
+
def __init__(
|
57
|
+
self,
|
58
|
+
path: StrPath,
|
59
|
+
digest: B64MD5 | URIStr | FilePathStr | ETag,
|
60
|
+
skip_cache: bool | None = False,
|
61
|
+
ref: FilePathStr | URIStr | None = None,
|
62
|
+
birth_artifact_id: str | None = None,
|
63
|
+
size: int | None = None,
|
64
|
+
extra: dict | None = None,
|
65
|
+
local_path: StrPath | None = None,
|
66
|
+
) -> None:
|
67
|
+
self.path = LogicalPath(path)
|
68
|
+
self.digest = digest
|
69
|
+
self.ref = ref
|
70
|
+
self.birth_artifact_id = birth_artifact_id
|
71
|
+
self.size = size
|
72
|
+
self.extra = extra or {}
|
73
|
+
self.local_path = str(local_path) if local_path else None
|
74
|
+
if self.local_path and self.size is None:
|
75
|
+
self.size = Path(self.local_path).stat().st_size
|
76
|
+
self.skip_cache = skip_cache or False
|
77
|
+
|
78
|
+
def __repr__(self) -> str:
|
79
|
+
cls = self.__class__.__name__
|
80
|
+
ref = f", ref={self.ref!r}" if self.ref is not None else ""
|
81
|
+
birth_artifact_id = (
|
82
|
+
f", birth_artifact_id={self.birth_artifact_id!r}"
|
83
|
+
if self.birth_artifact_id is not None
|
84
|
+
else ""
|
85
|
+
)
|
86
|
+
size = f", size={self.size}" if self.size is not None else ""
|
87
|
+
extra = f", extra={json.dumps(self.extra)}" if self.extra else ""
|
88
|
+
local_path = f", local_path={self.local_path!r}" if self.local_path else ""
|
89
|
+
skip_cache = f", skip_cache={self.skip_cache}"
|
90
|
+
others = ref + birth_artifact_id + size + extra + local_path + skip_cache
|
91
|
+
return f"{cls}(path={self.path!r}, digest={self.digest!r}{others})"
|
92
|
+
|
93
|
+
def __eq__(self, other: object) -> bool:
|
94
|
+
"""Strict equality, comparing all public fields.
|
95
|
+
|
96
|
+
ArtifactManifestEntries for the same file may not compare equal if they were
|
97
|
+
added in different ways or created for different parent artifacts.
|
98
|
+
"""
|
99
|
+
if not isinstance(other, ArtifactManifestEntry):
|
100
|
+
return False
|
101
|
+
return (
|
102
|
+
self.path == other.path
|
103
|
+
and self.digest == other.digest
|
104
|
+
and self.ref == other.ref
|
105
|
+
and self.birth_artifact_id == other.birth_artifact_id
|
106
|
+
and self.size == other.size
|
107
|
+
and self.extra == other.extra
|
108
|
+
and self.local_path == other.local_path
|
109
|
+
and self.skip_cache == other.skip_cache
|
110
|
+
)
|
111
|
+
|
112
|
+
@property
|
113
|
+
def name(self) -> LogicalPath:
|
114
|
+
"""Deprecated; use `path` instead."""
|
115
|
+
deprecate(
|
116
|
+
field_name=Deprecated.artifactmanifestentry__name,
|
117
|
+
warning_message="ArtifactManifestEntry.name is deprecated, use .path instead.",
|
118
|
+
)
|
119
|
+
return self.path
|
120
|
+
|
121
|
+
def parent_artifact(self) -> Artifact:
|
122
|
+
"""Get the artifact to which this artifact entry belongs.
|
123
|
+
|
124
|
+
Returns:
|
125
|
+
(PublicArtifact): The parent artifact
|
126
|
+
"""
|
127
|
+
if self._parent_artifact is None:
|
128
|
+
raise NotImplementedError
|
129
|
+
return self._parent_artifact
|
130
|
+
|
131
|
+
def download(
|
132
|
+
self, root: str | None = None, skip_cache: bool | None = None
|
133
|
+
) -> FilePathStr:
|
134
|
+
"""Download this artifact entry to the specified root path.
|
135
|
+
|
136
|
+
Arguments:
|
137
|
+
root: (str, optional) The root path in which to download this
|
138
|
+
artifact entry. Defaults to the artifact's root.
|
139
|
+
|
140
|
+
Returns:
|
141
|
+
(str): The path of the downloaded artifact entry.
|
142
|
+
"""
|
143
|
+
if self._parent_artifact is None:
|
144
|
+
raise NotImplementedError
|
145
|
+
|
146
|
+
root = root or self._parent_artifact._default_root()
|
147
|
+
self._parent_artifact._add_download_root(root)
|
148
|
+
path = str(Path(self.path))
|
149
|
+
dest_path = os.path.join(root, path)
|
150
|
+
|
151
|
+
if skip_cache:
|
152
|
+
override_cache_path = dest_path
|
153
|
+
else:
|
154
|
+
override_cache_path = None
|
155
|
+
|
156
|
+
# Skip checking the cache (and possibly downloading) if the file already exists
|
157
|
+
# and has the digest we're expecting.
|
158
|
+
try:
|
159
|
+
md5_hash = md5_file_b64(dest_path)
|
160
|
+
except (FileNotFoundError, IsADirectoryError):
|
161
|
+
logger.debug(f"unable to find {dest_path}, skip searching for file")
|
162
|
+
else:
|
163
|
+
if self.digest == md5_hash:
|
164
|
+
return FilePathStr(dest_path)
|
165
|
+
|
166
|
+
if self.ref is not None:
|
167
|
+
cache_path = self._parent_artifact.manifest.storage_policy.load_reference(
|
168
|
+
self, local=True, dest_path=override_cache_path
|
169
|
+
)
|
170
|
+
else:
|
171
|
+
cache_path = self._parent_artifact.manifest.storage_policy.load_file(
|
172
|
+
self._parent_artifact, self, dest_path=override_cache_path
|
173
|
+
)
|
174
|
+
|
175
|
+
if skip_cache:
|
176
|
+
return FilePathStr(dest_path)
|
177
|
+
else:
|
178
|
+
return FilePathStr(
|
179
|
+
str(filesystem.copy_or_overwrite_changed(cache_path, dest_path))
|
180
|
+
)
|
181
|
+
|
182
|
+
def ref_target(self) -> FilePathStr | URIStr:
|
183
|
+
"""Get the reference URL that is targeted by this artifact entry.
|
184
|
+
|
185
|
+
Returns:
|
186
|
+
(str): The reference URL of this artifact entry.
|
187
|
+
|
188
|
+
Raises:
|
189
|
+
ValueError: If this artifact entry was not a reference.
|
190
|
+
"""
|
191
|
+
if self.ref is None:
|
192
|
+
raise ValueError("Only reference entries support ref_target().")
|
193
|
+
if self._parent_artifact is None:
|
194
|
+
return self.ref
|
195
|
+
return self._parent_artifact.manifest.storage_policy.load_reference(
|
196
|
+
self._parent_artifact.manifest.entries[self.path], local=False
|
197
|
+
)
|
198
|
+
|
199
|
+
def ref_url(self) -> str:
|
200
|
+
"""Get a URL to this artifact entry.
|
201
|
+
|
202
|
+
These URLs can be referenced by another artifact.
|
203
|
+
|
204
|
+
Returns:
|
205
|
+
(str): A URL representing this artifact entry.
|
206
|
+
|
207
|
+
Examples:
|
208
|
+
Basic usage
|
209
|
+
```
|
210
|
+
ref_url = source_artifact.get_entry('file.txt').ref_url()
|
211
|
+
derived_artifact.add_reference(ref_url)
|
212
|
+
```
|
213
|
+
"""
|
214
|
+
if self._parent_artifact is None:
|
215
|
+
raise NotImplementedError
|
216
|
+
assert self._parent_artifact.id is not None
|
217
|
+
return (
|
218
|
+
"wandb-artifact://"
|
219
|
+
+ b64_to_hex_id(B64MD5(self._parent_artifact.id))
|
220
|
+
+ "/"
|
221
|
+
+ self.path
|
222
|
+
)
|
223
|
+
|
224
|
+
def to_json(self) -> ArtifactManifestEntryDict:
|
225
|
+
contents: ArtifactManifestEntryDict = {
|
226
|
+
"path": self.path,
|
227
|
+
"digest": self.digest,
|
228
|
+
}
|
229
|
+
if self.size is not None:
|
230
|
+
contents["size"] = self.size
|
231
|
+
if self.ref:
|
232
|
+
contents["ref"] = self.ref
|
233
|
+
if self.birth_artifact_id:
|
234
|
+
contents["birthArtifactID"] = self.birth_artifact_id
|
235
|
+
if self.local_path:
|
236
|
+
contents["local_path"] = self.local_path
|
237
|
+
if self.skip_cache:
|
238
|
+
contents["skip_cache"] = self.skip_cache
|
239
|
+
if self.extra:
|
240
|
+
contents["extra"] = self.extra
|
241
|
+
return contents
|
242
|
+
|
243
|
+
def _is_artifact_reference(self) -> bool:
|
244
|
+
return self.ref is not None and urlparse(self.ref).scheme == "wandb-artifact"
|
245
|
+
|
246
|
+
def _referenced_artifact_id(self) -> str | None:
|
247
|
+
if not self._is_artifact_reference():
|
248
|
+
return None
|
249
|
+
return hex_to_b64_id(urlparse(self.ref).netloc)
|
File without changes
|