wandb 0.22.1__py3-none-win_arm64.whl

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