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.
Files changed (827) hide show
  1. package_readme.md +89 -0
  2. wandb/__init__.py +245 -0
  3. wandb/__init__.pyi +1139 -0
  4. wandb/__main__.py +3 -0
  5. wandb/_globals.py +19 -0
  6. wandb/agents/__init__.py +0 -0
  7. wandb/agents/pyagent.py +363 -0
  8. wandb/analytics/__init__.py +3 -0
  9. wandb/analytics/sentry.py +266 -0
  10. wandb/apis/__init__.py +48 -0
  11. wandb/apis/attrs.py +40 -0
  12. wandb/apis/importers/__init__.py +1 -0
  13. wandb/apis/importers/internals/internal.py +385 -0
  14. wandb/apis/importers/internals/protocols.py +99 -0
  15. wandb/apis/importers/internals/util.py +78 -0
  16. wandb/apis/importers/mlflow.py +254 -0
  17. wandb/apis/importers/validation.py +108 -0
  18. wandb/apis/importers/wandb.py +1603 -0
  19. wandb/apis/internal.py +232 -0
  20. wandb/apis/normalize.py +89 -0
  21. wandb/apis/paginator.py +81 -0
  22. wandb/apis/public/__init__.py +34 -0
  23. wandb/apis/public/api.py +1305 -0
  24. wandb/apis/public/artifacts.py +1090 -0
  25. wandb/apis/public/const.py +4 -0
  26. wandb/apis/public/files.py +195 -0
  27. wandb/apis/public/history.py +149 -0
  28. wandb/apis/public/jobs.py +659 -0
  29. wandb/apis/public/projects.py +154 -0
  30. wandb/apis/public/query_generator.py +166 -0
  31. wandb/apis/public/reports.py +469 -0
  32. wandb/apis/public/runs.py +914 -0
  33. wandb/apis/public/sweeps.py +240 -0
  34. wandb/apis/public/teams.py +198 -0
  35. wandb/apis/public/users.py +136 -0
  36. wandb/apis/reports/__init__.py +1 -0
  37. wandb/apis/reports/v1/__init__.py +8 -0
  38. wandb/apis/reports/v2/__init__.py +8 -0
  39. wandb/apis/workspaces/__init__.py +8 -0
  40. wandb/beta/workflows.py +288 -0
  41. wandb/bin/nvidia_gpu_stats +0 -0
  42. wandb/bin/wandb-core +0 -0
  43. wandb/cli/__init__.py +0 -0
  44. wandb/cli/cli.py +3004 -0
  45. wandb/data_types.py +63 -0
  46. wandb/docker/__init__.py +342 -0
  47. wandb/docker/auth.py +436 -0
  48. wandb/docker/wandb-entrypoint.sh +33 -0
  49. wandb/docker/www_authenticate.py +94 -0
  50. wandb/env.py +514 -0
  51. wandb/errors/__init__.py +17 -0
  52. wandb/errors/errors.py +37 -0
  53. wandb/errors/term.py +103 -0
  54. wandb/errors/util.py +57 -0
  55. wandb/errors/warnings.py +2 -0
  56. wandb/filesync/__init__.py +0 -0
  57. wandb/filesync/dir_watcher.py +403 -0
  58. wandb/filesync/stats.py +100 -0
  59. wandb/filesync/step_checksum.py +142 -0
  60. wandb/filesync/step_prepare.py +179 -0
  61. wandb/filesync/step_upload.py +290 -0
  62. wandb/filesync/upload_job.py +142 -0
  63. wandb/integration/__init__.py +0 -0
  64. wandb/integration/catboost/__init__.py +5 -0
  65. wandb/integration/catboost/catboost.py +178 -0
  66. wandb/integration/cohere/__init__.py +3 -0
  67. wandb/integration/cohere/cohere.py +21 -0
  68. wandb/integration/cohere/resolver.py +347 -0
  69. wandb/integration/diffusers/__init__.py +3 -0
  70. wandb/integration/diffusers/autologger.py +76 -0
  71. wandb/integration/diffusers/pipeline_resolver.py +50 -0
  72. wandb/integration/diffusers/resolvers/__init__.py +9 -0
  73. wandb/integration/diffusers/resolvers/multimodal.py +882 -0
  74. wandb/integration/diffusers/resolvers/utils.py +102 -0
  75. wandb/integration/fastai/__init__.py +249 -0
  76. wandb/integration/gym/__init__.py +105 -0
  77. wandb/integration/huggingface/__init__.py +3 -0
  78. wandb/integration/huggingface/huggingface.py +18 -0
  79. wandb/integration/huggingface/resolver.py +213 -0
  80. wandb/integration/keras/__init__.py +11 -0
  81. wandb/integration/keras/callbacks/__init__.py +5 -0
  82. wandb/integration/keras/callbacks/metrics_logger.py +136 -0
  83. wandb/integration/keras/callbacks/model_checkpoint.py +195 -0
  84. wandb/integration/keras/callbacks/tables_builder.py +226 -0
  85. wandb/integration/keras/keras.py +1091 -0
  86. wandb/integration/kfp/__init__.py +6 -0
  87. wandb/integration/kfp/helpers.py +28 -0
  88. wandb/integration/kfp/kfp_patch.py +324 -0
  89. wandb/integration/kfp/wandb_logging.py +182 -0
  90. wandb/integration/langchain/__init__.py +3 -0
  91. wandb/integration/langchain/wandb_tracer.py +48 -0
  92. wandb/integration/lightgbm/__init__.py +239 -0
  93. wandb/integration/lightning/__init__.py +0 -0
  94. wandb/integration/lightning/fabric/__init__.py +3 -0
  95. wandb/integration/lightning/fabric/logger.py +762 -0
  96. wandb/integration/magic.py +556 -0
  97. wandb/integration/metaflow/__init__.py +3 -0
  98. wandb/integration/metaflow/metaflow.py +383 -0
  99. wandb/integration/openai/__init__.py +3 -0
  100. wandb/integration/openai/fine_tuning.py +480 -0
  101. wandb/integration/openai/openai.py +22 -0
  102. wandb/integration/openai/resolver.py +240 -0
  103. wandb/integration/prodigy/__init__.py +3 -0
  104. wandb/integration/prodigy/prodigy.py +299 -0
  105. wandb/integration/sacred/__init__.py +117 -0
  106. wandb/integration/sagemaker/__init__.py +12 -0
  107. wandb/integration/sagemaker/auth.py +28 -0
  108. wandb/integration/sagemaker/config.py +49 -0
  109. wandb/integration/sagemaker/files.py +3 -0
  110. wandb/integration/sagemaker/resources.py +34 -0
  111. wandb/integration/sb3/__init__.py +3 -0
  112. wandb/integration/sb3/sb3.py +153 -0
  113. wandb/integration/sklearn/__init__.py +37 -0
  114. wandb/integration/sklearn/calculate/__init__.py +32 -0
  115. wandb/integration/sklearn/calculate/calibration_curves.py +125 -0
  116. wandb/integration/sklearn/calculate/class_proportions.py +68 -0
  117. wandb/integration/sklearn/calculate/confusion_matrix.py +93 -0
  118. wandb/integration/sklearn/calculate/decision_boundaries.py +40 -0
  119. wandb/integration/sklearn/calculate/elbow_curve.py +55 -0
  120. wandb/integration/sklearn/calculate/feature_importances.py +67 -0
  121. wandb/integration/sklearn/calculate/learning_curve.py +64 -0
  122. wandb/integration/sklearn/calculate/outlier_candidates.py +69 -0
  123. wandb/integration/sklearn/calculate/residuals.py +86 -0
  124. wandb/integration/sklearn/calculate/silhouette.py +118 -0
  125. wandb/integration/sklearn/calculate/summary_metrics.py +62 -0
  126. wandb/integration/sklearn/plot/__init__.py +35 -0
  127. wandb/integration/sklearn/plot/classifier.py +329 -0
  128. wandb/integration/sklearn/plot/clusterer.py +146 -0
  129. wandb/integration/sklearn/plot/regressor.py +121 -0
  130. wandb/integration/sklearn/plot/shared.py +91 -0
  131. wandb/integration/sklearn/utils.py +183 -0
  132. wandb/integration/tensorboard/__init__.py +10 -0
  133. wandb/integration/tensorboard/log.py +355 -0
  134. wandb/integration/tensorboard/monkeypatch.py +185 -0
  135. wandb/integration/tensorflow/__init__.py +5 -0
  136. wandb/integration/tensorflow/estimator_hook.py +54 -0
  137. wandb/integration/torch/__init__.py +0 -0
  138. wandb/integration/torch/wandb_torch.py +554 -0
  139. wandb/integration/ultralytics/__init__.py +11 -0
  140. wandb/integration/ultralytics/bbox_utils.py +208 -0
  141. wandb/integration/ultralytics/callback.py +524 -0
  142. wandb/integration/ultralytics/classification_utils.py +83 -0
  143. wandb/integration/ultralytics/mask_utils.py +202 -0
  144. wandb/integration/ultralytics/pose_utils.py +103 -0
  145. wandb/integration/xgboost/__init__.py +11 -0
  146. wandb/integration/xgboost/xgboost.py +189 -0
  147. wandb/integration/yolov8/__init__.py +0 -0
  148. wandb/integration/yolov8/yolov8.py +284 -0
  149. wandb/jupyter.py +515 -0
  150. wandb/magic.py +3 -0
  151. wandb/mpmain/__init__.py +0 -0
  152. wandb/mpmain/__main__.py +1 -0
  153. wandb/old/__init__.py +0 -0
  154. wandb/old/core.py +53 -0
  155. wandb/old/settings.py +173 -0
  156. wandb/old/summary.py +440 -0
  157. wandb/plot/__init__.py +19 -0
  158. wandb/plot/bar.py +45 -0
  159. wandb/plot/confusion_matrix.py +100 -0
  160. wandb/plot/histogram.py +39 -0
  161. wandb/plot/line.py +43 -0
  162. wandb/plot/line_series.py +88 -0
  163. wandb/plot/pr_curve.py +136 -0
  164. wandb/plot/roc_curve.py +118 -0
  165. wandb/plot/scatter.py +32 -0
  166. wandb/plot/utils.py +183 -0
  167. wandb/plot/viz.py +123 -0
  168. wandb/proto/__init__.py +0 -0
  169. wandb/proto/v3/__init__.py +0 -0
  170. wandb/proto/v3/wandb_base_pb2.py +55 -0
  171. wandb/proto/v3/wandb_internal_pb2.py +1608 -0
  172. wandb/proto/v3/wandb_server_pb2.py +208 -0
  173. wandb/proto/v3/wandb_settings_pb2.py +112 -0
  174. wandb/proto/v3/wandb_telemetry_pb2.py +106 -0
  175. wandb/proto/v4/__init__.py +0 -0
  176. wandb/proto/v4/wandb_base_pb2.py +30 -0
  177. wandb/proto/v4/wandb_internal_pb2.py +360 -0
  178. wandb/proto/v4/wandb_server_pb2.py +63 -0
  179. wandb/proto/v4/wandb_settings_pb2.py +45 -0
  180. wandb/proto/v4/wandb_telemetry_pb2.py +41 -0
  181. wandb/proto/v5/wandb_base_pb2.py +31 -0
  182. wandb/proto/v5/wandb_internal_pb2.py +361 -0
  183. wandb/proto/v5/wandb_server_pb2.py +64 -0
  184. wandb/proto/v5/wandb_settings_pb2.py +46 -0
  185. wandb/proto/v5/wandb_telemetry_pb2.py +42 -0
  186. wandb/proto/wandb_base_pb2.py +10 -0
  187. wandb/proto/wandb_deprecated.py +53 -0
  188. wandb/proto/wandb_generate_deprecated.py +34 -0
  189. wandb/proto/wandb_generate_proto.py +49 -0
  190. wandb/proto/wandb_internal_pb2.py +16 -0
  191. wandb/proto/wandb_server_pb2.py +10 -0
  192. wandb/proto/wandb_settings_pb2.py +10 -0
  193. wandb/proto/wandb_telemetry_pb2.py +10 -0
  194. wandb/py.typed +0 -0
  195. wandb/sdk/__init__.py +37 -0
  196. wandb/sdk/artifacts/__init__.py +0 -0
  197. wandb/sdk/artifacts/_validators.py +90 -0
  198. wandb/sdk/artifacts/artifact.py +2389 -0
  199. wandb/sdk/artifacts/artifact_download_logger.py +43 -0
  200. wandb/sdk/artifacts/artifact_file_cache.py +253 -0
  201. wandb/sdk/artifacts/artifact_instance_cache.py +17 -0
  202. wandb/sdk/artifacts/artifact_manifest.py +74 -0
  203. wandb/sdk/artifacts/artifact_manifest_entry.py +249 -0
  204. wandb/sdk/artifacts/artifact_manifests/__init__.py +0 -0
  205. wandb/sdk/artifacts/artifact_manifests/artifact_manifest_v1.py +92 -0
  206. wandb/sdk/artifacts/artifact_saver.py +269 -0
  207. wandb/sdk/artifacts/artifact_state.py +11 -0
  208. wandb/sdk/artifacts/artifact_ttl.py +7 -0
  209. wandb/sdk/artifacts/exceptions.py +57 -0
  210. wandb/sdk/artifacts/staging.py +25 -0
  211. wandb/sdk/artifacts/storage_handler.py +62 -0
  212. wandb/sdk/artifacts/storage_handlers/__init__.py +0 -0
  213. wandb/sdk/artifacts/storage_handlers/azure_handler.py +208 -0
  214. wandb/sdk/artifacts/storage_handlers/gcs_handler.py +228 -0
  215. wandb/sdk/artifacts/storage_handlers/http_handler.py +114 -0
  216. wandb/sdk/artifacts/storage_handlers/local_file_handler.py +141 -0
  217. wandb/sdk/artifacts/storage_handlers/multi_handler.py +56 -0
  218. wandb/sdk/artifacts/storage_handlers/s3_handler.py +300 -0
  219. wandb/sdk/artifacts/storage_handlers/tracking_handler.py +72 -0
  220. wandb/sdk/artifacts/storage_handlers/wb_artifact_handler.py +135 -0
  221. wandb/sdk/artifacts/storage_handlers/wb_local_artifact_handler.py +74 -0
  222. wandb/sdk/artifacts/storage_layout.py +6 -0
  223. wandb/sdk/artifacts/storage_policies/__init__.py +4 -0
  224. wandb/sdk/artifacts/storage_policies/register.py +1 -0
  225. wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +378 -0
  226. wandb/sdk/artifacts/storage_policy.py +72 -0
  227. wandb/sdk/backend/__init__.py +0 -0
  228. wandb/sdk/backend/backend.py +222 -0
  229. wandb/sdk/data_types/__init__.py +0 -0
  230. wandb/sdk/data_types/_dtypes.py +914 -0
  231. wandb/sdk/data_types/_private.py +10 -0
  232. wandb/sdk/data_types/audio.py +165 -0
  233. wandb/sdk/data_types/base_types/__init__.py +0 -0
  234. wandb/sdk/data_types/base_types/json_metadata.py +55 -0
  235. wandb/sdk/data_types/base_types/media.py +315 -0
  236. wandb/sdk/data_types/base_types/wb_value.py +272 -0
  237. wandb/sdk/data_types/bokeh.py +70 -0
  238. wandb/sdk/data_types/graph.py +405 -0
  239. wandb/sdk/data_types/helper_types/__init__.py +0 -0
  240. wandb/sdk/data_types/helper_types/bounding_boxes_2d.py +295 -0
  241. wandb/sdk/data_types/helper_types/classes.py +159 -0
  242. wandb/sdk/data_types/helper_types/image_mask.py +235 -0
  243. wandb/sdk/data_types/histogram.py +96 -0
  244. wandb/sdk/data_types/html.py +115 -0
  245. wandb/sdk/data_types/image.py +845 -0
  246. wandb/sdk/data_types/molecule.py +241 -0
  247. wandb/sdk/data_types/object_3d.py +474 -0
  248. wandb/sdk/data_types/plotly.py +82 -0
  249. wandb/sdk/data_types/saved_model.py +446 -0
  250. wandb/sdk/data_types/table.py +1204 -0
  251. wandb/sdk/data_types/trace_tree.py +438 -0
  252. wandb/sdk/data_types/utils.py +229 -0
  253. wandb/sdk/data_types/video.py +247 -0
  254. wandb/sdk/integration_utils/__init__.py +0 -0
  255. wandb/sdk/integration_utils/auto_logging.py +239 -0
  256. wandb/sdk/integration_utils/data_logging.py +475 -0
  257. wandb/sdk/interface/__init__.py +0 -0
  258. wandb/sdk/interface/constants.py +4 -0
  259. wandb/sdk/interface/interface.py +972 -0
  260. wandb/sdk/interface/interface_queue.py +59 -0
  261. wandb/sdk/interface/interface_relay.py +53 -0
  262. wandb/sdk/interface/interface_shared.py +537 -0
  263. wandb/sdk/interface/interface_sock.py +61 -0
  264. wandb/sdk/interface/message_future.py +27 -0
  265. wandb/sdk/interface/message_future_poll.py +50 -0
  266. wandb/sdk/interface/router.py +118 -0
  267. wandb/sdk/interface/router_queue.py +44 -0
  268. wandb/sdk/interface/router_relay.py +39 -0
  269. wandb/sdk/interface/router_sock.py +36 -0
  270. wandb/sdk/interface/summary_record.py +67 -0
  271. wandb/sdk/internal/__init__.py +0 -0
  272. wandb/sdk/internal/context.py +89 -0
  273. wandb/sdk/internal/datastore.py +297 -0
  274. wandb/sdk/internal/file_pusher.py +181 -0
  275. wandb/sdk/internal/file_stream.py +695 -0
  276. wandb/sdk/internal/flow_control.py +263 -0
  277. wandb/sdk/internal/handler.py +901 -0
  278. wandb/sdk/internal/internal.py +417 -0
  279. wandb/sdk/internal/internal_api.py +4358 -0
  280. wandb/sdk/internal/internal_util.py +100 -0
  281. wandb/sdk/internal/job_builder.py +629 -0
  282. wandb/sdk/internal/profiler.py +78 -0
  283. wandb/sdk/internal/progress.py +83 -0
  284. wandb/sdk/internal/run.py +25 -0
  285. wandb/sdk/internal/sample.py +70 -0
  286. wandb/sdk/internal/sender.py +1686 -0
  287. wandb/sdk/internal/sender_config.py +197 -0
  288. wandb/sdk/internal/settings_static.py +90 -0
  289. wandb/sdk/internal/system/__init__.py +0 -0
  290. wandb/sdk/internal/system/assets/__init__.py +27 -0
  291. wandb/sdk/internal/system/assets/aggregators.py +37 -0
  292. wandb/sdk/internal/system/assets/asset_registry.py +20 -0
  293. wandb/sdk/internal/system/assets/cpu.py +163 -0
  294. wandb/sdk/internal/system/assets/disk.py +210 -0
  295. wandb/sdk/internal/system/assets/gpu.py +416 -0
  296. wandb/sdk/internal/system/assets/gpu_amd.py +239 -0
  297. wandb/sdk/internal/system/assets/gpu_apple.py +177 -0
  298. wandb/sdk/internal/system/assets/interfaces.py +207 -0
  299. wandb/sdk/internal/system/assets/ipu.py +177 -0
  300. wandb/sdk/internal/system/assets/memory.py +166 -0
  301. wandb/sdk/internal/system/assets/network.py +125 -0
  302. wandb/sdk/internal/system/assets/open_metrics.py +299 -0
  303. wandb/sdk/internal/system/assets/tpu.py +154 -0
  304. wandb/sdk/internal/system/assets/trainium.py +399 -0
  305. wandb/sdk/internal/system/env_probe_helpers.py +13 -0
  306. wandb/sdk/internal/system/system_info.py +249 -0
  307. wandb/sdk/internal/system/system_monitor.py +229 -0
  308. wandb/sdk/internal/tb_watcher.py +518 -0
  309. wandb/sdk/internal/thread_local_settings.py +18 -0
  310. wandb/sdk/internal/writer.py +206 -0
  311. wandb/sdk/launch/__init__.py +14 -0
  312. wandb/sdk/launch/_launch.py +330 -0
  313. wandb/sdk/launch/_launch_add.py +255 -0
  314. wandb/sdk/launch/_project_spec.py +566 -0
  315. wandb/sdk/launch/agent/__init__.py +5 -0
  316. wandb/sdk/launch/agent/agent.py +924 -0
  317. wandb/sdk/launch/agent/config.py +296 -0
  318. wandb/sdk/launch/agent/job_status_tracker.py +53 -0
  319. wandb/sdk/launch/agent/run_queue_item_file_saver.py +45 -0
  320. wandb/sdk/launch/builder/__init__.py +0 -0
  321. wandb/sdk/launch/builder/abstract.py +156 -0
  322. wandb/sdk/launch/builder/build.py +297 -0
  323. wandb/sdk/launch/builder/context_manager.py +235 -0
  324. wandb/sdk/launch/builder/docker_builder.py +177 -0
  325. wandb/sdk/launch/builder/kaniko_builder.py +595 -0
  326. wandb/sdk/launch/builder/noop.py +58 -0
  327. wandb/sdk/launch/builder/templates/_wandb_bootstrap.py +188 -0
  328. wandb/sdk/launch/builder/templates/dockerfile.py +92 -0
  329. wandb/sdk/launch/create_job.py +528 -0
  330. wandb/sdk/launch/environment/abstract.py +29 -0
  331. wandb/sdk/launch/environment/aws_environment.py +322 -0
  332. wandb/sdk/launch/environment/azure_environment.py +105 -0
  333. wandb/sdk/launch/environment/gcp_environment.py +335 -0
  334. wandb/sdk/launch/environment/local_environment.py +66 -0
  335. wandb/sdk/launch/errors.py +19 -0
  336. wandb/sdk/launch/git_reference.py +109 -0
  337. wandb/sdk/launch/inputs/files.py +148 -0
  338. wandb/sdk/launch/inputs/internal.py +315 -0
  339. wandb/sdk/launch/inputs/manage.py +113 -0
  340. wandb/sdk/launch/inputs/schema.py +39 -0
  341. wandb/sdk/launch/loader.py +249 -0
  342. wandb/sdk/launch/registry/abstract.py +48 -0
  343. wandb/sdk/launch/registry/anon.py +29 -0
  344. wandb/sdk/launch/registry/azure_container_registry.py +124 -0
  345. wandb/sdk/launch/registry/elastic_container_registry.py +192 -0
  346. wandb/sdk/launch/registry/google_artifact_registry.py +219 -0
  347. wandb/sdk/launch/registry/local_registry.py +67 -0
  348. wandb/sdk/launch/runner/__init__.py +0 -0
  349. wandb/sdk/launch/runner/abstract.py +195 -0
  350. wandb/sdk/launch/runner/kubernetes_monitor.py +474 -0
  351. wandb/sdk/launch/runner/kubernetes_runner.py +963 -0
  352. wandb/sdk/launch/runner/local_container.py +301 -0
  353. wandb/sdk/launch/runner/local_process.py +78 -0
  354. wandb/sdk/launch/runner/sagemaker_runner.py +426 -0
  355. wandb/sdk/launch/runner/vertex_runner.py +230 -0
  356. wandb/sdk/launch/sweeps/__init__.py +39 -0
  357. wandb/sdk/launch/sweeps/scheduler.py +742 -0
  358. wandb/sdk/launch/sweeps/scheduler_sweep.py +91 -0
  359. wandb/sdk/launch/sweeps/utils.py +316 -0
  360. wandb/sdk/launch/utils.py +746 -0
  361. wandb/sdk/launch/wandb_reference.py +138 -0
  362. wandb/sdk/lib/__init__.py +5 -0
  363. wandb/sdk/lib/_settings_toposort_generate.py +159 -0
  364. wandb/sdk/lib/_settings_toposort_generated.py +250 -0
  365. wandb/sdk/lib/_wburls_generate.py +25 -0
  366. wandb/sdk/lib/_wburls_generated.py +22 -0
  367. wandb/sdk/lib/apikey.py +273 -0
  368. wandb/sdk/lib/capped_dict.py +26 -0
  369. wandb/sdk/lib/config_util.py +101 -0
  370. wandb/sdk/lib/credentials.py +141 -0
  371. wandb/sdk/lib/deprecate.py +42 -0
  372. wandb/sdk/lib/disabled.py +29 -0
  373. wandb/sdk/lib/exit_hooks.py +54 -0
  374. wandb/sdk/lib/file_stream_utils.py +118 -0
  375. wandb/sdk/lib/filenames.py +64 -0
  376. wandb/sdk/lib/filesystem.py +372 -0
  377. wandb/sdk/lib/fsm.py +174 -0
  378. wandb/sdk/lib/gitlib.py +239 -0
  379. wandb/sdk/lib/gql_request.py +65 -0
  380. wandb/sdk/lib/handler_util.py +21 -0
  381. wandb/sdk/lib/hashutil.py +84 -0
  382. wandb/sdk/lib/import_hooks.py +275 -0
  383. wandb/sdk/lib/ipython.py +146 -0
  384. wandb/sdk/lib/json_util.py +80 -0
  385. wandb/sdk/lib/lazyloader.py +63 -0
  386. wandb/sdk/lib/mailbox.py +460 -0
  387. wandb/sdk/lib/module.py +69 -0
  388. wandb/sdk/lib/paths.py +106 -0
  389. wandb/sdk/lib/preinit.py +42 -0
  390. wandb/sdk/lib/printer.py +313 -0
  391. wandb/sdk/lib/proto_util.py +90 -0
  392. wandb/sdk/lib/redirect.py +845 -0
  393. wandb/sdk/lib/reporting.py +99 -0
  394. wandb/sdk/lib/retry.py +289 -0
  395. wandb/sdk/lib/run_moment.py +78 -0
  396. wandb/sdk/lib/runid.py +12 -0
  397. wandb/sdk/lib/server.py +52 -0
  398. wandb/sdk/lib/service_connection.py +216 -0
  399. wandb/sdk/lib/service_token.py +94 -0
  400. wandb/sdk/lib/sock_client.py +295 -0
  401. wandb/sdk/lib/sparkline.py +45 -0
  402. wandb/sdk/lib/telemetry.py +100 -0
  403. wandb/sdk/lib/timed_input.py +133 -0
  404. wandb/sdk/lib/timer.py +19 -0
  405. wandb/sdk/lib/tracelog.py +255 -0
  406. wandb/sdk/lib/wburls.py +46 -0
  407. wandb/sdk/service/__init__.py +0 -0
  408. wandb/sdk/service/_startup_debug.py +22 -0
  409. wandb/sdk/service/port_file.py +53 -0
  410. wandb/sdk/service/server.py +116 -0
  411. wandb/sdk/service/server_sock.py +276 -0
  412. wandb/sdk/service/service.py +242 -0
  413. wandb/sdk/service/streams.py +417 -0
  414. wandb/sdk/verify/__init__.py +0 -0
  415. wandb/sdk/verify/verify.py +501 -0
  416. wandb/sdk/wandb_alerts.py +12 -0
  417. wandb/sdk/wandb_config.py +322 -0
  418. wandb/sdk/wandb_helper.py +54 -0
  419. wandb/sdk/wandb_init.py +1266 -0
  420. wandb/sdk/wandb_login.py +349 -0
  421. wandb/sdk/wandb_metric.py +110 -0
  422. wandb/sdk/wandb_require.py +97 -0
  423. wandb/sdk/wandb_require_helpers.py +44 -0
  424. wandb/sdk/wandb_run.py +4236 -0
  425. wandb/sdk/wandb_settings.py +2001 -0
  426. wandb/sdk/wandb_setup.py +409 -0
  427. wandb/sdk/wandb_summary.py +150 -0
  428. wandb/sdk/wandb_sweep.py +119 -0
  429. wandb/sdk/wandb_sync.py +81 -0
  430. wandb/sdk/wandb_watch.py +144 -0
  431. wandb/sklearn.py +35 -0
  432. wandb/sync/__init__.py +3 -0
  433. wandb/sync/sync.py +443 -0
  434. wandb/trigger.py +29 -0
  435. wandb/util.py +1956 -0
  436. wandb/vendor/__init__.py +0 -0
  437. wandb/vendor/gql-0.2.0/setup.py +40 -0
  438. wandb/vendor/gql-0.2.0/tests/__init__.py +0 -0
  439. wandb/vendor/gql-0.2.0/tests/starwars/__init__.py +0 -0
  440. wandb/vendor/gql-0.2.0/tests/starwars/fixtures.py +96 -0
  441. wandb/vendor/gql-0.2.0/tests/starwars/schema.py +146 -0
  442. wandb/vendor/gql-0.2.0/tests/starwars/test_dsl.py +293 -0
  443. wandb/vendor/gql-0.2.0/tests/starwars/test_query.py +355 -0
  444. wandb/vendor/gql-0.2.0/tests/starwars/test_validation.py +171 -0
  445. wandb/vendor/gql-0.2.0/tests/test_client.py +31 -0
  446. wandb/vendor/gql-0.2.0/tests/test_transport.py +89 -0
  447. wandb/vendor/gql-0.2.0/wandb_gql/__init__.py +4 -0
  448. wandb/vendor/gql-0.2.0/wandb_gql/client.py +75 -0
  449. wandb/vendor/gql-0.2.0/wandb_gql/dsl.py +152 -0
  450. wandb/vendor/gql-0.2.0/wandb_gql/gql.py +10 -0
  451. wandb/vendor/gql-0.2.0/wandb_gql/transport/__init__.py +0 -0
  452. wandb/vendor/gql-0.2.0/wandb_gql/transport/http.py +6 -0
  453. wandb/vendor/gql-0.2.0/wandb_gql/transport/local_schema.py +15 -0
  454. wandb/vendor/gql-0.2.0/wandb_gql/transport/requests.py +46 -0
  455. wandb/vendor/gql-0.2.0/wandb_gql/utils.py +21 -0
  456. wandb/vendor/graphql-core-1.1/setup.py +86 -0
  457. wandb/vendor/graphql-core-1.1/wandb_graphql/__init__.py +287 -0
  458. wandb/vendor/graphql-core-1.1/wandb_graphql/error/__init__.py +6 -0
  459. wandb/vendor/graphql-core-1.1/wandb_graphql/error/base.py +42 -0
  460. wandb/vendor/graphql-core-1.1/wandb_graphql/error/format_error.py +11 -0
  461. wandb/vendor/graphql-core-1.1/wandb_graphql/error/located_error.py +29 -0
  462. wandb/vendor/graphql-core-1.1/wandb_graphql/error/syntax_error.py +36 -0
  463. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/__init__.py +26 -0
  464. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/base.py +311 -0
  465. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executor.py +398 -0
  466. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/__init__.py +0 -0
  467. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/asyncio.py +53 -0
  468. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/gevent.py +22 -0
  469. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/process.py +32 -0
  470. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/sync.py +7 -0
  471. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/thread.py +35 -0
  472. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/utils.py +6 -0
  473. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/__init__.py +0 -0
  474. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/executor.py +66 -0
  475. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/fragment.py +252 -0
  476. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/resolver.py +151 -0
  477. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/utils.py +7 -0
  478. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/middleware.py +57 -0
  479. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/values.py +145 -0
  480. wandb/vendor/graphql-core-1.1/wandb_graphql/graphql.py +60 -0
  481. wandb/vendor/graphql-core-1.1/wandb_graphql/language/__init__.py +0 -0
  482. wandb/vendor/graphql-core-1.1/wandb_graphql/language/ast.py +1349 -0
  483. wandb/vendor/graphql-core-1.1/wandb_graphql/language/base.py +19 -0
  484. wandb/vendor/graphql-core-1.1/wandb_graphql/language/lexer.py +435 -0
  485. wandb/vendor/graphql-core-1.1/wandb_graphql/language/location.py +30 -0
  486. wandb/vendor/graphql-core-1.1/wandb_graphql/language/parser.py +779 -0
  487. wandb/vendor/graphql-core-1.1/wandb_graphql/language/printer.py +193 -0
  488. wandb/vendor/graphql-core-1.1/wandb_graphql/language/source.py +18 -0
  489. wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor.py +222 -0
  490. wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor_meta.py +82 -0
  491. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/__init__.py +0 -0
  492. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/cached_property.py +17 -0
  493. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/contain_subset.py +28 -0
  494. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/default_ordered_dict.py +40 -0
  495. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/ordereddict.py +8 -0
  496. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/pair_set.py +43 -0
  497. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/version.py +78 -0
  498. wandb/vendor/graphql-core-1.1/wandb_graphql/type/__init__.py +67 -0
  499. wandb/vendor/graphql-core-1.1/wandb_graphql/type/definition.py +619 -0
  500. wandb/vendor/graphql-core-1.1/wandb_graphql/type/directives.py +132 -0
  501. wandb/vendor/graphql-core-1.1/wandb_graphql/type/introspection.py +440 -0
  502. wandb/vendor/graphql-core-1.1/wandb_graphql/type/scalars.py +131 -0
  503. wandb/vendor/graphql-core-1.1/wandb_graphql/type/schema.py +100 -0
  504. wandb/vendor/graphql-core-1.1/wandb_graphql/type/typemap.py +145 -0
  505. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/__init__.py +0 -0
  506. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/assert_valid_name.py +9 -0
  507. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_from_value.py +65 -0
  508. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_code.py +49 -0
  509. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_dict.py +24 -0
  510. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/base.py +75 -0
  511. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_ast_schema.py +291 -0
  512. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_client_schema.py +250 -0
  513. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/concat_ast.py +9 -0
  514. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/extend_schema.py +357 -0
  515. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_field_def.py +27 -0
  516. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_operation_ast.py +21 -0
  517. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/introspection_query.py +90 -0
  518. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_literal_value.py +67 -0
  519. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_value.py +66 -0
  520. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/quoted_or_list.py +21 -0
  521. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/schema_printer.py +168 -0
  522. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/suggestion_list.py +56 -0
  523. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_comparators.py +69 -0
  524. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_from_ast.py +21 -0
  525. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_info.py +149 -0
  526. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/value_from_ast.py +69 -0
  527. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/__init__.py +4 -0
  528. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/__init__.py +79 -0
  529. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/arguments_of_correct_type.py +24 -0
  530. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/base.py +8 -0
  531. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/default_values_of_correct_type.py +44 -0
  532. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fields_on_correct_type.py +113 -0
  533. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fragments_on_composite_types.py +33 -0
  534. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_argument_names.py +70 -0
  535. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_directives.py +97 -0
  536. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_fragment_names.py +19 -0
  537. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_type_names.py +43 -0
  538. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/lone_anonymous_operation.py +23 -0
  539. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_fragment_cycles.py +59 -0
  540. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_undefined_variables.py +36 -0
  541. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_fragments.py +38 -0
  542. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_variables.py +37 -0
  543. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/overlapping_fields_can_be_merged.py +529 -0
  544. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/possible_fragment_spreads.py +44 -0
  545. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/provided_non_null_arguments.py +46 -0
  546. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/scalar_leafs.py +33 -0
  547. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_argument_names.py +32 -0
  548. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_fragment_names.py +28 -0
  549. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_input_field_names.py +33 -0
  550. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_operation_names.py +31 -0
  551. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_variable_names.py +27 -0
  552. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_are_input_types.py +21 -0
  553. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_in_allowed_position.py +53 -0
  554. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/validation.py +158 -0
  555. wandb/vendor/promise-2.3.0/conftest.py +30 -0
  556. wandb/vendor/promise-2.3.0/setup.py +64 -0
  557. wandb/vendor/promise-2.3.0/tests/__init__.py +0 -0
  558. wandb/vendor/promise-2.3.0/tests/conftest.py +8 -0
  559. wandb/vendor/promise-2.3.0/tests/test_awaitable.py +32 -0
  560. wandb/vendor/promise-2.3.0/tests/test_awaitable_35.py +47 -0
  561. wandb/vendor/promise-2.3.0/tests/test_benchmark.py +116 -0
  562. wandb/vendor/promise-2.3.0/tests/test_complex_threads.py +23 -0
  563. wandb/vendor/promise-2.3.0/tests/test_dataloader.py +452 -0
  564. wandb/vendor/promise-2.3.0/tests/test_dataloader_awaitable_35.py +99 -0
  565. wandb/vendor/promise-2.3.0/tests/test_dataloader_extra.py +65 -0
  566. wandb/vendor/promise-2.3.0/tests/test_extra.py +670 -0
  567. wandb/vendor/promise-2.3.0/tests/test_issues.py +132 -0
  568. wandb/vendor/promise-2.3.0/tests/test_promise_list.py +70 -0
  569. wandb/vendor/promise-2.3.0/tests/test_spec.py +584 -0
  570. wandb/vendor/promise-2.3.0/tests/test_thread_safety.py +115 -0
  571. wandb/vendor/promise-2.3.0/tests/utils.py +3 -0
  572. wandb/vendor/promise-2.3.0/wandb_promise/__init__.py +38 -0
  573. wandb/vendor/promise-2.3.0/wandb_promise/async_.py +135 -0
  574. wandb/vendor/promise-2.3.0/wandb_promise/compat.py +32 -0
  575. wandb/vendor/promise-2.3.0/wandb_promise/dataloader.py +326 -0
  576. wandb/vendor/promise-2.3.0/wandb_promise/iterate_promise.py +12 -0
  577. wandb/vendor/promise-2.3.0/wandb_promise/promise.py +848 -0
  578. wandb/vendor/promise-2.3.0/wandb_promise/promise_list.py +151 -0
  579. wandb/vendor/promise-2.3.0/wandb_promise/pyutils/__init__.py +0 -0
  580. wandb/vendor/promise-2.3.0/wandb_promise/pyutils/version.py +83 -0
  581. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/__init__.py +0 -0
  582. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/asyncio.py +22 -0
  583. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/gevent.py +21 -0
  584. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/immediate.py +27 -0
  585. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/thread.py +18 -0
  586. wandb/vendor/promise-2.3.0/wandb_promise/utils.py +56 -0
  587. wandb/vendor/pygments/__init__.py +90 -0
  588. wandb/vendor/pygments/cmdline.py +568 -0
  589. wandb/vendor/pygments/console.py +74 -0
  590. wandb/vendor/pygments/filter.py +74 -0
  591. wandb/vendor/pygments/filters/__init__.py +350 -0
  592. wandb/vendor/pygments/formatter.py +95 -0
  593. wandb/vendor/pygments/formatters/__init__.py +153 -0
  594. wandb/vendor/pygments/formatters/_mapping.py +85 -0
  595. wandb/vendor/pygments/formatters/bbcode.py +109 -0
  596. wandb/vendor/pygments/formatters/html.py +851 -0
  597. wandb/vendor/pygments/formatters/img.py +600 -0
  598. wandb/vendor/pygments/formatters/irc.py +182 -0
  599. wandb/vendor/pygments/formatters/latex.py +482 -0
  600. wandb/vendor/pygments/formatters/other.py +160 -0
  601. wandb/vendor/pygments/formatters/rtf.py +147 -0
  602. wandb/vendor/pygments/formatters/svg.py +153 -0
  603. wandb/vendor/pygments/formatters/terminal.py +136 -0
  604. wandb/vendor/pygments/formatters/terminal256.py +309 -0
  605. wandb/vendor/pygments/lexer.py +871 -0
  606. wandb/vendor/pygments/lexers/__init__.py +329 -0
  607. wandb/vendor/pygments/lexers/_asy_builtins.py +1645 -0
  608. wandb/vendor/pygments/lexers/_cl_builtins.py +232 -0
  609. wandb/vendor/pygments/lexers/_cocoa_builtins.py +72 -0
  610. wandb/vendor/pygments/lexers/_csound_builtins.py +1346 -0
  611. wandb/vendor/pygments/lexers/_lasso_builtins.py +5327 -0
  612. wandb/vendor/pygments/lexers/_lua_builtins.py +295 -0
  613. wandb/vendor/pygments/lexers/_mapping.py +500 -0
  614. wandb/vendor/pygments/lexers/_mql_builtins.py +1172 -0
  615. wandb/vendor/pygments/lexers/_openedge_builtins.py +2547 -0
  616. wandb/vendor/pygments/lexers/_php_builtins.py +4756 -0
  617. wandb/vendor/pygments/lexers/_postgres_builtins.py +621 -0
  618. wandb/vendor/pygments/lexers/_scilab_builtins.py +3094 -0
  619. wandb/vendor/pygments/lexers/_sourcemod_builtins.py +1163 -0
  620. wandb/vendor/pygments/lexers/_stan_builtins.py +532 -0
  621. wandb/vendor/pygments/lexers/_stata_builtins.py +419 -0
  622. wandb/vendor/pygments/lexers/_tsql_builtins.py +1004 -0
  623. wandb/vendor/pygments/lexers/_vim_builtins.py +1939 -0
  624. wandb/vendor/pygments/lexers/actionscript.py +240 -0
  625. wandb/vendor/pygments/lexers/agile.py +24 -0
  626. wandb/vendor/pygments/lexers/algebra.py +221 -0
  627. wandb/vendor/pygments/lexers/ambient.py +76 -0
  628. wandb/vendor/pygments/lexers/ampl.py +87 -0
  629. wandb/vendor/pygments/lexers/apl.py +101 -0
  630. wandb/vendor/pygments/lexers/archetype.py +318 -0
  631. wandb/vendor/pygments/lexers/asm.py +641 -0
  632. wandb/vendor/pygments/lexers/automation.py +374 -0
  633. wandb/vendor/pygments/lexers/basic.py +500 -0
  634. wandb/vendor/pygments/lexers/bibtex.py +160 -0
  635. wandb/vendor/pygments/lexers/business.py +612 -0
  636. wandb/vendor/pygments/lexers/c_cpp.py +252 -0
  637. wandb/vendor/pygments/lexers/c_like.py +541 -0
  638. wandb/vendor/pygments/lexers/capnproto.py +78 -0
  639. wandb/vendor/pygments/lexers/chapel.py +102 -0
  640. wandb/vendor/pygments/lexers/clean.py +288 -0
  641. wandb/vendor/pygments/lexers/compiled.py +34 -0
  642. wandb/vendor/pygments/lexers/configs.py +833 -0
  643. wandb/vendor/pygments/lexers/console.py +114 -0
  644. wandb/vendor/pygments/lexers/crystal.py +393 -0
  645. wandb/vendor/pygments/lexers/csound.py +366 -0
  646. wandb/vendor/pygments/lexers/css.py +689 -0
  647. wandb/vendor/pygments/lexers/d.py +251 -0
  648. wandb/vendor/pygments/lexers/dalvik.py +125 -0
  649. wandb/vendor/pygments/lexers/data.py +555 -0
  650. wandb/vendor/pygments/lexers/diff.py +165 -0
  651. wandb/vendor/pygments/lexers/dotnet.py +691 -0
  652. wandb/vendor/pygments/lexers/dsls.py +878 -0
  653. wandb/vendor/pygments/lexers/dylan.py +289 -0
  654. wandb/vendor/pygments/lexers/ecl.py +125 -0
  655. wandb/vendor/pygments/lexers/eiffel.py +65 -0
  656. wandb/vendor/pygments/lexers/elm.py +121 -0
  657. wandb/vendor/pygments/lexers/erlang.py +533 -0
  658. wandb/vendor/pygments/lexers/esoteric.py +277 -0
  659. wandb/vendor/pygments/lexers/ezhil.py +69 -0
  660. wandb/vendor/pygments/lexers/factor.py +344 -0
  661. wandb/vendor/pygments/lexers/fantom.py +250 -0
  662. wandb/vendor/pygments/lexers/felix.py +273 -0
  663. wandb/vendor/pygments/lexers/forth.py +177 -0
  664. wandb/vendor/pygments/lexers/fortran.py +205 -0
  665. wandb/vendor/pygments/lexers/foxpro.py +428 -0
  666. wandb/vendor/pygments/lexers/functional.py +21 -0
  667. wandb/vendor/pygments/lexers/go.py +101 -0
  668. wandb/vendor/pygments/lexers/grammar_notation.py +213 -0
  669. wandb/vendor/pygments/lexers/graph.py +80 -0
  670. wandb/vendor/pygments/lexers/graphics.py +553 -0
  671. wandb/vendor/pygments/lexers/haskell.py +843 -0
  672. wandb/vendor/pygments/lexers/haxe.py +936 -0
  673. wandb/vendor/pygments/lexers/hdl.py +382 -0
  674. wandb/vendor/pygments/lexers/hexdump.py +103 -0
  675. wandb/vendor/pygments/lexers/html.py +602 -0
  676. wandb/vendor/pygments/lexers/idl.py +270 -0
  677. wandb/vendor/pygments/lexers/igor.py +288 -0
  678. wandb/vendor/pygments/lexers/inferno.py +96 -0
  679. wandb/vendor/pygments/lexers/installers.py +322 -0
  680. wandb/vendor/pygments/lexers/int_fiction.py +1343 -0
  681. wandb/vendor/pygments/lexers/iolang.py +63 -0
  682. wandb/vendor/pygments/lexers/j.py +146 -0
  683. wandb/vendor/pygments/lexers/javascript.py +1525 -0
  684. wandb/vendor/pygments/lexers/julia.py +333 -0
  685. wandb/vendor/pygments/lexers/jvm.py +1573 -0
  686. wandb/vendor/pygments/lexers/lisp.py +2621 -0
  687. wandb/vendor/pygments/lexers/make.py +202 -0
  688. wandb/vendor/pygments/lexers/markup.py +595 -0
  689. wandb/vendor/pygments/lexers/math.py +21 -0
  690. wandb/vendor/pygments/lexers/matlab.py +663 -0
  691. wandb/vendor/pygments/lexers/ml.py +769 -0
  692. wandb/vendor/pygments/lexers/modeling.py +358 -0
  693. wandb/vendor/pygments/lexers/modula2.py +1561 -0
  694. wandb/vendor/pygments/lexers/monte.py +204 -0
  695. wandb/vendor/pygments/lexers/ncl.py +894 -0
  696. wandb/vendor/pygments/lexers/nimrod.py +159 -0
  697. wandb/vendor/pygments/lexers/nit.py +64 -0
  698. wandb/vendor/pygments/lexers/nix.py +136 -0
  699. wandb/vendor/pygments/lexers/oberon.py +105 -0
  700. wandb/vendor/pygments/lexers/objective.py +504 -0
  701. wandb/vendor/pygments/lexers/ooc.py +85 -0
  702. wandb/vendor/pygments/lexers/other.py +41 -0
  703. wandb/vendor/pygments/lexers/parasail.py +79 -0
  704. wandb/vendor/pygments/lexers/parsers.py +835 -0
  705. wandb/vendor/pygments/lexers/pascal.py +644 -0
  706. wandb/vendor/pygments/lexers/pawn.py +199 -0
  707. wandb/vendor/pygments/lexers/perl.py +620 -0
  708. wandb/vendor/pygments/lexers/php.py +267 -0
  709. wandb/vendor/pygments/lexers/praat.py +294 -0
  710. wandb/vendor/pygments/lexers/prolog.py +306 -0
  711. wandb/vendor/pygments/lexers/python.py +939 -0
  712. wandb/vendor/pygments/lexers/qvt.py +152 -0
  713. wandb/vendor/pygments/lexers/r.py +453 -0
  714. wandb/vendor/pygments/lexers/rdf.py +270 -0
  715. wandb/vendor/pygments/lexers/rebol.py +431 -0
  716. wandb/vendor/pygments/lexers/resource.py +85 -0
  717. wandb/vendor/pygments/lexers/rnc.py +67 -0
  718. wandb/vendor/pygments/lexers/roboconf.py +82 -0
  719. wandb/vendor/pygments/lexers/robotframework.py +560 -0
  720. wandb/vendor/pygments/lexers/ruby.py +519 -0
  721. wandb/vendor/pygments/lexers/rust.py +220 -0
  722. wandb/vendor/pygments/lexers/sas.py +228 -0
  723. wandb/vendor/pygments/lexers/scripting.py +1222 -0
  724. wandb/vendor/pygments/lexers/shell.py +794 -0
  725. wandb/vendor/pygments/lexers/smalltalk.py +195 -0
  726. wandb/vendor/pygments/lexers/smv.py +79 -0
  727. wandb/vendor/pygments/lexers/snobol.py +83 -0
  728. wandb/vendor/pygments/lexers/special.py +103 -0
  729. wandb/vendor/pygments/lexers/sql.py +681 -0
  730. wandb/vendor/pygments/lexers/stata.py +108 -0
  731. wandb/vendor/pygments/lexers/supercollider.py +90 -0
  732. wandb/vendor/pygments/lexers/tcl.py +145 -0
  733. wandb/vendor/pygments/lexers/templates.py +2283 -0
  734. wandb/vendor/pygments/lexers/testing.py +207 -0
  735. wandb/vendor/pygments/lexers/text.py +25 -0
  736. wandb/vendor/pygments/lexers/textedit.py +169 -0
  737. wandb/vendor/pygments/lexers/textfmts.py +297 -0
  738. wandb/vendor/pygments/lexers/theorem.py +458 -0
  739. wandb/vendor/pygments/lexers/trafficscript.py +54 -0
  740. wandb/vendor/pygments/lexers/typoscript.py +226 -0
  741. wandb/vendor/pygments/lexers/urbi.py +133 -0
  742. wandb/vendor/pygments/lexers/varnish.py +190 -0
  743. wandb/vendor/pygments/lexers/verification.py +111 -0
  744. wandb/vendor/pygments/lexers/web.py +24 -0
  745. wandb/vendor/pygments/lexers/webmisc.py +988 -0
  746. wandb/vendor/pygments/lexers/whiley.py +116 -0
  747. wandb/vendor/pygments/lexers/x10.py +69 -0
  748. wandb/vendor/pygments/modeline.py +44 -0
  749. wandb/vendor/pygments/plugin.py +68 -0
  750. wandb/vendor/pygments/regexopt.py +92 -0
  751. wandb/vendor/pygments/scanner.py +105 -0
  752. wandb/vendor/pygments/sphinxext.py +158 -0
  753. wandb/vendor/pygments/style.py +155 -0
  754. wandb/vendor/pygments/styles/__init__.py +80 -0
  755. wandb/vendor/pygments/styles/abap.py +29 -0
  756. wandb/vendor/pygments/styles/algol.py +63 -0
  757. wandb/vendor/pygments/styles/algol_nu.py +63 -0
  758. wandb/vendor/pygments/styles/arduino.py +98 -0
  759. wandb/vendor/pygments/styles/autumn.py +65 -0
  760. wandb/vendor/pygments/styles/borland.py +51 -0
  761. wandb/vendor/pygments/styles/bw.py +49 -0
  762. wandb/vendor/pygments/styles/colorful.py +81 -0
  763. wandb/vendor/pygments/styles/default.py +73 -0
  764. wandb/vendor/pygments/styles/emacs.py +72 -0
  765. wandb/vendor/pygments/styles/friendly.py +72 -0
  766. wandb/vendor/pygments/styles/fruity.py +42 -0
  767. wandb/vendor/pygments/styles/igor.py +29 -0
  768. wandb/vendor/pygments/styles/lovelace.py +97 -0
  769. wandb/vendor/pygments/styles/manni.py +75 -0
  770. wandb/vendor/pygments/styles/monokai.py +106 -0
  771. wandb/vendor/pygments/styles/murphy.py +80 -0
  772. wandb/vendor/pygments/styles/native.py +65 -0
  773. wandb/vendor/pygments/styles/paraiso_dark.py +125 -0
  774. wandb/vendor/pygments/styles/paraiso_light.py +125 -0
  775. wandb/vendor/pygments/styles/pastie.py +75 -0
  776. wandb/vendor/pygments/styles/perldoc.py +69 -0
  777. wandb/vendor/pygments/styles/rainbow_dash.py +89 -0
  778. wandb/vendor/pygments/styles/rrt.py +33 -0
  779. wandb/vendor/pygments/styles/sas.py +44 -0
  780. wandb/vendor/pygments/styles/stata.py +40 -0
  781. wandb/vendor/pygments/styles/tango.py +141 -0
  782. wandb/vendor/pygments/styles/trac.py +63 -0
  783. wandb/vendor/pygments/styles/vim.py +63 -0
  784. wandb/vendor/pygments/styles/vs.py +38 -0
  785. wandb/vendor/pygments/styles/xcode.py +51 -0
  786. wandb/vendor/pygments/token.py +213 -0
  787. wandb/vendor/pygments/unistring.py +217 -0
  788. wandb/vendor/pygments/util.py +388 -0
  789. wandb/vendor/pynvml/__init__.py +0 -0
  790. wandb/vendor/pynvml/pynvml.py +4779 -0
  791. wandb/vendor/watchdog_0_9_0/wandb_watchdog/__init__.py +17 -0
  792. wandb/vendor/watchdog_0_9_0/wandb_watchdog/events.py +615 -0
  793. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/__init__.py +98 -0
  794. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/api.py +369 -0
  795. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents.py +172 -0
  796. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents2.py +239 -0
  797. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify.py +218 -0
  798. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_buffer.py +81 -0
  799. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_c.py +575 -0
  800. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/kqueue.py +730 -0
  801. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/polling.py +145 -0
  802. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/read_directory_changes.py +133 -0
  803. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/winapi.py +348 -0
  804. wandb/vendor/watchdog_0_9_0/wandb_watchdog/patterns.py +265 -0
  805. wandb/vendor/watchdog_0_9_0/wandb_watchdog/tricks/__init__.py +174 -0
  806. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/__init__.py +151 -0
  807. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/bricks.py +249 -0
  808. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/compat.py +29 -0
  809. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/decorators.py +198 -0
  810. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/delayed_queue.py +88 -0
  811. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/dirsnapshot.py +293 -0
  812. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/echo.py +157 -0
  813. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/event_backport.py +41 -0
  814. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/importlib2.py +40 -0
  815. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/platform.py +57 -0
  816. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/unicode_paths.py +64 -0
  817. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/win32stat.py +123 -0
  818. wandb/vendor/watchdog_0_9_0/wandb_watchdog/version.py +28 -0
  819. wandb/vendor/watchdog_0_9_0/wandb_watchdog/watchmedo.py +577 -0
  820. wandb/wandb_agent.py +588 -0
  821. wandb/wandb_controller.py +721 -0
  822. wandb/wandb_run.py +9 -0
  823. wandb-0.18.2.dist-info/METADATA +213 -0
  824. wandb-0.18.2.dist-info/RECORD +827 -0
  825. wandb-0.18.2.dist-info/WHEEL +5 -0
  826. wandb-0.18.2.dist-info/entry_points.txt +3 -0
  827. wandb-0.18.2.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,901 @@
