wandb 0.21.2__py3-none-macosx_12_0_arm64.whl

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