wandb 0.18.2__py3-none-musllinux_1_2_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (827) hide show
  1. package_readme.md +89 -0
  2. wandb/__init__.py +245 -0
  3. wandb/__init__.pyi +1139 -0
  4. wandb/__main__.py +3 -0
  5. wandb/_globals.py +19 -0
  6. wandb/agents/__init__.py +0 -0
  7. wandb/agents/pyagent.py +363 -0
  8. wandb/analytics/__init__.py +3 -0
  9. wandb/analytics/sentry.py +266 -0
  10. wandb/apis/__init__.py +48 -0
  11. wandb/apis/attrs.py +40 -0
  12. wandb/apis/importers/__init__.py +1 -0
  13. wandb/apis/importers/internals/internal.py +385 -0
  14. wandb/apis/importers/internals/protocols.py +99 -0
  15. wandb/apis/importers/internals/util.py +78 -0
  16. wandb/apis/importers/mlflow.py +254 -0
  17. wandb/apis/importers/validation.py +108 -0
  18. wandb/apis/importers/wandb.py +1603 -0
  19. wandb/apis/internal.py +232 -0
  20. wandb/apis/normalize.py +89 -0
  21. wandb/apis/paginator.py +81 -0
  22. wandb/apis/public/__init__.py +34 -0
  23. wandb/apis/public/api.py +1305 -0
  24. wandb/apis/public/artifacts.py +1090 -0
  25. wandb/apis/public/const.py +4 -0
  26. wandb/apis/public/files.py +195 -0
  27. wandb/apis/public/history.py +149 -0
  28. wandb/apis/public/jobs.py +659 -0
  29. wandb/apis/public/projects.py +154 -0
  30. wandb/apis/public/query_generator.py +166 -0
  31. wandb/apis/public/reports.py +469 -0
  32. wandb/apis/public/runs.py +914 -0
  33. wandb/apis/public/sweeps.py +240 -0
  34. wandb/apis/public/teams.py +198 -0
  35. wandb/apis/public/users.py +136 -0
  36. wandb/apis/reports/__init__.py +1 -0
  37. wandb/apis/reports/v1/__init__.py +8 -0
  38. wandb/apis/reports/v2/__init__.py +8 -0
  39. wandb/apis/workspaces/__init__.py +8 -0
  40. wandb/beta/workflows.py +288 -0
  41. wandb/bin/nvidia_gpu_stats +0 -0
  42. wandb/bin/wandb-core +0 -0
  43. wandb/cli/__init__.py +0 -0
  44. wandb/cli/cli.py +3004 -0
  45. wandb/data_types.py +63 -0
  46. wandb/docker/__init__.py +342 -0
  47. wandb/docker/auth.py +436 -0
  48. wandb/docker/wandb-entrypoint.sh +33 -0
  49. wandb/docker/www_authenticate.py +94 -0
  50. wandb/env.py +514 -0
  51. wandb/errors/__init__.py +17 -0
  52. wandb/errors/errors.py +37 -0
  53. wandb/errors/term.py +103 -0
  54. wandb/errors/util.py +57 -0
  55. wandb/errors/warnings.py +2 -0
  56. wandb/filesync/__init__.py +0 -0
  57. wandb/filesync/dir_watcher.py +403 -0
  58. wandb/filesync/stats.py +100 -0
  59. wandb/filesync/step_checksum.py +142 -0
  60. wandb/filesync/step_prepare.py +179 -0
  61. wandb/filesync/step_upload.py +290 -0
  62. wandb/filesync/upload_job.py +142 -0
  63. wandb/integration/__init__.py +0 -0
  64. wandb/integration/catboost/__init__.py +5 -0
  65. wandb/integration/catboost/catboost.py +178 -0
  66. wandb/integration/cohere/__init__.py +3 -0
  67. wandb/integration/cohere/cohere.py +21 -0
  68. wandb/integration/cohere/resolver.py +347 -0
  69. wandb/integration/diffusers/__init__.py +3 -0
  70. wandb/integration/diffusers/autologger.py +76 -0
  71. wandb/integration/diffusers/pipeline_resolver.py +50 -0
  72. wandb/integration/diffusers/resolvers/__init__.py +9 -0
  73. wandb/integration/diffusers/resolvers/multimodal.py +882 -0
  74. wandb/integration/diffusers/resolvers/utils.py +102 -0
  75. wandb/integration/fastai/__init__.py +249 -0
  76. wandb/integration/gym/__init__.py +105 -0
  77. wandb/integration/huggingface/__init__.py +3 -0
  78. wandb/integration/huggingface/huggingface.py +18 -0
  79. wandb/integration/huggingface/resolver.py +213 -0
  80. wandb/integration/keras/__init__.py +11 -0
  81. wandb/integration/keras/callbacks/__init__.py +5 -0
  82. wandb/integration/keras/callbacks/metrics_logger.py +136 -0
  83. wandb/integration/keras/callbacks/model_checkpoint.py +195 -0
  84. wandb/integration/keras/callbacks/tables_builder.py +226 -0
  85. wandb/integration/keras/keras.py +1091 -0
  86. wandb/integration/kfp/__init__.py +6 -0
  87. wandb/integration/kfp/helpers.py +28 -0
  88. wandb/integration/kfp/kfp_patch.py +324 -0
  89. wandb/integration/kfp/wandb_logging.py +182 -0
  90. wandb/integration/langchain/__init__.py +3 -0
  91. wandb/integration/langchain/wandb_tracer.py +48 -0
  92. wandb/integration/lightgbm/__init__.py +239 -0
  93. wandb/integration/lightning/__init__.py +0 -0
  94. wandb/integration/lightning/fabric/__init__.py +3 -0
  95. wandb/integration/lightning/fabric/logger.py +762 -0
  96. wandb/integration/magic.py +556 -0
  97. wandb/integration/metaflow/__init__.py +3 -0
  98. wandb/integration/metaflow/metaflow.py +383 -0
  99. wandb/integration/openai/__init__.py +3 -0
  100. wandb/integration/openai/fine_tuning.py +480 -0
  101. wandb/integration/openai/openai.py +22 -0
  102. wandb/integration/openai/resolver.py +240 -0
  103. wandb/integration/prodigy/__init__.py +3 -0
  104. wandb/integration/prodigy/prodigy.py +299 -0
  105. wandb/integration/sacred/__init__.py +117 -0
  106. wandb/integration/sagemaker/__init__.py +12 -0
  107. wandb/integration/sagemaker/auth.py +28 -0
  108. wandb/integration/sagemaker/config.py +49 -0
  109. wandb/integration/sagemaker/files.py +3 -0
  110. wandb/integration/sagemaker/resources.py +34 -0
  111. wandb/integration/sb3/__init__.py +3 -0
  112. wandb/integration/sb3/sb3.py +153 -0
  113. wandb/integration/sklearn/__init__.py +37 -0
  114. wandb/integration/sklearn/calculate/__init__.py +32 -0
  115. wandb/integration/sklearn/calculate/calibration_curves.py +125 -0
  116. wandb/integration/sklearn/calculate/class_proportions.py +68 -0
  117. wandb/integration/sklearn/calculate/confusion_matrix.py +93 -0
  118. wandb/integration/sklearn/calculate/decision_boundaries.py +40 -0
  119. wandb/integration/sklearn/calculate/elbow_curve.py +55 -0
  120. wandb/integration/sklearn/calculate/feature_importances.py +67 -0
  121. wandb/integration/sklearn/calculate/learning_curve.py +64 -0
  122. wandb/integration/sklearn/calculate/outlier_candidates.py +69 -0
  123. wandb/integration/sklearn/calculate/residuals.py +86 -0
  124. wandb/integration/sklearn/calculate/silhouette.py +118 -0
  125. wandb/integration/sklearn/calculate/summary_metrics.py +62 -0
  126. wandb/integration/sklearn/plot/__init__.py +35 -0
  127. wandb/integration/sklearn/plot/classifier.py +329 -0
  128. wandb/integration/sklearn/plot/clusterer.py +146 -0
  129. wandb/integration/sklearn/plot/regressor.py +121 -0
  130. wandb/integration/sklearn/plot/shared.py +91 -0
  131. wandb/integration/sklearn/utils.py +183 -0
  132. wandb/integration/tensorboard/__init__.py +10 -0
  133. wandb/integration/tensorboard/log.py +355 -0
  134. wandb/integration/tensorboard/monkeypatch.py +185 -0
  135. wandb/integration/tensorflow/__init__.py +5 -0
  136. wandb/integration/tensorflow/estimator_hook.py +54 -0
  137. wandb/integration/torch/__init__.py +0 -0
  138. wandb/integration/torch/wandb_torch.py +554 -0
  139. wandb/integration/ultralytics/__init__.py +11 -0
  140. wandb/integration/ultralytics/bbox_utils.py +208 -0
  141. wandb/integration/ultralytics/callback.py +524 -0
  142. wandb/integration/ultralytics/classification_utils.py +83 -0
  143. wandb/integration/ultralytics/mask_utils.py +202 -0
  144. wandb/integration/ultralytics/pose_utils.py +103 -0
  145. wandb/integration/xgboost/__init__.py +11 -0
  146. wandb/integration/xgboost/xgboost.py +189 -0
  147. wandb/integration/yolov8/__init__.py +0 -0
  148. wandb/integration/yolov8/yolov8.py +284 -0
  149. wandb/jupyter.py +515 -0
  150. wandb/magic.py +3 -0
  151. wandb/mpmain/__init__.py +0 -0
  152. wandb/mpmain/__main__.py +1 -0
  153. wandb/old/__init__.py +0 -0
  154. wandb/old/core.py +53 -0
  155. wandb/old/settings.py +173 -0
  156. wandb/old/summary.py +440 -0
  157. wandb/plot/__init__.py +19 -0
  158. wandb/plot/bar.py +45 -0
  159. wandb/plot/confusion_matrix.py +100 -0
  160. wandb/plot/histogram.py +39 -0
  161. wandb/plot/line.py +43 -0
  162. wandb/plot/line_series.py +88 -0
  163. wandb/plot/pr_curve.py +136 -0
  164. wandb/plot/roc_curve.py +118 -0
  165. wandb/plot/scatter.py +32 -0
  166. wandb/plot/utils.py +183 -0
  167. wandb/plot/viz.py +123 -0
  168. wandb/proto/__init__.py +0 -0
  169. wandb/proto/v3/__init__.py +0 -0
  170. wandb/proto/v3/wandb_base_pb2.py +55 -0
  171. wandb/proto/v3/wandb_internal_pb2.py +1608 -0
  172. wandb/proto/v3/wandb_server_pb2.py +208 -0
  173. wandb/proto/v3/wandb_settings_pb2.py +112 -0
  174. wandb/proto/v3/wandb_telemetry_pb2.py +106 -0
  175. wandb/proto/v4/__init__.py +0 -0
  176. wandb/proto/v4/wandb_base_pb2.py +30 -0
  177. wandb/proto/v4/wandb_internal_pb2.py +360 -0
  178. wandb/proto/v4/wandb_server_pb2.py +63 -0
  179. wandb/proto/v4/wandb_settings_pb2.py +45 -0
  180. wandb/proto/v4/wandb_telemetry_pb2.py +41 -0
  181. wandb/proto/v5/wandb_base_pb2.py +31 -0
  182. wandb/proto/v5/wandb_internal_pb2.py +361 -0
  183. wandb/proto/v5/wandb_server_pb2.py +64 -0
  184. wandb/proto/v5/wandb_settings_pb2.py +46 -0
  185. wandb/proto/v5/wandb_telemetry_pb2.py +42 -0
  186. wandb/proto/wandb_base_pb2.py +10 -0
  187. wandb/proto/wandb_deprecated.py +53 -0
  188. wandb/proto/wandb_generate_deprecated.py +34 -0
  189. wandb/proto/wandb_generate_proto.py +49 -0
  190. wandb/proto/wandb_internal_pb2.py +16 -0
  191. wandb/proto/wandb_server_pb2.py +10 -0
  192. wandb/proto/wandb_settings_pb2.py +10 -0
  193. wandb/proto/wandb_telemetry_pb2.py +10 -0
  194. wandb/py.typed +0 -0
  195. wandb/sdk/__init__.py +37 -0
  196. wandb/sdk/artifacts/__init__.py +0 -0
  197. wandb/sdk/artifacts/_validators.py +90 -0
  198. wandb/sdk/artifacts/artifact.py +2389 -0
  199. wandb/sdk/artifacts/artifact_download_logger.py +43 -0
  200. wandb/sdk/artifacts/artifact_file_cache.py +253 -0
  201. wandb/sdk/artifacts/artifact_instance_cache.py +17 -0
  202. wandb/sdk/artifacts/artifact_manifest.py +74 -0
  203. wandb/sdk/artifacts/artifact_manifest_entry.py +249 -0
  204. wandb/sdk/artifacts/artifact_manifests/__init__.py +0 -0
  205. wandb/sdk/artifacts/artifact_manifests/artifact_manifest_v1.py +92 -0
  206. wandb/sdk/artifacts/artifact_saver.py +269 -0
  207. wandb/sdk/artifacts/artifact_state.py +11 -0
  208. wandb/sdk/artifacts/artifact_ttl.py +7 -0
  209. wandb/sdk/artifacts/exceptions.py +57 -0
  210. wandb/sdk/artifacts/staging.py +25 -0
  211. wandb/sdk/artifacts/storage_handler.py +62 -0
  212. wandb/sdk/artifacts/storage_handlers/__init__.py +0 -0
  213. wandb/sdk/artifacts/storage_handlers/azure_handler.py +208 -0
  214. wandb/sdk/artifacts/storage_handlers/gcs_handler.py +228 -0
  215. wandb/sdk/artifacts/storage_handlers/http_handler.py +114 -0
  216. wandb/sdk/artifacts/storage_handlers/local_file_handler.py +141 -0
  217. wandb/sdk/artifacts/storage_handlers/multi_handler.py +56 -0
  218. wandb/sdk/artifacts/storage_handlers/s3_handler.py +300 -0
  219. wandb/sdk/artifacts/storage_handlers/tracking_handler.py +72 -0
  220. wandb/sdk/artifacts/storage_handlers/wb_artifact_handler.py +135 -0
  221. wandb/sdk/artifacts/storage_handlers/wb_local_artifact_handler.py +74 -0
  222. wandb/sdk/artifacts/storage_layout.py +6 -0
  223. wandb/sdk/artifacts/storage_policies/__init__.py +4 -0
  224. wandb/sdk/artifacts/storage_policies/register.py +1 -0
  225. wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +378 -0
  226. wandb/sdk/artifacts/storage_policy.py +72 -0
  227. wandb/sdk/backend/__init__.py +0 -0
  228. wandb/sdk/backend/backend.py +222 -0
  229. wandb/sdk/data_types/__init__.py +0 -0
  230. wandb/sdk/data_types/_dtypes.py +914 -0
  231. wandb/sdk/data_types/_private.py +10 -0
  232. wandb/sdk/data_types/audio.py +165 -0
  233. wandb/sdk/data_types/base_types/__init__.py +0 -0
  234. wandb/sdk/data_types/base_types/json_metadata.py +55 -0
  235. wandb/sdk/data_types/base_types/media.py +315 -0
  236. wandb/sdk/data_types/base_types/wb_value.py +272 -0
  237. wandb/sdk/data_types/bokeh.py +70 -0
  238. wandb/sdk/data_types/graph.py +405 -0
  239. wandb/sdk/data_types/helper_types/__init__.py +0 -0
  240. wandb/sdk/data_types/helper_types/bounding_boxes_2d.py +295 -0
  241. wandb/sdk/data_types/helper_types/classes.py +159 -0
  242. wandb/sdk/data_types/helper_types/image_mask.py +235 -0
  243. wandb/sdk/data_types/histogram.py +96 -0
  244. wandb/sdk/data_types/html.py +115 -0
  245. wandb/sdk/data_types/image.py +845 -0
  246. wandb/sdk/data_types/molecule.py +241 -0
  247. wandb/sdk/data_types/object_3d.py +474 -0
  248. wandb/sdk/data_types/plotly.py +82 -0
  249. wandb/sdk/data_types/saved_model.py +446 -0
  250. wandb/sdk/data_types/table.py +1204 -0
  251. wandb/sdk/data_types/trace_tree.py +438 -0
  252. wandb/sdk/data_types/utils.py +229 -0
  253. wandb/sdk/data_types/video.py +247 -0
  254. wandb/sdk/integration_utils/__init__.py +0 -0
  255. wandb/sdk/integration_utils/auto_logging.py +239 -0
  256. wandb/sdk/integration_utils/data_logging.py +475 -0
  257. wandb/sdk/interface/__init__.py +0 -0
  258. wandb/sdk/interface/constants.py +4 -0
  259. wandb/sdk/interface/interface.py +972 -0
  260. wandb/sdk/interface/interface_queue.py +59 -0
  261. wandb/sdk/interface/interface_relay.py +53 -0
  262. wandb/sdk/interface/interface_shared.py +537 -0
  263. wandb/sdk/interface/interface_sock.py +61 -0
  264. wandb/sdk/interface/message_future.py +27 -0
  265. wandb/sdk/interface/message_future_poll.py +50 -0
  266. wandb/sdk/interface/router.py +118 -0
  267. wandb/sdk/interface/router_queue.py +44 -0
  268. wandb/sdk/interface/router_relay.py +39 -0
  269. wandb/sdk/interface/router_sock.py +36 -0
  270. wandb/sdk/interface/summary_record.py +67 -0
  271. wandb/sdk/internal/__init__.py +0 -0
  272. wandb/sdk/internal/context.py +89 -0
  273. wandb/sdk/internal/datastore.py +297 -0
  274. wandb/sdk/internal/file_pusher.py +181 -0
  275. wandb/sdk/internal/file_stream.py +695 -0
  276. wandb/sdk/internal/flow_control.py +263 -0
  277. wandb/sdk/internal/handler.py +901 -0
  278. wandb/sdk/internal/internal.py +417 -0
  279. wandb/sdk/internal/internal_api.py +4358 -0
  280. wandb/sdk/internal/internal_util.py +100 -0
  281. wandb/sdk/internal/job_builder.py +629 -0
  282. wandb/sdk/internal/profiler.py +78 -0
  283. wandb/sdk/internal/progress.py +83 -0
  284. wandb/sdk/internal/run.py +25 -0
  285. wandb/sdk/internal/sample.py +70 -0
  286. wandb/sdk/internal/sender.py +1686 -0
  287. wandb/sdk/internal/sender_config.py +197 -0
  288. wandb/sdk/internal/settings_static.py +90 -0
  289. wandb/sdk/internal/system/__init__.py +0 -0
  290. wandb/sdk/internal/system/assets/__init__.py +27 -0
  291. wandb/sdk/internal/system/assets/aggregators.py +37 -0
  292. wandb/sdk/internal/system/assets/asset_registry.py +20 -0
  293. wandb/sdk/internal/system/assets/cpu.py +163 -0
  294. wandb/sdk/internal/system/assets/disk.py +210 -0
  295. wandb/sdk/internal/system/assets/gpu.py +416 -0
  296. wandb/sdk/internal/system/assets/gpu_amd.py +239 -0
  297. wandb/sdk/internal/system/assets/gpu_apple.py +177 -0
  298. wandb/sdk/internal/system/assets/interfaces.py +207 -0
  299. wandb/sdk/internal/system/assets/ipu.py +177 -0
  300. wandb/sdk/internal/system/assets/memory.py +166 -0
  301. wandb/sdk/internal/system/assets/network.py +125 -0
  302. wandb/sdk/internal/system/assets/open_metrics.py +299 -0
  303. wandb/sdk/internal/system/assets/tpu.py +154 -0
  304. wandb/sdk/internal/system/assets/trainium.py +399 -0
  305. wandb/sdk/internal/system/env_probe_helpers.py +13 -0
  306. wandb/sdk/internal/system/system_info.py +249 -0
  307. wandb/sdk/internal/system/system_monitor.py +229 -0
  308. wandb/sdk/internal/tb_watcher.py +518 -0
  309. wandb/sdk/internal/thread_local_settings.py +18 -0
  310. wandb/sdk/internal/writer.py +206 -0
  311. wandb/sdk/launch/__init__.py +14 -0
  312. wandb/sdk/launch/_launch.py +330 -0
  313. wandb/sdk/launch/_launch_add.py +255 -0
  314. wandb/sdk/launch/_project_spec.py +566 -0
  315. wandb/sdk/launch/agent/__init__.py +5 -0
  316. wandb/sdk/launch/agent/agent.py +924 -0
  317. wandb/sdk/launch/agent/config.py +296 -0
  318. wandb/sdk/launch/agent/job_status_tracker.py +53 -0
  319. wandb/sdk/launch/agent/run_queue_item_file_saver.py +45 -0
  320. wandb/sdk/launch/builder/__init__.py +0 -0
  321. wandb/sdk/launch/builder/abstract.py +156 -0
  322. wandb/sdk/launch/builder/build.py +297 -0
  323. wandb/sdk/launch/builder/context_manager.py +235 -0
  324. wandb/sdk/launch/builder/docker_builder.py +177 -0
  325. wandb/sdk/launch/builder/kaniko_builder.py +595 -0
  326. wandb/sdk/launch/builder/noop.py +58 -0
  327. wandb/sdk/launch/builder/templates/_wandb_bootstrap.py +188 -0
  328. wandb/sdk/launch/builder/templates/dockerfile.py +92 -0
  329. wandb/sdk/launch/create_job.py +528 -0
  330. wandb/sdk/launch/environment/abstract.py +29 -0
  331. wandb/sdk/launch/environment/aws_environment.py +322 -0
  332. wandb/sdk/launch/environment/azure_environment.py +105 -0
  333. wandb/sdk/launch/environment/gcp_environment.py +335 -0
  334. wandb/sdk/launch/environment/local_environment.py +66 -0
  335. wandb/sdk/launch/errors.py +19 -0
  336. wandb/sdk/launch/git_reference.py +109 -0
  337. wandb/sdk/launch/inputs/files.py +148 -0
  338. wandb/sdk/launch/inputs/internal.py +315 -0
  339. wandb/sdk/launch/inputs/manage.py +113 -0
  340. wandb/sdk/launch/inputs/schema.py +39 -0
  341. wandb/sdk/launch/loader.py +249 -0
  342. wandb/sdk/launch/registry/abstract.py +48 -0
  343. wandb/sdk/launch/registry/anon.py +29 -0
  344. wandb/sdk/launch/registry/azure_container_registry.py +124 -0
  345. wandb/sdk/launch/registry/elastic_container_registry.py +192 -0
  346. wandb/sdk/launch/registry/google_artifact_registry.py +219 -0
  347. wandb/sdk/launch/registry/local_registry.py +67 -0
  348. wandb/sdk/launch/runner/__init__.py +0 -0
  349. wandb/sdk/launch/runner/abstract.py +195 -0
  350. wandb/sdk/launch/runner/kubernetes_monitor.py +474 -0
  351. wandb/sdk/launch/runner/kubernetes_runner.py +963 -0
  352. wandb/sdk/launch/runner/local_container.py +301 -0
  353. wandb/sdk/launch/runner/local_process.py +78 -0
  354. wandb/sdk/launch/runner/sagemaker_runner.py +426 -0
  355. wandb/sdk/launch/runner/vertex_runner.py +230 -0
  356. wandb/sdk/launch/sweeps/__init__.py +39 -0
  357. wandb/sdk/launch/sweeps/scheduler.py +742 -0
  358. wandb/sdk/launch/sweeps/scheduler_sweep.py +91 -0
  359. wandb/sdk/launch/sweeps/utils.py +316 -0
  360. wandb/sdk/launch/utils.py +746 -0
  361. wandb/sdk/launch/wandb_reference.py +138 -0
  362. wandb/sdk/lib/__init__.py +5 -0
  363. wandb/sdk/lib/_settings_toposort_generate.py +159 -0
  364. wandb/sdk/lib/_settings_toposort_generated.py +250 -0
  365. wandb/sdk/lib/_wburls_generate.py +25 -0
  366. wandb/sdk/lib/_wburls_generated.py +22 -0
  367. wandb/sdk/lib/apikey.py +273 -0
  368. wandb/sdk/lib/capped_dict.py +26 -0
  369. wandb/sdk/lib/config_util.py +101 -0
  370. wandb/sdk/lib/credentials.py +141 -0
  371. wandb/sdk/lib/deprecate.py +42 -0
  372. wandb/sdk/lib/disabled.py +29 -0
  373. wandb/sdk/lib/exit_hooks.py +54 -0
  374. wandb/sdk/lib/file_stream_utils.py +118 -0
  375. wandb/sdk/lib/filenames.py +64 -0
  376. wandb/sdk/lib/filesystem.py +372 -0
  377. wandb/sdk/lib/fsm.py +174 -0
  378. wandb/sdk/lib/gitlib.py +239 -0
  379. wandb/sdk/lib/gql_request.py +65 -0
  380. wandb/sdk/lib/handler_util.py +21 -0
  381. wandb/sdk/lib/hashutil.py +84 -0
  382. wandb/sdk/lib/import_hooks.py +275 -0
  383. wandb/sdk/lib/ipython.py +146 -0
  384. wandb/sdk/lib/json_util.py +80 -0
  385. wandb/sdk/lib/lazyloader.py +63 -0
  386. wandb/sdk/lib/mailbox.py +460 -0
  387. wandb/sdk/lib/module.py +69 -0
  388. wandb/sdk/lib/paths.py +106 -0
  389. wandb/sdk/lib/preinit.py +42 -0
  390. wandb/sdk/lib/printer.py +313 -0
  391. wandb/sdk/lib/proto_util.py +90 -0
  392. wandb/sdk/lib/redirect.py +845 -0
  393. wandb/sdk/lib/reporting.py +99 -0
  394. wandb/sdk/lib/retry.py +289 -0
  395. wandb/sdk/lib/run_moment.py +78 -0
  396. wandb/sdk/lib/runid.py +12 -0
  397. wandb/sdk/lib/server.py +52 -0
  398. wandb/sdk/lib/service_connection.py +216 -0
  399. wandb/sdk/lib/service_token.py +94 -0
  400. wandb/sdk/lib/sock_client.py +295 -0
  401. wandb/sdk/lib/sparkline.py +45 -0
  402. wandb/sdk/lib/telemetry.py +100 -0
  403. wandb/sdk/lib/timed_input.py +133 -0
  404. wandb/sdk/lib/timer.py +19 -0
  405. wandb/sdk/lib/tracelog.py +255 -0
  406. wandb/sdk/lib/wburls.py +46 -0
  407. wandb/sdk/service/__init__.py +0 -0
  408. wandb/sdk/service/_startup_debug.py +22 -0
  409. wandb/sdk/service/port_file.py +53 -0
  410. wandb/sdk/service/server.py +116 -0
  411. wandb/sdk/service/server_sock.py +276 -0
  412. wandb/sdk/service/service.py +242 -0
  413. wandb/sdk/service/streams.py +417 -0
  414. wandb/sdk/verify/__init__.py +0 -0
  415. wandb/sdk/verify/verify.py +501 -0
  416. wandb/sdk/wandb_alerts.py +12 -0
  417. wandb/sdk/wandb_config.py +322 -0
  418. wandb/sdk/wandb_helper.py +54 -0
  419. wandb/sdk/wandb_init.py +1266 -0
  420. wandb/sdk/wandb_login.py +349 -0
  421. wandb/sdk/wandb_metric.py +110 -0
  422. wandb/sdk/wandb_require.py +97 -0
  423. wandb/sdk/wandb_require_helpers.py +44 -0
  424. wandb/sdk/wandb_run.py +4236 -0
  425. wandb/sdk/wandb_settings.py +2001 -0
  426. wandb/sdk/wandb_setup.py +409 -0
  427. wandb/sdk/wandb_summary.py +150 -0
  428. wandb/sdk/wandb_sweep.py +119 -0
  429. wandb/sdk/wandb_sync.py +81 -0
  430. wandb/sdk/wandb_watch.py +144 -0
  431. wandb/sklearn.py +35 -0
  432. wandb/sync/__init__.py +3 -0
  433. wandb/sync/sync.py +443 -0
  434. wandb/trigger.py +29 -0
  435. wandb/util.py +1956 -0
  436. wandb/vendor/__init__.py +0 -0
  437. wandb/vendor/gql-0.2.0/setup.py +40 -0
  438. wandb/vendor/gql-0.2.0/tests/__init__.py +0 -0
  439. wandb/vendor/gql-0.2.0/tests/starwars/__init__.py +0 -0
  440. wandb/vendor/gql-0.2.0/tests/starwars/fixtures.py +96 -0
  441. wandb/vendor/gql-0.2.0/tests/starwars/schema.py +146 -0
  442. wandb/vendor/gql-0.2.0/tests/starwars/test_dsl.py +293 -0
  443. wandb/vendor/gql-0.2.0/tests/starwars/test_query.py +355 -0
  444. wandb/vendor/gql-0.2.0/tests/starwars/test_validation.py +171 -0
  445. wandb/vendor/gql-0.2.0/tests/test_client.py +31 -0
  446. wandb/vendor/gql-0.2.0/tests/test_transport.py +89 -0
  447. wandb/vendor/gql-0.2.0/wandb_gql/__init__.py +4 -0
  448. wandb/vendor/gql-0.2.0/wandb_gql/client.py +75 -0
  449. wandb/vendor/gql-0.2.0/wandb_gql/dsl.py +152 -0
  450. wandb/vendor/gql-0.2.0/wandb_gql/gql.py +10 -0
  451. wandb/vendor/gql-0.2.0/wandb_gql/transport/__init__.py +0 -0
  452. wandb/vendor/gql-0.2.0/wandb_gql/transport/http.py +6 -0
  453. wandb/vendor/gql-0.2.0/wandb_gql/transport/local_schema.py +15 -0
  454. wandb/vendor/gql-0.2.0/wandb_gql/transport/requests.py +46 -0
  455. wandb/vendor/gql-0.2.0/wandb_gql/utils.py +21 -0
  456. wandb/vendor/graphql-core-1.1/setup.py +86 -0
  457. wandb/vendor/graphql-core-1.1/wandb_graphql/__init__.py +287 -0
  458. wandb/vendor/graphql-core-1.1/wandb_graphql/error/__init__.py +6 -0
  459. wandb/vendor/graphql-core-1.1/wandb_graphql/error/base.py +42 -0
  460. wandb/vendor/graphql-core-1.1/wandb_graphql/error/format_error.py +11 -0
  461. wandb/vendor/graphql-core-1.1/wandb_graphql/error/located_error.py +29 -0
  462. wandb/vendor/graphql-core-1.1/wandb_graphql/error/syntax_error.py +36 -0
  463. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/__init__.py +26 -0
  464. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/base.py +311 -0
  465. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executor.py +398 -0
  466. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/__init__.py +0 -0
  467. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/asyncio.py +53 -0
  468. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/gevent.py +22 -0
  469. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/process.py +32 -0
  470. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/sync.py +7 -0
  471. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/thread.py +35 -0
  472. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/utils.py +6 -0
  473. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/__init__.py +0 -0
  474. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/executor.py +66 -0
  475. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/fragment.py +252 -0
  476. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/resolver.py +151 -0
  477. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/utils.py +7 -0
  478. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/middleware.py +57 -0
  479. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/values.py +145 -0
  480. wandb/vendor/graphql-core-1.1/wandb_graphql/graphql.py +60 -0
  481. wandb/vendor/graphql-core-1.1/wandb_graphql/language/__init__.py +0 -0
  482. wandb/vendor/graphql-core-1.1/wandb_graphql/language/ast.py +1349 -0
  483. wandb/vendor/graphql-core-1.1/wandb_graphql/language/base.py +19 -0
  484. wandb/vendor/graphql-core-1.1/wandb_graphql/language/lexer.py +435 -0
  485. wandb/vendor/graphql-core-1.1/wandb_graphql/language/location.py +30 -0
  486. wandb/vendor/graphql-core-1.1/wandb_graphql/language/parser.py +779 -0
  487. wandb/vendor/graphql-core-1.1/wandb_graphql/language/printer.py +193 -0
  488. wandb/vendor/graphql-core-1.1/wandb_graphql/language/source.py +18 -0
  489. wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor.py +222 -0
  490. wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor_meta.py +82 -0
  491. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/__init__.py +0 -0
  492. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/cached_property.py +17 -0
  493. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/contain_subset.py +28 -0
  494. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/default_ordered_dict.py +40 -0
  495. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/ordereddict.py +8 -0
  496. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/pair_set.py +43 -0
  497. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/version.py +78 -0
  498. wandb/vendor/graphql-core-1.1/wandb_graphql/type/__init__.py +67 -0
  499. wandb/vendor/graphql-core-1.1/wandb_graphql/type/definition.py +619 -0
  500. wandb/vendor/graphql-core-1.1/wandb_graphql/type/directives.py +132 -0
  501. wandb/vendor/graphql-core-1.1/wandb_graphql/type/introspection.py +440 -0
  502. wandb/vendor/graphql-core-1.1/wandb_graphql/type/scalars.py +131 -0
  503. wandb/vendor/graphql-core-1.1/wandb_graphql/type/schema.py +100 -0
  504. wandb/vendor/graphql-core-1.1/wandb_graphql/type/typemap.py +145 -0
  505. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/__init__.py +0 -0
  506. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/assert_valid_name.py +9 -0
  507. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_from_value.py +65 -0
  508. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_code.py +49 -0
  509. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_dict.py +24 -0
  510. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/base.py +75 -0
  511. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_ast_schema.py +291 -0
  512. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_client_schema.py +250 -0
  513. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/concat_ast.py +9 -0
  514. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/extend_schema.py +357 -0
  515. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_field_def.py +27 -0
  516. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_operation_ast.py +21 -0
  517. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/introspection_query.py +90 -0
  518. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_literal_value.py +67 -0
  519. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_value.py +66 -0
  520. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/quoted_or_list.py +21 -0
  521. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/schema_printer.py +168 -0
  522. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/suggestion_list.py +56 -0
  523. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_comparators.py +69 -0
  524. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_from_ast.py +21 -0
  525. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_info.py +149 -0
  526. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/value_from_ast.py +69 -0
  527. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/__init__.py +4 -0
  528. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/__init__.py +79 -0
  529. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/arguments_of_correct_type.py +24 -0
  530. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/base.py +8 -0
  531. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/default_values_of_correct_type.py +44 -0
  532. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fields_on_correct_type.py +113 -0
  533. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fragments_on_composite_types.py +33 -0
  534. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_argument_names.py +70 -0
  535. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_directives.py +97 -0
  536. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_fragment_names.py +19 -0
  537. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_type_names.py +43 -0
  538. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/lone_anonymous_operation.py +23 -0
  539. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_fragment_cycles.py +59 -0
  540. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_undefined_variables.py +36 -0
  541. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_fragments.py +38 -0
  542. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_variables.py +37 -0
  543. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/overlapping_fields_can_be_merged.py +529 -0
  544. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/possible_fragment_spreads.py +44 -0
  545. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/provided_non_null_arguments.py +46 -0
  546. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/scalar_leafs.py +33 -0
  547. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_argument_names.py +32 -0
  548. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_fragment_names.py +28 -0
  549. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_input_field_names.py +33 -0
  550. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_operation_names.py +31 -0
  551. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_variable_names.py +27 -0
  552. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_are_input_types.py +21 -0
  553. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_in_allowed_position.py +53 -0
  554. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/validation.py +158 -0
  555. wandb/vendor/promise-2.3.0/conftest.py +30 -0
  556. wandb/vendor/promise-2.3.0/setup.py +64 -0
  557. wandb/vendor/promise-2.3.0/tests/__init__.py +0 -0
  558. wandb/vendor/promise-2.3.0/tests/conftest.py +8 -0
  559. wandb/vendor/promise-2.3.0/tests/test_awaitable.py +32 -0
  560. wandb/vendor/promise-2.3.0/tests/test_awaitable_35.py +47 -0
  561. wandb/vendor/promise-2.3.0/tests/test_benchmark.py +116 -0
  562. wandb/vendor/promise-2.3.0/tests/test_complex_threads.py +23 -0
  563. wandb/vendor/promise-2.3.0/tests/test_dataloader.py +452 -0
  564. wandb/vendor/promise-2.3.0/tests/test_dataloader_awaitable_35.py +99 -0
  565. wandb/vendor/promise-2.3.0/tests/test_dataloader_extra.py +65 -0
  566. wandb/vendor/promise-2.3.0/tests/test_extra.py +670 -0
  567. wandb/vendor/promise-2.3.0/tests/test_issues.py +132 -0
  568. wandb/vendor/promise-2.3.0/tests/test_promise_list.py +70 -0
  569. wandb/vendor/promise-2.3.0/tests/test_spec.py +584 -0
  570. wandb/vendor/promise-2.3.0/tests/test_thread_safety.py +115 -0
  571. wandb/vendor/promise-2.3.0/tests/utils.py +3 -0
  572. wandb/vendor/promise-2.3.0/wandb_promise/__init__.py +38 -0
  573. wandb/vendor/promise-2.3.0/wandb_promise/async_.py +135 -0
  574. wandb/vendor/promise-2.3.0/wandb_promise/compat.py +32 -0
  575. wandb/vendor/promise-2.3.0/wandb_promise/dataloader.py +326 -0
  576. wandb/vendor/promise-2.3.0/wandb_promise/iterate_promise.py +12 -0
  577. wandb/vendor/promise-2.3.0/wandb_promise/promise.py +848 -0
  578. wandb/vendor/promise-2.3.0/wandb_promise/promise_list.py +151 -0
  579. wandb/vendor/promise-2.3.0/wandb_promise/pyutils/__init__.py +0 -0
  580. wandb/vendor/promise-2.3.0/wandb_promise/pyutils/version.py +83 -0
  581. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/__init__.py +0 -0
  582. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/asyncio.py +22 -0
  583. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/gevent.py +21 -0
  584. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/immediate.py +27 -0
  585. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/thread.py +18 -0
  586. wandb/vendor/promise-2.3.0/wandb_promise/utils.py +56 -0
  587. wandb/vendor/pygments/__init__.py +90 -0
  588. wandb/vendor/pygments/cmdline.py +568 -0
  589. wandb/vendor/pygments/console.py +74 -0
  590. wandb/vendor/pygments/filter.py +74 -0
  591. wandb/vendor/pygments/filters/__init__.py +350 -0
  592. wandb/vendor/pygments/formatter.py +95 -0
  593. wandb/vendor/pygments/formatters/__init__.py +153 -0
  594. wandb/vendor/pygments/formatters/_mapping.py +85 -0
  595. wandb/vendor/pygments/formatters/bbcode.py +109 -0
  596. wandb/vendor/pygments/formatters/html.py +851 -0
  597. wandb/vendor/pygments/formatters/img.py +600 -0
  598. wandb/vendor/pygments/formatters/irc.py +182 -0
  599. wandb/vendor/pygments/formatters/latex.py +482 -0
  600. wandb/vendor/pygments/formatters/other.py +160 -0
  601. wandb/vendor/pygments/formatters/rtf.py +147 -0
  602. wandb/vendor/pygments/formatters/svg.py +153 -0
  603. wandb/vendor/pygments/formatters/terminal.py +136 -0
  604. wandb/vendor/pygments/formatters/terminal256.py +309 -0
  605. wandb/vendor/pygments/lexer.py +871 -0
  606. wandb/vendor/pygments/lexers/__init__.py +329 -0
  607. wandb/vendor/pygments/lexers/_asy_builtins.py +1645 -0
  608. wandb/vendor/pygments/lexers/_cl_builtins.py +232 -0
  609. wandb/vendor/pygments/lexers/_cocoa_builtins.py +72 -0
  610. wandb/vendor/pygments/lexers/_csound_builtins.py +1346 -0
  611. wandb/vendor/pygments/lexers/_lasso_builtins.py +5327 -0
  612. wandb/vendor/pygments/lexers/_lua_builtins.py +295 -0
  613. wandb/vendor/pygments/lexers/_mapping.py +500 -0
  614. wandb/vendor/pygments/lexers/_mql_builtins.py +1172 -0
  615. wandb/vendor/pygments/lexers/_openedge_builtins.py +2547 -0
  616. wandb/vendor/pygments/lexers/_php_builtins.py +4756 -0
  617. wandb/vendor/pygments/lexers/_postgres_builtins.py +621 -0
  618. wandb/vendor/pygments/lexers/_scilab_builtins.py +3094 -0
  619. wandb/vendor/pygments/lexers/_sourcemod_builtins.py +1163 -0
  620. wandb/vendor/pygments/lexers/_stan_builtins.py +532 -0
  621. wandb/vendor/pygments/lexers/_stata_builtins.py +419 -0
  622. wandb/vendor/pygments/lexers/_tsql_builtins.py +1004 -0
  623. wandb/vendor/pygments/lexers/_vim_builtins.py +1939 -0
  624. wandb/vendor/pygments/lexers/actionscript.py +240 -0
  625. wandb/vendor/pygments/lexers/agile.py +24 -0
  626. wandb/vendor/pygments/lexers/algebra.py +221 -0
  627. wandb/vendor/pygments/lexers/ambient.py +76 -0
  628. wandb/vendor/pygments/lexers/ampl.py +87 -0
  629. wandb/vendor/pygments/lexers/apl.py +101 -0
  630. wandb/vendor/pygments/lexers/archetype.py +318 -0
  631. wandb/vendor/pygments/lexers/asm.py +641 -0
  632. wandb/vendor/pygments/lexers/automation.py +374 -0
  633. wandb/vendor/pygments/lexers/basic.py +500 -0
  634. wandb/vendor/pygments/lexers/bibtex.py +160 -0
  635. wandb/vendor/pygments/lexers/business.py +612 -0
  636. wandb/vendor/pygments/lexers/c_cpp.py +252 -0
  637. wandb/vendor/pygments/lexers/c_like.py +541 -0
  638. wandb/vendor/pygments/lexers/capnproto.py +78 -0
  639. wandb/vendor/pygments/lexers/chapel.py +102 -0
  640. wandb/vendor/pygments/lexers/clean.py +288 -0
  641. wandb/vendor/pygments/lexers/compiled.py +34 -0
  642. wandb/vendor/pygments/lexers/configs.py +833 -0
  643. wandb/vendor/pygments/lexers/console.py +114 -0
  644. wandb/vendor/pygments/lexers/crystal.py +393 -0
  645. wandb/vendor/pygments/lexers/csound.py +366 -0
  646. wandb/vendor/pygments/lexers/css.py +689 -0
  647. wandb/vendor/pygments/lexers/d.py +251 -0
  648. wandb/vendor/pygments/lexers/dalvik.py +125 -0
  649. wandb/vendor/pygments/lexers/data.py +555 -0
  650. wandb/vendor/pygments/lexers/diff.py +165 -0
  651. wandb/vendor/pygments/lexers/dotnet.py +691 -0
  652. wandb/vendor/pygments/lexers/dsls.py +878 -0
  653. wandb/vendor/pygments/lexers/dylan.py +289 -0
  654. wandb/vendor/pygments/lexers/ecl.py +125 -0
  655. wandb/vendor/pygments/lexers/eiffel.py +65 -0
  656. wandb/vendor/pygments/lexers/elm.py +121 -0
  657. wandb/vendor/pygments/lexers/erlang.py +533 -0
  658. wandb/vendor/pygments/lexers/esoteric.py +277 -0
  659. wandb/vendor/pygments/lexers/ezhil.py +69 -0
  660. wandb/vendor/pygments/lexers/factor.py +344 -0
  661. wandb/vendor/pygments/lexers/fantom.py +250 -0
  662. wandb/vendor/pygments/lexers/felix.py +273 -0
  663. wandb/vendor/pygments/lexers/forth.py +177 -0
  664. wandb/vendor/pygments/lexers/fortran.py +205 -0
  665. wandb/vendor/pygments/lexers/foxpro.py +428 -0
  666. wandb/vendor/pygments/lexers/functional.py +21 -0
  667. wandb/vendor/pygments/lexers/go.py +101 -0
  668. wandb/vendor/pygments/lexers/grammar_notation.py +213 -0
  669. wandb/vendor/pygments/lexers/graph.py +80 -0
  670. wandb/vendor/pygments/lexers/graphics.py +553 -0
  671. wandb/vendor/pygments/lexers/haskell.py +843 -0
  672. wandb/vendor/pygments/lexers/haxe.py +936 -0
  673. wandb/vendor/pygments/lexers/hdl.py +382 -0
  674. wandb/vendor/pygments/lexers/hexdump.py +103 -0
  675. wandb/vendor/pygments/lexers/html.py +602 -0
  676. wandb/vendor/pygments/lexers/idl.py +270 -0
  677. wandb/vendor/pygments/lexers/igor.py +288 -0
  678. wandb/vendor/pygments/lexers/inferno.py +96 -0
  679. wandb/vendor/pygments/lexers/installers.py +322 -0
  680. wandb/vendor/pygments/lexers/int_fiction.py +1343 -0
  681. wandb/vendor/pygments/lexers/iolang.py +63 -0
  682. wandb/vendor/pygments/lexers/j.py +146 -0
  683. wandb/vendor/pygments/lexers/javascript.py +1525 -0
  684. wandb/vendor/pygments/lexers/julia.py +333 -0
  685. wandb/vendor/pygments/lexers/jvm.py +1573 -0
  686. wandb/vendor/pygments/lexers/lisp.py +2621 -0
  687. wandb/vendor/pygments/lexers/make.py +202 -0
  688. wandb/vendor/pygments/lexers/markup.py +595 -0
  689. wandb/vendor/pygments/lexers/math.py +21 -0
  690. wandb/vendor/pygments/lexers/matlab.py +663 -0
  691. wandb/vendor/pygments/lexers/ml.py +769 -0
  692. wandb/vendor/pygments/lexers/modeling.py +358 -0
  693. wandb/vendor/pygments/lexers/modula2.py +1561 -0
  694. wandb/vendor/pygments/lexers/monte.py +204 -0
  695. wandb/vendor/pygments/lexers/ncl.py +894 -0
  696. wandb/vendor/pygments/lexers/nimrod.py +159 -0
  697. wandb/vendor/pygments/lexers/nit.py +64 -0
  698. wandb/vendor/pygments/lexers/nix.py +136 -0
  699. wandb/vendor/pygments/lexers/oberon.py +105 -0
  700. wandb/vendor/pygments/lexers/objective.py +504 -0
  701. wandb/vendor/pygments/lexers/ooc.py +85 -0
  702. wandb/vendor/pygments/lexers/other.py +41 -0
  703. wandb/vendor/pygments/lexers/parasail.py +79 -0
  704. wandb/vendor/pygments/lexers/parsers.py +835 -0
  705. wandb/vendor/pygments/lexers/pascal.py +644 -0
  706. wandb/vendor/pygments/lexers/pawn.py +199 -0
  707. wandb/vendor/pygments/lexers/perl.py +620 -0
  708. wandb/vendor/pygments/lexers/php.py +267 -0
  709. wandb/vendor/pygments/lexers/praat.py +294 -0
  710. wandb/vendor/pygments/lexers/prolog.py +306 -0
  711. wandb/vendor/pygments/lexers/python.py +939 -0
  712. wandb/vendor/pygments/lexers/qvt.py +152 -0
  713. wandb/vendor/pygments/lexers/r.py +453 -0
  714. wandb/vendor/pygments/lexers/rdf.py +270 -0
  715. wandb/vendor/pygments/lexers/rebol.py +431 -0
  716. wandb/vendor/pygments/lexers/resource.py +85 -0
  717. wandb/vendor/pygments/lexers/rnc.py +67 -0
  718. wandb/vendor/pygments/lexers/roboconf.py +82 -0
  719. wandb/vendor/pygments/lexers/robotframework.py +560 -0
  720. wandb/vendor/pygments/lexers/ruby.py +519 -0
  721. wandb/vendor/pygments/lexers/rust.py +220 -0
  722. wandb/vendor/pygments/lexers/sas.py +228 -0
  723. wandb/vendor/pygments/lexers/scripting.py +1222 -0
  724. wandb/vendor/pygments/lexers/shell.py +794 -0
  725. wandb/vendor/pygments/lexers/smalltalk.py +195 -0
  726. wandb/vendor/pygments/lexers/smv.py +79 -0
  727. wandb/vendor/pygments/lexers/snobol.py +83 -0
  728. wandb/vendor/pygments/lexers/special.py +103 -0
  729. wandb/vendor/pygments/lexers/sql.py +681 -0
  730. wandb/vendor/pygments/lexers/stata.py +108 -0
  731. wandb/vendor/pygments/lexers/supercollider.py +90 -0
  732. wandb/vendor/pygments/lexers/tcl.py +145 -0
  733. wandb/vendor/pygments/lexers/templates.py +2283 -0
  734. wandb/vendor/pygments/lexers/testing.py +207 -0
  735. wandb/vendor/pygments/lexers/text.py +25 -0
  736. wandb/vendor/pygments/lexers/textedit.py +169 -0
  737. wandb/vendor/pygments/lexers/textfmts.py +297 -0
  738. wandb/vendor/pygments/lexers/theorem.py +458 -0
  739. wandb/vendor/pygments/lexers/trafficscript.py +54 -0
  740. wandb/vendor/pygments/lexers/typoscript.py +226 -0
  741. wandb/vendor/pygments/lexers/urbi.py +133 -0
  742. wandb/vendor/pygments/lexers/varnish.py +190 -0
  743. wandb/vendor/pygments/lexers/verification.py +111 -0
  744. wandb/vendor/pygments/lexers/web.py +24 -0
  745. wandb/vendor/pygments/lexers/webmisc.py +988 -0
  746. wandb/vendor/pygments/lexers/whiley.py +116 -0
  747. wandb/vendor/pygments/lexers/x10.py +69 -0
  748. wandb/vendor/pygments/modeline.py +44 -0
  749. wandb/vendor/pygments/plugin.py +68 -0
  750. wandb/vendor/pygments/regexopt.py +92 -0
  751. wandb/vendor/pygments/scanner.py +105 -0
  752. wandb/vendor/pygments/sphinxext.py +158 -0
  753. wandb/vendor/pygments/style.py +155 -0
  754. wandb/vendor/pygments/styles/__init__.py +80 -0
  755. wandb/vendor/pygments/styles/abap.py +29 -0
  756. wandb/vendor/pygments/styles/algol.py +63 -0
  757. wandb/vendor/pygments/styles/algol_nu.py +63 -0
  758. wandb/vendor/pygments/styles/arduino.py +98 -0
  759. wandb/vendor/pygments/styles/autumn.py +65 -0
  760. wandb/vendor/pygments/styles/borland.py +51 -0
  761. wandb/vendor/pygments/styles/bw.py +49 -0
  762. wandb/vendor/pygments/styles/colorful.py +81 -0
  763. wandb/vendor/pygments/styles/default.py +73 -0
  764. wandb/vendor/pygments/styles/emacs.py +72 -0
  765. wandb/vendor/pygments/styles/friendly.py +72 -0
  766. wandb/vendor/pygments/styles/fruity.py +42 -0
  767. wandb/vendor/pygments/styles/igor.py +29 -0
  768. wandb/vendor/pygments/styles/lovelace.py +97 -0
  769. wandb/vendor/pygments/styles/manni.py +75 -0
  770. wandb/vendor/pygments/styles/monokai.py +106 -0
  771. wandb/vendor/pygments/styles/murphy.py +80 -0
  772. wandb/vendor/pygments/styles/native.py +65 -0
  773. wandb/vendor/pygments/styles/paraiso_dark.py +125 -0
  774. wandb/vendor/pygments/styles/paraiso_light.py +125 -0
  775. wandb/vendor/pygments/styles/pastie.py +75 -0
  776. wandb/vendor/pygments/styles/perldoc.py +69 -0
  777. wandb/vendor/pygments/styles/rainbow_dash.py +89 -0
  778. wandb/vendor/pygments/styles/rrt.py +33 -0
  779. wandb/vendor/pygments/styles/sas.py +44 -0
  780. wandb/vendor/pygments/styles/stata.py +40 -0
  781. wandb/vendor/pygments/styles/tango.py +141 -0
  782. wandb/vendor/pygments/styles/trac.py +63 -0
  783. wandb/vendor/pygments/styles/vim.py +63 -0
  784. wandb/vendor/pygments/styles/vs.py +38 -0
  785. wandb/vendor/pygments/styles/xcode.py +51 -0
  786. wandb/vendor/pygments/token.py +213 -0
  787. wandb/vendor/pygments/unistring.py +217 -0
  788. wandb/vendor/pygments/util.py +388 -0
  789. wandb/vendor/pynvml/__init__.py +0 -0
  790. wandb/vendor/pynvml/pynvml.py +4779 -0
  791. wandb/vendor/watchdog_0_9_0/wandb_watchdog/__init__.py +17 -0
  792. wandb/vendor/watchdog_0_9_0/wandb_watchdog/events.py +615 -0
  793. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/__init__.py +98 -0
  794. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/api.py +369 -0
  795. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents.py +172 -0
  796. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents2.py +239 -0
  797. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify.py +218 -0
  798. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_buffer.py +81 -0
  799. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_c.py +575 -0
  800. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/kqueue.py +730 -0
  801. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/polling.py +145 -0
  802. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/read_directory_changes.py +133 -0
  803. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/winapi.py +348 -0
  804. wandb/vendor/watchdog_0_9_0/wandb_watchdog/patterns.py +265 -0
  805. wandb/vendor/watchdog_0_9_0/wandb_watchdog/tricks/__init__.py +174 -0
  806. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/__init__.py +151 -0
  807. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/bricks.py +249 -0
  808. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/compat.py +29 -0
  809. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/decorators.py +198 -0
  810. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/delayed_queue.py +88 -0
  811. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/dirsnapshot.py +293 -0
  812. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/echo.py +157 -0
  813. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/event_backport.py +41 -0
  814. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/importlib2.py +40 -0
  815. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/platform.py +57 -0
  816. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/unicode_paths.py +64 -0
  817. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/win32stat.py +123 -0
  818. wandb/vendor/watchdog_0_9_0/wandb_watchdog/version.py +28 -0
  819. wandb/vendor/watchdog_0_9_0/wandb_watchdog/watchmedo.py +577 -0
  820. wandb/wandb_agent.py +588 -0
  821. wandb/wandb_controller.py +721 -0
  822. wandb/wandb_run.py +9 -0
  823. wandb-0.18.2.dist-info/METADATA +213 -0
  824. wandb-0.18.2.dist-info/RECORD +827 -0
  825. wandb-0.18.2.dist-info/WHEEL +5 -0
  826. wandb-0.18.2.dist-info/entry_points.txt +3 -0
  827. wandb-0.18.2.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,845 @@