1
+ """Handle Manager."""
2
+
3
+ import json
4
+ import logging
5
+ import math
6
+ import numbers
7
+ import time
8
+ from collections import defaultdict
9
+ from queue import Queue
10
+ from threading import Event
11
+ from typing import (
12
+ TYPE_CHECKING,
13
+ Any,
14
+ Callable,
15
+ Dict,
16
+ Iterable,
17
+ List,
18
+ Optional,
19
+ Sequence,
20
+ Tuple,
21
+ cast,
22
+ )
23
+
24
+ from wandb.proto.wandb_internal_pb2 import (
25
+ HistoryRecord,
26
+ InternalMessages,
27
+ MetricRecord,
28
+ Record,
29
+ Result,
30
+ RunRecord,
31
+ SampledHistoryItem,
32
+ SummaryItem,
33
+ SummaryRecord,
34
+ SummaryRecordRequest,
35
+ SystemMetricSample,
36
+ SystemMetricsBuffer,
37
+ )
38
+
39
+ from ..interface.interface_queue import InterfaceQueue
40
+ from ..lib import handler_util, proto_util, tracelog, wburls
41
+ from . import context, sample, tb_watcher
42
+ from .settings_static import SettingsStatic
43
+ from .system.system_monitor import SystemMonitor
44
+
45
+ if TYPE_CHECKING:
46
+ from wandb.proto.wandb_internal_pb2 import MetricSummary
47
+
48
+
49
+ SummaryDict = Dict[str, Any]
50
+
51
+ logger = logging.getLogger(__name__)
52
+
53
+ # Update (March 5, 2024): Since ~2020/2021, when constructing the summary
54
+ # object, we had replaced the artifact path for media types with the latest
55
+ # artifact path. The primary purpose of this was to support live updating of
56
+ # media objects in the UI (since the default artifact path was fully qualified
57
+ # and would not update). However, in March of 2024, a bug was discovered with
58
+ # this approach which causes this path to be incorrect in cases where the media
59
+ # object is logged to another artifact before being logged to the run. Setting
60
+ # this to `False` disables this copy behavior. The impact is that users will
61
+ # need to refresh to see updates. Ironically, this updating behavior is not
62
+ # currently supported in the UI, so the impact of this change is minimal.
63
+ REPLACE_SUMMARY_ART_PATH_WITH_LATEST = False
64
+
65
+
66
+ def _dict_nested_set(target: Dict[str, Any], key_list: Sequence[str], v: Any) -> None:
67
+ # recurse down the dictionary structure:
68
+
69
+ for k in key_list[:-1]:
70
+ target.setdefault(k, {})
71
+ new_target = target.get(k)
72
+ if TYPE_CHECKING:
73
+ new_target = cast(Dict[str, Any], new_target)
74
+ target = new_target
75
+ # use the last element of the key to write the leaf:
76
+ target[key_list[-1]] = v
77
+
78
+
79
+ class HandleManager:
80
+ _consolidated_summary: SummaryDict
81
+ _sampled_history: Dict[str, sample.UniformSampleAccumulator]
82
+ _partial_history: Dict[str, Any]
83
+ _run_proto: Optional[RunRecord]
84
+ _settings: SettingsStatic
85
+ _record_q: "Queue[Record]"
86
+ _result_q: "Queue[Result]"
87
+ _stopped: Event
88
+ _writer_q: "Queue[Record]"
89
+ _interface: InterfaceQueue
90
+ _system_monitor: Optional[SystemMonitor]
91
+ _tb_watcher: Optional[tb_watcher.TBWatcher]
92
+ _metric_defines: Dict[str, MetricRecord]
93
+ _metric_globs: Dict[str, MetricRecord]
94
+ _metric_track: Dict[Tuple[str, ...], float]
95
+ _metric_copy: Dict[Tuple[str, ...], Any]
96
+ _track_time: Optional[float]
97
+ _accumulate_time: float
98
+ _run_start_time: Optional[float]
99
+ _context_keeper: context.ContextKeeper
100
+
101
+ def __init__(
102
+ self,
103
+ settings: SettingsStatic,
104
+ record_q: "Queue[Record]",
105
+ result_q: "Queue[Result]",
106
+ stopped: Event,
107
+ writer_q: "Queue[Record]",
108
+ interface: InterfaceQueue,
109
+ context_keeper: context.ContextKeeper,
110
+ ) -> None:
111
+ self._settings = settings
112
+ self._record_q = record_q
113
+ self._result_q = result_q
114
+ self._stopped = stopped
115
+ self._writer_q = writer_q
116
+ self._interface = interface
117
+ self._context_keeper = context_keeper
118
+
119
+ self._tb_watcher = None
120
+ self._system_monitor = None
121
+ self._step = 0
122
+
123
+ self._track_time = None
124
+ self._accumulate_time = 0
125
+ self._run_start_time = None
126
+
127
+ # keep track of summary from key/val updates
128
+ self._consolidated_summary = dict()
129
+ self._sampled_history = defaultdict(sample.UniformSampleAccumulator)
130
+ self._run_proto = None
131
+ self._partial_history = dict()
132
+ self._metric_defines = defaultdict(MetricRecord)
133
+ self._metric_globs = defaultdict(MetricRecord)
134
+ self._metric_track = dict()
135
+ self._metric_copy = dict()
136
+ self._internal_messages = InternalMessages()
137
+
138
+ self._dropped_history = False
139
+
140
+ def __len__(self) -> int:
141
+ return self._record_q.qsize()
142
+
143
+ def handle(self, record: Record) -> None:
144
+ self._context_keeper.add_from_record(record)
145
+ record_type = record.WhichOneof("record_type")
146
+ assert record_type
147
+ handler_str = "handle_" + record_type
148
+ handler: Callable[[Record], None] = getattr(self, handler_str, None) # type: ignore
149
+ assert handler, f"unknown handle: {handler_str}" # type: ignore
150
+ handler(record)
151
+
152
+ def handle_request(self, record: Record) -> None:
153
+ request_type = record.request.WhichOneof("request_type")
154
+ assert request_type
155
+ handler_str = "handle_request_" + request_type
156
+ handler: Callable[[Record], None] = getattr(self, handler_str, None) # type: ignore
157
+ if request_type != "network_status":
158
+ logger.debug(f"handle_request: {request_type}")
159
+ assert handler, f"unknown handle: {handler_str}" # type: ignore
160
+ handler(record)
161
+
162
+ def _dispatch_record(self, record: Record, always_send: bool = False) -> None:
163
+ if always_send:
164
+ record.control.always_send = True
165
+ tracelog.log_message_queue(record, self._writer_q)
166
+ self._writer_q.put(record)
167
+
168
+ def _respond_result(self, result: Result) -> None:
169
+ tracelog.log_message_queue(result, self._result_q)
170
+ context_id = context.context_id_from_result(result)
171
+ self._context_keeper.release(context_id)
172
+ self._result_q.put(result)
173
+
174
+ def debounce(self) -> None:
175
+ pass
176
+
177
+ def handle_request_cancel(self, record: Record) -> None:
178
+ self._dispatch_record(record)
179
+
180
+ def handle_request_defer(self, record: Record) -> None:
181
+ defer = record.request.defer
182
+ state = defer.state
183
+
184
+ logger.info(f"handle defer: {state}")
185
+ # only handle flush tb (sender handles the rest)
186
+ if state == defer.FLUSH_STATS:
187
+ # TODO(jhr): this could block so we dont really want to call shutdown
188
+ # from handler thread
189
+ if self._system_monitor is not None:
190
+ self._system_monitor.finish()
191
+ elif state == defer.FLUSH_TB:
192
+ if self._tb_watcher:
193
+ # shutdown tensorboard workers so we get all metrics flushed
194
+ self._tb_watcher.finish()
195
+ self._tb_watcher = None
196
+ elif state == defer.FLUSH_PARTIAL_HISTORY:
197
+ self._flush_partial_history()
198
+ elif state == defer.FLUSH_SUM:
199
+ self._save_summary(self._consolidated_summary, flush=True)
200
+
201
+ # defer is used to drive the sender finish state machine
202
+ self._dispatch_record(record, always_send=True)
203
+
204
+ def handle_request_login(self, record: Record) -> None:
205
+ self._dispatch_record(record)
206
+
207
+ def handle_request_python_packages(self, record: Record) -> None:
208
+ self._dispatch_record(record)
209
+
210
+ def handle_run(self, record: Record) -> None:
211
+ if self._settings._offline:
212
+ self._run_proto = record.run
213
+ result = proto_util._result_from_record(record)
214
+ result.run_result.run.CopyFrom(record.run)
215
+ self._respond_result(result)
216
+ self._dispatch_record(record)
217
+
218
+ def handle_stats(self, record: Record) -> None:
219
+ self._dispatch_record(record)
220
+
221
+ def handle_config(self, record: Record) -> None:
222
+ self._dispatch_record(record)
223
+
224
+ def handle_output(self, record: Record) -> None:
225
+ self._dispatch_record(record)
226
+
227
+ def handle_output_raw(self, record: Record) -> None:
228
+ self._dispatch_record(record)
229
+
230
+ def handle_files(self, record: Record) -> None:
231
+ self._dispatch_record(record)
232
+
233
+ def handle_request_link_artifact(self, record: Record) -> None:
234
+ self._dispatch_record(record)
235
+
236
+ def handle_use_artifact(self, record: Record) -> None:
237
+ self._dispatch_record(record)
238
+
239
+ def handle_artifact(self, record: Record) -> None:
240
+ self._dispatch_record(record)
241
+
242
+ def handle_alert(self, record: Record) -> None:
243
+ self._dispatch_record(record)
244
+
245
+ def _save_summary(self, summary_dict: SummaryDict, flush: bool = False) -> None:
246
+ summary = SummaryRecord()
247
+ for k, v in summary_dict.items():
248
+ update = summary.update.add()
249
+ update.key = k
250
+ update.value_json = json.dumps(v)
251
+ if flush:
252
+ record = Record(summary=summary)
253
+ self._dispatch_record(record)
254
+ elif not self._settings._offline:
255
+ # Send this summary update as a request since we aren't persisting every update
256
+ summary_record = SummaryRecordRequest(summary=summary)
257
+ request_record = self._interface._make_request(
258
+ summary_record=summary_record
259
+ )
260
+ self._dispatch_record(request_record)
261
+
262
+ def _save_history(
263
+ self,
264
+ history: HistoryRecord,
265
+ ) -> None:
266
+ for item in history.item:
267
+ # TODO(jhr) save nested keys?
268
+ k = item.key
269
+ v = json.loads(item.value_json)
270
+ if isinstance(v, numbers.Real):
271
+ self._sampled_history[k].add(v)
272
+
273
+ def _update_summary_metrics(
274
+ self,
275
+ s: "MetricSummary",
276
+ kl: List[str],
277
+ v: "numbers.Real",
278
+ float_v: float,
279
+ goal_max: Optional[bool],
280
+ ) -> bool:
281
+ updated = False
282
+ best_key: Optional[Tuple[str, ...]] = None
283
+ if s.none:
284
+ return False
285
+ if s.copy:
286
+ # non-key list copy already done in _update_summary
287
+ if len(kl) > 1:
288
+ _dict_nested_set(self._consolidated_summary, kl, v)
289
+ return True
290
+ if s.last:
291
+ last_key = tuple(kl + ["last"])
292
+ old_last = self._metric_track.get(last_key)
293
+ if old_last is None or float_v != old_last:
294
+ self._metric_track[last_key] = float_v
295
+ _dict_nested_set(self._consolidated_summary, last_key, v)
296
+ updated = True
297
+ if s.best:
298
+ best_key = tuple(kl + ["best"])
299
+ if s.max or best_key and goal_max:
300
+ max_key = tuple(kl + ["max"])
301
+ old_max = self._metric_track.get(max_key)
302
+ if old_max is None or float_v > old_max:
303
+ self._metric_track[max_key] = float_v
304
+ if s.max:
305
+ _dict_nested_set(self._consolidated_summary, max_key, v)
306
+ updated = True
307
+ if best_key:
308
+ _dict_nested_set(self._consolidated_summary, best_key, v)
309
+ updated = True
310
+ # defaulting to minimize if goal is not specified
311
+ if s.min or best_key and not goal_max:
312
+ min_key = tuple(kl + ["min"])
313
+ old_min = self._metric_track.get(min_key)
314
+ if old_min is None or float_v < old_min:
315
+ self._metric_track[min_key] = float_v
316
+ if s.min:
317
+ _dict_nested_set(self._consolidated_summary, min_key, v)
318
+ updated = True
319
+ if best_key:
320
+ _dict_nested_set(self._consolidated_summary, best_key, v)
321
+ updated = True
322
+ if s.mean:
323
+ tot_key = tuple(kl + ["tot"])
324
+ num_key = tuple(kl + ["num"])
325
+ avg_key = tuple(kl + ["mean"])
326
+ tot = self._metric_track.get(tot_key, 0.0)
327
+ num = self._metric_track.get(num_key, 0)
328
+ tot += float_v
329
+ num += 1
330
+ self._metric_track[tot_key] = tot
331
+ self._metric_track[num_key] = num
332
+ _dict_nested_set(self._consolidated_summary, avg_key, tot / num)
333
+ updated = True
334
+ return updated
335
+
336
+ def _update_summary_leaf(
337
+ self,
338
+ kl: List[str],
339
+ v: Any,
340
+ d: Optional[MetricRecord] = None,
341
+ ) -> bool:
342
+ has_summary = d and d.HasField("summary")
343
+ if len(kl) == 1:
344
+ copy_key = tuple(kl)
345
+ old_copy = self._metric_copy.get(copy_key)
346
+ if old_copy is None or v != old_copy:
347
+ self._metric_copy[copy_key] = v
348
+ # Store copy metric if not specified, or copy behavior
349
+ if not has_summary or (d and d.summary.copy):
350
+ self._consolidated_summary[kl[0]] = v
351
+ return True
352
+ if not d:
353
+ return False
354
+ if not has_summary:
355
+ return False
356
+ if not isinstance(v, numbers.Real):
357
+ return False
358
+ if math.isnan(v):
359
+ return False
360
+ float_v = float(v)
361
+ goal_max = None
362
+ if d.goal:
363
+ goal_max = d.goal == d.GOAL_MAXIMIZE
364
+ if self._update_summary_metrics(
365
+ d.summary, kl=kl, v=v, float_v=float_v, goal_max=goal_max
366
+ ):
367
+ return True
368
+ return False
369
+
370
+ def _update_summary_list(
371
+ self,
372
+ kl: List[str],
373
+ v: Any,
374
+ d: Optional[MetricRecord] = None,
375
+ ) -> bool:
376
+ metric_key = ".".join([k.replace(".", "\\.") for k in kl])
377
+ d = self._metric_defines.get(metric_key, d)
378
+ # if the dict has _type key, it's a wandb table object
379
+ if isinstance(v, dict) and not handler_util.metric_is_wandb_dict(v):
380
+ updated = False
381
+ for nk, nv in v.items():
382
+ if self._update_summary_list(kl=kl[:] + [nk], v=nv, d=d):
383
+ updated = True
384
+ return updated
385
+ # If the dict is a media object, update the pointer to the latest alias
386
+ elif (
387
+ REPLACE_SUMMARY_ART_PATH_WITH_LATEST
388
+ and isinstance(v, dict)
389
+ and handler_util.metric_is_wandb_dict(v)
390
+ ):
391
+ if "_latest_artifact_path" in v and "artifact_path" in v:
392
+ # TODO: Make non-destructive?
393
+ v["artifact_path"] = v["_latest_artifact_path"]
394
+ updated = self._update_summary_leaf(kl=kl, v=v, d=d)
395
+ return updated
396
+
397
+ def _update_summary_media_objects(self, v: Dict[str, Any]) -> Dict[str, Any]:
398
+ # For now, non-recursive - just top level
399
+ for nk, nv in v.items():
400
+ if REPLACE_SUMMARY_ART_PATH_WITH_LATEST and (
401
+ isinstance(nv, dict)
402
+ and handler_util.metric_is_wandb_dict(nv)
403
+ and "_latest_artifact_path" in nv
404
+ and "artifact_path" in nv
405
+ ):
406
+ # TODO: Make non-destructive?
407
+ nv["artifact_path"] = nv["_latest_artifact_path"]
408
+ v[nk] = nv
409
+ return v
410
+
411
+ def _update_summary(self, history_dict: Dict[str, Any]) -> List[str]:
412
+ # keep old behavior fast path if no define metrics have been used
413
+ if not self._metric_defines:
414
+ history_dict = self._update_summary_media_objects(history_dict)
415
+ self._consolidated_summary.update(history_dict)
416
+ return list(history_dict.keys())
417
+ updated_keys = []
418
+ for k, v in history_dict.items():
419
+ if self._update_summary_list(kl=[k], v=v):
420
+ updated_keys.append(k)
421
+ return updated_keys
422
+
423
+ def _history_assign_step(
424
+ self,
425
+ history: HistoryRecord,
426
+ history_dict: Dict[str, Any],
427
+ ) -> None:
428
+ has_step = history.HasField("step")
429
+ item = history.item.add()
430
+ item.key = "_step"
431
+ if has_step:
432
+ step = history.step.num
433
+ history_dict["_step"] = step
434
+ item.value_json = json.dumps(step)
435
+ self._step = step + 1
436
+ else:
437
+ history_dict["_step"] = self._step
438
+ item.value_json = json.dumps(self._step)
439
+ self._step += 1
440
+
441
+ def _history_define_metric(self, hkey: str) -> Optional[MetricRecord]:
442
+ """Check for hkey match in glob metrics and return the defined metric."""
443
+ # Dont define metric for internal metrics
444
+ if hkey.startswith("_"):
445
+ return None
446
+ for k, mglob in self._metric_globs.items():
447
+ if k.endswith("*"):
448
+ if hkey.startswith(k[:-1]):
449
+ m = MetricRecord()
450
+ m.CopyFrom(mglob)
451
+ m.ClearField("glob_name")
452
+ m.options.defined = False
453
+ m.name = hkey
454
+ return m
455
+ return None
456
+
457
+ def _history_update_leaf(
458
+ self,
459
+ kl: List[str],
460
+ v: Any,
461
+ history_dict: Dict[str, Any],
462
+ update_history: Dict[str, Any],
463
+ ) -> None:
464
+ hkey = ".".join([k.replace(".", "\\.") for k in kl])
465
+ m = self._metric_defines.get(hkey)
466
+ if not m:
467
+ m = self._history_define_metric(hkey)
468
+ if not m:
469
+ return
470
+ mr = Record()
471
+ mr.metric.CopyFrom(m)
472
+ mr.control.local = True # Dont store this, just send it
473
+ self._handle_defined_metric(mr)
474
+
475
+ if m.options.step_sync and m.step_metric:
476
+ if m.step_metric not in history_dict:
477
+ copy_key = tuple([m.step_metric])
478
+ step = self._metric_copy.get(copy_key)
479
+ if step is not None:
480
+ update_history[m.step_metric] = step
481
+
482
+ def _history_update_list(
483
+ self,
484
+ kl: List[str],
485
+ v: Any,
486
+ history_dict: Dict[str, Any],
487
+ update_history: Dict[str, Any],
488
+ ) -> None:
489
+ if isinstance(v, dict):
490
+ for nk, nv in v.items():
491
+ self._history_update_list(
492
+ kl=kl[:] + [nk],
493
+ v=nv,
494
+ history_dict=history_dict,
495
+ update_history=update_history,
496
+ )
497
+ return
498
+ self._history_update_leaf(
499
+ kl=kl, v=v, history_dict=history_dict, update_history=update_history
500
+ )
501
+
502
+ def _history_update(
503
+ self,
504
+ history: HistoryRecord,
505
+ history_dict: Dict[str, Any],
506
+ ) -> None:
507
+ # if syncing an old run, we can skip this logic
508
+ if history_dict.get("_step") is None:
509
+ self._history_assign_step(history, history_dict)
510
+
511
+ update_history: Dict[str, Any] = {}
512
+ # Look for metric matches
513
+ if self._metric_defines or self._metric_globs:
514
+ for hkey, hval in history_dict.items():
515
+ self._history_update_list([hkey], hval, history_dict, update_history)
516
+
517
+ if update_history:
518
+ history_dict.update(update_history)
519
+ for k, v in update_history.items():
520
+ item = history.item.add()
521
+ item.key = k
522
+ item.value_json = json.dumps(v)
523
+
524
+ def handle_history(self, record: Record) -> None:
525
+ history_dict = proto_util.dict_from_proto_list(record.history.item)
526
+
527
+ # Inject _runtime if it is not present
528
+ if history_dict is not None:
529
+ if "_runtime" not in history_dict:
530
+ self._history_assign_runtime(record.history, history_dict)
531
+
532
+ self._history_update(record.history, history_dict)
533
+ self._dispatch_record(record)
534
+ self._save_history(record.history)
535
+ # update summary from history
536
+ updated_keys = self._update_summary(history_dict)
537
+ if updated_keys:
538
+ updated_items = {k: self._consolidated_summary[k] for k in updated_keys}
539
+ self._save_summary(updated_items)
540
+
541
+ def _flush_partial_history(
542
+ self,
543
+ step: Optional[int] = None,
544
+ ) -> None:
545
+ if not self._partial_history:
546
+ return
547
+
548
+ history = HistoryRecord()
549
+ for k, v in self._partial_history.items():
550
+ item = history.item.add()
551
+ item.key = k
552
+ item.value_json = json.dumps(v)
553
+ if step is not None:
554
+ history.step.num = step
555
+ self.handle_history(Record(history=history))
556
+ self._partial_history = {}
557
+
558
+ def handle_request_sender_mark_report(self, record: Record) -> None:
559
+ self._dispatch_record(record, always_send=True)
560
+
561
+ def handle_request_status_report(self, record: Record) -> None:
562
+ self._dispatch_record(record, always_send=True)
563
+
564
+ def handle_request_partial_history(self, record: Record) -> None:
565
+ partial_history = record.request.partial_history
566
+
567
+ flush = None
568
+ if partial_history.HasField("action"):
569
+ flush = partial_history.action.flush
570
+
571
+ step = None
572
+ if partial_history.HasField("step"):
573
+ step = partial_history.step.num
574
+
575
+ history_dict = proto_util.dict_from_proto_list(partial_history.item)
576
+ if step is not None:
577
+ if step < self._step:
578
+ if not self._dropped_history:
579
+ message = (
580
+ "Step only supports monotonically increasing values, use define_metric to set a custom x "
581
+ f"axis. For details see: {wburls.wburls.get('wandb_define_metric')}"
582
+ )
583
+ self._internal_messages.warning.append(message)
584
+ self._dropped_history = True
585
+ message = (
586
+ f"(User provided step: {step} is less than current step: {self._step}. "
587
+ f"Dropping entry: {history_dict})."
588
+ )
589
+ self._internal_messages.warning.append(message)
590
+ return
591
+ elif step > self._step:
592
+ self._flush_partial_history()
593
+ self._step = step
594
+ elif flush is None:
595
+ flush = True
596
+
597
+ self._partial_history.update(history_dict)
598
+
599
+ if flush:
600
+ self._flush_partial_history(self._step)
601
+
602
+ def handle_summary(self, record: Record) -> None:
603
+ summary = record.summary
604
+ for item in summary.update:
605
+ if len(item.nested_key) > 0:
606
+ # we use either key or nested_key -- not both
607
+ assert item.key == ""
608
+ key = tuple(item.nested_key)
609
+ else:
610
+ # no counter-assertion here, because technically
611
+ # summary[""] is valid
612
+ key = (item.key,)
613
+
614
+ target = self._consolidated_summary
615
+
616
+ # recurse down the dictionary structure:
617
+ for prop in key[:-1]:
618
+ target = target[prop]
619
+
620
+ # use the last element of the key to write the leaf:
621
+ target[key[-1]] = json.loads(item.value_json)
622
+
623
+ for item in summary.remove:
624
+ if len(item.nested_key) > 0:
625
+ # we use either key or nested_key -- not both
626
+ assert item.key == ""
627
+ key = tuple(item.nested_key)
628
+ else:
629
+ # no counter-assertion here, because technically
630
+ # summary[""] is valid
631
+ key = (item.key,)
632
+
633
+ target = self._consolidated_summary
634
+
635
+ # recurse down the dictionary structure:
636
+ for prop in key[:-1]:
637
+ target = target[prop]
638
+
639
+ # use the last element of the key to erase the leaf:
640
+ del target[key[-1]]
641
+
642
+ self._save_summary(self._consolidated_summary)
643
+
644
+ def handle_exit(self, record: Record) -> None:
645
+ if self._track_time is not None:
646
+ self._accumulate_time += time.time() - self._track_time
647
+ record.exit.runtime = int(self._accumulate_time)
648
+ self._dispatch_record(record, always_send=True)
649
+
650
+ def handle_final(self, record: Record) -> None:
651
+ self._dispatch_record(record, always_send=True)
652
+
653
+ def handle_preempting(self, record: Record) -> None:
654
+ self._dispatch_record(record)
655
+
656
+ def handle_header(self, record: Record) -> None:
657
+ self._dispatch_record(record)
658
+
659
+ def handle_footer(self, record: Record) -> None:
660
+ self._dispatch_record(record)
661
+
662
+ def handle_request_attach(self, record: Record) -> None:
663
+ result = proto_util._result_from_record(record)
664
+ attach_id = record.request.attach.attach_id
665
+ assert attach_id
666
+ assert self._run_proto
667
+ result.response.attach_response.run.CopyFrom(self._run_proto)
668
+ self._respond_result(result)
669
+
670
+ def handle_request_log_artifact(self, record: Record) -> None:
671
+ self._dispatch_record(record)
672
+
673
+ def handle_telemetry(self, record: Record) -> None:
674
+ self._dispatch_record(record)
675
+
676
+ def handle_request_run_start(self, record: Record) -> None:
677
+ run_start = record.request.run_start
678
+ assert run_start
679
+ assert run_start.run
680
+
681
+ self._run_proto = run_start.run
682
+
683
+ self._run_start_time = run_start.run.start_time.ToMicroseconds() / 1e6
684
+
685
+ self._track_time = time.time()
686
+ if run_start.run.resumed and run_start.run.runtime:
687
+ self._accumulate_time = run_start.run.runtime
688
+ else:
689
+ self._accumulate_time = 0
690
+
691
+ # system monitor
692
+ self._system_monitor = SystemMonitor(
693
+ self._settings,
694
+ self._interface,
695
+ )
696
+ if not self._settings._disable_stats:
697
+ self._system_monitor.start()
698
+ if not self._settings._disable_meta and not run_start.run.resumed:
699
+ self._system_monitor.probe(publish=True)
700
+
701
+ self._tb_watcher = tb_watcher.TBWatcher(
702
+ self._settings, interface=self._interface, run_proto=run_start.run
703
+ )
704
+
705
+ if run_start.run.resumed or run_start.run.forked:
706
+ self._step = run_start.run.starting_step
707
+ result = proto_util._result_from_record(record)
708
+ self._respond_result(result)
709
+
710
+ def handle_request_resume(self, record: Record) -> None:
711
+ if self._system_monitor is not None:
712
+ logger.info("starting system metrics thread")
713
+ self._system_monitor.start()
714
+
715
+ if self._track_time is not None:
716
+ self._accumulate_time += time.time() - self._track_time
717
+ self._track_time = time.time()
718
+
719
+ def handle_request_pause(self, record: Record) -> None:
720
+ if self._system_monitor is not None:
721
+ logger.info("stopping system metrics thread")
722
+ self._system_monitor.finish()
723
+ if self._track_time is not None:
724
+ self._accumulate_time += time.time() - self._track_time
725
+ self._track_time = None
726
+
727
+ def handle_request_poll_exit(self, record: Record) -> None:
728
+ self._dispatch_record(record, always_send=True)
729
+
730
+ def handle_request_stop_status(self, record: Record) -> None:
731
+ self._dispatch_record(record)
732
+
733
+ def handle_request_network_status(self, record: Record) -> None:
734
+ self._dispatch_record(record)
735
+
736
+ def handle_request_internal_messages(self, record: Record) -> None:
737
+ result = proto_util._result_from_record(record)
738
+ result.response.internal_messages_response.messages.CopyFrom(
739
+ self._internal_messages
740
+ )
741
+ self._internal_messages.Clear()
742
+ self._respond_result(result)
743
+
744
+ def handle_request_status(self, record: Record) -> None:
745
+ result = proto_util._result_from_record(record)
746
+ self._respond_result(result)
747
+
748
+ def handle_request_get_summary(self, record: Record) -> None:
749
+ result = proto_util._result_from_record(record)
750
+ for key, value in self._consolidated_summary.items():
751
+ item = SummaryItem()
752
+ item.key = key
753
+ item.value_json = json.dumps(value)
754
+ result.response.get_summary_response.item.append(item)
755
+ self._respond_result(result)
756
+
757
+ def handle_request_get_system_metrics(self, record: Record) -> None:
758
+ result = proto_util._result_from_record(record)
759
+ if self._system_monitor is None:
760
+ return
761
+
762
+ buffer = self._system_monitor.buffer
763
+ for key, samples in buffer.items():
764
+ buff = []
765
+ for s in samples:
766
+ sms = SystemMetricSample()
767
+ sms.timestamp.FromMicroseconds(int(s[0] * 1e6))
768
+ sms.value = s[1]
769
+ buff.append(sms)
770
+
771
+ result.response.get_system_metrics_response.system_metrics[key].CopyFrom(
772
+ SystemMetricsBuffer(record=buff)
773
+ )
774
+
775
+ self._respond_result(result)
776
+
777
+ def handle_tbrecord(self, record: Record) -> None:
778
+ logger.info("handling tbrecord: %s", record)
779
+ if self._tb_watcher:
780
+ tbrecord = record.tbrecord
781
+ self._tb_watcher.add(tbrecord.log_dir, tbrecord.save, tbrecord.root_dir)
782
+ self._dispatch_record(record)
783
+
784
+ def _handle_defined_metric(self, record: Record) -> None:
785
+ metric = record.metric
786
+ if metric._control.overwrite:
787
+ self._metric_defines[metric.name].CopyFrom(metric)
788
+ else:
789
+ self._metric_defines[metric.name].MergeFrom(metric)
790
+
791
+ # before dispatching, make sure step_metric is defined, if not define it and
792
+ # dispatch it locally first
793
+ metric = self._metric_defines[metric.name]
794
+ if metric.step_metric and metric.step_metric not in self._metric_defines:
795
+ m = MetricRecord(name=metric.step_metric)
796
+ self._metric_defines[metric.step_metric] = m
797
+ mr = Record()
798
+ mr.metric.CopyFrom(m)
799
+ mr.control.local = True # Don't store this, just send it
800
+ self._dispatch_record(mr)
801
+
802
+ self._dispatch_record(record)
803
+
804
+ def _handle_glob_metric(self, record: Record) -> None:
805
+ metric = record.metric
806
+ if metric._control.overwrite:
807
+ self._metric_globs[metric.glob_name].CopyFrom(metric)
808
+ else:
809
+ self._metric_globs[metric.glob_name].MergeFrom(metric)
810
+ self._dispatch_record(record)
811
+
812
+ def handle_metric(self, record: Record) -> None:
813
+ """Handle MetricRecord.
814
+
815
+ Walkthrough of the life of a MetricRecord:
816
+
817
+ Metric defined:
818
+ - run.define_metric() parses arguments create wandb_metric.Metric
819
+ - build MetricRecord publish to interface
820
+ - handler (this function) keeps list of metrics published:
821
+ - self._metric_defines: Fully defined metrics
822
+ - self._metric_globs: metrics that have a wildcard
823
+ - dispatch writer and sender thread
824
+ - writer: records are saved to persistent store
825
+ - sender: fully defined metrics get mapped into metadata for UI
826
+
827
+ History logged:
828
+ - handle_history
829
+ - check if metric matches _metric_defines
830
+ - if not, check if metric matches _metric_globs
831
+ - if _metric globs match, generate defined metric and call _handle_metric
832
+
833
+ Args:
834
+ record (Record): Metric record to process
835
+ """
836
+ if record.metric.name:
837
+ self._handle_defined_metric(record)
838
+ elif record.metric.glob_name:
839
+ self._handle_glob_metric(record)
840
+
841
+ def handle_request_sampled_history(self, record: Record) -> None:
842
+ result = proto_util._result_from_record(record)
843
+ for key, sampled in self._sampled_history.items():
844
+ item = SampledHistoryItem()
845
+ item.key = key
846
+ values: Iterable[Any] = sampled.get()
847
+ if all(isinstance(i, numbers.Integral) for i in values):
848
+ try:
849
+ item.values_int.extend(values)
850
+ except ValueError:
851
+ # it is safe to ignore these as this is for display information
852
+ pass
853
+ elif all(isinstance(i, numbers.Real) for i in values):
854
+ item.values_float.extend(values)
855
+ result.response.sampled_history_response.item.append(item)
856
+ self._respond_result(result)
857
+
858
+ def handle_request_keepalive(self, record: Record) -> None:
859
+ """Handle a keepalive request.
860
+
861
+ Keepalive is a noop, we just want to verify transport is alive.
862
+ """
863
+
864
+ def handle_request_run_status(self, record: Record) -> None:
865
+ self._dispatch_record(record, always_send=True)
866
+
867
+ def handle_request_shutdown(self, record: Record) -> None:
868
+ # TODO(jhr): should we drain things and stop new requests from coming in?
869
+ result = proto_util._result_from_record(record)
870
+ self._respond_result(result)
871
+ self._stopped.set()
872
+
873
+ def finish(self) -> None:
874
+ logger.info("shutting down handler")
875
+ if self._system_monitor is not None:
876
+ self._system_monitor.finish()
877
+ if self._tb_watcher:
878
+ self._tb_watcher.finish()
879
+ # self._context_keeper._debug_print_orphans()
880
+
881
+ def __next__(self) -> Record:
882
+ return self._record_q.get(block=True)
883
+
884
+ next = __next__
885
+
886
+ def _history_assign_runtime(
887
+ self,
888
+ history: HistoryRecord,
889
+ history_dict: Dict[str, Any],
890
+ ) -> None:
891
+ # _runtime calculation is meaningless if there is no _timestamp
892
+ if "_timestamp" not in history_dict:
893
+ return
894
+ # if it is offline sync, self._run_start_time is None
895
+ # in that case set it to the first tfevent timestamp
896
+ if self._run_start_time is None:
897
+ self._run_start_time = history_dict["_timestamp"]
898
+ history_dict["_runtime"] = history_dict["_timestamp"] - self._run_start_time
899
+ item = history.item.add()
900
+ item.key = "_runtime"
901
+ item.value_json = json.dumps(history_dict[item.key])