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.
- lmcache/__init__.py +84 -0
- lmcache/_version.py +24 -0
- lmcache/cli/__init__.py +1 -0
- lmcache/cli/commands/__init__.py +34 -0
- lmcache/cli/commands/base.py +157 -0
- lmcache/cli/commands/bench/__init__.py +557 -0
- lmcache/cli/commands/bench/engine_bench/__init__.py +1 -0
- lmcache/cli/commands/bench/engine_bench/config.py +245 -0
- lmcache/cli/commands/bench/engine_bench/interactive/__init__.py +274 -0
- lmcache/cli/commands/bench/engine_bench/interactive/config.json +10 -0
- lmcache/cli/commands/bench/engine_bench/interactive/schema.py +352 -0
- lmcache/cli/commands/bench/engine_bench/interactive/state.py +327 -0
- lmcache/cli/commands/bench/engine_bench/interactive/terminal.py +291 -0
- lmcache/cli/commands/bench/engine_bench/progress.py +145 -0
- lmcache/cli/commands/bench/engine_bench/request_sender.py +232 -0
- lmcache/cli/commands/bench/engine_bench/stats.py +275 -0
- lmcache/cli/commands/bench/engine_bench/workloads/__init__.py +153 -0
- lmcache/cli/commands/bench/engine_bench/workloads/base.py +122 -0
- lmcache/cli/commands/bench/engine_bench/workloads/long_doc_permutator.py +435 -0
- lmcache/cli/commands/bench/engine_bench/workloads/long_doc_qa.py +281 -0
- lmcache/cli/commands/bench/engine_bench/workloads/multi_round_chat.py +337 -0
- lmcache/cli/commands/bench/engine_bench/workloads/random_prefill.py +178 -0
- lmcache/cli/commands/describe.py +310 -0
- lmcache/cli/commands/kvcache.py +133 -0
- lmcache/cli/commands/mock.py +75 -0
- lmcache/cli/commands/ping.py +113 -0
- lmcache/cli/commands/query/__init__.py +155 -0
- lmcache/cli/commands/query/prompt.py +134 -0
- lmcache/cli/commands/query/request.py +357 -0
- lmcache/cli/commands/server.py +99 -0
- lmcache/cli/commands/tool/__init__.py +63 -0
- lmcache/cli/commands/tool/cache_simulator.py +113 -0
- lmcache/cli/commands/trace/__init__.py +505 -0
- lmcache/cli/commands/trace/dispatch.py +249 -0
- lmcache/cli/commands/trace/driver.py +372 -0
- lmcache/cli/commands/trace/stats.py +289 -0
- lmcache/cli/documents/lmcache.txt +11 -0
- lmcache/cli/main.py +42 -0
- lmcache/cli/metrics/__init__.py +29 -0
- lmcache/cli/metrics/formatter.py +171 -0
- lmcache/cli/metrics/handler.py +94 -0
- lmcache/cli/metrics/metrics.py +161 -0
- lmcache/cli/metrics/section.py +77 -0
- lmcache/connections.py +173 -0
- lmcache/integration/__init__.py +2 -0
- lmcache/integration/base_service_factory.py +165 -0
- lmcache/integration/request_telemetry/__init__.py +1 -0
- lmcache/integration/request_telemetry/base.py +51 -0
- lmcache/integration/request_telemetry/factory.py +113 -0
- lmcache/integration/request_telemetry/fastapi.py +109 -0
- lmcache/integration/request_telemetry/noop.py +35 -0
- lmcache/integration/sglang/__init__.py +2 -0
- lmcache/integration/sglang/sglang_adapter.py +326 -0
- lmcache/integration/sglang/utils.py +39 -0
- lmcache/integration/vllm/__init__.py +1 -0
- lmcache/integration/vllm/lmcache_connector_v1.py +213 -0
- lmcache/integration/vllm/lmcache_connector_v1_085.py +150 -0
- lmcache/integration/vllm/lmcache_mp_connector_0180.py +1072 -0
- lmcache/integration/vllm/tests/test_mm_hash_utils.py +112 -0
- lmcache/integration/vllm/utils.py +433 -0
- lmcache/integration/vllm/vllm_multi_process_adapter.py +1090 -0
- lmcache/integration/vllm/vllm_service_factory.py +339 -0
- lmcache/integration/vllm/vllm_v1_adapter.py +1713 -0
- lmcache/logging.py +107 -0
- lmcache/native_storage_ops.pyi +230 -0
- lmcache/non_cuda_equivalents.py +1424 -0
- lmcache/observability.py +1958 -0
- lmcache/storage_backend/serde/__init__.py +1 -0
- lmcache/storage_backend/serde/cachegen_basics.py +210 -0
- lmcache/storage_backend/serde/cachegen_decoder.py +207 -0
- lmcache/storage_backend/serde/cachegen_encoder.py +394 -0
- lmcache/storage_backend/serde/serde.py +75 -0
- lmcache/tools/__init__.py +1 -0
- lmcache/tools/cache_simulator/README.md +392 -0
- lmcache/tools/cache_simulator/__init__.py +1 -0
- lmcache/tools/cache_simulator/docs/simulate_example.png +0 -0
- lmcache/tools/cache_simulator/docs/sweep_example.png +0 -0
- lmcache/tools/cache_simulator/gen_bench_dataset.py +360 -0
- lmcache/tools/cache_simulator/lru_cache.py +124 -0
- lmcache/tools/cache_simulator/plot_hit_rate.py +231 -0
- lmcache/tools/cache_simulator/simulator.py +795 -0
- lmcache/tools/controller_benchmark/README.md +161 -0
- lmcache/tools/controller_benchmark/__init__.py +1 -0
- lmcache/tools/controller_benchmark/__main__.py +331 -0
- lmcache/tools/controller_benchmark/benchmark.py +660 -0
- lmcache/tools/controller_benchmark/config.py +44 -0
- lmcache/tools/controller_benchmark/constants.py +10 -0
- lmcache/tools/controller_benchmark/handlers/__init__.py +46 -0
- lmcache/tools/controller_benchmark/handlers/admit.py +52 -0
- lmcache/tools/controller_benchmark/handlers/base.py +47 -0
- lmcache/tools/controller_benchmark/handlers/deregister.py +49 -0
- lmcache/tools/controller_benchmark/handlers/evict.py +52 -0
- lmcache/tools/controller_benchmark/handlers/heartbeat.py +56 -0
- lmcache/tools/controller_benchmark/handlers/p2p_lookup.py +47 -0
- lmcache/tools/controller_benchmark/handlers/register.py +56 -0
- lmcache/tools/mp_status_viewer/__init__.py +1 -0
- lmcache/tools/mp_status_viewer/__main__.py +95 -0
- lmcache/usage_context.py +417 -0
- lmcache/utils.py +665 -0
- lmcache/v1/__init__.py +2 -0
- lmcache/v1/api_server/__init__.py +2 -0
- lmcache/v1/api_server/__main__.py +537 -0
- lmcache/v1/basic_check.py +112 -0
- lmcache/v1/cache_controller/__init__.py +9 -0
- lmcache/v1/cache_controller/commands/__init__.py +15 -0
- lmcache/v1/cache_controller/commands/base.py +35 -0
- lmcache/v1/cache_controller/commands/full_sync.py +49 -0
- lmcache/v1/cache_controller/config.py +176 -0
- lmcache/v1/cache_controller/controller_manager.py +535 -0
- lmcache/v1/cache_controller/controllers/__init__.py +11 -0
- lmcache/v1/cache_controller/controllers/full_sync_tracker.py +473 -0
- lmcache/v1/cache_controller/controllers/kv_controller.py +439 -0
- lmcache/v1/cache_controller/controllers/registration_controller.py +282 -0
- lmcache/v1/cache_controller/executor.py +463 -0
- lmcache/v1/cache_controller/frontend/static/css/style.css +201 -0
- lmcache/v1/cache_controller/frontend/static/img/logo.png +0 -0
- lmcache/v1/cache_controller/frontend/static/index.html +234 -0
- lmcache/v1/cache_controller/frontend/static/js/controller_app.js +660 -0
- lmcache/v1/cache_controller/full_sync_sender.py +475 -0
- lmcache/v1/cache_controller/locks.py +149 -0
- lmcache/v1/cache_controller/message.py +828 -0
- lmcache/v1/cache_controller/observability.py +208 -0
- lmcache/v1/cache_controller/utils.py +679 -0
- lmcache/v1/cache_controller/worker.py +665 -0
- lmcache/v1/cache_engine.py +2058 -0
- lmcache/v1/cache_interface.py +19 -0
- lmcache/v1/check/__init__.py +74 -0
- lmcache/v1/check/check_mode_gen.py +86 -0
- lmcache/v1/check/check_mode_test_l2_adapter.py +284 -0
- lmcache/v1/check/check_mode_test_remote.py +155 -0
- lmcache/v1/check/check_mode_test_storage_manager.py +142 -0
- lmcache/v1/check/utils.py +571 -0
- lmcache/v1/compute/__init__.py +2 -0
- lmcache/v1/compute/attention/__init__.py +0 -0
- lmcache/v1/compute/attention/abstract.py +39 -0
- lmcache/v1/compute/attention/flash_attn.py +129 -0
- lmcache/v1/compute/attention/flash_infer_sparse.py +284 -0
- lmcache/v1/compute/attention/metadata.py +85 -0
- lmcache/v1/compute/attention/utils.py +14 -0
- lmcache/v1/compute/blend/__init__.py +7 -0
- lmcache/v1/compute/blend/blender.py +168 -0
- lmcache/v1/compute/blend/metadata.py +34 -0
- lmcache/v1/compute/blend/utils.py +63 -0
- lmcache/v1/compute/models/__init__.py +0 -0
- lmcache/v1/compute/models/base.py +141 -0
- lmcache/v1/compute/models/llama.py +9 -0
- lmcache/v1/compute/models/qwen3.py +24 -0
- lmcache/v1/compute/models/utils.py +68 -0
- lmcache/v1/compute/positional_encoding.py +199 -0
- lmcache/v1/config.py +848 -0
- lmcache/v1/config_base.py +848 -0
- lmcache/v1/distributed/api.py +248 -0
- lmcache/v1/distributed/config.py +321 -0
- lmcache/v1/distributed/error.py +64 -0
- lmcache/v1/distributed/eviction.py +192 -0
- lmcache/v1/distributed/eviction_policy/__init__.py +21 -0
- lmcache/v1/distributed/eviction_policy/factory.py +27 -0
- lmcache/v1/distributed/eviction_policy/lru.py +244 -0
- lmcache/v1/distributed/eviction_policy/noop.py +50 -0
- lmcache/v1/distributed/internal_api.py +170 -0
- lmcache/v1/distributed/l1_manager.py +835 -0
- lmcache/v1/distributed/l2_adapters/__init__.py +67 -0
- lmcache/v1/distributed/l2_adapters/base.py +360 -0
- lmcache/v1/distributed/l2_adapters/config.py +385 -0
- lmcache/v1/distributed/l2_adapters/factory.py +205 -0
- lmcache/v1/distributed/l2_adapters/fs_l2_adapter.py +747 -0
- lmcache/v1/distributed/l2_adapters/fs_native_l2_adapter.py +167 -0
- lmcache/v1/distributed/l2_adapters/mock_l2_adapter.py +516 -0
- lmcache/v1/distributed/l2_adapters/mooncake_store_l2_adapter.py +135 -0
- lmcache/v1/distributed/l2_adapters/native_connector_l2_adapter.py +468 -0
- lmcache/v1/distributed/l2_adapters/native_plugin_l2_adapter.py +199 -0
- lmcache/v1/distributed/l2_adapters/nixl_store_dynamic_l2_adapter.py +831 -0
- lmcache/v1/distributed/l2_adapters/nixl_store_l2_adapter.py +983 -0
- lmcache/v1/distributed/l2_adapters/plugin_l2_adapter.py +210 -0
- lmcache/v1/distributed/l2_adapters/resp_l2_adapter.py +176 -0
- lmcache/v1/distributed/memory_manager.py +179 -0
- lmcache/v1/distributed/storage_controller.py +39 -0
- lmcache/v1/distributed/storage_controllers/__init__.py +43 -0
- lmcache/v1/distributed/storage_controllers/eviction_controller.py +242 -0
- lmcache/v1/distributed/storage_controllers/prefetch_controller.py +830 -0
- lmcache/v1/distributed/storage_controllers/prefetch_policy.py +193 -0
- lmcache/v1/distributed/storage_controllers/store_controller.py +452 -0
- lmcache/v1/distributed/storage_controllers/store_policy.py +213 -0
- lmcache/v1/distributed/storage_manager.py +532 -0
- lmcache/v1/event_manager.py +145 -0
- lmcache/v1/exceptions/__init__.py +16 -0
- lmcache/v1/gpu_connector/__init__.py +126 -0
- lmcache/v1/gpu_connector/gpu_connectors.py +1906 -0
- lmcache/v1/gpu_connector/gpu_ops.py +85 -0
- lmcache/v1/gpu_connector/hpu_connector.py +326 -0
- lmcache/v1/gpu_connector/mock_gpu_connector.py +67 -0
- lmcache/v1/gpu_connector/utils.py +890 -0
- lmcache/v1/gpu_connector/xpu_connectors.py +916 -0
- lmcache/v1/health_monitor/__init__.py +1 -0
- lmcache/v1/health_monitor/base.py +587 -0
- lmcache/v1/health_monitor/checks/__init__.py +1 -0
- lmcache/v1/health_monitor/checks/remote_backend_check.py +304 -0
- lmcache/v1/health_monitor/constants.py +36 -0
- lmcache/v1/internal_api_server/__init__.py +0 -0
- lmcache/v1/internal_api_server/api_registry.py +59 -0
- lmcache/v1/internal_api_server/api_server.py +120 -0
- lmcache/v1/internal_api_server/common/__init__.py +1 -0
- lmcache/v1/internal_api_server/common/env_api.py +22 -0
- lmcache/v1/internal_api_server/common/loglevel_api.py +57 -0
- lmcache/v1/internal_api_server/common/metrics_api.py +29 -0
- lmcache/v1/internal_api_server/common/periodic_thread_api.py +138 -0
- lmcache/v1/internal_api_server/common/run_script_api.py +73 -0
- lmcache/v1/internal_api_server/common/thread_api.py +63 -0
- lmcache/v1/internal_api_server/controller/__init__.py +1 -0
- lmcache/v1/internal_api_server/controller/key_stats_api.py +81 -0
- lmcache/v1/internal_api_server/controller/worker_info_api.py +136 -0
- lmcache/v1/internal_api_server/utils.py +43 -0
- lmcache/v1/internal_api_server/vllm/__init__.py +1 -0
- lmcache/v1/internal_api_server/vllm/backend_api.py +221 -0
- lmcache/v1/internal_api_server/vllm/bypass_api.py +204 -0
- lmcache/v1/internal_api_server/vllm/cache_api.py +895 -0
- lmcache/v1/internal_api_server/vllm/chunk_statistics_api.py +141 -0
- lmcache/v1/internal_api_server/vllm/conf_api.py +147 -0
- lmcache/v1/internal_api_server/vllm/freeze_api.py +172 -0
- lmcache/v1/internal_api_server/vllm/hot_cache_api.py +184 -0
- lmcache/v1/internal_api_server/vllm/inference_api.py +65 -0
- lmcache/v1/internal_api_server/vllm/load_fs_chunks_api.py +320 -0
- lmcache/v1/internal_api_server/vllm/lookup_api.py +145 -0
- lmcache/v1/internal_api_server/vllm/version_api.py +25 -0
- lmcache/v1/kv_layer_groups.py +267 -0
- lmcache/v1/lazy_memory_allocator.py +284 -0
- lmcache/v1/lookup_client/__init__.py +25 -0
- lmcache/v1/lookup_client/abstract_client.py +77 -0
- lmcache/v1/lookup_client/async_lookup_message.py +50 -0
- lmcache/v1/lookup_client/chunk_statistics_lookup_client.py +200 -0
- lmcache/v1/lookup_client/factory.py +251 -0
- lmcache/v1/lookup_client/hit_limit_lookup_client.py +86 -0
- lmcache/v1/lookup_client/lmcache_async_lookup_client.py +407 -0
- lmcache/v1/lookup_client/lmcache_lookup_client.py +285 -0
- lmcache/v1/lookup_client/lmcache_lookup_client_bypass.py +99 -0
- lmcache/v1/lookup_client/mooncake_lookup_client.py +87 -0
- lmcache/v1/lookup_client/record_strategies/__init__.py +77 -0
- lmcache/v1/lookup_client/record_strategies/base.py +327 -0
- lmcache/v1/lookup_client/record_strategies/file_hash.py +130 -0
- lmcache/v1/lookup_client/record_strategies/memory_bloom_filter.py +81 -0
- lmcache/v1/manager.py +539 -0
- lmcache/v1/memory_management.py +2619 -0
- lmcache/v1/metadata.py +114 -0
- lmcache/v1/mp_observability/AGENTS.override.md +21 -0
- lmcache/v1/mp_observability/README.md +204 -0
- lmcache/v1/mp_observability/config.py +340 -0
- lmcache/v1/mp_observability/event.py +100 -0
- lmcache/v1/mp_observability/event_bus.py +313 -0
- lmcache/v1/mp_observability/otel_init.py +145 -0
- lmcache/v1/mp_observability/subscribers/__init__.py +28 -0
- lmcache/v1/mp_observability/subscribers/logging/__init__.py +19 -0
- lmcache/v1/mp_observability/subscribers/logging/l1.py +56 -0
- lmcache/v1/mp_observability/subscribers/logging/l2.py +73 -0
- lmcache/v1/mp_observability/subscribers/logging/lookup_hash.py +209 -0
- lmcache/v1/mp_observability/subscribers/logging/mp_server.py +90 -0
- lmcache/v1/mp_observability/subscribers/logging/sm.py +59 -0
- lmcache/v1/mp_observability/subscribers/metrics/__init__.py +20 -0
- lmcache/v1/mp_observability/subscribers/metrics/l0_lifecycle.py +290 -0
- lmcache/v1/mp_observability/subscribers/metrics/l1.py +55 -0
- lmcache/v1/mp_observability/subscribers/metrics/l1_lifecycle.py +166 -0
- lmcache/v1/mp_observability/subscribers/metrics/l2.py +121 -0
- lmcache/v1/mp_observability/subscribers/metrics/sm.py +69 -0
- lmcache/v1/mp_observability/subscribers/tracing/__init__.py +12 -0
- lmcache/v1/mp_observability/subscribers/tracing/mp_server.py +333 -0
- lmcache/v1/mp_observability/subscribers/tracing/span_registry.py +148 -0
- lmcache/v1/mp_observability/trace/__init__.py +50 -0
- lmcache/v1/mp_observability/trace/codecs.py +255 -0
- lmcache/v1/mp_observability/trace/decorator.py +147 -0
- lmcache/v1/mp_observability/trace/format.py +132 -0
- lmcache/v1/mp_observability/trace/lifecycle.py +83 -0
- lmcache/v1/mp_observability/trace/reader.py +167 -0
- lmcache/v1/mp_observability/trace/recorder.py +300 -0
- lmcache/v1/multiprocess/__init__.py +0 -0
- lmcache/v1/multiprocess/affinity_pool.py +102 -0
- lmcache/v1/multiprocess/blend_server_v2.py +891 -0
- lmcache/v1/multiprocess/config.py +253 -0
- lmcache/v1/multiprocess/custom_types.py +281 -0
- lmcache/v1/multiprocess/futures.py +194 -0
- lmcache/v1/multiprocess/gpu_context.py +511 -0
- lmcache/v1/multiprocess/http_server.py +235 -0
- lmcache/v1/multiprocess/mp_runtime_plugin_launcher.py +130 -0
- lmcache/v1/multiprocess/mq.py +732 -0
- lmcache/v1/multiprocess/protocol.py +86 -0
- lmcache/v1/multiprocess/protocols/README.md +213 -0
- lmcache/v1/multiprocess/protocols/__init__.py +127 -0
- lmcache/v1/multiprocess/protocols/base.py +89 -0
- lmcache/v1/multiprocess/protocols/blend.py +109 -0
- lmcache/v1/multiprocess/protocols/blend_v2.py +57 -0
- lmcache/v1/multiprocess/protocols/controller.py +53 -0
- lmcache/v1/multiprocess/protocols/debug.py +34 -0
- lmcache/v1/multiprocess/protocols/engine.py +146 -0
- lmcache/v1/multiprocess/protocols/observability.py +39 -0
- lmcache/v1/multiprocess/server.py +1134 -0
- lmcache/v1/multiprocess/session.py +190 -0
- lmcache/v1/multiprocess/token_hasher.py +441 -0
- lmcache/v1/offload_server/__init__.py +17 -0
- lmcache/v1/offload_server/abstract_server.py +37 -0
- lmcache/v1/offload_server/message.py +30 -0
- lmcache/v1/offload_server/zmq_server.py +122 -0
- lmcache/v1/periodic_thread.py +579 -0
- lmcache/v1/pin_monitor.py +246 -0
- lmcache/v1/plugin/__init__.py +0 -0
- lmcache/v1/plugin/runtime_plugin_launcher.py +211 -0
- lmcache/v1/protocol.py +317 -0
- lmcache/v1/rpc/__init__.py +17 -0
- lmcache/v1/rpc/transport.py +105 -0
- lmcache/v1/rpc/zmq_transport.py +213 -0
- lmcache/v1/rpc_utils.py +165 -0
- lmcache/v1/server/__init__.py +2 -0
- lmcache/v1/server/__main__.py +170 -0
- lmcache/v1/server/storage_backend/__init__.py +21 -0
- lmcache/v1/server/storage_backend/abstract_backend.py +80 -0
- lmcache/v1/server/storage_backend/local_backend.py +75 -0
- lmcache/v1/server/utils.py +21 -0
- lmcache/v1/standalone/__init__.py +1 -0
- lmcache/v1/standalone/__main__.py +583 -0
- lmcache/v1/standalone/manager.py +80 -0
- lmcache/v1/standalone/standalone_service_factory.py +86 -0
- lmcache/v1/storage_backend/__init__.py +313 -0
- lmcache/v1/storage_backend/abstract_backend.py +445 -0
- lmcache/v1/storage_backend/audit_backend.py +233 -0
- lmcache/v1/storage_backend/batched_message_sender.py +222 -0
- lmcache/v1/storage_backend/cache_policy/__init__.py +45 -0
- lmcache/v1/storage_backend/cache_policy/base_policy.py +87 -0
- lmcache/v1/storage_backend/cache_policy/fifo.py +58 -0
- lmcache/v1/storage_backend/cache_policy/lfu.py +105 -0
- lmcache/v1/storage_backend/cache_policy/lru.py +81 -0
- lmcache/v1/storage_backend/cache_policy/mru.py +61 -0
- lmcache/v1/storage_backend/connector/__init__.py +443 -0
- lmcache/v1/storage_backend/connector/audit_adapter.py +77 -0
- lmcache/v1/storage_backend/connector/audit_connector.py +320 -0
- lmcache/v1/storage_backend/connector/base_connector.py +379 -0
- lmcache/v1/storage_backend/connector/blackhole_adapter.py +21 -0
- lmcache/v1/storage_backend/connector/blackhole_connector.py +37 -0
- lmcache/v1/storage_backend/connector/eic_adapter.py +31 -0
- lmcache/v1/storage_backend/connector/eic_connector.py +757 -0
- lmcache/v1/storage_backend/connector/external_adapter.py +79 -0
- lmcache/v1/storage_backend/connector/fs_adapter.py +51 -0
- lmcache/v1/storage_backend/connector/fs_connector.py +403 -0
- lmcache/v1/storage_backend/connector/infinistore_adapter.py +56 -0
- lmcache/v1/storage_backend/connector/infinistore_connector.py +177 -0
- lmcache/v1/storage_backend/connector/instrumented_connector.py +219 -0
- lmcache/v1/storage_backend/connector/lm_adapter.py +31 -0
- lmcache/v1/storage_backend/connector/lm_connector.py +176 -0
- lmcache/v1/storage_backend/connector/mock_adapter.py +57 -0
- lmcache/v1/storage_backend/connector/mock_connector.py +349 -0
- lmcache/v1/storage_backend/connector/mooncakestore_adapter.py +43 -0
- lmcache/v1/storage_backend/connector/mooncakestore_connector.py +614 -0
- lmcache/v1/storage_backend/connector/redis_adapter.py +181 -0
- lmcache/v1/storage_backend/connector/redis_connector.py +828 -0
- lmcache/v1/storage_backend/connector/s3_adapter.py +59 -0
- lmcache/v1/storage_backend/connector/s3_connector.py +699 -0
- lmcache/v1/storage_backend/connector/sagemaker_hyperpod_adapter.py +233 -0
- lmcache/v1/storage_backend/connector/sagemaker_hyperpod_connector.py +987 -0
- lmcache/v1/storage_backend/connector/valkey_adapter.py +114 -0
- lmcache/v1/storage_backend/connector/valkey_connector.py +627 -0
- lmcache/v1/storage_backend/gds_backend.py +1199 -0
- lmcache/v1/storage_backend/job_executor/__init__.py +0 -0
- lmcache/v1/storage_backend/job_executor/base_executor.py +34 -0
- lmcache/v1/storage_backend/job_executor/pq_executor.py +235 -0
- lmcache/v1/storage_backend/local_cpu_backend.py +810 -0
- lmcache/v1/storage_backend/local_disk_backend.py +656 -0
- lmcache/v1/storage_backend/maru_backend.py +734 -0
- lmcache/v1/storage_backend/naive_serde/__init__.py +50 -0
- lmcache/v1/storage_backend/naive_serde/cachegen_basics.py +133 -0
- lmcache/v1/storage_backend/naive_serde/cachegen_decoder.py +135 -0
- lmcache/v1/storage_backend/naive_serde/cachegen_encoder.py +83 -0
- lmcache/v1/storage_backend/naive_serde/kivi_serde.py +22 -0
- lmcache/v1/storage_backend/naive_serde/naive_serde.py +18 -0
- lmcache/v1/storage_backend/naive_serde/serde.py +37 -0
- lmcache/v1/storage_backend/native_clients/connector_client_base.py +165 -0
- lmcache/v1/storage_backend/native_clients/resp_client.py +35 -0
- lmcache/v1/storage_backend/nixl_storage_backend.py +1400 -0
- lmcache/v1/storage_backend/p2p_backend.py +788 -0
- lmcache/v1/storage_backend/path_sharder.py +117 -0
- lmcache/v1/storage_backend/pd_backend.py +646 -0
- lmcache/v1/storage_backend/plugins/dax_backend.py +1443 -0
- lmcache/v1/storage_backend/plugins/rust_raw_block_backend.py +1361 -0
- lmcache/v1/storage_backend/remote_backend.py +624 -0
- lmcache/v1/storage_backend/resp_client.py +227 -0
- lmcache/v1/storage_backend/storage_backend_listener.py +19 -0
- lmcache/v1/storage_backend/storage_manager.py +1352 -0
- lmcache/v1/system_detection.py +110 -0
- lmcache/v1/token_database.py +551 -0
- lmcache/v1/transfer_channel/__init__.py +83 -0
- lmcache/v1/transfer_channel/abstract.py +285 -0
- lmcache/v1/transfer_channel/mock_memory_channel.py +156 -0
- lmcache/v1/transfer_channel/nixl_channel.py +639 -0
- lmcache/v1/transfer_channel/py_socket_channel.py +260 -0
- lmcache/v1/transfer_channel/transfer_utils.py +63 -0
- lmcache/v1/utils/__init__.py +1 -0
- lmcache/v1/utils/bloom_filter.py +109 -0
- lmcache/v1/utils/cache_utils.py +125 -0
- lmcache_cli-0.4.5.dev0.dist-info/METADATA +185 -0
- lmcache_cli-0.4.5.dev0.dist-info/RECORD +399 -0
- lmcache_cli-0.4.5.dev0.dist-info/WHEEL +5 -0
- lmcache_cli-0.4.5.dev0.dist-info/entry_points.txt +2 -0
- lmcache_cli-0.4.5.dev0.dist-info/licenses/LICENSE +201 -0
- lmcache_cli-0.4.5.dev0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Standard
|
|
3
|
+
from contextlib import asynccontextmanager
|
|
4
|
+
import argparse
|
|
5
|
+
|
|
6
|
+
# Third Party
|
|
7
|
+
from fastapi import FastAPI, Request
|
|
8
|
+
from fastapi.responses import JSONResponse
|
|
9
|
+
import torch
|
|
10
|
+
import uvicorn
|
|
11
|
+
|
|
12
|
+
# First Party
|
|
13
|
+
from lmcache.logging import init_logger
|
|
14
|
+
from lmcache.v1.distributed.config import (
|
|
15
|
+
StorageManagerConfig,
|
|
16
|
+
add_storage_manager_args,
|
|
17
|
+
parse_args_to_config,
|
|
18
|
+
)
|
|
19
|
+
from lmcache.v1.mp_observability.config import (
|
|
20
|
+
ObservabilityConfig,
|
|
21
|
+
add_observability_args,
|
|
22
|
+
parse_args_to_observability_config,
|
|
23
|
+
)
|
|
24
|
+
from lmcache.v1.mp_observability.event_bus import get_event_bus
|
|
25
|
+
from lmcache.v1.multiprocess.config import (
|
|
26
|
+
HTTPFrontendConfig,
|
|
27
|
+
MPServerConfig,
|
|
28
|
+
add_http_frontend_args,
|
|
29
|
+
add_mp_server_args,
|
|
30
|
+
parse_args_to_http_frontend_config,
|
|
31
|
+
parse_args_to_mp_server_config,
|
|
32
|
+
)
|
|
33
|
+
from lmcache.v1.multiprocess.mp_runtime_plugin_launcher import (
|
|
34
|
+
MPRuntimePluginLauncher,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
logger = init_logger(__name__)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# Module-level config holders, set by run_http_server() before FastAPI startup.
|
|
41
|
+
# Stored in a dict so the lifespan closure captures the mutable container.
|
|
42
|
+
_configs: dict = {}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# ----------------------------
|
|
46
|
+
# FastAPI lifespan for initialization and cleanup
|
|
47
|
+
# ----------------------------
|
|
48
|
+
@asynccontextmanager
|
|
49
|
+
async def lifespan(app: FastAPI):
|
|
50
|
+
"""
|
|
51
|
+
Manage the lifecycle of the LMCache HTTP server.
|
|
52
|
+
|
|
53
|
+
On startup: Initialize ZMQ server and cache engine.
|
|
54
|
+
On shutdown: Clean up ZMQ server resources.
|
|
55
|
+
"""
|
|
56
|
+
# Startup
|
|
57
|
+
logger.info(
|
|
58
|
+
"Starting LMCache HTTP server... (CUDA available: %s)",
|
|
59
|
+
torch.cuda.is_available(),
|
|
60
|
+
)
|
|
61
|
+
mp_config = _configs["mp"]
|
|
62
|
+
if mp_config.engine_type == "blend":
|
|
63
|
+
# First Party
|
|
64
|
+
from lmcache.v1.multiprocess.blend_server_v2 import run_cache_server
|
|
65
|
+
else:
|
|
66
|
+
# First Party
|
|
67
|
+
from lmcache.v1.multiprocess.server import run_cache_server
|
|
68
|
+
|
|
69
|
+
result = run_cache_server(
|
|
70
|
+
mp_config=mp_config,
|
|
71
|
+
storage_manager_config=_configs["storage_manager"],
|
|
72
|
+
obs_config=_configs["observability"],
|
|
73
|
+
return_engine=True,
|
|
74
|
+
)
|
|
75
|
+
assert result is not None, "run_cache_server returned None with return_engine=True"
|
|
76
|
+
zmq_server, engine = result
|
|
77
|
+
|
|
78
|
+
# Launch runtime plugins if configured. Plugins receive the full
|
|
79
|
+
# server config (including HTTP host/port) via the
|
|
80
|
+
# LMCACHE_RUNTIME_PLUGIN_CONFIG environment variable.
|
|
81
|
+
plugin_launcher = None
|
|
82
|
+
if mp_config.runtime_plugin_config.locations:
|
|
83
|
+
extra_kwargs = {}
|
|
84
|
+
http_config = _configs.get("http")
|
|
85
|
+
if http_config is not None:
|
|
86
|
+
extra_kwargs["http_config"] = http_config
|
|
87
|
+
plugin_launcher = MPRuntimePluginLauncher(
|
|
88
|
+
runtime_plugin_config=mp_config.runtime_plugin_config,
|
|
89
|
+
mp_config=mp_config,
|
|
90
|
+
storage_manager_config=_configs["storage_manager"],
|
|
91
|
+
obs_config=_configs["observability"],
|
|
92
|
+
**extra_kwargs,
|
|
93
|
+
)
|
|
94
|
+
plugin_launcher.launch_plugins()
|
|
95
|
+
|
|
96
|
+
app.state.zmq_server = zmq_server
|
|
97
|
+
app.state.engine = engine
|
|
98
|
+
app.state.plugin_launcher = plugin_launcher
|
|
99
|
+
logger.info("LMCache HTTP server initialized")
|
|
100
|
+
|
|
101
|
+
yield
|
|
102
|
+
|
|
103
|
+
# Shutdown
|
|
104
|
+
logger.info("Shutting down LMCache HTTP server...")
|
|
105
|
+
launcher = getattr(app.state, "plugin_launcher", None)
|
|
106
|
+
if launcher is not None:
|
|
107
|
+
launcher.stop_plugins()
|
|
108
|
+
get_event_bus().stop()
|
|
109
|
+
if hasattr(app.state, "zmq_server") and app.state.zmq_server is not None:
|
|
110
|
+
app.state.zmq_server.close()
|
|
111
|
+
logger.info("LMCache HTTP server stopped")
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
app = FastAPI(title="LMCache HTTP API", version="1.0.0", lifespan=lifespan)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
@app.get("/")
|
|
118
|
+
async def root():
|
|
119
|
+
return {"status": "ok", "service": "LMCache HTTP API"}
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
@app.get("/api/healthcheck")
|
|
123
|
+
async def healthcheck(request: Request):
|
|
124
|
+
"""
|
|
125
|
+
Health check endpoint for k8s liveness/readiness probes.
|
|
126
|
+
|
|
127
|
+
Checks:
|
|
128
|
+
- HTTP server is alive (implicit: if you get a response)
|
|
129
|
+
- Cache engine is alive
|
|
130
|
+
"""
|
|
131
|
+
engine = getattr(request.app.state, "engine", None)
|
|
132
|
+
if engine is None:
|
|
133
|
+
return JSONResponse(
|
|
134
|
+
status_code=503,
|
|
135
|
+
content={"status": "unhealthy", "reason": "engine not initialized"},
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
return {"status": "healthy"}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
@app.post("/api/clear-cache")
|
|
142
|
+
async def clear_cache(request: Request):
|
|
143
|
+
"""
|
|
144
|
+
Force-clear all KV cache data stored in L1 (CPU) memory.
|
|
145
|
+
|
|
146
|
+
This clears all objects including those with active read/write locks.
|
|
147
|
+
In-flight store or prefetch operations may be corrupted.
|
|
148
|
+
"""
|
|
149
|
+
engine = getattr(request.app.state, "engine", None)
|
|
150
|
+
if engine is None:
|
|
151
|
+
return JSONResponse(
|
|
152
|
+
status_code=503,
|
|
153
|
+
content={"status": "error", "reason": "engine not initialized"},
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
engine.clear()
|
|
157
|
+
logger.info("Cache cleared via HTTP API")
|
|
158
|
+
return {"status": "ok"}
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
@app.get("/api/status")
|
|
162
|
+
async def status(request: Request):
|
|
163
|
+
"""
|
|
164
|
+
Detailed status endpoint for inspecting internal state of all
|
|
165
|
+
MP components (L1 cache, L2 adapters, controllers, sessions).
|
|
166
|
+
"""
|
|
167
|
+
engine = getattr(request.app.state, "engine", None)
|
|
168
|
+
if engine is None:
|
|
169
|
+
return JSONResponse(
|
|
170
|
+
status_code=503,
|
|
171
|
+
content={"error": "engine not initialized"},
|
|
172
|
+
)
|
|
173
|
+
return engine.report_status()
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def run_http_server(
|
|
177
|
+
http_config: HTTPFrontendConfig,
|
|
178
|
+
mp_config: MPServerConfig,
|
|
179
|
+
storage_manager_config: StorageManagerConfig,
|
|
180
|
+
obs_config: ObservabilityConfig,
|
|
181
|
+
) -> None:
|
|
182
|
+
"""
|
|
183
|
+
Run the LMCache HTTP server with integrated MP (ZMQ) server.
|
|
184
|
+
|
|
185
|
+
Args:
|
|
186
|
+
http_config: Configuration for the HTTP frontend
|
|
187
|
+
mp_config: Configuration for the ZMQ multiprocess server
|
|
188
|
+
storage_manager_config: Configuration for the storage manager
|
|
189
|
+
obs_config: Configuration for the observability stack
|
|
190
|
+
"""
|
|
191
|
+
_configs["mp"] = mp_config
|
|
192
|
+
_configs["storage_manager"] = storage_manager_config
|
|
193
|
+
_configs["observability"] = obs_config
|
|
194
|
+
_configs["http"] = http_config
|
|
195
|
+
|
|
196
|
+
config = uvicorn.Config(
|
|
197
|
+
app=app,
|
|
198
|
+
host=http_config.http_host,
|
|
199
|
+
port=http_config.http_port,
|
|
200
|
+
log_level="info",
|
|
201
|
+
access_log=True,
|
|
202
|
+
)
|
|
203
|
+
server = uvicorn.Server(config)
|
|
204
|
+
|
|
205
|
+
logger.info(
|
|
206
|
+
"Starting LMCache HTTP server on http://%s:%d",
|
|
207
|
+
http_config.http_host,
|
|
208
|
+
http_config.http_port,
|
|
209
|
+
)
|
|
210
|
+
server.run()
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def parse_args():
|
|
214
|
+
parser = argparse.ArgumentParser(
|
|
215
|
+
description="LMCache HTTP Server with integrated MP Cache Server"
|
|
216
|
+
)
|
|
217
|
+
add_http_frontend_args(parser)
|
|
218
|
+
add_mp_server_args(parser)
|
|
219
|
+
add_storage_manager_args(parser)
|
|
220
|
+
add_observability_args(parser)
|
|
221
|
+
return parser.parse_args()
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
if __name__ == "__main__":
|
|
225
|
+
args = parse_args()
|
|
226
|
+
http_config = parse_args_to_http_frontend_config(args)
|
|
227
|
+
mp_config = parse_args_to_mp_server_config(args)
|
|
228
|
+
storage_manager_config = parse_args_to_config(args)
|
|
229
|
+
obs_config = parse_args_to_observability_config(args)
|
|
230
|
+
run_http_server(
|
|
231
|
+
http_config=http_config,
|
|
232
|
+
mp_config=mp_config,
|
|
233
|
+
storage_manager_config=storage_manager_config,
|
|
234
|
+
obs_config=obs_config,
|
|
235
|
+
)
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Runtime plugin launcher for multiprocess (MP) mode.
|
|
5
|
+
|
|
6
|
+
Unlike the non-MP RuntimePluginLauncher which receives a single
|
|
7
|
+
LMCacheEngineConfig, the MP mode has multiple independent config
|
|
8
|
+
dataclasses (MPServerConfig, StorageManagerConfig,
|
|
9
|
+
ObservabilityConfig, etc.). This launcher aggregates them all
|
|
10
|
+
into a single JSON blob so plugins get the full server config
|
|
11
|
+
via the LMCACHE_RUNTIME_PLUGIN_CONFIG environment variable.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
# Standard
|
|
15
|
+
from dataclasses import asdict, dataclass
|
|
16
|
+
from typing import TYPE_CHECKING, Any
|
|
17
|
+
import json
|
|
18
|
+
|
|
19
|
+
# First Party
|
|
20
|
+
from lmcache.logging import init_logger
|
|
21
|
+
from lmcache.v1.plugin.runtime_plugin_launcher import (
|
|
22
|
+
RuntimePluginLauncher,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
# First Party
|
|
27
|
+
from lmcache.v1.multiprocess.config import (
|
|
28
|
+
RuntimePluginConfig,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
logger = init_logger(__name__)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _safe_asdict(obj: Any) -> dict[str, Any]:
|
|
35
|
+
"""Convert a dataclass to dict, falling back to str()
|
|
36
|
+
for non-serializable fields."""
|
|
37
|
+
# Verify it's a dataclass instance at runtime
|
|
38
|
+
if not hasattr(obj, "__dataclass_fields__"):
|
|
39
|
+
raise TypeError("Expected a dataclass instance, got %s" % type(obj).__name__)
|
|
40
|
+
raw = asdict(obj)
|
|
41
|
+
return _make_json_safe(raw) # type: ignore[return-value]
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _make_json_safe(obj: Any) -> Any:
|
|
45
|
+
"""Recursively ensure all values are JSON-serializable."""
|
|
46
|
+
if isinstance(obj, dict):
|
|
47
|
+
return {k: _make_json_safe(v) for k, v in obj.items()}
|
|
48
|
+
if isinstance(obj, (list, tuple)):
|
|
49
|
+
return [_make_json_safe(v) for v in obj]
|
|
50
|
+
if isinstance(obj, (str, int, float, bool, type(None))):
|
|
51
|
+
return obj
|
|
52
|
+
# Fallback: convert to string representation
|
|
53
|
+
return str(obj)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass
|
|
57
|
+
class _MPPluginConfig:
|
|
58
|
+
"""Thin wrapper that satisfies RuntimePluginLauncher's
|
|
59
|
+
config duck-type contract (runtime_plugin_locations +
|
|
60
|
+
to_json)."""
|
|
61
|
+
|
|
62
|
+
runtime_plugin_locations: list[str]
|
|
63
|
+
extra_config: dict[str, Any]
|
|
64
|
+
configs_dict: dict[str, Any]
|
|
65
|
+
|
|
66
|
+
def to_json(self) -> str:
|
|
67
|
+
merged = dict(self.configs_dict)
|
|
68
|
+
if self.extra_config:
|
|
69
|
+
merged["runtime_plugin_extra_config"] = _make_json_safe(self.extra_config)
|
|
70
|
+
return json.dumps(merged)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class MPRuntimePluginLauncher:
|
|
74
|
+
"""Launch runtime plugins in MP mode with all server
|
|
75
|
+
configs serialized into the environment.
|
|
76
|
+
|
|
77
|
+
Usage::
|
|
78
|
+
|
|
79
|
+
launcher = MPRuntimePluginLauncher(
|
|
80
|
+
runtime_plugin_config=runtime_plugin_config,
|
|
81
|
+
mp_config=mp_config,
|
|
82
|
+
storage_manager_config=sm_config,
|
|
83
|
+
obs_config=obs_config,
|
|
84
|
+
)
|
|
85
|
+
launcher.launch_plugins()
|
|
86
|
+
# ... on shutdown ...
|
|
87
|
+
launcher.stop_plugins()
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
def __init__(
|
|
91
|
+
self,
|
|
92
|
+
runtime_plugin_config: "RuntimePluginConfig",
|
|
93
|
+
**configs: object,
|
|
94
|
+
) -> None:
|
|
95
|
+
"""Initialize the MP runtime plugin launcher.
|
|
96
|
+
|
|
97
|
+
Aggregates arbitrary dataclass configs into a single
|
|
98
|
+
JSON blob and delegates to RuntimePluginLauncher.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
runtime_plugin_config: RuntimePluginConfig with
|
|
102
|
+
locations and extra_config fields.
|
|
103
|
+
**configs: Dataclass config objects to serialize
|
|
104
|
+
and pass to plugins via environment variable.
|
|
105
|
+
"""
|
|
106
|
+
# Build the aggregated JSON dict from all configs
|
|
107
|
+
aggregated: dict = {}
|
|
108
|
+
for name, cfg in configs.items():
|
|
109
|
+
aggregated[name] = _safe_asdict(cfg)
|
|
110
|
+
|
|
111
|
+
wrapper = _MPPluginConfig(
|
|
112
|
+
runtime_plugin_locations=runtime_plugin_config.locations,
|
|
113
|
+
extra_config=getattr(runtime_plugin_config, "extra_config", {}),
|
|
114
|
+
configs_dict=aggregated,
|
|
115
|
+
)
|
|
116
|
+
self._inner = RuntimePluginLauncher(
|
|
117
|
+
config=wrapper,
|
|
118
|
+
role=None,
|
|
119
|
+
worker_count=1,
|
|
120
|
+
worker_id=0,
|
|
121
|
+
)
|
|
122
|
+
logger.info(f"MPRuntimePluginLauncher initialized with {wrapper}")
|
|
123
|
+
|
|
124
|
+
def launch_plugins(self) -> None:
|
|
125
|
+
"""Launch all configured plugins."""
|
|
126
|
+
self._inner.launch_plugins()
|
|
127
|
+
|
|
128
|
+
def stop_plugins(self) -> None:
|
|
129
|
+
"""Terminate all plugin processes."""
|
|
130
|
+
self._inner.stop_plugins()
|