lmcache-cli 0.4.5.dev0__py3-none-any.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 (399) hide show
  1. lmcache/__init__.py +84 -0
  2. lmcache/_version.py +24 -0
  3. lmcache/cli/__init__.py +1 -0
  4. lmcache/cli/commands/__init__.py +34 -0
  5. lmcache/cli/commands/base.py +157 -0
  6. lmcache/cli/commands/bench/__init__.py +557 -0
  7. lmcache/cli/commands/bench/engine_bench/__init__.py +1 -0
  8. lmcache/cli/commands/bench/engine_bench/config.py +245 -0
  9. lmcache/cli/commands/bench/engine_bench/interactive/__init__.py +274 -0
  10. lmcache/cli/commands/bench/engine_bench/interactive/config.json +10 -0
  11. lmcache/cli/commands/bench/engine_bench/interactive/schema.py +352 -0
  12. lmcache/cli/commands/bench/engine_bench/interactive/state.py +327 -0
  13. lmcache/cli/commands/bench/engine_bench/interactive/terminal.py +291 -0
  14. lmcache/cli/commands/bench/engine_bench/progress.py +145 -0
  15. lmcache/cli/commands/bench/engine_bench/request_sender.py +232 -0
  16. lmcache/cli/commands/bench/engine_bench/stats.py +275 -0
  17. lmcache/cli/commands/bench/engine_bench/workloads/__init__.py +153 -0
  18. lmcache/cli/commands/bench/engine_bench/workloads/base.py +122 -0
  19. lmcache/cli/commands/bench/engine_bench/workloads/long_doc_permutator.py +435 -0
  20. lmcache/cli/commands/bench/engine_bench/workloads/long_doc_qa.py +281 -0
  21. lmcache/cli/commands/bench/engine_bench/workloads/multi_round_chat.py +337 -0
  22. lmcache/cli/commands/bench/engine_bench/workloads/random_prefill.py +178 -0
  23. lmcache/cli/commands/describe.py +310 -0
  24. lmcache/cli/commands/kvcache.py +133 -0
  25. lmcache/cli/commands/mock.py +75 -0
  26. lmcache/cli/commands/ping.py +113 -0
  27. lmcache/cli/commands/query/__init__.py +155 -0
  28. lmcache/cli/commands/query/prompt.py +134 -0
  29. lmcache/cli/commands/query/request.py +357 -0
  30. lmcache/cli/commands/server.py +99 -0
  31. lmcache/cli/commands/tool/__init__.py +63 -0
  32. lmcache/cli/commands/tool/cache_simulator.py +113 -0
  33. lmcache/cli/commands/trace/__init__.py +505 -0
  34. lmcache/cli/commands/trace/dispatch.py +249 -0
  35. lmcache/cli/commands/trace/driver.py +372 -0
  36. lmcache/cli/commands/trace/stats.py +289 -0
  37. lmcache/cli/documents/lmcache.txt +11 -0
  38. lmcache/cli/main.py +42 -0
  39. lmcache/cli/metrics/__init__.py +29 -0
  40. lmcache/cli/metrics/formatter.py +171 -0
  41. lmcache/cli/metrics/handler.py +94 -0
  42. lmcache/cli/metrics/metrics.py +161 -0
  43. lmcache/cli/metrics/section.py +77 -0
  44. lmcache/connections.py +173 -0
  45. lmcache/integration/__init__.py +2 -0
  46. lmcache/integration/base_service_factory.py +165 -0
  47. lmcache/integration/request_telemetry/__init__.py +1 -0
  48. lmcache/integration/request_telemetry/base.py +51 -0
  49. lmcache/integration/request_telemetry/factory.py +113 -0
  50. lmcache/integration/request_telemetry/fastapi.py +109 -0
  51. lmcache/integration/request_telemetry/noop.py +35 -0
  52. lmcache/integration/sglang/__init__.py +2 -0
  53. lmcache/integration/sglang/sglang_adapter.py +326 -0
  54. lmcache/integration/sglang/utils.py +39 -0
  55. lmcache/integration/vllm/__init__.py +1 -0
  56. lmcache/integration/vllm/lmcache_connector_v1.py +213 -0
  57. lmcache/integration/vllm/lmcache_connector_v1_085.py +150 -0
  58. lmcache/integration/vllm/lmcache_mp_connector_0180.py +1072 -0
  59. lmcache/integration/vllm/tests/test_mm_hash_utils.py +112 -0
  60. lmcache/integration/vllm/utils.py +433 -0
  61. lmcache/integration/vllm/vllm_multi_process_adapter.py +1090 -0
  62. lmcache/integration/vllm/vllm_service_factory.py +339 -0
  63. lmcache/integration/vllm/vllm_v1_adapter.py +1713 -0
  64. lmcache/logging.py +107 -0
  65. lmcache/native_storage_ops.pyi +230 -0
  66. lmcache/non_cuda_equivalents.py +1424 -0
  67. lmcache/observability.py +1958 -0
  68. lmcache/storage_backend/serde/__init__.py +1 -0
  69. lmcache/storage_backend/serde/cachegen_basics.py +210 -0
  70. lmcache/storage_backend/serde/cachegen_decoder.py +207 -0
  71. lmcache/storage_backend/serde/cachegen_encoder.py +394 -0
  72. lmcache/storage_backend/serde/serde.py +75 -0
  73. lmcache/tools/__init__.py +1 -0
  74. lmcache/tools/cache_simulator/README.md +392 -0
  75. lmcache/tools/cache_simulator/__init__.py +1 -0
  76. lmcache/tools/cache_simulator/docs/simulate_example.png +0 -0
  77. lmcache/tools/cache_simulator/docs/sweep_example.png +0 -0
  78. lmcache/tools/cache_simulator/gen_bench_dataset.py +360 -0
  79. lmcache/tools/cache_simulator/lru_cache.py +124 -0
  80. lmcache/tools/cache_simulator/plot_hit_rate.py +231 -0
  81. lmcache/tools/cache_simulator/simulator.py +795 -0
  82. lmcache/tools/controller_benchmark/README.md +161 -0
  83. lmcache/tools/controller_benchmark/__init__.py +1 -0
  84. lmcache/tools/controller_benchmark/__main__.py +331 -0
  85. lmcache/tools/controller_benchmark/benchmark.py +660 -0
  86. lmcache/tools/controller_benchmark/config.py +44 -0
  87. lmcache/tools/controller_benchmark/constants.py +10 -0
  88. lmcache/tools/controller_benchmark/handlers/__init__.py +46 -0
  89. lmcache/tools/controller_benchmark/handlers/admit.py +52 -0
  90. lmcache/tools/controller_benchmark/handlers/base.py +47 -0
  91. lmcache/tools/controller_benchmark/handlers/deregister.py +49 -0
  92. lmcache/tools/controller_benchmark/handlers/evict.py +52 -0
  93. lmcache/tools/controller_benchmark/handlers/heartbeat.py +56 -0
  94. lmcache/tools/controller_benchmark/handlers/p2p_lookup.py +47 -0
  95. lmcache/tools/controller_benchmark/handlers/register.py +56 -0
  96. lmcache/tools/mp_status_viewer/__init__.py +1 -0
  97. lmcache/tools/mp_status_viewer/__main__.py +95 -0
  98. lmcache/usage_context.py +417 -0
  99. lmcache/utils.py +665 -0
  100. lmcache/v1/__init__.py +2 -0
  101. lmcache/v1/api_server/__init__.py +2 -0
  102. lmcache/v1/api_server/__main__.py +537 -0
  103. lmcache/v1/basic_check.py +112 -0
  104. lmcache/v1/cache_controller/__init__.py +9 -0
  105. lmcache/v1/cache_controller/commands/__init__.py +15 -0
  106. lmcache/v1/cache_controller/commands/base.py +35 -0
  107. lmcache/v1/cache_controller/commands/full_sync.py +49 -0
  108. lmcache/v1/cache_controller/config.py +176 -0
  109. lmcache/v1/cache_controller/controller_manager.py +535 -0
  110. lmcache/v1/cache_controller/controllers/__init__.py +11 -0
  111. lmcache/v1/cache_controller/controllers/full_sync_tracker.py +473 -0
  112. lmcache/v1/cache_controller/controllers/kv_controller.py +439 -0
  113. lmcache/v1/cache_controller/controllers/registration_controller.py +282 -0
  114. lmcache/v1/cache_controller/executor.py +463 -0
  115. lmcache/v1/cache_controller/frontend/static/css/style.css +201 -0
  116. lmcache/v1/cache_controller/frontend/static/img/logo.png +0 -0
  117. lmcache/v1/cache_controller/frontend/static/index.html +234 -0
  118. lmcache/v1/cache_controller/frontend/static/js/controller_app.js +660 -0
  119. lmcache/v1/cache_controller/full_sync_sender.py +475 -0
  120. lmcache/v1/cache_controller/locks.py +149 -0
  121. lmcache/v1/cache_controller/message.py +828 -0
  122. lmcache/v1/cache_controller/observability.py +208 -0
  123. lmcache/v1/cache_controller/utils.py +679 -0
  124. lmcache/v1/cache_controller/worker.py +665 -0
  125. lmcache/v1/cache_engine.py +2058 -0
  126. lmcache/v1/cache_interface.py +19 -0
  127. lmcache/v1/check/__init__.py +74 -0
  128. lmcache/v1/check/check_mode_gen.py +86 -0
  129. lmcache/v1/check/check_mode_test_l2_adapter.py +284 -0
  130. lmcache/v1/check/check_mode_test_remote.py +155 -0
  131. lmcache/v1/check/check_mode_test_storage_manager.py +142 -0
  132. lmcache/v1/check/utils.py +571 -0
  133. lmcache/v1/compute/__init__.py +2 -0
  134. lmcache/v1/compute/attention/__init__.py +0 -0
  135. lmcache/v1/compute/attention/abstract.py +39 -0
  136. lmcache/v1/compute/attention/flash_attn.py +129 -0
  137. lmcache/v1/compute/attention/flash_infer_sparse.py +284 -0
  138. lmcache/v1/compute/attention/metadata.py +85 -0
  139. lmcache/v1/compute/attention/utils.py +14 -0
  140. lmcache/v1/compute/blend/__init__.py +7 -0
  141. lmcache/v1/compute/blend/blender.py +168 -0
  142. lmcache/v1/compute/blend/metadata.py +34 -0
  143. lmcache/v1/compute/blend/utils.py +63 -0
  144. lmcache/v1/compute/models/__init__.py +0 -0
  145. lmcache/v1/compute/models/base.py +141 -0
  146. lmcache/v1/compute/models/llama.py +9 -0
  147. lmcache/v1/compute/models/qwen3.py +24 -0
  148. lmcache/v1/compute/models/utils.py +68 -0
  149. lmcache/v1/compute/positional_encoding.py +199 -0
  150. lmcache/v1/config.py +848 -0
  151. lmcache/v1/config_base.py +848 -0
  152. lmcache/v1/distributed/api.py +248 -0
  153. lmcache/v1/distributed/config.py +321 -0
  154. lmcache/v1/distributed/error.py +64 -0
  155. lmcache/v1/distributed/eviction.py +192 -0
  156. lmcache/v1/distributed/eviction_policy/__init__.py +21 -0
  157. lmcache/v1/distributed/eviction_policy/factory.py +27 -0
  158. lmcache/v1/distributed/eviction_policy/lru.py +244 -0
  159. lmcache/v1/distributed/eviction_policy/noop.py +50 -0
  160. lmcache/v1/distributed/internal_api.py +170 -0
  161. lmcache/v1/distributed/l1_manager.py +835 -0
  162. lmcache/v1/distributed/l2_adapters/__init__.py +67 -0
  163. lmcache/v1/distributed/l2_adapters/base.py +360 -0
  164. lmcache/v1/distributed/l2_adapters/config.py +385 -0
  165. lmcache/v1/distributed/l2_adapters/factory.py +205 -0
  166. lmcache/v1/distributed/l2_adapters/fs_l2_adapter.py +747 -0
  167. lmcache/v1/distributed/l2_adapters/fs_native_l2_adapter.py +167 -0
  168. lmcache/v1/distributed/l2_adapters/mock_l2_adapter.py +516 -0
  169. lmcache/v1/distributed/l2_adapters/mooncake_store_l2_adapter.py +135 -0
  170. lmcache/v1/distributed/l2_adapters/native_connector_l2_adapter.py +468 -0
  171. lmcache/v1/distributed/l2_adapters/native_plugin_l2_adapter.py +199 -0
  172. lmcache/v1/distributed/l2_adapters/nixl_store_dynamic_l2_adapter.py +831 -0
  173. lmcache/v1/distributed/l2_adapters/nixl_store_l2_adapter.py +983 -0
  174. lmcache/v1/distributed/l2_adapters/plugin_l2_adapter.py +210 -0
  175. lmcache/v1/distributed/l2_adapters/resp_l2_adapter.py +176 -0
  176. lmcache/v1/distributed/memory_manager.py +179 -0
  177. lmcache/v1/distributed/storage_controller.py +39 -0
  178. lmcache/v1/distributed/storage_controllers/__init__.py +43 -0
  179. lmcache/v1/distributed/storage_controllers/eviction_controller.py +242 -0
  180. lmcache/v1/distributed/storage_controllers/prefetch_controller.py +830 -0
  181. lmcache/v1/distributed/storage_controllers/prefetch_policy.py +193 -0
  182. lmcache/v1/distributed/storage_controllers/store_controller.py +452 -0
  183. lmcache/v1/distributed/storage_controllers/store_policy.py +213 -0
  184. lmcache/v1/distributed/storage_manager.py +532 -0
  185. lmcache/v1/event_manager.py +145 -0
  186. lmcache/v1/exceptions/__init__.py +16 -0
  187. lmcache/v1/gpu_connector/__init__.py +126 -0
  188. lmcache/v1/gpu_connector/gpu_connectors.py +1906 -0
  189. lmcache/v1/gpu_connector/gpu_ops.py +85 -0
  190. lmcache/v1/gpu_connector/hpu_connector.py +326 -0
  191. lmcache/v1/gpu_connector/mock_gpu_connector.py +67 -0
  192. lmcache/v1/gpu_connector/utils.py +890 -0
  193. lmcache/v1/gpu_connector/xpu_connectors.py +916 -0
  194. lmcache/v1/health_monitor/__init__.py +1 -0
  195. lmcache/v1/health_monitor/base.py +587 -0
  196. lmcache/v1/health_monitor/checks/__init__.py +1 -0
  197. lmcache/v1/health_monitor/checks/remote_backend_check.py +304 -0
  198. lmcache/v1/health_monitor/constants.py +36 -0
  199. lmcache/v1/internal_api_server/__init__.py +0 -0
  200. lmcache/v1/internal_api_server/api_registry.py +59 -0
  201. lmcache/v1/internal_api_server/api_server.py +120 -0
  202. lmcache/v1/internal_api_server/common/__init__.py +1 -0
  203. lmcache/v1/internal_api_server/common/env_api.py +22 -0
  204. lmcache/v1/internal_api_server/common/loglevel_api.py +57 -0
  205. lmcache/v1/internal_api_server/common/metrics_api.py +29 -0
  206. lmcache/v1/internal_api_server/common/periodic_thread_api.py +138 -0
  207. lmcache/v1/internal_api_server/common/run_script_api.py +73 -0
  208. lmcache/v1/internal_api_server/common/thread_api.py +63 -0
  209. lmcache/v1/internal_api_server/controller/__init__.py +1 -0
  210. lmcache/v1/internal_api_server/controller/key_stats_api.py +81 -0
  211. lmcache/v1/internal_api_server/controller/worker_info_api.py +136 -0
  212. lmcache/v1/internal_api_server/utils.py +43 -0
  213. lmcache/v1/internal_api_server/vllm/__init__.py +1 -0
  214. lmcache/v1/internal_api_server/vllm/backend_api.py +221 -0
  215. lmcache/v1/internal_api_server/vllm/bypass_api.py +204 -0
  216. lmcache/v1/internal_api_server/vllm/cache_api.py +895 -0
  217. lmcache/v1/internal_api_server/vllm/chunk_statistics_api.py +141 -0
  218. lmcache/v1/internal_api_server/vllm/conf_api.py +147 -0
  219. lmcache/v1/internal_api_server/vllm/freeze_api.py +172 -0
  220. lmcache/v1/internal_api_server/vllm/hot_cache_api.py +184 -0
  221. lmcache/v1/internal_api_server/vllm/inference_api.py +65 -0
  222. lmcache/v1/internal_api_server/vllm/load_fs_chunks_api.py +320 -0
  223. lmcache/v1/internal_api_server/vllm/lookup_api.py +145 -0
  224. lmcache/v1/internal_api_server/vllm/version_api.py +25 -0
  225. lmcache/v1/kv_layer_groups.py +267 -0
  226. lmcache/v1/lazy_memory_allocator.py +284 -0
  227. lmcache/v1/lookup_client/__init__.py +25 -0
  228. lmcache/v1/lookup_client/abstract_client.py +77 -0
  229. lmcache/v1/lookup_client/async_lookup_message.py +50 -0
  230. lmcache/v1/lookup_client/chunk_statistics_lookup_client.py +200 -0
  231. lmcache/v1/lookup_client/factory.py +251 -0
  232. lmcache/v1/lookup_client/hit_limit_lookup_client.py +86 -0
  233. lmcache/v1/lookup_client/lmcache_async_lookup_client.py +407 -0
  234. lmcache/v1/lookup_client/lmcache_lookup_client.py +285 -0
  235. lmcache/v1/lookup_client/lmcache_lookup_client_bypass.py +99 -0
  236. lmcache/v1/lookup_client/mooncake_lookup_client.py +87 -0
  237. lmcache/v1/lookup_client/record_strategies/__init__.py +77 -0
  238. lmcache/v1/lookup_client/record_strategies/base.py +327 -0
  239. lmcache/v1/lookup_client/record_strategies/file_hash.py +130 -0
  240. lmcache/v1/lookup_client/record_strategies/memory_bloom_filter.py +81 -0
  241. lmcache/v1/manager.py +539 -0
  242. lmcache/v1/memory_management.py +2619 -0
  243. lmcache/v1/metadata.py +114 -0
  244. lmcache/v1/mp_observability/AGENTS.override.md +21 -0
  245. lmcache/v1/mp_observability/README.md +204 -0
  246. lmcache/v1/mp_observability/config.py +340 -0
  247. lmcache/v1/mp_observability/event.py +100 -0
  248. lmcache/v1/mp_observability/event_bus.py +313 -0
  249. lmcache/v1/mp_observability/otel_init.py +145 -0
  250. lmcache/v1/mp_observability/subscribers/__init__.py +28 -0
  251. lmcache/v1/mp_observability/subscribers/logging/__init__.py +19 -0
  252. lmcache/v1/mp_observability/subscribers/logging/l1.py +56 -0
  253. lmcache/v1/mp_observability/subscribers/logging/l2.py +73 -0
  254. lmcache/v1/mp_observability/subscribers/logging/lookup_hash.py +209 -0
  255. lmcache/v1/mp_observability/subscribers/logging/mp_server.py +90 -0
  256. lmcache/v1/mp_observability/subscribers/logging/sm.py +59 -0
  257. lmcache/v1/mp_observability/subscribers/metrics/__init__.py +20 -0
  258. lmcache/v1/mp_observability/subscribers/metrics/l0_lifecycle.py +290 -0
  259. lmcache/v1/mp_observability/subscribers/metrics/l1.py +55 -0
  260. lmcache/v1/mp_observability/subscribers/metrics/l1_lifecycle.py +166 -0
  261. lmcache/v1/mp_observability/subscribers/metrics/l2.py +121 -0
  262. lmcache/v1/mp_observability/subscribers/metrics/sm.py +69 -0
  263. lmcache/v1/mp_observability/subscribers/tracing/__init__.py +12 -0
  264. lmcache/v1/mp_observability/subscribers/tracing/mp_server.py +333 -0
  265. lmcache/v1/mp_observability/subscribers/tracing/span_registry.py +148 -0
  266. lmcache/v1/mp_observability/trace/__init__.py +50 -0
  267. lmcache/v1/mp_observability/trace/codecs.py +255 -0
  268. lmcache/v1/mp_observability/trace/decorator.py +147 -0
  269. lmcache/v1/mp_observability/trace/format.py +132 -0
  270. lmcache/v1/mp_observability/trace/lifecycle.py +83 -0
  271. lmcache/v1/mp_observability/trace/reader.py +167 -0
  272. lmcache/v1/mp_observability/trace/recorder.py +300 -0
  273. lmcache/v1/multiprocess/__init__.py +0 -0
  274. lmcache/v1/multiprocess/affinity_pool.py +102 -0
  275. lmcache/v1/multiprocess/blend_server_v2.py +891 -0
  276. lmcache/v1/multiprocess/config.py +253 -0
  277. lmcache/v1/multiprocess/custom_types.py +281 -0
  278. lmcache/v1/multiprocess/futures.py +194 -0
  279. lmcache/v1/multiprocess/gpu_context.py +511 -0
  280. lmcache/v1/multiprocess/http_server.py +235 -0
  281. lmcache/v1/multiprocess/mp_runtime_plugin_launcher.py +130 -0
  282. lmcache/v1/multiprocess/mq.py +732 -0
  283. lmcache/v1/multiprocess/protocol.py +86 -0
  284. lmcache/v1/multiprocess/protocols/README.md +213 -0
  285. lmcache/v1/multiprocess/protocols/__init__.py +127 -0
  286. lmcache/v1/multiprocess/protocols/base.py +89 -0
  287. lmcache/v1/multiprocess/protocols/blend.py +109 -0
  288. lmcache/v1/multiprocess/protocols/blend_v2.py +57 -0
  289. lmcache/v1/multiprocess/protocols/controller.py +53 -0
  290. lmcache/v1/multiprocess/protocols/debug.py +34 -0
  291. lmcache/v1/multiprocess/protocols/engine.py +146 -0
  292. lmcache/v1/multiprocess/protocols/observability.py +39 -0
  293. lmcache/v1/multiprocess/server.py +1134 -0
  294. lmcache/v1/multiprocess/session.py +190 -0
  295. lmcache/v1/multiprocess/token_hasher.py +441 -0
  296. lmcache/v1/offload_server/__init__.py +17 -0
  297. lmcache/v1/offload_server/abstract_server.py +37 -0
  298. lmcache/v1/offload_server/message.py +30 -0
  299. lmcache/v1/offload_server/zmq_server.py +122 -0
  300. lmcache/v1/periodic_thread.py +579 -0
  301. lmcache/v1/pin_monitor.py +246 -0
  302. lmcache/v1/plugin/__init__.py +0 -0
  303. lmcache/v1/plugin/runtime_plugin_launcher.py +211 -0
  304. lmcache/v1/protocol.py +317 -0
  305. lmcache/v1/rpc/__init__.py +17 -0
  306. lmcache/v1/rpc/transport.py +105 -0
  307. lmcache/v1/rpc/zmq_transport.py +213 -0
  308. lmcache/v1/rpc_utils.py +165 -0
  309. lmcache/v1/server/__init__.py +2 -0
  310. lmcache/v1/server/__main__.py +170 -0
  311. lmcache/v1/server/storage_backend/__init__.py +21 -0
  312. lmcache/v1/server/storage_backend/abstract_backend.py +80 -0
  313. lmcache/v1/server/storage_backend/local_backend.py +75 -0
  314. lmcache/v1/server/utils.py +21 -0
  315. lmcache/v1/standalone/__init__.py +1 -0
  316. lmcache/v1/standalone/__main__.py +583 -0
  317. lmcache/v1/standalone/manager.py +80 -0
  318. lmcache/v1/standalone/standalone_service_factory.py +86 -0
  319. lmcache/v1/storage_backend/__init__.py +313 -0
  320. lmcache/v1/storage_backend/abstract_backend.py +445 -0
  321. lmcache/v1/storage_backend/audit_backend.py +233 -0
  322. lmcache/v1/storage_backend/batched_message_sender.py +222 -0
  323. lmcache/v1/storage_backend/cache_policy/__init__.py +45 -0
  324. lmcache/v1/storage_backend/cache_policy/base_policy.py +87 -0
  325. lmcache/v1/storage_backend/cache_policy/fifo.py +58 -0
  326. lmcache/v1/storage_backend/cache_policy/lfu.py +105 -0
  327. lmcache/v1/storage_backend/cache_policy/lru.py +81 -0
  328. lmcache/v1/storage_backend/cache_policy/mru.py +61 -0
  329. lmcache/v1/storage_backend/connector/__init__.py +443 -0
  330. lmcache/v1/storage_backend/connector/audit_adapter.py +77 -0
  331. lmcache/v1/storage_backend/connector/audit_connector.py +320 -0
  332. lmcache/v1/storage_backend/connector/base_connector.py +379 -0
  333. lmcache/v1/storage_backend/connector/blackhole_adapter.py +21 -0
  334. lmcache/v1/storage_backend/connector/blackhole_connector.py +37 -0
  335. lmcache/v1/storage_backend/connector/eic_adapter.py +31 -0
  336. lmcache/v1/storage_backend/connector/eic_connector.py +757 -0
  337. lmcache/v1/storage_backend/connector/external_adapter.py +79 -0
  338. lmcache/v1/storage_backend/connector/fs_adapter.py +51 -0
  339. lmcache/v1/storage_backend/connector/fs_connector.py +403 -0
  340. lmcache/v1/storage_backend/connector/infinistore_adapter.py +56 -0
  341. lmcache/v1/storage_backend/connector/infinistore_connector.py +177 -0
  342. lmcache/v1/storage_backend/connector/instrumented_connector.py +219 -0
  343. lmcache/v1/storage_backend/connector/lm_adapter.py +31 -0
  344. lmcache/v1/storage_backend/connector/lm_connector.py +176 -0
  345. lmcache/v1/storage_backend/connector/mock_adapter.py +57 -0
  346. lmcache/v1/storage_backend/connector/mock_connector.py +349 -0
  347. lmcache/v1/storage_backend/connector/mooncakestore_adapter.py +43 -0
  348. lmcache/v1/storage_backend/connector/mooncakestore_connector.py +614 -0
  349. lmcache/v1/storage_backend/connector/redis_adapter.py +181 -0
  350. lmcache/v1/storage_backend/connector/redis_connector.py +828 -0
  351. lmcache/v1/storage_backend/connector/s3_adapter.py +59 -0
  352. lmcache/v1/storage_backend/connector/s3_connector.py +699 -0
  353. lmcache/v1/storage_backend/connector/sagemaker_hyperpod_adapter.py +233 -0
  354. lmcache/v1/storage_backend/connector/sagemaker_hyperpod_connector.py +987 -0
  355. lmcache/v1/storage_backend/connector/valkey_adapter.py +114 -0
  356. lmcache/v1/storage_backend/connector/valkey_connector.py +627 -0
  357. lmcache/v1/storage_backend/gds_backend.py +1199 -0
  358. lmcache/v1/storage_backend/job_executor/__init__.py +0 -0
  359. lmcache/v1/storage_backend/job_executor/base_executor.py +34 -0
  360. lmcache/v1/storage_backend/job_executor/pq_executor.py +235 -0
  361. lmcache/v1/storage_backend/local_cpu_backend.py +810 -0
  362. lmcache/v1/storage_backend/local_disk_backend.py +656 -0
  363. lmcache/v1/storage_backend/maru_backend.py +734 -0
  364. lmcache/v1/storage_backend/naive_serde/__init__.py +50 -0
  365. lmcache/v1/storage_backend/naive_serde/cachegen_basics.py +133 -0
  366. lmcache/v1/storage_backend/naive_serde/cachegen_decoder.py +135 -0
  367. lmcache/v1/storage_backend/naive_serde/cachegen_encoder.py +83 -0
  368. lmcache/v1/storage_backend/naive_serde/kivi_serde.py +22 -0
  369. lmcache/v1/storage_backend/naive_serde/naive_serde.py +18 -0
  370. lmcache/v1/storage_backend/naive_serde/serde.py +37 -0
  371. lmcache/v1/storage_backend/native_clients/connector_client_base.py +165 -0
  372. lmcache/v1/storage_backend/native_clients/resp_client.py +35 -0
  373. lmcache/v1/storage_backend/nixl_storage_backend.py +1400 -0
  374. lmcache/v1/storage_backend/p2p_backend.py +788 -0
  375. lmcache/v1/storage_backend/path_sharder.py +117 -0
  376. lmcache/v1/storage_backend/pd_backend.py +646 -0
  377. lmcache/v1/storage_backend/plugins/dax_backend.py +1443 -0
  378. lmcache/v1/storage_backend/plugins/rust_raw_block_backend.py +1361 -0
  379. lmcache/v1/storage_backend/remote_backend.py +624 -0
  380. lmcache/v1/storage_backend/resp_client.py +227 -0
  381. lmcache/v1/storage_backend/storage_backend_listener.py +19 -0
  382. lmcache/v1/storage_backend/storage_manager.py +1352 -0
  383. lmcache/v1/system_detection.py +110 -0
  384. lmcache/v1/token_database.py +551 -0
  385. lmcache/v1/transfer_channel/__init__.py +83 -0
  386. lmcache/v1/transfer_channel/abstract.py +285 -0
  387. lmcache/v1/transfer_channel/mock_memory_channel.py +156 -0
  388. lmcache/v1/transfer_channel/nixl_channel.py +639 -0
  389. lmcache/v1/transfer_channel/py_socket_channel.py +260 -0
  390. lmcache/v1/transfer_channel/transfer_utils.py +63 -0
  391. lmcache/v1/utils/__init__.py +1 -0
  392. lmcache/v1/utils/bloom_filter.py +109 -0
  393. lmcache/v1/utils/cache_utils.py +125 -0
  394. lmcache_cli-0.4.5.dev0.dist-info/METADATA +185 -0
  395. lmcache_cli-0.4.5.dev0.dist-info/RECORD +399 -0
  396. lmcache_cli-0.4.5.dev0.dist-info/WHEEL +5 -0
  397. lmcache_cli-0.4.5.dev0.dist-info/entry_points.txt +2 -0
  398. lmcache_cli-0.4.5.dev0.dist-info/licenses/LICENSE +201 -0
  399. lmcache_cli-0.4.5.dev0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,73 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+
