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,335 @@
|
|
1
|
+
"""Implementation of the GCP environment for wandb launch."""
|
2
|
+
|
3
|
+
import logging
|
4
|
+
import os
|
5
|
+
import subprocess
|
6
|
+
from typing import Optional
|
7
|
+
|
8
|
+
from wandb.sdk.launch.errors import LaunchError
|
9
|
+
from wandb.util import get_module
|
10
|
+
|
11
|
+
from ..utils import GCS_URI_RE, event_loop_thread_exec
|
12
|
+
from .abstract import AbstractEnvironment
|
13
|
+
|
14
|
+
google = get_module(
|
15
|
+
"google",
|
16
|
+
required="Google Cloud Platform support requires the google package. Please"
|
17
|
+
" install it with `pip install wandb[launch]`.",
|
18
|
+
)
|
19
|
+
google.cloud.compute_v1 = get_module(
|
20
|
+
"google.cloud.compute_v1",
|
21
|
+
required="Google Cloud Platform support requires the google-cloud-compute package. "
|
22
|
+
"Please install it with `pip install wandb[launch]`.",
|
23
|
+
)
|
24
|
+
google.auth.credentials = get_module(
|
25
|
+
"google.auth.credentials",
|
26
|
+
required="Google Cloud Platform support requires google-auth. "
|
27
|
+
"Please install it with `pip install wandb[launch]`.",
|
28
|
+
)
|
29
|
+
google.auth.transport.requests = get_module(
|
30
|
+
"google.auth.transport.requests",
|
31
|
+
required="Google Cloud Platform support requires google-auth. "
|
32
|
+
"Please install it with `pip install wandb[launch]`.",
|
33
|
+
)
|
34
|
+
google.api_core.exceptions = get_module(
|
35
|
+
"google.api_core.exceptions",
|
36
|
+
required="Google Cloud Platform support requires google-api-core. "
|
37
|
+
"Please install it with `pip install wandb[launch]`.",
|
38
|
+
)
|
39
|
+
google.cloud.storage = get_module(
|
40
|
+
"google.cloud.storage",
|
41
|
+
required="Google Cloud Platform support requires google-cloud-storage. "
|
42
|
+
"Please install it with `pip install wandb[launch].",
|
43
|
+
)
|
44
|
+
|
45
|
+
|
46
|
+
_logger = logging.getLogger(__name__)
|
47
|
+
|
48
|
+
GCP_REGION_ENV_VAR = "GOOGLE_CLOUD_REGION"
|
49
|
+
|
50
|
+
|
51
|
+
class GcpEnvironment(AbstractEnvironment):
|
52
|
+
"""GCP Environment.
|
53
|
+
|
54
|
+
Attributes:
|
55
|
+
region: The GCP region.
|
56
|
+
"""
|
57
|
+
|
58
|
+
region: str
|
59
|
+
|
60
|
+
def __init__(
|
61
|
+
self,
|
62
|
+
region: str,
|
63
|
+
) -> None:
|
64
|
+
"""Initialize the GCP environment.
|
65
|
+
|
66
|
+
Arguments:
|
67
|
+
region: The GCP region.
|
68
|
+
verify: Whether to verify the credentials, region, and project.
|
69
|
+
|
70
|
+
Raises:
|
71
|
+
LaunchError: If verify is True and the environment is not properly
|
72
|
+
configured.
|
73
|
+
"""
|
74
|
+
super().__init__()
|
75
|
+
_logger.info(f"Initializing GcpEnvironment in region {region}")
|
76
|
+
self.region: str = region
|
77
|
+
self._project = ""
|
78
|
+
|
79
|
+
@classmethod
|
80
|
+
def from_config(cls, config: dict) -> "GcpEnvironment":
|
81
|
+
"""Create a GcpEnvironment from a config dictionary.
|
82
|
+
|
83
|
+
Arguments:
|
84
|
+
config: The config dictionary.
|
85
|
+
|
86
|
+
Returns:
|
87
|
+
GcpEnvironment: The GcpEnvironment.
|
88
|
+
"""
|
89
|
+
if config.get("type") != "gcp":
|
90
|
+
raise LaunchError(
|
91
|
+
f"Could not create GcpEnvironment from config. Expected type 'gcp' "
|
92
|
+
f"but got '{config.get('type')}'."
|
93
|
+
)
|
94
|
+
region = config.get("region", None)
|
95
|
+
if not region:
|
96
|
+
raise LaunchError(
|
97
|
+
"Could not create GcpEnvironment from config. Missing 'region' "
|
98
|
+
"field."
|
99
|
+
)
|
100
|
+
return cls(region=region)
|
101
|
+
|
102
|
+
@classmethod
|
103
|
+
def from_default(
|
104
|
+
cls,
|
105
|
+
) -> "GcpEnvironment":
|
106
|
+
"""Create a GcpEnvironment from the default configuration.
|
107
|
+
|
108
|
+
Returns:
|
109
|
+
GcpEnvironment: The GcpEnvironment.
|
110
|
+
"""
|
111
|
+
region = get_default_region()
|
112
|
+
if region is None:
|
113
|
+
raise LaunchError(
|
114
|
+
"Could not create GcpEnvironment from user's gcloud configuration. "
|
115
|
+
"Please set the default region with `gcloud config set compute/region` "
|
116
|
+
"or set the environment variable {GCP_REGION_ENV_VAR}. "
|
117
|
+
"Alternatively, you may specify the region explicitly in your "
|
118
|
+
"wandb launch configuration at `$HOME/.config/wandb/launch-config.yaml`. "
|
119
|
+
"See https://docs.wandb.ai/guides/launch/run-agent#environments for more information."
|
120
|
+
)
|
121
|
+
return cls(region=region)
|
122
|
+
|
123
|
+
@property
|
124
|
+
def project(self) -> str:
|
125
|
+
"""Get the name of the gcp project associated with the credentials.
|
126
|
+
|
127
|
+
Returns:
|
128
|
+
str: The name of the gcp project.
|
129
|
+
|
130
|
+
Raises:
|
131
|
+
LaunchError: If the launch environment cannot be verified.
|
132
|
+
"""
|
133
|
+
return self._project
|
134
|
+
|
135
|
+
async def get_credentials(self) -> google.auth.credentials.Credentials: # type: ignore
|
136
|
+
"""Get the GCP credentials.
|
137
|
+
|
138
|
+
Uses google.auth.default() to get the credentials. If the credentials
|
139
|
+
are invalid, this method will refresh them. If the credentials are
|
140
|
+
still invalid after refreshing, this method will raise an error.
|
141
|
+
|
142
|
+
Returns:
|
143
|
+
google.auth.credentials.Credentials: The GCP credentials.
|
144
|
+
|
145
|
+
Raises:
|
146
|
+
LaunchError: If the GCP credentials are invalid.
|
147
|
+
"""
|
148
|
+
_logger.debug("Getting GCP credentials")
|
149
|
+
# TODO: Figure out a minimal set of scopes.
|
150
|
+
try:
|
151
|
+
google_auth_default = event_loop_thread_exec(google.auth.default)
|
152
|
+
creds, project = await google_auth_default()
|
153
|
+
if not self._project:
|
154
|
+
self._project = project
|
155
|
+
_logger.debug("Refreshing GCP credentials")
|
156
|
+
await event_loop_thread_exec(creds.refresh)(
|
157
|
+
google.auth.transport.requests.Request()
|
158
|
+
)
|
159
|
+
except google.auth.exceptions.DefaultCredentialsError as e:
|
160
|
+
raise LaunchError(
|
161
|
+
"No Google Cloud Platform credentials found. Please run "
|
162
|
+
"`gcloud auth application-default login` or set the environment "
|
163
|
+
"variable GOOGLE_APPLICATION_CREDENTIALS to the path of a valid "
|
164
|
+
"service account key file."
|
165
|
+
) from e
|
166
|
+
except google.auth.exceptions.RefreshError as e:
|
167
|
+
raise LaunchError(
|
168
|
+
"Could not refresh Google Cloud Platform credentials. Please run "
|
169
|
+
"`gcloud auth application-default login` or set the environment "
|
170
|
+
"variable GOOGLE_APPLICATION_CREDENTIALS to the path of a valid "
|
171
|
+
"service account key file."
|
172
|
+
) from e
|
173
|
+
if not creds.valid:
|
174
|
+
raise LaunchError(
|
175
|
+
"Invalid Google Cloud Platform credentials. Please run "
|
176
|
+
"`gcloud auth application-default login` or set the environment "
|
177
|
+
"variable GOOGLE_APPLICATION_CREDENTIALS to the path of a valid "
|
178
|
+
"service account key file."
|
179
|
+
)
|
180
|
+
return creds
|
181
|
+
|
182
|
+
async def verify(self) -> None:
|
183
|
+
"""Verify the credentials, region, and project.
|
184
|
+
|
185
|
+
Credentials and region are verified by calling get_credentials(). The
|
186
|
+
region and is verified by calling the compute API.
|
187
|
+
|
188
|
+
Raises:
|
189
|
+
LaunchError: If the credentials, region, or project are invalid.
|
190
|
+
|
191
|
+
Returns:
|
192
|
+
None
|
193
|
+
"""
|
194
|
+
_logger.debug("Verifying GCP environment")
|
195
|
+
await self.get_credentials()
|
196
|
+
|
197
|
+
async def verify_storage_uri(self, uri: str) -> None:
|
198
|
+
"""Verify that a storage URI is valid.
|
199
|
+
|
200
|
+
Arguments:
|
201
|
+
uri: The storage URI.
|
202
|
+
|
203
|
+
Raises:
|
204
|
+
LaunchError: If the storage URI is invalid.
|
205
|
+
"""
|
206
|
+
match = GCS_URI_RE.match(uri)
|
207
|
+
if not match:
|
208
|
+
raise LaunchError(f"Invalid GCS URI: {uri}")
|
209
|
+
bucket = match.group(1)
|
210
|
+
cloud_storage_client = event_loop_thread_exec(google.cloud.storage.Client)
|
211
|
+
try:
|
212
|
+
credentials = await self.get_credentials()
|
213
|
+
storage_client = await cloud_storage_client(credentials=credentials)
|
214
|
+
bucket = await event_loop_thread_exec(storage_client.get_bucket)(bucket)
|
215
|
+
except google.api_core.exceptions.GoogleAPICallError as e:
|
216
|
+
raise LaunchError(
|
217
|
+
f"Failed verifying storage uri {uri}: bucket {bucket} does not exist."
|
218
|
+
) from e
|
219
|
+
except google.api_core.exceptions.Forbidden as e:
|
220
|
+
raise LaunchError(
|
221
|
+
f"Failed verifying storage uri {uri}: bucket {bucket} is not accessible. Please check your permissions and try again."
|
222
|
+
) from e
|
223
|
+
|
224
|
+
async def upload_file(self, source: str, destination: str) -> None:
|
225
|
+
"""Upload a file to GCS.
|
226
|
+
|
227
|
+
Arguments:
|
228
|
+
source: The path to the local file.
|
229
|
+
destination: The path to the GCS file.
|
230
|
+
|
231
|
+
Raises:
|
232
|
+
LaunchError: If the file cannot be uploaded.
|
233
|
+
"""
|
234
|
+
_logger.debug(f"Uploading file {source} to {destination}")
|
235
|
+
_err_prefix = f"Could not upload file {source} to GCS destination {destination}"
|
236
|
+
if not os.path.isfile(source):
|
237
|
+
raise LaunchError(f"{_err_prefix}: File {source} does not exist.")
|
238
|
+
match = GCS_URI_RE.match(destination)
|
239
|
+
if not match:
|
240
|
+
raise LaunchError(f"{_err_prefix}: Invalid GCS URI: {destination}")
|
241
|
+
bucket = match.group(1)
|
242
|
+
key = match.group(2).lstrip("/")
|
243
|
+
google_storage_client = event_loop_thread_exec(google.cloud.storage.Client)
|
244
|
+
credentials = await self.get_credentials()
|
245
|
+
try:
|
246
|
+
storage_client = await google_storage_client(credentials=credentials)
|
247
|
+
bucket = await event_loop_thread_exec(storage_client.bucket)(bucket)
|
248
|
+
blob = await event_loop_thread_exec(bucket.blob)(key)
|
249
|
+
await event_loop_thread_exec(blob.upload_from_filename)(source)
|
250
|
+
except google.api_core.exceptions.GoogleAPICallError as e:
|
251
|
+
resp = e.response
|
252
|
+
assert resp is not None
|
253
|
+
try:
|
254
|
+
message = resp.json()["error"]["message"]
|
255
|
+
except Exception:
|
256
|
+
message = str(resp)
|
257
|
+
raise LaunchError(f"{_err_prefix}: {message}") from e
|
258
|
+
|
259
|
+
async def upload_dir(self, source: str, destination: str) -> None:
|
260
|
+
"""Upload a directory to GCS.
|
261
|
+
|
262
|
+
Arguments:
|
263
|
+
source: The path to the local directory.
|
264
|
+
destination: The path to the GCS directory.
|
265
|
+
|
266
|
+
Raises:
|
267
|
+
LaunchError: If the directory cannot be uploaded.
|
268
|
+
"""
|
269
|
+
_logger.debug(f"Uploading directory {source} to {destination}")
|
270
|
+
_err_prefix = (
|
271
|
+
f"Could not upload directory {source} to GCS destination {destination}"
|
272
|
+
)
|
273
|
+
if not os.path.isdir(source):
|
274
|
+
raise LaunchError(f"{_err_prefix}: Directory {source} does not exist.")
|
275
|
+
match = GCS_URI_RE.match(destination)
|
276
|
+
if not match:
|
277
|
+
raise LaunchError(f"{_err_prefix}: Invalid GCS URI: {destination}")
|
278
|
+
bucket = match.group(1)
|
279
|
+
key = match.group(2).lstrip("/")
|
280
|
+
google_storage_client = event_loop_thread_exec(google.cloud.storage.Client)
|
281
|
+
credentials = await self.get_credentials()
|
282
|
+
try:
|
283
|
+
storage_client = await google_storage_client(credentials=credentials)
|
284
|
+
bucket = await event_loop_thread_exec(storage_client.bucket)(bucket)
|
285
|
+
for root, _, files in os.walk(source):
|
286
|
+
for file in files:
|
287
|
+
local_path = os.path.join(root, file)
|
288
|
+
gcs_path = os.path.join(
|
289
|
+
key, os.path.relpath(local_path, source)
|
290
|
+
).replace("\\", "/")
|
291
|
+
blob = await event_loop_thread_exec(bucket.blob)(gcs_path)
|
292
|
+
await event_loop_thread_exec(blob.upload_from_filename)(local_path)
|
293
|
+
except google.api_core.exceptions.GoogleAPICallError as e:
|
294
|
+
resp = e.response
|
295
|
+
assert resp is not None
|
296
|
+
try:
|
297
|
+
message = resp.json()["error"]["message"]
|
298
|
+
except Exception:
|
299
|
+
message = str(resp)
|
300
|
+
raise LaunchError(f"{_err_prefix}: {message}") from e
|
301
|
+
except Exception as e:
|
302
|
+
raise LaunchError(f"{_err_prefix}: GCS upload failed: {e}") from e
|
303
|
+
|
304
|
+
|
305
|
+
def get_gcloud_config_value(config_name: str) -> Optional[str]:
|
306
|
+
"""Get a value from gcloud config.
|
307
|
+
|
308
|
+
Arguments:
|
309
|
+
config_name: The name of the config value.
|
310
|
+
|
311
|
+
Returns:
|
312
|
+
str: The config value, or None if the value is not set.
|
313
|
+
"""
|
314
|
+
try:
|
315
|
+
output = subprocess.check_output(
|
316
|
+
["gcloud", "config", "get-value", config_name], stderr=subprocess.STDOUT
|
317
|
+
)
|
318
|
+
value = str(output.decode("utf-8").strip())
|
319
|
+
if value and "unset" not in value:
|
320
|
+
return value
|
321
|
+
return None
|
322
|
+
except subprocess.CalledProcessError:
|
323
|
+
return None
|
324
|
+
|
325
|
+
|
326
|
+
def get_default_region() -> Optional[str]:
|
327
|
+
"""Get the default region from gcloud config or environment variables.
|
328
|
+
|
329
|
+
Returns:
|
330
|
+
str: The default region, or None if it cannot be determined.
|
331
|
+
"""
|
332
|
+
region = get_gcloud_config_value("compute/region")
|
333
|
+
if not region:
|
334
|
+
region = os.environ.get(GCP_REGION_ENV_VAR)
|
335
|
+
return region
|
@@ -0,0 +1,66 @@
|
|
1
|
+
"""Dummy local environment implementation. This is the default environment."""
|
2
|
+
|
3
|
+
from typing import Any, Dict, Union
|
4
|
+
|
5
|
+
from wandb.sdk.launch.errors import LaunchError
|
6
|
+
|
7
|
+
from .abstract import AbstractEnvironment
|
8
|
+
|
9
|
+
|
10
|
+
class LocalEnvironment(AbstractEnvironment):
|
11
|
+
"""Local environment class."""
|
12
|
+
|
13
|
+
def __init__(self) -> None:
|
14
|
+
"""Initialize a local environment by doing nothing."""
|
15
|
+
pass
|
16
|
+
|
17
|
+
@classmethod
|
18
|
+
def from_config(
|
19
|
+
cls, config: Dict[str, Union[Dict[str, Any], str]]
|
20
|
+
) -> "LocalEnvironment":
|
21
|
+
"""Create a local environment from a config.
|
22
|
+
|
23
|
+
Arguments:
|
24
|
+
config (dict): The config. This is ignored.
|
25
|
+
|
26
|
+
Returns:
|
27
|
+
LocalEnvironment: The local environment.
|
28
|
+
"""
|
29
|
+
return cls()
|
30
|
+
|
31
|
+
async def verify(self) -> None:
|
32
|
+
"""Verify that the local environment is configured correctly."""
|
33
|
+
raise LaunchError("Attempted to verify LocalEnvironment.")
|
34
|
+
|
35
|
+
async def verify_storage_uri(self, uri: str) -> None:
|
36
|
+
"""Verify that the storage URI is configured correctly.
|
37
|
+
|
38
|
+
Arguments:
|
39
|
+
uri (str): The storage URI. This is ignored.
|
40
|
+
"""
|
41
|
+
raise LaunchError("Attempted to verify storage uri for LocalEnvironment.")
|
42
|
+
|
43
|
+
async def upload_file(self, source: str, destination: str) -> None:
|
44
|
+
"""Upload a file from the local filesystem to storage in the environment.
|
45
|
+
|
46
|
+
Arguments:
|
47
|
+
source (str): The source file. This is ignored.
|
48
|
+
destination (str): The destination file. This is ignored.
|
49
|
+
"""
|
50
|
+
raise LaunchError("Attempted to upload file for LocalEnvironment.")
|
51
|
+
|
52
|
+
async def upload_dir(self, source: str, destination: str) -> None:
|
53
|
+
"""Upload the contents of a directory from the local filesystem to the environment.
|
54
|
+
|
55
|
+
Arguments:
|
56
|
+
source (str): The source directory. This is ignored.
|
57
|
+
destination (str): The destination directory. This is ignored.
|
58
|
+
"""
|
59
|
+
raise LaunchError("Attempted to upload directory for LocalEnvironment.")
|
60
|
+
|
61
|
+
async def get_project(self) -> str:
|
62
|
+
"""Get the project of the local environment.
|
63
|
+
|
64
|
+
Returns: An empty string.
|
65
|
+
"""
|
66
|
+
raise LaunchError("Attempted to get project for LocalEnvironment.")
|
@@ -0,0 +1,19 @@
|
|
1
|
+
from wandb.errors import Error
|
2
|
+
|
3
|
+
|
4
|
+
class LaunchError(Error):
|
5
|
+
"""Raised when a known error occurs in wandb launch."""
|
6
|
+
|
7
|
+
pass
|
8
|
+
|
9
|
+
|
10
|
+
class LaunchDockerError(Error):
|
11
|
+
"""Raised when Docker daemon is not running."""
|
12
|
+
|
13
|
+
pass
|
14
|
+
|
15
|
+
|
16
|
+
class ExecutionError(Error):
|
17
|
+
"""Generic execution exception."""
|
18
|
+
|
19
|
+
pass
|
@@ -0,0 +1,109 @@
|
|
1
|
+
"""Support for parsing GitHub URLs (which might be user provided) into constituent parts."""
|
2
|
+
|
3
|
+
import re
|
4
|
+
from dataclasses import dataclass
|
5
|
+
from enum import IntEnum
|
6
|
+
from typing import Optional, Tuple, Union
|
7
|
+
|
8
|
+
from wandb.sdk.launch.errors import LaunchError
|
9
|
+
|
10
|
+
PREFIX_HTTPS = "https://"
|
11
|
+
PREFIX_SSH = "git@"
|
12
|
+
SUFFIX_GIT = ".git"
|
13
|
+
|
14
|
+
|
15
|
+
GIT_COMMIT_REGEX = re.compile(r"[0-9a-f]{40}")
|
16
|
+
|
17
|
+
|
18
|
+
class ReferenceType(IntEnum):
|
19
|
+
BRANCH = 1
|
20
|
+
COMMIT = 2
|
21
|
+
|
22
|
+
|
23
|
+
def _parse_netloc(netloc: str) -> Tuple[Optional[str], Optional[str], str]:
|
24
|
+
"""Parse netloc into username, password, and host.
|
25
|
+
|
26
|
+
github.com => None, None, "@github.com"
|
27
|
+
username@github.com => "username", None, "github.com"
|
28
|
+
username:password@github.com => "username", "password", "github.com"
|
29
|
+
"""
|
30
|
+
parts = netloc.split("@", 1)
|
31
|
+
if len(parts) == 1:
|
32
|
+
return None, None, parts[0]
|
33
|
+
auth, host = parts
|
34
|
+
parts = auth.split(":", 1)
|
35
|
+
if len(parts) == 1:
|
36
|
+
return parts[0], None, host
|
37
|
+
return parts[0], parts[1], host
|
38
|
+
|
39
|
+
|
40
|
+
@dataclass
|
41
|
+
class GitReference:
|
42
|
+
def __init__(self, remote: str, ref: Optional[str] = None) -> None:
|
43
|
+
"""Initialize a reference from a remote and ref.
|
44
|
+
|
45
|
+
Arguments:
|
46
|
+
remote: A remote URL or URI.
|
47
|
+
ref: A branch, tag, or commit hash.
|
48
|
+
"""
|
49
|
+
self.uri = remote
|
50
|
+
self.ref = ref
|
51
|
+
|
52
|
+
@property
|
53
|
+
def url(self) -> Optional[str]:
|
54
|
+
return self.uri
|
55
|
+
|
56
|
+
def fetch(self, dst_dir: str) -> None:
|
57
|
+
"""Fetch the repo into dst_dir and refine githubref based on what we learn."""
|
58
|
+
# We defer importing git until the last moment, because the import requires that the git
|
59
|
+
# executable is available on the PATH, so we only want to fail if we actually need it.
|
60
|
+
import git # type: ignore
|
61
|
+
|
62
|
+
repo = git.Repo.init(dst_dir)
|
63
|
+
self.path = repo.working_dir
|
64
|
+
origin = repo.create_remote("origin", self.uri or "")
|
65
|
+
|
66
|
+
try:
|
67
|
+
# We fetch the origin so that we have branch and tag references
|
68
|
+
origin.fetch()
|
69
|
+
except git.exc.GitCommandError as e:
|
70
|
+
raise LaunchError(
|
71
|
+
f"Unable to fetch from git remote repository {self.url}:\n{e}"
|
72
|
+
)
|
73
|
+
|
74
|
+
ref: Union[git.RemoteReference, str]
|
75
|
+
if self.ref:
|
76
|
+
if self.ref in origin.refs:
|
77
|
+
ref = origin.refs[self.ref]
|
78
|
+
else:
|
79
|
+
ref = self.ref
|
80
|
+
head = repo.create_head(self.ref, ref)
|
81
|
+
head.checkout()
|
82
|
+
self.commit_hash = head.commit.hexsha
|
83
|
+
|
84
|
+
else:
|
85
|
+
# TODO: Is there a better way to do this?
|
86
|
+
default_branch = None
|
87
|
+
for ref in repo.references:
|
88
|
+
if hasattr(ref, "tag"): # Skip tag references
|
89
|
+
continue
|
90
|
+
refname = ref.name
|
91
|
+
if refname.startswith("origin/"): # Trim off "origin/"
|
92
|
+
refname = refname[7:]
|
93
|
+
if refname == "main":
|
94
|
+
default_branch = "main"
|
95
|
+
break
|
96
|
+
if refname == "master":
|
97
|
+
default_branch = "master"
|
98
|
+
# Keep looking in case we also have a main, which we let take precedence
|
99
|
+
# (While the references appear to be sorted, not clear if that's guaranteed.)
|
100
|
+
if not default_branch:
|
101
|
+
raise LaunchError(
|
102
|
+
f"Unable to determine branch or commit to checkout from {self.url}"
|
103
|
+
)
|
104
|
+
self.default_branch = default_branch
|
105
|
+
self.ref = default_branch
|
106
|
+
head = repo.create_head(default_branch, origin.refs[default_branch])
|
107
|
+
head.checkout()
|
108
|
+
self.commit_hash = head.commit.hexsha
|
109
|
+
repo.submodule_update(init=True, recursive=True)
|
@@ -0,0 +1,148 @@
|
|
1
|
+
import json
|
2
|
+
import os
|
3
|
+
from typing import Any, Dict
|
4
|
+
|
5
|
+
import yaml
|
6
|
+
|
7
|
+
from ..errors import LaunchError
|
8
|
+
|
9
|
+
FILE_OVERRIDE_ENV_VAR = "WANDB_LAUNCH_FILE_OVERRIDES"
|
10
|
+
|
11
|
+
|
12
|
+
class FileOverrides:
|
13
|
+
"""Singleton that read file overrides json from environment variables."""
|
14
|
+
|
15
|
+
_instance = None
|
16
|
+
|
17
|
+
def __new__(cls):
|
18
|
+
if cls._instance is None:
|
19
|
+
cls._instance = object.__new__(cls)
|
20
|
+
cls._instance.overrides = {}
|
21
|
+
cls._instance.load()
|
22
|
+
return cls._instance
|
23
|
+
|
24
|
+
def load(self) -> None:
|
25
|
+
"""Load overrides from an environment variable."""
|
26
|
+
overrides = os.environ.get(FILE_OVERRIDE_ENV_VAR)
|
27
|
+
if overrides is None:
|
28
|
+
if f"{FILE_OVERRIDE_ENV_VAR}_0" in os.environ:
|
29
|
+
overrides = ""
|
30
|
+
idx = 0
|
31
|
+
while f"{FILE_OVERRIDE_ENV_VAR}_{idx}" in os.environ:
|
32
|
+
overrides += os.environ[f"{FILE_OVERRIDE_ENV_VAR}_{idx}"]
|
33
|
+
idx += 1
|
34
|
+
if overrides:
|
35
|
+
try:
|
36
|
+
contents = json.loads(overrides)
|
37
|
+
if not isinstance(contents, dict):
|
38
|
+
raise LaunchError(f"Invalid JSON in {FILE_OVERRIDE_ENV_VAR}")
|
39
|
+
self.overrides = contents
|
40
|
+
except json.JSONDecodeError:
|
41
|
+
raise LaunchError(f"Invalid JSON in {FILE_OVERRIDE_ENV_VAR}")
|
42
|
+
|
43
|
+
|
44
|
+
def config_path_is_valid(path: str) -> None:
|
45
|
+
"""Validate a config file path.
|
46
|
+
|
47
|
+
This function checks if a given config file path is valid. A valid path
|
48
|
+
should meet the following criteria:
|
49
|
+
|
50
|
+
- The path must be expressed as a relative path without any upwards path
|
51
|
+
traversal, e.g. `../config.json`.
|
52
|
+
- The file specified by the path must exist.
|
53
|
+
- The file must have a supported extension (`.json`, `.yaml`, or `.yml`).
|
54
|
+
|
55
|
+
Args:
|
56
|
+
path (str): The path to validate.
|
57
|
+
|
58
|
+
Raises:
|
59
|
+
LaunchError: If the path is not valid.
|
60
|
+
"""
|
61
|
+
if os.path.isabs(path):
|
62
|
+
raise LaunchError(
|
63
|
+
f"Invalid config path: {path}. Please provide a relative path."
|
64
|
+
)
|
65
|
+
if ".." in path:
|
66
|
+
raise LaunchError(
|
67
|
+
f"Invalid config path: {path}. Please provide a relative path "
|
68
|
+
"without any upward path traversal, e.g. `../config.json`."
|
69
|
+
)
|
70
|
+
path = os.path.normpath(path)
|
71
|
+
if not os.path.exists(path):
|
72
|
+
raise LaunchError(f"Invalid config path: {path}. File does not exist.")
|
73
|
+
if not any(path.endswith(ext) for ext in [".json", ".yaml", ".yml"]):
|
74
|
+
raise LaunchError(
|
75
|
+
f"Invalid config path: {path}. Only JSON and YAML files are supported."
|
76
|
+
)
|
77
|
+
|
78
|
+
|
79
|
+
def override_file(path: str) -> None:
|
80
|
+
"""Check for file overrides in the environment and apply them if found."""
|
81
|
+
file_overrides = FileOverrides()
|
82
|
+
if path in file_overrides.overrides:
|
83
|
+
overrides = file_overrides.overrides.get(path)
|
84
|
+
if overrides is not None:
|
85
|
+
config = _read_config_file(path)
|
86
|
+
_update_dict(config, overrides)
|
87
|
+
_write_config_file(path, config)
|
88
|
+
|
89
|
+
|
90
|
+
def _write_config_file(path: str, config: Any) -> None:
|
91
|
+
"""Write a config file to disk.
|
92
|
+
|
93
|
+
Args:
|
94
|
+
path (str): The path to the config file.
|
95
|
+
config (Any): The contents of the config file as a Python object.
|
96
|
+
|
97
|
+
Raises:
|
98
|
+
LaunchError: If the file extension is not supported.
|
99
|
+
"""
|
100
|
+
_, ext = os.path.splitext(path)
|
101
|
+
if ext == ".json":
|
102
|
+
with open(path, "w") as f:
|
103
|
+
json.dump(config, f, indent=2)
|
104
|
+
elif ext in [".yaml", ".yml"]:
|
105
|
+
with open(path, "w") as f:
|
106
|
+
yaml.safe_dump(config, f)
|
107
|
+
else:
|
108
|
+
raise LaunchError(f"Unsupported file extension: {ext}")
|
109
|
+
|
110
|
+
|
111
|
+
def _read_config_file(path: str) -> Any:
|
112
|
+
"""Read a config file from disk.
|
113
|
+
|
114
|
+
Args:
|
115
|
+
path (str): The path to the config file.
|
116
|
+
|
117
|
+
Returns:
|
118
|
+
Any: The contents of the config file as a Python object.
|
119
|
+
"""
|
120
|
+
_, ext = os.path.splitext(path)
|
121
|
+
if ext == ".json":
|
122
|
+
with open(
|
123
|
+
path,
|
124
|
+
) as f:
|
125
|
+
return json.load(f)
|
126
|
+
elif ext in [".yaml", ".yml"]:
|
127
|
+
with open(
|
128
|
+
path,
|
129
|
+
) as f:
|
130
|
+
return yaml.safe_load(f)
|
131
|
+
else:
|
132
|
+
raise LaunchError(f"Unsupported file extension: {ext}")
|
133
|
+
|
134
|
+
|
135
|
+
def _update_dict(target: Dict, source: Dict) -> None:
|
136
|
+
"""Update a dictionary with the contents of another dictionary.
|
137
|
+
|
138
|
+
Args:
|
139
|
+
target (Dict): The dictionary to update.
|
140
|
+
source (Dict): The dictionary to update from.
|
141
|
+
"""
|
142
|
+
for key, value in source.items():
|
143
|
+
if isinstance(value, dict):
|
144
|
+
if key not in target:
|
145
|
+
target[key] = {}
|
146
|
+
_update_dict(target[key], value)
|
147
|
+
else:
|
148
|
+
target[key] = value
|