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,417 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Standard
3
+ from dataclasses import dataclass
4
+ from datetime import datetime
5
+ from pathlib import Path
6
+ from typing import TYPE_CHECKING, Optional
7
+ from urllib.parse import urljoin
8
+ import importlib.metadata
9
+ import os
10
+ import platform
11
+ import subprocess
12
+ import threading
13
+
14
+ # Third Party
15
+ import cpuinfo
16
+ import psutil
17
+ import requests
18
+ import torch
19
+
20
+ # First Party
21
+ from lmcache.connections import global_http_connection
22
+ from lmcache.logging import init_logger
23
+ from lmcache.v1.config import LMCacheEngineConfig
24
+ from lmcache.v1.metadata import LMCacheMetadata
25
+
26
+ if TYPE_CHECKING:
27
+ # First Party
28
+ from lmcache.observability import LMCacheStats
29
+
30
+ # Standard
31
+ from typing import List
32
+ import dataclasses
33
+ import time
34
+
35
+ # Third Party
36
+ import numpy as np
37
+
38
+ logger = init_logger(__name__)
39
+
40
+
41
+ class EnvMessage:
42
+ def __init__(
43
+ self,
44
+ provider,
45
+ num_cpu,
46
+ cpu_type,
47
+ cpu_family_model_stepping,
48
+ total_memory,
49
+ architecture,
50
+ platforms,
51
+ gpu_count,
52
+ gpu_type,
53
+ gpu_memory_per_device,
54
+ source,
55
+ ):
56
+ self.provider = provider
57
+ self.num_cpu = num_cpu
58
+ self.cpu_type = cpu_type
59
+ self.cpu_family_model_stepping = cpu_family_model_stepping
60
+ self.total_memory = total_memory
61
+ self.architecture = architecture
62
+ self.platforms = platforms
63
+ self.gpu_count = gpu_count
64
+ self.gpu_type = gpu_type
65
+ self.gpu_memory_per_device = gpu_memory_per_device
66
+ self.source = source
67
+
68
+
69
+ class EngineMessage:
70
+ def __init__(self, config: LMCacheEngineConfig, metadata: LMCacheMetadata):
71
+ self.chunksize = config.chunk_size
72
+ self.local_device = "cpu" if config.local_cpu else "cuda"
73
+ self.max_local_cache_size = int(config.max_local_cpu_size)
74
+ self.remote_url = config.remote_url
75
+ self.remote_serde = config.remote_serde
76
+ self.pipelined_backend = False
77
+ self.save_decode_cache = config.save_decode_cache
78
+ self.enable_blending = config.enable_blending
79
+ self.blend_recompute_ratio = 0.15
80
+ self.blend_min_tokens = config.blend_min_tokens
81
+ self.model_name = metadata.model_name
82
+ self.world_size = metadata.world_size
83
+ self.worker_id = metadata.worker_id
84
+ self.kv_dtype = metadata.kv_dtype
85
+ self.kv_shape = metadata.kv_shape
86
+
87
+
88
+ class MetadataMessage:
89
+ def __init__(self, start_time, duration):
90
+ self.start_time = start_time
91
+ self.duration = duration
92
+
93
+
94
+ @dataclass
95
+ # follows naming convention in usage_context.py
96
+ class ContinuousContextMessage:
97
+ interval_num_stored_tokens: int
98
+ interval_num_hit_tokens: int
99
+ interval_stored_kv_size: int
100
+ message_type: str = "ContinuousContextMessage"
101
+
102
+
103
+ class UsageContext:
104
+ def __init__(
105
+ self,
106
+ server_url: str,
107
+ config: LMCacheEngineConfig,
108
+ metadata: LMCacheMetadata,
109
+ local_log: Optional[str] = None,
110
+ ):
111
+ self.server_url = server_url
112
+ self.config = config
113
+ self.metadata = metadata
114
+ self.start_time = datetime.now()
115
+ self.local_log = local_log
116
+
117
+ self.send_env_message()
118
+ self.send_engine_message()
119
+ t = threading.Thread(target=self.send_metadata_message)
120
+ t.start()
121
+
122
+ def send_message_server(self, msg, message_type):
123
+ msg.message_type = message_type
124
+ try:
125
+ global_http_client = global_http_connection.get_sync_client()
126
+ data = dict()
127
+ for key, value in msg.__dict__.items():
128
+ if isinstance(value, torch.dtype):
129
+ data[key] = str(value)
130
+ else:
131
+ data[key] = value
132
+ if self.server_url is not None:
133
+ logger.debug("context message updated")
134
+ global_http_client.post(self.server_url, json=data, timeout=5)
135
+ except requests.exceptions.RequestException:
136
+ logger.debug("Unable to send lmcache context message")
137
+
138
+ def send_message_local(self, msg, message_type):
139
+ if self.local_log is None:
140
+ return
141
+ msg.message_type = message_type
142
+ message = ""
143
+ for key, value in msg.__dict__.items():
144
+ message += "{}: {}\n".format(key, value)
145
+ message += "\n"
146
+ with open(self.local_log, "a") as f:
147
+ f.write(message)
148
+
149
+ def send_env_message(self):
150
+ env_message = self.track_env()
151
+ self.send_message_server(env_message, "EnvMessage")
152
+ self.send_message_local(env_message, "EnvMessage")
153
+
154
+ def send_engine_message(self):
155
+ engine_message = self.track_engine()
156
+ self.send_message_server(engine_message, "EngineMessage")
157
+ self.send_message_local(engine_message, "EngineMessage")
158
+
159
+ def send_metadata_message(self):
160
+ metadata_message = self.track_metadata()
161
+ self.send_message_server(metadata_message, "MetadataMessage")
162
+ self.send_message_local(metadata_message, "MetadataMessage")
163
+
164
+ def track_env(self):
165
+ provider = self._get_provider()
166
+ num_cpu, cpu_type, cpu_family_model_stepping = self._get_cpu_info()
167
+ total_memory = psutil.virtual_memory().total
168
+ architecture = platform.architecture()
169
+ platforms = platform.platform()
170
+ gpu_count, gpu_type, gpu_memory_per_device = self._get_gpu_info()
171
+ source = self._get_source()
172
+ env_message = EnvMessage(
173
+ provider,
174
+ num_cpu,
175
+ cpu_type,
176
+ cpu_family_model_stepping,
177
+ total_memory,
178
+ architecture,
179
+ platforms,
180
+ gpu_count,
181
+ gpu_type,
182
+ gpu_memory_per_device,
183
+ source,
184
+ )
185
+ return env_message
186
+
187
+ def track_engine(self):
188
+ engine_message = EngineMessage(self.config, self.metadata)
189
+ return engine_message
190
+
191
+ def track_metadata(self):
192
+ start_time = self.start_time.strftime("%Y-%m-%d %H:%M:%S")
193
+ interval = datetime.now() - self.start_time
194
+ duration = interval.total_seconds()
195
+ return MetadataMessage(start_time, duration)
196
+
197
+ def _get_provider(self):
198
+ vendor_files = [
199
+ "/sys/class/dmi/id/product_version",
200
+ "/sys/class/dmi/id/bios_vendor",
201
+ "/sys/class/dmi/id/product_name",
202
+ "/sys/class/dmi/id/chassis_asset_tag",
203
+ "/sys/class/dmi/id/sys_vendor",
204
+ ]
205
+ # Mapping of identifiable strings to cloud providers
206
+ cloud_identifiers = {
207
+ "amazon": "AWS",
208
+ "microsoft corporation": "AZURE",
209
+ "google": "GCP",
210
+ "oraclecloud": "OCI",
211
+ }
212
+
213
+ for vendor_file in vendor_files:
214
+ path = Path(vendor_file)
215
+ if path.is_file():
216
+ file_content = path.read_text().lower()
217
+ for identifier, provider in cloud_identifiers.items():
218
+ if identifier in file_content:
219
+ return provider
220
+
221
+ # Try detecting through environment variables
222
+ env_to_cloud_provider = {
223
+ "RUNPOD_DC_ID": "RUNPOD",
224
+ }
225
+ for env_var, provider in env_to_cloud_provider.items():
226
+ if os.environ.get(env_var):
227
+ return provider
228
+
229
+ return "UNKNOWN"
230
+
231
+ def _get_cpu_info(self):
232
+ info = cpuinfo.get_cpu_info()
233
+ num_cpu = info.get("count", None)
234
+ cpu_type = info.get("brand_raw", "")
235
+ cpu_family_model_stepping = ",".join(
236
+ [
237
+ str(info.get("family", "")),
238
+ str(info.get("model", "")),
239
+ str(info.get("stepping", "")),
240
+ ]
241
+ )
242
+ return num_cpu, cpu_type, cpu_family_model_stepping
243
+
244
+ def _get_gpu_info(self):
245
+ if torch.cuda.is_available():
246
+ device_property = torch.cuda.get_device_properties(0)
247
+ gpu_count = torch.cuda.device_count()
248
+ gpu_type = device_property.name
249
+ gpu_memory_per_device = device_property.total_memory
250
+ elif torch.xpu.is_available():
251
+ device_property = torch.xpu.get_device_properties(0)
252
+ gpu_count = torch.xpu.device_count()
253
+ gpu_type = device_property.name
254
+ gpu_memory_per_device = device_property.total_memory
255
+ elif hasattr(torch, "hpu") and torch.hpu.is_available():
256
+ device_property = torch.hpu.get_device_properties(0)
257
+ gpu_count = torch.hpu.device_count()
258
+ gpu_type = device_property.name
259
+ gpu_memory_per_device = device_property.total_memory
260
+ else:
261
+ gpu_count = psutil.cpu_count(logical=False)
262
+ gpu_type = platform.processor()
263
+ gpu_memory_per_device = psutil.virtual_memory()
264
+ return gpu_count, gpu_type, gpu_memory_per_device
265
+
266
+ def _get_source(self):
267
+ path = "/proc/1/cgroup"
268
+ if os.path.exists(path):
269
+ with open(path, "r") as f:
270
+ for line in f:
271
+ if "docker" in line:
272
+ return "DOCKER"
273
+ try:
274
+ _ = importlib.metadata.distribution("LMCache")
275
+ return "PIP"
276
+ except importlib.metadata.PackageNotFoundError:
277
+ pass
278
+ try:
279
+ result = subprocess.run(
280
+ ["conda", "list", "LMCache"], capture_output=True, text=True
281
+ )
282
+ if "LMCache" in result.stdout:
283
+ return "CONDA"
284
+ except FileNotFoundError:
285
+ pass
286
+
287
+ return "UNKNOWN"
288
+
289
+
290
+ class ContinuousUsageContext:
291
+ _instance = None
292
+
293
+ def __init__(self, metadata: LMCacheMetadata):
294
+ self.cache_lifespan_buckets = [
295
+ 0,
296
+ 1,
297
+ 5,
298
+ 10,
299
+ 20,
300
+ 40,
301
+ 60,
302
+ 80,
303
+ 100,
304
+ 250,
305
+ 500,
306
+ 750,
307
+ 1000,
308
+ 2500,
309
+ 5000,
310
+ ]
311
+ self.metadata: LMCacheMetadata = metadata
312
+ self.cache_usage_url: str = urljoin(
313
+ os.getenv("LMCACHE_USAGE_TRACK_URL", "http://stats.lmcache.ai:8080"),
314
+ "cache-usage",
315
+ )
316
+ self.cache_lifespan_url: str = urljoin(
317
+ os.getenv("LMCACHE_USAGE_TRACK_URL", "http://stats.lmcache.ai:8080"),
318
+ "cache-lifespan",
319
+ )
320
+ self.min_logging_interval: int = int(
321
+ os.getenv("LMCACHE_USAGE_TRACK_INTERVAL", "600")
322
+ )
323
+ # send the first message immediately after init
324
+ self.last_logged_ts: float = -1
325
+
326
+ self.interval_num_hit_tokens: int = 0
327
+ self.interval_num_stored_tokens: int = 0
328
+ self.kv_sz_per_token_bytes: int = int(
329
+ np.prod(self.metadata.kv_shape)
330
+ * self.metadata.kv_dtype.itemsize
331
+ / self.metadata.kv_shape[2]
332
+ )
333
+ self.cache_lifespan_data: List[float] = []
334
+
335
+ @staticmethod
336
+ def GetOrCreate(metadata: LMCacheMetadata) -> "ContinuousUsageContext":
337
+ if ContinuousUsageContext._instance is None:
338
+ ContinuousUsageContext._instance = ContinuousUsageContext(metadata)
339
+ if ContinuousUsageContext._instance.metadata != metadata:
340
+ logger.error(
341
+ "ContinuousUsageContext instance already created with"
342
+ "different metadata. This should not happen except "
343
+ "in test."
344
+ )
345
+ return ContinuousUsageContext._instance
346
+
347
+ def send_caching_message(self):
348
+ msg: ContinuousContextMessage = ContinuousContextMessage(
349
+ interval_stored_kv_size=int(
350
+ self.kv_sz_per_token_bytes * self.interval_num_stored_tokens
351
+ ),
352
+ interval_num_hit_tokens=int(self.interval_num_hit_tokens),
353
+ interval_num_stored_tokens=int(self.interval_num_stored_tokens),
354
+ )
355
+ try:
356
+ global_http_client = global_http_connection.get_sync_client()
357
+ if self.cache_usage_url is not None:
358
+ logger.debug("caching usage message sent.")
359
+ global_http_client.post(
360
+ f"{self.cache_usage_url}", json=dataclasses.asdict(msg), timeout=5
361
+ )
362
+
363
+ self.interval_num_hit_tokens = 0
364
+ self.interval_num_stored_tokens = 0
365
+ except Exception as e:
366
+ logger.debug(f"Unable to send lmcache caching usage message: {e}")
367
+ try:
368
+ histogram_data = self.list_to_histogram(
369
+ self.cache_lifespan_data, self.cache_lifespan_buckets
370
+ )
371
+ global_http_client = global_http_connection.get_sync_client()
372
+ if self.cache_lifespan_url is not None:
373
+ global_http_client.post(
374
+ f"{self.cache_lifespan_url}", json=histogram_data, timeout=5
375
+ )
376
+ logger.debug("caching lifespan message sent.")
377
+ self.cache_lifespan_data = []
378
+ except Exception as e:
379
+ logger.debug(f"Unable to send lmcache caching lifespan message: {e}")
380
+
381
+ def list_to_histogram(self, data: List[float], buckets: List[float]) -> dict:
382
+ histogram, _ = np.histogram(data, bins=buckets)
383
+ histogram = list(histogram)
384
+ histogram.insert(0, 0)
385
+ output_histogram = {
386
+ bucket: int(count)
387
+ for bucket, count in zip(buckets, histogram, strict=False)
388
+ }
389
+ return output_histogram
390
+
391
+ def incr_or_send_stats(self, stats: "LMCacheStats"):
392
+ # no-ops when user disable usage tracking
393
+ self.cache_lifespan_data.extend(stats.interval_request_cache_lifespan)
394
+ if os.getenv("LMCACHE_TRACK_USAGE") == "false":
395
+ return None
396
+ self.interval_num_hit_tokens += stats.interval_hit_tokens
397
+ self.interval_num_stored_tokens += stats.interval_stored_tokens
398
+
399
+ cur_ts: float = time.monotonic()
400
+ if cur_ts - self.last_logged_ts >= self.min_logging_interval:
401
+ self.send_caching_message()
402
+ self.last_logged_ts = cur_ts
403
+
404
+
405
+ def InitializeUsageContext(
406
+ config: LMCacheEngineConfig,
407
+ metadata: LMCacheMetadata,
408
+ local_log: Optional[str] = None,
409
+ ):
410
+ server_url = urljoin(
411
+ os.getenv("LMCACHE_USAGE_TRACK_URL", "http://stats.lmcache.ai:8080"), "context"
412
+ )
413
+ if os.getenv("LMCACHE_TRACK_USAGE") == "false":
414
+ return None
415
+ else:
416
+ logger.info("Initializing usage context.")
417
+ return UsageContext(server_url, config, metadata, local_log)