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
wandb/sdk/wandb_init.py
ADDED
@@ -0,0 +1,1266 @@
|
|
1
|
+
"""Defines wandb.init() and associated classes and methods.
|
2
|
+
|
3
|
+
`wandb.init()` indicates the beginning of a new run. In an ML training pipeline,
|
4
|
+
you could add `wandb.init()` to the beginning of your training script as well as
|
5
|
+
your evaluation script, and each step would be tracked as a run in W&B.
|
6
|
+
|
7
|
+
For more on using `wandb.init()`, including code snippets, check out our
|
8
|
+
[guide and FAQs](https://docs.wandb.ai/guides/track/launch).
|
9
|
+
"""
|
10
|
+
|
11
|
+
import copy
|
12
|
+
import json
|
13
|
+
import logging
|
14
|
+
import os
|
15
|
+
import platform
|
16
|
+
import sys
|
17
|
+
import tempfile
|
18
|
+
import time
|
19
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Sequence, Union
|
20
|
+
|
21
|
+
import wandb
|
22
|
+
import wandb.env
|
23
|
+
from wandb import trigger
|
24
|
+
from wandb.errors import CommError, Error, UsageError
|
25
|
+
from wandb.errors.util import ProtobufErrorHandler
|
26
|
+
from wandb.integration import sagemaker
|
27
|
+
from wandb.integration.magic import magic_install
|
28
|
+
from wandb.sdk.lib import runid
|
29
|
+
from wandb.sdk.lib.paths import StrPath
|
30
|
+
from wandb.util import _is_artifact_representation
|
31
|
+
|
32
|
+
from . import wandb_login, wandb_setup
|
33
|
+
from .backend.backend import Backend
|
34
|
+
from .lib import SummaryDisabled, filesystem, ipython, module, reporting, telemetry
|
35
|
+
from .lib.deprecate import Deprecated, deprecate
|
36
|
+
from .lib.mailbox import Mailbox, MailboxProgress
|
37
|
+
from .lib.printer import Printer, get_printer
|
38
|
+
from .lib.wburls import wburls
|
39
|
+
from .wandb_helper import parse_config
|
40
|
+
from .wandb_run import Run, TeardownHook, TeardownStage
|
41
|
+
from .wandb_settings import Settings, Source
|
42
|
+
|
43
|
+
if TYPE_CHECKING:
|
44
|
+
from wandb.proto import wandb_internal_pb2 as pb
|
45
|
+
|
46
|
+
logger: Optional[logging.Logger] = None # logger configured during wandb.init()
|
47
|
+
|
48
|
+
|
49
|
+
def _set_logger(log_object: logging.Logger) -> None:
|
50
|
+
"""Configure module logger."""
|
51
|
+
global logger
|
52
|
+
logger = log_object
|
53
|
+
|
54
|
+
|
55
|
+
def _huggingface_version() -> Optional[str]:
|
56
|
+
if "transformers" in sys.modules:
|
57
|
+
trans = wandb.util.get_module("transformers")
|
58
|
+
if hasattr(trans, "__version__"):
|
59
|
+
return str(trans.__version__)
|
60
|
+
return None
|
61
|
+
|
62
|
+
|
63
|
+
def _maybe_mp_process(backend: Backend) -> bool:
|
64
|
+
parent_process = getattr(
|
65
|
+
backend._multiprocessing, "parent_process", None
|
66
|
+
) # New in version 3.8.
|
67
|
+
if parent_process:
|
68
|
+
return parent_process() is not None
|
69
|
+
process = backend._multiprocessing.current_process()
|
70
|
+
if process.name == "MainProcess":
|
71
|
+
return False
|
72
|
+
if process.name.startswith("Process-"):
|
73
|
+
return True
|
74
|
+
return False
|
75
|
+
|
76
|
+
|
77
|
+
def _handle_launch_config(settings: "Settings") -> Dict[str, Any]:
|
78
|
+
launch_run_config: Dict[str, Any] = {}
|
79
|
+
if not settings.launch:
|
80
|
+
return launch_run_config
|
81
|
+
if os.environ.get("WANDB_CONFIG") is not None:
|
82
|
+
try:
|
83
|
+
launch_run_config = json.loads(os.environ.get("WANDB_CONFIG", "{}"))
|
84
|
+
except (ValueError, SyntaxError):
|
85
|
+
wandb.termwarn("Malformed WANDB_CONFIG, using original config")
|
86
|
+
elif settings.launch_config_path and os.path.exists(settings.launch_config_path):
|
87
|
+
with open(settings.launch_config_path) as fp:
|
88
|
+
launch_config = json.loads(fp.read())
|
89
|
+
launch_run_config = launch_config.get("overrides", {}).get("run_config")
|
90
|
+
else:
|
91
|
+
i = 0
|
92
|
+
chunks = []
|
93
|
+
while True:
|
94
|
+
key = f"WANDB_CONFIG_{i}"
|
95
|
+
if key in os.environ:
|
96
|
+
chunks.append(os.environ[key])
|
97
|
+
i += 1
|
98
|
+
else:
|
99
|
+
break
|
100
|
+
if len(chunks) > 0:
|
101
|
+
config_string = "".join(chunks)
|
102
|
+
try:
|
103
|
+
launch_run_config = json.loads(config_string)
|
104
|
+
except (ValueError, SyntaxError):
|
105
|
+
wandb.termwarn("Malformed WANDB_CONFIG, using original config")
|
106
|
+
|
107
|
+
return launch_run_config
|
108
|
+
|
109
|
+
|
110
|
+
class _WandbInit:
|
111
|
+
_init_telemetry_obj: telemetry.TelemetryRecord
|
112
|
+
|
113
|
+
def __init__(self) -> None:
|
114
|
+
self.kwargs = None
|
115
|
+
self.settings: Optional[Settings] = None
|
116
|
+
self.sweep_config: Dict[str, Any] = {}
|
117
|
+
self.launch_config: Dict[str, Any] = {}
|
118
|
+
self.config: Dict[str, Any] = {}
|
119
|
+
self.run: Optional[Run] = None
|
120
|
+
self.backend: Optional[Backend] = None
|
121
|
+
|
122
|
+
self._teardown_hooks: List[TeardownHook] = []
|
123
|
+
self._wl: Optional[wandb_setup._WandbSetup] = None
|
124
|
+
self._reporter: Optional[wandb.sdk.lib.reporting.Reporter] = None
|
125
|
+
self.notebook: Optional[wandb.jupyter.Notebook] = None # type: ignore
|
126
|
+
self.printer: Optional[Printer] = None
|
127
|
+
|
128
|
+
self._init_telemetry_obj = telemetry.TelemetryRecord()
|
129
|
+
|
130
|
+
self.deprecated_features_used: Dict[str, str] = dict()
|
131
|
+
|
132
|
+
def _setup_printer(self, settings: Settings) -> None:
|
133
|
+
if self.printer:
|
134
|
+
return
|
135
|
+
self.printer = get_printer(settings._jupyter)
|
136
|
+
|
137
|
+
def setup(self, kwargs: Any) -> None: # noqa: C901
|
138
|
+
"""Complete setup for `wandb.init()`.
|
139
|
+
|
140
|
+
This includes parsing all arguments, applying them with settings and enabling logging.
|
141
|
+
"""
|
142
|
+
self.kwargs = kwargs
|
143
|
+
|
144
|
+
# if the user ran, for example, `wandb.login(`) before `wandb.init()`,
|
145
|
+
# the singleton will already be set up and so if e.g. env vars are set
|
146
|
+
# in between, they will be ignored, which we need to inform the user about.
|
147
|
+
singleton = wandb_setup._WandbSetup._instance
|
148
|
+
if singleton is not None:
|
149
|
+
self._setup_printer(settings=singleton._settings)
|
150
|
+
assert self.printer
|
151
|
+
exclude_env_vars = {"WANDB_SERVICE", "WANDB_KUBEFLOW_URL"}
|
152
|
+
# check if environment variables have changed
|
153
|
+
singleton_env = {
|
154
|
+
k: v
|
155
|
+
for k, v in singleton._environ.items()
|
156
|
+
if k.startswith("WANDB_") and k not in exclude_env_vars
|
157
|
+
}
|
158
|
+
os_env = {
|
159
|
+
k: v
|
160
|
+
for k, v in os.environ.items()
|
161
|
+
if k.startswith("WANDB_") and k not in exclude_env_vars
|
162
|
+
}
|
163
|
+
if set(singleton_env.keys()) != set(os_env.keys()) or set(
|
164
|
+
singleton_env.values()
|
165
|
+
) != set(os_env.values()):
|
166
|
+
line = (
|
167
|
+
"Changes to your `wandb` environment variables will be ignored "
|
168
|
+
"because your `wandb` session has already started. "
|
169
|
+
"For more information on how to modify your settings with "
|
170
|
+
"`wandb.init()` arguments, please refer to "
|
171
|
+
f"{self.printer.link(wburls.get('wandb_init'), 'the W&B docs')}."
|
172
|
+
)
|
173
|
+
self.printer.display(line, level="warn")
|
174
|
+
|
175
|
+
# we add this logic to be backward compatible with the old behavior of disable
|
176
|
+
# where it would disable the service if the mode was set to disabled
|
177
|
+
# TODO: use the regular settins object to handle this
|
178
|
+
mode = kwargs.get("mode")
|
179
|
+
settings_mode = (kwargs.get("settings") or {}).get("mode") or os.environ.get(
|
180
|
+
wandb.env.MODE
|
181
|
+
)
|
182
|
+
settings__disable_service = (kwargs.get("settings") or {}).get(
|
183
|
+
"_disable_service"
|
184
|
+
) or os.environ.get(wandb.env._DISABLE_SERVICE)
|
185
|
+
|
186
|
+
setup_settings = {
|
187
|
+
"mode": mode or settings_mode,
|
188
|
+
"_disable_service": settings__disable_service,
|
189
|
+
}
|
190
|
+
|
191
|
+
self._wl = wandb_setup.setup(settings=setup_settings)
|
192
|
+
# Make sure we have a logger setup (might be an early logger)
|
193
|
+
assert self._wl is not None
|
194
|
+
_set_logger(self._wl._get_logger())
|
195
|
+
|
196
|
+
# Start with settings from wandb library singleton
|
197
|
+
settings: Settings = self._wl.settings.copy()
|
198
|
+
|
199
|
+
settings_param = kwargs.pop("settings", None)
|
200
|
+
if settings_param is not None and isinstance(settings_param, (Settings, dict)):
|
201
|
+
settings.update(settings_param, source=Source.INIT)
|
202
|
+
|
203
|
+
self._setup_printer(settings)
|
204
|
+
self._reporter = reporting.setup_reporter(settings=settings)
|
205
|
+
|
206
|
+
sagemaker_config: Dict = (
|
207
|
+
dict() if settings.sagemaker_disable else sagemaker.parse_sm_config()
|
208
|
+
)
|
209
|
+
if sagemaker_config:
|
210
|
+
sagemaker_api_key = sagemaker_config.get("wandb_api_key", None)
|
211
|
+
sagemaker_run, sagemaker_env = sagemaker.parse_sm_resources()
|
212
|
+
if sagemaker_env:
|
213
|
+
if sagemaker_api_key:
|
214
|
+
sagemaker_env["WANDB_API_KEY"] = sagemaker_api_key
|
215
|
+
settings._apply_env_vars(sagemaker_env)
|
216
|
+
wandb.setup(settings=settings)
|
217
|
+
settings.update(sagemaker_run, source=Source.SETUP)
|
218
|
+
with telemetry.context(obj=self._init_telemetry_obj) as tel:
|
219
|
+
tel.feature.sagemaker = True
|
220
|
+
|
221
|
+
with telemetry.context(obj=self._init_telemetry_obj) as tel:
|
222
|
+
if kwargs.get("config"):
|
223
|
+
tel.feature.set_init_config = True
|
224
|
+
if kwargs.get("name"):
|
225
|
+
tel.feature.set_init_name = True
|
226
|
+
if kwargs.get("id"):
|
227
|
+
tel.feature.set_init_id = True
|
228
|
+
if kwargs.get("tags"):
|
229
|
+
tel.feature.set_init_tags = True
|
230
|
+
|
231
|
+
# Remove parameters that are not part of settings
|
232
|
+
init_config = kwargs.pop("config", None) or dict()
|
233
|
+
|
234
|
+
# todo: remove this once officially deprecated
|
235
|
+
deprecated_kwargs = {
|
236
|
+
"config_include_keys": (
|
237
|
+
"Use `config=wandb.helper.parse_config(config_object, include=('key',))` instead."
|
238
|
+
),
|
239
|
+
"config_exclude_keys": (
|
240
|
+
"Use `config=wandb.helper.parse_config(config_object, exclude=('key',))` instead."
|
241
|
+
),
|
242
|
+
}
|
243
|
+
for deprecated_kwarg, msg in deprecated_kwargs.items():
|
244
|
+
if kwargs.get(deprecated_kwarg):
|
245
|
+
self.deprecated_features_used[deprecated_kwarg] = msg
|
246
|
+
|
247
|
+
init_config = parse_config(
|
248
|
+
init_config,
|
249
|
+
include=kwargs.pop("config_include_keys", None),
|
250
|
+
exclude=kwargs.pop("config_exclude_keys", None),
|
251
|
+
)
|
252
|
+
|
253
|
+
# merge config with sweep or sagemaker (or config file)
|
254
|
+
self.sweep_config = dict()
|
255
|
+
sweep_config = self._wl._sweep_config or dict()
|
256
|
+
self.config = dict()
|
257
|
+
self.init_artifact_config: Dict[str, Any] = dict()
|
258
|
+
for config_data in (
|
259
|
+
sagemaker_config,
|
260
|
+
self._wl._config,
|
261
|
+
init_config,
|
262
|
+
):
|
263
|
+
if not config_data:
|
264
|
+
continue
|
265
|
+
# split out artifacts, since when inserted into
|
266
|
+
# config they will trigger use_artifact
|
267
|
+
# but the run is not yet upserted
|
268
|
+
self._split_artifacts_from_config(config_data, self.config)
|
269
|
+
|
270
|
+
if sweep_config:
|
271
|
+
self._split_artifacts_from_config(sweep_config, self.sweep_config)
|
272
|
+
|
273
|
+
monitor_gym = kwargs.pop("monitor_gym", None)
|
274
|
+
if monitor_gym and len(wandb.patched["gym"]) == 0:
|
275
|
+
wandb.gym.monitor() # type: ignore
|
276
|
+
|
277
|
+
if wandb.patched["tensorboard"]:
|
278
|
+
with telemetry.context(obj=self._init_telemetry_obj) as tel:
|
279
|
+
tel.feature.tensorboard_patch = True
|
280
|
+
|
281
|
+
tensorboard = kwargs.pop("tensorboard", None)
|
282
|
+
sync_tensorboard = kwargs.pop("sync_tensorboard", None)
|
283
|
+
if tensorboard or sync_tensorboard:
|
284
|
+
if len(wandb.patched["tensorboard"]) == 0:
|
285
|
+
wandb.tensorboard.patch() # type: ignore
|
286
|
+
with telemetry.context(obj=self._init_telemetry_obj) as tel:
|
287
|
+
tel.feature.tensorboard_sync = True
|
288
|
+
|
289
|
+
magic = kwargs.get("magic")
|
290
|
+
if magic not in (None, False):
|
291
|
+
magic_install(kwargs)
|
292
|
+
|
293
|
+
# handle login related parameters as these are applied to global state
|
294
|
+
init_settings = {
|
295
|
+
key: kwargs[key]
|
296
|
+
for key in ["anonymous", "force", "mode", "resume"]
|
297
|
+
if kwargs.get(key) is not None
|
298
|
+
}
|
299
|
+
if init_settings:
|
300
|
+
settings.update(init_settings, source=Source.INIT)
|
301
|
+
|
302
|
+
if not settings._offline and not settings._noop:
|
303
|
+
wandb_login._login(
|
304
|
+
anonymous=kwargs.pop("anonymous", None),
|
305
|
+
force=kwargs.pop("force", None),
|
306
|
+
_disable_warning=True,
|
307
|
+
_silent=settings.quiet or settings.silent,
|
308
|
+
_entity=kwargs.get("entity") or settings.entity,
|
309
|
+
)
|
310
|
+
|
311
|
+
# apply updated global state after login was handled
|
312
|
+
wl = wandb.setup()
|
313
|
+
assert wl is not None
|
314
|
+
settings._apply_settings(wl.settings)
|
315
|
+
|
316
|
+
# get status of code saving before applying user settings
|
317
|
+
save_code_pre_user_settings = settings.save_code
|
318
|
+
|
319
|
+
settings._apply_init(kwargs)
|
320
|
+
if not settings._offline and not settings._noop:
|
321
|
+
user_settings = self._wl._load_user_settings()
|
322
|
+
settings._apply_user(user_settings)
|
323
|
+
|
324
|
+
# ensure that user settings don't set saving to true
|
325
|
+
# if user explicitly set these to false in UI
|
326
|
+
if save_code_pre_user_settings is False:
|
327
|
+
settings.update({"save_code": False}, source=Source.INIT)
|
328
|
+
|
329
|
+
# TODO: remove this once we refactor the client. This is a temporary
|
330
|
+
# fix to make sure that we use the same project name for wandb-core.
|
331
|
+
# The reason this is not going throught the settings object is to
|
332
|
+
# avoid failure cases in other parts of the code that will be
|
333
|
+
# removed with the switch to wandb-core.
|
334
|
+
if settings.project is None:
|
335
|
+
project = wandb.util.auto_project_name(settings.program)
|
336
|
+
settings.update({"project": project}, source=Source.INIT)
|
337
|
+
|
338
|
+
# TODO(jhr): should this be moved? probably.
|
339
|
+
settings._set_run_start_time(source=Source.INIT)
|
340
|
+
|
341
|
+
if not settings._noop:
|
342
|
+
self._log_setup(settings)
|
343
|
+
|
344
|
+
if settings._jupyter:
|
345
|
+
self._jupyter_setup(settings)
|
346
|
+
launch_config = _handle_launch_config(settings)
|
347
|
+
if launch_config:
|
348
|
+
self._split_artifacts_from_config(launch_config, self.launch_config)
|
349
|
+
|
350
|
+
self.settings = settings
|
351
|
+
|
352
|
+
# self.settings.freeze()
|
353
|
+
|
354
|
+
def teardown(self) -> None:
|
355
|
+
# TODO: currently this is only called on failed wandb.init attempts
|
356
|
+
# normally this happens on the run object
|
357
|
+
assert logger
|
358
|
+
logger.info("tearing down wandb.init")
|
359
|
+
for hook in self._teardown_hooks:
|
360
|
+
hook.call()
|
361
|
+
|
362
|
+
def _split_artifacts_from_config(
|
363
|
+
self, config_source: dict, config_target: dict
|
364
|
+
) -> None:
|
365
|
+
for k, v in config_source.items():
|
366
|
+
if _is_artifact_representation(v):
|
367
|
+
self.init_artifact_config[k] = v
|
368
|
+
else:
|
369
|
+
config_target.setdefault(k, v)
|
370
|
+
|
371
|
+
def _enable_logging(self, log_fname: str, run_id: Optional[str] = None) -> None:
|
372
|
+
"""Enable logging to the global debug log.
|
373
|
+
|
374
|
+
This adds a run_id to the log, in case of multiple processes on the same machine.
|
375
|
+
Currently, there is no way to disable logging after it's enabled.
|
376
|
+
"""
|
377
|
+
handler = logging.FileHandler(log_fname)
|
378
|
+
handler.setLevel(logging.INFO)
|
379
|
+
|
380
|
+
class WBFilter(logging.Filter):
|
381
|
+
def filter(self, record: logging.LogRecord) -> bool:
|
382
|
+
record.run_id = run_id
|
383
|
+
return True
|
384
|
+
|
385
|
+
if run_id:
|
386
|
+
formatter = logging.Formatter(
|
387
|
+
"%(asctime)s %(levelname)-7s %(threadName)-10s:%(process)d "
|
388
|
+
"[%(run_id)s:%(filename)s:%(funcName)s():%(lineno)s] %(message)s"
|
389
|
+
)
|
390
|
+
else:
|
391
|
+
formatter = logging.Formatter(
|
392
|
+
"%(asctime)s %(levelname)-7s %(threadName)-10s:%(process)d "
|
393
|
+
"[%(filename)s:%(funcName)s():%(lineno)s] %(message)s"
|
394
|
+
)
|
395
|
+
|
396
|
+
handler.setFormatter(formatter)
|
397
|
+
if run_id:
|
398
|
+
handler.addFilter(WBFilter())
|
399
|
+
assert logger is not None
|
400
|
+
logger.propagate = False
|
401
|
+
logger.addHandler(handler)
|
402
|
+
# TODO: make me configurable
|
403
|
+
logger.setLevel(logging.DEBUG)
|
404
|
+
self._teardown_hooks.append(
|
405
|
+
TeardownHook(
|
406
|
+
lambda: (handler.close(), logger.removeHandler(handler)), # type: ignore
|
407
|
+
TeardownStage.LATE,
|
408
|
+
)
|
409
|
+
)
|
410
|
+
|
411
|
+
def _safe_symlink(
|
412
|
+
self, base: str, target: str, name: str, delete: bool = False
|
413
|
+
) -> None:
|
414
|
+
# TODO(jhr): do this with relpaths, but i cant figure it out on no sleep
|
415
|
+
if not hasattr(os, "symlink"):
|
416
|
+
return
|
417
|
+
|
418
|
+
pid = os.getpid()
|
419
|
+
tmp_name = os.path.join(base, "%s.%d" % (name, pid))
|
420
|
+
|
421
|
+
if delete:
|
422
|
+
try:
|
423
|
+
os.remove(os.path.join(base, name))
|
424
|
+
except OSError:
|
425
|
+
pass
|
426
|
+
target = os.path.relpath(target, base)
|
427
|
+
try:
|
428
|
+
os.symlink(target, tmp_name)
|
429
|
+
os.rename(tmp_name, os.path.join(base, name))
|
430
|
+
except OSError:
|
431
|
+
pass
|
432
|
+
|
433
|
+
def _pause_backend(self, *args: Any, **kwargs: Any) -> None: # noqa
|
434
|
+
if self.backend is None:
|
435
|
+
return None
|
436
|
+
|
437
|
+
# Attempt to save the code on every execution
|
438
|
+
if self.notebook.save_ipynb(): # type: ignore
|
439
|
+
assert self.run is not None
|
440
|
+
res = self.run.log_code(root=None)
|
441
|
+
logger.info("saved code: %s", res) # type: ignore
|
442
|
+
if self.backend.interface is not None:
|
443
|
+
logger.info("pausing backend") # type: ignore
|
444
|
+
self.backend.interface.publish_pause()
|
445
|
+
|
446
|
+
def _resume_backend(self, *args: Any, **kwargs: Any) -> None: # noqa
|
447
|
+
if self.backend is not None and self.backend.interface is not None:
|
448
|
+
logger.info("resuming backend") # type: ignore
|
449
|
+
self.backend.interface.publish_resume()
|
450
|
+
|
451
|
+
def _jupyter_teardown(self) -> None:
|
452
|
+
"""Teardown hooks and display saving, called with wandb.finish."""
|
453
|
+
assert self.notebook
|
454
|
+
ipython = self.notebook.shell
|
455
|
+
self.notebook.save_history()
|
456
|
+
if self.notebook.save_ipynb():
|
457
|
+
assert self.run is not None
|
458
|
+
res = self.run.log_code(root=None)
|
459
|
+
logger.info("saved code and history: %s", res) # type: ignore
|
460
|
+
logger.info("cleaning up jupyter logic") # type: ignore
|
461
|
+
# because of how we bind our methods we manually find them to unregister
|
462
|
+
for hook in ipython.events.callbacks["pre_run_cell"]:
|
463
|
+
if "_resume_backend" in hook.__name__:
|
464
|
+
ipython.events.unregister("pre_run_cell", hook)
|
465
|
+
for hook in ipython.events.callbacks["post_run_cell"]:
|
466
|
+
if "_pause_backend" in hook.__name__:
|
467
|
+
ipython.events.unregister("post_run_cell", hook)
|
468
|
+
ipython.display_pub.publish = ipython.display_pub._orig_publish
|
469
|
+
del ipython.display_pub._orig_publish
|
470
|
+
|
471
|
+
def _jupyter_setup(self, settings: Settings) -> None:
|
472
|
+
"""Add hooks, and session history saving."""
|
473
|
+
self.notebook = wandb.jupyter.Notebook(settings) # type: ignore
|
474
|
+
ipython = self.notebook.shell
|
475
|
+
|
476
|
+
# Monkey patch ipython publish to capture displayed outputs
|
477
|
+
if not hasattr(ipython.display_pub, "_orig_publish"):
|
478
|
+
logger.info("configuring jupyter hooks %s", self) # type: ignore
|
479
|
+
ipython.display_pub._orig_publish = ipython.display_pub.publish
|
480
|
+
# Registering resume and pause hooks
|
481
|
+
|
482
|
+
ipython.events.register("pre_run_cell", self._resume_backend)
|
483
|
+
ipython.events.register("post_run_cell", self._pause_backend)
|
484
|
+
self._teardown_hooks.append(
|
485
|
+
TeardownHook(self._jupyter_teardown, TeardownStage.EARLY)
|
486
|
+
)
|
487
|
+
|
488
|
+
def publish(data, metadata=None, **kwargs) -> None: # type: ignore
|
489
|
+
ipython.display_pub._orig_publish(data, metadata=metadata, **kwargs)
|
490
|
+
assert self.notebook is not None
|
491
|
+
self.notebook.save_display(
|
492
|
+
ipython.execution_count, {"data": data, "metadata": metadata}
|
493
|
+
)
|
494
|
+
|
495
|
+
ipython.display_pub.publish = publish
|
496
|
+
|
497
|
+
def _log_setup(self, settings: Settings) -> None:
|
498
|
+
"""Set up logging from settings."""
|
499
|
+
filesystem.mkdir_exists_ok(os.path.dirname(settings.log_user))
|
500
|
+
filesystem.mkdir_exists_ok(os.path.dirname(settings.log_internal))
|
501
|
+
filesystem.mkdir_exists_ok(os.path.dirname(settings.sync_file))
|
502
|
+
filesystem.mkdir_exists_ok(settings.files_dir)
|
503
|
+
filesystem.mkdir_exists_ok(settings._tmp_code_dir)
|
504
|
+
|
505
|
+
if settings.symlink:
|
506
|
+
self._safe_symlink(
|
507
|
+
os.path.dirname(settings.sync_symlink_latest),
|
508
|
+
os.path.dirname(settings.sync_file),
|
509
|
+
os.path.basename(settings.sync_symlink_latest),
|
510
|
+
delete=True,
|
511
|
+
)
|
512
|
+
self._safe_symlink(
|
513
|
+
os.path.dirname(settings.log_symlink_user),
|
514
|
+
settings.log_user,
|
515
|
+
os.path.basename(settings.log_symlink_user),
|
516
|
+
delete=True,
|
517
|
+
)
|
518
|
+
self._safe_symlink(
|
519
|
+
os.path.dirname(settings.log_symlink_internal),
|
520
|
+
settings.log_internal,
|
521
|
+
os.path.basename(settings.log_symlink_internal),
|
522
|
+
delete=True,
|
523
|
+
)
|
524
|
+
|
525
|
+
_set_logger(logging.getLogger("wandb"))
|
526
|
+
self._enable_logging(settings.log_user)
|
527
|
+
|
528
|
+
assert self._wl
|
529
|
+
assert logger
|
530
|
+
|
531
|
+
self._wl._early_logger_flush(logger)
|
532
|
+
logger.info(f"Logging user logs to {settings.log_user}")
|
533
|
+
logger.info(f"Logging internal logs to {settings.log_internal}")
|
534
|
+
|
535
|
+
def _make_run_disabled(self) -> Run:
|
536
|
+
"""Returns a Run-like object where all methods are no-ops.
|
537
|
+
|
538
|
+
This method is used when wandb.init(mode="disabled") is called or WANDB_MODE=disabled
|
539
|
+
is set. It creates a Run object that mimics the behavior of a normal Run but doesn't
|
540
|
+
communicate with the W&B servers.
|
541
|
+
|
542
|
+
The returned Run object has all expected attributes and methods, but they are
|
543
|
+
no-op versions that don't perform any actual logging or communication.
|
544
|
+
"""
|
545
|
+
drun = Run(settings=Settings(mode="disabled", files_dir=tempfile.gettempdir()))
|
546
|
+
# config and summary objects
|
547
|
+
drun._config = wandb.sdk.wandb_config.Config()
|
548
|
+
drun._config.update(self.sweep_config)
|
549
|
+
drun._config.update(self.config)
|
550
|
+
drun.summary = SummaryDisabled() # type: ignore
|
551
|
+
# methods
|
552
|
+
drun.log = lambda data, *_, **__: drun.summary.update(data) # type: ignore
|
553
|
+
drun.finish = lambda *_, **__: module.unset_globals() # type: ignore
|
554
|
+
drun.join = drun.finish # type: ignore
|
555
|
+
drun.define_metric = lambda *_, **__: wandb.sdk.wandb_metric.Metric("dummy") # type: ignore
|
556
|
+
drun.save = lambda *_, **__: False # type: ignore
|
557
|
+
for symbol in (
|
558
|
+
"alert",
|
559
|
+
"finish_artifact",
|
560
|
+
"get_project_url",
|
561
|
+
"get_sweep_url",
|
562
|
+
"get_url",
|
563
|
+
"link_artifact",
|
564
|
+
"link_model",
|
565
|
+
"use_artifact",
|
566
|
+
"log_artifact",
|
567
|
+
"log_code",
|
568
|
+
"log_model",
|
569
|
+
"use_model",
|
570
|
+
"mark_preempting",
|
571
|
+
"plot_table",
|
572
|
+
"restore",
|
573
|
+
"status",
|
574
|
+
"watch",
|
575
|
+
"unwatch",
|
576
|
+
"upsert_artifact",
|
577
|
+
"_finish",
|
578
|
+
):
|
579
|
+
setattr(drun, symbol, lambda *_, **__: None) # type: ignore
|
580
|
+
# attributes
|
581
|
+
drun._step = 0
|
582
|
+
drun._attach_id = None
|
583
|
+
drun._run_obj = None
|
584
|
+
drun._run_id = runid.generate_id()
|
585
|
+
drun._name = "dummy-" + drun.id
|
586
|
+
drun._project = "dummy"
|
587
|
+
drun._entity = "dummy"
|
588
|
+
drun._tags = tuple()
|
589
|
+
drun._notes = None
|
590
|
+
drun._group = None
|
591
|
+
drun._start_time = time.time()
|
592
|
+
drun._starting_step = 0
|
593
|
+
module.set_global(
|
594
|
+
run=drun,
|
595
|
+
config=drun.config,
|
596
|
+
log=drun.log,
|
597
|
+
summary=drun.summary,
|
598
|
+
save=drun.save,
|
599
|
+
use_artifact=drun.use_artifact,
|
600
|
+
log_artifact=drun.log_artifact,
|
601
|
+
define_metric=drun.define_metric,
|
602
|
+
plot_table=drun.plot_table,
|
603
|
+
alert=drun.alert,
|
604
|
+
)
|
605
|
+
return drun
|
606
|
+
|
607
|
+
def _on_progress_init(self, handle: MailboxProgress) -> None:
|
608
|
+
assert self.printer
|
609
|
+
line = "Waiting for wandb.init()...\r"
|
610
|
+
percent_done = handle.percent_done
|
611
|
+
self.printer.progress_update(line, percent_done=percent_done)
|
612
|
+
|
613
|
+
def init(self) -> Run: # noqa: C901
|
614
|
+
if logger is None:
|
615
|
+
raise RuntimeError("Logger not initialized")
|
616
|
+
logger.info("calling init triggers")
|
617
|
+
trigger.call("on_init", **self.kwargs) # type: ignore
|
618
|
+
|
619
|
+
assert self.settings is not None
|
620
|
+
assert self._wl is not None
|
621
|
+
assert self._reporter is not None
|
622
|
+
|
623
|
+
logger.info(
|
624
|
+
f"wandb.init called with sweep_config: {self.sweep_config}\nconfig: {self.config}"
|
625
|
+
)
|
626
|
+
|
627
|
+
if self.settings._noop:
|
628
|
+
return self._make_run_disabled()
|
629
|
+
if self.settings.reinit or (
|
630
|
+
self.settings._jupyter and self.settings.reinit is not False
|
631
|
+
):
|
632
|
+
if len(self._wl._global_run_stack) > 0:
|
633
|
+
if len(self._wl._global_run_stack) > 1:
|
634
|
+
wandb.termwarn(
|
635
|
+
"If you want to track multiple runs concurrently in wandb, "
|
636
|
+
"you should use multi-processing not threads"
|
637
|
+
)
|
638
|
+
|
639
|
+
latest_run = self._wl._global_run_stack[-1]
|
640
|
+
|
641
|
+
logger.info(
|
642
|
+
f"re-initializing run, found existing run on stack: {latest_run._run_id}"
|
643
|
+
)
|
644
|
+
|
645
|
+
jupyter = self.settings._jupyter
|
646
|
+
if jupyter and not self.settings.silent:
|
647
|
+
ipython.display_html(
|
648
|
+
f"Finishing last run (ID:{latest_run._run_id}) before initializing another..."
|
649
|
+
)
|
650
|
+
|
651
|
+
latest_run.finish()
|
652
|
+
|
653
|
+
if jupyter and not self.settings.silent:
|
654
|
+
ipython.display_html(
|
655
|
+
f"Successfully finished last run (ID:{latest_run._run_id}). Initializing new run:<br/>"
|
656
|
+
)
|
657
|
+
elif isinstance(wandb.run, Run):
|
658
|
+
service = self._wl.service
|
659
|
+
# We shouldn't return a stale global run if we are in a new pid
|
660
|
+
if not service or os.getpid() == wandb.run._init_pid:
|
661
|
+
logger.info("wandb.init() called when a run is still active")
|
662
|
+
with telemetry.context() as tel:
|
663
|
+
tel.feature.init_return_run = True
|
664
|
+
return wandb.run
|
665
|
+
|
666
|
+
logger.info("starting backend")
|
667
|
+
|
668
|
+
service = self._wl.service
|
669
|
+
if service:
|
670
|
+
logger.info("sending inform_init request")
|
671
|
+
service.inform_init(
|
672
|
+
settings=self.settings.to_proto(),
|
673
|
+
run_id=self.settings.run_id,
|
674
|
+
)
|
675
|
+
|
676
|
+
mailbox = Mailbox()
|
677
|
+
backend = Backend(
|
678
|
+
settings=self.settings,
|
679
|
+
service=service,
|
680
|
+
mailbox=mailbox,
|
681
|
+
)
|
682
|
+
backend.ensure_launched()
|
683
|
+
logger.info("backend started and connected")
|
684
|
+
# Make sure we are logged in
|
685
|
+
# wandb_login._login(_backend=backend, _settings=self.settings)
|
686
|
+
|
687
|
+
# resuming needs access to the server, check server_status()?
|
688
|
+
run = Run(
|
689
|
+
config=self.config,
|
690
|
+
settings=self.settings,
|
691
|
+
sweep_config=self.sweep_config,
|
692
|
+
launch_config=self.launch_config,
|
693
|
+
)
|
694
|
+
|
695
|
+
# Populate initial telemetry
|
696
|
+
with telemetry.context(run=run, obj=self._init_telemetry_obj) as tel:
|
697
|
+
tel.cli_version = wandb.__version__
|
698
|
+
tel.python_version = platform.python_version()
|
699
|
+
tel.platform = f"{platform.system()}-{platform.machine()}".lower()
|
700
|
+
hf_version = _huggingface_version()
|
701
|
+
if hf_version:
|
702
|
+
tel.huggingface_version = hf_version
|
703
|
+
if self.settings._jupyter:
|
704
|
+
tel.env.jupyter = True
|
705
|
+
if self.settings._ipython:
|
706
|
+
tel.env.ipython = True
|
707
|
+
if self.settings._colab:
|
708
|
+
tel.env.colab = True
|
709
|
+
if self.settings._kaggle:
|
710
|
+
tel.env.kaggle = True
|
711
|
+
if self.settings._windows:
|
712
|
+
tel.env.windows = True
|
713
|
+
|
714
|
+
if self.settings.launch:
|
715
|
+
tel.feature.launch = True
|
716
|
+
|
717
|
+
for module_name in telemetry.list_telemetry_imports(only_imported=True):
|
718
|
+
setattr(tel.imports_init, module_name, True)
|
719
|
+
|
720
|
+
# probe the active start method
|
721
|
+
active_start_method: Optional[str] = None
|
722
|
+
if self.settings.start_method == "thread":
|
723
|
+
active_start_method = self.settings.start_method
|
724
|
+
else:
|
725
|
+
active_start_method = getattr(
|
726
|
+
backend._multiprocessing, "get_start_method", lambda: None
|
727
|
+
)()
|
728
|
+
|
729
|
+
if active_start_method == "spawn":
|
730
|
+
tel.env.start_spawn = True
|
731
|
+
elif active_start_method == "fork":
|
732
|
+
tel.env.start_fork = True
|
733
|
+
elif active_start_method == "forkserver":
|
734
|
+
tel.env.start_forkserver = True
|
735
|
+
elif active_start_method == "thread":
|
736
|
+
tel.env.start_thread = True
|
737
|
+
|
738
|
+
if os.environ.get("PEX"):
|
739
|
+
tel.env.pex = True
|
740
|
+
|
741
|
+
if self.settings._aws_lambda:
|
742
|
+
tel.env.aws_lambda = True
|
743
|
+
|
744
|
+
if os.environ.get(wandb.env._DISABLE_SERVICE):
|
745
|
+
tel.feature.service_disabled = True
|
746
|
+
|
747
|
+
if service:
|
748
|
+
tel.feature.service = True
|
749
|
+
if self.settings._flow_control_disabled:
|
750
|
+
tel.feature.flow_control_disabled = True
|
751
|
+
if self.settings._flow_control_custom:
|
752
|
+
tel.feature.flow_control_custom = True
|
753
|
+
if not self.settings._require_legacy_service:
|
754
|
+
tel.feature.core = True
|
755
|
+
if self.settings._shared:
|
756
|
+
wandb.termwarn(
|
757
|
+
"The `_shared` feature is experimental and may change. "
|
758
|
+
"Please contact support@wandb.com for guidance and to report any issues."
|
759
|
+
)
|
760
|
+
tel.feature.shared_mode = True
|
761
|
+
|
762
|
+
tel.env.maybe_mp = _maybe_mp_process(backend)
|
763
|
+
|
764
|
+
if not self.settings.label_disable:
|
765
|
+
if self.notebook:
|
766
|
+
run._label_probe_notebook(self.notebook)
|
767
|
+
else:
|
768
|
+
run._label_probe_main()
|
769
|
+
|
770
|
+
for deprecated_feature, msg in self.deprecated_features_used.items():
|
771
|
+
warning_message = f"`{deprecated_feature}` is deprecated. {msg}"
|
772
|
+
deprecate(
|
773
|
+
field_name=getattr(Deprecated, "init__" + deprecated_feature),
|
774
|
+
warning_message=warning_message,
|
775
|
+
run=run,
|
776
|
+
)
|
777
|
+
|
778
|
+
logger.info("updated telemetry")
|
779
|
+
|
780
|
+
run._set_library(self._wl)
|
781
|
+
run._set_backend(backend)
|
782
|
+
run._set_reporter(self._reporter)
|
783
|
+
run._set_teardown_hooks(self._teardown_hooks)
|
784
|
+
|
785
|
+
backend._hack_set_run(run)
|
786
|
+
assert backend.interface
|
787
|
+
mailbox.enable_keepalive()
|
788
|
+
backend.interface.publish_header()
|
789
|
+
|
790
|
+
# Using GitRepo() blocks & can be slow, depending on user's current git setup.
|
791
|
+
# We don't want to block run initialization/start request, so populate run's git
|
792
|
+
# info beforehand.
|
793
|
+
if not self.settings.disable_git:
|
794
|
+
run._populate_git_info()
|
795
|
+
|
796
|
+
run_result: Optional[pb.RunUpdateResult] = None
|
797
|
+
|
798
|
+
if self.settings._offline:
|
799
|
+
with telemetry.context(run=run) as tel:
|
800
|
+
tel.feature.offline = True
|
801
|
+
|
802
|
+
if self.settings.resume:
|
803
|
+
wandb.termwarn(
|
804
|
+
"`resume` will be ignored since W&B syncing is set to `offline`. "
|
805
|
+
f"Starting a new run with run id {run.id}."
|
806
|
+
)
|
807
|
+
error: Optional[wandb.errors.Error] = None
|
808
|
+
|
809
|
+
timeout = self.settings.init_timeout
|
810
|
+
|
811
|
+
logger.info(f"communicating run to backend with {timeout} second timeout")
|
812
|
+
|
813
|
+
run_init_handle = backend.interface.deliver_run(run)
|
814
|
+
result = run_init_handle.wait(
|
815
|
+
timeout=timeout,
|
816
|
+
on_progress=self._on_progress_init,
|
817
|
+
cancel=True,
|
818
|
+
)
|
819
|
+
if result:
|
820
|
+
run_result = result.run_result
|
821
|
+
|
822
|
+
if run_result is None:
|
823
|
+
error_message = (
|
824
|
+
f"Run initialization has timed out after {timeout} sec. "
|
825
|
+
f"\nPlease refer to the documentation for additional information: {wburls.get('doc_start_err')}"
|
826
|
+
)
|
827
|
+
# We're not certain whether the error we encountered is due to an issue
|
828
|
+
# with the server (a "CommError") or if it's a problem within the SDK (an "Error").
|
829
|
+
# This means that the error could be a result of the server being unresponsive,
|
830
|
+
# or it could be because we were unable to communicate with the wandb service.
|
831
|
+
error = CommError(error_message)
|
832
|
+
run_init_handle._cancel()
|
833
|
+
elif run_result.HasField("error"):
|
834
|
+
error = ProtobufErrorHandler.to_exception(run_result.error)
|
835
|
+
|
836
|
+
if error is not None:
|
837
|
+
logger.error(f"encountered error: {error}")
|
838
|
+
if not service:
|
839
|
+
# Shutdown the backend and get rid of the logger
|
840
|
+
# we don't need to do console cleanup at this point
|
841
|
+
backend.cleanup()
|
842
|
+
self.teardown()
|
843
|
+
raise error
|
844
|
+
|
845
|
+
assert run_result is not None # for mypy
|
846
|
+
|
847
|
+
if not run_result.HasField("run"):
|
848
|
+
raise Error(
|
849
|
+
"It appears that something have gone wrong during the program execution as an unexpected missing field was encountered. "
|
850
|
+
"(run_result is missing the 'run' field)"
|
851
|
+
)
|
852
|
+
|
853
|
+
if run_result.run.resumed:
|
854
|
+
logger.info("run resumed")
|
855
|
+
with telemetry.context(run=run) as tel:
|
856
|
+
tel.feature.resumed = run_result.run.resumed
|
857
|
+
|
858
|
+
run._set_run_obj(run_result.run)
|
859
|
+
|
860
|
+
run._on_init()
|
861
|
+
|
862
|
+
logger.info("starting run threads in backend")
|
863
|
+
# initiate run (stats and metadata probing)
|
864
|
+
|
865
|
+
if service:
|
866
|
+
service.inform_start(
|
867
|
+
settings=self.settings.to_proto(),
|
868
|
+
run_id=self.settings.run_id,
|
869
|
+
)
|
870
|
+
|
871
|
+
assert backend.interface
|
872
|
+
assert run._run_obj
|
873
|
+
|
874
|
+
run_start_handle = backend.interface.deliver_run_start(run._run_obj)
|
875
|
+
# TODO: add progress to let user know we are doing something
|
876
|
+
run_start_result = run_start_handle.wait(timeout=30)
|
877
|
+
if run_start_result is None:
|
878
|
+
run_start_handle.abandon()
|
879
|
+
|
880
|
+
assert self._wl is not None
|
881
|
+
self._wl._global_run_stack.append(run)
|
882
|
+
self.run = run
|
883
|
+
|
884
|
+
run._handle_launch_artifact_overrides()
|
885
|
+
if (
|
886
|
+
self.settings.launch
|
887
|
+
and self.settings.launch_config_path
|
888
|
+
and os.path.exists(self.settings.launch_config_path)
|
889
|
+
):
|
890
|
+
run.save(self.settings.launch_config_path)
|
891
|
+
# put artifacts in run config here
|
892
|
+
# since doing so earlier will cause an error
|
893
|
+
# as the run is not upserted
|
894
|
+
for k, v in self.init_artifact_config.items():
|
895
|
+
run.config.update({k: v}, allow_val_change=True)
|
896
|
+
job_artifact = run._launch_artifact_mapping.get(
|
897
|
+
wandb.util.LAUNCH_JOB_ARTIFACT_SLOT_NAME
|
898
|
+
)
|
899
|
+
if job_artifact:
|
900
|
+
run.use_artifact(job_artifact)
|
901
|
+
|
902
|
+
self.backend = backend
|
903
|
+
assert self._reporter
|
904
|
+
self._reporter.set_context(run=run)
|
905
|
+
run._on_start()
|
906
|
+
logger.info("run started, returning control to user process")
|
907
|
+
return run
|
908
|
+
|
909
|
+
|
910
|
+
def _attach(
|
911
|
+
attach_id: Optional[str] = None,
|
912
|
+
run_id: Optional[str] = None,
|
913
|
+
*,
|
914
|
+
run: Optional["Run"] = None,
|
915
|
+
) -> Optional[Run]:
|
916
|
+
"""Attach to a run currently executing in another process/thread.
|
917
|
+
|
918
|
+
Arguments:
|
919
|
+
attach_id: (str, optional) The id of the run or an attach identifier
|
920
|
+
that maps to a run.
|
921
|
+
run_id: (str, optional) The id of the run to attach to.
|
922
|
+
run: (Run, optional) The run instance to attach
|
923
|
+
"""
|
924
|
+
attach_id = attach_id or run_id
|
925
|
+
if not ((attach_id is None) ^ (run is None)):
|
926
|
+
raise UsageError("Either (`attach_id` or `run_id`) or `run` must be specified")
|
927
|
+
|
928
|
+
attach_id = attach_id or (run._attach_id if run else None)
|
929
|
+
|
930
|
+
if attach_id is None:
|
931
|
+
raise UsageError(
|
932
|
+
"Either `attach_id` or `run_id` must be specified or `run` must have `_attach_id`"
|
933
|
+
)
|
934
|
+
wandb._assert_is_user_process() # type: ignore
|
935
|
+
|
936
|
+
_wl = wandb_setup._setup()
|
937
|
+
assert _wl
|
938
|
+
|
939
|
+
_set_logger(_wl._get_logger())
|
940
|
+
if logger is None:
|
941
|
+
raise UsageError("logger is not initialized")
|
942
|
+
|
943
|
+
service = _wl.service
|
944
|
+
if not service:
|
945
|
+
raise UsageError(f"Unable to attach to run {attach_id} (no service process)")
|
946
|
+
|
947
|
+
try:
|
948
|
+
attach_settings = service.inform_attach(attach_id=attach_id)
|
949
|
+
except Exception as e:
|
950
|
+
raise UsageError(f"Unable to attach to run {attach_id}") from e
|
951
|
+
|
952
|
+
settings: Settings = copy.copy(_wl._settings)
|
953
|
+
|
954
|
+
settings.update(
|
955
|
+
{
|
956
|
+
"run_id": attach_id,
|
957
|
+
"_start_time": attach_settings._start_time.value,
|
958
|
+
"_start_datetime": attach_settings._start_datetime.value,
|
959
|
+
"_offline": attach_settings._offline.value,
|
960
|
+
},
|
961
|
+
source=Source.INIT,
|
962
|
+
)
|
963
|
+
|
964
|
+
# TODO: consolidate this codepath with wandb.init()
|
965
|
+
mailbox = Mailbox()
|
966
|
+
backend = Backend(settings=settings, service=service, mailbox=mailbox)
|
967
|
+
backend.ensure_launched()
|
968
|
+
logger.info("attach backend started and connected")
|
969
|
+
|
970
|
+
if run is None:
|
971
|
+
run = Run(settings=settings)
|
972
|
+
else:
|
973
|
+
run._init(settings=settings)
|
974
|
+
run._set_library(_wl)
|
975
|
+
run._set_backend(backend)
|
976
|
+
backend._hack_set_run(run)
|
977
|
+
assert backend.interface
|
978
|
+
|
979
|
+
mailbox.enable_keepalive()
|
980
|
+
|
981
|
+
attach_handle = backend.interface.deliver_attach(attach_id)
|
982
|
+
# TODO: add progress to let user know we are doing something
|
983
|
+
attach_result = attach_handle.wait(timeout=30)
|
984
|
+
if not attach_result:
|
985
|
+
attach_handle.abandon()
|
986
|
+
raise UsageError("Timeout attaching to run")
|
987
|
+
attach_response = attach_result.response.attach_response
|
988
|
+
if attach_response.error and attach_response.error.message:
|
989
|
+
raise UsageError(f"Failed to attach to run: {attach_response.error.message}")
|
990
|
+
|
991
|
+
run._set_run_obj(attach_response.run)
|
992
|
+
run._on_attach()
|
993
|
+
return run
|
994
|
+
|
995
|
+
|
996
|
+
def init(
|
997
|
+
job_type: Optional[str] = None,
|
998
|
+
dir: Optional[StrPath] = None,
|
999
|
+
config: Union[Dict, str, None] = None,
|
1000
|
+
project: Optional[str] = None,
|
1001
|
+
entity: Optional[str] = None,
|
1002
|
+
reinit: Optional[bool] = None,
|
1003
|
+
tags: Optional[Sequence] = None,
|
1004
|
+
group: Optional[str] = None,
|
1005
|
+
name: Optional[str] = None,
|
1006
|
+
notes: Optional[str] = None,
|
1007
|
+
magic: Optional[Union[dict, str, bool]] = None,
|
1008
|
+
config_exclude_keys: Optional[List[str]] = None,
|
1009
|
+
config_include_keys: Optional[List[str]] = None,
|
1010
|
+
anonymous: Optional[str] = None,
|
1011
|
+
mode: Optional[str] = None,
|
1012
|
+
allow_val_change: Optional[bool] = None,
|
1013
|
+
resume: Optional[Union[bool, str]] = None,
|
1014
|
+
force: Optional[bool] = None,
|
1015
|
+
tensorboard: Optional[bool] = None, # alias for sync_tensorboard
|
1016
|
+
sync_tensorboard: Optional[bool] = None,
|
1017
|
+
monitor_gym: Optional[bool] = None,
|
1018
|
+
save_code: Optional[bool] = None,
|
1019
|
+
id: Optional[str] = None,
|
1020
|
+
fork_from: Optional[str] = None,
|
1021
|
+
resume_from: Optional[str] = None,
|
1022
|
+
settings: Union[Settings, Dict[str, Any], None] = None,
|
1023
|
+
) -> Run:
|
1024
|
+
r"""Start a new run to track and log to W&B.
|
1025
|
+
|
1026
|
+
In an ML training pipeline, you could add `wandb.init()`
|
1027
|
+
to the beginning of your training script as well as your evaluation
|
1028
|
+
script, and each piece would be tracked as a run in W&B.
|
1029
|
+
|
1030
|
+
`wandb.init()` spawns a new background process to log data to a run, and it
|
1031
|
+
also syncs data to wandb.ai by default, so you can see live visualizations.
|
1032
|
+
|
1033
|
+
Call `wandb.init()` to start a run before logging data with `wandb.log()`:
|
1034
|
+
<!--yeadoc-test:init-method-log-->
|
1035
|
+
```python
|
1036
|
+
import wandb
|
1037
|
+
|
1038
|
+
wandb.init()
|
1039
|
+
# ... calculate metrics, generate media
|
1040
|
+
wandb.log({"accuracy": 0.9})
|
1041
|
+
```
|
1042
|
+
|
1043
|
+
`wandb.init()` returns a run object, and you can also access the run object
|
1044
|
+
via `wandb.run`:
|
1045
|
+
<!--yeadoc-test:init-and-assert-global-->
|
1046
|
+
```python
|
1047
|
+
import wandb
|
1048
|
+
|
1049
|
+
run = wandb.init()
|
1050
|
+
|
1051
|
+
assert run is wandb.run
|
1052
|
+
```
|
1053
|
+
|
1054
|
+
At the end of your script, we will automatically call `wandb.finish` to
|
1055
|
+
finalize and cleanup the run. However, if you call `wandb.init` from a
|
1056
|
+
child process, you must explicitly call `wandb.finish` at the end of the
|
1057
|
+
child process.
|
1058
|
+
|
1059
|
+
For more on using `wandb.init()`, including detailed examples, check out our
|
1060
|
+
[guide and FAQs](https://docs.wandb.ai/guides/track/launch).
|
1061
|
+
|
1062
|
+
Arguments:
|
1063
|
+
project: (str, optional) The name of the project where you're sending
|
1064
|
+
the new run. If the project is not specified, we will try to infer
|
1065
|
+
the project name from git root or the current program file. If we
|
1066
|
+
can't infer the project name, we will default to `"uncategorized"`.
|
1067
|
+
entity: (str, optional) An entity is a username or team name where
|
1068
|
+
you're sending runs. This entity must exist before you can send runs
|
1069
|
+
there, so make sure to create your account or team in the UI before
|
1070
|
+
starting to log runs.
|
1071
|
+
If you don't specify an entity, the run will be sent to your default
|
1072
|
+
entity. Change your default entity
|
1073
|
+
in [your settings](https://wandb.ai/settings) under "default location
|
1074
|
+
to create new projects".
|
1075
|
+
config: (dict, argparse, absl.flags, str, optional)
|
1076
|
+
This sets `wandb.config`, a dictionary-like object for saving inputs
|
1077
|
+
to your job, like hyperparameters for a model or settings for a data
|
1078
|
+
preprocessing job. The config will show up in a table in the UI that
|
1079
|
+
you can use to group, filter, and sort runs. Keys should not contain
|
1080
|
+
`.` in their names, and values should be under 10 MB.
|
1081
|
+
If dict, argparse or absl.flags: will load the key value pairs into
|
1082
|
+
the `wandb.config` object.
|
1083
|
+
If str: will look for a yaml file by that name, and load config from
|
1084
|
+
that file into the `wandb.config` object.
|
1085
|
+
save_code: (bool, optional) Turn this on to save the main script or
|
1086
|
+
notebook to W&B. This is valuable for improving experiment
|
1087
|
+
reproducibility and to diff code across experiments in the UI. By
|
1088
|
+
default this is off, but you can flip the default behavior to on
|
1089
|
+
in [your settings page](https://wandb.ai/settings).
|
1090
|
+
group: (str, optional) Specify a group to organize individual runs into
|
1091
|
+
a larger experiment. For example, you might be doing cross
|
1092
|
+
validation, or you might have multiple jobs that train and evaluate
|
1093
|
+
a model against different test sets. Group gives you a way to
|
1094
|
+
organize runs together into a larger whole, and you can toggle this
|
1095
|
+
on and off in the UI. For more details, see our
|
1096
|
+
[guide to grouping runs](https://docs.wandb.com/guides/runs/grouping).
|
1097
|
+
job_type: (str, optional) Specify the type of run, which is useful when
|
1098
|
+
you're grouping runs together into larger experiments using group.
|
1099
|
+
For example, you might have multiple jobs in a group, with job types
|
1100
|
+
like train and eval. Setting this makes it easy to filter and group
|
1101
|
+
similar runs together in the UI so you can compare apples to apples.
|
1102
|
+
tags: (list, optional) A list of strings, which will populate the list
|
1103
|
+
of tags on this run in the UI. Tags are useful for organizing runs
|
1104
|
+
together, or applying temporary labels like "baseline" or
|
1105
|
+
"production". It's easy to add and remove tags in the UI, or filter
|
1106
|
+
down to just runs with a specific tag.
|
1107
|
+
If you are resuming a run, its tags will be overwritten by the tags
|
1108
|
+
you pass to `wandb.init()`. If you want to add tags to a resumed run
|
1109
|
+
without overwriting its existing tags, use `run.tags += ["new_tag"]`
|
1110
|
+
after `wandb.init()`.
|
1111
|
+
name: (str, optional) A short display name for this run, which is how
|
1112
|
+
you'll identify this run in the UI. By default, we generate a random
|
1113
|
+
two-word name that lets you easily cross-reference runs from the
|
1114
|
+
table to charts. Keeping these run names short makes the chart
|
1115
|
+
legends and tables easier to read. If you're looking for a place to
|
1116
|
+
save your hyperparameters, we recommend saving those in config.
|
1117
|
+
notes: (str, optional) A longer description of the run, like a `-m` commit
|
1118
|
+
message in git. This helps you remember what you were doing when you
|
1119
|
+
ran this run.
|
1120
|
+
dir: (str or pathlib.Path, optional) An absolute path to a directory where
|
1121
|
+
metadata will be stored. When you call `download()` on an artifact,
|
1122
|
+
this is the directory where downloaded files will be saved. By default,
|
1123
|
+
this is the `./wandb` directory.
|
1124
|
+
resume: (bool, str, optional) Sets the resuming behavior. Options:
|
1125
|
+
`"allow"`, `"must"`, `"never"`, `"auto"` or `None`. Defaults to `None`.
|
1126
|
+
Cases:
|
1127
|
+
- `None` (default): If the new run has the same ID as a previous run,
|
1128
|
+
this run overwrites that data.
|
1129
|
+
- `"auto"` (or `True`): if the previous run on this machine crashed,
|
1130
|
+
automatically resume it. Otherwise, start a new run.
|
1131
|
+
- `"allow"`: if id is set with `init(id="UNIQUE_ID")` or
|
1132
|
+
`WANDB_RUN_ID="UNIQUE_ID"` and it is identical to a previous run,
|
1133
|
+
wandb will automatically resume the run with that id. Otherwise,
|
1134
|
+
wandb will start a new run.
|
1135
|
+
- `"never"`: if id is set with `init(id="UNIQUE_ID")` or
|
1136
|
+
`WANDB_RUN_ID="UNIQUE_ID"` and it is identical to a previous run,
|
1137
|
+
wandb will crash.
|
1138
|
+
- `"must"`: if id is set with `init(id="UNIQUE_ID")` or
|
1139
|
+
`WANDB_RUN_ID="UNIQUE_ID"` and it is identical to a previous run,
|
1140
|
+
wandb will automatically resume the run with the id. Otherwise,
|
1141
|
+
wandb will crash.
|
1142
|
+
See [our guide to resuming runs](https://docs.wandb.com/guides/runs/resuming)
|
1143
|
+
for more.
|
1144
|
+
reinit: (bool, optional) Allow multiple `wandb.init()` calls in the same
|
1145
|
+
process. (default: `False`)
|
1146
|
+
magic: (bool, dict, or str, optional) The bool controls whether we try to
|
1147
|
+
auto-instrument your script, capturing basic details of your run
|
1148
|
+
without you having to add more wandb code. (default: `False`)
|
1149
|
+
You can also pass a dict, json string, or yaml filename.
|
1150
|
+
config_exclude_keys: (list, optional) string keys to exclude from
|
1151
|
+
`wandb.config`.
|
1152
|
+
config_include_keys: (list, optional) string keys to include in
|
1153
|
+
`wandb.config`.
|
1154
|
+
anonymous: (str, optional) Controls anonymous data logging. Options:
|
1155
|
+
- `"never"` (default): requires you to link your W&B account before
|
1156
|
+
tracking the run, so you don't accidentally create an anonymous
|
1157
|
+
run.
|
1158
|
+
- `"allow"`: lets a logged-in user track runs with their account, but
|
1159
|
+
lets someone who is running the script without a W&B account see
|
1160
|
+
the charts in the UI.
|
1161
|
+
- `"must"`: sends the run to an anonymous account instead of to a
|
1162
|
+
signed-up user account.
|
1163
|
+
mode: (str, optional) Can be `"online"`, `"offline"` or `"disabled"`. Defaults to
|
1164
|
+
online.
|
1165
|
+
allow_val_change: (bool, optional) Whether to allow config values to
|
1166
|
+
change after setting the keys once. By default, we throw an exception
|
1167
|
+
if a config value is overwritten. If you want to track something
|
1168
|
+
like a varying learning rate at multiple times during training, use
|
1169
|
+
`wandb.log()` instead. (default: `False` in scripts, `True` in Jupyter)
|
1170
|
+
force: (bool, optional) If `True`, this crashes the script if a user isn't
|
1171
|
+
logged in to W&B. If `False`, this will let the script run in offline
|
1172
|
+
mode if a user isn't logged in to W&B. (default: `False`)
|
1173
|
+
sync_tensorboard: (bool, optional) Synchronize wandb logs from tensorboard or
|
1174
|
+
tensorboardX and save the relevant events file. (default: `False`)
|
1175
|
+
tensorboard: (bool, optional) Alias for `sync_tensorboard`, deprecated.
|
1176
|
+
monitor_gym: (bool, optional) Automatically log videos of environment when
|
1177
|
+
using OpenAI Gym. (default: `False`)
|
1178
|
+
See [our guide to this integration](https://docs.wandb.com/guides/integrations/openai-gym).
|
1179
|
+
id: (str, optional) A unique ID for this run, used for resuming. It must
|
1180
|
+
be unique in the project, and if you delete a run you can't reuse
|
1181
|
+
the ID. Use the `name` field for a short descriptive name, or `config`
|
1182
|
+
for saving hyperparameters to compare across runs. The ID cannot
|
1183
|
+
contain the following special characters: `/\#?%:`.
|
1184
|
+
See [our guide to resuming runs](https://docs.wandb.com/guides/runs/resuming).
|
1185
|
+
fork_from: (str, optional) A string with the format {run_id}?_step={step} describing
|
1186
|
+
a moment in a previous run to fork a new run from. Creates a new run that picks up
|
1187
|
+
logging history from the specified run at the specified moment. The target run must
|
1188
|
+
be in the current project. Example: `fork_from="my-run-id?_step=1234"`.
|
1189
|
+
resume_from: (str, optional) A string with the format {run_id}?_step={step} describing
|
1190
|
+
a moment in a previous run to resume a run from. This allows users to truncate
|
1191
|
+
the history logged to a run at an intermediate step and resume logging from that step.
|
1192
|
+
It uses run forking under the hood. The target run must be in the
|
1193
|
+
current project. Example: `resume_from="my-run-id?_step=1234"`.
|
1194
|
+
settings: (dict, wandb.Settings, optional) Settings to use for this run. (default: None)
|
1195
|
+
|
1196
|
+
Examples:
|
1197
|
+
### Set where the run is logged
|
1198
|
+
|
1199
|
+
You can change where the run is logged, just like changing
|
1200
|
+
the organization, repository, and branch in git:
|
1201
|
+
```python
|
1202
|
+
import wandb
|
1203
|
+
|
1204
|
+
user = "geoff"
|
1205
|
+
project = "capsules"
|
1206
|
+
display_name = "experiment-2021-10-31"
|
1207
|
+
|
1208
|
+
wandb.init(entity=user, project=project, name=display_name)
|
1209
|
+
```
|
1210
|
+
|
1211
|
+
### Add metadata about the run to the config
|
1212
|
+
|
1213
|
+
Pass a dictionary-style object as the `config` keyword argument to add
|
1214
|
+
metadata, like hyperparameters, to your run.
|
1215
|
+
<!--yeadoc-test:init-set-config-->
|
1216
|
+
```python
|
1217
|
+
import wandb
|
1218
|
+
|
1219
|
+
config = {"lr": 3e-4, "batch_size": 32}
|
1220
|
+
config.update({"architecture": "resnet", "depth": 34})
|
1221
|
+
wandb.init(config=config)
|
1222
|
+
```
|
1223
|
+
|
1224
|
+
Raises:
|
1225
|
+
Error: if some unknown or internal error happened during the run initialization.
|
1226
|
+
AuthenticationError: if the user failed to provide valid credentials.
|
1227
|
+
CommError: if there was a problem communicating with the WandB server.
|
1228
|
+
UsageError: if the user provided invalid arguments.
|
1229
|
+
KeyboardInterrupt: if user interrupts the run.
|
1230
|
+
|
1231
|
+
Returns:
|
1232
|
+
A `Run` object.
|
1233
|
+
"""
|
1234
|
+
wandb._assert_is_user_process() # type: ignore
|
1235
|
+
|
1236
|
+
kwargs = dict(locals())
|
1237
|
+
|
1238
|
+
num_resume_options_set = (
|
1239
|
+
(fork_from is not None) # wrap
|
1240
|
+
+ (resume is not None)
|
1241
|
+
+ (resume_from is not None)
|
1242
|
+
)
|
1243
|
+
if num_resume_options_set > 1:
|
1244
|
+
raise ValueError(
|
1245
|
+
"You cannot specify more than one of `fork_from`, `resume`, or `resume_from`"
|
1246
|
+
)
|
1247
|
+
|
1248
|
+
try:
|
1249
|
+
wi = _WandbInit()
|
1250
|
+
wi.setup(kwargs)
|
1251
|
+
return wi.init()
|
1252
|
+
|
1253
|
+
except KeyboardInterrupt as e:
|
1254
|
+
if logger is not None:
|
1255
|
+
logger.warning("interrupted", exc_info=e)
|
1256
|
+
|
1257
|
+
raise
|
1258
|
+
|
1259
|
+
except Exception as e:
|
1260
|
+
if logger is not None:
|
1261
|
+
logger.exception("error in wandb.init()", exc_info=e)
|
1262
|
+
|
1263
|
+
# Need to build delay into this sentry capture because our exit hooks
|
1264
|
+
# mess with sentry's ability to send out errors before the program ends.
|
1265
|
+
wandb._sentry.reraise(e)
|
1266
|
+
raise AssertionError() # unreachable
|