wandb 0.18.2__py3-none-musllinux_1_2_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package_readme.md +89 -0
- wandb/__init__.py +245 -0
- wandb/__init__.pyi +1139 -0
- wandb/__main__.py +3 -0
- wandb/_globals.py +19 -0
- wandb/agents/__init__.py +0 -0
- wandb/agents/pyagent.py +363 -0
- wandb/analytics/__init__.py +3 -0
- wandb/analytics/sentry.py +266 -0
- wandb/apis/__init__.py +48 -0
- wandb/apis/attrs.py +40 -0
- wandb/apis/importers/__init__.py +1 -0
- wandb/apis/importers/internals/internal.py +385 -0
- wandb/apis/importers/internals/protocols.py +99 -0
- wandb/apis/importers/internals/util.py +78 -0
- wandb/apis/importers/mlflow.py +254 -0
- wandb/apis/importers/validation.py +108 -0
- wandb/apis/importers/wandb.py +1603 -0
- wandb/apis/internal.py +232 -0
- wandb/apis/normalize.py +89 -0
- wandb/apis/paginator.py +81 -0
- wandb/apis/public/__init__.py +34 -0
- wandb/apis/public/api.py +1305 -0
- wandb/apis/public/artifacts.py +1090 -0
- wandb/apis/public/const.py +4 -0
- wandb/apis/public/files.py +195 -0
- wandb/apis/public/history.py +149 -0
- wandb/apis/public/jobs.py +659 -0
- wandb/apis/public/projects.py +154 -0
- wandb/apis/public/query_generator.py +166 -0
- wandb/apis/public/reports.py +469 -0
- wandb/apis/public/runs.py +914 -0
- wandb/apis/public/sweeps.py +240 -0
- wandb/apis/public/teams.py +198 -0
- wandb/apis/public/users.py +136 -0
- wandb/apis/reports/__init__.py +1 -0
- wandb/apis/reports/v1/__init__.py +8 -0
- wandb/apis/reports/v2/__init__.py +8 -0
- wandb/apis/workspaces/__init__.py +8 -0
- wandb/beta/workflows.py +288 -0
- wandb/bin/nvidia_gpu_stats +0 -0
- wandb/bin/wandb-core +0 -0
- wandb/cli/__init__.py +0 -0
- wandb/cli/cli.py +3004 -0
- wandb/data_types.py +63 -0
- wandb/docker/__init__.py +342 -0
- wandb/docker/auth.py +436 -0
- wandb/docker/wandb-entrypoint.sh +33 -0
- wandb/docker/www_authenticate.py +94 -0
- wandb/env.py +514 -0
- wandb/errors/__init__.py +17 -0
- wandb/errors/errors.py +37 -0
- wandb/errors/term.py +103 -0
- wandb/errors/util.py +57 -0
- wandb/errors/warnings.py +2 -0
- wandb/filesync/__init__.py +0 -0
- wandb/filesync/dir_watcher.py +403 -0
- wandb/filesync/stats.py +100 -0
- wandb/filesync/step_checksum.py +142 -0
- wandb/filesync/step_prepare.py +179 -0
- wandb/filesync/step_upload.py +290 -0
- wandb/filesync/upload_job.py +142 -0
- wandb/integration/__init__.py +0 -0
- wandb/integration/catboost/__init__.py +5 -0
- wandb/integration/catboost/catboost.py +178 -0
- wandb/integration/cohere/__init__.py +3 -0
- wandb/integration/cohere/cohere.py +21 -0
- wandb/integration/cohere/resolver.py +347 -0
- wandb/integration/diffusers/__init__.py +3 -0
- wandb/integration/diffusers/autologger.py +76 -0
- wandb/integration/diffusers/pipeline_resolver.py +50 -0
- wandb/integration/diffusers/resolvers/__init__.py +9 -0
- wandb/integration/diffusers/resolvers/multimodal.py +882 -0
- wandb/integration/diffusers/resolvers/utils.py +102 -0
- wandb/integration/fastai/__init__.py +249 -0
- wandb/integration/gym/__init__.py +105 -0
- wandb/integration/huggingface/__init__.py +3 -0
- wandb/integration/huggingface/huggingface.py +18 -0
- wandb/integration/huggingface/resolver.py +213 -0
- wandb/integration/keras/__init__.py +11 -0
- wandb/integration/keras/callbacks/__init__.py +5 -0
- wandb/integration/keras/callbacks/metrics_logger.py +136 -0
- wandb/integration/keras/callbacks/model_checkpoint.py +195 -0
- wandb/integration/keras/callbacks/tables_builder.py +226 -0
- wandb/integration/keras/keras.py +1091 -0
- wandb/integration/kfp/__init__.py +6 -0
- wandb/integration/kfp/helpers.py +28 -0
- wandb/integration/kfp/kfp_patch.py +324 -0
- wandb/integration/kfp/wandb_logging.py +182 -0
- wandb/integration/langchain/__init__.py +3 -0
- wandb/integration/langchain/wandb_tracer.py +48 -0
- wandb/integration/lightgbm/__init__.py +239 -0
- wandb/integration/lightning/__init__.py +0 -0
- wandb/integration/lightning/fabric/__init__.py +3 -0
- wandb/integration/lightning/fabric/logger.py +762 -0
- wandb/integration/magic.py +556 -0
- wandb/integration/metaflow/__init__.py +3 -0
- wandb/integration/metaflow/metaflow.py +383 -0
- wandb/integration/openai/__init__.py +3 -0
- wandb/integration/openai/fine_tuning.py +480 -0
- wandb/integration/openai/openai.py +22 -0
- wandb/integration/openai/resolver.py +240 -0
- wandb/integration/prodigy/__init__.py +3 -0
- wandb/integration/prodigy/prodigy.py +299 -0
- wandb/integration/sacred/__init__.py +117 -0
- wandb/integration/sagemaker/__init__.py +12 -0
- wandb/integration/sagemaker/auth.py +28 -0
- wandb/integration/sagemaker/config.py +49 -0
- wandb/integration/sagemaker/files.py +3 -0
- wandb/integration/sagemaker/resources.py +34 -0
- wandb/integration/sb3/__init__.py +3 -0
- wandb/integration/sb3/sb3.py +153 -0
- wandb/integration/sklearn/__init__.py +37 -0
- wandb/integration/sklearn/calculate/__init__.py +32 -0
- wandb/integration/sklearn/calculate/calibration_curves.py +125 -0
- wandb/integration/sklearn/calculate/class_proportions.py +68 -0
- wandb/integration/sklearn/calculate/confusion_matrix.py +93 -0
- wandb/integration/sklearn/calculate/decision_boundaries.py +40 -0
- wandb/integration/sklearn/calculate/elbow_curve.py +55 -0
- wandb/integration/sklearn/calculate/feature_importances.py +67 -0
- wandb/integration/sklearn/calculate/learning_curve.py +64 -0
- wandb/integration/sklearn/calculate/outlier_candidates.py +69 -0
- wandb/integration/sklearn/calculate/residuals.py +86 -0
- wandb/integration/sklearn/calculate/silhouette.py +118 -0
- wandb/integration/sklearn/calculate/summary_metrics.py +62 -0
- wandb/integration/sklearn/plot/__init__.py +35 -0
- wandb/integration/sklearn/plot/classifier.py +329 -0
- wandb/integration/sklearn/plot/clusterer.py +146 -0
- wandb/integration/sklearn/plot/regressor.py +121 -0
- wandb/integration/sklearn/plot/shared.py +91 -0
- wandb/integration/sklearn/utils.py +183 -0
- wandb/integration/tensorboard/__init__.py +10 -0
- wandb/integration/tensorboard/log.py +355 -0
- wandb/integration/tensorboard/monkeypatch.py +185 -0
- wandb/integration/tensorflow/__init__.py +5 -0
- wandb/integration/tensorflow/estimator_hook.py +54 -0
- wandb/integration/torch/__init__.py +0 -0
- wandb/integration/torch/wandb_torch.py +554 -0
- wandb/integration/ultralytics/__init__.py +11 -0
- wandb/integration/ultralytics/bbox_utils.py +208 -0
- wandb/integration/ultralytics/callback.py +524 -0
- wandb/integration/ultralytics/classification_utils.py +83 -0
- wandb/integration/ultralytics/mask_utils.py +202 -0
- wandb/integration/ultralytics/pose_utils.py +103 -0
- wandb/integration/xgboost/__init__.py +11 -0
- wandb/integration/xgboost/xgboost.py +189 -0
- wandb/integration/yolov8/__init__.py +0 -0
- wandb/integration/yolov8/yolov8.py +284 -0
- wandb/jupyter.py +515 -0
- wandb/magic.py +3 -0
- wandb/mpmain/__init__.py +0 -0
- wandb/mpmain/__main__.py +1 -0
- wandb/old/__init__.py +0 -0
- wandb/old/core.py +53 -0
- wandb/old/settings.py +173 -0
- wandb/old/summary.py +440 -0
- wandb/plot/__init__.py +19 -0
- wandb/plot/bar.py +45 -0
- wandb/plot/confusion_matrix.py +100 -0
- wandb/plot/histogram.py +39 -0
- wandb/plot/line.py +43 -0
- wandb/plot/line_series.py +88 -0
- wandb/plot/pr_curve.py +136 -0
- wandb/plot/roc_curve.py +118 -0
- wandb/plot/scatter.py +32 -0
- wandb/plot/utils.py +183 -0
- wandb/plot/viz.py +123 -0
- wandb/proto/__init__.py +0 -0
- wandb/proto/v3/__init__.py +0 -0
- wandb/proto/v3/wandb_base_pb2.py +55 -0
- wandb/proto/v3/wandb_internal_pb2.py +1608 -0
- wandb/proto/v3/wandb_server_pb2.py +208 -0
- wandb/proto/v3/wandb_settings_pb2.py +112 -0
- wandb/proto/v3/wandb_telemetry_pb2.py +106 -0
- wandb/proto/v4/__init__.py +0 -0
- wandb/proto/v4/wandb_base_pb2.py +30 -0
- wandb/proto/v4/wandb_internal_pb2.py +360 -0
- wandb/proto/v4/wandb_server_pb2.py +63 -0
- wandb/proto/v4/wandb_settings_pb2.py +45 -0
- wandb/proto/v4/wandb_telemetry_pb2.py +41 -0
- wandb/proto/v5/wandb_base_pb2.py +31 -0
- wandb/proto/v5/wandb_internal_pb2.py +361 -0
- wandb/proto/v5/wandb_server_pb2.py +64 -0
- wandb/proto/v5/wandb_settings_pb2.py +46 -0
- wandb/proto/v5/wandb_telemetry_pb2.py +42 -0
- wandb/proto/wandb_base_pb2.py +10 -0
- wandb/proto/wandb_deprecated.py +53 -0
- wandb/proto/wandb_generate_deprecated.py +34 -0
- wandb/proto/wandb_generate_proto.py +49 -0
- wandb/proto/wandb_internal_pb2.py +16 -0
- wandb/proto/wandb_server_pb2.py +10 -0
- wandb/proto/wandb_settings_pb2.py +10 -0
- wandb/proto/wandb_telemetry_pb2.py +10 -0
- wandb/py.typed +0 -0
- wandb/sdk/__init__.py +37 -0
- wandb/sdk/artifacts/__init__.py +0 -0
- wandb/sdk/artifacts/_validators.py +90 -0
- wandb/sdk/artifacts/artifact.py +2389 -0
- wandb/sdk/artifacts/artifact_download_logger.py +43 -0
- wandb/sdk/artifacts/artifact_file_cache.py +253 -0
- wandb/sdk/artifacts/artifact_instance_cache.py +17 -0
- wandb/sdk/artifacts/artifact_manifest.py +74 -0
- wandb/sdk/artifacts/artifact_manifest_entry.py +249 -0
- wandb/sdk/artifacts/artifact_manifests/__init__.py +0 -0
- wandb/sdk/artifacts/artifact_manifests/artifact_manifest_v1.py +92 -0
- wandb/sdk/artifacts/artifact_saver.py +269 -0
- wandb/sdk/artifacts/artifact_state.py +11 -0
- wandb/sdk/artifacts/artifact_ttl.py +7 -0
- wandb/sdk/artifacts/exceptions.py +57 -0
- wandb/sdk/artifacts/staging.py +25 -0
- wandb/sdk/artifacts/storage_handler.py +62 -0
- wandb/sdk/artifacts/storage_handlers/__init__.py +0 -0
- wandb/sdk/artifacts/storage_handlers/azure_handler.py +208 -0
- wandb/sdk/artifacts/storage_handlers/gcs_handler.py +228 -0
- wandb/sdk/artifacts/storage_handlers/http_handler.py +114 -0
- wandb/sdk/artifacts/storage_handlers/local_file_handler.py +141 -0
- wandb/sdk/artifacts/storage_handlers/multi_handler.py +56 -0
- wandb/sdk/artifacts/storage_handlers/s3_handler.py +300 -0
- wandb/sdk/artifacts/storage_handlers/tracking_handler.py +72 -0
- wandb/sdk/artifacts/storage_handlers/wb_artifact_handler.py +135 -0
- wandb/sdk/artifacts/storage_handlers/wb_local_artifact_handler.py +74 -0
- wandb/sdk/artifacts/storage_layout.py +6 -0
- wandb/sdk/artifacts/storage_policies/__init__.py +4 -0
- wandb/sdk/artifacts/storage_policies/register.py +1 -0
- wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +378 -0
- wandb/sdk/artifacts/storage_policy.py +72 -0
- wandb/sdk/backend/__init__.py +0 -0
- wandb/sdk/backend/backend.py +222 -0
- wandb/sdk/data_types/__init__.py +0 -0
- wandb/sdk/data_types/_dtypes.py +914 -0
- wandb/sdk/data_types/_private.py +10 -0
- wandb/sdk/data_types/audio.py +165 -0
- wandb/sdk/data_types/base_types/__init__.py +0 -0
- wandb/sdk/data_types/base_types/json_metadata.py +55 -0
- wandb/sdk/data_types/base_types/media.py +315 -0
- wandb/sdk/data_types/base_types/wb_value.py +272 -0
- wandb/sdk/data_types/bokeh.py +70 -0
- wandb/sdk/data_types/graph.py +405 -0
- wandb/sdk/data_types/helper_types/__init__.py +0 -0
- wandb/sdk/data_types/helper_types/bounding_boxes_2d.py +295 -0
- wandb/sdk/data_types/helper_types/classes.py +159 -0
- wandb/sdk/data_types/helper_types/image_mask.py +235 -0
- wandb/sdk/data_types/histogram.py +96 -0
- wandb/sdk/data_types/html.py +115 -0
- wandb/sdk/data_types/image.py +845 -0
- wandb/sdk/data_types/molecule.py +241 -0
- wandb/sdk/data_types/object_3d.py +474 -0
- wandb/sdk/data_types/plotly.py +82 -0
- wandb/sdk/data_types/saved_model.py +446 -0
- wandb/sdk/data_types/table.py +1204 -0
- wandb/sdk/data_types/trace_tree.py +438 -0
- wandb/sdk/data_types/utils.py +229 -0
- wandb/sdk/data_types/video.py +247 -0
- wandb/sdk/integration_utils/__init__.py +0 -0
- wandb/sdk/integration_utils/auto_logging.py +239 -0
- wandb/sdk/integration_utils/data_logging.py +475 -0
- wandb/sdk/interface/__init__.py +0 -0
- wandb/sdk/interface/constants.py +4 -0
- wandb/sdk/interface/interface.py +972 -0
- wandb/sdk/interface/interface_queue.py +59 -0
- wandb/sdk/interface/interface_relay.py +53 -0
- wandb/sdk/interface/interface_shared.py +537 -0
- wandb/sdk/interface/interface_sock.py +61 -0
- wandb/sdk/interface/message_future.py +27 -0
- wandb/sdk/interface/message_future_poll.py +50 -0
- wandb/sdk/interface/router.py +118 -0
- wandb/sdk/interface/router_queue.py +44 -0
- wandb/sdk/interface/router_relay.py +39 -0
- wandb/sdk/interface/router_sock.py +36 -0
- wandb/sdk/interface/summary_record.py +67 -0
- wandb/sdk/internal/__init__.py +0 -0
- wandb/sdk/internal/context.py +89 -0
- wandb/sdk/internal/datastore.py +297 -0
- wandb/sdk/internal/file_pusher.py +181 -0
- wandb/sdk/internal/file_stream.py +695 -0
- wandb/sdk/internal/flow_control.py +263 -0
- wandb/sdk/internal/handler.py +901 -0
- wandb/sdk/internal/internal.py +417 -0
- wandb/sdk/internal/internal_api.py +4358 -0
- wandb/sdk/internal/internal_util.py +100 -0
- wandb/sdk/internal/job_builder.py +629 -0
- wandb/sdk/internal/profiler.py +78 -0
- wandb/sdk/internal/progress.py +83 -0
- wandb/sdk/internal/run.py +25 -0
- wandb/sdk/internal/sample.py +70 -0
- wandb/sdk/internal/sender.py +1686 -0
- wandb/sdk/internal/sender_config.py +197 -0
- wandb/sdk/internal/settings_static.py +90 -0
- wandb/sdk/internal/system/__init__.py +0 -0
- wandb/sdk/internal/system/assets/__init__.py +27 -0
- wandb/sdk/internal/system/assets/aggregators.py +37 -0
- wandb/sdk/internal/system/assets/asset_registry.py +20 -0
- wandb/sdk/internal/system/assets/cpu.py +163 -0
- wandb/sdk/internal/system/assets/disk.py +210 -0
- wandb/sdk/internal/system/assets/gpu.py +416 -0
- wandb/sdk/internal/system/assets/gpu_amd.py +239 -0
- wandb/sdk/internal/system/assets/gpu_apple.py +177 -0
- wandb/sdk/internal/system/assets/interfaces.py +207 -0
- wandb/sdk/internal/system/assets/ipu.py +177 -0
- wandb/sdk/internal/system/assets/memory.py +166 -0
- wandb/sdk/internal/system/assets/network.py +125 -0
- wandb/sdk/internal/system/assets/open_metrics.py +299 -0
- wandb/sdk/internal/system/assets/tpu.py +154 -0
- wandb/sdk/internal/system/assets/trainium.py +399 -0
- wandb/sdk/internal/system/env_probe_helpers.py +13 -0
- wandb/sdk/internal/system/system_info.py +249 -0
- wandb/sdk/internal/system/system_monitor.py +229 -0
- wandb/sdk/internal/tb_watcher.py +518 -0
- wandb/sdk/internal/thread_local_settings.py +18 -0
- wandb/sdk/internal/writer.py +206 -0
- wandb/sdk/launch/__init__.py +14 -0
- wandb/sdk/launch/_launch.py +330 -0
- wandb/sdk/launch/_launch_add.py +255 -0
- wandb/sdk/launch/_project_spec.py +566 -0
- wandb/sdk/launch/agent/__init__.py +5 -0
- wandb/sdk/launch/agent/agent.py +924 -0
- wandb/sdk/launch/agent/config.py +296 -0
- wandb/sdk/launch/agent/job_status_tracker.py +53 -0
- wandb/sdk/launch/agent/run_queue_item_file_saver.py +45 -0
- wandb/sdk/launch/builder/__init__.py +0 -0
- wandb/sdk/launch/builder/abstract.py +156 -0
- wandb/sdk/launch/builder/build.py +297 -0
- wandb/sdk/launch/builder/context_manager.py +235 -0
- wandb/sdk/launch/builder/docker_builder.py +177 -0
- wandb/sdk/launch/builder/kaniko_builder.py +595 -0
- wandb/sdk/launch/builder/noop.py +58 -0
- wandb/sdk/launch/builder/templates/_wandb_bootstrap.py +188 -0
- wandb/sdk/launch/builder/templates/dockerfile.py +92 -0
- wandb/sdk/launch/create_job.py +528 -0
- wandb/sdk/launch/environment/abstract.py +29 -0
- wandb/sdk/launch/environment/aws_environment.py +322 -0
- wandb/sdk/launch/environment/azure_environment.py +105 -0
- wandb/sdk/launch/environment/gcp_environment.py +335 -0
- wandb/sdk/launch/environment/local_environment.py +66 -0
- wandb/sdk/launch/errors.py +19 -0
- wandb/sdk/launch/git_reference.py +109 -0
- wandb/sdk/launch/inputs/files.py +148 -0
- wandb/sdk/launch/inputs/internal.py +315 -0
- wandb/sdk/launch/inputs/manage.py +113 -0
- wandb/sdk/launch/inputs/schema.py +39 -0
- wandb/sdk/launch/loader.py +249 -0
- wandb/sdk/launch/registry/abstract.py +48 -0
- wandb/sdk/launch/registry/anon.py +29 -0
- wandb/sdk/launch/registry/azure_container_registry.py +124 -0
- wandb/sdk/launch/registry/elastic_container_registry.py +192 -0
- wandb/sdk/launch/registry/google_artifact_registry.py +219 -0
- wandb/sdk/launch/registry/local_registry.py +67 -0
- wandb/sdk/launch/runner/__init__.py +0 -0
- wandb/sdk/launch/runner/abstract.py +195 -0
- wandb/sdk/launch/runner/kubernetes_monitor.py +474 -0
- wandb/sdk/launch/runner/kubernetes_runner.py +963 -0
- wandb/sdk/launch/runner/local_container.py +301 -0
- wandb/sdk/launch/runner/local_process.py +78 -0
- wandb/sdk/launch/runner/sagemaker_runner.py +426 -0
- wandb/sdk/launch/runner/vertex_runner.py +230 -0
- wandb/sdk/launch/sweeps/__init__.py +39 -0
- wandb/sdk/launch/sweeps/scheduler.py +742 -0
- wandb/sdk/launch/sweeps/scheduler_sweep.py +91 -0
- wandb/sdk/launch/sweeps/utils.py +316 -0
- wandb/sdk/launch/utils.py +746 -0
- wandb/sdk/launch/wandb_reference.py +138 -0
- wandb/sdk/lib/__init__.py +5 -0
- wandb/sdk/lib/_settings_toposort_generate.py +159 -0
- wandb/sdk/lib/_settings_toposort_generated.py +250 -0
- wandb/sdk/lib/_wburls_generate.py +25 -0
- wandb/sdk/lib/_wburls_generated.py +22 -0
- wandb/sdk/lib/apikey.py +273 -0
- wandb/sdk/lib/capped_dict.py +26 -0
- wandb/sdk/lib/config_util.py +101 -0
- wandb/sdk/lib/credentials.py +141 -0
- wandb/sdk/lib/deprecate.py +42 -0
- wandb/sdk/lib/disabled.py +29 -0
- wandb/sdk/lib/exit_hooks.py +54 -0
- wandb/sdk/lib/file_stream_utils.py +118 -0
- wandb/sdk/lib/filenames.py +64 -0
- wandb/sdk/lib/filesystem.py +372 -0
- wandb/sdk/lib/fsm.py +174 -0
- wandb/sdk/lib/gitlib.py +239 -0
- wandb/sdk/lib/gql_request.py +65 -0
- wandb/sdk/lib/handler_util.py +21 -0
- wandb/sdk/lib/hashutil.py +84 -0
- wandb/sdk/lib/import_hooks.py +275 -0
- wandb/sdk/lib/ipython.py +146 -0
- wandb/sdk/lib/json_util.py +80 -0
- wandb/sdk/lib/lazyloader.py +63 -0
- wandb/sdk/lib/mailbox.py +460 -0
- wandb/sdk/lib/module.py +69 -0
- wandb/sdk/lib/paths.py +106 -0
- wandb/sdk/lib/preinit.py +42 -0
- wandb/sdk/lib/printer.py +313 -0
- wandb/sdk/lib/proto_util.py +90 -0
- wandb/sdk/lib/redirect.py +845 -0
- wandb/sdk/lib/reporting.py +99 -0
- wandb/sdk/lib/retry.py +289 -0
- wandb/sdk/lib/run_moment.py +78 -0
- wandb/sdk/lib/runid.py +12 -0
- wandb/sdk/lib/server.py +52 -0
- wandb/sdk/lib/service_connection.py +216 -0
- wandb/sdk/lib/service_token.py +94 -0
- wandb/sdk/lib/sock_client.py +295 -0
- wandb/sdk/lib/sparkline.py +45 -0
- wandb/sdk/lib/telemetry.py +100 -0
- wandb/sdk/lib/timed_input.py +133 -0
- wandb/sdk/lib/timer.py +19 -0
- wandb/sdk/lib/tracelog.py +255 -0
- wandb/sdk/lib/wburls.py +46 -0
- wandb/sdk/service/__init__.py +0 -0
- wandb/sdk/service/_startup_debug.py +22 -0
- wandb/sdk/service/port_file.py +53 -0
- wandb/sdk/service/server.py +116 -0
- wandb/sdk/service/server_sock.py +276 -0
- wandb/sdk/service/service.py +242 -0
- wandb/sdk/service/streams.py +417 -0
- wandb/sdk/verify/__init__.py +0 -0
- wandb/sdk/verify/verify.py +501 -0
- wandb/sdk/wandb_alerts.py +12 -0
- wandb/sdk/wandb_config.py +322 -0
- wandb/sdk/wandb_helper.py +54 -0
- wandb/sdk/wandb_init.py +1266 -0
- wandb/sdk/wandb_login.py +349 -0
- wandb/sdk/wandb_metric.py +110 -0
- wandb/sdk/wandb_require.py +97 -0
- wandb/sdk/wandb_require_helpers.py +44 -0
- wandb/sdk/wandb_run.py +4236 -0
- wandb/sdk/wandb_settings.py +2001 -0
- wandb/sdk/wandb_setup.py +409 -0
- wandb/sdk/wandb_summary.py +150 -0
- wandb/sdk/wandb_sweep.py +119 -0
- wandb/sdk/wandb_sync.py +81 -0
- wandb/sdk/wandb_watch.py +144 -0
- wandb/sklearn.py +35 -0
- wandb/sync/__init__.py +3 -0
- wandb/sync/sync.py +443 -0
- wandb/trigger.py +29 -0
- wandb/util.py +1956 -0
- wandb/vendor/__init__.py +0 -0
- wandb/vendor/gql-0.2.0/setup.py +40 -0
- wandb/vendor/gql-0.2.0/tests/__init__.py +0 -0
- wandb/vendor/gql-0.2.0/tests/starwars/__init__.py +0 -0
- wandb/vendor/gql-0.2.0/tests/starwars/fixtures.py +96 -0
- wandb/vendor/gql-0.2.0/tests/starwars/schema.py +146 -0
- wandb/vendor/gql-0.2.0/tests/starwars/test_dsl.py +293 -0
- wandb/vendor/gql-0.2.0/tests/starwars/test_query.py +355 -0
- wandb/vendor/gql-0.2.0/tests/starwars/test_validation.py +171 -0
- wandb/vendor/gql-0.2.0/tests/test_client.py +31 -0
- wandb/vendor/gql-0.2.0/tests/test_transport.py +89 -0
- wandb/vendor/gql-0.2.0/wandb_gql/__init__.py +4 -0
- wandb/vendor/gql-0.2.0/wandb_gql/client.py +75 -0
- wandb/vendor/gql-0.2.0/wandb_gql/dsl.py +152 -0
- wandb/vendor/gql-0.2.0/wandb_gql/gql.py +10 -0
- wandb/vendor/gql-0.2.0/wandb_gql/transport/__init__.py +0 -0
- wandb/vendor/gql-0.2.0/wandb_gql/transport/http.py +6 -0
- wandb/vendor/gql-0.2.0/wandb_gql/transport/local_schema.py +15 -0
- wandb/vendor/gql-0.2.0/wandb_gql/transport/requests.py +46 -0
- wandb/vendor/gql-0.2.0/wandb_gql/utils.py +21 -0
- wandb/vendor/graphql-core-1.1/setup.py +86 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/__init__.py +287 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/__init__.py +6 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/base.py +42 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/format_error.py +11 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/located_error.py +29 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/error/syntax_error.py +36 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/__init__.py +26 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/base.py +311 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executor.py +398 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/asyncio.py +53 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/gevent.py +22 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/process.py +32 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/sync.py +7 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/thread.py +35 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/utils.py +6 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/executor.py +66 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/fragment.py +252 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/resolver.py +151 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/utils.py +7 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/middleware.py +57 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/execution/values.py +145 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/graphql.py +60 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/ast.py +1349 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/base.py +19 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/lexer.py +435 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/location.py +30 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/parser.py +779 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/printer.py +193 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/source.py +18 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor.py +222 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor_meta.py +82 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/cached_property.py +17 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/contain_subset.py +28 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/default_ordered_dict.py +40 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/ordereddict.py +8 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/pair_set.py +43 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/version.py +78 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/__init__.py +67 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/definition.py +619 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/directives.py +132 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/introspection.py +440 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/scalars.py +131 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/schema.py +100 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/type/typemap.py +145 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/__init__.py +0 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/assert_valid_name.py +9 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_from_value.py +65 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_code.py +49 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_dict.py +24 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/base.py +75 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_ast_schema.py +291 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_client_schema.py +250 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/concat_ast.py +9 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/extend_schema.py +357 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_field_def.py +27 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_operation_ast.py +21 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/introspection_query.py +90 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_literal_value.py +67 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_value.py +66 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/quoted_or_list.py +21 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/schema_printer.py +168 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/suggestion_list.py +56 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_comparators.py +69 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_from_ast.py +21 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_info.py +149 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/utils/value_from_ast.py +69 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/__init__.py +4 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/__init__.py +79 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/arguments_of_correct_type.py +24 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/base.py +8 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/default_values_of_correct_type.py +44 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fields_on_correct_type.py +113 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fragments_on_composite_types.py +33 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_argument_names.py +70 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_directives.py +97 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_fragment_names.py +19 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_type_names.py +43 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/lone_anonymous_operation.py +23 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_fragment_cycles.py +59 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_undefined_variables.py +36 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_fragments.py +38 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_variables.py +37 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/overlapping_fields_can_be_merged.py +529 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/possible_fragment_spreads.py +44 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/provided_non_null_arguments.py +46 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/scalar_leafs.py +33 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_argument_names.py +32 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_fragment_names.py +28 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_input_field_names.py +33 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_operation_names.py +31 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_variable_names.py +27 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_are_input_types.py +21 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_in_allowed_position.py +53 -0
- wandb/vendor/graphql-core-1.1/wandb_graphql/validation/validation.py +158 -0
- wandb/vendor/promise-2.3.0/conftest.py +30 -0
- wandb/vendor/promise-2.3.0/setup.py +64 -0
- wandb/vendor/promise-2.3.0/tests/__init__.py +0 -0
- wandb/vendor/promise-2.3.0/tests/conftest.py +8 -0
- wandb/vendor/promise-2.3.0/tests/test_awaitable.py +32 -0
- wandb/vendor/promise-2.3.0/tests/test_awaitable_35.py +47 -0
- wandb/vendor/promise-2.3.0/tests/test_benchmark.py +116 -0
- wandb/vendor/promise-2.3.0/tests/test_complex_threads.py +23 -0
- wandb/vendor/promise-2.3.0/tests/test_dataloader.py +452 -0
- wandb/vendor/promise-2.3.0/tests/test_dataloader_awaitable_35.py +99 -0
- wandb/vendor/promise-2.3.0/tests/test_dataloader_extra.py +65 -0
- wandb/vendor/promise-2.3.0/tests/test_extra.py +670 -0
- wandb/vendor/promise-2.3.0/tests/test_issues.py +132 -0
- wandb/vendor/promise-2.3.0/tests/test_promise_list.py +70 -0
- wandb/vendor/promise-2.3.0/tests/test_spec.py +584 -0
- wandb/vendor/promise-2.3.0/tests/test_thread_safety.py +115 -0
- wandb/vendor/promise-2.3.0/tests/utils.py +3 -0
- wandb/vendor/promise-2.3.0/wandb_promise/__init__.py +38 -0
- wandb/vendor/promise-2.3.0/wandb_promise/async_.py +135 -0
- wandb/vendor/promise-2.3.0/wandb_promise/compat.py +32 -0
- wandb/vendor/promise-2.3.0/wandb_promise/dataloader.py +326 -0
- wandb/vendor/promise-2.3.0/wandb_promise/iterate_promise.py +12 -0
- wandb/vendor/promise-2.3.0/wandb_promise/promise.py +848 -0
- wandb/vendor/promise-2.3.0/wandb_promise/promise_list.py +151 -0
- wandb/vendor/promise-2.3.0/wandb_promise/pyutils/__init__.py +0 -0
- wandb/vendor/promise-2.3.0/wandb_promise/pyutils/version.py +83 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/__init__.py +0 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/asyncio.py +22 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/gevent.py +21 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/immediate.py +27 -0
- wandb/vendor/promise-2.3.0/wandb_promise/schedulers/thread.py +18 -0
- wandb/vendor/promise-2.3.0/wandb_promise/utils.py +56 -0
- wandb/vendor/pygments/__init__.py +90 -0
- wandb/vendor/pygments/cmdline.py +568 -0
- wandb/vendor/pygments/console.py +74 -0
- wandb/vendor/pygments/filter.py +74 -0
- wandb/vendor/pygments/filters/__init__.py +350 -0
- wandb/vendor/pygments/formatter.py +95 -0
- wandb/vendor/pygments/formatters/__init__.py +153 -0
- wandb/vendor/pygments/formatters/_mapping.py +85 -0
- wandb/vendor/pygments/formatters/bbcode.py +109 -0
- wandb/vendor/pygments/formatters/html.py +851 -0
- wandb/vendor/pygments/formatters/img.py +600 -0
- wandb/vendor/pygments/formatters/irc.py +182 -0
- wandb/vendor/pygments/formatters/latex.py +482 -0
- wandb/vendor/pygments/formatters/other.py +160 -0
- wandb/vendor/pygments/formatters/rtf.py +147 -0
- wandb/vendor/pygments/formatters/svg.py +153 -0
- wandb/vendor/pygments/formatters/terminal.py +136 -0
- wandb/vendor/pygments/formatters/terminal256.py +309 -0
- wandb/vendor/pygments/lexer.py +871 -0
- wandb/vendor/pygments/lexers/__init__.py +329 -0
- wandb/vendor/pygments/lexers/_asy_builtins.py +1645 -0
- wandb/vendor/pygments/lexers/_cl_builtins.py +232 -0
- wandb/vendor/pygments/lexers/_cocoa_builtins.py +72 -0
- wandb/vendor/pygments/lexers/_csound_builtins.py +1346 -0
- wandb/vendor/pygments/lexers/_lasso_builtins.py +5327 -0
- wandb/vendor/pygments/lexers/_lua_builtins.py +295 -0
- wandb/vendor/pygments/lexers/_mapping.py +500 -0
- wandb/vendor/pygments/lexers/_mql_builtins.py +1172 -0
- wandb/vendor/pygments/lexers/_openedge_builtins.py +2547 -0
- wandb/vendor/pygments/lexers/_php_builtins.py +4756 -0
- wandb/vendor/pygments/lexers/_postgres_builtins.py +621 -0
- wandb/vendor/pygments/lexers/_scilab_builtins.py +3094 -0
- wandb/vendor/pygments/lexers/_sourcemod_builtins.py +1163 -0
- wandb/vendor/pygments/lexers/_stan_builtins.py +532 -0
- wandb/vendor/pygments/lexers/_stata_builtins.py +419 -0
- wandb/vendor/pygments/lexers/_tsql_builtins.py +1004 -0
- wandb/vendor/pygments/lexers/_vim_builtins.py +1939 -0
- wandb/vendor/pygments/lexers/actionscript.py +240 -0
- wandb/vendor/pygments/lexers/agile.py +24 -0
- wandb/vendor/pygments/lexers/algebra.py +221 -0
- wandb/vendor/pygments/lexers/ambient.py +76 -0
- wandb/vendor/pygments/lexers/ampl.py +87 -0
- wandb/vendor/pygments/lexers/apl.py +101 -0
- wandb/vendor/pygments/lexers/archetype.py +318 -0
- wandb/vendor/pygments/lexers/asm.py +641 -0
- wandb/vendor/pygments/lexers/automation.py +374 -0
- wandb/vendor/pygments/lexers/basic.py +500 -0
- wandb/vendor/pygments/lexers/bibtex.py +160 -0
- wandb/vendor/pygments/lexers/business.py +612 -0
- wandb/vendor/pygments/lexers/c_cpp.py +252 -0
- wandb/vendor/pygments/lexers/c_like.py +541 -0
- wandb/vendor/pygments/lexers/capnproto.py +78 -0
- wandb/vendor/pygments/lexers/chapel.py +102 -0
- wandb/vendor/pygments/lexers/clean.py +288 -0
- wandb/vendor/pygments/lexers/compiled.py +34 -0
- wandb/vendor/pygments/lexers/configs.py +833 -0
- wandb/vendor/pygments/lexers/console.py +114 -0
- wandb/vendor/pygments/lexers/crystal.py +393 -0
- wandb/vendor/pygments/lexers/csound.py +366 -0
- wandb/vendor/pygments/lexers/css.py +689 -0
- wandb/vendor/pygments/lexers/d.py +251 -0
- wandb/vendor/pygments/lexers/dalvik.py +125 -0
- wandb/vendor/pygments/lexers/data.py +555 -0
- wandb/vendor/pygments/lexers/diff.py +165 -0
- wandb/vendor/pygments/lexers/dotnet.py +691 -0
- wandb/vendor/pygments/lexers/dsls.py +878 -0
- wandb/vendor/pygments/lexers/dylan.py +289 -0
- wandb/vendor/pygments/lexers/ecl.py +125 -0
- wandb/vendor/pygments/lexers/eiffel.py +65 -0
- wandb/vendor/pygments/lexers/elm.py +121 -0
- wandb/vendor/pygments/lexers/erlang.py +533 -0
- wandb/vendor/pygments/lexers/esoteric.py +277 -0
- wandb/vendor/pygments/lexers/ezhil.py +69 -0
- wandb/vendor/pygments/lexers/factor.py +344 -0
- wandb/vendor/pygments/lexers/fantom.py +250 -0
- wandb/vendor/pygments/lexers/felix.py +273 -0
- wandb/vendor/pygments/lexers/forth.py +177 -0
- wandb/vendor/pygments/lexers/fortran.py +205 -0
- wandb/vendor/pygments/lexers/foxpro.py +428 -0
- wandb/vendor/pygments/lexers/functional.py +21 -0
- wandb/vendor/pygments/lexers/go.py +101 -0
- wandb/vendor/pygments/lexers/grammar_notation.py +213 -0
- wandb/vendor/pygments/lexers/graph.py +80 -0
- wandb/vendor/pygments/lexers/graphics.py +553 -0
- wandb/vendor/pygments/lexers/haskell.py +843 -0
- wandb/vendor/pygments/lexers/haxe.py +936 -0
- wandb/vendor/pygments/lexers/hdl.py +382 -0
- wandb/vendor/pygments/lexers/hexdump.py +103 -0
- wandb/vendor/pygments/lexers/html.py +602 -0
- wandb/vendor/pygments/lexers/idl.py +270 -0
- wandb/vendor/pygments/lexers/igor.py +288 -0
- wandb/vendor/pygments/lexers/inferno.py +96 -0
- wandb/vendor/pygments/lexers/installers.py +322 -0
- wandb/vendor/pygments/lexers/int_fiction.py +1343 -0
- wandb/vendor/pygments/lexers/iolang.py +63 -0
- wandb/vendor/pygments/lexers/j.py +146 -0
- wandb/vendor/pygments/lexers/javascript.py +1525 -0
- wandb/vendor/pygments/lexers/julia.py +333 -0
- wandb/vendor/pygments/lexers/jvm.py +1573 -0
- wandb/vendor/pygments/lexers/lisp.py +2621 -0
- wandb/vendor/pygments/lexers/make.py +202 -0
- wandb/vendor/pygments/lexers/markup.py +595 -0
- wandb/vendor/pygments/lexers/math.py +21 -0
- wandb/vendor/pygments/lexers/matlab.py +663 -0
- wandb/vendor/pygments/lexers/ml.py +769 -0
- wandb/vendor/pygments/lexers/modeling.py +358 -0
- wandb/vendor/pygments/lexers/modula2.py +1561 -0
- wandb/vendor/pygments/lexers/monte.py +204 -0
- wandb/vendor/pygments/lexers/ncl.py +894 -0
- wandb/vendor/pygments/lexers/nimrod.py +159 -0
- wandb/vendor/pygments/lexers/nit.py +64 -0
- wandb/vendor/pygments/lexers/nix.py +136 -0
- wandb/vendor/pygments/lexers/oberon.py +105 -0
- wandb/vendor/pygments/lexers/objective.py +504 -0
- wandb/vendor/pygments/lexers/ooc.py +85 -0
- wandb/vendor/pygments/lexers/other.py +41 -0
- wandb/vendor/pygments/lexers/parasail.py +79 -0
- wandb/vendor/pygments/lexers/parsers.py +835 -0
- wandb/vendor/pygments/lexers/pascal.py +644 -0
- wandb/vendor/pygments/lexers/pawn.py +199 -0
- wandb/vendor/pygments/lexers/perl.py +620 -0
- wandb/vendor/pygments/lexers/php.py +267 -0
- wandb/vendor/pygments/lexers/praat.py +294 -0
- wandb/vendor/pygments/lexers/prolog.py +306 -0
- wandb/vendor/pygments/lexers/python.py +939 -0
- wandb/vendor/pygments/lexers/qvt.py +152 -0
- wandb/vendor/pygments/lexers/r.py +453 -0
- wandb/vendor/pygments/lexers/rdf.py +270 -0
- wandb/vendor/pygments/lexers/rebol.py +431 -0
- wandb/vendor/pygments/lexers/resource.py +85 -0
- wandb/vendor/pygments/lexers/rnc.py +67 -0
- wandb/vendor/pygments/lexers/roboconf.py +82 -0
- wandb/vendor/pygments/lexers/robotframework.py +560 -0
- wandb/vendor/pygments/lexers/ruby.py +519 -0
- wandb/vendor/pygments/lexers/rust.py +220 -0
- wandb/vendor/pygments/lexers/sas.py +228 -0
- wandb/vendor/pygments/lexers/scripting.py +1222 -0
- wandb/vendor/pygments/lexers/shell.py +794 -0
- wandb/vendor/pygments/lexers/smalltalk.py +195 -0
- wandb/vendor/pygments/lexers/smv.py +79 -0
- wandb/vendor/pygments/lexers/snobol.py +83 -0
- wandb/vendor/pygments/lexers/special.py +103 -0
- wandb/vendor/pygments/lexers/sql.py +681 -0
- wandb/vendor/pygments/lexers/stata.py +108 -0
- wandb/vendor/pygments/lexers/supercollider.py +90 -0
- wandb/vendor/pygments/lexers/tcl.py +145 -0
- wandb/vendor/pygments/lexers/templates.py +2283 -0
- wandb/vendor/pygments/lexers/testing.py +207 -0
- wandb/vendor/pygments/lexers/text.py +25 -0
- wandb/vendor/pygments/lexers/textedit.py +169 -0
- wandb/vendor/pygments/lexers/textfmts.py +297 -0
- wandb/vendor/pygments/lexers/theorem.py +458 -0
- wandb/vendor/pygments/lexers/trafficscript.py +54 -0
- wandb/vendor/pygments/lexers/typoscript.py +226 -0
- wandb/vendor/pygments/lexers/urbi.py +133 -0
- wandb/vendor/pygments/lexers/varnish.py +190 -0
- wandb/vendor/pygments/lexers/verification.py +111 -0
- wandb/vendor/pygments/lexers/web.py +24 -0
- wandb/vendor/pygments/lexers/webmisc.py +988 -0
- wandb/vendor/pygments/lexers/whiley.py +116 -0
- wandb/vendor/pygments/lexers/x10.py +69 -0
- wandb/vendor/pygments/modeline.py +44 -0
- wandb/vendor/pygments/plugin.py +68 -0
- wandb/vendor/pygments/regexopt.py +92 -0
- wandb/vendor/pygments/scanner.py +105 -0
- wandb/vendor/pygments/sphinxext.py +158 -0
- wandb/vendor/pygments/style.py +155 -0
- wandb/vendor/pygments/styles/__init__.py +80 -0
- wandb/vendor/pygments/styles/abap.py +29 -0
- wandb/vendor/pygments/styles/algol.py +63 -0
- wandb/vendor/pygments/styles/algol_nu.py +63 -0
- wandb/vendor/pygments/styles/arduino.py +98 -0
- wandb/vendor/pygments/styles/autumn.py +65 -0
- wandb/vendor/pygments/styles/borland.py +51 -0
- wandb/vendor/pygments/styles/bw.py +49 -0
- wandb/vendor/pygments/styles/colorful.py +81 -0
- wandb/vendor/pygments/styles/default.py +73 -0
- wandb/vendor/pygments/styles/emacs.py +72 -0
- wandb/vendor/pygments/styles/friendly.py +72 -0
- wandb/vendor/pygments/styles/fruity.py +42 -0
- wandb/vendor/pygments/styles/igor.py +29 -0
- wandb/vendor/pygments/styles/lovelace.py +97 -0
- wandb/vendor/pygments/styles/manni.py +75 -0
- wandb/vendor/pygments/styles/monokai.py +106 -0
- wandb/vendor/pygments/styles/murphy.py +80 -0
- wandb/vendor/pygments/styles/native.py +65 -0
- wandb/vendor/pygments/styles/paraiso_dark.py +125 -0
- wandb/vendor/pygments/styles/paraiso_light.py +125 -0
- wandb/vendor/pygments/styles/pastie.py +75 -0
- wandb/vendor/pygments/styles/perldoc.py +69 -0
- wandb/vendor/pygments/styles/rainbow_dash.py +89 -0
- wandb/vendor/pygments/styles/rrt.py +33 -0
- wandb/vendor/pygments/styles/sas.py +44 -0
- wandb/vendor/pygments/styles/stata.py +40 -0
- wandb/vendor/pygments/styles/tango.py +141 -0
- wandb/vendor/pygments/styles/trac.py +63 -0
- wandb/vendor/pygments/styles/vim.py +63 -0
- wandb/vendor/pygments/styles/vs.py +38 -0
- wandb/vendor/pygments/styles/xcode.py +51 -0
- wandb/vendor/pygments/token.py +213 -0
- wandb/vendor/pygments/unistring.py +217 -0
- wandb/vendor/pygments/util.py +388 -0
- wandb/vendor/pynvml/__init__.py +0 -0
- wandb/vendor/pynvml/pynvml.py +4779 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/__init__.py +17 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/events.py +615 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/__init__.py +98 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/api.py +369 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents.py +172 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents2.py +239 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify.py +218 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_buffer.py +81 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_c.py +575 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/kqueue.py +730 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/polling.py +145 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/read_directory_changes.py +133 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/winapi.py +348 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/patterns.py +265 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/tricks/__init__.py +174 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/__init__.py +151 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/bricks.py +249 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/compat.py +29 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/decorators.py +198 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/delayed_queue.py +88 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/dirsnapshot.py +293 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/echo.py +157 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/event_backport.py +41 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/importlib2.py +40 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/platform.py +57 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/unicode_paths.py +64 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/win32stat.py +123 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/version.py +28 -0
- wandb/vendor/watchdog_0_9_0/wandb_watchdog/watchmedo.py +577 -0
- wandb/wandb_agent.py +588 -0
- wandb/wandb_controller.py +721 -0
- wandb/wandb_run.py +9 -0
- wandb-0.18.2.dist-info/METADATA +213 -0
- wandb-0.18.2.dist-info/RECORD +827 -0
- wandb-0.18.2.dist-info/WHEEL +5 -0
- wandb-0.18.2.dist-info/entry_points.txt +3 -0
- wandb-0.18.2.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,11 @@
|
|
1
|
+
"""Tools for integrating `wandb` with [`Keras`](https://keras.io/)."""
|
2
|
+
|
3
|
+
__all__ = (
|
4
|
+
"WandbCallback",
|
5
|
+
"WandbMetricsLogger",
|
6
|
+
"WandbModelCheckpoint",
|
7
|
+
"WandbEvalCallback",
|
8
|
+
)
|
9
|
+
|
10
|
+
from .callbacks import WandbEvalCallback, WandbMetricsLogger, WandbModelCheckpoint
|
11
|
+
from .keras import WandbCallback # TODO: legacy callback to be deprecated
|
@@ -0,0 +1,136 @@
|
|
1
|
+
import sys
|
2
|
+
from typing import Any, Dict, Optional, Union
|
3
|
+
|
4
|
+
import tensorflow as tf # type: ignore
|
5
|
+
from tensorflow.keras import callbacks
|
6
|
+
|
7
|
+
import wandb
|
8
|
+
from wandb.integration.keras.keras import patch_tf_keras
|
9
|
+
from wandb.sdk.lib import telemetry
|
10
|
+
|
11
|
+
if sys.version_info >= (3, 8):
|
12
|
+
from typing import Literal
|
13
|
+
else:
|
14
|
+
from typing_extensions import Literal
|
15
|
+
|
16
|
+
|
17
|
+
LogStrategy = Literal["epoch", "batch"]
|
18
|
+
|
19
|
+
|
20
|
+
patch_tf_keras()
|
21
|
+
|
22
|
+
|
23
|
+
class WandbMetricsLogger(callbacks.Callback):
|
24
|
+
"""Logger that sends system metrics to W&B.
|
25
|
+
|
26
|
+
`WandbMetricsLogger` automatically logs the `logs` dictionary that callback methods
|
27
|
+
take as argument to wandb.
|
28
|
+
|
29
|
+
This callback automatically logs the following to a W&B run page:
|
30
|
+
* system (CPU/GPU/TPU) metrics,
|
31
|
+
* train and validation metrics defined in `model.compile`,
|
32
|
+
* learning rate (both for a fixed value or a learning rate scheduler)
|
33
|
+
|
34
|
+
Notes:
|
35
|
+
If you resume training by passing `initial_epoch` to `model.fit` and you are using a
|
36
|
+
learning rate scheduler, make sure to pass `initial_global_step` to
|
37
|
+
`WandbMetricsLogger`. The `initial_global_step` is `step_size * initial_step`, where
|
38
|
+
`step_size` is number of training steps per epoch. `step_size` can be calculated as
|
39
|
+
the product of the cardinality of the training dataset and the batch size.
|
40
|
+
|
41
|
+
Arguments:
|
42
|
+
log_freq: ("epoch", "batch", or int) if "epoch", logs metrics
|
43
|
+
at the end of each epoch. If "batch", logs metrics at the end
|
44
|
+
of each batch. If an integer, logs metrics at the end of that
|
45
|
+
many batches. Defaults to "epoch".
|
46
|
+
initial_global_step: (int) Use this argument to correctly log the
|
47
|
+
learning rate when you resume training from some `initial_epoch`,
|
48
|
+
and a learning rate scheduler is used. This can be computed as
|
49
|
+
`step_size * initial_step`. Defaults to 0.
|
50
|
+
"""
|
51
|
+
|
52
|
+
def __init__(
|
53
|
+
self,
|
54
|
+
log_freq: Union[LogStrategy, int] = "epoch",
|
55
|
+
initial_global_step: int = 0,
|
56
|
+
*args: Any,
|
57
|
+
**kwargs: Any,
|
58
|
+
) -> None:
|
59
|
+
super().__init__(*args, **kwargs)
|
60
|
+
|
61
|
+
if wandb.run is None:
|
62
|
+
raise wandb.Error(
|
63
|
+
"You must call `wandb.init()` before WandbMetricsLogger()"
|
64
|
+
)
|
65
|
+
|
66
|
+
with telemetry.context(run=wandb.run) as tel:
|
67
|
+
tel.feature.keras_metrics_logger = True
|
68
|
+
|
69
|
+
if log_freq == "batch":
|
70
|
+
log_freq = 1
|
71
|
+
|
72
|
+
self.logging_batch_wise = isinstance(log_freq, int)
|
73
|
+
self.log_freq: Any = log_freq if self.logging_batch_wise else None
|
74
|
+
self.global_batch = 0
|
75
|
+
self.global_step = initial_global_step
|
76
|
+
|
77
|
+
if self.logging_batch_wise:
|
78
|
+
# define custom x-axis for batch logging.
|
79
|
+
wandb.define_metric("batch/batch_step")
|
80
|
+
# set all batch metrics to be logged against batch_step.
|
81
|
+
wandb.define_metric("batch/*", step_metric="batch/batch_step")
|
82
|
+
else:
|
83
|
+
# define custom x-axis for epoch-wise logging.
|
84
|
+
wandb.define_metric("epoch/epoch")
|
85
|
+
# set all epoch-wise metrics to be logged against epoch.
|
86
|
+
wandb.define_metric("epoch/*", step_metric="epoch/epoch")
|
87
|
+
|
88
|
+
def _get_lr(self) -> Union[float, None]:
|
89
|
+
if isinstance(
|
90
|
+
self.model.optimizer.learning_rate,
|
91
|
+
(tf.Variable, tf.Tensor),
|
92
|
+
) or (
|
93
|
+
hasattr(self.model.optimizer.learning_rate, "shape")
|
94
|
+
and self.model.optimizer.learning_rate.shape == ()
|
95
|
+
):
|
96
|
+
return float(self.model.optimizer.learning_rate.numpy().item())
|
97
|
+
try:
|
98
|
+
return float(
|
99
|
+
self.model.optimizer.learning_rate(step=self.global_step).numpy().item()
|
100
|
+
)
|
101
|
+
except Exception as e:
|
102
|
+
wandb.termerror(f"Unable to log learning rate: {e}", repeat=False)
|
103
|
+
return None
|
104
|
+
|
105
|
+
def on_epoch_end(self, epoch: int, logs: Optional[Dict[str, Any]] = None) -> None:
|
106
|
+
"""Called at the end of an epoch."""
|
107
|
+
logs = dict() if logs is None else {f"epoch/{k}": v for k, v in logs.items()}
|
108
|
+
|
109
|
+
logs["epoch/epoch"] = epoch
|
110
|
+
|
111
|
+
lr = self._get_lr()
|
112
|
+
if lr is not None:
|
113
|
+
logs["epoch/learning_rate"] = lr
|
114
|
+
|
115
|
+
wandb.log(logs)
|
116
|
+
|
117
|
+
def on_batch_end(self, batch: int, logs: Optional[Dict[str, Any]] = None) -> None:
|
118
|
+
self.global_step += 1
|
119
|
+
"""An alias for `on_train_batch_end` for backwards compatibility."""
|
120
|
+
if self.logging_batch_wise and batch % self.log_freq == 0:
|
121
|
+
logs = {f"batch/{k}": v for k, v in logs.items()} if logs else {}
|
122
|
+
logs["batch/batch_step"] = self.global_batch
|
123
|
+
|
124
|
+
lr = self._get_lr()
|
125
|
+
if lr is not None:
|
126
|
+
logs["batch/learning_rate"] = lr
|
127
|
+
|
128
|
+
wandb.log(logs)
|
129
|
+
|
130
|
+
self.global_batch += self.log_freq
|
131
|
+
|
132
|
+
def on_train_batch_end(
|
133
|
+
self, batch: int, logs: Optional[Dict[str, Any]] = None
|
134
|
+
) -> None:
|
135
|
+
"""Called at the end of a training batch in `fit` methods."""
|
136
|
+
self.on_batch_end(batch, logs if logs else {})
|
@@ -0,0 +1,195 @@
|
|
1
|
+
import os
|
2
|
+
import string
|
3
|
+
import sys
|
4
|
+
from typing import Any, Dict, List, Optional, Union
|
5
|
+
|
6
|
+
import tensorflow as tf # type: ignore
|
7
|
+
from tensorflow.keras import callbacks # type: ignore
|
8
|
+
|
9
|
+
import wandb
|
10
|
+
from wandb.sdk.lib import telemetry
|
11
|
+
from wandb.sdk.lib.paths import StrPath
|
12
|
+
|
13
|
+
from ..keras import patch_tf_keras
|
14
|
+
|
15
|
+
if sys.version_info >= (3, 8):
|
16
|
+
from typing import Literal
|
17
|
+
else:
|
18
|
+
from typing_extensions import Literal
|
19
|
+
|
20
|
+
|
21
|
+
Mode = Literal["auto", "min", "max"]
|
22
|
+
SaveStrategy = Literal["epoch"]
|
23
|
+
|
24
|
+
patch_tf_keras()
|
25
|
+
|
26
|
+
|
27
|
+
class WandbModelCheckpoint(callbacks.ModelCheckpoint):
|
28
|
+
"""A checkpoint that periodically saves a Keras model or model weights.
|
29
|
+
|
30
|
+
Saved weights are uploaded to W&B as a `wandb.Artifact`.
|
31
|
+
|
32
|
+
Since this callback is subclassed from `tf.keras.callbacks.ModelCheckpoint`, the
|
33
|
+
checkpointing logic is taken care of by the parent callback. You can learn more
|
34
|
+
here: https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/ModelCheckpoint
|
35
|
+
|
36
|
+
This callback is to be used in conjunction with training using `model.fit()` to save
|
37
|
+
a model or weights (in a checkpoint file) at some interval. The model checkpoints
|
38
|
+
will be logged as W&B Artifacts. You can learn more here:
|
39
|
+
https://docs.wandb.ai/guides/artifacts
|
40
|
+
|
41
|
+
This callback provides the following features:
|
42
|
+
- Save the model that has achieved "best performance" based on "monitor".
|
43
|
+
- Save the model at the end of every epoch regardless of the performance.
|
44
|
+
- Save the model at the end of epoch or after a fixed number of training batches.
|
45
|
+
- Save only model weights, or save the whole model.
|
46
|
+
- Save the model either in SavedModel format or in `.h5` format.
|
47
|
+
|
48
|
+
Arguments:
|
49
|
+
filepath: (Union[str, os.PathLike]) path to save the model file. `filepath`
|
50
|
+
can contain named formatting options, which will be filled by the value
|
51
|
+
of `epoch` and keys in `logs` (passed in `on_epoch_end`). For example:
|
52
|
+
if `filepath` is `model-{epoch:02d}-{val_loss:.2f}`, then the
|
53
|
+
model checkpoints will be saved with the epoch number and the
|
54
|
+
validation loss in the filename.
|
55
|
+
monitor: (str) The metric name to monitor. Default to "val_loss".
|
56
|
+
verbose: (int) Verbosity mode, 0 or 1. Mode 0 is silent, and mode 1
|
57
|
+
displays messages when the callback takes an action.
|
58
|
+
save_best_only: (bool) if `save_best_only=True`, it only saves when the model
|
59
|
+
is considered the "best" and the latest best model according to the
|
60
|
+
quantity monitored will not be overwritten. If `filepath` doesn't contain
|
61
|
+
formatting options like `{epoch}` then `filepath` will be overwritten by
|
62
|
+
each new better model locally. The model logged as an artifact will still be
|
63
|
+
associated with the correct `monitor`. Artifacts will be uploaded
|
64
|
+
continuously and versioned separately as a new best model is found.
|
65
|
+
save_weights_only: (bool) if True, then only the model's weights will be saved.
|
66
|
+
mode: (Mode) one of {'auto', 'min', 'max'}. For `val_acc`, this should be `max`,
|
67
|
+
for `val_loss` this should be `min`, etc.
|
68
|
+
save_freq: (Union[SaveStrategy, int]) `epoch` or integer. When using `'epoch'`,
|
69
|
+
the callback saves the model after each epoch. When using an integer, the
|
70
|
+
callback saves the model at end of this many batches.
|
71
|
+
Note that when monitoring validation metrics such as `val_acc` or `val_loss`,
|
72
|
+
save_freq must be set to "epoch" as those metrics are only available at the
|
73
|
+
end of an epoch.
|
74
|
+
initial_value_threshold: (Optional[float]) Floating point initial "best" value of the metric
|
75
|
+
to be monitored.
|
76
|
+
"""
|
77
|
+
|
78
|
+
def __init__(
|
79
|
+
self,
|
80
|
+
filepath: StrPath,
|
81
|
+
monitor: str = "val_loss",
|
82
|
+
verbose: int = 0,
|
83
|
+
save_best_only: bool = False,
|
84
|
+
save_weights_only: bool = False,
|
85
|
+
mode: Mode = "auto",
|
86
|
+
save_freq: Union[SaveStrategy, int] = "epoch",
|
87
|
+
initial_value_threshold: Optional[float] = None,
|
88
|
+
**kwargs: Any,
|
89
|
+
) -> None:
|
90
|
+
super().__init__(
|
91
|
+
filepath=filepath,
|
92
|
+
monitor=monitor,
|
93
|
+
verbose=verbose,
|
94
|
+
save_best_only=save_best_only,
|
95
|
+
save_weights_only=save_weights_only,
|
96
|
+
mode=mode,
|
97
|
+
save_freq=save_freq,
|
98
|
+
initial_value_threshold=initial_value_threshold,
|
99
|
+
**kwargs,
|
100
|
+
)
|
101
|
+
if wandb.run is None:
|
102
|
+
raise wandb.Error(
|
103
|
+
"You must call `wandb.init()` before `WandbModelCheckpoint()`"
|
104
|
+
)
|
105
|
+
with telemetry.context(run=wandb.run) as tel:
|
106
|
+
tel.feature.keras_model_checkpoint = True
|
107
|
+
|
108
|
+
self.save_weights_only = save_weights_only
|
109
|
+
|
110
|
+
# User-friendly warning when trying to save the best model.
|
111
|
+
if self.save_best_only:
|
112
|
+
self._check_filepath()
|
113
|
+
|
114
|
+
self._is_old_tf_keras_version: Optional[bool] = None
|
115
|
+
|
116
|
+
def on_train_batch_end(
|
117
|
+
self, batch: int, logs: Optional[Dict[str, float]] = None
|
118
|
+
) -> None:
|
119
|
+
if self._should_save_on_batch(batch):
|
120
|
+
if self.is_old_tf_keras_version:
|
121
|
+
# Save the model and get filepath
|
122
|
+
self._save_model(epoch=self._current_epoch, logs=logs)
|
123
|
+
filepath = self._get_file_path(epoch=self._current_epoch, logs=logs)
|
124
|
+
else:
|
125
|
+
# Save the model and get filepath
|
126
|
+
self._save_model(epoch=self._current_epoch, batch=batch, logs=logs)
|
127
|
+
filepath = self._get_file_path(
|
128
|
+
epoch=self._current_epoch, batch=batch, logs=logs
|
129
|
+
)
|
130
|
+
# Log the model as artifact
|
131
|
+
aliases = ["latest", f"epoch_{self._current_epoch}_batch_{batch}"]
|
132
|
+
self._log_ckpt_as_artifact(filepath, aliases=aliases)
|
133
|
+
|
134
|
+
def on_epoch_end(self, epoch: int, logs: Optional[Dict[str, float]] = None) -> None:
|
135
|
+
super().on_epoch_end(epoch, logs)
|
136
|
+
# Check if model checkpoint is created at the end of epoch.
|
137
|
+
if self.save_freq == "epoch":
|
138
|
+
# Get filepath where the model checkpoint is saved.
|
139
|
+
if self.is_old_tf_keras_version:
|
140
|
+
filepath = self._get_file_path(epoch=epoch, logs=logs)
|
141
|
+
else:
|
142
|
+
filepath = self._get_file_path(epoch=epoch, batch=None, logs=logs)
|
143
|
+
# Log the model as artifact
|
144
|
+
aliases = ["latest", f"epoch_{epoch}"]
|
145
|
+
self._log_ckpt_as_artifact(filepath, aliases=aliases)
|
146
|
+
|
147
|
+
def _log_ckpt_as_artifact(
|
148
|
+
self, filepath: str, aliases: Optional[List[str]] = None
|
149
|
+
) -> None:
|
150
|
+
"""Log model checkpoint as W&B Artifact."""
|
151
|
+
try:
|
152
|
+
assert wandb.run is not None
|
153
|
+
model_checkpoint_artifact = wandb.Artifact(
|
154
|
+
f"run_{wandb.run.id}_model", type="model"
|
155
|
+
)
|
156
|
+
if os.path.isfile(filepath):
|
157
|
+
model_checkpoint_artifact.add_file(filepath)
|
158
|
+
elif os.path.isdir(filepath):
|
159
|
+
model_checkpoint_artifact.add_dir(filepath)
|
160
|
+
else:
|
161
|
+
raise FileNotFoundError(f"No such file or directory {filepath}")
|
162
|
+
wandb.log_artifact(model_checkpoint_artifact, aliases=aliases or [])
|
163
|
+
except ValueError:
|
164
|
+
# This error occurs when `save_best_only=True` and the model
|
165
|
+
# checkpoint is not saved for that epoch/batch. Since TF/Keras
|
166
|
+
# is giving friendly log, we can avoid clustering the stdout.
|
167
|
+
pass
|
168
|
+
|
169
|
+
def _check_filepath(self) -> None:
|
170
|
+
placeholders = []
|
171
|
+
for tup in string.Formatter().parse(self.filepath):
|
172
|
+
if tup[1] is not None:
|
173
|
+
placeholders.append(tup[1])
|
174
|
+
if len(placeholders) == 0:
|
175
|
+
wandb.termwarn(
|
176
|
+
"When using `save_best_only`, ensure that the `filepath` argument "
|
177
|
+
"contains formatting placeholders like `{epoch:02d}` or `{batch:02d}`. "
|
178
|
+
"This ensures correct interpretation of the logged artifacts.",
|
179
|
+
repeat=False,
|
180
|
+
)
|
181
|
+
|
182
|
+
@property
|
183
|
+
def is_old_tf_keras_version(self) -> Optional[bool]:
|
184
|
+
if self._is_old_tf_keras_version is None:
|
185
|
+
from wandb.util import parse_version
|
186
|
+
|
187
|
+
try:
|
188
|
+
if parse_version(tf.keras.__version__) < parse_version("2.6.0"):
|
189
|
+
self._is_old_tf_keras_version = True
|
190
|
+
else:
|
191
|
+
self._is_old_tf_keras_version = False
|
192
|
+
except AttributeError:
|
193
|
+
self._is_old_tf_keras_version = False
|
194
|
+
|
195
|
+
return self._is_old_tf_keras_version
|
@@ -0,0 +1,226 @@
|
|
1
|
+
import abc
|
2
|
+
from typing import Any, Dict, List, Optional
|
3
|
+
|
4
|
+
from tensorflow.keras.callbacks import Callback # type: ignore
|
5
|
+
|
6
|
+
import wandb
|
7
|
+
from wandb.sdk.lib import telemetry
|
8
|
+
|
9
|
+
|
10
|
+
class WandbEvalCallback(Callback, abc.ABC):
|
11
|
+
"""Abstract base class to build Keras callbacks for model prediction visualization.
|
12
|
+
|
13
|
+
You can build callbacks for visualizing model predictions `on_epoch_end`
|
14
|
+
that can be passed to `model.fit()` for classification, object detection,
|
15
|
+
segmentation, etc. tasks.
|
16
|
+
|
17
|
+
To use this, inherit from this base callback class and implement the
|
18
|
+
`add_ground_truth` and `add_model_prediction` methods.
|
19
|
+
|
20
|
+
The base class will take care of the following:
|
21
|
+
- Initialize `data_table` for logging the ground truth and
|
22
|
+
`pred_table` for predictions.
|
23
|
+
- The data uploaded to `data_table` is used as a reference for the
|
24
|
+
`pred_table`. This is to reduce the memory footprint. The `data_table_ref`
|
25
|
+
is a list that can be used to access the referenced data.
|
26
|
+
Check out the example below to see how it's done.
|
27
|
+
- Log the tables to W&B as W&B Artifacts.
|
28
|
+
- Each new `pred_table` is logged as a new version with aliases.
|
29
|
+
|
30
|
+
Example:
|
31
|
+
```python
|
32
|
+
class WandbClfEvalCallback(WandbEvalCallback):
|
33
|
+
def __init__(self, validation_data, data_table_columns, pred_table_columns):
|
34
|
+
super().__init__(data_table_columns, pred_table_columns)
|
35
|
+
|
36
|
+
self.x = validation_data[0]
|
37
|
+
self.y = validation_data[1]
|
38
|
+
|
39
|
+
def add_ground_truth(self):
|
40
|
+
for idx, (image, label) in enumerate(zip(self.x, self.y)):
|
41
|
+
self.data_table.add_data(idx, wandb.Image(image), label)
|
42
|
+
|
43
|
+
def add_model_predictions(self, epoch):
|
44
|
+
preds = self.model.predict(self.x, verbose=0)
|
45
|
+
preds = tf.argmax(preds, axis=-1)
|
46
|
+
|
47
|
+
data_table_ref = self.data_table_ref
|
48
|
+
table_idxs = data_table_ref.get_index()
|
49
|
+
|
50
|
+
for idx in table_idxs:
|
51
|
+
pred = preds[idx]
|
52
|
+
self.pred_table.add_data(
|
53
|
+
epoch,
|
54
|
+
data_table_ref.data[idx][0],
|
55
|
+
data_table_ref.data[idx][1],
|
56
|
+
data_table_ref.data[idx][2],
|
57
|
+
pred,
|
58
|
+
)
|
59
|
+
|
60
|
+
|
61
|
+
model.fit(
|
62
|
+
x,
|
63
|
+
y,
|
64
|
+
epochs=2,
|
65
|
+
validation_data=(x, y),
|
66
|
+
callbacks=[
|
67
|
+
WandbClfEvalCallback(
|
68
|
+
validation_data=(x, y),
|
69
|
+
data_table_columns=["idx", "image", "label"],
|
70
|
+
pred_table_columns=["epoch", "idx", "image", "label", "pred"],
|
71
|
+
)
|
72
|
+
],
|
73
|
+
)
|
74
|
+
```
|
75
|
+
|
76
|
+
To have more fine-grained control, you can override the `on_train_begin` and
|
77
|
+
`on_epoch_end` methods. If you want to log the samples after N batched, you
|
78
|
+
can implement `on_train_batch_end` method.
|
79
|
+
"""
|
80
|
+
|
81
|
+
def __init__(
|
82
|
+
self,
|
83
|
+
data_table_columns: List[str],
|
84
|
+
pred_table_columns: List[str],
|
85
|
+
*args: Any,
|
86
|
+
**kwargs: Any,
|
87
|
+
) -> None:
|
88
|
+
super().__init__(*args, **kwargs)
|
89
|
+
|
90
|
+
if wandb.run is None:
|
91
|
+
raise wandb.Error(
|
92
|
+
"You must call `wandb.init()` first before using this callback."
|
93
|
+
)
|
94
|
+
|
95
|
+
with telemetry.context(run=wandb.run) as tel:
|
96
|
+
tel.feature.keras_wandb_eval_callback = True
|
97
|
+
|
98
|
+
self.data_table_columns = data_table_columns
|
99
|
+
self.pred_table_columns = pred_table_columns
|
100
|
+
|
101
|
+
def on_train_begin(self, logs: Optional[Dict[str, float]] = None) -> None:
|
102
|
+
# Initialize the data_table
|
103
|
+
self.init_data_table(column_names=self.data_table_columns)
|
104
|
+
# Log the ground truth data
|
105
|
+
self.add_ground_truth(logs)
|
106
|
+
# Log the data_table as W&B Artifacts
|
107
|
+
self.log_data_table()
|
108
|
+
|
109
|
+
def on_epoch_end(self, epoch: int, logs: Optional[Dict[str, float]] = None) -> None:
|
110
|
+
# Initialize the pred_table
|
111
|
+
self.init_pred_table(column_names=self.pred_table_columns)
|
112
|
+
# Log the model prediction
|
113
|
+
self.add_model_predictions(epoch, logs)
|
114
|
+
# Log the pred_table as W&B Artifacts
|
115
|
+
self.log_pred_table()
|
116
|
+
|
117
|
+
@abc.abstractmethod
|
118
|
+
def add_ground_truth(self, logs: Optional[Dict[str, float]] = None) -> None:
|
119
|
+
"""Add ground truth data to `data_table`.
|
120
|
+
|
121
|
+
Use this method to write the logic for adding validation/training data to
|
122
|
+
`data_table` initialized using `init_data_table` method.
|
123
|
+
|
124
|
+
Example:
|
125
|
+
```python
|
126
|
+
for idx, data in enumerate(dataloader):
|
127
|
+
self.data_table.add_data(idx, data)
|
128
|
+
```
|
129
|
+
This method is called once `on_train_begin` or equivalent hook.
|
130
|
+
"""
|
131
|
+
raise NotImplementedError(f"{self.__class__.__name__}.add_ground_truth")
|
132
|
+
|
133
|
+
@abc.abstractmethod
|
134
|
+
def add_model_predictions(
|
135
|
+
self, epoch: int, logs: Optional[Dict[str, float]] = None
|
136
|
+
) -> None:
|
137
|
+
"""Add a prediction from a model to `pred_table`.
|
138
|
+
|
139
|
+
Use this method to write the logic for adding model prediction for validation/
|
140
|
+
training data to `pred_table` initialized using `init_pred_table` method.
|
141
|
+
|
142
|
+
Example:
|
143
|
+
```python
|
144
|
+
# Assuming the dataloader is not shuffling the samples.
|
145
|
+
for idx, data in enumerate(dataloader):
|
146
|
+
preds = model.predict(data)
|
147
|
+
self.pred_table.add_data(
|
148
|
+
self.data_table_ref.data[idx][0], self.data_table_ref.data[idx][1], preds
|
149
|
+
)
|
150
|
+
```
|
151
|
+
This method is called `on_epoch_end` or equivalent hook.
|
152
|
+
"""
|
153
|
+
raise NotImplementedError(f"{self.__class__.__name__}.add_model_predictions")
|
154
|
+
|
155
|
+
def init_data_table(self, column_names: List[str]) -> None:
|
156
|
+
"""Initialize the W&B Tables for validation data.
|
157
|
+
|
158
|
+
Call this method `on_train_begin` or equivalent hook. This is followed by adding
|
159
|
+
data to the table row or column wise.
|
160
|
+
|
161
|
+
Args:
|
162
|
+
column_names: (list) Column names for W&B Tables.
|
163
|
+
"""
|
164
|
+
self.data_table = wandb.Table(columns=column_names, allow_mixed_types=True)
|
165
|
+
|
166
|
+
def init_pred_table(self, column_names: List[str]) -> None:
|
167
|
+
"""Initialize the W&B Tables for model evaluation.
|
168
|
+
|
169
|
+
Call this method `on_epoch_end` or equivalent hook. This is followed by adding
|
170
|
+
data to the table row or column wise.
|
171
|
+
|
172
|
+
Args:
|
173
|
+
column_names: (list) Column names for W&B Tables.
|
174
|
+
"""
|
175
|
+
self.pred_table = wandb.Table(columns=column_names)
|
176
|
+
|
177
|
+
def log_data_table(
|
178
|
+
self, name: str = "val", type: str = "dataset", table_name: str = "val_data"
|
179
|
+
) -> None:
|
180
|
+
"""Log the `data_table` as W&B artifact and call `use_artifact` on it.
|
181
|
+
|
182
|
+
This lets the evaluation table use the reference of already uploaded data
|
183
|
+
(images, text, scalar, etc.) without re-uploading.
|
184
|
+
|
185
|
+
Args:
|
186
|
+
name: (str) A human-readable name for this artifact, which is how you can
|
187
|
+
identify this artifact in the UI or reference it in use_artifact calls.
|
188
|
+
(default is 'val')
|
189
|
+
type: (str) The type of the artifact, which is used to organize and
|
190
|
+
differentiate artifacts. (default is 'dataset')
|
191
|
+
table_name: (str) The name of the table as will be displayed in the UI.
|
192
|
+
(default is 'val_data').
|
193
|
+
"""
|
194
|
+
data_artifact = wandb.Artifact(name, type=type)
|
195
|
+
data_artifact.add(self.data_table, table_name)
|
196
|
+
|
197
|
+
# Calling `use_artifact` uploads the data to W&B.
|
198
|
+
assert wandb.run is not None
|
199
|
+
wandb.run.use_artifact(data_artifact)
|
200
|
+
data_artifact.wait()
|
201
|
+
|
202
|
+
# We get the reference table.
|
203
|
+
self.data_table_ref = data_artifact.get(table_name)
|
204
|
+
|
205
|
+
def log_pred_table(
|
206
|
+
self,
|
207
|
+
type: str = "evaluation",
|
208
|
+
table_name: str = "eval_data",
|
209
|
+
aliases: Optional[List[str]] = None,
|
210
|
+
) -> None:
|
211
|
+
"""Log the W&B Tables for model evaluation.
|
212
|
+
|
213
|
+
The table will be logged multiple times creating new version. Use this
|
214
|
+
to compare models at different intervals interactively.
|
215
|
+
|
216
|
+
Args:
|
217
|
+
type: (str) The type of the artifact, which is used to organize and
|
218
|
+
differentiate artifacts. (default is 'evaluation')
|
219
|
+
table_name: (str) The name of the table as will be displayed in the UI.
|
220
|
+
(default is 'eval_data')
|
221
|
+
aliases: (List[str]) List of aliases for the prediction table.
|
222
|
+
"""
|
223
|
+
assert wandb.run is not None
|
224
|
+
pred_artifact = wandb.Artifact(f"run_{wandb.run.id}_pred", type=type)
|
225
|
+
pred_artifact.add(self.pred_table, table_name)
|
226
|
+
wandb.run.log_artifact(pred_artifact, aliases=aliases or ["latest"])
|