wandb 0.22.1__py3-none-win_arm64.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 +97 -0
- wandb/__init__.py +248 -0
- wandb/__init__.pyi +1230 -0
- wandb/__main__.py +3 -0
- wandb/_analytics.py +65 -0
- wandb/_iterutils.py +73 -0
- wandb/_pydantic/__init__.py +30 -0
- wandb/_pydantic/base.py +108 -0
- wandb/_pydantic/field_types.py +29 -0
- wandb/_pydantic/utils.py +80 -0
- wandb/_pydantic/v1_compat.py +301 -0
- wandb/_strutils.py +40 -0
- wandb/agents/__init__.py +0 -0
- wandb/agents/pyagent.py +386 -0
- wandb/analytics/__init__.py +3 -0
- wandb/analytics/sentry.py +267 -0
- wandb/apis/__init__.py +50 -0
- wandb/apis/attrs.py +52 -0
- wandb/apis/importers/__init__.py +1 -0
- wandb/apis/importers/internals/internal.py +375 -0
- wandb/apis/importers/internals/protocols.py +103 -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 +1608 -0
- wandb/apis/internal.py +241 -0
- wandb/apis/normalize.py +83 -0
- wandb/apis/paginator.py +138 -0
- wandb/apis/public/__init__.py +78 -0
- wandb/apis/public/api.py +2513 -0
- wandb/apis/public/artifacts.py +1050 -0
- wandb/apis/public/automations.py +86 -0
- wandb/apis/public/const.py +6 -0
- wandb/apis/public/files.py +411 -0
- wandb/apis/public/history.py +203 -0
- wandb/apis/public/integrations.py +203 -0
- wandb/apis/public/jobs.py +744 -0
- wandb/apis/public/projects.py +278 -0
- wandb/apis/public/query_generator.py +179 -0
- wandb/apis/public/registries/__init__.py +7 -0
- wandb/apis/public/registries/_freezable_list.py +176 -0
- wandb/apis/public/registries/_utils.py +139 -0
- wandb/apis/public/registries/registries_search.py +353 -0
- wandb/apis/public/registries/registry.py +370 -0
- wandb/apis/public/reports.py +597 -0
- wandb/apis/public/runs.py +1438 -0
- wandb/apis/public/sweeps.py +441 -0
- wandb/apis/public/teams.py +237 -0
- wandb/apis/public/users.py +179 -0
- wandb/apis/public/utils.py +211 -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/automations/__init__.py +73 -0
- wandb/automations/_filters/__init__.py +40 -0
- wandb/automations/_filters/expressions.py +182 -0
- wandb/automations/_filters/operators.py +259 -0
- wandb/automations/_filters/run_metrics.py +330 -0
- wandb/automations/_generated/__init__.py +104 -0
- wandb/automations/_generated/create_automation.py +17 -0
- wandb/automations/_generated/create_generic_webhook_integration.py +37 -0
- wandb/automations/_generated/delete_automation.py +15 -0
- wandb/automations/_generated/enums.py +35 -0
- wandb/automations/_generated/fragments.py +293 -0
- wandb/automations/_generated/generic_webhook_integrations_by_entity.py +22 -0
- wandb/automations/_generated/get_automations.py +24 -0
- wandb/automations/_generated/get_automations_by_entity.py +26 -0
- wandb/automations/_generated/input_types.py +104 -0
- wandb/automations/_generated/integrations_by_entity.py +22 -0
- wandb/automations/_generated/operations.py +647 -0
- wandb/automations/_generated/slack_integrations_by_entity.py +22 -0
- wandb/automations/_generated/update_automation.py +17 -0
- wandb/automations/_utils.py +235 -0
- wandb/automations/_validators.py +185 -0
- wandb/automations/actions.py +220 -0
- wandb/automations/automations.py +85 -0
- wandb/automations/events.py +284 -0
- wandb/automations/integrations.py +45 -0
- wandb/automations/scopes.py +78 -0
- wandb/beta/workflows.py +324 -0
- wandb/bin/gpu_stats.exe +0 -0
- wandb/bin/wandb-core +0 -0
- wandb/cli/__init__.py +0 -0
- wandb/cli/beta.py +93 -0
- wandb/cli/beta_sync.py +224 -0
- wandb/cli/cli.py +2883 -0
- wandb/data_types.py +66 -0
- wandb/docker/__init__.py +290 -0
- wandb/docker/names.py +40 -0
- wandb/docker/wandb-entrypoint.sh +33 -0
- wandb/env.py +535 -0
- wandb/errors/__init__.py +17 -0
- wandb/errors/errors.py +40 -0
- wandb/errors/links.py +73 -0
- wandb/errors/term.py +415 -0
- wandb/errors/util.py +57 -0
- wandb/errors/warnings.py +2 -0
- wandb/filesync/__init__.py +0 -0
- wandb/filesync/dir_watcher.py +404 -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 +287 -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 +182 -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 +881 -0
- wandb/integration/diffusers/resolvers/utils.py +102 -0
- wandb/integration/dspy/__init__.py +5 -0
- wandb/integration/dspy/dspy.py +422 -0
- wandb/integration/fastai/__init__.py +243 -0
- wandb/integration/gym/__init__.py +98 -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 +129 -0
- wandb/integration/keras/callbacks/model_checkpoint.py +188 -0
- wandb/integration/keras/callbacks/tables_builder.py +228 -0
- wandb/integration/keras/keras.py +1086 -0
- wandb/integration/kfp/__init__.py +6 -0
- wandb/integration/kfp/helpers.py +28 -0
- wandb/integration/kfp/kfp_patch.py +335 -0
- wandb/integration/kfp/wandb_logging.py +182 -0
- wandb/integration/langchain/__init__.py +3 -0
- wandb/integration/langchain/wandb_tracer.py +49 -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 +763 -0
- wandb/integration/metaflow/__init__.py +9 -0
- wandb/integration/metaflow/data_pandas.py +74 -0
- wandb/integration/metaflow/data_pytorch.py +75 -0
- wandb/integration/metaflow/data_sklearn.py +76 -0
- wandb/integration/metaflow/errors.py +13 -0
- wandb/integration/metaflow/metaflow.py +327 -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 +291 -0
- wandb/integration/sacred/__init__.py +117 -0
- wandb/integration/sagemaker/__init__.py +14 -0
- wandb/integration/sagemaker/auth.py +29 -0
- wandb/integration/sagemaker/config.py +58 -0
- wandb/integration/sagemaker/files.py +2 -0
- wandb/integration/sagemaker/resources.py +63 -0
- wandb/integration/sb3/__init__.py +3 -0
- wandb/integration/sb3/sb3.py +147 -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 +184 -0
- wandb/integration/tensorboard/__init__.py +10 -0
- wandb/integration/tensorboard/log.py +351 -0
- wandb/integration/tensorboard/monkeypatch.py +186 -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 +215 -0
- wandb/integration/ultralytics/callback.py +528 -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/weave/__init__.py +6 -0
- wandb/integration/weave/interface.py +49 -0
- wandb/integration/weave/weave.py +118 -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 +538 -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 +176 -0
- wandb/old/summary.py +438 -0
- wandb/plot/__init__.py +30 -0
- wandb/plot/bar.py +71 -0
- wandb/plot/confusion_matrix.py +185 -0
- wandb/plot/custom_chart.py +147 -0
- wandb/plot/histogram.py +66 -0
- wandb/plot/line.py +75 -0
- wandb/plot/line_series.py +173 -0
- wandb/plot/pr_curve.py +186 -0
- wandb/plot/roc_curve.py +163 -0
- wandb/plot/scatter.py +66 -0
- wandb/plot/utils.py +184 -0
- wandb/plot/viz.py +41 -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 +1738 -0
- wandb/proto/v3/wandb_server_pb2.py +209 -0
- wandb/proto/v3/wandb_settings_pb2.py +122 -0
- wandb/proto/v3/wandb_sync_pb2.py +100 -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 +384 -0
- wandb/proto/v4/wandb_server_pb2.py +64 -0
- wandb/proto/v4/wandb_settings_pb2.py +47 -0
- wandb/proto/v4/wandb_sync_pb2.py +42 -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 +385 -0
- wandb/proto/v5/wandb_server_pb2.py +65 -0
- wandb/proto/v5/wandb_settings_pb2.py +48 -0
- wandb/proto/v5/wandb_sync_pb2.py +43 -0
- wandb/proto/v5/wandb_telemetry_pb2.py +42 -0
- wandb/proto/v6/wandb_base_pb2.py +41 -0
- wandb/proto/v6/wandb_internal_pb2.py +395 -0
- wandb/proto/v6/wandb_server_pb2.py +75 -0
- wandb/proto/v6/wandb_settings_pb2.py +58 -0
- wandb/proto/v6/wandb_sync_pb2.py +53 -0
- wandb/proto/v6/wandb_telemetry_pb2.py +52 -0
- wandb/proto/wandb_base_pb2.py +12 -0
- wandb/proto/wandb_deprecated.py +59 -0
- wandb/proto/wandb_generate_deprecated.py +30 -0
- wandb/proto/wandb_generate_proto.py +50 -0
- wandb/proto/wandb_internal_pb2.py +18 -0
- wandb/proto/wandb_server_pb2.py +12 -0
- wandb/proto/wandb_settings_pb2.py +12 -0
- wandb/proto/wandb_sync_pb2.py +12 -0
- wandb/proto/wandb_telemetry_pb2.py +12 -0
- wandb/py.typed +0 -0
- wandb/sdk/__init__.py +37 -0
- wandb/sdk/artifacts/__init__.py +0 -0
- wandb/sdk/artifacts/_factories.py +22 -0
- wandb/sdk/artifacts/_generated/__init__.py +208 -0
- wandb/sdk/artifacts/_generated/add_aliases.py +21 -0
- wandb/sdk/artifacts/_generated/artifact_by_id.py +17 -0
- wandb/sdk/artifacts/_generated/artifact_by_name.py +22 -0
- wandb/sdk/artifacts/_generated/artifact_collection_membership_file_urls.py +43 -0
- wandb/sdk/artifacts/_generated/artifact_collection_membership_files.py +43 -0
- wandb/sdk/artifacts/_generated/artifact_created_by.py +47 -0
- wandb/sdk/artifacts/_generated/artifact_file_urls.py +22 -0
- wandb/sdk/artifacts/_generated/artifact_type.py +31 -0
- wandb/sdk/artifacts/_generated/artifact_used_by.py +43 -0
- wandb/sdk/artifacts/_generated/artifact_version_files.py +36 -0
- wandb/sdk/artifacts/_generated/artifact_via_membership_by_name.py +26 -0
- wandb/sdk/artifacts/_generated/create_artifact_collection_tag_assignments.py +36 -0
- wandb/sdk/artifacts/_generated/delete_aliases.py +21 -0
- wandb/sdk/artifacts/_generated/delete_artifact.py +28 -0
- wandb/sdk/artifacts/_generated/delete_artifact_collection_tag_assignments.py +25 -0
- wandb/sdk/artifacts/_generated/delete_artifact_portfolio.py +35 -0
- wandb/sdk/artifacts/_generated/delete_artifact_sequence.py +35 -0
- wandb/sdk/artifacts/_generated/enums.py +22 -0
- wandb/sdk/artifacts/_generated/fetch_artifact_manifest.py +38 -0
- wandb/sdk/artifacts/_generated/fetch_linked_artifacts.py +67 -0
- wandb/sdk/artifacts/_generated/fetch_registries.py +32 -0
- wandb/sdk/artifacts/_generated/fragments.py +524 -0
- wandb/sdk/artifacts/_generated/input_types.py +46 -0
- wandb/sdk/artifacts/_generated/link_artifact.py +27 -0
- wandb/sdk/artifacts/_generated/move_artifact_collection.py +35 -0
- wandb/sdk/artifacts/_generated/operations.py +1253 -0
- wandb/sdk/artifacts/_generated/project_artifact_collection.py +101 -0
- wandb/sdk/artifacts/_generated/project_artifact_collections.py +33 -0
- wandb/sdk/artifacts/_generated/project_artifact_type.py +24 -0
- wandb/sdk/artifacts/_generated/project_artifact_types.py +24 -0
- wandb/sdk/artifacts/_generated/project_artifacts.py +42 -0
- wandb/sdk/artifacts/_generated/registry_collections.py +34 -0
- wandb/sdk/artifacts/_generated/registry_versions.py +34 -0
- wandb/sdk/artifacts/_generated/run_input_artifacts.py +31 -0
- wandb/sdk/artifacts/_generated/run_output_artifacts.py +31 -0
- wandb/sdk/artifacts/_generated/type_info.py +19 -0
- wandb/sdk/artifacts/_generated/unlink_artifact.py +25 -0
- wandb/sdk/artifacts/_generated/update_artifact.py +26 -0
- wandb/sdk/artifacts/_generated/update_artifact_portfolio.py +35 -0
- wandb/sdk/artifacts/_generated/update_artifact_sequence.py +35 -0
- wandb/sdk/artifacts/_gqlutils.py +47 -0
- wandb/sdk/artifacts/_internal_artifact.py +54 -0
- wandb/sdk/artifacts/_models/__init__.py +4 -0
- wandb/sdk/artifacts/_models/base_model.py +20 -0
- wandb/sdk/artifacts/_validators.py +338 -0
- wandb/sdk/artifacts/artifact.py +2683 -0
- wandb/sdk/artifacts/artifact_download_logger.py +45 -0
- wandb/sdk/artifacts/artifact_file_cache.py +256 -0
- wandb/sdk/artifacts/artifact_instance_cache.py +17 -0
- wandb/sdk/artifacts/artifact_manifest.py +76 -0
- wandb/sdk/artifacts/artifact_manifest_entry.py +315 -0
- wandb/sdk/artifacts/artifact_manifests/__init__.py +0 -0
- wandb/sdk/artifacts/artifact_manifests/artifact_manifest_v1.py +94 -0
- wandb/sdk/artifacts/artifact_saver.py +277 -0
- wandb/sdk/artifacts/artifact_state.py +13 -0
- wandb/sdk/artifacts/artifact_ttl.py +9 -0
- wandb/sdk/artifacts/exceptions.py +72 -0
- wandb/sdk/artifacts/staging.py +27 -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 +214 -0
- wandb/sdk/artifacts/storage_handlers/gcs_handler.py +224 -0
- wandb/sdk/artifacts/storage_handlers/http_handler.py +112 -0
- wandb/sdk/artifacts/storage_handlers/local_file_handler.py +142 -0
- wandb/sdk/artifacts/storage_handlers/multi_handler.py +56 -0
- wandb/sdk/artifacts/storage_handlers/s3_handler.py +340 -0
- wandb/sdk/artifacts/storage_handlers/tracking_handler.py +68 -0
- wandb/sdk/artifacts/storage_handlers/wb_artifact_handler.py +131 -0
- wandb/sdk/artifacts/storage_handlers/wb_local_artifact_handler.py +74 -0
- wandb/sdk/artifacts/storage_layout.py +8 -0
- wandb/sdk/artifacts/storage_policies/__init__.py +4 -0
- wandb/sdk/artifacts/storage_policies/_factories.py +63 -0
- wandb/sdk/artifacts/storage_policies/register.py +1 -0
- wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +525 -0
- wandb/sdk/artifacts/storage_policy.py +75 -0
- wandb/sdk/backend/__init__.py +0 -0
- wandb/sdk/backend/backend.py +57 -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 +208 -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 +339 -0
- wandb/sdk/data_types/base_types/wb_value.py +295 -0
- wandb/sdk/data_types/bokeh.py +91 -0
- wandb/sdk/data_types/graph.py +439 -0
- wandb/sdk/data_types/helper_types/__init__.py +0 -0
- wandb/sdk/data_types/helper_types/bounding_boxes_2d.py +327 -0
- wandb/sdk/data_types/helper_types/classes.py +159 -0
- wandb/sdk/data_types/helper_types/image_mask.py +251 -0
- wandb/sdk/data_types/histogram.py +107 -0
- wandb/sdk/data_types/html.py +165 -0
- wandb/sdk/data_types/image.py +985 -0
- wandb/sdk/data_types/molecule.py +250 -0
- wandb/sdk/data_types/object_3d.py +495 -0
- wandb/sdk/data_types/plotly.py +95 -0
- wandb/sdk/data_types/saved_model.py +435 -0
- wandb/sdk/data_types/table.py +1468 -0
- wandb/sdk/data_types/table_decorators.py +108 -0
- wandb/sdk/data_types/trace_tree.py +440 -0
- wandb/sdk/data_types/utils.py +260 -0
- wandb/sdk/data_types/video.py +303 -0
- wandb/sdk/integration_utils/__init__.py +0 -0
- wandb/sdk/integration_utils/auto_logging.py +232 -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 +1093 -0
- wandb/sdk/interface/interface_queue.py +50 -0
- wandb/sdk/interface/interface_shared.py +473 -0
- wandb/sdk/interface/interface_sock.py +55 -0
- wandb/sdk/interface/summary_record.py +67 -0
- wandb/sdk/internal/__init__.py +0 -0
- wandb/sdk/internal/_generated/__init__.py +5 -0
- wandb/sdk/internal/_generated/enums.py +4 -0
- wandb/sdk/internal/_generated/input_types.py +4 -0
- wandb/sdk/internal/_generated/operations.py +15 -0
- wandb/sdk/internal/_generated/server_features_query.py +27 -0
- wandb/sdk/internal/context.py +89 -0
- wandb/sdk/internal/datastore.py +293 -0
- wandb/sdk/internal/file_pusher.py +177 -0
- wandb/sdk/internal/file_stream.py +686 -0
- wandb/sdk/internal/handler.py +854 -0
- wandb/sdk/internal/incremental_table_util.py +53 -0
- wandb/sdk/internal/internal_api.py +4723 -0
- wandb/sdk/internal/job_builder.py +639 -0
- wandb/sdk/internal/profiler.py +79 -0
- wandb/sdk/internal/progress.py +77 -0
- wandb/sdk/internal/run.py +27 -0
- wandb/sdk/internal/sample.py +70 -0
- wandb/sdk/internal/sender.py +1692 -0
- wandb/sdk/internal/sender_config.py +203 -0
- wandb/sdk/internal/settings_static.py +40 -0
- wandb/sdk/internal/tb_watcher.py +519 -0
- wandb/sdk/internal/thread_local_settings.py +18 -0
- wandb/sdk/launch/__init__.py +15 -0
- wandb/sdk/launch/_launch.py +331 -0
- wandb/sdk/launch/_launch_add.py +255 -0
- wandb/sdk/launch/_project_spec.py +565 -0
- wandb/sdk/launch/agent/__init__.py +5 -0
- wandb/sdk/launch/agent/agent.py +931 -0
- wandb/sdk/launch/agent/config.py +296 -0
- wandb/sdk/launch/agent/job_status_tracker.py +55 -0
- wandb/sdk/launch/agent/run_queue_item_file_saver.py +39 -0
- wandb/sdk/launch/builder/__init__.py +0 -0
- wandb/sdk/launch/builder/abstract.py +156 -0
- wandb/sdk/launch/builder/build.py +296 -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 +541 -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 +334 -0
- wandb/sdk/launch/environment/local_environment.py +65 -0
- wandb/sdk/launch/errors.py +13 -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 +70 -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 +65 -0
- wandb/sdk/launch/runner/__init__.py +0 -0
- wandb/sdk/launch/runner/abstract.py +185 -0
- wandb/sdk/launch/runner/kubernetes_monitor.py +473 -0
- wandb/sdk/launch/runner/kubernetes_runner.py +1290 -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 +424 -0
- wandb/sdk/launch/runner/vertex_runner.py +225 -0
- wandb/sdk/launch/sweeps/__init__.py +37 -0
- wandb/sdk/launch/sweeps/scheduler.py +739 -0
- wandb/sdk/launch/sweeps/scheduler_sweep.py +90 -0
- wandb/sdk/launch/sweeps/utils.py +324 -0
- wandb/sdk/launch/utils.py +827 -0
- wandb/sdk/launch/wandb_reference.py +138 -0
- wandb/sdk/lib/__init__.py +5 -0
- wandb/sdk/lib/apikey.py +334 -0
- wandb/sdk/lib/asyncio_compat.py +278 -0
- wandb/sdk/lib/asyncio_manager.py +252 -0
- wandb/sdk/lib/capped_dict.py +26 -0
- wandb/sdk/lib/config_util.py +101 -0
- wandb/sdk/lib/console_capture.py +219 -0
- wandb/sdk/lib/credentials.py +141 -0
- wandb/sdk/lib/deprecate.py +27 -0
- wandb/sdk/lib/disabled.py +30 -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 +165 -0
- wandb/sdk/lib/gitlib.py +240 -0
- wandb/sdk/lib/gql_request.py +76 -0
- wandb/sdk/lib/handler_util.py +21 -0
- wandb/sdk/lib/hashutil.py +106 -0
- wandb/sdk/lib/import_hooks.py +275 -0
- wandb/sdk/lib/interrupt.py +37 -0
- wandb/sdk/lib/ipython.py +126 -0
- wandb/sdk/lib/json_util.py +75 -0
- wandb/sdk/lib/lazyloader.py +63 -0
- wandb/sdk/lib/module.py +72 -0
- wandb/sdk/lib/paths.py +108 -0
- wandb/sdk/lib/preinit.py +42 -0
- wandb/sdk/lib/printer.py +567 -0
- wandb/sdk/lib/printer_asyncio.py +48 -0
- wandb/sdk/lib/progress.py +325 -0
- wandb/sdk/lib/proto_util.py +90 -0
- wandb/sdk/lib/redirect.py +876 -0
- wandb/sdk/lib/retry.py +395 -0
- wandb/sdk/lib/run_moment.py +82 -0
- wandb/sdk/lib/runid.py +12 -0
- wandb/sdk/lib/server.py +58 -0
- wandb/sdk/lib/service/ipc_support.py +13 -0
- wandb/sdk/lib/service/service_client.py +102 -0
- wandb/sdk/lib/service/service_connection.py +238 -0
- wandb/sdk/lib/service/service_port_file.py +105 -0
- wandb/sdk/lib/service/service_process.py +111 -0
- wandb/sdk/lib/service/service_token.py +181 -0
- wandb/sdk/lib/sparkline.py +44 -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/wb_logging.py +161 -0
- wandb/sdk/mailbox/__init__.py +23 -0
- wandb/sdk/mailbox/mailbox.py +143 -0
- wandb/sdk/mailbox/mailbox_handle.py +134 -0
- wandb/sdk/mailbox/response_handle.py +99 -0
- wandb/sdk/mailbox/wait_with_progress.py +100 -0
- wandb/sdk/projects/_generated/__init__.py +26 -0
- wandb/sdk/projects/_generated/delete_project.py +22 -0
- wandb/sdk/projects/_generated/enums.py +4 -0
- wandb/sdk/projects/_generated/fetch_registry.py +22 -0
- wandb/sdk/projects/_generated/fragments.py +41 -0
- wandb/sdk/projects/_generated/input_types.py +13 -0
- wandb/sdk/projects/_generated/operations.py +88 -0
- wandb/sdk/projects/_generated/rename_project.py +27 -0
- wandb/sdk/projects/_generated/upsert_registry_project.py +27 -0
- wandb/sdk/verify/__init__.py +0 -0
- wandb/sdk/verify/verify.py +555 -0
- wandb/sdk/wandb_alerts.py +12 -0
- wandb/sdk/wandb_config.py +323 -0
- wandb/sdk/wandb_helper.py +54 -0
- wandb/sdk/wandb_init.py +1601 -0
- wandb/sdk/wandb_login.py +358 -0
- wandb/sdk/wandb_metric.py +112 -0
- wandb/sdk/wandb_require.py +88 -0
- wandb/sdk/wandb_require_helpers.py +44 -0
- wandb/sdk/wandb_run.py +4102 -0
- wandb/sdk/wandb_settings.py +2197 -0
- wandb/sdk/wandb_setup.py +560 -0
- wandb/sdk/wandb_summary.py +150 -0
- wandb/sdk/wandb_sweep.py +120 -0
- wandb/sdk/wandb_sync.py +71 -0
- wandb/sdk/wandb_watch.py +146 -0
- wandb/sklearn.py +35 -0
- wandb/sync/__init__.py +3 -0
- wandb/sync/sync.py +457 -0
- wandb/trigger.py +29 -0
- wandb/util.py +2040 -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/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 +611 -0
- wandb/wandb_controller.py +719 -0
- wandb/wandb_run.py +8 -0
- wandb-0.22.1.dist-info/METADATA +223 -0
- wandb-0.22.1.dist-info/RECORD +919 -0
- wandb-0.22.1.dist-info/WHEEL +4 -0
- wandb-0.22.1.dist-info/entry_points.txt +3 -0
- wandb-0.22.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,1093 @@
|
|
1
|
+
"""Interface base class - Used to send messages to the internal process.
|
2
|
+
|
3
|
+
InterfaceBase: The abstract class
|
4
|
+
InterfaceShared: Common routines for socket and queue based implementations
|
5
|
+
InterfaceQueue: Use multiprocessing queues to send and receive messages
|
6
|
+
InterfaceSock: Use socket to send and receive messages
|
7
|
+
"""
|
8
|
+
|
9
|
+
import gzip
|
10
|
+
import logging
|
11
|
+
import time
|
12
|
+
from abc import abstractmethod
|
13
|
+
from pathlib import Path
|
14
|
+
from secrets import token_hex
|
15
|
+
from typing import (
|
16
|
+
TYPE_CHECKING,
|
17
|
+
Any,
|
18
|
+
Dict,
|
19
|
+
Iterable,
|
20
|
+
List,
|
21
|
+
Literal,
|
22
|
+
NewType,
|
23
|
+
Optional,
|
24
|
+
Tuple,
|
25
|
+
TypedDict,
|
26
|
+
Union,
|
27
|
+
)
|
28
|
+
|
29
|
+
from wandb import termwarn
|
30
|
+
from wandb.proto import wandb_internal_pb2 as pb
|
31
|
+
from wandb.proto import wandb_telemetry_pb2 as tpb
|
32
|
+
from wandb.sdk.artifacts.artifact import Artifact
|
33
|
+
from wandb.sdk.artifacts.artifact_manifest import ArtifactManifest
|
34
|
+
from wandb.sdk.artifacts.staging import get_staging_dir
|
35
|
+
from wandb.sdk.lib import json_util as json
|
36
|
+
from wandb.sdk.mailbox import HandleAbandonedError, MailboxHandle
|
37
|
+
from wandb.util import (
|
38
|
+
WandBJSONEncoderOld,
|
39
|
+
get_h5_typename,
|
40
|
+
json_dumps_safer,
|
41
|
+
json_dumps_safer_history,
|
42
|
+
json_friendly,
|
43
|
+
json_friendly_val,
|
44
|
+
maybe_compress_summary,
|
45
|
+
)
|
46
|
+
|
47
|
+
from ..data_types.utils import history_dict_to_json, val_to_json
|
48
|
+
from . import summary_record as sr
|
49
|
+
|
50
|
+
MANIFEST_FILE_SIZE_THRESHOLD = 100_000
|
51
|
+
|
52
|
+
GlobStr = NewType("GlobStr", str)
|
53
|
+
|
54
|
+
|
55
|
+
PolicyName = Literal["now", "live", "end"]
|
56
|
+
|
57
|
+
|
58
|
+
class FilesDict(TypedDict):
|
59
|
+
files: Iterable[Tuple[GlobStr, PolicyName]]
|
60
|
+
|
61
|
+
|
62
|
+
if TYPE_CHECKING:
|
63
|
+
from ..wandb_run import Run
|
64
|
+
|
65
|
+
|
66
|
+
logger = logging.getLogger("wandb")
|
67
|
+
|
68
|
+
|
69
|
+
def file_policy_to_enum(policy: "PolicyName") -> "pb.FilesItem.PolicyType.V":
|
70
|
+
if policy == "now":
|
71
|
+
enum = pb.FilesItem.PolicyType.NOW
|
72
|
+
elif policy == "end":
|
73
|
+
enum = pb.FilesItem.PolicyType.END
|
74
|
+
elif policy == "live":
|
75
|
+
enum = pb.FilesItem.PolicyType.LIVE
|
76
|
+
return enum
|
77
|
+
|
78
|
+
|
79
|
+
def file_enum_to_policy(enum: "pb.FilesItem.PolicyType.V") -> "PolicyName":
|
80
|
+
if enum == pb.FilesItem.PolicyType.NOW:
|
81
|
+
policy: PolicyName = "now"
|
82
|
+
elif enum == pb.FilesItem.PolicyType.END:
|
83
|
+
policy = "end"
|
84
|
+
elif enum == pb.FilesItem.PolicyType.LIVE:
|
85
|
+
policy = "live"
|
86
|
+
return policy
|
87
|
+
|
88
|
+
|
89
|
+
class InterfaceBase:
|
90
|
+
"""Methods for sending different types of Records to the service.
|
91
|
+
|
92
|
+
None of the methods may be called from an asyncio context other than
|
93
|
+
deliver_async().
|
94
|
+
"""
|
95
|
+
|
96
|
+
_drop: bool
|
97
|
+
|
98
|
+
def __init__(self) -> None:
|
99
|
+
self._drop = False
|
100
|
+
|
101
|
+
@abstractmethod
|
102
|
+
async def deliver_async(
|
103
|
+
self,
|
104
|
+
record: pb.Record,
|
105
|
+
) -> MailboxHandle[pb.Result]:
|
106
|
+
"""Send a record and create a handle to wait for the response.
|
107
|
+
|
108
|
+
The synchronous publish and deliver methods on this class cannot be
|
109
|
+
called in the asyncio thread because they block. Instead of having
|
110
|
+
an async copy of every method, this is a general method for sending
|
111
|
+
any kind of record in the asyncio thread.
|
112
|
+
|
113
|
+
Args:
|
114
|
+
record: The record to send. This method takes ownership of the
|
115
|
+
record and it must not be used afterward.
|
116
|
+
|
117
|
+
Returns:
|
118
|
+
A handle to wait for a response to the record.
|
119
|
+
"""
|
120
|
+
raise NotImplementedError
|
121
|
+
|
122
|
+
def publish_header(self) -> None:
|
123
|
+
header = pb.HeaderRecord()
|
124
|
+
self._publish_header(header)
|
125
|
+
|
126
|
+
@abstractmethod
|
127
|
+
def _publish_header(self, header: pb.HeaderRecord) -> None:
|
128
|
+
raise NotImplementedError
|
129
|
+
|
130
|
+
def deliver_status(self) -> MailboxHandle[pb.Result]:
|
131
|
+
return self._deliver_status(pb.StatusRequest())
|
132
|
+
|
133
|
+
@abstractmethod
|
134
|
+
def _deliver_status(
|
135
|
+
self,
|
136
|
+
status: pb.StatusRequest,
|
137
|
+
) -> MailboxHandle[pb.Result]:
|
138
|
+
raise NotImplementedError
|
139
|
+
|
140
|
+
def _make_config(
|
141
|
+
self,
|
142
|
+
data: Optional[dict] = None,
|
143
|
+
key: Optional[Union[Tuple[str, ...], str]] = None,
|
144
|
+
val: Optional[Any] = None,
|
145
|
+
obj: Optional[pb.ConfigRecord] = None,
|
146
|
+
) -> pb.ConfigRecord:
|
147
|
+
config = obj or pb.ConfigRecord()
|
148
|
+
if data:
|
149
|
+
for k, v in data.items():
|
150
|
+
update = config.update.add()
|
151
|
+
update.key = k
|
152
|
+
update.value_json = json_dumps_safer(json_friendly(v)[0])
|
153
|
+
if key:
|
154
|
+
update = config.update.add()
|
155
|
+
if isinstance(key, tuple):
|
156
|
+
for k in key:
|
157
|
+
update.nested_key.append(k)
|
158
|
+
else:
|
159
|
+
update.key = key
|
160
|
+
update.value_json = json_dumps_safer(json_friendly(val)[0])
|
161
|
+
return config
|
162
|
+
|
163
|
+
def _make_run(self, run: "Run") -> pb.RunRecord: # noqa: C901
|
164
|
+
proto_run = pb.RunRecord()
|
165
|
+
if run._settings.entity is not None:
|
166
|
+
proto_run.entity = run._settings.entity
|
167
|
+
if run._settings.project is not None:
|
168
|
+
proto_run.project = run._settings.project
|
169
|
+
if run._settings.run_group is not None:
|
170
|
+
proto_run.run_group = run._settings.run_group
|
171
|
+
if run._settings.run_job_type is not None:
|
172
|
+
proto_run.job_type = run._settings.run_job_type
|
173
|
+
if run._settings.run_id is not None:
|
174
|
+
proto_run.run_id = run._settings.run_id
|
175
|
+
if run._settings.run_name is not None:
|
176
|
+
proto_run.display_name = run._settings.run_name
|
177
|
+
if run._settings.run_notes is not None:
|
178
|
+
proto_run.notes = run._settings.run_notes
|
179
|
+
if run._settings.run_tags is not None:
|
180
|
+
proto_run.tags.extend(run._settings.run_tags)
|
181
|
+
if run._start_time is not None:
|
182
|
+
proto_run.start_time.FromMicroseconds(int(run._start_time * 1e6))
|
183
|
+
if run._starting_step is not None:
|
184
|
+
proto_run.starting_step = run._starting_step
|
185
|
+
if run._settings.git_remote_url is not None:
|
186
|
+
proto_run.git.remote_url = run._settings.git_remote_url
|
187
|
+
if run._settings.git_commit is not None:
|
188
|
+
proto_run.git.commit = run._settings.git_commit
|
189
|
+
if run._settings.sweep_id is not None:
|
190
|
+
proto_run.sweep_id = run._settings.sweep_id
|
191
|
+
if run._settings.host:
|
192
|
+
proto_run.host = run._settings.host
|
193
|
+
if run._settings.resumed:
|
194
|
+
proto_run.resumed = run._settings.resumed
|
195
|
+
if run._settings.fork_from:
|
196
|
+
run_moment = run._settings.fork_from
|
197
|
+
proto_run.branch_point.run = run_moment.run
|
198
|
+
proto_run.branch_point.metric = run_moment.metric
|
199
|
+
proto_run.branch_point.value = run_moment.value
|
200
|
+
if run._settings.resume_from:
|
201
|
+
run_moment = run._settings.resume_from
|
202
|
+
proto_run.branch_point.run = run_moment.run
|
203
|
+
proto_run.branch_point.metric = run_moment.metric
|
204
|
+
proto_run.branch_point.value = run_moment.value
|
205
|
+
if run._forked:
|
206
|
+
proto_run.forked = run._forked
|
207
|
+
if run._config is not None:
|
208
|
+
config_dict = run._config._as_dict() # type: ignore
|
209
|
+
self._make_config(data=config_dict, obj=proto_run.config)
|
210
|
+
if run._telemetry_obj:
|
211
|
+
proto_run.telemetry.MergeFrom(run._telemetry_obj)
|
212
|
+
if run._start_runtime:
|
213
|
+
proto_run.runtime = run._start_runtime
|
214
|
+
return proto_run
|
215
|
+
|
216
|
+
def publish_run(self, run: "Run") -> None:
|
217
|
+
run_record = self._make_run(run)
|
218
|
+
self._publish_run(run_record)
|
219
|
+
|
220
|
+
@abstractmethod
|
221
|
+
def _publish_run(self, run: pb.RunRecord) -> None:
|
222
|
+
raise NotImplementedError
|
223
|
+
|
224
|
+
def publish_cancel(self, cancel_slot: str) -> None:
|
225
|
+
cancel = pb.CancelRequest(cancel_slot=cancel_slot)
|
226
|
+
self._publish_cancel(cancel)
|
227
|
+
|
228
|
+
@abstractmethod
|
229
|
+
def _publish_cancel(self, cancel: pb.CancelRequest) -> None:
|
230
|
+
raise NotImplementedError
|
231
|
+
|
232
|
+
def publish_config(
|
233
|
+
self,
|
234
|
+
data: Optional[dict] = None,
|
235
|
+
key: Optional[Union[Tuple[str, ...], str]] = None,
|
236
|
+
val: Optional[Any] = None,
|
237
|
+
) -> None:
|
238
|
+
cfg = self._make_config(data=data, key=key, val=val)
|
239
|
+
|
240
|
+
self._publish_config(cfg)
|
241
|
+
|
242
|
+
@abstractmethod
|
243
|
+
def _publish_config(self, cfg: pb.ConfigRecord) -> None:
|
244
|
+
raise NotImplementedError
|
245
|
+
|
246
|
+
@abstractmethod
|
247
|
+
def _publish_metric(self, metric: pb.MetricRecord) -> None:
|
248
|
+
raise NotImplementedError
|
249
|
+
|
250
|
+
def _make_summary_from_dict(self, summary_dict: dict) -> pb.SummaryRecord:
|
251
|
+
summary = pb.SummaryRecord()
|
252
|
+
for k, v in summary_dict.items():
|
253
|
+
update = summary.update.add()
|
254
|
+
update.key = k
|
255
|
+
update.value_json = json.dumps(v)
|
256
|
+
return summary
|
257
|
+
|
258
|
+
def _summary_encode(
|
259
|
+
self,
|
260
|
+
value: Any,
|
261
|
+
path_from_root: str,
|
262
|
+
run: "Run",
|
263
|
+
) -> dict:
|
264
|
+
"""Normalize, compress, and encode sub-objects for backend storage.
|
265
|
+
|
266
|
+
value: Object to encode.
|
267
|
+
path_from_root: `str` dot separated string from the top-level summary to the
|
268
|
+
current `value`.
|
269
|
+
|
270
|
+
Returns:
|
271
|
+
A new tree of dict's with large objects replaced with dictionaries
|
272
|
+
with "_type" entries that say which type the original data was.
|
273
|
+
"""
|
274
|
+
# Constructs a new `dict` tree in `json_value` that discards and/or
|
275
|
+
# encodes objects that aren't JSON serializable.
|
276
|
+
|
277
|
+
if isinstance(value, dict):
|
278
|
+
json_value = {}
|
279
|
+
for key, value in value.items(): # noqa: B020
|
280
|
+
json_value[key] = self._summary_encode(
|
281
|
+
value,
|
282
|
+
path_from_root + "." + key,
|
283
|
+
run=run,
|
284
|
+
)
|
285
|
+
return json_value
|
286
|
+
else:
|
287
|
+
friendly_value, converted = json_friendly(
|
288
|
+
val_to_json(run, path_from_root, value, namespace="summary")
|
289
|
+
)
|
290
|
+
json_value, compressed = maybe_compress_summary(
|
291
|
+
friendly_value, get_h5_typename(value)
|
292
|
+
)
|
293
|
+
if compressed:
|
294
|
+
# TODO(jhr): impleement me
|
295
|
+
pass
|
296
|
+
# self.write_h5(path_from_root, friendly_value)
|
297
|
+
|
298
|
+
return json_value
|
299
|
+
|
300
|
+
def _make_summary(
|
301
|
+
self,
|
302
|
+
summary_record: sr.SummaryRecord,
|
303
|
+
run: "Run",
|
304
|
+
) -> pb.SummaryRecord:
|
305
|
+
pb_summary_record = pb.SummaryRecord()
|
306
|
+
|
307
|
+
for item in summary_record.update:
|
308
|
+
pb_summary_item = pb_summary_record.update.add()
|
309
|
+
key_length = len(item.key)
|
310
|
+
|
311
|
+
assert key_length > 0
|
312
|
+
|
313
|
+
if key_length > 1:
|
314
|
+
pb_summary_item.nested_key.extend(item.key)
|
315
|
+
else:
|
316
|
+
pb_summary_item.key = item.key[0]
|
317
|
+
|
318
|
+
path_from_root = ".".join(item.key)
|
319
|
+
json_value = self._summary_encode(
|
320
|
+
item.value,
|
321
|
+
path_from_root,
|
322
|
+
run=run,
|
323
|
+
)
|
324
|
+
json_value, _ = json_friendly(json_value) # type: ignore
|
325
|
+
|
326
|
+
pb_summary_item.value_json = json.dumps(
|
327
|
+
json_value,
|
328
|
+
cls=WandBJSONEncoderOld,
|
329
|
+
)
|
330
|
+
|
331
|
+
for item in summary_record.remove:
|
332
|
+
pb_summary_item = pb_summary_record.remove.add()
|
333
|
+
key_length = len(item.key)
|
334
|
+
|
335
|
+
assert key_length > 0
|
336
|
+
|
337
|
+
if key_length > 1:
|
338
|
+
pb_summary_item.nested_key.extend(item.key)
|
339
|
+
else:
|
340
|
+
pb_summary_item.key = item.key[0]
|
341
|
+
|
342
|
+
return pb_summary_record
|
343
|
+
|
344
|
+
def publish_summary(
|
345
|
+
self,
|
346
|
+
run: "Run",
|
347
|
+
summary_record: sr.SummaryRecord,
|
348
|
+
) -> None:
|
349
|
+
pb_summary_record = self._make_summary(summary_record, run=run)
|
350
|
+
self._publish_summary(pb_summary_record)
|
351
|
+
|
352
|
+
@abstractmethod
|
353
|
+
def _publish_summary(self, summary: pb.SummaryRecord) -> None:
|
354
|
+
raise NotImplementedError
|
355
|
+
|
356
|
+
def _make_files(self, files_dict: "FilesDict") -> pb.FilesRecord:
|
357
|
+
files = pb.FilesRecord()
|
358
|
+
for path, policy in files_dict["files"]:
|
359
|
+
f = files.files.add()
|
360
|
+
f.path = path
|
361
|
+
f.policy = file_policy_to_enum(policy)
|
362
|
+
return files
|
363
|
+
|
364
|
+
def publish_files(self, files_dict: "FilesDict") -> None:
|
365
|
+
files = self._make_files(files_dict)
|
366
|
+
self._publish_files(files)
|
367
|
+
|
368
|
+
@abstractmethod
|
369
|
+
def _publish_files(self, files: pb.FilesRecord) -> None:
|
370
|
+
raise NotImplementedError
|
371
|
+
|
372
|
+
def publish_python_packages(self, working_set) -> None:
|
373
|
+
python_packages = pb.PythonPackagesRequest()
|
374
|
+
for pkg in working_set:
|
375
|
+
python_packages.package.add(name=pkg.key, version=pkg.version)
|
376
|
+
self._publish_python_packages(python_packages)
|
377
|
+
|
378
|
+
@abstractmethod
|
379
|
+
def _publish_python_packages(
|
380
|
+
self, python_packages: pb.PythonPackagesRequest
|
381
|
+
) -> None:
|
382
|
+
raise NotImplementedError
|
383
|
+
|
384
|
+
def _make_artifact(self, artifact: "Artifact") -> pb.ArtifactRecord:
|
385
|
+
proto_artifact = pb.ArtifactRecord()
|
386
|
+
proto_artifact.type = artifact.type
|
387
|
+
proto_artifact.name = artifact.name
|
388
|
+
proto_artifact.client_id = artifact._client_id
|
389
|
+
proto_artifact.sequence_client_id = artifact._sequence_client_id
|
390
|
+
proto_artifact.digest = artifact.digest
|
391
|
+
if artifact.distributed_id:
|
392
|
+
proto_artifact.distributed_id = artifact.distributed_id
|
393
|
+
if artifact.description:
|
394
|
+
proto_artifact.description = artifact.description
|
395
|
+
if artifact.metadata:
|
396
|
+
proto_artifact.metadata = json.dumps(json_friendly_val(artifact.metadata))
|
397
|
+
if artifact._base_id:
|
398
|
+
proto_artifact.base_id = artifact._base_id
|
399
|
+
|
400
|
+
ttl_duration_input = artifact._ttl_duration_seconds_to_gql()
|
401
|
+
if ttl_duration_input:
|
402
|
+
proto_artifact.ttl_duration_seconds = ttl_duration_input
|
403
|
+
proto_artifact.incremental_beta1 = artifact.incremental
|
404
|
+
self._make_artifact_manifest(artifact.manifest, obj=proto_artifact.manifest)
|
405
|
+
return proto_artifact
|
406
|
+
|
407
|
+
def _make_artifact_manifest(
|
408
|
+
self,
|
409
|
+
artifact_manifest: ArtifactManifest,
|
410
|
+
obj: Optional[pb.ArtifactManifest] = None,
|
411
|
+
) -> pb.ArtifactManifest:
|
412
|
+
proto_manifest = obj or pb.ArtifactManifest()
|
413
|
+
proto_manifest.version = artifact_manifest.version()
|
414
|
+
proto_manifest.storage_policy = artifact_manifest.storage_policy.name()
|
415
|
+
|
416
|
+
# Very large manifests need to be written to file to avoid protobuf size limits.
|
417
|
+
if len(artifact_manifest) > MANIFEST_FILE_SIZE_THRESHOLD:
|
418
|
+
path = self._write_artifact_manifest_file(artifact_manifest)
|
419
|
+
proto_manifest.manifest_file_path = path
|
420
|
+
return proto_manifest
|
421
|
+
|
422
|
+
# Set storage policy on storageLayout (always V2) and storageRegion, only allow coreweave-us on wandb.ai for now.
|
423
|
+
# NOTE: the decode logic is NewManifestFromProto in core/pkg/artifacts/manifest.go
|
424
|
+
# The creation logic is in artifacts/_factories.py make_storage_policy
|
425
|
+
for k, v in artifact_manifest.storage_policy.config().items() or {}.items():
|
426
|
+
cfg = proto_manifest.storage_policy_config.add()
|
427
|
+
cfg.key = k
|
428
|
+
# TODO: Why json.dumps when existing values are plain string? We want to send complex structure without defining the proto?
|
429
|
+
cfg.value_json = json.dumps(v)
|
430
|
+
|
431
|
+
for entry in sorted(artifact_manifest.entries.values(), key=lambda k: k.path):
|
432
|
+
proto_entry = proto_manifest.contents.add()
|
433
|
+
proto_entry.path = entry.path
|
434
|
+
proto_entry.digest = entry.digest
|
435
|
+
if entry.size:
|
436
|
+
proto_entry.size = entry.size
|
437
|
+
if entry.birth_artifact_id:
|
438
|
+
proto_entry.birth_artifact_id = entry.birth_artifact_id
|
439
|
+
if entry.ref:
|
440
|
+
proto_entry.ref = entry.ref
|
441
|
+
if entry.local_path:
|
442
|
+
proto_entry.local_path = entry.local_path
|
443
|
+
proto_entry.skip_cache = entry.skip_cache
|
444
|
+
for k, v in entry.extra.items():
|
445
|
+
proto_extra = proto_entry.extra.add()
|
446
|
+
proto_extra.key = k
|
447
|
+
proto_extra.value_json = json.dumps(v)
|
448
|
+
return proto_manifest
|
449
|
+
|
450
|
+
def _write_artifact_manifest_file(self, manifest: ArtifactManifest) -> str:
|
451
|
+
manifest_dir = Path(get_staging_dir()) / "artifact_manifests"
|
452
|
+
manifest_dir.mkdir(parents=True, exist_ok=True)
|
453
|
+
# It would be simpler to use `manifest.to_json()`, but that gets very slow for
|
454
|
+
# large manifests since it encodes the whole thing as a single JSON object.
|
455
|
+
filename = f"{time.time()}_{token_hex(8)}.manifest_contents.jl.gz"
|
456
|
+
manifest_file_path = manifest_dir / filename
|
457
|
+
with gzip.open(manifest_file_path, mode="wt", compresslevel=1) as f:
|
458
|
+
for entry in manifest.entries.values():
|
459
|
+
f.write(f"{json.dumps(entry.to_json())}\n")
|
460
|
+
return str(manifest_file_path)
|
461
|
+
|
462
|
+
def deliver_link_artifact(
|
463
|
+
self,
|
464
|
+
artifact: "Artifact",
|
465
|
+
portfolio_name: str,
|
466
|
+
aliases: Iterable[str],
|
467
|
+
entity: Optional[str] = None,
|
468
|
+
project: Optional[str] = None,
|
469
|
+
organization: Optional[str] = None,
|
470
|
+
) -> MailboxHandle[pb.Result]:
|
471
|
+
link_artifact = pb.LinkArtifactRequest()
|
472
|
+
if artifact.is_draft():
|
473
|
+
link_artifact.client_id = artifact._client_id
|
474
|
+
else:
|
475
|
+
link_artifact.server_id = artifact.id if artifact.id else ""
|
476
|
+
link_artifact.portfolio_name = portfolio_name
|
477
|
+
link_artifact.portfolio_entity = entity or ""
|
478
|
+
link_artifact.portfolio_organization = organization or ""
|
479
|
+
link_artifact.portfolio_project = project or ""
|
480
|
+
link_artifact.portfolio_aliases.extend(aliases)
|
481
|
+
|
482
|
+
return self._deliver_link_artifact(link_artifact)
|
483
|
+
|
484
|
+
@abstractmethod
|
485
|
+
def _deliver_link_artifact(
|
486
|
+
self, link_artifact: pb.LinkArtifactRequest
|
487
|
+
) -> MailboxHandle[pb.Result]:
|
488
|
+
raise NotImplementedError
|
489
|
+
|
490
|
+
@staticmethod
|
491
|
+
def _make_partial_source_str(
|
492
|
+
source: Any, job_info: Dict[str, Any], metadata: Dict[str, Any]
|
493
|
+
) -> str:
|
494
|
+
"""Construct use_artifact.partial.source_info.source as str."""
|
495
|
+
source_type = job_info.get("source_type", "").strip()
|
496
|
+
if source_type == "artifact":
|
497
|
+
info_source = job_info.get("source", {})
|
498
|
+
source.artifact.artifact = info_source.get("artifact", "")
|
499
|
+
source.artifact.entrypoint.extend(info_source.get("entrypoint", []))
|
500
|
+
source.artifact.notebook = info_source.get("notebook", False)
|
501
|
+
build_context = info_source.get("build_context")
|
502
|
+
if build_context:
|
503
|
+
source.artifact.build_context = build_context
|
504
|
+
dockerfile = info_source.get("dockerfile")
|
505
|
+
if dockerfile:
|
506
|
+
source.artifact.dockerfile = dockerfile
|
507
|
+
elif source_type == "repo":
|
508
|
+
source.git.git_info.remote = metadata.get("git", {}).get("remote", "")
|
509
|
+
source.git.git_info.commit = metadata.get("git", {}).get("commit", "")
|
510
|
+
source.git.entrypoint.extend(metadata.get("entrypoint", []))
|
511
|
+
source.git.notebook = metadata.get("notebook", False)
|
512
|
+
build_context = metadata.get("build_context")
|
513
|
+
if build_context:
|
514
|
+
source.git.build_context = build_context
|
515
|
+
dockerfile = metadata.get("dockerfile")
|
516
|
+
if dockerfile:
|
517
|
+
source.git.dockerfile = dockerfile
|
518
|
+
elif source_type == "image":
|
519
|
+
source.image.image = metadata.get("docker", "")
|
520
|
+
else:
|
521
|
+
raise ValueError("Invalid source type")
|
522
|
+
|
523
|
+
source_str: str = source.SerializeToString()
|
524
|
+
return source_str
|
525
|
+
|
526
|
+
def _make_proto_use_artifact(
|
527
|
+
self,
|
528
|
+
use_artifact: pb.UseArtifactRecord,
|
529
|
+
job_name: str,
|
530
|
+
job_info: Dict[str, Any],
|
531
|
+
metadata: Dict[str, Any],
|
532
|
+
) -> pb.UseArtifactRecord:
|
533
|
+
use_artifact.partial.job_name = job_name
|
534
|
+
use_artifact.partial.source_info._version = job_info.get("_version", "")
|
535
|
+
use_artifact.partial.source_info.source_type = job_info.get("source_type", "")
|
536
|
+
use_artifact.partial.source_info.runtime = job_info.get("runtime", "")
|
537
|
+
|
538
|
+
src_str = self._make_partial_source_str(
|
539
|
+
source=use_artifact.partial.source_info.source,
|
540
|
+
job_info=job_info,
|
541
|
+
metadata=metadata,
|
542
|
+
)
|
543
|
+
use_artifact.partial.source_info.source.ParseFromString(src_str) # type: ignore[arg-type]
|
544
|
+
|
545
|
+
return use_artifact
|
546
|
+
|
547
|
+
def publish_use_artifact(
|
548
|
+
self,
|
549
|
+
artifact: "Artifact",
|
550
|
+
) -> None:
|
551
|
+
assert artifact.id is not None, "Artifact must have an id"
|
552
|
+
|
553
|
+
use_artifact = pb.UseArtifactRecord(
|
554
|
+
id=artifact.id,
|
555
|
+
type=artifact.type,
|
556
|
+
name=artifact.name,
|
557
|
+
)
|
558
|
+
|
559
|
+
# TODO(gst): move to internal process
|
560
|
+
if "_partial" in artifact.metadata:
|
561
|
+
# Download source info from logged partial job artifact
|
562
|
+
job_info = {}
|
563
|
+
try:
|
564
|
+
path = artifact.get_entry("wandb-job.json").download()
|
565
|
+
with open(path) as f:
|
566
|
+
job_info = json.load(f)
|
567
|
+
|
568
|
+
except Exception as e:
|
569
|
+
logger.warning(
|
570
|
+
f"Failed to download partial job info from artifact {artifact}, : {e}"
|
571
|
+
)
|
572
|
+
termwarn(
|
573
|
+
f"Failed to download partial job info from artifact {artifact}, : {e}"
|
574
|
+
)
|
575
|
+
return
|
576
|
+
|
577
|
+
try:
|
578
|
+
use_artifact = self._make_proto_use_artifact(
|
579
|
+
use_artifact=use_artifact,
|
580
|
+
job_name=artifact.name,
|
581
|
+
job_info=job_info,
|
582
|
+
metadata=artifact.metadata,
|
583
|
+
)
|
584
|
+
except Exception as e:
|
585
|
+
logger.warning(f"Failed to construct use artifact proto: {e}")
|
586
|
+
termwarn(f"Failed to construct use artifact proto: {e}")
|
587
|
+
return
|
588
|
+
|
589
|
+
self._publish_use_artifact(use_artifact)
|
590
|
+
|
591
|
+
@abstractmethod
|
592
|
+
def _publish_use_artifact(self, proto_artifact: pb.UseArtifactRecord) -> None:
|
593
|
+
raise NotImplementedError
|
594
|
+
|
595
|
+
def deliver_artifact(
|
596
|
+
self,
|
597
|
+
run: "Run",
|
598
|
+
artifact: "Artifact",
|
599
|
+
aliases: Iterable[str],
|
600
|
+
tags: Optional[Iterable[str]] = None,
|
601
|
+
history_step: Optional[int] = None,
|
602
|
+
is_user_created: bool = False,
|
603
|
+
use_after_commit: bool = False,
|
604
|
+
finalize: bool = True,
|
605
|
+
) -> MailboxHandle[pb.Result]:
|
606
|
+
proto_run = self._make_run(run)
|
607
|
+
proto_artifact = self._make_artifact(artifact)
|
608
|
+
proto_artifact.run_id = proto_run.run_id
|
609
|
+
proto_artifact.project = proto_run.project
|
610
|
+
proto_artifact.entity = proto_run.entity
|
611
|
+
proto_artifact.user_created = is_user_created
|
612
|
+
proto_artifact.use_after_commit = use_after_commit
|
613
|
+
proto_artifact.finalize = finalize
|
614
|
+
|
615
|
+
proto_artifact.aliases.extend(aliases or [])
|
616
|
+
proto_artifact.tags.extend(tags or [])
|
617
|
+
|
618
|
+
log_artifact = pb.LogArtifactRequest()
|
619
|
+
log_artifact.artifact.CopyFrom(proto_artifact)
|
620
|
+
if history_step is not None:
|
621
|
+
log_artifact.history_step = history_step
|
622
|
+
log_artifact.staging_dir = get_staging_dir()
|
623
|
+
resp = self._deliver_artifact(log_artifact)
|
624
|
+
return resp
|
625
|
+
|
626
|
+
@abstractmethod
|
627
|
+
def _deliver_artifact(
|
628
|
+
self,
|
629
|
+
log_artifact: pb.LogArtifactRequest,
|
630
|
+
) -> MailboxHandle[pb.Result]:
|
631
|
+
raise NotImplementedError
|
632
|
+
|
633
|
+
def deliver_download_artifact(
|
634
|
+
self,
|
635
|
+
artifact_id: str,
|
636
|
+
download_root: str,
|
637
|
+
allow_missing_references: bool,
|
638
|
+
skip_cache: bool,
|
639
|
+
path_prefix: Optional[str],
|
640
|
+
) -> MailboxHandle[pb.Result]:
|
641
|
+
download_artifact = pb.DownloadArtifactRequest()
|
642
|
+
download_artifact.artifact_id = artifact_id
|
643
|
+
download_artifact.download_root = download_root
|
644
|
+
download_artifact.allow_missing_references = allow_missing_references
|
645
|
+
download_artifact.skip_cache = skip_cache
|
646
|
+
download_artifact.path_prefix = path_prefix or ""
|
647
|
+
resp = self._deliver_download_artifact(download_artifact)
|
648
|
+
return resp
|
649
|
+
|
650
|
+
@abstractmethod
|
651
|
+
def _deliver_download_artifact(
|
652
|
+
self, download_artifact: pb.DownloadArtifactRequest
|
653
|
+
) -> MailboxHandle[pb.Result]:
|
654
|
+
raise NotImplementedError
|
655
|
+
|
656
|
+
def publish_artifact(
|
657
|
+
self,
|
658
|
+
run: "Run",
|
659
|
+
artifact: "Artifact",
|
660
|
+
aliases: Iterable[str],
|
661
|
+
tags: Optional[Iterable[str]] = None,
|
662
|
+
is_user_created: bool = False,
|
663
|
+
use_after_commit: bool = False,
|
664
|
+
finalize: bool = True,
|
665
|
+
) -> None:
|
666
|
+
proto_run = self._make_run(run)
|
667
|
+
proto_artifact = self._make_artifact(artifact)
|
668
|
+
proto_artifact.run_id = proto_run.run_id
|
669
|
+
proto_artifact.project = proto_run.project
|
670
|
+
proto_artifact.entity = proto_run.entity
|
671
|
+
proto_artifact.user_created = is_user_created
|
672
|
+
proto_artifact.use_after_commit = use_after_commit
|
673
|
+
proto_artifact.finalize = finalize
|
674
|
+
proto_artifact.aliases.extend(aliases or [])
|
675
|
+
proto_artifact.tags.extend(tags or [])
|
676
|
+
self._publish_artifact(proto_artifact)
|
677
|
+
|
678
|
+
@abstractmethod
|
679
|
+
def _publish_artifact(self, proto_artifact: pb.ArtifactRecord) -> None:
|
680
|
+
raise NotImplementedError
|
681
|
+
|
682
|
+
def publish_tbdata(self, log_dir: str, save: bool, root_logdir: str = "") -> None:
|
683
|
+
tbrecord = pb.TBRecord()
|
684
|
+
tbrecord.log_dir = log_dir
|
685
|
+
tbrecord.save = save
|
686
|
+
tbrecord.root_dir = root_logdir
|
687
|
+
self._publish_tbdata(tbrecord)
|
688
|
+
|
689
|
+
@abstractmethod
|
690
|
+
def _publish_tbdata(self, tbrecord: pb.TBRecord) -> None:
|
691
|
+
raise NotImplementedError
|
692
|
+
|
693
|
+
@abstractmethod
|
694
|
+
def _publish_telemetry(self, telem: tpb.TelemetryRecord) -> None:
|
695
|
+
raise NotImplementedError
|
696
|
+
|
697
|
+
def publish_environment(self, environment: pb.EnvironmentRecord) -> None:
|
698
|
+
self._publish_environment(environment)
|
699
|
+
|
700
|
+
@abstractmethod
|
701
|
+
def _publish_environment(self, environment: pb.EnvironmentRecord) -> None:
|
702
|
+
raise NotImplementedError
|
703
|
+
|
704
|
+
def publish_partial_history(
|
705
|
+
self,
|
706
|
+
run: "Run",
|
707
|
+
data: dict,
|
708
|
+
user_step: int,
|
709
|
+
step: Optional[int] = None,
|
710
|
+
flush: Optional[bool] = None,
|
711
|
+
publish_step: bool = True,
|
712
|
+
) -> None:
|
713
|
+
data = history_dict_to_json(run, data, step=user_step, ignore_copy_err=True)
|
714
|
+
data.pop("_step", None)
|
715
|
+
|
716
|
+
# add timestamp to the history request, if not already present
|
717
|
+
# the timestamp might come from the tensorboard log logic
|
718
|
+
if "_timestamp" not in data:
|
719
|
+
data["_timestamp"] = time.time()
|
720
|
+
|
721
|
+
partial_history = pb.PartialHistoryRequest()
|
722
|
+
for k, v in data.items():
|
723
|
+
item = partial_history.item.add()
|
724
|
+
item.key = k
|
725
|
+
item.value_json = json_dumps_safer_history(v)
|
726
|
+
|
727
|
+
if publish_step and step is not None:
|
728
|
+
partial_history.step.num = step
|
729
|
+
if flush is not None:
|
730
|
+
partial_history.action.flush = flush
|
731
|
+
self._publish_partial_history(partial_history)
|
732
|
+
|
733
|
+
@abstractmethod
|
734
|
+
def _publish_partial_history(self, history: pb.PartialHistoryRequest) -> None:
|
735
|
+
raise NotImplementedError
|
736
|
+
|
737
|
+
def publish_history(
|
738
|
+
self,
|
739
|
+
run: "Run",
|
740
|
+
data: dict,
|
741
|
+
step: Optional[int] = None,
|
742
|
+
publish_step: bool = True,
|
743
|
+
) -> None:
|
744
|
+
data = history_dict_to_json(run, data, step=step)
|
745
|
+
history = pb.HistoryRecord()
|
746
|
+
if publish_step:
|
747
|
+
assert step is not None
|
748
|
+
history.step.num = step
|
749
|
+
data.pop("_step", None)
|
750
|
+
for k, v in data.items():
|
751
|
+
item = history.item.add()
|
752
|
+
item.key = k
|
753
|
+
item.value_json = json_dumps_safer_history(v)
|
754
|
+
self._publish_history(history)
|
755
|
+
|
756
|
+
@abstractmethod
|
757
|
+
def _publish_history(self, history: pb.HistoryRecord) -> None:
|
758
|
+
raise NotImplementedError
|
759
|
+
|
760
|
+
def publish_preempting(self) -> None:
|
761
|
+
preempt_rec = pb.RunPreemptingRecord()
|
762
|
+
self._publish_preempting(preempt_rec)
|
763
|
+
|
764
|
+
@abstractmethod
|
765
|
+
def _publish_preempting(self, preempt_rec: pb.RunPreemptingRecord) -> None:
|
766
|
+
raise NotImplementedError
|
767
|
+
|
768
|
+
def publish_output(self, name: str, data: str) -> None:
|
769
|
+
# from vendor.protobuf import google3.protobuf.timestamp
|
770
|
+
# ts = timestamp.Timestamp()
|
771
|
+
# ts.GetCurrentTime()
|
772
|
+
# now = datetime.now()
|
773
|
+
if name == "stdout":
|
774
|
+
otype = pb.OutputRecord.OutputType.STDOUT
|
775
|
+
elif name == "stderr":
|
776
|
+
otype = pb.OutputRecord.OutputType.STDERR
|
777
|
+
else:
|
778
|
+
# TODO(jhr): throw error?
|
779
|
+
termwarn("unknown type")
|
780
|
+
o = pb.OutputRecord(output_type=otype, line=data)
|
781
|
+
o.timestamp.GetCurrentTime()
|
782
|
+
self._publish_output(o)
|
783
|
+
|
784
|
+
@abstractmethod
|
785
|
+
def _publish_output(self, outdata: pb.OutputRecord) -> None:
|
786
|
+
raise NotImplementedError
|
787
|
+
|
788
|
+
def publish_output_raw(self, name: str, data: str) -> None:
|
789
|
+
# from vendor.protobuf import google3.protobuf.timestamp
|
790
|
+
# ts = timestamp.Timestamp()
|
791
|
+
# ts.GetCurrentTime()
|
792
|
+
# now = datetime.now()
|
793
|
+
if name == "stdout":
|
794
|
+
otype = pb.OutputRawRecord.OutputType.STDOUT
|
795
|
+
elif name == "stderr":
|
796
|
+
otype = pb.OutputRawRecord.OutputType.STDERR
|
797
|
+
else:
|
798
|
+
# TODO(jhr): throw error?
|
799
|
+
termwarn("unknown type")
|
800
|
+
o = pb.OutputRawRecord(output_type=otype, line=data)
|
801
|
+
o.timestamp.GetCurrentTime()
|
802
|
+
self._publish_output_raw(o)
|
803
|
+
|
804
|
+
@abstractmethod
|
805
|
+
def _publish_output_raw(self, outdata: pb.OutputRawRecord) -> None:
|
806
|
+
raise NotImplementedError
|
807
|
+
|
808
|
+
def publish_pause(self) -> None:
|
809
|
+
pause = pb.PauseRequest()
|
810
|
+
self._publish_pause(pause)
|
811
|
+
|
812
|
+
@abstractmethod
|
813
|
+
def _publish_pause(self, pause: pb.PauseRequest) -> None:
|
814
|
+
raise NotImplementedError
|
815
|
+
|
816
|
+
def publish_resume(self) -> None:
|
817
|
+
resume = pb.ResumeRequest()
|
818
|
+
self._publish_resume(resume)
|
819
|
+
|
820
|
+
@abstractmethod
|
821
|
+
def _publish_resume(self, resume: pb.ResumeRequest) -> None:
|
822
|
+
raise NotImplementedError
|
823
|
+
|
824
|
+
def publish_alert(
|
825
|
+
self, title: str, text: str, level: str, wait_duration: int
|
826
|
+
) -> None:
|
827
|
+
proto_alert = pb.AlertRecord()
|
828
|
+
proto_alert.title = title
|
829
|
+
proto_alert.text = text
|
830
|
+
proto_alert.level = level
|
831
|
+
proto_alert.wait_duration = wait_duration
|
832
|
+
self._publish_alert(proto_alert)
|
833
|
+
|
834
|
+
@abstractmethod
|
835
|
+
def _publish_alert(self, alert: pb.AlertRecord) -> None:
|
836
|
+
raise NotImplementedError
|
837
|
+
|
838
|
+
def _make_exit(self, exit_code: Optional[int]) -> pb.RunExitRecord:
|
839
|
+
exit = pb.RunExitRecord()
|
840
|
+
if exit_code is not None:
|
841
|
+
exit.exit_code = exit_code
|
842
|
+
return exit
|
843
|
+
|
844
|
+
def publish_exit(self, exit_code: Optional[int]) -> None:
|
845
|
+
exit_data = self._make_exit(exit_code)
|
846
|
+
self._publish_exit(exit_data)
|
847
|
+
|
848
|
+
@abstractmethod
|
849
|
+
def _publish_exit(self, exit_data: pb.RunExitRecord) -> None:
|
850
|
+
raise NotImplementedError
|
851
|
+
|
852
|
+
def publish_keepalive(self) -> None:
|
853
|
+
keepalive = pb.KeepaliveRequest()
|
854
|
+
self._publish_keepalive(keepalive)
|
855
|
+
|
856
|
+
@abstractmethod
|
857
|
+
def _publish_keepalive(self, keepalive: pb.KeepaliveRequest) -> None:
|
858
|
+
raise NotImplementedError
|
859
|
+
|
860
|
+
def publish_job_input(
|
861
|
+
self,
|
862
|
+
include_paths: List[List[str]],
|
863
|
+
exclude_paths: List[List[str]],
|
864
|
+
input_schema: Optional[dict],
|
865
|
+
run_config: bool = False,
|
866
|
+
file_path: str = "",
|
867
|
+
):
|
868
|
+
"""Publishes a request to add inputs to the job.
|
869
|
+
|
870
|
+
If run_config is True, the wandb.config will be added as a job input.
|
871
|
+
If file_path is provided, the file at file_path will be added as a job
|
872
|
+
input.
|
873
|
+
|
874
|
+
The paths provided as arguments are sequences of dictionary keys that
|
875
|
+
specify a path within the wandb.config. If a path is included, the
|
876
|
+
corresponding field will be treated as a job input. If a path is
|
877
|
+
excluded, the corresponding field will not be treated as a job input.
|
878
|
+
|
879
|
+
Args:
|
880
|
+
include_paths: paths within config to include as job inputs.
|
881
|
+
exclude_paths: paths within config to exclude as job inputs.
|
882
|
+
input_schema: A JSON Schema describing which attributes will be
|
883
|
+
editable from the Launch drawer.
|
884
|
+
run_config: bool indicating whether wandb.config is the input source.
|
885
|
+
file_path: path to file to include as a job input.
|
886
|
+
"""
|
887
|
+
if run_config and file_path:
|
888
|
+
raise ValueError(
|
889
|
+
"run_config and file_path are mutually exclusive arguments."
|
890
|
+
)
|
891
|
+
request = pb.JobInputRequest()
|
892
|
+
include_records = [pb.JobInputPath(path=path) for path in include_paths]
|
893
|
+
exclude_records = [pb.JobInputPath(path=path) for path in exclude_paths]
|
894
|
+
request.include_paths.extend(include_records)
|
895
|
+
request.exclude_paths.extend(exclude_records)
|
896
|
+
source = pb.JobInputSource(
|
897
|
+
run_config=pb.JobInputSource.RunConfigSource(),
|
898
|
+
)
|
899
|
+
if run_config:
|
900
|
+
source.run_config.CopyFrom(pb.JobInputSource.RunConfigSource())
|
901
|
+
else:
|
902
|
+
source.file.CopyFrom(
|
903
|
+
pb.JobInputSource.ConfigFileSource(path=file_path),
|
904
|
+
)
|
905
|
+
request.input_source.CopyFrom(source)
|
906
|
+
if input_schema:
|
907
|
+
request.input_schema = json_dumps_safer(input_schema)
|
908
|
+
|
909
|
+
return self._publish_job_input(request)
|
910
|
+
|
911
|
+
@abstractmethod
|
912
|
+
def _publish_job_input(
|
913
|
+
self, request: pb.JobInputRequest
|
914
|
+
) -> MailboxHandle[pb.Result]:
|
915
|
+
raise NotImplementedError
|
916
|
+
|
917
|
+
def publish_probe_system_info(self) -> None:
|
918
|
+
probe_system_info = pb.ProbeSystemInfoRequest()
|
919
|
+
return self._publish_probe_system_info(probe_system_info)
|
920
|
+
|
921
|
+
@abstractmethod
|
922
|
+
def _publish_probe_system_info(
|
923
|
+
self, probe_system_info: pb.ProbeSystemInfoRequest
|
924
|
+
) -> None:
|
925
|
+
raise NotImplementedError
|
926
|
+
|
927
|
+
def join(self) -> None:
|
928
|
+
# Drop indicates that the internal process has already been shutdown
|
929
|
+
if self._drop:
|
930
|
+
return
|
931
|
+
|
932
|
+
handle = self._deliver_shutdown()
|
933
|
+
|
934
|
+
try:
|
935
|
+
handle.wait_or(timeout=30)
|
936
|
+
except TimeoutError:
|
937
|
+
# This can happen if the server fails to respond due to a bug
|
938
|
+
# or due to being very busy.
|
939
|
+
logger.warning("timed out communicating shutdown")
|
940
|
+
except HandleAbandonedError:
|
941
|
+
# This can happen if the connection to the server is closed
|
942
|
+
# before a response is read.
|
943
|
+
logger.warning("handle abandoned while communicating shutdown")
|
944
|
+
|
945
|
+
@abstractmethod
|
946
|
+
def _deliver_shutdown(self) -> MailboxHandle[pb.Result]:
|
947
|
+
raise NotImplementedError
|
948
|
+
|
949
|
+
def deliver_run(self, run: "Run") -> MailboxHandle[pb.Result]:
|
950
|
+
run_record = self._make_run(run)
|
951
|
+
return self._deliver_run(run_record)
|
952
|
+
|
953
|
+
def deliver_finish_sync(
|
954
|
+
self,
|
955
|
+
) -> MailboxHandle[pb.Result]:
|
956
|
+
sync = pb.SyncFinishRequest()
|
957
|
+
return self._deliver_finish_sync(sync)
|
958
|
+
|
959
|
+
@abstractmethod
|
960
|
+
def _deliver_finish_sync(
|
961
|
+
self, sync: pb.SyncFinishRequest
|
962
|
+
) -> MailboxHandle[pb.Result]:
|
963
|
+
raise NotImplementedError
|
964
|
+
|
965
|
+
@abstractmethod
|
966
|
+
def _deliver_run(self, run: pb.RunRecord) -> MailboxHandle[pb.Result]:
|
967
|
+
raise NotImplementedError
|
968
|
+
|
969
|
+
def deliver_run_start(self, run: "Run") -> MailboxHandle[pb.Result]:
|
970
|
+
run_start = pb.RunStartRequest(run=self._make_run(run))
|
971
|
+
return self._deliver_run_start(run_start)
|
972
|
+
|
973
|
+
@abstractmethod
|
974
|
+
def _deliver_run_start(
|
975
|
+
self, run_start: pb.RunStartRequest
|
976
|
+
) -> MailboxHandle[pb.Result]:
|
977
|
+
raise NotImplementedError
|
978
|
+
|
979
|
+
def deliver_attach(self, attach_id: str) -> MailboxHandle[pb.Result]:
|
980
|
+
attach = pb.AttachRequest(attach_id=attach_id)
|
981
|
+
return self._deliver_attach(attach)
|
982
|
+
|
983
|
+
@abstractmethod
|
984
|
+
def _deliver_attach(
|
985
|
+
self,
|
986
|
+
status: pb.AttachRequest,
|
987
|
+
) -> MailboxHandle[pb.Result]:
|
988
|
+
raise NotImplementedError
|
989
|
+
|
990
|
+
def deliver_stop_status(self) -> MailboxHandle[pb.Result]:
|
991
|
+
status = pb.StopStatusRequest()
|
992
|
+
return self._deliver_stop_status(status)
|
993
|
+
|
994
|
+
@abstractmethod
|
995
|
+
def _deliver_stop_status(
|
996
|
+
self,
|
997
|
+
status: pb.StopStatusRequest,
|
998
|
+
) -> MailboxHandle[pb.Result]:
|
999
|
+
raise NotImplementedError
|
1000
|
+
|
1001
|
+
def deliver_network_status(self) -> MailboxHandle[pb.Result]:
|
1002
|
+
status = pb.NetworkStatusRequest()
|
1003
|
+
return self._deliver_network_status(status)
|
1004
|
+
|
1005
|
+
@abstractmethod
|
1006
|
+
def _deliver_network_status(
|
1007
|
+
self,
|
1008
|
+
status: pb.NetworkStatusRequest,
|
1009
|
+
) -> MailboxHandle[pb.Result]:
|
1010
|
+
raise NotImplementedError
|
1011
|
+
|
1012
|
+
def deliver_internal_messages(self) -> MailboxHandle[pb.Result]:
|
1013
|
+
internal_message = pb.InternalMessagesRequest()
|
1014
|
+
return self._deliver_internal_messages(internal_message)
|
1015
|
+
|
1016
|
+
@abstractmethod
|
1017
|
+
def _deliver_internal_messages(
|
1018
|
+
self, internal_message: pb.InternalMessagesRequest
|
1019
|
+
) -> MailboxHandle[pb.Result]:
|
1020
|
+
raise NotImplementedError
|
1021
|
+
|
1022
|
+
def deliver_get_summary(self) -> MailboxHandle[pb.Result]:
|
1023
|
+
get_summary = pb.GetSummaryRequest()
|
1024
|
+
return self._deliver_get_summary(get_summary)
|
1025
|
+
|
1026
|
+
@abstractmethod
|
1027
|
+
def _deliver_get_summary(
|
1028
|
+
self,
|
1029
|
+
get_summary: pb.GetSummaryRequest,
|
1030
|
+
) -> MailboxHandle[pb.Result]:
|
1031
|
+
raise NotImplementedError
|
1032
|
+
|
1033
|
+
def deliver_get_system_metrics(self) -> MailboxHandle[pb.Result]:
|
1034
|
+
get_system_metrics = pb.GetSystemMetricsRequest()
|
1035
|
+
return self._deliver_get_system_metrics(get_system_metrics)
|
1036
|
+
|
1037
|
+
@abstractmethod
|
1038
|
+
def _deliver_get_system_metrics(
|
1039
|
+
self, get_summary: pb.GetSystemMetricsRequest
|
1040
|
+
) -> MailboxHandle[pb.Result]:
|
1041
|
+
raise NotImplementedError
|
1042
|
+
|
1043
|
+
def deliver_exit(self, exit_code: Optional[int]) -> MailboxHandle[pb.Result]:
|
1044
|
+
exit_data = self._make_exit(exit_code)
|
1045
|
+
return self._deliver_exit(exit_data)
|
1046
|
+
|
1047
|
+
@abstractmethod
|
1048
|
+
def _deliver_exit(
|
1049
|
+
self,
|
1050
|
+
exit_data: pb.RunExitRecord,
|
1051
|
+
) -> MailboxHandle[pb.Result]:
|
1052
|
+
raise NotImplementedError
|
1053
|
+
|
1054
|
+
def deliver_poll_exit(self) -> MailboxHandle[pb.Result]:
|
1055
|
+
poll_exit = pb.PollExitRequest()
|
1056
|
+
return self._deliver_poll_exit(poll_exit)
|
1057
|
+
|
1058
|
+
@abstractmethod
|
1059
|
+
def _deliver_poll_exit(
|
1060
|
+
self,
|
1061
|
+
poll_exit: pb.PollExitRequest,
|
1062
|
+
) -> MailboxHandle[pb.Result]:
|
1063
|
+
raise NotImplementedError
|
1064
|
+
|
1065
|
+
def deliver_finish_without_exit(self) -> MailboxHandle[pb.Result]:
|
1066
|
+
run_finish_without_exit = pb.RunFinishWithoutExitRequest()
|
1067
|
+
return self._deliver_finish_without_exit(run_finish_without_exit)
|
1068
|
+
|
1069
|
+
@abstractmethod
|
1070
|
+
def _deliver_finish_without_exit(
|
1071
|
+
self, run_finish_without_exit: pb.RunFinishWithoutExitRequest
|
1072
|
+
) -> MailboxHandle[pb.Result]:
|
1073
|
+
raise NotImplementedError
|
1074
|
+
|
1075
|
+
def deliver_request_sampled_history(self) -> MailboxHandle[pb.Result]:
|
1076
|
+
sampled_history = pb.SampledHistoryRequest()
|
1077
|
+
return self._deliver_request_sampled_history(sampled_history)
|
1078
|
+
|
1079
|
+
@abstractmethod
|
1080
|
+
def _deliver_request_sampled_history(
|
1081
|
+
self, sampled_history: pb.SampledHistoryRequest
|
1082
|
+
) -> MailboxHandle[pb.Result]:
|
1083
|
+
raise NotImplementedError
|
1084
|
+
|
1085
|
+
def deliver_request_run_status(self) -> MailboxHandle[pb.Result]:
|
1086
|
+
run_status = pb.RunStatusRequest()
|
1087
|
+
return self._deliver_request_run_status(run_status)
|
1088
|
+
|
1089
|
+
@abstractmethod
|
1090
|
+
def _deliver_request_run_status(
|
1091
|
+
self, run_status: pb.RunStatusRequest
|
1092
|
+
) -> MailboxHandle[pb.Result]:
|
1093
|
+
raise NotImplementedError
|