wandb 0.21.2__py3-none-macosx_12_0_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,1056 @@
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
+ _drop: bool
91
+
92
+ def __init__(self) -> None:
93
+ self._drop = False
94
+
95
+ def publish_header(self) -> None:
96
+ header = pb.HeaderRecord()
97
+ self._publish_header(header)
98
+
99
+ @abstractmethod
100
+ def _publish_header(self, header: pb.HeaderRecord) -> None:
101
+ raise NotImplementedError
102
+
103
+ def deliver_status(self) -> MailboxHandle[pb.Result]:
104
+ return self._deliver_status(pb.StatusRequest())
105
+
106
+ @abstractmethod
107
+ def _deliver_status(
108
+ self,
109
+ status: pb.StatusRequest,
110
+ ) -> MailboxHandle[pb.Result]:
111
+ raise NotImplementedError
112
+
113
+ def _make_config(
114
+ self,
115
+ data: Optional[dict] = None,
116
+ key: Optional[Union[Tuple[str, ...], str]] = None,
117
+ val: Optional[Any] = None,
118
+ obj: Optional[pb.ConfigRecord] = None,
119
+ ) -> pb.ConfigRecord:
120
+ config = obj or pb.ConfigRecord()
121
+ if data:
122
+ for k, v in data.items():
123
+ update = config.update.add()
124
+ update.key = k
125
+ update.value_json = json_dumps_safer(json_friendly(v)[0])
126
+ if key:
127
+ update = config.update.add()
128
+ if isinstance(key, tuple):
129
+ for k in key:
130
+ update.nested_key.append(k)
131
+ else:
132
+ update.key = key
133
+ update.value_json = json_dumps_safer(json_friendly(val)[0])
134
+ return config
135
+
136
+ def _make_run(self, run: "Run") -> pb.RunRecord: # noqa: C901
137
+ proto_run = pb.RunRecord()
138
+ if run._settings.entity is not None:
139
+ proto_run.entity = run._settings.entity
140
+ if run._settings.project is not None:
141
+ proto_run.project = run._settings.project
142
+ if run._settings.run_group is not None:
143
+ proto_run.run_group = run._settings.run_group
144
+ if run._settings.run_job_type is not None:
145
+ proto_run.job_type = run._settings.run_job_type
146
+ if run._settings.run_id is not None:
147
+ proto_run.run_id = run._settings.run_id
148
+ if run._settings.run_name is not None:
149
+ proto_run.display_name = run._settings.run_name
150
+ if run._settings.run_notes is not None:
151
+ proto_run.notes = run._settings.run_notes
152
+ if run._settings.run_tags is not None:
153
+ proto_run.tags.extend(run._settings.run_tags)
154
+ if run._start_time is not None:
155
+ proto_run.start_time.FromMicroseconds(int(run._start_time * 1e6))
156
+ if run._starting_step is not None:
157
+ proto_run.starting_step = run._starting_step
158
+ if run._settings.git_remote_url is not None:
159
+ proto_run.git.remote_url = run._settings.git_remote_url
160
+ if run._settings.git_commit is not None:
161
+ proto_run.git.commit = run._settings.git_commit
162
+ if run._settings.sweep_id is not None:
163
+ proto_run.sweep_id = run._settings.sweep_id
164
+ if run._settings.host:
165
+ proto_run.host = run._settings.host
166
+ if run._settings.resumed:
167
+ proto_run.resumed = run._settings.resumed
168
+ if run._settings.fork_from:
169
+ run_moment = run._settings.fork_from
170
+ proto_run.branch_point.run = run_moment.run
171
+ proto_run.branch_point.metric = run_moment.metric
172
+ proto_run.branch_point.value = run_moment.value
173
+ if run._settings.resume_from:
174
+ run_moment = run._settings.resume_from
175
+ proto_run.branch_point.run = run_moment.run
176
+ proto_run.branch_point.metric = run_moment.metric
177
+ proto_run.branch_point.value = run_moment.value
178
+ if run._forked:
179
+ proto_run.forked = run._forked
180
+ if run._config is not None:
181
+ config_dict = run._config._as_dict() # type: ignore
182
+ self._make_config(data=config_dict, obj=proto_run.config)
183
+ if run._telemetry_obj:
184
+ proto_run.telemetry.MergeFrom(run._telemetry_obj)
185
+ if run._start_runtime:
186
+ proto_run.runtime = run._start_runtime
187
+ return proto_run
188
+
189
+ def publish_run(self, run: "Run") -> None:
190
+ run_record = self._make_run(run)
191
+ self._publish_run(run_record)
192
+
193
+ @abstractmethod
194
+ def _publish_run(self, run: pb.RunRecord) -> None:
195
+ raise NotImplementedError
196
+
197
+ def publish_cancel(self, cancel_slot: str) -> None:
198
+ cancel = pb.CancelRequest(cancel_slot=cancel_slot)
199
+ self._publish_cancel(cancel)
200
+
201
+ @abstractmethod
202
+ def _publish_cancel(self, cancel: pb.CancelRequest) -> None:
203
+ raise NotImplementedError
204
+
205
+ def publish_config(
206
+ self,
207
+ data: Optional[dict] = None,
208
+ key: Optional[Union[Tuple[str, ...], str]] = None,
209
+ val: Optional[Any] = None,
210
+ ) -> None:
211
+ cfg = self._make_config(data=data, key=key, val=val)
212
+
213
+ self._publish_config(cfg)
214
+
215
+ @abstractmethod
216
+ def _publish_config(self, cfg: pb.ConfigRecord) -> None:
217
+ raise NotImplementedError
218
+
219
+ @abstractmethod
220
+ def _publish_metric(self, metric: pb.MetricRecord) -> None:
221
+ raise NotImplementedError
222
+
223
+ def _make_summary_from_dict(self, summary_dict: dict) -> pb.SummaryRecord:
224
+ summary = pb.SummaryRecord()
225
+ for k, v in summary_dict.items():
226
+ update = summary.update.add()
227
+ update.key = k
228
+ update.value_json = json.dumps(v)
229
+ return summary
230
+
231
+ def _summary_encode(
232
+ self,
233
+ value: Any,
234
+ path_from_root: str,
235
+ run: "Run",
236
+ ) -> dict:
237
+ """Normalize, compress, and encode sub-objects for backend storage.
238
+
239
+ value: Object to encode.
240
+ path_from_root: `str` dot separated string from the top-level summary to the
241
+ current `value`.
242
+
243
+ Returns:
244
+ A new tree of dict's with large objects replaced with dictionaries
245
+ with "_type" entries that say which type the original data was.
246
+ """
247
+ # Constructs a new `dict` tree in `json_value` that discards and/or
248
+ # encodes objects that aren't JSON serializable.
249
+
250
+ if isinstance(value, dict):
251
+ json_value = {}
252
+ for key, value in value.items(): # noqa: B020
253
+ json_value[key] = self._summary_encode(
254
+ value,
255
+ path_from_root + "." + key,
256
+ run=run,
257
+ )
258
+ return json_value
259
+ else:
260
+ friendly_value, converted = json_friendly(
261
+ val_to_json(run, path_from_root, value, namespace="summary")
262
+ )
263
+ json_value, compressed = maybe_compress_summary(
264
+ friendly_value, get_h5_typename(value)
265
+ )
266
+ if compressed:
267
+ # TODO(jhr): impleement me
268
+ pass
269
+ # self.write_h5(path_from_root, friendly_value)
270
+
271
+ return json_value
272
+
273
+ def _make_summary(
274
+ self,
275
+ summary_record: sr.SummaryRecord,
276
+ run: "Run",
277
+ ) -> pb.SummaryRecord:
278
+ pb_summary_record = pb.SummaryRecord()
279
+
280
+ for item in summary_record.update:
281
+ pb_summary_item = pb_summary_record.update.add()
282
+ key_length = len(item.key)
283
+
284
+ assert key_length > 0
285
+
286
+ if key_length > 1:
287
+ pb_summary_item.nested_key.extend(item.key)
288
+ else:
289
+ pb_summary_item.key = item.key[0]
290
+
291
+ path_from_root = ".".join(item.key)
292
+ json_value = self._summary_encode(
293
+ item.value,
294
+ path_from_root,
295
+ run=run,
296
+ )
297
+ json_value, _ = json_friendly(json_value) # type: ignore
298
+
299
+ pb_summary_item.value_json = json.dumps(
300
+ json_value,
301
+ cls=WandBJSONEncoderOld,
302
+ )
303
+
304
+ for item in summary_record.remove:
305
+ pb_summary_item = pb_summary_record.remove.add()
306
+ key_length = len(item.key)
307
+
308
+ assert key_length > 0
309
+
310
+ if key_length > 1:
311
+ pb_summary_item.nested_key.extend(item.key)
312
+ else:
313
+ pb_summary_item.key = item.key[0]
314
+
315
+ return pb_summary_record
316
+
317
+ def publish_summary(
318
+ self,
319
+ run: "Run",
320
+ summary_record: sr.SummaryRecord,
321
+ ) -> None:
322
+ pb_summary_record = self._make_summary(summary_record, run=run)
323
+ self._publish_summary(pb_summary_record)
324
+
325
+ @abstractmethod
326
+ def _publish_summary(self, summary: pb.SummaryRecord) -> None:
327
+ raise NotImplementedError
328
+
329
+ def _make_files(self, files_dict: "FilesDict") -> pb.FilesRecord:
330
+ files = pb.FilesRecord()
331
+ for path, policy in files_dict["files"]:
332
+ f = files.files.add()
333
+ f.path = path
334
+ f.policy = file_policy_to_enum(policy)
335
+ return files
336
+
337
+ def publish_files(self, files_dict: "FilesDict") -> None:
338
+ files = self._make_files(files_dict)
339
+ self._publish_files(files)
340
+
341
+ @abstractmethod
342
+ def _publish_files(self, files: pb.FilesRecord) -> None:
343
+ raise NotImplementedError
344
+
345
+ def publish_python_packages(self, working_set) -> None:
346
+ python_packages = pb.PythonPackagesRequest()
347
+ for pkg in working_set:
348
+ python_packages.package.add(name=pkg.key, version=pkg.version)
349
+ self._publish_python_packages(python_packages)
350
+
351
+ @abstractmethod
352
+ def _publish_python_packages(
353
+ self, python_packages: pb.PythonPackagesRequest
354
+ ) -> None:
355
+ raise NotImplementedError
356
+
357
+ def _make_artifact(self, artifact: "Artifact") -> pb.ArtifactRecord:
358
+ proto_artifact = pb.ArtifactRecord()
359
+ proto_artifact.type = artifact.type
360
+ proto_artifact.name = artifact.name
361
+ proto_artifact.client_id = artifact._client_id
362
+ proto_artifact.sequence_client_id = artifact._sequence_client_id
363
+ proto_artifact.digest = artifact.digest
364
+ if artifact.distributed_id:
365
+ proto_artifact.distributed_id = artifact.distributed_id
366
+ if artifact.description:
367
+ proto_artifact.description = artifact.description
368
+ if artifact.metadata:
369
+ proto_artifact.metadata = json.dumps(json_friendly_val(artifact.metadata))
370
+ if artifact._base_id:
371
+ proto_artifact.base_id = artifact._base_id
372
+
373
+ ttl_duration_input = artifact._ttl_duration_seconds_to_gql()
374
+ if ttl_duration_input:
375
+ proto_artifact.ttl_duration_seconds = ttl_duration_input
376
+ proto_artifact.incremental_beta1 = artifact.incremental
377
+ self._make_artifact_manifest(artifact.manifest, obj=proto_artifact.manifest)
378
+ return proto_artifact
379
+
380
+ def _make_artifact_manifest(
381
+ self,
382
+ artifact_manifest: ArtifactManifest,
383
+ obj: Optional[pb.ArtifactManifest] = None,
384
+ ) -> pb.ArtifactManifest:
385
+ proto_manifest = obj or pb.ArtifactManifest()
386
+ proto_manifest.version = artifact_manifest.version()
387
+ proto_manifest.storage_policy = artifact_manifest.storage_policy.name()
388
+
389
+ # Very large manifests need to be written to file to avoid protobuf size limits.
390
+ if len(artifact_manifest) > MANIFEST_FILE_SIZE_THRESHOLD:
391
+ path = self._write_artifact_manifest_file(artifact_manifest)
392
+ proto_manifest.manifest_file_path = path
393
+ return proto_manifest
394
+
395
+ for k, v in artifact_manifest.storage_policy.config().items() or {}.items():
396
+ cfg = proto_manifest.storage_policy_config.add()
397
+ cfg.key = k
398
+ cfg.value_json = json.dumps(v)
399
+
400
+ for entry in sorted(artifact_manifest.entries.values(), key=lambda k: k.path):
401
+ proto_entry = proto_manifest.contents.add()
402
+ proto_entry.path = entry.path
403
+ proto_entry.digest = entry.digest
404
+ if entry.size:
405
+ proto_entry.size = entry.size
406
+ if entry.birth_artifact_id:
407
+ proto_entry.birth_artifact_id = entry.birth_artifact_id
408
+ if entry.ref:
409
+ proto_entry.ref = entry.ref
410
+ if entry.local_path:
411
+ proto_entry.local_path = entry.local_path
412
+ proto_entry.skip_cache = entry.skip_cache
413
+ for k, v in entry.extra.items():
414
+ proto_extra = proto_entry.extra.add()
415
+ proto_extra.key = k
416
+ proto_extra.value_json = json.dumps(v)
417
+ return proto_manifest
418
+
419
+ def _write_artifact_manifest_file(self, manifest: ArtifactManifest) -> str:
420
+ manifest_dir = Path(get_staging_dir()) / "artifact_manifests"
421
+ manifest_dir.mkdir(parents=True, exist_ok=True)
422
+ # It would be simpler to use `manifest.to_json()`, but that gets very slow for
423
+ # large manifests since it encodes the whole thing as a single JSON object.
424
+ filename = f"{time.time()}_{token_hex(8)}.manifest_contents.jl.gz"
425
+ manifest_file_path = manifest_dir / filename
426
+ with gzip.open(manifest_file_path, mode="wt", compresslevel=1) as f:
427
+ for entry in manifest.entries.values():
428
+ f.write(f"{json.dumps(entry.to_json())}\n")
429
+ return str(manifest_file_path)
430
+
431
+ def deliver_link_artifact(
432
+ self,
433
+ artifact: "Artifact",
434
+ portfolio_name: str,
435
+ aliases: Iterable[str],
436
+ entity: Optional[str] = None,
437
+ project: Optional[str] = None,
438
+ organization: Optional[str] = None,
439
+ ) -> MailboxHandle[pb.Result]:
440
+ link_artifact = pb.LinkArtifactRequest()
441
+ if artifact.is_draft():
442
+ link_artifact.client_id = artifact._client_id
443
+ else:
444
+ link_artifact.server_id = artifact.id if artifact.id else ""
445
+ link_artifact.portfolio_name = portfolio_name
446
+ link_artifact.portfolio_entity = entity or ""
447
+ link_artifact.portfolio_organization = organization or ""
448
+ link_artifact.portfolio_project = project or ""
449
+ link_artifact.portfolio_aliases.extend(aliases)
450
+
451
+ return self._deliver_link_artifact(link_artifact)
452
+
453
+ @abstractmethod
454
+ def _deliver_link_artifact(
455
+ self, link_artifact: pb.LinkArtifactRequest
456
+ ) -> MailboxHandle[pb.Result]:
457
+ raise NotImplementedError
458
+
459
+ @staticmethod
460
+ def _make_partial_source_str(
461
+ source: Any, job_info: Dict[str, Any], metadata: Dict[str, Any]
462
+ ) -> str:
463
+ """Construct use_artifact.partial.source_info.source as str."""
464
+ source_type = job_info.get("source_type", "").strip()
465
+ if source_type == "artifact":
466
+ info_source = job_info.get("source", {})
467
+ source.artifact.artifact = info_source.get("artifact", "")
468
+ source.artifact.entrypoint.extend(info_source.get("entrypoint", []))
469
+ source.artifact.notebook = info_source.get("notebook", False)
470
+ build_context = info_source.get("build_context")
471
+ if build_context:
472
+ source.artifact.build_context = build_context
473
+ dockerfile = info_source.get("dockerfile")
474
+ if dockerfile:
475
+ source.artifact.dockerfile = dockerfile
476
+ elif source_type == "repo":
477
+ source.git.git_info.remote = metadata.get("git", {}).get("remote", "")
478
+ source.git.git_info.commit = metadata.get("git", {}).get("commit", "")
479
+ source.git.entrypoint.extend(metadata.get("entrypoint", []))
480
+ source.git.notebook = metadata.get("notebook", False)
481
+ build_context = metadata.get("build_context")
482
+ if build_context:
483
+ source.git.build_context = build_context
484
+ dockerfile = metadata.get("dockerfile")
485
+ if dockerfile:
486
+ source.git.dockerfile = dockerfile
487
+ elif source_type == "image":
488
+ source.image.image = metadata.get("docker", "")
489
+ else:
490
+ raise ValueError("Invalid source type")
491
+
492
+ source_str: str = source.SerializeToString()
493
+ return source_str
494
+
495
+ def _make_proto_use_artifact(
496
+ self,
497
+ use_artifact: pb.UseArtifactRecord,
498
+ job_name: str,
499
+ job_info: Dict[str, Any],
500
+ metadata: Dict[str, Any],
501
+ ) -> pb.UseArtifactRecord:
502
+ use_artifact.partial.job_name = job_name
503
+ use_artifact.partial.source_info._version = job_info.get("_version", "")
504
+ use_artifact.partial.source_info.source_type = job_info.get("source_type", "")
505
+ use_artifact.partial.source_info.runtime = job_info.get("runtime", "")
506
+
507
+ src_str = self._make_partial_source_str(
508
+ source=use_artifact.partial.source_info.source,
509
+ job_info=job_info,
510
+ metadata=metadata,
511
+ )
512
+ use_artifact.partial.source_info.source.ParseFromString(src_str) # type: ignore[arg-type]
513
+
514
+ return use_artifact
515
+
516
+ def publish_use_artifact(
517
+ self,
518
+ artifact: "Artifact",
519
+ ) -> None:
520
+ assert artifact.id is not None, "Artifact must have an id"
521
+
522
+ use_artifact = pb.UseArtifactRecord(
523
+ id=artifact.id,
524
+ type=artifact.type,
525
+ name=artifact.name,
526
+ )
527
+
528
+ # TODO(gst): move to internal process
529
+ if "_partial" in artifact.metadata:
530
+ # Download source info from logged partial job artifact
531
+ job_info = {}
532
+ try:
533
+ path = artifact.get_entry("wandb-job.json").download()
534
+ with open(path) as f:
535
+ job_info = json.load(f)
536
+
537
+ except Exception as e:
538
+ logger.warning(
539
+ f"Failed to download partial job info from artifact {artifact}, : {e}"
540
+ )
541
+ termwarn(
542
+ f"Failed to download partial job info from artifact {artifact}, : {e}"
543
+ )
544
+ return
545
+
546
+ try:
547
+ use_artifact = self._make_proto_use_artifact(
548
+ use_artifact=use_artifact,
549
+ job_name=artifact.name,
550
+ job_info=job_info,
551
+ metadata=artifact.metadata,
552
+ )
553
+ except Exception as e:
554
+ logger.warning(f"Failed to construct use artifact proto: {e}")
555
+ termwarn(f"Failed to construct use artifact proto: {e}")
556
+ return
557
+
558
+ self._publish_use_artifact(use_artifact)
559
+
560
+ @abstractmethod
561
+ def _publish_use_artifact(self, proto_artifact: pb.UseArtifactRecord) -> None:
562
+ raise NotImplementedError
563
+
564
+ def deliver_artifact(
565
+ self,
566
+ run: "Run",
567
+ artifact: "Artifact",
568
+ aliases: Iterable[str],
569
+ tags: Optional[Iterable[str]] = None,
570
+ history_step: Optional[int] = None,
571
+ is_user_created: bool = False,
572
+ use_after_commit: bool = False,
573
+ finalize: bool = True,
574
+ ) -> MailboxHandle[pb.Result]:
575
+ proto_run = self._make_run(run)
576
+ proto_artifact = self._make_artifact(artifact)
577
+ proto_artifact.run_id = proto_run.run_id
578
+ proto_artifact.project = proto_run.project
579
+ proto_artifact.entity = proto_run.entity
580
+ proto_artifact.user_created = is_user_created
581
+ proto_artifact.use_after_commit = use_after_commit
582
+ proto_artifact.finalize = finalize
583
+
584
+ proto_artifact.aliases.extend(aliases or [])
585
+ proto_artifact.tags.extend(tags or [])
586
+
587
+ log_artifact = pb.LogArtifactRequest()
588
+ log_artifact.artifact.CopyFrom(proto_artifact)
589
+ if history_step is not None:
590
+ log_artifact.history_step = history_step
591
+ log_artifact.staging_dir = get_staging_dir()
592
+ resp = self._deliver_artifact(log_artifact)
593
+ return resp
594
+
595
+ @abstractmethod
596
+ def _deliver_artifact(
597
+ self,
598
+ log_artifact: pb.LogArtifactRequest,
599
+ ) -> MailboxHandle[pb.Result]:
600
+ raise NotImplementedError
601
+
602
+ def deliver_download_artifact(
603
+ self,
604
+ artifact_id: str,
605
+ download_root: str,
606
+ allow_missing_references: bool,
607
+ skip_cache: bool,
608
+ path_prefix: Optional[str],
609
+ ) -> MailboxHandle[pb.Result]:
610
+ download_artifact = pb.DownloadArtifactRequest()
611
+ download_artifact.artifact_id = artifact_id
612
+ download_artifact.download_root = download_root
613
+ download_artifact.allow_missing_references = allow_missing_references
614
+ download_artifact.skip_cache = skip_cache
615
+ download_artifact.path_prefix = path_prefix or ""
616
+ resp = self._deliver_download_artifact(download_artifact)
617
+ return resp
618
+
619
+ @abstractmethod
620
+ def _deliver_download_artifact(
621
+ self, download_artifact: pb.DownloadArtifactRequest
622
+ ) -> MailboxHandle[pb.Result]:
623
+ raise NotImplementedError
624
+
625
+ def publish_artifact(
626
+ self,
627
+ run: "Run",
628
+ artifact: "Artifact",
629
+ aliases: Iterable[str],
630
+ tags: Optional[Iterable[str]] = None,
631
+ is_user_created: bool = False,
632
+ use_after_commit: bool = False,
633
+ finalize: bool = True,
634
+ ) -> None:
635
+ proto_run = self._make_run(run)
636
+ proto_artifact = self._make_artifact(artifact)
637
+ proto_artifact.run_id = proto_run.run_id
638
+ proto_artifact.project = proto_run.project
639
+ proto_artifact.entity = proto_run.entity
640
+ proto_artifact.user_created = is_user_created
641
+ proto_artifact.use_after_commit = use_after_commit
642
+ proto_artifact.finalize = finalize
643
+ proto_artifact.aliases.extend(aliases or [])
644
+ proto_artifact.tags.extend(tags or [])
645
+ self._publish_artifact(proto_artifact)
646
+
647
+ @abstractmethod
648
+ def _publish_artifact(self, proto_artifact: pb.ArtifactRecord) -> None:
649
+ raise NotImplementedError
650
+
651
+ def publish_tbdata(self, log_dir: str, save: bool, root_logdir: str = "") -> None:
652
+ tbrecord = pb.TBRecord()
653
+ tbrecord.log_dir = log_dir
654
+ tbrecord.save = save
655
+ tbrecord.root_dir = root_logdir
656
+ self._publish_tbdata(tbrecord)
657
+
658
+ @abstractmethod
659
+ def _publish_tbdata(self, tbrecord: pb.TBRecord) -> None:
660
+ raise NotImplementedError
661
+
662
+ @abstractmethod
663
+ def _publish_telemetry(self, telem: tpb.TelemetryRecord) -> None:
664
+ raise NotImplementedError
665
+
666
+ def publish_environment(self, environment: pb.EnvironmentRecord) -> None:
667
+ self._publish_environment(environment)
668
+
669
+ @abstractmethod
670
+ def _publish_environment(self, environment: pb.EnvironmentRecord) -> None:
671
+ raise NotImplementedError
672
+
673
+ def publish_partial_history(
674
+ self,
675
+ run: "Run",
676
+ data: dict,
677
+ user_step: int,
678
+ step: Optional[int] = None,
679
+ flush: Optional[bool] = None,
680
+ publish_step: bool = True,
681
+ ) -> None:
682
+ data = history_dict_to_json(run, data, step=user_step, ignore_copy_err=True)
683
+ data.pop("_step", None)
684
+
685
+ # add timestamp to the history request, if not already present
686
+ # the timestamp might come from the tensorboard log logic
687
+ if "_timestamp" not in data:
688
+ data["_timestamp"] = time.time()
689
+
690
+ partial_history = pb.PartialHistoryRequest()
691
+ for k, v in data.items():
692
+ item = partial_history.item.add()
693
+ item.key = k
694
+ item.value_json = json_dumps_safer_history(v)
695
+
696
+ if publish_step and step is not None:
697
+ partial_history.step.num = step
698
+ if flush is not None:
699
+ partial_history.action.flush = flush
700
+ self._publish_partial_history(partial_history)
701
+
702
+ @abstractmethod
703
+ def _publish_partial_history(self, history: pb.PartialHistoryRequest) -> None:
704
+ raise NotImplementedError
705
+
706
+ def publish_history(
707
+ self,
708
+ run: "Run",
709
+ data: dict,
710
+ step: Optional[int] = None,
711
+ publish_step: bool = True,
712
+ ) -> None:
713
+ data = history_dict_to_json(run, data, step=step)
714
+ history = pb.HistoryRecord()
715
+ if publish_step:
716
+ assert step is not None
717
+ history.step.num = step
718
+ data.pop("_step", None)
719
+ for k, v in data.items():
720
+ item = history.item.add()
721
+ item.key = k
722
+ item.value_json = json_dumps_safer_history(v)
723
+ self._publish_history(history)
724
+
725
+ @abstractmethod
726
+ def _publish_history(self, history: pb.HistoryRecord) -> None:
727
+ raise NotImplementedError
728
+
729
+ def publish_preempting(self) -> None:
730
+ preempt_rec = pb.RunPreemptingRecord()
731
+ self._publish_preempting(preempt_rec)
732
+
733
+ @abstractmethod
734
+ def _publish_preempting(self, preempt_rec: pb.RunPreemptingRecord) -> None:
735
+ raise NotImplementedError
736
+
737
+ def publish_output(self, name: str, data: str) -> None:
738
+ # from vendor.protobuf import google3.protobuf.timestamp
739
+ # ts = timestamp.Timestamp()
740
+ # ts.GetCurrentTime()
741
+ # now = datetime.now()
742
+ if name == "stdout":
743
+ otype = pb.OutputRecord.OutputType.STDOUT
744
+ elif name == "stderr":
745
+ otype = pb.OutputRecord.OutputType.STDERR
746
+ else:
747
+ # TODO(jhr): throw error?
748
+ termwarn("unknown type")
749
+ o = pb.OutputRecord(output_type=otype, line=data)
750
+ o.timestamp.GetCurrentTime()
751
+ self._publish_output(o)
752
+
753
+ @abstractmethod
754
+ def _publish_output(self, outdata: pb.OutputRecord) -> None:
755
+ raise NotImplementedError
756
+
757
+ def publish_output_raw(self, name: str, data: str) -> None:
758
+ # from vendor.protobuf import google3.protobuf.timestamp
759
+ # ts = timestamp.Timestamp()
760
+ # ts.GetCurrentTime()
761
+ # now = datetime.now()
762
+ if name == "stdout":
763
+ otype = pb.OutputRawRecord.OutputType.STDOUT
764
+ elif name == "stderr":
765
+ otype = pb.OutputRawRecord.OutputType.STDERR
766
+ else:
767
+ # TODO(jhr): throw error?
768
+ termwarn("unknown type")
769
+ o = pb.OutputRawRecord(output_type=otype, line=data)
770
+ o.timestamp.GetCurrentTime()
771
+ self._publish_output_raw(o)
772
+
773
+ @abstractmethod
774
+ def _publish_output_raw(self, outdata: pb.OutputRawRecord) -> None:
775
+ raise NotImplementedError
776
+
777
+ def publish_pause(self) -> None:
778
+ pause = pb.PauseRequest()
779
+ self._publish_pause(pause)
780
+
781
+ @abstractmethod
782
+ def _publish_pause(self, pause: pb.PauseRequest) -> None:
783
+ raise NotImplementedError
784
+
785
+ def publish_resume(self) -> None:
786
+ resume = pb.ResumeRequest()
787
+ self._publish_resume(resume)
788
+
789
+ @abstractmethod
790
+ def _publish_resume(self, resume: pb.ResumeRequest) -> None:
791
+ raise NotImplementedError
792
+
793
+ def publish_alert(
794
+ self, title: str, text: str, level: str, wait_duration: int
795
+ ) -> None:
796
+ proto_alert = pb.AlertRecord()
797
+ proto_alert.title = title
798
+ proto_alert.text = text
799
+ proto_alert.level = level
800
+ proto_alert.wait_duration = wait_duration
801
+ self._publish_alert(proto_alert)
802
+
803
+ @abstractmethod
804
+ def _publish_alert(self, alert: pb.AlertRecord) -> None:
805
+ raise NotImplementedError
806
+
807
+ def _make_exit(self, exit_code: Optional[int]) -> pb.RunExitRecord:
808
+ exit = pb.RunExitRecord()
809
+ if exit_code is not None:
810
+ exit.exit_code = exit_code
811
+ return exit
812
+
813
+ def publish_exit(self, exit_code: Optional[int]) -> None:
814
+ exit_data = self._make_exit(exit_code)
815
+ self._publish_exit(exit_data)
816
+
817
+ @abstractmethod
818
+ def _publish_exit(self, exit_data: pb.RunExitRecord) -> None:
819
+ raise NotImplementedError
820
+
821
+ def publish_keepalive(self) -> None:
822
+ keepalive = pb.KeepaliveRequest()
823
+ self._publish_keepalive(keepalive)
824
+
825
+ @abstractmethod
826
+ def _publish_keepalive(self, keepalive: pb.KeepaliveRequest) -> None:
827
+ raise NotImplementedError
828
+
829
+ def publish_job_input(
830
+ self,
831
+ include_paths: List[List[str]],
832
+ exclude_paths: List[List[str]],
833
+ input_schema: Optional[dict],
834
+ run_config: bool = False,
835
+ file_path: str = "",
836
+ ):
837
+ """Publishes a request to add inputs to the job.
838
+
839
+ If run_config is True, the wandb.config will be added as a job input.
840
+ If file_path is provided, the file at file_path will be added as a job
841
+ input.
842
+
843
+ The paths provided as arguments are sequences of dictionary keys that
844
+ specify a path within the wandb.config. If a path is included, the
845
+ corresponding field will be treated as a job input. If a path is
846
+ excluded, the corresponding field will not be treated as a job input.
847
+
848
+ Args:
849
+ include_paths: paths within config to include as job inputs.
850
+ exclude_paths: paths within config to exclude as job inputs.
851
+ input_schema: A JSON Schema describing which attributes will be
852
+ editable from the Launch drawer.
853
+ run_config: bool indicating whether wandb.config is the input source.
854
+ file_path: path to file to include as a job input.
855
+ """
856
+ if run_config and file_path:
857
+ raise ValueError(
858
+ "run_config and file_path are mutually exclusive arguments."
859
+ )
860
+ request = pb.JobInputRequest()
861
+ include_records = [pb.JobInputPath(path=path) for path in include_paths]
862
+ exclude_records = [pb.JobInputPath(path=path) for path in exclude_paths]
863
+ request.include_paths.extend(include_records)
864
+ request.exclude_paths.extend(exclude_records)
865
+ source = pb.JobInputSource(
866
+ run_config=pb.JobInputSource.RunConfigSource(),
867
+ )
868
+ if run_config:
869
+ source.run_config.CopyFrom(pb.JobInputSource.RunConfigSource())
870
+ else:
871
+ source.file.CopyFrom(
872
+ pb.JobInputSource.ConfigFileSource(path=file_path),
873
+ )
874
+ request.input_source.CopyFrom(source)
875
+ if input_schema:
876
+ request.input_schema = json_dumps_safer(input_schema)
877
+
878
+ return self._publish_job_input(request)
879
+
880
+ @abstractmethod
881
+ def _publish_job_input(
882
+ self, request: pb.JobInputRequest
883
+ ) -> MailboxHandle[pb.Result]:
884
+ raise NotImplementedError
885
+
886
+ def join(self) -> None:
887
+ # Drop indicates that the internal process has already been shutdown
888
+ if self._drop:
889
+ return
890
+
891
+ handle = self._deliver_shutdown()
892
+
893
+ try:
894
+ handle.wait_or(timeout=30)
895
+ except TimeoutError:
896
+ # This can happen if the server fails to respond due to a bug
897
+ # or due to being very busy.
898
+ logger.warning("timed out communicating shutdown")
899
+ except HandleAbandonedError:
900
+ # This can happen if the connection to the server is closed
901
+ # before a response is read.
902
+ logger.warning("handle abandoned while communicating shutdown")
903
+
904
+ @abstractmethod
905
+ def _deliver_shutdown(self) -> MailboxHandle[pb.Result]:
906
+ raise NotImplementedError
907
+
908
+ def deliver_run(self, run: "Run") -> MailboxHandle[pb.Result]:
909
+ run_record = self._make_run(run)
910
+ return self._deliver_run(run_record)
911
+
912
+ def deliver_finish_sync(
913
+ self,
914
+ ) -> MailboxHandle[pb.Result]:
915
+ sync = pb.SyncFinishRequest()
916
+ return self._deliver_finish_sync(sync)
917
+
918
+ @abstractmethod
919
+ def _deliver_finish_sync(
920
+ self, sync: pb.SyncFinishRequest
921
+ ) -> MailboxHandle[pb.Result]:
922
+ raise NotImplementedError
923
+
924
+ @abstractmethod
925
+ def _deliver_run(self, run: pb.RunRecord) -> MailboxHandle[pb.Result]:
926
+ raise NotImplementedError
927
+
928
+ def deliver_run_start(self, run: "Run") -> MailboxHandle[pb.Result]:
929
+ run_start = pb.RunStartRequest(run=self._make_run(run))
930
+ return self._deliver_run_start(run_start)
931
+
932
+ @abstractmethod
933
+ def _deliver_run_start(
934
+ self, run_start: pb.RunStartRequest
935
+ ) -> MailboxHandle[pb.Result]:
936
+ raise NotImplementedError
937
+
938
+ def deliver_attach(self, attach_id: str) -> MailboxHandle[pb.Result]:
939
+ attach = pb.AttachRequest(attach_id=attach_id)
940
+ return self._deliver_attach(attach)
941
+
942
+ @abstractmethod
943
+ def _deliver_attach(
944
+ self,
945
+ status: pb.AttachRequest,
946
+ ) -> MailboxHandle[pb.Result]:
947
+ raise NotImplementedError
948
+
949
+ def deliver_stop_status(self) -> MailboxHandle[pb.Result]:
950
+ status = pb.StopStatusRequest()
951
+ return self._deliver_stop_status(status)
952
+
953
+ @abstractmethod
954
+ def _deliver_stop_status(
955
+ self,
956
+ status: pb.StopStatusRequest,
957
+ ) -> MailboxHandle[pb.Result]:
958
+ raise NotImplementedError
959
+
960
+ def deliver_network_status(self) -> MailboxHandle[pb.Result]:
961
+ status = pb.NetworkStatusRequest()
962
+ return self._deliver_network_status(status)
963
+
964
+ @abstractmethod
965
+ def _deliver_network_status(
966
+ self,
967
+ status: pb.NetworkStatusRequest,
968
+ ) -> MailboxHandle[pb.Result]:
969
+ raise NotImplementedError
970
+
971
+ def deliver_internal_messages(self) -> MailboxHandle[pb.Result]:
972
+ internal_message = pb.InternalMessagesRequest()
973
+ return self._deliver_internal_messages(internal_message)
974
+
975
+ @abstractmethod
976
+ def _deliver_internal_messages(
977
+ self, internal_message: pb.InternalMessagesRequest
978
+ ) -> MailboxHandle[pb.Result]:
979
+ raise NotImplementedError
980
+
981
+ def deliver_get_summary(self) -> MailboxHandle[pb.Result]:
982
+ get_summary = pb.GetSummaryRequest()
983
+ return self._deliver_get_summary(get_summary)
984
+
985
+ @abstractmethod
986
+ def _deliver_get_summary(
987
+ self,
988
+ get_summary: pb.GetSummaryRequest,
989
+ ) -> MailboxHandle[pb.Result]:
990
+ raise NotImplementedError
991
+
992
+ def deliver_get_system_metrics(self) -> MailboxHandle[pb.Result]:
993
+ get_system_metrics = pb.GetSystemMetricsRequest()
994
+ return self._deliver_get_system_metrics(get_system_metrics)
995
+
996
+ @abstractmethod
997
+ def _deliver_get_system_metrics(
998
+ self, get_summary: pb.GetSystemMetricsRequest
999
+ ) -> MailboxHandle[pb.Result]:
1000
+ raise NotImplementedError
1001
+
1002
+ def deliver_exit(self, exit_code: Optional[int]) -> MailboxHandle[pb.Result]:
1003
+ exit_data = self._make_exit(exit_code)
1004
+ return self._deliver_exit(exit_data)
1005
+
1006
+ @abstractmethod
1007
+ def _deliver_exit(
1008
+ self,
1009
+ exit_data: pb.RunExitRecord,
1010
+ ) -> MailboxHandle[pb.Result]:
1011
+ raise NotImplementedError
1012
+
1013
+ @abstractmethod
1014
+ def deliver_operation_stats(self) -> MailboxHandle[pb.Result]:
1015
+ raise NotImplementedError
1016
+
1017
+ def deliver_poll_exit(self) -> MailboxHandle[pb.Result]:
1018
+ poll_exit = pb.PollExitRequest()
1019
+ return self._deliver_poll_exit(poll_exit)
1020
+
1021
+ @abstractmethod
1022
+ def _deliver_poll_exit(
1023
+ self,
1024
+ poll_exit: pb.PollExitRequest,
1025
+ ) -> MailboxHandle[pb.Result]:
1026
+ raise NotImplementedError
1027
+
1028
+ def deliver_finish_without_exit(self) -> MailboxHandle[pb.Result]:
1029
+ run_finish_without_exit = pb.RunFinishWithoutExitRequest()
1030
+ return self._deliver_finish_without_exit(run_finish_without_exit)
1031
+
1032
+ @abstractmethod
1033
+ def _deliver_finish_without_exit(
1034
+ self, run_finish_without_exit: pb.RunFinishWithoutExitRequest
1035
+ ) -> MailboxHandle[pb.Result]:
1036
+ raise NotImplementedError
1037
+
1038
+ def deliver_request_sampled_history(self) -> MailboxHandle[pb.Result]:
1039
+ sampled_history = pb.SampledHistoryRequest()
1040
+ return self._deliver_request_sampled_history(sampled_history)
1041
+
1042
+ @abstractmethod
1043
+ def _deliver_request_sampled_history(
1044
+ self, sampled_history: pb.SampledHistoryRequest
1045
+ ) -> MailboxHandle[pb.Result]:
1046
+ raise NotImplementedError
1047
+
1048
+ def deliver_request_run_status(self) -> MailboxHandle[pb.Result]:
1049
+ run_status = pb.RunStatusRequest()
1050
+ return self._deliver_request_run_status(run_status)
1051
+
1052
+ @abstractmethod
1053
+ def _deliver_request_run_status(
1054
+ self, run_status: pb.RunStatusRequest
1055
+ ) -> MailboxHandle[pb.Result]:
1056
+ raise NotImplementedError