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,566 @@
|
|
1
|
+
"""Convert launch arguments into a runnable wandb launch script.
|
2
|
+
|
3
|
+
Arguments can come from a launch spec or call to wandb launch.
|
4
|
+
"""
|
5
|
+
|
6
|
+
import enum
|
7
|
+
import json
|
8
|
+
import logging
|
9
|
+
import os
|
10
|
+
import shutil
|
11
|
+
import tempfile
|
12
|
+
from copy import deepcopy
|
13
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, cast
|
14
|
+
|
15
|
+
from six.moves import shlex_quote
|
16
|
+
|
17
|
+
import wandb
|
18
|
+
from wandb.apis.internal import Api
|
19
|
+
from wandb.errors import CommError
|
20
|
+
from wandb.sdk.launch.utils import get_entrypoint_file
|
21
|
+
from wandb.sdk.lib.runid import generate_id
|
22
|
+
|
23
|
+
from .errors import LaunchError
|
24
|
+
from .utils import LOG_PREFIX, recursive_macro_sub
|
25
|
+
|
26
|
+
if TYPE_CHECKING:
|
27
|
+
from wandb.sdk.artifacts.artifact import Artifact
|
28
|
+
|
29
|
+
_logger = logging.getLogger(__name__)
|
30
|
+
|
31
|
+
|
32
|
+
# need to make user root for sagemaker, so users have access to /opt/ml directories
|
33
|
+
# that let users create artifacts and access input data
|
34
|
+
RESOURCE_UID_MAP = {"local": 1000, "sagemaker": 0}
|
35
|
+
IMAGE_TAG_MAX_LENGTH = 32
|
36
|
+
|
37
|
+
|
38
|
+
class LaunchSource(enum.IntEnum):
|
39
|
+
"""Enumeration of possible sources for a launch project.
|
40
|
+
|
41
|
+
Attributes:
|
42
|
+
DOCKER: Source is a Docker image. This can happen if a user runs
|
43
|
+
`wandb launch -d <docker-image>`.
|
44
|
+
JOB: Source is a job. This is standard case.
|
45
|
+
SCHEDULER: Source is a wandb sweep scheduler command.
|
46
|
+
"""
|
47
|
+
|
48
|
+
DOCKER: int = 1
|
49
|
+
JOB: int = 2
|
50
|
+
SCHEDULER: int = 3
|
51
|
+
|
52
|
+
|
53
|
+
class LaunchProject:
|
54
|
+
"""A launch project specification.
|
55
|
+
|
56
|
+
The LaunchProject is initialized from a raw launch spec an internal API
|
57
|
+
object. The project encapsulates logic for taking a launch spec and converting
|
58
|
+
it into the executable code.
|
59
|
+
|
60
|
+
The LaunchProject needs to ultimately produce a full container spec for
|
61
|
+
execution in docker, k8s, sagemaker, or vertex. This container spec includes:
|
62
|
+
- container image uri
|
63
|
+
- environment variables for configuring wandb etc.
|
64
|
+
- entrypoint command and arguments
|
65
|
+
- additional arguments specific to the target resource (e.g. instance type, node selector)
|
66
|
+
|
67
|
+
This class is stateful and certain methods can only be called after
|
68
|
+
`LaunchProject.fetch_and_validate_project()` has been called.
|
69
|
+
|
70
|
+
Notes on the entrypoint:
|
71
|
+
- The entrypoint is the command that will be run inside the container.
|
72
|
+
- The LaunchProject stores two entrypoints
|
73
|
+
- The job entrypoint is the entrypoint specified in the job's config.
|
74
|
+
- The override entrypoint is the entrypoint specified in the launch spec.
|
75
|
+
- The override entrypoint takes precedence over the job entrypoint.
|
76
|
+
"""
|
77
|
+
|
78
|
+
# This init is way to long, and there are too many attributes on this sucker.
|
79
|
+
def __init__(
|
80
|
+
self,
|
81
|
+
uri: Optional[str],
|
82
|
+
job: Optional[str],
|
83
|
+
api: Api,
|
84
|
+
launch_spec: Dict[str, Any],
|
85
|
+
target_entity: str,
|
86
|
+
target_project: str,
|
87
|
+
name: Optional[str],
|
88
|
+
docker_config: Dict[str, Any],
|
89
|
+
git_info: Dict[str, str],
|
90
|
+
overrides: Dict[str, Any],
|
91
|
+
resource: str,
|
92
|
+
resource_args: Dict[str, Any],
|
93
|
+
run_id: Optional[str],
|
94
|
+
sweep_id: Optional[str] = None,
|
95
|
+
):
|
96
|
+
self.uri = uri
|
97
|
+
self.job = job
|
98
|
+
if job is not None:
|
99
|
+
wandb.termlog(f"{LOG_PREFIX}Launching job: {job}")
|
100
|
+
self._job_artifact: Optional[Artifact] = None
|
101
|
+
self.api = api
|
102
|
+
self.launch_spec = launch_spec
|
103
|
+
self.target_entity = target_entity
|
104
|
+
self.target_project = target_project.lower()
|
105
|
+
self.name = name # TODO: replace with run_id
|
106
|
+
# the builder key can be passed in through the resource args
|
107
|
+
# but these resource_args are then passed to the appropriate
|
108
|
+
# runner, so we need to pop the builder key out
|
109
|
+
resource_args_copy = deepcopy(resource_args)
|
110
|
+
resource_args_build = resource_args_copy.get(resource, {}).pop("builder", {})
|
111
|
+
self.resource = resource
|
112
|
+
self.resource_args = resource_args_copy
|
113
|
+
self.sweep_id = sweep_id
|
114
|
+
self.author = launch_spec.get("author")
|
115
|
+
self.python_version: Optional[str] = launch_spec.get("python_version")
|
116
|
+
self._job_dockerfile: Optional[str] = None
|
117
|
+
self._job_build_context: Optional[str] = None
|
118
|
+
self._job_base_image: Optional[str] = None
|
119
|
+
self.accelerator_base_image: Optional[str] = resource_args_build.get(
|
120
|
+
"accelerator", {}
|
121
|
+
).get("base_image") or resource_args_build.get("cuda", {}).get("base_image")
|
122
|
+
self.docker_image: Optional[str] = docker_config.get(
|
123
|
+
"docker_image"
|
124
|
+
) or launch_spec.get("image_uri")
|
125
|
+
self.docker_user_id = docker_config.get("user_id", 1000)
|
126
|
+
self._entry_point: Optional[EntryPoint] = (
|
127
|
+
None # todo: keep multiple entrypoint support?
|
128
|
+
)
|
129
|
+
self.init_overrides(overrides)
|
130
|
+
self.init_source()
|
131
|
+
self.init_git(git_info)
|
132
|
+
self.deps_type: Optional[str] = None
|
133
|
+
self._runtime: Optional[str] = None
|
134
|
+
self.run_id = run_id or generate_id()
|
135
|
+
self._queue_name: Optional[str] = None
|
136
|
+
self._queue_entity: Optional[str] = None
|
137
|
+
self._run_queue_item_id: Optional[str] = None
|
138
|
+
|
139
|
+
def init_source(self) -> None:
|
140
|
+
if self.docker_image is not None:
|
141
|
+
self.source = LaunchSource.DOCKER
|
142
|
+
self.project_dir = None
|
143
|
+
elif self.job is not None:
|
144
|
+
self.source = LaunchSource.JOB
|
145
|
+
self.project_dir = tempfile.mkdtemp()
|
146
|
+
elif self.uri and self.uri.startswith("placeholder"):
|
147
|
+
self.source = LaunchSource.SCHEDULER
|
148
|
+
self.project_dir = os.getcwd()
|
149
|
+
self._entry_point = self.override_entrypoint
|
150
|
+
|
151
|
+
def change_project_dir(self, new_dir: str) -> None:
|
152
|
+
"""Change the project directory to a new directory."""
|
153
|
+
# Copy the contents of the old project dir to the new project dir.
|
154
|
+
old_dir = self.project_dir
|
155
|
+
if old_dir is not None:
|
156
|
+
shutil.copytree(
|
157
|
+
old_dir,
|
158
|
+
new_dir,
|
159
|
+
symlinks=True,
|
160
|
+
dirs_exist_ok=True,
|
161
|
+
ignore=shutil.ignore_patterns("fsmonitor--daemon.ipc", ".git"),
|
162
|
+
)
|
163
|
+
shutil.rmtree(old_dir)
|
164
|
+
self.project_dir = new_dir
|
165
|
+
|
166
|
+
def init_git(self, git_info: Dict[str, str]) -> None:
|
167
|
+
self.git_version = git_info.get("version")
|
168
|
+
self.git_repo = git_info.get("repo")
|
169
|
+
|
170
|
+
def init_overrides(self, overrides: Dict[str, Any]) -> None:
|
171
|
+
"""Initialize override attributes for a launch project."""
|
172
|
+
self.overrides = overrides
|
173
|
+
self.override_args: List[str] = overrides.get("args", [])
|
174
|
+
self.override_config: Dict[str, Any] = overrides.get("run_config", {})
|
175
|
+
self.override_artifacts: Dict[str, Any] = overrides.get("artifacts", {})
|
176
|
+
self.override_files: Dict[str, Any] = overrides.get("files", {})
|
177
|
+
self.override_entrypoint: Optional[EntryPoint] = None
|
178
|
+
self.override_dockerfile: Optional[str] = overrides.get("dockerfile")
|
179
|
+
override_entrypoint = overrides.get("entry_point")
|
180
|
+
if override_entrypoint:
|
181
|
+
_logger.info("Adding override entry point")
|
182
|
+
self.override_entrypoint = EntryPoint(
|
183
|
+
name=get_entrypoint_file(override_entrypoint),
|
184
|
+
command=override_entrypoint,
|
185
|
+
)
|
186
|
+
|
187
|
+
def __repr__(self) -> str:
|
188
|
+
"""String representation of LaunchProject."""
|
189
|
+
if self.source == LaunchSource.JOB:
|
190
|
+
return f"{self.job}"
|
191
|
+
return f"{self.uri}"
|
192
|
+
|
193
|
+
@classmethod
|
194
|
+
def from_spec(cls, launch_spec: Dict[str, Any], api: Api) -> "LaunchProject":
|
195
|
+
"""Constructs a LaunchProject instance using a launch spec.
|
196
|
+
|
197
|
+
Arguments:
|
198
|
+
launch_spec: Dictionary representation of launch spec
|
199
|
+
api: Instance of wandb.apis.internal Api
|
200
|
+
|
201
|
+
Returns:
|
202
|
+
An initialized `LaunchProject` object
|
203
|
+
"""
|
204
|
+
name: Optional[str] = None
|
205
|
+
if launch_spec.get("name"):
|
206
|
+
name = launch_spec["name"]
|
207
|
+
return LaunchProject(
|
208
|
+
launch_spec.get("uri"),
|
209
|
+
launch_spec.get("job"),
|
210
|
+
api,
|
211
|
+
launch_spec,
|
212
|
+
launch_spec["entity"],
|
213
|
+
launch_spec["project"],
|
214
|
+
name,
|
215
|
+
launch_spec.get("docker", {}),
|
216
|
+
launch_spec.get("git", {}),
|
217
|
+
launch_spec.get("overrides", {}),
|
218
|
+
launch_spec.get("resource", None),
|
219
|
+
launch_spec.get("resource_args", {}),
|
220
|
+
launch_spec.get("run_id", None),
|
221
|
+
launch_spec.get("sweep_id", {}),
|
222
|
+
)
|
223
|
+
|
224
|
+
@property
|
225
|
+
def job_dockerfile(self) -> Optional[str]:
|
226
|
+
return self._job_dockerfile
|
227
|
+
|
228
|
+
@property
|
229
|
+
def job_build_context(self) -> Optional[str]:
|
230
|
+
return self._job_build_context
|
231
|
+
|
232
|
+
@property
|
233
|
+
def job_base_image(self) -> Optional[str]:
|
234
|
+
return self._job_base_image
|
235
|
+
|
236
|
+
def set_job_dockerfile(self, dockerfile: str) -> None:
|
237
|
+
self._job_dockerfile = dockerfile
|
238
|
+
|
239
|
+
def set_job_build_context(self, build_context: str) -> None:
|
240
|
+
self._job_build_context = build_context
|
241
|
+
|
242
|
+
def set_job_base_image(self, base_image: str) -> None:
|
243
|
+
self._job_base_image = base_image
|
244
|
+
|
245
|
+
@property
|
246
|
+
def image_name(self) -> str:
|
247
|
+
if self.job_base_image is not None:
|
248
|
+
return self.job_base_image
|
249
|
+
if self.docker_image is not None:
|
250
|
+
return self.docker_image
|
251
|
+
elif self.uri is not None:
|
252
|
+
cleaned_uri = self.uri.replace("https://", "/")
|
253
|
+
first_sep = cleaned_uri.find("/")
|
254
|
+
shortened_uri = cleaned_uri[first_sep:]
|
255
|
+
return wandb.util.make_docker_image_name_safe(shortened_uri)
|
256
|
+
else:
|
257
|
+
# this will always pass since one of these 3 is required
|
258
|
+
assert self.job is not None
|
259
|
+
return wandb.util.make_docker_image_name_safe(self.job.split(":")[0])
|
260
|
+
|
261
|
+
@property
|
262
|
+
def queue_name(self) -> Optional[str]:
|
263
|
+
return self._queue_name
|
264
|
+
|
265
|
+
@queue_name.setter
|
266
|
+
def queue_name(self, value: str) -> None:
|
267
|
+
self._queue_name = value
|
268
|
+
|
269
|
+
@property
|
270
|
+
def queue_entity(self) -> Optional[str]:
|
271
|
+
return self._queue_entity
|
272
|
+
|
273
|
+
@queue_entity.setter
|
274
|
+
def queue_entity(self, value: str) -> None:
|
275
|
+
self._queue_entity = value
|
276
|
+
|
277
|
+
@property
|
278
|
+
def run_queue_item_id(self) -> Optional[str]:
|
279
|
+
return self._run_queue_item_id
|
280
|
+
|
281
|
+
@run_queue_item_id.setter
|
282
|
+
def run_queue_item_id(self, value: str) -> None:
|
283
|
+
self._run_queue_item_id = value
|
284
|
+
|
285
|
+
def fill_macros(self, image: str) -> Dict[str, Any]:
|
286
|
+
"""Substitute values for macros in resource arguments.
|
287
|
+
|
288
|
+
Certain macros can be used in resource args. These macros allow the
|
289
|
+
user to set resource args dynamically in the context of the
|
290
|
+
run being launched. The macros are given in the ${macro} format. The
|
291
|
+
following macros are currently supported:
|
292
|
+
|
293
|
+
${project_name} - the name of the project the run is being launched to.
|
294
|
+
${entity_name} - the owner of the project the run being launched to.
|
295
|
+
${run_id} - the id of the run being launched.
|
296
|
+
${run_name} - the name of the run that is launching.
|
297
|
+
${image_uri} - the URI of the container image for this run.
|
298
|
+
|
299
|
+
Additionally, you may use ${<ENV-VAR-NAME>} to refer to the value of any
|
300
|
+
environment variables that you plan to set in the environment of any
|
301
|
+
agents that will receive these resource args.
|
302
|
+
|
303
|
+
Calling this method will overwrite the contents of self.resource_args
|
304
|
+
with the substituted values.
|
305
|
+
|
306
|
+
Args:
|
307
|
+
image (str): The image name to fill in for ${wandb-image}.
|
308
|
+
|
309
|
+
Returns:
|
310
|
+
Dict[str, Any]: The resource args with all macros filled in.
|
311
|
+
"""
|
312
|
+
update_dict = {
|
313
|
+
"project_name": self.target_project,
|
314
|
+
"entity_name": self.target_entity,
|
315
|
+
"run_id": self.run_id,
|
316
|
+
"run_name": self.name,
|
317
|
+
"image_uri": image,
|
318
|
+
"author": self.author,
|
319
|
+
}
|
320
|
+
update_dict.update(os.environ)
|
321
|
+
result = recursive_macro_sub(self.resource_args, update_dict)
|
322
|
+
# recursive_macro_sub given a dict returns a dict with the same keys
|
323
|
+
# but with other input types behaves differently. The cast is for mypy.
|
324
|
+
return cast(Dict[str, Any], result)
|
325
|
+
|
326
|
+
def build_required(self) -> bool:
|
327
|
+
"""Checks the source to see if a build is required."""
|
328
|
+
if self.job_base_image is not None:
|
329
|
+
return False
|
330
|
+
if self.source != LaunchSource.JOB:
|
331
|
+
return True
|
332
|
+
return False
|
333
|
+
|
334
|
+
@property
|
335
|
+
def docker_image(self) -> Optional[str]:
|
336
|
+
"""Returns the Docker image associated with this LaunchProject.
|
337
|
+
|
338
|
+
This will only be set if an image_uri is being run outside a job.
|
339
|
+
|
340
|
+
Returns:
|
341
|
+
Optional[str]: The Docker image or None if not specified.
|
342
|
+
"""
|
343
|
+
if self._docker_image:
|
344
|
+
return self._docker_image
|
345
|
+
return None
|
346
|
+
|
347
|
+
@docker_image.setter
|
348
|
+
def docker_image(self, value: str) -> None:
|
349
|
+
"""Sets the Docker image for the project.
|
350
|
+
|
351
|
+
Args:
|
352
|
+
value (str): The Docker image to set.
|
353
|
+
|
354
|
+
Returns:
|
355
|
+
None
|
356
|
+
"""
|
357
|
+
self._docker_image = value
|
358
|
+
self._ensure_not_docker_image_and_local_process()
|
359
|
+
|
360
|
+
def get_job_entry_point(self) -> Optional["EntryPoint"]:
|
361
|
+
"""Returns the job entrypoint for the project."""
|
362
|
+
# assuming project only has 1 entry point, pull that out
|
363
|
+
# tmp fn until we figure out if we want to support multiple entry points or not
|
364
|
+
if not self._entry_point:
|
365
|
+
if not self.docker_image and not self.job_base_image:
|
366
|
+
raise LaunchError(
|
367
|
+
"Project must have at least one entry point unless docker image is specified."
|
368
|
+
)
|
369
|
+
return None
|
370
|
+
return self._entry_point
|
371
|
+
|
372
|
+
def set_job_entry_point(self, command: List[str]) -> "EntryPoint":
|
373
|
+
"""Set job entrypoint for the project."""
|
374
|
+
assert (
|
375
|
+
self._entry_point is None
|
376
|
+
), "Cannot set entry point twice. Use LaunchProject.override_entrypoint"
|
377
|
+
new_entrypoint = EntryPoint(name=command[-1], command=command)
|
378
|
+
self._entry_point = new_entrypoint
|
379
|
+
return new_entrypoint
|
380
|
+
|
381
|
+
def fetch_and_validate_project(self) -> None:
|
382
|
+
"""Fetches a project into a local directory, adds the config values to the directory, and validates the first entrypoint for the project.
|
383
|
+
|
384
|
+
Arguments:
|
385
|
+
launch_project: LaunchProject to fetch and validate.
|
386
|
+
api: Instance of wandb.apis.internal Api
|
387
|
+
|
388
|
+
Returns:
|
389
|
+
A validated `LaunchProject` object.
|
390
|
+
|
391
|
+
"""
|
392
|
+
if self.source == LaunchSource.DOCKER:
|
393
|
+
return
|
394
|
+
elif self.source == LaunchSource.JOB:
|
395
|
+
self._fetch_job()
|
396
|
+
assert self.project_dir is not None
|
397
|
+
|
398
|
+
# Let's make sure we document this very clearly.
|
399
|
+
def get_image_source_string(self) -> str:
|
400
|
+
"""Returns a unique string identifying the source of an image."""
|
401
|
+
if self.source == LaunchSource.JOB:
|
402
|
+
assert self._job_artifact is not None
|
403
|
+
return f"{self._job_artifact.name}:v{self._job_artifact.version}"
|
404
|
+
elif self.source == LaunchSource.DOCKER:
|
405
|
+
assert isinstance(self.docker_image, str)
|
406
|
+
return self.docker_image
|
407
|
+
else:
|
408
|
+
raise LaunchError(
|
409
|
+
"Unknown source type when determining image source string"
|
410
|
+
)
|
411
|
+
|
412
|
+
def _ensure_not_docker_image_and_local_process(self) -> None:
|
413
|
+
"""Ensure that docker image is not specified with local-process resource runner.
|
414
|
+
|
415
|
+
Raises:
|
416
|
+
LaunchError: If docker image is specified with local-process resource runner.
|
417
|
+
"""
|
418
|
+
if self.docker_image is not None and self.resource == "local-process":
|
419
|
+
raise LaunchError(
|
420
|
+
"Cannot specify docker image with local-process resource runner"
|
421
|
+
)
|
422
|
+
|
423
|
+
def _fetch_job(self) -> None:
|
424
|
+
"""Fetches the job details from the public API and configures the launch project.
|
425
|
+
|
426
|
+
Raises:
|
427
|
+
LaunchError: If there is an error accessing the job.
|
428
|
+
"""
|
429
|
+
public_api = wandb.apis.public.Api()
|
430
|
+
job_dir = tempfile.mkdtemp()
|
431
|
+
try:
|
432
|
+
job = public_api.job(self.job, path=job_dir)
|
433
|
+
except CommError as e:
|
434
|
+
msg = e.message
|
435
|
+
raise LaunchError(
|
436
|
+
f"Error accessing job {self.job}: {msg} on {public_api.settings.get('base_url')}"
|
437
|
+
)
|
438
|
+
job.configure_launch_project(self) # Why is this a method of the job?
|
439
|
+
self._job_artifact = job._job_artifact
|
440
|
+
|
441
|
+
def get_env_vars_dict(self, api: Api, max_env_length: int) -> Dict[str, str]:
|
442
|
+
"""Generate environment variables for the project.
|
443
|
+
|
444
|
+
Arguments:
|
445
|
+
launch_project: LaunchProject to generate environment variables for.
|
446
|
+
|
447
|
+
Returns:
|
448
|
+
Dictionary of environment variables.
|
449
|
+
"""
|
450
|
+
env_vars = {}
|
451
|
+
env_vars["WANDB_BASE_URL"] = api.settings("base_url")
|
452
|
+
override_api_key = self.launch_spec.get("_wandb_api_key")
|
453
|
+
env_vars["WANDB_API_KEY"] = override_api_key or api.api_key
|
454
|
+
if self.target_project:
|
455
|
+
env_vars["WANDB_PROJECT"] = self.target_project
|
456
|
+
env_vars["WANDB_ENTITY"] = self.target_entity
|
457
|
+
env_vars["WANDB_LAUNCH"] = "True"
|
458
|
+
env_vars["WANDB_RUN_ID"] = self.run_id
|
459
|
+
if self.docker_image:
|
460
|
+
env_vars["WANDB_DOCKER"] = self.docker_image
|
461
|
+
if self.name is not None:
|
462
|
+
env_vars["WANDB_NAME"] = self.name
|
463
|
+
if "author" in self.launch_spec and not override_api_key:
|
464
|
+
env_vars["WANDB_USERNAME"] = self.launch_spec["author"]
|
465
|
+
if self.sweep_id:
|
466
|
+
env_vars["WANDB_SWEEP_ID"] = self.sweep_id
|
467
|
+
if self.launch_spec.get("_resume_count", 0) > 0:
|
468
|
+
env_vars["WANDB_RESUME"] = "allow"
|
469
|
+
if self.queue_name:
|
470
|
+
env_vars[wandb.env.LAUNCH_QUEUE_NAME] = self.queue_name
|
471
|
+
if self.queue_entity:
|
472
|
+
env_vars[wandb.env.LAUNCH_QUEUE_ENTITY] = self.queue_entity
|
473
|
+
if self.run_queue_item_id:
|
474
|
+
env_vars[wandb.env.LAUNCH_TRACE_ID] = self.run_queue_item_id
|
475
|
+
|
476
|
+
_inject_wandb_config_env_vars(self.override_config, env_vars, max_env_length)
|
477
|
+
_inject_file_overrides_env_vars(self.override_files, env_vars, max_env_length)
|
478
|
+
|
479
|
+
artifacts = {}
|
480
|
+
# if we're spinning up a launch process from a job
|
481
|
+
# we should tell the run to use that artifact
|
482
|
+
if self.job:
|
483
|
+
artifacts = {wandb.util.LAUNCH_JOB_ARTIFACT_SLOT_NAME: self.job}
|
484
|
+
env_vars["WANDB_ARTIFACTS"] = json.dumps(
|
485
|
+
{**artifacts, **self.override_artifacts}
|
486
|
+
)
|
487
|
+
return env_vars
|
488
|
+
|
489
|
+
def parse_existing_requirements(self) -> str:
|
490
|
+
import pkg_resources
|
491
|
+
|
492
|
+
requirements_line = ""
|
493
|
+
assert self.project_dir is not None
|
494
|
+
base_requirements = os.path.join(self.project_dir, "requirements.txt")
|
495
|
+
if os.path.exists(base_requirements):
|
496
|
+
include_only = set()
|
497
|
+
with open(base_requirements) as f:
|
498
|
+
iter = pkg_resources.parse_requirements(f)
|
499
|
+
while True:
|
500
|
+
try:
|
501
|
+
pkg = next(iter)
|
502
|
+
if hasattr(pkg, "name"):
|
503
|
+
name = pkg.name.lower()
|
504
|
+
else:
|
505
|
+
name = str(pkg)
|
506
|
+
include_only.add(shlex_quote(name))
|
507
|
+
except StopIteration:
|
508
|
+
break
|
509
|
+
# Different versions of pkg_resources throw different errors
|
510
|
+
# just catch them all and ignore packages we can't parse
|
511
|
+
except Exception as e:
|
512
|
+
_logger.warn(f"Unable to parse requirements.txt: {e}")
|
513
|
+
continue
|
514
|
+
requirements_line += "WANDB_ONLY_INCLUDE={} ".format(",".join(include_only))
|
515
|
+
if "wandb" not in requirements_line:
|
516
|
+
wandb.termwarn(f"{LOG_PREFIX}wandb is not present in requirements.txt.")
|
517
|
+
return requirements_line
|
518
|
+
|
519
|
+
|
520
|
+
class EntryPoint:
|
521
|
+
"""An entry point into a wandb launch specification."""
|
522
|
+
|
523
|
+
def __init__(self, name: Optional[str], command: List[str]):
|
524
|
+
self.name = name
|
525
|
+
self.command = command
|
526
|
+
|
527
|
+
def update_entrypoint_path(self, new_path: str) -> None:
|
528
|
+
"""Updates the entrypoint path to a new path."""
|
529
|
+
if len(self.command) == 2 and (
|
530
|
+
self.command[0].startswith("python") or self.command[0] == "bash"
|
531
|
+
):
|
532
|
+
self.command[1] = new_path
|
533
|
+
|
534
|
+
|
535
|
+
def _inject_wandb_config_env_vars(
|
536
|
+
config: Dict[str, Any], env_dict: Dict[str, Any], maximum_env_length: int
|
537
|
+
) -> None:
|
538
|
+
str_config = json.dumps(config)
|
539
|
+
if len(str_config) <= maximum_env_length:
|
540
|
+
env_dict["WANDB_CONFIG"] = str_config
|
541
|
+
return
|
542
|
+
|
543
|
+
chunks = [
|
544
|
+
str_config[i : i + maximum_env_length]
|
545
|
+
for i in range(0, len(str_config), maximum_env_length)
|
546
|
+
]
|
547
|
+
config_chunks_dict = {f"WANDB_CONFIG_{i}": chunk for i, chunk in enumerate(chunks)}
|
548
|
+
env_dict.update(config_chunks_dict)
|
549
|
+
|
550
|
+
|
551
|
+
def _inject_file_overrides_env_vars(
|
552
|
+
overrides: Dict[str, Any], env_dict: Dict[str, Any], maximum_env_length: int
|
553
|
+
) -> None:
|
554
|
+
str_overrides = json.dumps(overrides)
|
555
|
+
if len(str_overrides) <= maximum_env_length:
|
556
|
+
env_dict["WANDB_LAUNCH_FILE_OVERRIDES"] = str_overrides
|
557
|
+
return
|
558
|
+
|
559
|
+
chunks = [
|
560
|
+
str_overrides[i : i + maximum_env_length]
|
561
|
+
for i in range(0, len(str_overrides), maximum_env_length)
|
562
|
+
]
|
563
|
+
overrides_chunks_dict = {
|
564
|
+
f"WANDB_LAUNCH_FILE_OVERRIDES_{i}": chunk for i, chunk in enumerate(chunks)
|
565
|
+
}
|
566
|
+
env_dict.update(overrides_chunks_dict)
|