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,86 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ """
3
+ StandaloneServiceFactory: Service factory for LMCache standalone mode.
4
+
5
+ Creates LMCache service components without vLLM dependencies.
6
+ """
7
+
8
+ # Standard
9
+ from typing import TYPE_CHECKING, Any, Callable, Optional
10
+
11
+ # First Party
12
+ from lmcache.integration.base_service_factory import BaseServiceFactory
13
+ from lmcache.v1.cache_engine import LMCacheEngine, LMCacheEngineBuilder
14
+ from lmcache.v1.config import LMCacheEngineConfig
15
+ from lmcache.v1.health_monitor.base import HealthMonitor
16
+ from lmcache.v1.internal_api_server.api_server import InternalAPIServer
17
+ from lmcache.v1.metadata import LMCacheMetadata
18
+
19
+ if TYPE_CHECKING:
20
+ # First Party
21
+ from lmcache.v1.manager import LMCacheManager
22
+
23
+
24
+ class StandaloneServiceFactory(BaseServiceFactory):
25
+ """Service factory for standalone LMCache mode (no vLLM)."""
26
+
27
+ def __init__(
28
+ self,
29
+ config: LMCacheEngineConfig,
30
+ metadata: LMCacheMetadata,
31
+ gpu_connector: Any,
32
+ broadcast_fn: Callable,
33
+ broadcast_object_fn: Callable,
34
+ ):
35
+ self._config = config
36
+ self._metadata = metadata
37
+ self._gpu_connector = gpu_connector
38
+ self._broadcast_fn = broadcast_fn
39
+ self._broadcast_object_fn = broadcast_object_fn
40
+ self._engine: Optional[LMCacheEngine] = None
41
+
42
+ def get_engine_instance_id(self) -> str:
43
+ return self._config.lmcache_instance_id
44
+
45
+ def get_or_create_metadata(self) -> Optional[LMCacheMetadata]:
46
+ return self._metadata
47
+
48
+ def get_or_create_lmcache_engine(self) -> Optional[LMCacheEngine]:
49
+ if self._engine is not None:
50
+ return self._engine
51
+
52
+ instance_id = self._config.lmcache_instance_id
53
+ self._engine = LMCacheEngineBuilder.get_or_create(
54
+ instance_id=instance_id,
55
+ config=self._config,
56
+ metadata=self._metadata,
57
+ gpu_connector=self._gpu_connector,
58
+ broadcast_fn=self._broadcast_fn,
59
+ broadcast_object_fn=self._broadcast_object_fn,
60
+ )
61
+ return self._engine
62
+
63
+ def maybe_create_lookup_client(self):
64
+ return None
65
+
66
+ def maybe_create_prometheus_logger(self):
67
+ return None
68
+
69
+ def maybe_create_lookup_server(self):
70
+ return None
71
+
72
+ def maybe_create_offload_server(self):
73
+ return None
74
+
75
+ def maybe_create_runtime_plugin_launcher(self):
76
+ return None
77
+
78
+ def maybe_create_internal_api_server(
79
+ self, lmcache_manager: "LMCacheManager"
80
+ ) -> Optional[InternalAPIServer]:
81
+ return InternalAPIServer(lmcache_manager)
82
+
83
+ def maybe_create_health_monitor(
84
+ self, lmcache_manager: "LMCacheManager"
85
+ ) -> Optional[HealthMonitor]:
86
+ return self._create_health_monitor(lmcache_manager, self._config, self._engine)
@@ -0,0 +1,313 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Standard
3
+ from collections import OrderedDict
4
+ from typing import TYPE_CHECKING, AbstractSet, Optional
5
+ import asyncio
6
+ import importlib # Added for dynamic import
7
+
8
+ # Third Party
9
+ import torch
10
+
11
+ # First Party
12
+ from lmcache.logging import init_logger
13
+ from lmcache.v1.config import LMCacheEngineConfig
14
+ from lmcache.v1.metadata import LMCacheMetadata
15
+ from lmcache.v1.storage_backend.abstract_backend import StorageBackendInterface
16
+ from lmcache.v1.storage_backend.gds_backend import GdsBackend
17
+ from lmcache.v1.storage_backend.local_cpu_backend import LocalCPUBackend
18
+ from lmcache.v1.storage_backend.local_disk_backend import LocalDiskBackend
19
+ from lmcache.v1.storage_backend.p2p_backend import P2PBackend
20
+ from lmcache.v1.storage_backend.remote_backend import RemoteBackend # noqa: F401
21
+
22
+ if TYPE_CHECKING:
23
+ # First Party
24
+ from lmcache.v1.cache_controller.worker import LMCacheWorker
25
+
26
+ logger = init_logger(__name__)
27
+
28
+
29
+ def is_cuda_worker(metadata: LMCacheMetadata) -> bool:
30
+ """
31
+ Check if the current role is worker and CUDA is available.
32
+
33
+ Args:
34
+ metadata: The LMCache engine metadata.
35
+
36
+ Returns:
37
+ True if the worker is not a scheduler and CUDA is available.
38
+ """
39
+ return metadata.role != "scheduler" and torch.cuda.is_available()
40
+
41
+
42
+ def storage_plugin_launcher(
43
+ config: LMCacheEngineConfig,
44
+ metadata: LMCacheMetadata,
45
+ loop: asyncio.AbstractEventLoop,
46
+ local_cpu_backend: Optional[LocalCPUBackend],
47
+ dst_device: str,
48
+ storage_backends: OrderedDict[str, StorageBackendInterface],
49
+ ) -> None:
50
+ """
51
+ Loads custom storage backends based on configuration.
52
+
53
+ Looks for backend configurations in config.extra_config and instantiates
54
+ them using the specified module and class names.
55
+ """
56
+ # Get the list of allowed external backends if configured
57
+ storage_plugins = set(config.storage_plugins) if config.storage_plugins else set()
58
+ if storage_plugins and not config.extra_config:
59
+ logger.warning(
60
+ "storage_plugins=%s is set but extra_config is empty; "
61
+ "plugin settings must be provided under extra_config, e.g. "
62
+ "extra_config.storage_plugin.<name>.module_path/class_name",
63
+ sorted(storage_plugins),
64
+ )
65
+ return
66
+ if not config.extra_config:
67
+ return
68
+
69
+ for storage_plugin in storage_plugins:
70
+ try:
71
+ module_path = config.extra_config.get(
72
+ f"storage_plugin.{storage_plugin}.module_path"
73
+ )
74
+ class_name = config.extra_config.get(
75
+ f"storage_plugin.{storage_plugin}.class_name"
76
+ )
77
+
78
+ if not module_path or not class_name:
79
+ logger.warning(
80
+ f"Backend {storage_plugin} missing module_path or class_name"
81
+ )
82
+ continue
83
+
84
+ logger.warning(
85
+ "The 'memory_allocator' argument is deprecated and will "
86
+ "be ignored. Storage backends now manage their own memory "
87
+ "allocators since PR "
88
+ "https://github.com/LMCache/LMCache/pull/1578"
89
+ )
90
+
91
+ # Dynamically import the module
92
+ module = importlib.import_module(module_path)
93
+ # Get the class from the module
94
+ backend_class = getattr(module, class_name)
95
+
96
+ # Create the backend instance
97
+ backend_instance = backend_class(
98
+ config=config,
99
+ dst_device=dst_device,
100
+ metadata=metadata,
101
+ local_cpu_backend=local_cpu_backend,
102
+ loop=loop,
103
+ )
104
+
105
+ # Add to storage backends
106
+ storage_backends[storage_plugin] = backend_instance
107
+ logger.info(f"Created dynamic backend: {storage_plugin}")
108
+
109
+ except Exception as e:
110
+ logger.error(f"Failed to create backend {storage_plugin}: {str(e)}")
111
+
112
+
113
+ def CreateStorageBackends(
114
+ config: LMCacheEngineConfig,
115
+ metadata: LMCacheMetadata,
116
+ loop: asyncio.AbstractEventLoop,
117
+ dst_device: str = "cuda",
118
+ lmcache_worker: Optional["LMCacheWorker"] = None,
119
+ skip_backends: Optional[AbstractSet[str]] = None,
120
+ existing_backends: Optional[OrderedDict[str, StorageBackendInterface]] = None,
121
+ ) -> OrderedDict[str, StorageBackendInterface]:
122
+ if is_cuda_worker(metadata):
123
+ dst_device = f"cuda:{torch.cuda.current_device()}"
124
+ elif dst_device == "xpu":
125
+ dst_device = f"xpu:{torch.xpu.current_device()}"
126
+ else:
127
+ dst_device = "cpu"
128
+ storage_backends: OrderedDict[str, StorageBackendInterface] = OrderedDict()
129
+ _skip = skip_backends or set()
130
+
131
+ extra_config = config.extra_config
132
+ enable_nixl_storage = extra_config is not None and extra_config.get(
133
+ "enable_nixl_storage"
134
+ )
135
+
136
+ if config.enable_pd and "PDBackend" not in _skip:
137
+ # First Party
138
+ from lmcache.v1.storage_backend.pd_backend import PDBackend
139
+
140
+ storage_backends["PDBackend"] = PDBackend(config, metadata)
141
+
142
+ # TODO(Jiayi): The hierarchy is fixed for now
143
+ # NOTE(Jiayi): The local_cpu backend is always created because
144
+ # other backends might need it as a buffer.
145
+ # Reuse existing LocalCPUBackend when available so that
146
+ # dependent backends (disk, remote, p2p, …) keep working.
147
+ local_cpu_backend: Optional[LocalCPUBackend] = None
148
+ if existing_backends and "LocalCPUBackend" in existing_backends:
149
+ _existing_cpu = existing_backends["LocalCPUBackend"]
150
+ if isinstance(_existing_cpu, LocalCPUBackend):
151
+ local_cpu_backend = _existing_cpu
152
+
153
+ if metadata.role == "scheduler":
154
+ # For scheduler role, local_cpu_backend is None
155
+ pass
156
+ elif not config.enable_pd or config.local_cpu:
157
+ if "LocalCPUBackend" in _skip:
158
+ pass # Skipped — already exists
159
+ elif config.max_local_cpu_size > 0:
160
+ local_cpu_backend = LocalCPUBackend(
161
+ config,
162
+ metadata,
163
+ dst_device,
164
+ lmcache_worker,
165
+ )
166
+ backend_name = str(local_cpu_backend)
167
+ storage_backends[backend_name] = local_cpu_backend
168
+ else:
169
+ logger.info("No cpu memory is allocated as max_local_cpu_size <= 0")
170
+
171
+ if config.enable_p2p and "P2PBackend" not in _skip:
172
+ assert local_cpu_backend is not None
173
+ assert lmcache_worker is not None
174
+ p2p_backend = P2PBackend(
175
+ config,
176
+ metadata,
177
+ loop,
178
+ local_cpu_backend,
179
+ lmcache_worker,
180
+ )
181
+ backend_name = str(p2p_backend)
182
+ storage_backends[backend_name] = p2p_backend
183
+
184
+ if enable_nixl_storage and "NixlStorageBackend" not in _skip:
185
+ # First Party
186
+ from lmcache.v1.storage_backend.nixl_storage_backend import (
187
+ NixlStorageBackend,
188
+ )
189
+
190
+ storage_backends["NixlStorageBackend"] = (
191
+ NixlStorageBackend.CreateNixlStorageBackend(config, loop, metadata)
192
+ )
193
+
194
+ if (
195
+ config.local_disk
196
+ and config.max_local_disk_size > 0
197
+ and "LocalDiskBackend" not in _skip
198
+ ):
199
+ assert local_cpu_backend is not None
200
+ local_disk_backend = LocalDiskBackend(
201
+ config,
202
+ loop,
203
+ local_cpu_backend,
204
+ dst_device,
205
+ lmcache_worker,
206
+ metadata,
207
+ )
208
+
209
+ backend_name = str(local_disk_backend)
210
+ storage_backends[backend_name] = local_disk_backend
211
+
212
+ if config.gds_path is not None and "GdsBackend" not in _skip:
213
+ gds_backend = GdsBackend(
214
+ config,
215
+ metadata,
216
+ loop,
217
+ dst_device,
218
+ )
219
+ storage_backends[str(gds_backend)] = gds_backend
220
+
221
+ if config.maru_path is not None and "MaruBackend" not in _skip:
222
+ try:
223
+ # First Party
224
+ from lmcache.v1.storage_backend.maru_backend import MaruBackend
225
+ except ImportError as e:
226
+ raise ImportError(
227
+ "The 'maru' and 'maru_lmcache' packages are required "
228
+ "to use MaruBackend. Please install them according to "
229
+ "the Maru setup documentation."
230
+ ) from e
231
+
232
+ maru_backend = MaruBackend(config, metadata, loop, dst_device)
233
+ storage_backends[str(maru_backend)] = maru_backend
234
+
235
+ # Handle remote storage plugins (new way)
236
+ if config.remote_storage_plugins and "RemoteBackend" not in _skip:
237
+ for plugin_name in config.remote_storage_plugins:
238
+ assert local_cpu_backend is not None, (
239
+ "Remote backend requires local CPU backend as a buffer."
240
+ "Please turn on local cpu backend with max_local_cpu_size > 0"
241
+ )
242
+ try:
243
+ remote_backend = RemoteBackend(
244
+ config,
245
+ metadata,
246
+ loop,
247
+ local_cpu_backend,
248
+ dst_device,
249
+ plugin_name=plugin_name,
250
+ )
251
+ backend_name = "RemoteBackend-%s" % plugin_name
252
+ storage_backends[backend_name] = remote_backend
253
+ logger.info(
254
+ "Created remote backend for plugin: %s",
255
+ plugin_name,
256
+ )
257
+ except Exception as e:
258
+ logger.error(
259
+ "Failed to create remote backend for plugin %s: %s",
260
+ plugin_name,
261
+ e,
262
+ )
263
+
264
+ # Handle legacy remote_url (deprecated but still supported)
265
+ if config.remote_url is not None and "RemoteBackend" not in _skip:
266
+ # Log deprecation warning
267
+ logger.warning(
268
+ "remote_url is deprecated and will be removed in a future release. "
269
+ "Please use remote_storage_plugins instead."
270
+ )
271
+ remote_backend = RemoteBackend(
272
+ config,
273
+ metadata,
274
+ loop,
275
+ local_cpu_backend,
276
+ dst_device,
277
+ )
278
+ backend_name = str(remote_backend)
279
+ storage_backends[backend_name] = remote_backend
280
+
281
+ if not config.enable_pd or config.local_cpu:
282
+ # Load storage backends from configuration
283
+ storage_plugin_launcher(
284
+ config,
285
+ metadata,
286
+ loop,
287
+ local_cpu_backend,
288
+ dst_device,
289
+ storage_backends,
290
+ )
291
+
292
+ # Only wrap if audit is enabled in config
293
+ if config.extra_config is not None and config.extra_config.get(
294
+ "audit_backend_enabled", False
295
+ ):
296
+ # First Party
297
+ from lmcache.v1.storage_backend.audit_backend import AuditBackend
298
+
299
+ # Conditionally wrap backends with audit logging if enabled in config
300
+ audited_backends: OrderedDict[str, StorageBackendInterface] = OrderedDict()
301
+ for name, backend in storage_backends.items():
302
+ # Wrap each normal backend with AuditBackend
303
+ if not isinstance(backend, LocalCPUBackend):
304
+ audited_backend = AuditBackend(backend)
305
+ audited_backends[name] = audited_backend
306
+ logger.info(f"Wrapped {name} with AuditBackend")
307
+ else:
308
+ audited_backends[name] = backend
309
+ logger.info(f"Do not wrap {name} as it is a LocalCPUBackend")
310
+ return audited_backends
311
+ else:
312
+ # If audit is not enabled, use the original backends
313
+ return storage_backends