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,165 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Standard
3
+ from typing import Literal, Optional
4
+ import os
5
+ import socket
6
+
7
+ # Third Party
8
+ import zmq
9
+ import zmq.asyncio
10
+
11
+ # First Party
12
+ from lmcache.logging import init_logger
13
+
14
+ logger = init_logger(__name__)
15
+
16
+ ServiceKind = Literal["lookup", "offload", "lookup_worker", "lookup_scheduler"]
17
+
18
+ # Default timeout constants for socket operations (in milliseconds)
19
+ DEFAULT_SOCKET_RECV_TIMEOUT_MS = 30000
20
+ DEFAULT_SOCKET_SEND_TIMEOUT_MS = 10000
21
+
22
+
23
+ def get_zmq_context(use_asyncio: bool = True):
24
+ if use_asyncio:
25
+ return zmq.asyncio.Context.instance()
26
+ else:
27
+ return zmq.Context.instance()
28
+
29
+
30
+ def get_zmq_socket(
31
+ context, socket_path: str, protocol: str, role, bind_or_connect: str
32
+ ):
33
+ """
34
+ Create a ZeroMQ socket with the specified protocol and role.
35
+ """
36
+ socket_addr = f"{protocol}://{socket_path}"
37
+ socket = context.socket(role)
38
+ if bind_or_connect == "bind":
39
+ socket.bind(socket_addr)
40
+ elif bind_or_connect == "connect":
41
+ socket.connect(socket_addr)
42
+ else:
43
+ raise ValueError(f"Invalid bind_or_connect: {bind_or_connect}")
44
+
45
+ return socket
46
+
47
+
48
+ def get_zmq_socket_with_timeout(
49
+ context,
50
+ socket_path: str,
51
+ protocol: str,
52
+ role,
53
+ bind_or_connect: str,
54
+ recv_timeout_ms: int,
55
+ send_timeout_ms: int,
56
+ ) -> zmq.asyncio.Socket:
57
+ """
58
+ Create a ZeroMQ socket with timeout settings.
59
+ """
60
+ socket = get_zmq_socket(
61
+ context,
62
+ socket_path,
63
+ protocol,
64
+ role,
65
+ bind_or_connect,
66
+ )
67
+ # Only set RCVTIMEO for client role connect sockets
68
+ if bind_or_connect == "connect":
69
+ socket.setsockopt(zmq.RCVTIMEO, recv_timeout_ms)
70
+ socket.setsockopt(zmq.SNDTIMEO, send_timeout_ms)
71
+ return socket
72
+
73
+
74
+ def close_zmq_socket(socket: zmq.asyncio.Socket, linger: int = 0) -> None:
75
+ """
76
+ Close a ZeroMQ socket cleanly.
77
+
78
+ :param socket: The zmq.Socket to be closed.
79
+ :param linger: LINGER period (in milliseconds).
80
+ Default is 0 (drop immediately).
81
+ """
82
+ try:
83
+ socket.setsockopt(zmq.LINGER, linger) # type: ignore[attr-defined]
84
+ socket.close()
85
+ except Exception as e:
86
+ logger.error(f"Warning: Failed to close socket cleanly: {e}")
87
+
88
+
89
+ def get_ip():
90
+ """
91
+ Get the local IP address of the machine.
92
+ """
93
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
94
+ try:
95
+ # "Connect" to a public IP — just to determine local IP
96
+ s.connect(("8.8.8.8", 80))
97
+ return s.getsockname()[0]
98
+ except Exception:
99
+ logger.warning(
100
+ "Failed to get local IP address. Falling back to loopback address."
101
+ )
102
+ return "127.0.0.1" # Fallback to loopback
103
+ finally:
104
+ s.close()
105
+
106
+
107
+ def get_zmq_rpc_path_lmcache(
108
+ engine_id: str,
109
+ service_name: ServiceKind = "lookup",
110
+ rpc_port: int = 0,
111
+ rank: int = 0,
112
+ base_url: Optional[str] = None,
113
+ ) -> str:
114
+ """Get the ZMQ RPC path for LMCache lookup and offload communication.
115
+
116
+ Args:
117
+ engine_id: The engine ID for the RPC path.
118
+ service_name: The service name, one of 'lookup', 'offload',
119
+ 'lookup_worker', 'lookup_scheduler'.
120
+ rpc_port: The RPC port number.
121
+ rank: The rank of the worker.
122
+ base_url: Optional base URL for the socket path. If not provided,
123
+ will try to use VLLM_RPC_BASE_PATH or fallback to /tmp/vllm_rpc.
124
+
125
+ Returns:
126
+ The ZMQ socket path string.
127
+ """
128
+ if base_url is None:
129
+ # Try to import vllm.envs, fallback to default if not available
130
+ try:
131
+ # Third Party
132
+ import vllm.envs as envs
133
+
134
+ base_url = envs.VLLM_RPC_BASE_PATH
135
+ except (ImportError, ModuleNotFoundError):
136
+ # Fallback for testing environments without vllm
137
+ base_url = "/tmp/vllm_rpc"
138
+ logger.debug("vllm not available, using default base_url: %s", base_url)
139
+ # Ensure the directory exists for IPC socket
140
+ os.makedirs(base_url, exist_ok=True)
141
+
142
+ if service_name not in {"lookup", "offload", "lookup_worker", "lookup_scheduler"}:
143
+ raise ValueError(
144
+ f"service_name must be 'lookup' or 'offload', got {service_name!r}"
145
+ )
146
+
147
+ if isinstance(rpc_port, str):
148
+ rpc_port = rpc_port + str(rank)
149
+ else:
150
+ rpc_port += rank
151
+
152
+ logger.debug(
153
+ "Base URL: %s, Engine: %s, Service Name: %s, RPC Port: %s",
154
+ base_url,
155
+ engine_id,
156
+ service_name,
157
+ rpc_port,
158
+ )
159
+
160
+ socket_path = (
161
+ f"{base_url}/engine_{engine_id}_service_{service_name}_"
162
+ f"lmcache_rpc_port_{rpc_port}"
163
+ )
164
+
165
+ return socket_path
@@ -0,0 +1,2 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+
@@ -0,0 +1,170 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Standard
3
+ import socket
4
+ import threading
5
+ import time
6
+
7
+ # Third Party
8
+ import torch
9
+
10
+ # First Party
11
+ from lmcache.logging import init_logger
12
+ from lmcache.v1.memory_management import MemoryFormat
13
+ from lmcache.v1.protocol import (
14
+ ClientCommand,
15
+ ClientMetaMessage,
16
+ ServerMetaMessage,
17
+ ServerReturnCode,
18
+ )
19
+ from lmcache.v1.server.storage_backend import CreateStorageBackend
20
+
21
+ logger = init_logger(__name__)
22
+
23
+
24
+ class LMCacheServer:
25
+ def __init__(self, host, port, device):
26
+ self.host = host
27
+ self.port = port
28
+ # self.data_store = {}
29
+ self.data_store = CreateStorageBackend(device)
30
+ self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
31
+ self.server_socket.bind((host, port))
32
+ self.server_socket.listen()
33
+
34
+ def receive_all(self, client_socket, n):
35
+ data = bytearray()
36
+ while len(data) < n:
37
+ packet = client_socket.recv(n - len(data))
38
+ if not packet:
39
+ return None
40
+ data.extend(packet)
41
+ return data
42
+
43
+ def handle_client(self, client_socket):
44
+ try:
45
+ while True:
46
+ logger.debug("Waiting for command")
47
+ header = self.receive_all(client_socket, ClientMetaMessage.packlength())
48
+ if not header:
49
+ break
50
+ meta = ClientMetaMessage.deserialize(header)
51
+ logger.debug(f"Received command: {meta.command}")
52
+ match meta.command:
53
+ case ClientCommand.PUT:
54
+ t0 = time.perf_counter()
55
+ s = self.receive_all(client_socket, meta.length)
56
+ t1 = time.perf_counter()
57
+ self.data_store.put(meta, s)
58
+ t2 = time.perf_counter()
59
+ logger.debug(
60
+ f"Time to receive data: {t1 - t0}, time to store "
61
+ f"data: {t2 - t1}"
62
+ )
63
+
64
+ case ClientCommand.GET:
65
+ t0 = time.perf_counter()
66
+ lms_memory_obj = self.data_store.get(meta.key)
67
+ t1 = time.perf_counter()
68
+ if lms_memory_obj is not None:
69
+ client_socket.sendall(
70
+ ServerMetaMessage(
71
+ ServerReturnCode.SUCCESS,
72
+ lms_memory_obj.length,
73
+ lms_memory_obj.fmt,
74
+ lms_memory_obj.dtype,
75
+ lms_memory_obj.shape,
76
+ ).serialize()
77
+ )
78
+ t2 = time.perf_counter()
79
+ client_socket.sendall(lms_memory_obj.data)
80
+ t3 = time.perf_counter()
81
+ logger.debug(
82
+ f"Time to get data: {t1 - t0}, time to send "
83
+ f"meta: {t2 - t1}, time to send data: {t3 - t2}"
84
+ )
85
+ else:
86
+ client_socket.sendall(
87
+ ServerMetaMessage(
88
+ ServerReturnCode.FAIL,
89
+ 0,
90
+ MemoryFormat(1),
91
+ torch.float16,
92
+ torch.Size((0, 0, 0, 0)),
93
+ ).serialize()
94
+ )
95
+
96
+ case ClientCommand.EXIST:
97
+ code = (
98
+ ServerReturnCode.SUCCESS
99
+ if self.data_store.contains(meta.key)
100
+ else ServerReturnCode.FAIL
101
+ )
102
+ logger.debug(f"Key exists: {code}")
103
+ client_socket.sendall(
104
+ ServerMetaMessage(
105
+ code,
106
+ 0,
107
+ MemoryFormat(1),
108
+ torch.float16,
109
+ torch.Size((0, 0, 0, 0)),
110
+ ).serialize()
111
+ )
112
+ case ClientCommand.HEALTH:
113
+ client_socket.sendall(
114
+ ServerMetaMessage(
115
+ ServerReturnCode.SUCCESS,
116
+ 0,
117
+ MemoryFormat(1),
118
+ torch.float16,
119
+ torch.Size((0, 0, 0, 0)),
120
+ ).serialize()
121
+ )
122
+ logger.debug("Health check successful")
123
+
124
+ # TODO(Jiayi): Implement List
125
+ # case ClientCommand.LIST:
126
+ # keys = list(self.data_store.list_keys())
127
+ # data = "\n".join(keys).encode()
128
+ # client_socket.sendall(
129
+ # ServerMetaMessage(ServerReturnCode.SUCCESS,
130
+ # len(data)).serialize())
131
+ # client_socket.sendall(data)
132
+
133
+ finally:
134
+ logger.info("Client disconnected")
135
+ client_socket.close()
136
+
137
+ def run(self):
138
+ logger.info(f"Server started at {self.host}:{self.port}")
139
+ try:
140
+ while True:
141
+ client_socket, addr = self.server_socket.accept()
142
+ logger.info(f"Connected by {addr}")
143
+ threading.Thread(
144
+ target=self.handle_client, args=(client_socket,)
145
+ ).start()
146
+ finally:
147
+ self.server_socket.close()
148
+
149
+
150
+ def main():
151
+ # Standard
152
+ import sys
153
+
154
+ if len(sys.argv) not in [3, 4]:
155
+ logger.error(f"Usage: {sys.argv[0]} <host> <port> <storage>(default:cpu)")
156
+ exit(1)
157
+
158
+ host = sys.argv[1]
159
+ port = int(sys.argv[2])
160
+ if len(sys.argv) == 4:
161
+ device = sys.argv[3]
162
+ else:
163
+ device = "cpu"
164
+
165
+ server = LMCacheServer(host, port, device)
166
+ server.run()
167
+
168
+
169
+ if __name__ == "__main__":
170
+ main()
@@ -0,0 +1,21 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # First Party
3
+ from lmcache.logging import init_logger
4
+ from lmcache.v1.server.storage_backend.abstract_backend import LMSBackendInterface
5
+ from lmcache.v1.server.storage_backend.local_backend import LMSLocalBackend
6
+
7
+ logger = init_logger(__name__)
8
+
9
+
10
+ def CreateStorageBackend(device: str) -> LMSBackendInterface:
11
+ match device:
12
+ case "cpu":
13
+ # cpu only
14
+ logger.info("Initializing cpu-only cache server")
15
+ return LMSLocalBackend()
16
+ case _:
17
+ raise ValueError(f"Unsupported device: {device}")
18
+ # TODO(Jiayi): please implement hierarchical remote storage
19
+ # case _:
20
+ # logger.info("Initializing disk-only cache server")
21
+ # return LMSLocalDiskBackend(path=device)
@@ -0,0 +1,80 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Standard
3
+ from typing import List, Optional
4
+ import abc
5
+
6
+ # First Party
7
+ from lmcache.logging import init_logger
8
+ from lmcache.utils import CacheEngineKey
9
+ from lmcache.v1.protocol import ClientMetaMessage
10
+ from lmcache.v1.server.utils import LMSMemoryObj
11
+
12
+ logger = init_logger(__name__)
13
+
14
+
15
+ class LMSBackendInterface(metaclass=abc.ABCMeta):
16
+ @abc.abstractmethod
17
+ def put(
18
+ self,
19
+ client_meta: ClientMetaMessage,
20
+ kv_chunk_bytes: bytearray,
21
+ ) -> None:
22
+ """
23
+ Store the KV cache of the tokens into the cache server.
24
+
25
+ Args:
26
+ key: the key of the token chunk, in the format of CacheEngineKey
27
+ client_meta: metadata sent by the client
28
+ kv_chunk_bytes: the kv cache (bytearray) of the token chunk
29
+
30
+ Returns:
31
+ None
32
+ """
33
+ raise NotImplementedError
34
+
35
+ @abc.abstractmethod
36
+ def contains(
37
+ self,
38
+ key: CacheEngineKey,
39
+ ) -> bool:
40
+ """
41
+ Query if a key is in the cache or not
42
+ """
43
+ raise NotImplementedError
44
+
45
+ @abc.abstractmethod
46
+ def get(
47
+ self,
48
+ key: CacheEngineKey,
49
+ ) -> Optional[LMSMemoryObj]:
50
+ """
51
+ Retrieve LMSMemoryObj by the given key
52
+
53
+ Input:
54
+ key: the CacheEngineKey
55
+
56
+ Output:
57
+ An LMSMemoryObj object that contains the KV cache bytearray
58
+ with the some metadata
59
+ """
60
+ raise NotImplementedError
61
+
62
+ @abc.abstractmethod
63
+ def list_keys(
64
+ self,
65
+ ) -> List[CacheEngineKey]:
66
+ """
67
+ List all keys in the cache server
68
+
69
+ Output:
70
+ All keys in the cache server
71
+ """
72
+ raise NotImplementedError
73
+
74
+ @abc.abstractmethod
75
+ def close(self):
76
+ """
77
+ Do the cleanup things
78
+ Children classes should override this method if necessary
79
+ """
80
+ pass
@@ -0,0 +1,75 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Standard
3
+ from collections import OrderedDict
4
+ from typing import List, Optional
5
+ import threading
6
+
7
+ # First Party
8
+ from lmcache.logging import init_logger
9
+ from lmcache.utils import CacheEngineKey, _lmcache_nvtx_annotate
10
+ from lmcache.v1.protocol import ClientMetaMessage
11
+ from lmcache.v1.server.storage_backend.abstract_backend import LMSBackendInterface
12
+ from lmcache.v1.server.utils import LMSMemoryObj
13
+
14
+ logger = init_logger(__name__)
15
+
16
+
17
+ class LMSLocalBackend(LMSBackendInterface):
18
+ def __init__(
19
+ self,
20
+ ) -> None:
21
+ self.dict: OrderedDict[CacheEngineKey, LMSMemoryObj] = OrderedDict()
22
+
23
+ self.lock = threading.Lock()
24
+
25
+ # TODO(Jiayi): please add evictor
26
+
27
+ # TODO
28
+ def list_keys(self) -> List[CacheEngineKey]:
29
+ with self.lock:
30
+ return list(self.dict.keys())
31
+
32
+ def contains(
33
+ self,
34
+ key: CacheEngineKey,
35
+ ) -> bool:
36
+ with self.lock:
37
+ return key in self.dict
38
+
39
+ # TODO
40
+ def remove(
41
+ self,
42
+ key: CacheEngineKey,
43
+ ) -> None:
44
+ with self.lock:
45
+ self.dict.pop(key)
46
+
47
+ def put(
48
+ self,
49
+ client_meta: ClientMetaMessage,
50
+ kv_chunk_bytes: bytearray,
51
+ ) -> None:
52
+ with self.lock:
53
+ self.dict[client_meta.key] = LMSMemoryObj(
54
+ kv_chunk_bytes,
55
+ client_meta.length,
56
+ client_meta.fmt,
57
+ client_meta.dtype,
58
+ client_meta.shape,
59
+ )
60
+
61
+ @_lmcache_nvtx_annotate
62
+ def get(
63
+ self,
64
+ key: CacheEngineKey,
65
+ ) -> Optional[LMSMemoryObj]:
66
+ with self.lock:
67
+ return self.dict.get(key, None)
68
+
69
+ def close(self):
70
+ pass
71
+
72
+
73
+ # TODO(Jiayi): please implement the remote disk backend
74
+ # class LMSLocalDiskBackend(LMSBackendInterface):
75
+ # pass
@@ -0,0 +1,21 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Standard
3
+ from dataclasses import dataclass
4
+ from typing import Optional
5
+
6
+ # Third Party
7
+ import torch
8
+
9
+ # First Party
10
+ from lmcache.v1.memory_management import MemoryFormat
11
+
12
+
13
+ # TODO(Jiayi): Maybe move the memory management in remote
14
+ # cache server to `memory_management.py` as well.
15
+ @dataclass
16
+ class LMSMemoryObj:
17
+ data: bytearray
18
+ length: int
19
+ fmt: MemoryFormat
20
+ dtype: Optional[torch.dtype]
21
+ shape: torch.Size
@@ -0,0 +1 @@
1
+ # SPDX-License-Identifier: Apache-2.0