3
+ """L2 storage logging subscriber — debug logs for L2 store/prefetch events."""
4
+
5
+ # Future
6
+ from __future__ import annotations
7
+
8
+ # First Party
9
+ from lmcache.logging import init_logger
10
+ from lmcache.v1.mp_observability.event import Event, EventType
11
+ from lmcache.v1.mp_observability.event_bus import EventCallback, EventSubscriber
12
+
13
+ logger = init_logger(__name__)
14
+
15
+
16
+ class L2LoggingSubscriber(EventSubscriber):
17
+ """Logs L2 store and prefetch events at debug level."""
18
+
19
+ def get_subscriptions(self) -> dict[EventType, EventCallback]:
20
+ return {
21
+ EventType.L2_STORE_SUBMITTED: self._on_store_submitted,
22
+ EventType.L2_STORE_COMPLETED: self._on_store_completed,
23
+ EventType.L2_PREFETCH_LOOKUP_SUBMITTED: self._on_lookup_submitted,
24
+ EventType.L2_PREFETCH_LOOKUP_COMPLETED: self._on_lookup_completed,
25
+ EventType.L2_PREFETCH_LOAD_SUBMITTED: self._on_load_submitted,
26
+ EventType.L2_PREFETCH_LOAD_COMPLETED: self._on_load_completed,
27
+ }
28
+
29
+ def _on_store_submitted(self, event: Event) -> None:
30
+ logger.debug(
31
+ "L2 store submitted: %d keys to adapter %d",
32
+ event.metadata["key_count"],
33
+ event.metadata["adapter_index"],
34
+ )
35
+
36
+ def _on_store_completed(self, event: Event) -> None:
37
+ logger.debug(
38
+ "L2 store completed: adapter %d, %d succeeded, %d failed",
39
+ event.metadata["adapter_index"],
40
+ event.metadata["succeeded_count"],
41
+ event.metadata["failed_count"],
42
+ )
43
+
44
+ def _on_lookup_submitted(self, event: Event) -> None:
45
+ logger.debug(
46
+ "L2 prefetch lookup submitted: request %d, %d keys to %d adapters",
47
+ event.metadata["request_id"],
48
+ event.metadata["key_count"],
49
+ event.metadata["adapter_count"],
50
+ )
51
+
52
+ def _on_lookup_completed(self, event: Event) -> None:
53
+ logger.debug(
54
+ "L2 prefetch lookup completed: request %d, %d prefix hits",
55
+ event.metadata["request_id"],
56
+ event.metadata["prefix_hit_count"],
57
+ )
58
+
59
+ def _on_load_submitted(self, event: Event) -> None:
60
+ logger.debug(
61
+ "L2 prefetch load submitted: request %d, %d keys to %d adapters",
62
+ event.metadata["request_id"],
63
+ event.metadata["key_count"],
64
+ event.metadata["adapter_count"],
65
+ )
66
+
67
+ def _on_load_completed(self, event: Event) -> None:
68
+ logger.debug(
69
+ "L2 prefetch load completed: request %d, %d loaded, %d failed",
70
+ event.metadata["request_id"],
71
+ event.metadata["loaded_count"],
72
+ event.metadata["failed_count"],
73
+ )
@@ -0,0 +1,209 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+
3
+ """Lookup hash file-logging subscriber.
4
+
5
+ Subscribes to ``MP_LOOKUP`` events and writes lookup hash data to
6
+ rotating JSONL files for offline analysis. Because the EventBus
7
+ drain thread dispatches callbacks off the hot path, no extra queue
8
+ or worker thread is needed — file I/O happens in the EventBus
9
+ background thread.
10
+ """
11
+
12
+ # Future
13
+ from __future__ import annotations
14
+
15
+ # Standard
16
+ from dataclasses import dataclass
17
+ from datetime import datetime, timezone
18
+ from pathlib import Path
19
+ from typing import Optional
20
+ import io
21
+ import json
22
+
23
+ # First Party
24
+ from lmcache.logging import init_logger
25
+ from lmcache.v1.mp_observability.event import Event, EventType
26
+ from lmcache.v1.mp_observability.event_bus import EventCallback, EventSubscriber
27
+
28
+ logger = init_logger(__name__)
29
+
30
+ # Pattern for discovering existing log files on disk.
31
+ _LOG_FILE_GLOB = "lookup_hashes_*.jsonl"
32
+
33
+
34
+ def _format_timestamp(ts: float) -> str:
35
+ """Format a unix timestamp as a compact datetime string.
36
+
37
+ Example: 20260401_143025
38
+ """
39
+ dt = datetime.fromtimestamp(ts, tz=timezone.utc)
40
+ return dt.strftime("%Y%m%d_%H%M%S")
41
+
42
+
43
+ @dataclass
44
+ class LookupHashLogConfig:
45
+ """Configuration for lookup hash file logging.
46
+
47
+ When ``output_dir`` is non-empty, chunk hashes computed during
48
+ lookup are written to rotating JSONL files for offline analysis.
49
+ """
50
+
51
+ output_dir: str = ""
52
+ """Directory to write lookup hash JSONL files.
53
+ Empty string disables logging."""
54
+
55
+ rotation_interval_sec: int = 6 * 3600
56
+ """Time interval in seconds before rotating to a new file
57
+ (default 6 hours)."""
58
+
59
+ rotation_max_size: int = 100 * 1024 * 1024
60
+ """Max file size in bytes before rotating even if the time
61
+ interval has not elapsed (default 100MB)."""
62
+
63
+ max_files: int = 100
64
+ """Max number of log files to keep before deleting oldest."""
65
+
66
+ @property
67
+ def enabled(self) -> bool:
68
+ """Whether lookup hash logging is enabled."""
69
+ return bool(self.output_dir)
70
+
71
+
72
+ class LookupHashLoggingSubscriber(EventSubscriber):
73
+ """EventBus subscriber that writes lookup hashes to rotating JSONL files.
74
+
75
+ Leverages the EventBus drain thread for async I/O instead of maintaining
76
+ its own queue and worker.
77
+
78
+ Files rotate when either the time interval or file size limit is
79
+ reached, whichever comes first. File names include a
80
+ human-readable timestamp, e.g.::
81
+
82
+ lookup_hashes_20260401_143025_000003.jsonl
83
+
84
+ Each JSONL line has the format::
85
+
86
+ {"timestamp": 1711929600.123, "request_id": "req-abc",
87
+ "model_name": "DeepSeek-V3",
88
+ "chunk_size": 256, "seq_len": 1024,
89
+ "dtypes": ["float8_e4m3fn"],
90
+ "shapes": [[32, 256, 128]],
91
+ "chunk_hashes": ["0xab...", ...]}
92
+ """
93
+
94
+ def __init__(self, config: LookupHashLogConfig) -> None:
95
+ self._config = config
96
+ self.output_dir = Path(config.output_dir)
97
+ self.output_dir.mkdir(parents=True, exist_ok=True)
98
+
99
+ # File state (only accessed from the EventBus drain thread)
100
+ self._current_file_size: int = 0
101
+ self._current_file: Optional[Path] = None
102
+ self._current_handle: Optional[io.TextIOWrapper] = None
103
+ self._current_file_opened_at: float = 0.0
104
+
105
+ # Discover existing log files so max_files limit accounts
106
+ # for files from previous runs.
107
+ self._file_list: list[Path] = sorted(
108
+ self.output_dir.glob(_LOG_FILE_GLOB),
109
+ key=lambda p: p.stat().st_mtime,
110
+ )
111
+ self._file_count: int = len(self._file_list)
112
+
113
+ logger.info(
114
+ "LookupHashLoggingSubscriber started: output_dir=%s, "
115
+ "rotation_interval=%ds, "
116
+ "rotation_max_size=%d, max_files=%d, "
117
+ "existing_files=%d",
118
+ self.output_dir,
119
+ config.rotation_interval_sec,
120
+ config.rotation_max_size,
121
+ config.max_files,
122
+ len(self._file_list),
123
+ )
124
+
125
+ # -- EventSubscriber interface -----------------------------------------
126
+
127
+ def get_subscriptions(self) -> dict[EventType, EventCallback]:
128
+ return {
129
+ EventType.MP_LOOKUP: self._on_lookup_hashes,
130
+ }
131
+
132
+ def shutdown(self) -> None:
133
+ """Close the current file handle on EventBus shutdown."""
134
+ if self._current_handle is not None:
135
+ self._current_handle.close()
136
+ self._current_handle = None
137
+ logger.info("LookupHashLoggingSubscriber closed")
138
+
139
+ # -- Callback ----------------------------------------------------------
140
+
141
+ def _on_lookup_hashes(self, event: Event) -> None:
142
+ """Write a lookup hash event to the current JSONL file."""
143
+ meta = event.metadata
144
+ timestamp = event.timestamp
145
+
146
+ if self._needs_rotation(timestamp):
147
+ self._rotate_file(timestamp)
148
+
149
+ chunk_hashes_raw = meta.get("chunk_hashes", [])
150
+ data = {
151
+ "timestamp": timestamp,
152
+ "request_id": meta.get("request_id", ""),
153
+ "model_name": meta.get("model_name", ""),
154
+ "chunk_size": meta.get("chunk_size", 0),
155
+ "seq_len": meta.get("seq_len", 0),
156
+ "dtypes": meta.get("dtypes", []),
157
+ "shapes": meta.get("shapes", []),
158
+ "chunk_hashes": [
159
+ "0x" + h.hex() if isinstance(h, bytes) else hex(h)
160
+ for h in chunk_hashes_raw
161
+ ],
162
+ }
163
+ line = json.dumps(data) + "\n"
164
+ if self._current_handle is not None:
165
+ self._current_handle.write(line)
166
+ self._current_handle.flush()
167
+ self._current_file_size = self._current_handle.tell()
168
+
169
+ # -- File rotation -----------------------------------------------------
170
+
171
+ def _needs_rotation(self, now: float) -> bool:
172
+ """Check if the current file needs rotation."""
173
+ if self._current_handle is None:
174
+ return True
175
+ elapsed = now - self._current_file_opened_at
176
+ if elapsed >= self._config.rotation_interval_sec:
177
+ return True
178
+ if self._current_file_size >= self._config.rotation_max_size:
179
+ return True
180
+ return False
181
+
182
+ def _rotate_file(self, now: float) -> None:
183
+ """Close current file and open a new one."""
184
+ if self._current_handle is not None:
185
+ self._current_handle.close()
186
+ self._current_handle = None
187
+
188
+ time_str = _format_timestamp(now)
189
+ self._current_file = (
190
+ self.output_dir / f"lookup_hashes_{time_str}_{self._file_count:06d}.jsonl"
191
+ )
192
+ self._current_handle = open(self._current_file, "w", encoding="utf-8")
193
+ self._current_file_opened_at = now
194
+ self._current_file_size = 0
195
+ self._file_count += 1
196
+ self._file_list.append(self._current_file)
197
+
198
+ # Enforce max file count
199
+ while len(self._file_list) > self._config.max_files:
200
+ oldest = self._file_list.pop(0)
201
+ try:
202
+ if oldest.exists():
203
+ oldest.unlink()
204
+ except Exception as e:
205
+ logger.error(
206
+ "Failed to delete old lookup hash file %s: %s",
207
+ oldest,
208
+ e,
209
+ )
@@ -0,0 +1,90 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+
3
+ """MP Server logging subscriber — debug logs for store/retrieve/lookup events.
4
+
5
+ Logs are emitted via Python's standard logging module. When OpenTelemetry
6
+ is installed, ``init_logger`` automatically attaches an OTel
7
+ ``LoggingHandler`` so records are forwarded to OTel when a
8
+ ``LoggerProvider`` is configured at startup.
9
+ """
10
+
11
+ # Future
12
+ from __future__ import annotations
13
+
14
+ # First Party
15
+ from lmcache.logging import init_logger
16
+ from lmcache.v1.mp_observability.event import Event, EventType
17
+ from lmcache.v1.mp_observability.event_bus import EventCallback, EventSubscriber
18
+
19
+ logger = init_logger(__name__)
20
+
21
+
22
+ class MPServerLoggingSubscriber(EventSubscriber):
23
+ """Logs MP server store/retrieve/lookup events at debug level."""
24
+
25
+ def get_subscriptions(self) -> dict[EventType, EventCallback]:
26
+ return {
27
+ EventType.MP_STORE_START: self._on_store_start,
28
+ EventType.MP_STORE_END: self._on_store_end,
29
+ EventType.MP_RETRIEVE_START: self._on_retrieve_start,
30
+ EventType.MP_RETRIEVE_END: self._on_retrieve_end,
31
+ EventType.MP_LOOKUP_PREFETCH_START: self._on_lookup_prefetch_start,
32
+ EventType.MP_LOOKUP_PREFETCH_END: self._on_lookup_prefetch_end,
33
+ EventType.MP_VLLM_BLOCK_ALLOCATION: self._on_block_allocation,
34
+ }
35
+
36
+ def _on_store_start(self, event: Event) -> None:
37
+ logger.debug(
38
+ "MP store start: session=%s device=%s",
39
+ event.session_id,
40
+ event.metadata.get("device"),
41
+ )
42
+
43
+ def _on_store_end(self, event: Event) -> None:
44
+ logger.debug(
45
+ "MP store end: session=%s device=%s stored_count=%s",
46
+ event.session_id,
47
+ event.metadata.get("device"),
48
+ event.metadata.get("stored_count"),
49
+ )
50
+
51
+ def _on_retrieve_start(self, event: Event) -> None:
52
+ logger.debug(
53
+ "MP retrieve start: session=%s device=%s",
54
+ event.session_id,
55
+ event.metadata.get("device"),
56
+ )
57
+
58
+ def _on_retrieve_end(self, event: Event) -> None:
59
+ logger.debug(
60
+ "MP retrieve end: session=%s device=%s retrieved_count=%s",
61
+ event.session_id,
62
+ event.metadata.get("device"),
63
+ event.metadata.get("retrieved_count"),
64
+ )
65
+
66
+ def _on_lookup_prefetch_start(self, event: Event) -> None:
67
+ logger.debug(
68
+ "MP lookup/prefetch start: session=%s",
69
+ event.session_id,
70
+ )
71
+
72
+ def _on_lookup_prefetch_end(self, event: Event) -> None:
73
+ logger.debug(
74
+ "MP lookup/prefetch end: session=%s found_count=%s",
75
+ event.session_id,
76
+ event.metadata.get("found_count"),
77
+ )
78
+
79
+ def _on_block_allocation(self, event: Event) -> None:
80
+ records = event.metadata.get("records", [])
81
+ for rec in records:
82
+ logger.debug(
83
+ "vLLM block allocation: req_id=%s "
84
+ "new_blocks=%d new_tokens=%d "
85
+ "block_ids=%s",
86
+ rec.req_id,
87
+ len(rec.new_block_ids),
88
+ len(rec.new_token_ids),
89
+ rec.new_block_ids[:10],
90
+ )
@@ -0,0 +1,59 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+
3
+ """StorageManager logging subscriber — debug logs for SM events.
4
+
5
+ Logs are emitted via Python's standard logging module. When OpenTelemetry
6
+ is installed, ``init_logger`` automatically attaches an OTel
7
+ ``LoggingHandler`` so records are forwarded to OTel when a
8
+ ``LoggerProvider`` is configured at startup.
9
+ """
10
+
11
+ # Future
12
+ from __future__ import annotations
13
+
14
+ # First Party
15
+ from lmcache.logging import init_logger
16
+ from lmcache.v1.mp_observability.event import Event, EventType
17
+ from lmcache.v1.mp_observability.event_bus import EventCallback, EventSubscriber
18
+
19
+ logger = init_logger(__name__)
20
+
21
+
22
+ class SMLoggingSubscriber(EventSubscriber):
23
+ """Logs StorageManager events at debug level."""
24
+
25
+ def get_subscriptions(self) -> dict[EventType, EventCallback]:
26
+ return {
27
+ EventType.SM_READ_PREFETCHED: self._on_read_prefetched,
28
+ EventType.SM_READ_PREFETCHED_FINISHED: self._on_read_prefetched_finished,
29
+ EventType.SM_WRITE_RESERVED: self._on_write_reserved,
30
+ EventType.SM_WRITE_FINISHED: self._on_write_finished,
31
+ }
32
+
33
+ def _on_read_prefetched(self, event: Event) -> None:
34
+ logger.debug(
35
+ "SM read prefetched: %d succeeded, %d failed",
36
+ len(event.metadata["succeeded_keys"]),
37
+ len(event.metadata["failed_keys"]),
38
+ )
39
+
40
+ def _on_read_prefetched_finished(self, event: Event) -> None:
41
+ logger.debug(
42
+ "SM read prefetched finished: %d succeeded, %d failed",
43
+ len(event.metadata["succeeded_keys"]),
44
+ len(event.metadata["failed_keys"]),
45
+ )
46
+
47
+ def _on_write_reserved(self, event: Event) -> None:
48
+ logger.debug(
49
+ "SM write reserved: %d succeeded, %d failed",
50
+ len(event.metadata["succeeded_keys"]),
51
+ len(event.metadata["failed_keys"]),
52
+ )
53
+
54
+ def _on_write_finished(self, event: Event) -> None:
55
+ logger.debug(
56
+ "SM write finished: %d succeeded, %d failed",
57
+ len(event.metadata["succeeded_keys"]),
58
+ len(event.metadata["failed_keys"]),
59
+ )
@@ -0,0 +1,20 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+
3
+ # First Party
4
+ from lmcache.v1.mp_observability.subscribers.metrics.l0_lifecycle import (
5
+ L0LifecycleSubscriber,
6
+ )
7
+ from lmcache.v1.mp_observability.subscribers.metrics.l1 import L1MetricsSubscriber
8
+ from lmcache.v1.mp_observability.subscribers.metrics.l1_lifecycle import (
9
+ L1LifecycleSubscriber,
10
+ )
11
+ from lmcache.v1.mp_observability.subscribers.metrics.l2 import L2MetricsSubscriber
12
+ from lmcache.v1.mp_observability.subscribers.metrics.sm import SMMetricsSubscriber
13
+
14
+ __all__ = [
15
+ "L0LifecycleSubscriber",
16
+ "L1LifecycleSubscriber",
17
+ "L1MetricsSubscriber",
18
+ "L2MetricsSubscriber",
19
+ "SMMetricsSubscriber",
20
+ ]