1
+ import hashlib
2
+ import logging
3
+ import os
4
+ from io import BytesIO
5
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Sequence, Type, Union, cast
6
+ from urllib import parse
7
+
8
+ import wandb
9
+ from wandb import util
10
+ from wandb.sdk.lib import hashutil, runid
11
+ from wandb.sdk.lib.paths import LogicalPath
12
+
13
+ from . import _dtypes
14
+ from ._private import MEDIA_TMP
15
+ from .base_types.media import BatchableMedia, Media
16
+ from .helper_types.bounding_boxes_2d import BoundingBoxes2D
17
+ from .helper_types.classes import Classes
18
+ from .helper_types.image_mask import ImageMask
19
+
20
+ if TYPE_CHECKING: # pragma: no cover
21
+ import matplotlib # type: ignore
22
+ import numpy as np
23
+ import torch # type: ignore
24
+ from PIL.Image import Image as PILImage
25
+
26
+ from wandb.sdk.artifacts.artifact import Artifact
27
+
28
+ from ..wandb_run import Run as LocalRun
29
+
30
+ ImageDataType = Union[
31
+ "matplotlib.artist.Artist", "PILImage", "TorchTensorType", "np.ndarray"
32
+ ]
33
+ ImageDataOrPathType = Union[str, "Image", ImageDataType]
34
+ TorchTensorType = Union["torch.Tensor", "torch.Variable"]
35
+
36
+
37
+ def _server_accepts_image_filenames() -> bool:
38
+ if util._is_offline():
39
+ return True
40
+
41
+ # Newer versions of wandb accept large image filenames arrays
42
+ # but older versions would have issues with this.
43
+ max_cli_version = util._get_max_cli_version()
44
+ if max_cli_version is None:
45
+ return False
46
+ from wandb.util import parse_version
47
+
48
+ accepts_image_filenames: bool = parse_version("0.12.10") <= parse_version(
49
+ max_cli_version
50
+ )
51
+ return accepts_image_filenames
52
+
53
+
54
+ def _server_accepts_artifact_path() -> bool:
55
+ from wandb.util import parse_version
56
+
57
+ target_version = "0.12.14"
58
+ max_cli_version = util._get_max_cli_version() if not util._is_offline() else None
59
+ accepts_artifact_path: bool = max_cli_version is not None and parse_version(
60
+ target_version
61
+ ) <= parse_version(max_cli_version)
62
+ return accepts_artifact_path
63
+
64
+
65
+ class Image(BatchableMedia):
66
+ """Format images for logging to W&B.
67
+
68
+ Arguments:
69
+ data_or_path: (numpy array, string, io) Accepts numpy array of
70
+ image data, or a PIL image. The class attempts to infer
71
+ the data format and converts it.
72
+ mode: (string) The PIL mode for an image. Most common are "L", "RGB",
73
+ "RGBA". Full explanation at https://pillow.readthedocs.io/en/stable/handbook/concepts.html#modes
74
+ caption: (string) Label for display of image.
75
+
76
+ Note : When logging a `torch.Tensor` as a `wandb.Image`, images are normalized. If you do not want to normalize your images, please convert your tensors to a PIL Image.
77
+
78
+ Examples:
79
+ ### Create a wandb.Image from a numpy array
80
+ <!--yeadoc-test:log-image-numpy-->
81
+ ```python
82
+ import numpy as np
83
+ import wandb
84
+
85
+ with wandb.init() as run:
86
+ examples = []
87
+ for i in range(3):
88
+ pixels = np.random.randint(low=0, high=256, size=(100, 100, 3))
89
+ image = wandb.Image(pixels, caption=f"random field {i}")
90
+ examples.append(image)
91
+ run.log({"examples": examples})
92
+ ```
93
+
94
+ ### Create a wandb.Image from a PILImage
95
+ <!--yeadoc-test:log-image-pillow-->
96
+ ```python
97
+ import numpy as np
98
+ from PIL import Image as PILImage
99
+ import wandb
100
+
101
+ with wandb.init() as run:
102
+ examples = []
103
+ for i in range(3):
104
+ pixels = np.random.randint(low=0, high=256, size=(100, 100, 3), dtype=np.uint8)
105
+ pil_image = PILImage.fromarray(pixels, mode="RGB")
106
+ image = wandb.Image(pil_image, caption=f"random field {i}")
107
+ examples.append(image)
108
+ run.log({"examples": examples})
109
+ ```
110
+
111
+ ### log .jpg rather than .png (default)
112
+ <!--yeadoc-test:log-image-format-->
113
+ ```python
114
+ import numpy as np
115
+ import wandb
116
+
117
+ with wandb.init() as run:
118
+ examples = []
119
+ for i in range(3):
120
+ pixels = np.random.randint(low=0, high=256, size=(100, 100, 3))
121
+ image = wandb.Image(pixels, caption=f"random field {i}", file_type="jpg")
122
+ examples.append(image)
123
+ run.log({"examples": examples})
124
+ ```
125
+ """
126
+
127
+ MAX_ITEMS = 108
128
+
129
+ # PIL limit
130
+ MAX_DIMENSION = 65500
131
+
132
+ _log_type = "image-file"
133
+
134
+ format: Optional[str]
135
+ _grouping: Optional[int]
136
+ _caption: Optional[str]
137
+ _width: Optional[int]
138
+ _height: Optional[int]
139
+ _image: Optional["PILImage"]
140
+ _classes: Optional["Classes"]
141
+ _boxes: Optional[Dict[str, "BoundingBoxes2D"]]
142
+ _masks: Optional[Dict[str, "ImageMask"]]
143
+ _file_type: Optional[str]
144
+
145
+ def __init__(
146
+ self,
147
+ data_or_path: "ImageDataOrPathType",
148
+ mode: Optional[str] = None,
149
+ caption: Optional[str] = None,
150
+ grouping: Optional[int] = None,
151
+ classes: Optional[Union["Classes", Sequence[dict]]] = None,
152
+ boxes: Optional[Union[Dict[str, "BoundingBoxes2D"], Dict[str, dict]]] = None,
153
+ masks: Optional[Union[Dict[str, "ImageMask"], Dict[str, dict]]] = None,
154
+ file_type: Optional[str] = None,
155
+ ) -> None:
156
+ super().__init__()
157
+ # TODO: We should remove grouping, it's a terrible name and I don't
158
+ # think anyone uses it.
159
+
160
+ self._grouping = None
161
+ self._caption = None
162
+ self._width = None
163
+ self._height = None
164
+ self._image = None
165
+ self._classes = None
166
+ self._boxes = None
167
+ self._masks = None
168
+ self._file_type = None
169
+
170
+ # Allows the user to pass an Image object as the first parameter and have a perfect copy,
171
+ # only overriding additional metadata passed in. If this pattern is compelling, we can generalize.
172
+ if isinstance(data_or_path, Image):
173
+ self._initialize_from_wbimage(data_or_path)
174
+ elif isinstance(data_or_path, str):
175
+ if self.path_is_reference(data_or_path):
176
+ self._initialize_from_reference(data_or_path)
177
+ else:
178
+ self._initialize_from_path(data_or_path)
179
+ else:
180
+ self._initialize_from_data(data_or_path, mode, file_type)
181
+ self._set_initialization_meta(
182
+ grouping, caption, classes, boxes, masks, file_type
183
+ )
184
+
185
+ def _set_initialization_meta(
186
+ self,
187
+ grouping: Optional[int] = None,
188
+ caption: Optional[str] = None,
189
+ classes: Optional[Union["Classes", Sequence[dict]]] = None,
190
+ boxes: Optional[Union[Dict[str, "BoundingBoxes2D"], Dict[str, dict]]] = None,
191
+ masks: Optional[Union[Dict[str, "ImageMask"], Dict[str, dict]]] = None,
192
+ file_type: Optional[str] = None,
193
+ ) -> None:
194
+ if grouping is not None:
195
+ self._grouping = grouping
196
+
197
+ if caption is not None:
198
+ self._caption = caption
199
+
200
+ total_classes = {}
201
+
202
+ if boxes:
203
+ if not isinstance(boxes, dict):
204
+ raise ValueError('Images "boxes" argument must be a dictionary')
205
+ boxes_final: Dict[str, BoundingBoxes2D] = {}
206
+ for key in boxes:
207
+ box_item = boxes[key]
208
+ if isinstance(box_item, BoundingBoxes2D):
209
+ boxes_final[key] = box_item
210
+ elif isinstance(box_item, dict):
211
+ # TODO: Consider injecting top-level classes if user-provided is empty
212
+ boxes_final[key] = BoundingBoxes2D(box_item, key)
213
+ total_classes.update(boxes_final[key]._class_labels)
214
+ self._boxes = boxes_final
215
+
216
+ if masks:
217
+ if not isinstance(masks, dict):
218
+ raise ValueError('Images "masks" argument must be a dictionary')
219
+ masks_final: Dict[str, ImageMask] = {}
220
+ for key in masks:
221
+ mask_item = masks[key]
222
+ if isinstance(mask_item, ImageMask):
223
+ masks_final[key] = mask_item
224
+ elif isinstance(mask_item, dict):
225
+ # TODO: Consider injecting top-level classes if user-provided is empty
226
+ masks_final[key] = ImageMask(mask_item, key)
227
+ if hasattr(masks_final[key], "_val"):
228
+ total_classes.update(masks_final[key]._val["class_labels"])
229
+ self._masks = masks_final
230
+
231
+ if classes is not None:
232
+ if isinstance(classes, Classes):
233
+ total_classes.update(
234
+ {val["id"]: val["name"] for val in classes._class_set}
235
+ )
236
+ else:
237
+ total_classes.update({val["id"]: val["name"] for val in classes})
238
+
239
+ if len(total_classes.keys()) > 0:
240
+ self._classes = Classes(
241
+ [
242
+ {"id": key, "name": total_classes[key]}
243
+ for key in total_classes.keys()
244
+ ]
245
+ )
246
+ if self.image is not None:
247
+ self._width, self._height = self.image.size
248
+ self._free_ram()
249
+
250
+ def _initialize_from_wbimage(self, wbimage: "Image") -> None:
251
+ self._grouping = wbimage._grouping
252
+ self._caption = wbimage._caption
253
+ self._width = wbimage._width
254
+ self._height = wbimage._height
255
+ self._image = wbimage._image
256
+ self._classes = wbimage._classes
257
+ self._path = wbimage._path
258
+ self._is_tmp = wbimage._is_tmp
259
+ self._extension = wbimage._extension
260
+ self._sha256 = wbimage._sha256
261
+ self._size = wbimage._size
262
+ self.format = wbimage.format
263
+ self._file_type = wbimage._file_type
264
+ self._artifact_source = wbimage._artifact_source
265
+ self._artifact_target = wbimage._artifact_target
266
+
267
+ # We do not want to implicitly copy boxes or masks, just the image-related data.
268
+ # self._boxes = wbimage._boxes
269
+ # self._masks = wbimage._masks
270
+
271
+ def _initialize_from_path(self, path: str) -> None:
272
+ pil_image = util.get_module(
273
+ "PIL.Image",
274
+ required='wandb.Image needs the PIL package. To get it, run "pip install pillow".',
275
+ )
276
+ self._set_file(path, is_tmp=False)
277
+ self._image = pil_image.open(path)
278
+ assert self._image is not None
279
+ self._image.load()
280
+ ext = os.path.splitext(path)[1][1:]
281
+ self.format = ext
282
+
283
+ def _initialize_from_reference(self, path: str) -> None:
284
+ self._path = path
285
+ self._is_tmp = False
286
+ self._sha256 = hashlib.sha256(path.encode("utf-8")).hexdigest()
287
+ path = parse.urlparse(path).path
288
+ ext = path.split("/")[-1].split(".")[-1]
289
+ self.format = ext
290
+
291
+ def _initialize_from_data(
292
+ self,
293
+ data: "ImageDataType",
294
+ mode: Optional[str] = None,
295
+ file_type: Optional[str] = None,
296
+ ) -> None:
297
+ pil_image = util.get_module(
298
+ "PIL.Image",
299
+ required='wandb.Image needs the PIL package. To get it, run "pip install pillow".',
300
+ )
301
+ if util.is_matplotlib_typename(util.get_full_typename(data)):
302
+ buf = BytesIO()
303
+ util.ensure_matplotlib_figure(data).savefig(buf, format="png")
304
+ self._image = pil_image.open(buf, formats=["PNG"])
305
+ elif isinstance(data, pil_image.Image):
306
+ self._image = data
307
+ elif util.is_pytorch_tensor_typename(util.get_full_typename(data)):
308
+ vis_util = util.get_module(
309
+ "torchvision.utils", "torchvision is required to render images"
310
+ )
311
+ if hasattr(data, "requires_grad") and data.requires_grad:
312
+ data = data.detach() # type: ignore
313
+ if hasattr(data, "dtype") and str(data.dtype) == "torch.uint8":
314
+ data = data.to(float)
315
+ data = vis_util.make_grid(data, normalize=True)
316
+ self._image = pil_image.fromarray(
317
+ data.mul(255).clamp(0, 255).byte().permute(1, 2, 0).cpu().numpy()
318
+ )
319
+ else:
320
+ if hasattr(data, "numpy"): # TF data eager tensors
321
+ data = data.numpy()
322
+ if data.ndim > 2:
323
+ data = data.squeeze() # get rid of trivial dimensions as a convenience
324
+ self._image = pil_image.fromarray(
325
+ self.to_uint8(data), mode=mode or self.guess_mode(data)
326
+ )
327
+ accepted_formats = ["png", "jpg", "jpeg", "bmp"]
328
+ if file_type is None:
329
+ self.format = "png"
330
+ else:
331
+ self.format = file_type
332
+ assert (
333
+ self.format in accepted_formats
334
+ ), f"file_type must be one of {accepted_formats}"
335
+ tmp_path = os.path.join(MEDIA_TMP.name, runid.generate_id() + "." + self.format)
336
+ assert self._image is not None
337
+ self._image.save(tmp_path, transparency=None)
338
+ self._set_file(tmp_path, is_tmp=True)
339
+
340
+ @classmethod
341
+ def from_json(
342
+ cls: Type["Image"], json_obj: dict, source_artifact: "Artifact"
343
+ ) -> "Image":
344
+ classes: Optional[Classes] = None
345
+ if json_obj.get("classes") is not None:
346
+ value = source_artifact.get(json_obj["classes"]["path"])
347
+ assert isinstance(value, (type(None), Classes))
348
+ classes = value
349
+
350
+ masks = json_obj.get("masks")
351
+ _masks: Optional[Dict[str, ImageMask]] = None
352
+ if masks:
353
+ _masks = {}
354
+ for key in masks:
355
+ _masks[key] = ImageMask.from_json(masks[key], source_artifact)
356
+ _masks[key]._set_artifact_source(source_artifact)
357
+ _masks[key]._key = key
358
+
359
+ boxes = json_obj.get("boxes")
360
+ _boxes: Optional[Dict[str, BoundingBoxes2D]] = None
361
+ if boxes:
362
+ _boxes = {}
363
+ for key in boxes:
364
+ _boxes[key] = BoundingBoxes2D.from_json(boxes[key], source_artifact)
365
+ _boxes[key]._key = key
366
+
367
+ return cls(
368
+ source_artifact.get_entry(json_obj["path"]).download(),
369
+ caption=json_obj.get("caption"),
370
+ grouping=json_obj.get("grouping"),
371
+ classes=classes,
372
+ boxes=_boxes,
373
+ masks=_masks,
374
+ )
375
+
376
+ @classmethod
377
+ def get_media_subdir(cls: Type["Image"]) -> str:
378
+ return os.path.join("media", "images")
379
+
380
+ def bind_to_run(
381
+ self,
382
+ run: "LocalRun",
383
+ key: Union[int, str],
384
+ step: Union[int, str],
385
+ id_: Optional[Union[int, str]] = None,
386
+ ignore_copy_err: Optional[bool] = None,
387
+ ) -> None:
388
+ # For Images, we are going to avoid copying the image file to the run.
389
+ # We should make this common functionality for all media types, but that
390
+ # requires a broader UI refactor. This model can easily be moved to the
391
+ # higher level Media class, but that will require every UI surface area
392
+ # that depends on the `path` to be able to instead consume
393
+ # `artifact_path`. I (Tim) think the media panel makes up most of this
394
+ # space, but there are also custom charts, and maybe others. Let's
395
+ # commit to getting all that fixed up before moving this to the top
396
+ # level Media class.
397
+ if self.path_is_reference(self._path):
398
+ raise ValueError(
399
+ "Image media created by a reference to external storage cannot currently be added to a run"
400
+ )
401
+
402
+ if (
403
+ not _server_accepts_artifact_path()
404
+ or self._get_artifact_entry_ref_url() is None
405
+ ):
406
+ super().bind_to_run(run, key, step, id_, ignore_copy_err=ignore_copy_err)
407
+ if self._boxes is not None:
408
+ for i, k in enumerate(self._boxes):
409
+ id_ = f"{id_}{i}" if id_ is not None else None
410
+ self._boxes[k].bind_to_run(
411
+ run, key, step, id_, ignore_copy_err=ignore_copy_err
412
+ )
413
+
414
+ if self._masks is not None:
415
+ for i, k in enumerate(self._masks):
416
+ id_ = f"{id_}{i}" if id_ is not None else None
417
+ self._masks[k].bind_to_run(
418
+ run, key, step, id_, ignore_copy_err=ignore_copy_err
419
+ )
420
+
421
+ def to_json(self, run_or_artifact: Union["LocalRun", "Artifact"]) -> dict:
422
+ from wandb.sdk.wandb_run import Run
423
+
424
+ json_dict = super().to_json(run_or_artifact)
425
+ json_dict["_type"] = Image._log_type
426
+ json_dict["format"] = self.format
427
+
428
+ if self._width is not None:
429
+ json_dict["width"] = self._width
430
+ if self._height is not None:
431
+ json_dict["height"] = self._height
432
+ if self._grouping:
433
+ json_dict["grouping"] = self._grouping
434
+ if self._caption:
435
+ json_dict["caption"] = self._caption
436
+
437
+ if isinstance(run_or_artifact, wandb.Artifact):
438
+ artifact = run_or_artifact
439
+ if (
440
+ self._masks is not None or self._boxes is not None
441
+ ) and self._classes is None:
442
+ raise ValueError(
443
+ "classes must be passed to wandb.Image which have masks or bounding boxes when adding to artifacts"
444
+ )
445
+
446
+ if self._classes is not None:
447
+ class_id = hashutil._md5(
448
+ str(self._classes._class_set).encode("utf-8")
449
+ ).hexdigest()
450
+ class_name = os.path.join(
451
+ "media",
452
+ "classes",
453
+ class_id + "_cls",
454
+ )
455
+ classes_entry = artifact.add(self._classes, class_name)
456
+ json_dict["classes"] = {
457
+ "type": "classes-file",
458
+ "path": classes_entry.path,
459
+ "digest": classes_entry.digest,
460
+ }
461
+
462
+ elif not isinstance(run_or_artifact, Run):
463
+ raise ValueError("to_json accepts wandb_run.Run or wandb_artifact.Artifact")
464
+
465
+ if self._boxes:
466
+ json_dict["boxes"] = {
467
+ k: box.to_json(run_or_artifact) for (k, box) in self._boxes.items()
468
+ }
469
+ if self._masks:
470
+ json_dict["masks"] = {
471
+ k: mask.to_json(run_or_artifact) for (k, mask) in self._masks.items()
472
+ }
473
+ return json_dict
474
+
475
+ def guess_mode(self, data: "np.ndarray") -> str:
476
+ """Guess what type of image the np.array is representing."""
477
+ # TODO: do we want to support dimensions being at the beginning of the array?
478
+ if data.ndim == 2:
479
+ return "L"
480
+ elif data.shape[-1] == 3:
481
+ return "RGB"
482
+ elif data.shape[-1] == 4:
483
+ return "RGBA"
484
+ else:
485
+ raise ValueError(
486
+ "Un-supported shape for image conversion {}".format(list(data.shape))
487
+ )
488
+
489
+ @classmethod
490
+ def to_uint8(cls, data: "np.ndarray") -> "np.ndarray":
491
+ """Convert image data to uint8.
492
+
493
+ Convert floating point image on the range [0,1] and integer images on the range
494
+ [0,255] to uint8, clipping if necessary.
495
+ """
496
+ np = util.get_module(
497
+ "numpy",
498
+ required="wandb.Image requires numpy if not supplying PIL Images: pip install numpy",
499
+ )
500
+
501
+ # I think it's better to check the image range vs the data type, since many
502
+ # image libraries will return floats between 0 and 255
503
+
504
+ # some images have range -1...1 or 0-1
505
+ dmin = np.min(data)
506
+ if dmin < 0:
507
+ data = (data - np.min(data)) / np.ptp(data)
508
+ if np.max(data) <= 1.0:
509
+ data = (data * 255).astype(np.int32)
510
+
511
+ # assert issubclass(data.dtype.type, np.integer), 'Illegal image format.'
512
+ return data.clip(0, 255).astype(np.uint8)
513
+
514
+ @classmethod
515
+ def seq_to_json(
516
+ cls: Type["Image"],
517
+ seq: Sequence["BatchableMedia"],
518
+ run: "LocalRun",
519
+ key: str,
520
+ step: Union[int, str],
521
+ ) -> dict:
522
+ """Combine a list of images into a meta dictionary object describing the child images."""
523
+ if TYPE_CHECKING:
524
+ seq = cast(Sequence["Image"], seq)
525
+
526
+ jsons = [obj.to_json(run) for obj in seq]
527
+
528
+ media_dir = cls.get_media_subdir()
529
+
530
+ for obj in jsons:
531
+ expected = LogicalPath(media_dir)
532
+ if "path" in obj and not obj["path"].startswith(expected):
533
+ raise ValueError(
534
+ "Files in an array of Image's must be in the {} directory, not {}".format(
535
+ cls.get_media_subdir(), obj["path"]
536
+ )
537
+ )
538
+
539
+ num_images_to_log = len(seq)
540
+ width, height = seq[0].image.size # type: ignore
541
+ format = jsons[0]["format"]
542
+
543
+ def size_equals_image(image: "Image") -> bool:
544
+ img_width, img_height = image.image.size # type: ignore
545
+ return img_width == width and img_height == height
546
+
547
+ sizes_match = all(size_equals_image(img) for img in seq)
548
+ if not sizes_match:
549
+ logging.warning(
550
+ "Images sizes do not match. This will causes images to be display incorrectly in the UI."
551
+ )
552
+
553
+ meta = {
554
+ "_type": "images/separated",
555
+ "width": width,
556
+ "height": height,
557
+ "format": format,
558
+ "count": num_images_to_log,
559
+ }
560
+ if _server_accepts_image_filenames():
561
+ meta["filenames"] = [
562
+ obj.get("path", obj.get("artifact_path")) for obj in jsons
563
+ ]
564
+ else:
565
+ wandb.termwarn(
566
+ "Unable to log image array filenames. In some cases, this can prevent images from being "
567
+ "viewed in the UI. Please upgrade your wandb server",
568
+ repeat=False,
569
+ )
570
+
571
+ captions = Image.all_captions(seq)
572
+
573
+ if captions:
574
+ meta["captions"] = captions
575
+
576
+ all_masks = Image.all_masks(seq, run, key, step)
577
+
578
+ if all_masks:
579
+ meta["all_masks"] = all_masks
580
+
581
+ all_boxes = Image.all_boxes(seq, run, key, step)
582
+
583
+ if all_boxes:
584
+ meta["all_boxes"] = all_boxes
585
+
586
+ return meta
587
+
588
+ @classmethod
589
+ def all_masks(
590
+ cls: Type["Image"],
591
+ images: Sequence["Image"],
592
+ run: "LocalRun",
593
+ run_key: str,
594
+ step: Union[int, str],
595
+ ) -> Union[List[Optional[dict]], bool]:
596
+ all_mask_groups: List[Optional[dict]] = []
597
+ for image in images:
598
+ if image._masks:
599
+ mask_group = {}
600
+ for k in image._masks:
601
+ mask = image._masks[k]
602
+ mask_group[k] = mask.to_json(run)
603
+ all_mask_groups.append(mask_group)
604
+ else:
605
+ all_mask_groups.append(None)
606
+ if all_mask_groups and not all(x is None for x in all_mask_groups):
607
+ return all_mask_groups
608
+ else:
609
+ return False
610
+
611
+ @classmethod
612
+ def all_boxes(
613
+ cls: Type["Image"],
614
+ images: Sequence["Image"],
615
+ run: "LocalRun",
616
+ run_key: str,
617
+ step: Union[int, str],
618
+ ) -> Union[List[Optional[dict]], bool]:
619
+ all_box_groups: List[Optional[dict]] = []
620
+ for image in images:
621
+ if image._boxes:
622
+ box_group = {}
623
+ for k in image._boxes:
624
+ box = image._boxes[k]
625
+ box_group[k] = box.to_json(run)
626
+ all_box_groups.append(box_group)
627
+ else:
628
+ all_box_groups.append(None)
629
+ if all_box_groups and not all(x is None for x in all_box_groups):
630
+ return all_box_groups
631
+ else:
632
+ return False
633
+
634
+ @classmethod
635
+ def all_captions(
636
+ cls: Type["Image"], images: Sequence["Media"]
637
+ ) -> Union[bool, Sequence[Optional[str]]]:
638
+ return cls.captions(images)
639
+
640
+ def __ne__(self, other: object) -> bool:
641
+ return not self.__eq__(other)
642
+
643
+ def __eq__(self, other: object) -> bool:
644
+ if not isinstance(other, Image):
645
+ return False
646
+ else:
647
+ if self.path_is_reference(self._path) and self.path_is_reference(
648
+ other._path
649
+ ):
650
+ return self._path == other._path
651
+ self_image = self.image
652
+ other_image = other.image
653
+ if self_image is not None:
654
+ self_image = list(self_image.getdata()) # type: ignore
655
+ if other_image is not None:
656
+ other_image = list(other_image.getdata()) # type: ignore
657
+
658
+ return (
659
+ self._grouping == other._grouping
660
+ and self._caption == other._caption
661
+ and self._width == other._width
662
+ and self._height == other._height
663
+ and self_image == other_image
664
+ and self._classes == other._classes
665
+ )
666
+
667
+ def to_data_array(self) -> List[Any]:
668
+ res = []
669
+ if self.image is not None:
670
+ data = list(self.image.getdata())
671
+ for i in range(self.image.height):
672
+ res.append(data[i * self.image.width : (i + 1) * self.image.width])
673
+ self._free_ram()
674
+ return res
675
+
676
+ def _free_ram(self) -> None:
677
+ if self._path is not None:
678
+ self._image = None
679
+
680
+ @property
681
+ def image(self) -> Optional["PILImage"]:
682
+ if self._image is None:
683
+ if self._path is not None and not self.path_is_reference(self._path):
684
+ pil_image = util.get_module(
685
+ "PIL.Image",
686
+ required='wandb.Image needs the PIL package. To get it, run "pip install pillow".',
687
+ )
688
+ self._image = pil_image.open(self._path)
689
+ self._image.load()
690
+ return self._image
691
+
692
+
693
+ # Custom dtypes for typing system
694
+ class _ImageFileType(_dtypes.Type):
695
+ name = "image-file"
696
+ legacy_names = ["wandb.Image"]
697
+ types = [Image]
698
+
699
+ def __init__(
700
+ self,
701
+ box_layers=None,
702
+ box_score_keys=None,
703
+ mask_layers=None,
704
+ class_map=None,
705
+ **kwargs,
706
+ ):
707
+ box_layers = box_layers or {}
708
+ box_score_keys = box_score_keys or []
709
+ mask_layers = mask_layers or {}
710
+ class_map = class_map or {}
711
+
712
+ if isinstance(box_layers, _dtypes.ConstType):
713
+ box_layers = box_layers._params["val"]
714
+ if not isinstance(box_layers, dict):
715
+ raise TypeError("box_layers must be a dict")
716
+ else:
717
+ box_layers = _dtypes.ConstType(
718
+ {layer_key: set(box_layers[layer_key]) for layer_key in box_layers}
719
+ )
720
+
721
+ if isinstance(mask_layers, _dtypes.ConstType):
722
+ mask_layers = mask_layers._params["val"]
723
+ if not isinstance(mask_layers, dict):
724
+ raise TypeError("mask_layers must be a dict")
725
+ else:
726
+ mask_layers = _dtypes.ConstType(
727
+ {layer_key: set(mask_layers[layer_key]) for layer_key in mask_layers}
728
+ )
729
+
730
+ if isinstance(box_score_keys, _dtypes.ConstType):
731
+ box_score_keys = box_score_keys._params["val"]
732
+ if not isinstance(box_score_keys, list) and not isinstance(box_score_keys, set):
733
+ raise TypeError("box_score_keys must be a list or a set")
734
+ else:
735
+ box_score_keys = _dtypes.ConstType(set(box_score_keys))
736
+
737
+ if isinstance(class_map, _dtypes.ConstType):
738
+ class_map = class_map._params["val"]
739
+ if not isinstance(class_map, dict):
740
+ raise TypeError("class_map must be a dict")
741
+ else:
742
+ class_map = _dtypes.ConstType(class_map)
743
+
744
+ self.params.update(
745
+ {
746
+ "box_layers": box_layers,
747
+ "box_score_keys": box_score_keys,
748
+ "mask_layers": mask_layers,
749
+ "class_map": class_map,
750
+ }
751
+ )
752
+
753
+ def assign_type(self, wb_type=None):
754
+ if isinstance(wb_type, _ImageFileType):
755
+ box_layers_self = self.params["box_layers"].params["val"] or {}
756
+ box_score_keys_self = self.params["box_score_keys"].params["val"] or []
757
+ mask_layers_self = self.params["mask_layers"].params["val"] or {}
758
+ class_map_self = self.params["class_map"].params["val"] or {}
759
+
760
+ box_layers_other = wb_type.params["box_layers"].params["val"] or {}
761
+ box_score_keys_other = wb_type.params["box_score_keys"].params["val"] or []
762
+ mask_layers_other = wb_type.params["mask_layers"].params["val"] or {}
763
+ class_map_other = wb_type.params["class_map"].params["val"] or {}
764
+
765
+ # Merge the class_ids from each set of box_layers
766
+ box_layers = {
767
+ str(key): set(
768
+ list(box_layers_self.get(key, []))
769
+ + list(box_layers_other.get(key, []))
770
+ )
771
+ for key in set(
772
+ list(box_layers_self.keys()) + list(box_layers_other.keys())
773
+ )
774
+ }
775
+
776
+ # Merge the class_ids from each set of mask_layers
777
+ mask_layers = {
778
+ str(key): set(
779
+ list(mask_layers_self.get(key, []))
780
+ + list(mask_layers_other.get(key, []))
781
+ )
782
+ for key in set(
783
+ list(mask_layers_self.keys()) + list(mask_layers_other.keys())
784
+ )
785
+ }
786
+
787
+ # Merge the box score keys
788
+ box_score_keys = set(list(box_score_keys_self) + list(box_score_keys_other))
789
+
790
+ # Merge the class_map
791
+ class_map = {
792
+ str(key): class_map_self.get(key, class_map_other.get(key, None))
793
+ for key in set(
794
+ list(class_map_self.keys()) + list(class_map_other.keys())
795
+ )
796
+ }
797
+
798
+ return _ImageFileType(box_layers, box_score_keys, mask_layers, class_map)
799
+
800
+ return _dtypes.InvalidType()
801
+
802
+ @classmethod
803
+ def from_obj(cls, py_obj):
804
+ if not isinstance(py_obj, Image):
805
+ raise TypeError("py_obj must be a wandb.Image")
806
+ else:
807
+ if hasattr(py_obj, "_boxes") and py_obj._boxes:
808
+ box_layers = {
809
+ str(key): set(py_obj._boxes[key]._class_labels.keys())
810
+ for key in py_obj._boxes.keys()
811
+ }
812
+ box_score_keys = {
813
+ key
814
+ for val in py_obj._boxes.values()
815
+ for box in val._val
816
+ for key in box.get("scores", {}).keys()
817
+ }
818
+
819
+ else:
820
+ box_layers = {}
821
+ box_score_keys = set()
822
+
823
+ if hasattr(py_obj, "_masks") and py_obj._masks:
824
+ mask_layers = {
825
+ str(key): set(
826
+ py_obj._masks[key]._val["class_labels"].keys()
827
+ if hasattr(py_obj._masks[key], "_val")
828
+ else []
829
+ )
830
+ for key in py_obj._masks.keys()
831
+ }
832
+ else:
833
+ mask_layers = {}
834
+
835
+ if hasattr(py_obj, "_classes") and py_obj._classes:
836
+ class_set = {
837
+ str(item["id"]): item["name"] for item in py_obj._classes._class_set
838
+ }
839
+ else:
840
+ class_set = {}
841
+
842
+ return cls(box_layers, box_score_keys, mask_layers, class_set)
843
+
844
+
845
+ _dtypes.TypeRegistry.add(_ImageFileType)