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,249 @@
|
|
1
|
+
"""Utilities for the agent."""
|
2
|
+
|
3
|
+
from typing import Any, Dict, Optional
|
4
|
+
|
5
|
+
import wandb
|
6
|
+
from wandb.apis.internal import Api
|
7
|
+
from wandb.docker import is_docker_installed
|
8
|
+
from wandb.sdk.launch.errors import LaunchError
|
9
|
+
|
10
|
+
from .builder.abstract import AbstractBuilder
|
11
|
+
from .environment.abstract import AbstractEnvironment
|
12
|
+
from .registry.abstract import AbstractRegistry
|
13
|
+
from .runner.abstract import AbstractRunner
|
14
|
+
|
15
|
+
WANDB_RUNNERS = {
|
16
|
+
"local-container",
|
17
|
+
"local-process",
|
18
|
+
"kubernetes",
|
19
|
+
"vertex",
|
20
|
+
"sagemaker",
|
21
|
+
}
|
22
|
+
|
23
|
+
|
24
|
+
def environment_from_config(config: Optional[Dict[str, Any]]) -> AbstractEnvironment:
|
25
|
+
"""Create an environment from a config.
|
26
|
+
|
27
|
+
This helper function is used to create an environment from a config. The
|
28
|
+
config should have a "type" key that specifies the type of environment to
|
29
|
+
create. The remaining keys are passed to the environment's from_config
|
30
|
+
method. If the config is None or empty, a LocalEnvironment is returned.
|
31
|
+
|
32
|
+
Arguments:
|
33
|
+
config (Dict[str, Any]): The config.
|
34
|
+
|
35
|
+
Returns:
|
36
|
+
Environment: The environment constructed.
|
37
|
+
"""
|
38
|
+
if not config:
|
39
|
+
from .environment.local_environment import LocalEnvironment
|
40
|
+
|
41
|
+
return LocalEnvironment() # This is the default, dummy environment.
|
42
|
+
env_type = config.get("type")
|
43
|
+
if not env_type:
|
44
|
+
raise LaunchError(
|
45
|
+
"Could not create environment from config. Environment type not specified!"
|
46
|
+
)
|
47
|
+
if env_type == "local":
|
48
|
+
from .environment.local_environment import LocalEnvironment
|
49
|
+
|
50
|
+
return LocalEnvironment.from_config(config)
|
51
|
+
if env_type == "aws":
|
52
|
+
from .environment.aws_environment import AwsEnvironment
|
53
|
+
|
54
|
+
return AwsEnvironment.from_config(config)
|
55
|
+
if env_type == "gcp":
|
56
|
+
from .environment.gcp_environment import GcpEnvironment
|
57
|
+
|
58
|
+
return GcpEnvironment.from_config(config)
|
59
|
+
if env_type == "azure":
|
60
|
+
from .environment.azure_environment import AzureEnvironment
|
61
|
+
|
62
|
+
return AzureEnvironment.from_config(config)
|
63
|
+
raise LaunchError(
|
64
|
+
f"Could not create environment from config. Invalid type: {env_type}"
|
65
|
+
)
|
66
|
+
|
67
|
+
|
68
|
+
def registry_from_config(
|
69
|
+
config: Optional[Dict[str, Any]], environment: AbstractEnvironment
|
70
|
+
) -> AbstractRegistry:
|
71
|
+
"""Create a registry from a config.
|
72
|
+
|
73
|
+
This helper function is used to create a registry from a config. The
|
74
|
+
config should have a "type" key that specifies the type of registry to
|
75
|
+
create. The remaining keys are passed to the registry's from_config
|
76
|
+
method. If the config is None or empty, a LocalRegistry is returned.
|
77
|
+
|
78
|
+
Arguments:
|
79
|
+
config (Dict[str, Any]): The registry config.
|
80
|
+
environment (Environment): The environment of the registry.
|
81
|
+
|
82
|
+
Returns:
|
83
|
+
The registry if config is not None, otherwise None.
|
84
|
+
|
85
|
+
Raises:
|
86
|
+
LaunchError: If the registry is not configured correctly.
|
87
|
+
"""
|
88
|
+
if not config:
|
89
|
+
from .registry.local_registry import LocalRegistry
|
90
|
+
|
91
|
+
return LocalRegistry() # This is the default, dummy registry.
|
92
|
+
|
93
|
+
wandb.termwarn(
|
94
|
+
"The `registry` block of the launch agent config is being deprecated. "
|
95
|
+
"Please specify an image repository URI under the `builder.destination` "
|
96
|
+
"key of your launch agent config. See "
|
97
|
+
"https://docs.wandb.ai/guides/launch/setup-agent-advanced#agent-configuration "
|
98
|
+
"for more information."
|
99
|
+
)
|
100
|
+
|
101
|
+
registry_type = config.get("type")
|
102
|
+
if registry_type is None or registry_type == "local":
|
103
|
+
from .registry.local_registry import LocalRegistry
|
104
|
+
|
105
|
+
return LocalRegistry() # This is the default, dummy registry.
|
106
|
+
if registry_type == "ecr":
|
107
|
+
from .registry.elastic_container_registry import ElasticContainerRegistry
|
108
|
+
|
109
|
+
return ElasticContainerRegistry.from_config(config)
|
110
|
+
if registry_type == "gcr":
|
111
|
+
from .registry.google_artifact_registry import GoogleArtifactRegistry
|
112
|
+
|
113
|
+
return GoogleArtifactRegistry.from_config(config)
|
114
|
+
if registry_type == "acr":
|
115
|
+
from .registry.azure_container_registry import AzureContainerRegistry
|
116
|
+
|
117
|
+
return AzureContainerRegistry.from_config(config)
|
118
|
+
raise LaunchError(
|
119
|
+
f"Could not create registry from config. Invalid registry type: {registry_type}"
|
120
|
+
)
|
121
|
+
|
122
|
+
|
123
|
+
def builder_from_config(
|
124
|
+
config: Optional[Dict[str, Any]],
|
125
|
+
environment: AbstractEnvironment,
|
126
|
+
registry: AbstractRegistry,
|
127
|
+
) -> AbstractBuilder:
|
128
|
+
"""Create a builder from a config.
|
129
|
+
|
130
|
+
This helper function is used to create a builder from a config. The
|
131
|
+
config should have a "type" key that specifies the type of builder to import
|
132
|
+
and create. The remaining keys are passed to the builder's from_config
|
133
|
+
method. If the config is None or empty, a default builder is returned.
|
134
|
+
|
135
|
+
The default builder will be a DockerBuilder if we find a working docker cli
|
136
|
+
on the system, otherwise it will be a NoOpBuilder.
|
137
|
+
|
138
|
+
Arguments:
|
139
|
+
config (Dict[str, Any]): The builder config.
|
140
|
+
registry (Registry): The registry of the builder.
|
141
|
+
|
142
|
+
Returns:
|
143
|
+
The builder.
|
144
|
+
|
145
|
+
Raises:
|
146
|
+
LaunchError: If the builder is not configured correctly.
|
147
|
+
"""
|
148
|
+
if not config:
|
149
|
+
if is_docker_installed():
|
150
|
+
from .builder.docker_builder import DockerBuilder
|
151
|
+
|
152
|
+
return DockerBuilder.from_config(
|
153
|
+
{}, environment, registry
|
154
|
+
) # This is the default builder.
|
155
|
+
|
156
|
+
from .builder.noop import NoOpBuilder
|
157
|
+
|
158
|
+
return NoOpBuilder.from_config({}, environment, registry)
|
159
|
+
|
160
|
+
builder_type = config.get("type")
|
161
|
+
if builder_type is None:
|
162
|
+
raise LaunchError(
|
163
|
+
"Could not create builder from config. Builder type not specified"
|
164
|
+
)
|
165
|
+
if builder_type == "docker":
|
166
|
+
from .builder.docker_builder import DockerBuilder
|
167
|
+
|
168
|
+
return DockerBuilder.from_config(config, environment, registry)
|
169
|
+
if builder_type == "kaniko":
|
170
|
+
from .builder.kaniko_builder import KanikoBuilder
|
171
|
+
|
172
|
+
return KanikoBuilder.from_config(config, environment, registry)
|
173
|
+
if builder_type == "noop":
|
174
|
+
from .builder.noop import NoOpBuilder
|
175
|
+
|
176
|
+
return NoOpBuilder.from_config(config, environment, registry)
|
177
|
+
raise LaunchError(
|
178
|
+
f"Could not create builder from config. Invalid builder type: {builder_type}"
|
179
|
+
)
|
180
|
+
|
181
|
+
|
182
|
+
def runner_from_config(
|
183
|
+
runner_name: str,
|
184
|
+
api: Api,
|
185
|
+
runner_config: Dict[str, Any],
|
186
|
+
environment: AbstractEnvironment,
|
187
|
+
registry: AbstractRegistry,
|
188
|
+
) -> AbstractRunner:
|
189
|
+
"""Create a runner from a config.
|
190
|
+
|
191
|
+
This helper function is used to create a runner from a config. The
|
192
|
+
config should have a "type" key that specifies the type of runner to import
|
193
|
+
and create. The remaining keys are passed to the runner's from_config
|
194
|
+
method. If the config is None or empty, a LocalContainerRunner is returned.
|
195
|
+
|
196
|
+
Arguments:
|
197
|
+
runner_name (str): The name of the backend.
|
198
|
+
api (Api): The API.
|
199
|
+
runner_config (Dict[str, Any]): The backend config.
|
200
|
+
|
201
|
+
Returns:
|
202
|
+
The runner.
|
203
|
+
|
204
|
+
Raises:
|
205
|
+
LaunchError: If the runner is not configured correctly.
|
206
|
+
"""
|
207
|
+
if not runner_name or runner_name in ["local-container", "local"]:
|
208
|
+
from .runner.local_container import LocalContainerRunner
|
209
|
+
|
210
|
+
return LocalContainerRunner(api, runner_config, environment, registry)
|
211
|
+
if runner_name == "local-process":
|
212
|
+
from .runner.local_process import LocalProcessRunner
|
213
|
+
|
214
|
+
return LocalProcessRunner(api, runner_config)
|
215
|
+
if runner_name == "sagemaker":
|
216
|
+
from .environment.aws_environment import AwsEnvironment
|
217
|
+
|
218
|
+
if not isinstance(environment, AwsEnvironment):
|
219
|
+
try:
|
220
|
+
environment = AwsEnvironment.from_default()
|
221
|
+
except LaunchError as e:
|
222
|
+
raise LaunchError(
|
223
|
+
"Could not create Sagemaker runner. "
|
224
|
+
"Environment must be an instance of AwsEnvironment."
|
225
|
+
) from e
|
226
|
+
from .runner.sagemaker_runner import SageMakerRunner
|
227
|
+
|
228
|
+
return SageMakerRunner(api, runner_config, environment, registry)
|
229
|
+
if runner_name in ["vertex", "gcp-vertex"]:
|
230
|
+
from .environment.gcp_environment import GcpEnvironment
|
231
|
+
|
232
|
+
if not isinstance(environment, GcpEnvironment):
|
233
|
+
try:
|
234
|
+
environment = GcpEnvironment.from_default()
|
235
|
+
except LaunchError as e:
|
236
|
+
raise LaunchError(
|
237
|
+
"Could not create Vertex runner. "
|
238
|
+
"Environment must be an instance of GcpEnvironment."
|
239
|
+
) from e
|
240
|
+
from .runner.vertex_runner import VertexRunner
|
241
|
+
|
242
|
+
return VertexRunner(api, runner_config, environment, registry)
|
243
|
+
if runner_name == "kubernetes":
|
244
|
+
from .runner.kubernetes_runner import KubernetesRunner
|
245
|
+
|
246
|
+
return KubernetesRunner(api, runner_config, environment, registry)
|
247
|
+
raise LaunchError(
|
248
|
+
f"Could not create runner from config. Invalid runner name: {runner_name}"
|
249
|
+
)
|
@@ -0,0 +1,48 @@
|
|
1
|
+
"""Abstract base class for registries."""
|
2
|
+
|
3
|
+
from abc import ABC, abstractmethod
|
4
|
+
from typing import Tuple
|
5
|
+
|
6
|
+
|
7
|
+
class AbstractRegistry(ABC):
|
8
|
+
"""Abstract base class for registries."""
|
9
|
+
|
10
|
+
uri: str
|
11
|
+
|
12
|
+
async def get_username_password(self) -> Tuple[str, str]:
|
13
|
+
"""Get the username and password for the registry.
|
14
|
+
|
15
|
+
Returns:
|
16
|
+
(str, str): The username and password.
|
17
|
+
"""
|
18
|
+
raise NotImplementedError
|
19
|
+
|
20
|
+
@abstractmethod
|
21
|
+
async def get_repo_uri(self) -> str:
|
22
|
+
"""Get the URI for a repository.
|
23
|
+
|
24
|
+
Returns:
|
25
|
+
str: The URI.
|
26
|
+
"""
|
27
|
+
raise NotImplementedError
|
28
|
+
|
29
|
+
@abstractmethod
|
30
|
+
async def check_image_exists(self, image_uri: str) -> bool:
|
31
|
+
"""Check if an image exists in the registry.
|
32
|
+
|
33
|
+
Arguments:
|
34
|
+
image_uri (str): The URI of the image.
|
35
|
+
|
36
|
+
Returns:
|
37
|
+
bool: True if the image exists.
|
38
|
+
"""
|
39
|
+
raise NotImplementedError
|
40
|
+
|
41
|
+
@classmethod
|
42
|
+
@abstractmethod
|
43
|
+
def from_config(
|
44
|
+
cls,
|
45
|
+
config: dict,
|
46
|
+
) -> "AbstractRegistry":
|
47
|
+
"""Create a registry from a config."""
|
48
|
+
raise NotImplementedError
|
@@ -0,0 +1,29 @@
|
|
1
|
+
from typing import Tuple
|
2
|
+
|
3
|
+
from wandb.docker import is_docker_installed
|
4
|
+
from wandb.sdk.launch.utils import docker_image_exists
|
5
|
+
|
6
|
+
from .abstract import AbstractRegistry
|
7
|
+
|
8
|
+
|
9
|
+
class AnonynmousRegistry(AbstractRegistry):
|
10
|
+
def __init__(self, uri: str) -> None:
|
11
|
+
"""Initialize the registry."""
|
12
|
+
self.uri = uri
|
13
|
+
|
14
|
+
async def get_username_password(self) -> Tuple[str, str]:
|
15
|
+
"""Get the username and password for the registry."""
|
16
|
+
raise NotImplementedError("Anonymous registry does not require authentication")
|
17
|
+
|
18
|
+
async def get_repo_uri(self) -> str:
|
19
|
+
return self.uri
|
20
|
+
|
21
|
+
async def check_image_exists(self, image_uri: str) -> bool:
|
22
|
+
"""Check if an image exists in the registry."""
|
23
|
+
if not is_docker_installed():
|
24
|
+
return False
|
25
|
+
return docker_image_exists(image_uri)
|
26
|
+
|
27
|
+
@classmethod
|
28
|
+
def from_config(cls, config: dict) -> "AbstractRegistry":
|
29
|
+
return cls(uri=config["uri"])
|
@@ -0,0 +1,124 @@
|
|
1
|
+
"""Implementation of AzureContainerRegistry class."""
|
2
|
+
|
3
|
+
import re
|
4
|
+
from typing import TYPE_CHECKING, Optional, Tuple
|
5
|
+
|
6
|
+
from wandb.sdk.launch.environment.azure_environment import AzureEnvironment
|
7
|
+
from wandb.sdk.launch.errors import LaunchError
|
8
|
+
from wandb.sdk.launch.utils import AZURE_CONTAINER_REGISTRY_URI_REGEX
|
9
|
+
from wandb.util import get_module
|
10
|
+
|
11
|
+
from .abstract import AbstractRegistry
|
12
|
+
|
13
|
+
if TYPE_CHECKING:
|
14
|
+
from azure.containerregistry import ContainerRegistryClient # type: ignore
|
15
|
+
from azure.core.exceptions import ResourceNotFoundError # type: ignore
|
16
|
+
|
17
|
+
|
18
|
+
ContainerRegistryClient = get_module( # noqa: F811
|
19
|
+
"azure.containerregistry",
|
20
|
+
required="The azure-containerregistry package is required to use launch with Azure. Please install it with `pip install azure-containerregistry`.",
|
21
|
+
).ContainerRegistryClient
|
22
|
+
|
23
|
+
ResourceNotFoundError = get_module( # noqa: F811
|
24
|
+
"azure.core.exceptions",
|
25
|
+
required="The azure-core package is required to use launch with Azure. Please install it with `pip install azure-core`.",
|
26
|
+
).ResourceNotFoundError
|
27
|
+
|
28
|
+
|
29
|
+
class AzureContainerRegistry(AbstractRegistry):
|
30
|
+
"""Helper for accessing Azure Container Registry resources."""
|
31
|
+
|
32
|
+
def __init__(
|
33
|
+
self,
|
34
|
+
uri: Optional[str] = None,
|
35
|
+
registry_name: Optional[str] = None,
|
36
|
+
repo_name: Optional[str] = None,
|
37
|
+
):
|
38
|
+
"""Initialize an AzureContainerRegistry."""
|
39
|
+
if uri is not None:
|
40
|
+
self.uri = uri
|
41
|
+
if any(x is not None for x in (registry_name, repo_name)):
|
42
|
+
raise LaunchError(
|
43
|
+
"Please specify either a registry name and repo name or a registry URI."
|
44
|
+
)
|
45
|
+
if self.uri.startswith("https://"):
|
46
|
+
self.uri = self.uri[len("https://") :]
|
47
|
+
match = AZURE_CONTAINER_REGISTRY_URI_REGEX.match(self.uri)
|
48
|
+
if match is None:
|
49
|
+
raise LaunchError(
|
50
|
+
f"Unable to parse Azure Container Registry URI: {self.uri}"
|
51
|
+
)
|
52
|
+
self.registry_name = match.group(1)
|
53
|
+
self.repo_name = match.group(2)
|
54
|
+
else:
|
55
|
+
if any(x is None for x in (registry_name, repo_name)):
|
56
|
+
raise LaunchError(
|
57
|
+
"Please specify both a registry name and repo name or a registry URI."
|
58
|
+
)
|
59
|
+
self.registry_name = registry_name
|
60
|
+
self.repo_name = repo_name
|
61
|
+
self.uri = f"{self.registry_name}.azurecr.io/{self.repo_name}"
|
62
|
+
|
63
|
+
@classmethod
|
64
|
+
def from_config(
|
65
|
+
cls,
|
66
|
+
config: dict,
|
67
|
+
) -> "AzureContainerRegistry":
|
68
|
+
"""Create an AzureContainerRegistry from a config dict.
|
69
|
+
|
70
|
+
Args:
|
71
|
+
config (dict): The config dict.
|
72
|
+
environment (AbstractEnvironment): The environment to use.
|
73
|
+
verify (bool, optional): Whether to verify the registry. Defaults to True.
|
74
|
+
|
75
|
+
Returns:
|
76
|
+
AzureContainerRegistry: The registry.
|
77
|
+
|
78
|
+
Raises:
|
79
|
+
LaunchError: If the config is invalid.
|
80
|
+
"""
|
81
|
+
uri = config.get("uri")
|
82
|
+
if uri is None:
|
83
|
+
raise LaunchError(
|
84
|
+
"Please specify a registry name to use under the registry.uri."
|
85
|
+
)
|
86
|
+
return cls(
|
87
|
+
uri=uri,
|
88
|
+
)
|
89
|
+
|
90
|
+
async def get_username_password(self) -> Tuple[str, str]:
|
91
|
+
"""Get username and password for container registry."""
|
92
|
+
raise NotImplementedError
|
93
|
+
|
94
|
+
async def check_image_exists(self, image_uri: str) -> bool:
|
95
|
+
"""Check if image exists in container registry.
|
96
|
+
|
97
|
+
Args:
|
98
|
+
image_uri (str): Image URI to check.
|
99
|
+
|
100
|
+
Returns:
|
101
|
+
bool: True if image exists, False otherwise.
|
102
|
+
"""
|
103
|
+
match = re.match(AZURE_CONTAINER_REGISTRY_URI_REGEX, image_uri)
|
104
|
+
if match is None:
|
105
|
+
raise LaunchError(
|
106
|
+
f"Unable to parse Azure Container Registry URI: {image_uri}"
|
107
|
+
)
|
108
|
+
registry = match.group(1)
|
109
|
+
repository = match.group(2)
|
110
|
+
tag = match.group(3)
|
111
|
+
credential = AzureEnvironment.get_credentials()
|
112
|
+
client = ContainerRegistryClient(f"https://{registry}.azurecr.io", credential)
|
113
|
+
try:
|
114
|
+
client.get_manifest_properties(repository, tag)
|
115
|
+
return True
|
116
|
+
except ResourceNotFoundError:
|
117
|
+
return False
|
118
|
+
except Exception as e:
|
119
|
+
raise LaunchError(
|
120
|
+
f"Unable to check if image exists in Azure Container Registry: {e}"
|
121
|
+
) from e
|
122
|
+
|
123
|
+
async def get_repo_uri(self) -> str:
|
124
|
+
return f"{self.registry_name}.azurecr.io/{self.repo_name}"
|
@@ -0,0 +1,192 @@
|
|
1
|
+
"""Implementation of Elastic Container Registry class for wandb launch."""
|
2
|
+
|
3
|
+
import base64
|
4
|
+
import logging
|
5
|
+
from typing import Dict, Optional, Tuple
|
6
|
+
|
7
|
+
from wandb.sdk.launch.errors import LaunchError
|
8
|
+
from wandb.sdk.launch.registry.abstract import AbstractRegistry
|
9
|
+
from wandb.sdk.launch.utils import (
|
10
|
+
ELASTIC_CONTAINER_REGISTRY_URI_REGEX,
|
11
|
+
event_loop_thread_exec,
|
12
|
+
)
|
13
|
+
from wandb.util import get_module
|
14
|
+
|
15
|
+
_logger = logging.getLogger(__name__)
|
16
|
+
|
17
|
+
botocore = get_module( # noqa: F811
|
18
|
+
"botocore",
|
19
|
+
required="The boto3 package is required to use launch with AWS. Please install it with `pip install wandb[launch]`.",
|
20
|
+
)
|
21
|
+
boto3 = get_module( # noqa: F811
|
22
|
+
"boto3",
|
23
|
+
required="The boto3 package is required to use launch with AWS. Please install it with `pip install wandb[launch]`.",
|
24
|
+
)
|
25
|
+
|
26
|
+
|
27
|
+
class ElasticContainerRegistry(AbstractRegistry):
|
28
|
+
"""Elastic Container Registry class."""
|
29
|
+
|
30
|
+
def __init__(
|
31
|
+
self,
|
32
|
+
uri: Optional[str] = None,
|
33
|
+
account_id: Optional[str] = None,
|
34
|
+
region: Optional[str] = None,
|
35
|
+
repo_name: Optional[str] = None,
|
36
|
+
) -> None:
|
37
|
+
"""Initialize the Elastic Container Registry.
|
38
|
+
|
39
|
+
Arguments:
|
40
|
+
uri: The uri of the repository.
|
41
|
+
account_id: The AWS account id.
|
42
|
+
region: The AWS region of the container registry.
|
43
|
+
repository: The name of the repository.
|
44
|
+
|
45
|
+
Raises:
|
46
|
+
LaunchError: If there is an error initializing the Elastic Container Registry helper.
|
47
|
+
"""
|
48
|
+
if uri:
|
49
|
+
self.uri = uri
|
50
|
+
if any([account_id, region, repo_name]):
|
51
|
+
raise LaunchError(
|
52
|
+
"Could not create ElasticContainerRegistry from config. Either 'uri' or "
|
53
|
+
"'account_id', 'region', and 'repo_name' are required."
|
54
|
+
)
|
55
|
+
match = ELASTIC_CONTAINER_REGISTRY_URI_REGEX.match(
|
56
|
+
self.uri,
|
57
|
+
)
|
58
|
+
if not match:
|
59
|
+
raise LaunchError(
|
60
|
+
f"Could not create ElasticContainerRegistry from config. The uri "
|
61
|
+
f"{self.uri} is invalid."
|
62
|
+
)
|
63
|
+
self.account_id = match.group("account")
|
64
|
+
self.region = match.group("region")
|
65
|
+
self.repo_name = match.group("repository")
|
66
|
+
else:
|
67
|
+
if not all([account_id, region, repo_name]):
|
68
|
+
raise LaunchError(
|
69
|
+
"Could not create ElasticContainerRegistry from config. Either 'uri' or "
|
70
|
+
"'account_id', 'region', and 'repo_name' are required."
|
71
|
+
)
|
72
|
+
self.account_id = account_id
|
73
|
+
self.region = region
|
74
|
+
self.repo_name = repo_name
|
75
|
+
self.uri = f"{self.account_id}.dkr.ecr.{self.region}.amazonaws.com/{self.repo_name}"
|
76
|
+
if self.account_id is None:
|
77
|
+
raise LaunchError(
|
78
|
+
"Could not create ElasticContainerRegistry from config. Either 'uri' or "
|
79
|
+
"'account_id' is required."
|
80
|
+
)
|
81
|
+
if self.region is None:
|
82
|
+
raise LaunchError(
|
83
|
+
"Could not create ElasticContainerRegistry from config. Either 'uri' or "
|
84
|
+
"'region' is required."
|
85
|
+
)
|
86
|
+
if self.repo_name is None:
|
87
|
+
raise LaunchError(
|
88
|
+
"Could not create ElasticContainerRegistry from config. Either 'uri' or "
|
89
|
+
"'repository' is required."
|
90
|
+
)
|
91
|
+
|
92
|
+
@classmethod
|
93
|
+
def from_config(
|
94
|
+
cls,
|
95
|
+
config: Dict[str, str],
|
96
|
+
) -> "ElasticContainerRegistry":
|
97
|
+
"""Create an Elastic Container Registry from a config.
|
98
|
+
|
99
|
+
Arguments:
|
100
|
+
config (dict): The config.
|
101
|
+
|
102
|
+
Returns:
|
103
|
+
ElasticContainerRegistry: The Elastic Container Registry.
|
104
|
+
"""
|
105
|
+
# TODO: Replace this with pydantic.
|
106
|
+
acceptable_keys = {
|
107
|
+
"uri",
|
108
|
+
"type",
|
109
|
+
"account_id",
|
110
|
+
"region",
|
111
|
+
"repo_name",
|
112
|
+
}
|
113
|
+
unsupported_keys = set(config.keys()) - acceptable_keys
|
114
|
+
if unsupported_keys:
|
115
|
+
raise LaunchError(
|
116
|
+
f"The Elastic Container Registry config contains unsupported keys: "
|
117
|
+
f"{unsupported_keys}. Please remove these keys. The acceptable "
|
118
|
+
f"keys are: {acceptable_keys}."
|
119
|
+
)
|
120
|
+
return cls(
|
121
|
+
uri=config.get("uri"),
|
122
|
+
account_id=config.get("account_id"),
|
123
|
+
region=config.get("region"),
|
124
|
+
repo_name=config.get("repository"),
|
125
|
+
)
|
126
|
+
|
127
|
+
async def get_username_password(self) -> Tuple[str, str]:
|
128
|
+
"""Get the username and password for the registry.
|
129
|
+
|
130
|
+
Returns:
|
131
|
+
(str, str): The username and password.
|
132
|
+
|
133
|
+
Raises:
|
134
|
+
RegistryError: If there is an error getting the username and password.
|
135
|
+
"""
|
136
|
+
_logger.debug("Getting username and password for Elastic Container Registry.")
|
137
|
+
try:
|
138
|
+
session = boto3.Session(region_name=self.region)
|
139
|
+
client = await event_loop_thread_exec(session.client)("ecr")
|
140
|
+
response = await event_loop_thread_exec(client.get_authorization_token)()
|
141
|
+
username, password = base64.standard_b64decode(
|
142
|
+
response["authorizationData"][0]["authorizationToken"]
|
143
|
+
).split(b":")
|
144
|
+
return username.decode("utf-8"), password.decode("utf-8")
|
145
|
+
|
146
|
+
except botocore.exceptions.ClientError as e:
|
147
|
+
code = e.response["Error"]["Code"]
|
148
|
+
msg = e.response["Error"]["Message"]
|
149
|
+
# TODO: Log the code and the message here?
|
150
|
+
raise LaunchError(f"Error getting username and password: {code} {msg}")
|
151
|
+
|
152
|
+
async def get_repo_uri(self) -> str:
|
153
|
+
"""Get the uri of the repository.
|
154
|
+
|
155
|
+
Returns:
|
156
|
+
str: The uri of the repository.
|
157
|
+
"""
|
158
|
+
return f"{self.account_id}.dkr.ecr.{self.region}.amazonaws.com/{self.repo_name}"
|
159
|
+
|
160
|
+
async def check_image_exists(self, image_uri: str) -> bool:
|
161
|
+
"""Check if the image tag exists.
|
162
|
+
|
163
|
+
Arguments:
|
164
|
+
image_uri (str): The full image_uri.
|
165
|
+
|
166
|
+
Returns:
|
167
|
+
bool: True if the image tag exists.
|
168
|
+
"""
|
169
|
+
if ":" not in image_uri:
|
170
|
+
tag = image_uri
|
171
|
+
else:
|
172
|
+
uri, tag = image_uri.split(":")
|
173
|
+
repo_uri = await self.get_repo_uri()
|
174
|
+
if uri != repo_uri:
|
175
|
+
raise LaunchError(
|
176
|
+
f"Image uri {image_uri} does not match Elastic Container Registry uri {repo_uri}."
|
177
|
+
)
|
178
|
+
_logger.debug(f"Checking if image tag {tag} exists in repository {self.uri}")
|
179
|
+
try:
|
180
|
+
session = boto3.Session(region_name=self.region)
|
181
|
+
client = await event_loop_thread_exec(session.client)("ecr")
|
182
|
+
response = await event_loop_thread_exec(client.describe_images)(
|
183
|
+
repositoryName=self.repo_name, imageIds=[{"imageTag": tag}]
|
184
|
+
)
|
185
|
+
return len(response["imageDetails"]) > 0
|
186
|
+
|
187
|
+
except botocore.exceptions.ClientError as e:
|
188
|
+
code = e.response["Error"]["Code"]
|
189
|
+
if code == "ImageNotFoundException":
|
190
|
+
return False
|
191
|
+
msg = e.response["Error"]["Message"]
|
192
|
+
raise LaunchError(f"Error checking if image tag exists: {code} {msg}")
|