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
lmcache/v1/manager.py
ADDED
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
"""
|
|
3
|
+
LMCacheManager: A unified manager for LMCache internal components.
|
|
4
|
+
|
|
5
|
+
This module provides a clean interface to manage LMCache components lifecycle,
|
|
6
|
+
decoupling the vLLM adapter from internal LMCache implementation details.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
# Standard
|
|
10
|
+
from concurrent.futures import ThreadPoolExecutor, TimeoutError
|
|
11
|
+
from typing import TYPE_CHECKING, Any, Optional, Union
|
|
12
|
+
import time
|
|
13
|
+
import traceback
|
|
14
|
+
|
|
15
|
+
# Third Party
|
|
16
|
+
import torch
|
|
17
|
+
|
|
18
|
+
# First Party
|
|
19
|
+
from lmcache.integration.base_service_factory import BaseServiceFactory
|
|
20
|
+
from lmcache.logging import init_logger
|
|
21
|
+
from lmcache.v1.cache_engine import LMCacheEngine, LMCacheEngineBuilder
|
|
22
|
+
from lmcache.v1.config import LMCacheEngineConfig
|
|
23
|
+
from lmcache.v1.health_monitor.base import HealthMonitor
|
|
24
|
+
from lmcache.v1.internal_api_server.api_server import InternalAPIServer
|
|
25
|
+
from lmcache.v1.lookup_client.abstract_client import LookupClientInterface
|
|
26
|
+
from lmcache.v1.metadata import LMCacheMetadata
|
|
27
|
+
from lmcache.v1.offload_server.zmq_server import ZMQOffloadServer
|
|
28
|
+
from lmcache.v1.plugin.runtime_plugin_launcher import RuntimePluginLauncher
|
|
29
|
+
|
|
30
|
+
if TYPE_CHECKING:
|
|
31
|
+
# First Party
|
|
32
|
+
from lmcache.v1.lookup_client.lmcache_async_lookup_client import (
|
|
33
|
+
LMCacheAsyncLookupServer,
|
|
34
|
+
)
|
|
35
|
+
from lmcache.v1.lookup_client.lmcache_lookup_client import LMCacheLookupServer
|
|
36
|
+
|
|
37
|
+
logger = init_logger(__name__)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class LMCacheManager:
|
|
41
|
+
"""
|
|
42
|
+
LMCacheManager manages the lifecycle of LMCache internal components.
|
|
43
|
+
|
|
44
|
+
For an integration to utilize the Manager, define a ServiceFactory
|
|
45
|
+
that determines which components to create for which workers.
|
|
46
|
+
|
|
47
|
+
This class encapsulates the initialization and shutdown of:
|
|
48
|
+
- LMCacheEngine
|
|
49
|
+
- LookupClient / LookupServer
|
|
50
|
+
- OffloadServer
|
|
51
|
+
- InternalAPIServer
|
|
52
|
+
- RuntimePluginLauncher
|
|
53
|
+
- HealthMonitor
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
def __init__(
|
|
57
|
+
self,
|
|
58
|
+
config: LMCacheEngineConfig,
|
|
59
|
+
service_factory: BaseServiceFactory,
|
|
60
|
+
connector: Optional[Any] = None,
|
|
61
|
+
):
|
|
62
|
+
"""
|
|
63
|
+
Initialize LMCacheManager.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
config: LMCache engine configuration
|
|
67
|
+
service_factory: Factory for creating service components
|
|
68
|
+
role: The role string ("scheduler" or "worker")
|
|
69
|
+
connector: Reference to LMCacheConnectorV1Impl for internal
|
|
70
|
+
API server
|
|
71
|
+
"""
|
|
72
|
+
self._config = config
|
|
73
|
+
self._service_factory = service_factory
|
|
74
|
+
self._connector: Any = connector
|
|
75
|
+
|
|
76
|
+
# Flag to track if initialization failed
|
|
77
|
+
self._init_failed = False
|
|
78
|
+
self._init_failed_reason: str = ""
|
|
79
|
+
|
|
80
|
+
self._health_monitor: Optional[HealthMonitor] = None
|
|
81
|
+
self._lmcache_engine_metadata: Optional[LMCacheMetadata] = None
|
|
82
|
+
self._lmcache_engine: Optional[LMCacheEngine] = None
|
|
83
|
+
self._lookup_client: Optional[LookupClientInterface] = None
|
|
84
|
+
self._lookup_server: Optional[
|
|
85
|
+
Union["LMCacheLookupServer", "LMCacheAsyncLookupServer"]
|
|
86
|
+
] = None
|
|
87
|
+
self._offload_server: Optional[ZMQOffloadServer] = None
|
|
88
|
+
self._runtime_plugin_launcher: Optional[RuntimePluginLauncher] = None
|
|
89
|
+
self._api_server: Optional[InternalAPIServer] = None
|
|
90
|
+
|
|
91
|
+
# Initialize components via service factory
|
|
92
|
+
try:
|
|
93
|
+
self._lmcache_engine_metadata = service_factory.get_or_create_metadata()
|
|
94
|
+
self._lmcache_engine = service_factory.get_or_create_lmcache_engine()
|
|
95
|
+
self._lookup_client = service_factory.maybe_create_lookup_client()
|
|
96
|
+
self._lookup_server = service_factory.maybe_create_lookup_server()
|
|
97
|
+
self._offload_server = service_factory.maybe_create_offload_server()
|
|
98
|
+
self._runtime_plugin_launcher = (
|
|
99
|
+
service_factory.maybe_create_runtime_plugin_launcher()
|
|
100
|
+
)
|
|
101
|
+
self._api_server = service_factory.maybe_create_internal_api_server(
|
|
102
|
+
lmcache_manager=self
|
|
103
|
+
)
|
|
104
|
+
except Exception as e:
|
|
105
|
+
self._init_failed = True
|
|
106
|
+
self._init_failed_reason = "".join(traceback.format_exception(e))
|
|
107
|
+
logger.error(
|
|
108
|
+
"Failed to initialize LMCacheManager components: %s. "
|
|
109
|
+
"System will operate in degraded mode (recompute).",
|
|
110
|
+
self._init_failed_reason,
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
# ==================== Property Accessors ====================
|
|
114
|
+
|
|
115
|
+
@property
|
|
116
|
+
def lmcache_engine(self) -> Optional[LMCacheEngine]:
|
|
117
|
+
"""Get the LMCache engine instance."""
|
|
118
|
+
return self._lmcache_engine
|
|
119
|
+
|
|
120
|
+
@property
|
|
121
|
+
def lmcache_engine_metadata(self) -> Optional[LMCacheMetadata]:
|
|
122
|
+
"""Get the LMCache engine metadata."""
|
|
123
|
+
return self._lmcache_engine_metadata
|
|
124
|
+
|
|
125
|
+
@property
|
|
126
|
+
def lookup_client(self) -> Optional[LookupClientInterface]:
|
|
127
|
+
"""Get the lookup client instance."""
|
|
128
|
+
return self._lookup_client
|
|
129
|
+
|
|
130
|
+
@property
|
|
131
|
+
def lookup_server(
|
|
132
|
+
self,
|
|
133
|
+
) -> Optional[Union["LMCacheLookupServer", "LMCacheAsyncLookupServer"]]:
|
|
134
|
+
"""Get the lookup server instance."""
|
|
135
|
+
return self._lookup_server
|
|
136
|
+
|
|
137
|
+
@property
|
|
138
|
+
def offload_server(self) -> Optional[ZMQOffloadServer]:
|
|
139
|
+
"""Get the offload server instance."""
|
|
140
|
+
return self._offload_server
|
|
141
|
+
|
|
142
|
+
@property
|
|
143
|
+
def api_server(self) -> Optional[InternalAPIServer]:
|
|
144
|
+
"""Get the API server instance."""
|
|
145
|
+
return self._api_server
|
|
146
|
+
|
|
147
|
+
@property
|
|
148
|
+
def health_monitor(self) -> Optional[HealthMonitor]:
|
|
149
|
+
"""Get the health monitor instance."""
|
|
150
|
+
return self._health_monitor
|
|
151
|
+
|
|
152
|
+
@property
|
|
153
|
+
def kv_caches(self) -> dict[str, torch.Tensor]:
|
|
154
|
+
if self._connector is not None and hasattr(self._connector, "kv_caches"):
|
|
155
|
+
return self._connector.kv_caches
|
|
156
|
+
return {}
|
|
157
|
+
|
|
158
|
+
@property
|
|
159
|
+
def config(self) -> LMCacheEngineConfig:
|
|
160
|
+
"""Get the LMCache engine configuration."""
|
|
161
|
+
return self._config
|
|
162
|
+
|
|
163
|
+
# ==================== Lifecycle Methods ====================
|
|
164
|
+
|
|
165
|
+
def start_services(self) -> None:
|
|
166
|
+
"""
|
|
167
|
+
Start all managed services.
|
|
168
|
+
|
|
169
|
+
Managed services include:
|
|
170
|
+
- InternalAPIServer: HTTP server exposing internal APIs for
|
|
171
|
+
monitoring and management (e.g., cache stats, flush operations).
|
|
172
|
+
- RuntimePluginLauncher: Launches external plugin processes defined
|
|
173
|
+
in the configuration (e.g., custom telemetry, cache warming).
|
|
174
|
+
"""
|
|
175
|
+
if self._api_server is not None:
|
|
176
|
+
self._api_server.start()
|
|
177
|
+
|
|
178
|
+
if self._runtime_plugin_launcher is not None:
|
|
179
|
+
self._runtime_plugin_launcher.launch_plugins()
|
|
180
|
+
|
|
181
|
+
def post_init(self) -> None:
|
|
182
|
+
"""
|
|
183
|
+
Post-initialization after KV caches are registered.
|
|
184
|
+
"""
|
|
185
|
+
# If initialization already failed, mark engine and return early
|
|
186
|
+
if self._init_failed:
|
|
187
|
+
if self._lmcache_engine is not None:
|
|
188
|
+
self._lmcache_engine.mark_init_failed(self._init_failed_reason)
|
|
189
|
+
logger.warning("Skipping post_init due to previous initialization failure")
|
|
190
|
+
return
|
|
191
|
+
|
|
192
|
+
if self._lmcache_engine is None:
|
|
193
|
+
# Initialize health monitor for scheduler (even without engine)
|
|
194
|
+
self._init_health_monitor()
|
|
195
|
+
return
|
|
196
|
+
|
|
197
|
+
try:
|
|
198
|
+
# First Party
|
|
199
|
+
from lmcache.v1.lookup_client.lmcache_async_lookup_client import (
|
|
200
|
+
LMCacheAsyncLookupServer,
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
async_lookup_server = None
|
|
204
|
+
if self._config.enable_async_loading and self._lookup_server is not None:
|
|
205
|
+
assert isinstance(self._lookup_server, LMCacheAsyncLookupServer)
|
|
206
|
+
async_lookup_server = self._lookup_server
|
|
207
|
+
|
|
208
|
+
self._lmcache_engine.post_init(async_lookup_server=async_lookup_server)
|
|
209
|
+
|
|
210
|
+
# Initialize health monitor after engine post_init completes
|
|
211
|
+
self._init_health_monitor()
|
|
212
|
+
except Exception as e:
|
|
213
|
+
self._handle_post_init_failure(e)
|
|
214
|
+
|
|
215
|
+
def _init_health_monitor(self) -> None:
|
|
216
|
+
"""Initialize the health monitor via the service factory.
|
|
217
|
+
|
|
218
|
+
Called during post_init after all components are initialized.
|
|
219
|
+
"""
|
|
220
|
+
self._health_monitor = self._service_factory.maybe_create_health_monitor(
|
|
221
|
+
lmcache_manager=self
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
def _handle_post_init_failure(self, e: Exception) -> None:
|
|
225
|
+
"""
|
|
226
|
+
Handle initialization failure during post_init.
|
|
227
|
+
|
|
228
|
+
Args:
|
|
229
|
+
e: The exception that caused the failure
|
|
230
|
+
"""
|
|
231
|
+
self._init_failed = True
|
|
232
|
+
self._init_failed_reason = "".join(traceback.format_exception(e))
|
|
233
|
+
if self._lmcache_engine is not None:
|
|
234
|
+
self._lmcache_engine.mark_init_failed(self._init_failed_reason)
|
|
235
|
+
logger.error(
|
|
236
|
+
"Failed during post_init: %s. "
|
|
237
|
+
"System will operate in degraded mode (recompute).",
|
|
238
|
+
self._init_failed_reason,
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
def stop_services(self) -> None:
|
|
242
|
+
"""Stop all managed components gracefully."""
|
|
243
|
+
logger.info("Stopping LMCacheManager services...")
|
|
244
|
+
start_time = time.time()
|
|
245
|
+
errors: list[tuple[str, Union[str, Exception]]] = []
|
|
246
|
+
|
|
247
|
+
def _safe_close(name: str, close_fn, timeout: float = 10.0):
|
|
248
|
+
"""Helper to close a resource with timeout protection."""
|
|
249
|
+
try:
|
|
250
|
+
logger.info("Closing %s...", name)
|
|
251
|
+
with ThreadPoolExecutor(max_workers=1) as executor:
|
|
252
|
+
future = executor.submit(close_fn)
|
|
253
|
+
try:
|
|
254
|
+
future.result(timeout=timeout)
|
|
255
|
+
logger.info("%s closed successfully", name)
|
|
256
|
+
except TimeoutError:
|
|
257
|
+
logger.error(
|
|
258
|
+
"%s close operation timed out after %ss. "
|
|
259
|
+
"Continuing with shutdown...",
|
|
260
|
+
name,
|
|
261
|
+
timeout,
|
|
262
|
+
)
|
|
263
|
+
errors.append((name, "Timeout"))
|
|
264
|
+
except Exception as e:
|
|
265
|
+
logger.error("Error closing %s: %s", name, e)
|
|
266
|
+
errors.append((name, e))
|
|
267
|
+
|
|
268
|
+
# Stop health monitor first
|
|
269
|
+
if self._health_monitor is not None:
|
|
270
|
+
_safe_close("health_monitor", self._health_monitor.stop, timeout=5.0)
|
|
271
|
+
|
|
272
|
+
# Close offload server
|
|
273
|
+
if self._offload_server is not None:
|
|
274
|
+
_safe_close("offload_server", self._offload_server.close, timeout=10.0)
|
|
275
|
+
|
|
276
|
+
# Stop plugins
|
|
277
|
+
if self._runtime_plugin_launcher is not None:
|
|
278
|
+
_safe_close(
|
|
279
|
+
"runtime_plugin_launcher",
|
|
280
|
+
self._runtime_plugin_launcher.stop_plugins,
|
|
281
|
+
timeout=10.0,
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
# Stop API server
|
|
285
|
+
if self._api_server is not None:
|
|
286
|
+
_safe_close("api_server", self._api_server.stop, timeout=10.0)
|
|
287
|
+
|
|
288
|
+
# Close lookup server
|
|
289
|
+
if self._lookup_server is not None:
|
|
290
|
+
_safe_close("lookup_server", self._lookup_server.close, timeout=10.0)
|
|
291
|
+
|
|
292
|
+
# Close lookup client
|
|
293
|
+
if self._lookup_client is not None:
|
|
294
|
+
_safe_close("lookup_client", self._lookup_client.close, timeout=10.0)
|
|
295
|
+
|
|
296
|
+
# Destroy cache engine
|
|
297
|
+
try:
|
|
298
|
+
engine_instance_id = self._service_factory.get_engine_instance_id()
|
|
299
|
+
logger.info("Destroying LMCache engine: %s", engine_instance_id)
|
|
300
|
+
with ThreadPoolExecutor(max_workers=1) as executor:
|
|
301
|
+
future = executor.submit(
|
|
302
|
+
LMCacheEngineBuilder.destroy, engine_instance_id
|
|
303
|
+
)
|
|
304
|
+
try:
|
|
305
|
+
future.result(timeout=15.0)
|
|
306
|
+
logger.info("LMCache engine destroyed successfully")
|
|
307
|
+
except TimeoutError:
|
|
308
|
+
logger.error(
|
|
309
|
+
"Cache engine destroy timed out after 15s. "
|
|
310
|
+
"Continuing with shutdown..."
|
|
311
|
+
)
|
|
312
|
+
errors.append(("cache_engine", "Timeout"))
|
|
313
|
+
except Exception as e:
|
|
314
|
+
logger.error("Error destroying cache engine: %s", e)
|
|
315
|
+
errors.append(("cache_engine", e))
|
|
316
|
+
|
|
317
|
+
elapsed = time.time() - start_time
|
|
318
|
+
if errors:
|
|
319
|
+
logger.warning(
|
|
320
|
+
"Shutdown completed with %d errors in %.2fs: %s",
|
|
321
|
+
len(errors),
|
|
322
|
+
elapsed,
|
|
323
|
+
errors,
|
|
324
|
+
)
|
|
325
|
+
else:
|
|
326
|
+
logger.info(
|
|
327
|
+
"LMCacheManager services stopped successfully in %.2fs",
|
|
328
|
+
elapsed,
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
# ==================== Lookup Management ====================
|
|
332
|
+
|
|
333
|
+
def close_lookup_client(self) -> dict:
|
|
334
|
+
"""
|
|
335
|
+
Close the current lookup client.
|
|
336
|
+
|
|
337
|
+
Returns:
|
|
338
|
+
dict: Result with old client type info.
|
|
339
|
+
"""
|
|
340
|
+
old_type = self._get_lookup_type_str(self._lookup_client)
|
|
341
|
+
if self._lookup_client is not None:
|
|
342
|
+
try:
|
|
343
|
+
self._lookup_client.close()
|
|
344
|
+
self._lookup_client = None
|
|
345
|
+
logger.info("Closed lookup client: %s", old_type)
|
|
346
|
+
except Exception as e:
|
|
347
|
+
logger.warning("Error closing lookup client: %s", e)
|
|
348
|
+
return {"old": old_type}
|
|
349
|
+
|
|
350
|
+
def create_lookup_client(self, dryrun: bool = False) -> dict:
|
|
351
|
+
"""
|
|
352
|
+
Create a new lookup client using the current configuration.
|
|
353
|
+
|
|
354
|
+
Args:
|
|
355
|
+
dryrun: If True, only return what would be created without
|
|
356
|
+
actually creating it.
|
|
357
|
+
|
|
358
|
+
Returns:
|
|
359
|
+
dict: Result with new client type info.
|
|
360
|
+
"""
|
|
361
|
+
# First Party
|
|
362
|
+
from lmcache.v1.lookup_client.factory import LookupClientFactory
|
|
363
|
+
|
|
364
|
+
if self._lmcache_engine_metadata is None:
|
|
365
|
+
return {"error": "metadata not available"}
|
|
366
|
+
|
|
367
|
+
if dryrun:
|
|
368
|
+
client = LookupClientFactory.create_lookup_client(
|
|
369
|
+
self._config,
|
|
370
|
+
self._lmcache_engine_metadata,
|
|
371
|
+
self._lmcache_engine,
|
|
372
|
+
)
|
|
373
|
+
new_type = self._get_lookup_type_str(client)
|
|
374
|
+
client.close()
|
|
375
|
+
return {"new": new_type, "dryrun": True}
|
|
376
|
+
|
|
377
|
+
self._lookup_client = LookupClientFactory.create_lookup_client(
|
|
378
|
+
self._config,
|
|
379
|
+
self._lmcache_engine_metadata,
|
|
380
|
+
self._lmcache_engine,
|
|
381
|
+
)
|
|
382
|
+
new_type = self._get_lookup_type_str(self._lookup_client)
|
|
383
|
+
logger.info("Created lookup client: %s", new_type)
|
|
384
|
+
return {"new": new_type}
|
|
385
|
+
|
|
386
|
+
def recreate_lookup_client(self) -> dict:
|
|
387
|
+
"""
|
|
388
|
+
Recreate the lookup client (close + create).
|
|
389
|
+
|
|
390
|
+
Returns:
|
|
391
|
+
dict: Result with old and new client type info.
|
|
392
|
+
"""
|
|
393
|
+
if self._lookup_client is None:
|
|
394
|
+
return {"error": "lookup client not available"}
|
|
395
|
+
result = self.close_lookup_client()
|
|
396
|
+
create_result = self.create_lookup_client()
|
|
397
|
+
result.update(create_result)
|
|
398
|
+
return result
|
|
399
|
+
|
|
400
|
+
def close_lookup_server(self) -> dict:
|
|
401
|
+
"""
|
|
402
|
+
Close the current lookup server.
|
|
403
|
+
|
|
404
|
+
Returns:
|
|
405
|
+
dict: Result with old server type info.
|
|
406
|
+
"""
|
|
407
|
+
old_type = self._get_lookup_type_str(self._lookup_server)
|
|
408
|
+
if self._lookup_server is not None:
|
|
409
|
+
try:
|
|
410
|
+
self._lookup_server.close()
|
|
411
|
+
self._lookup_server = None
|
|
412
|
+
logger.info("Closed lookup server: %s", old_type)
|
|
413
|
+
except Exception as e:
|
|
414
|
+
logger.warning("Error closing lookup server: %s", e)
|
|
415
|
+
return {"old": old_type}
|
|
416
|
+
|
|
417
|
+
def create_lookup_server(self, dryrun: bool = False) -> dict:
|
|
418
|
+
"""
|
|
419
|
+
Create a new lookup server using the current configuration.
|
|
420
|
+
|
|
421
|
+
Args:
|
|
422
|
+
dryrun: If True, only return what would be created without
|
|
423
|
+
actually creating it.
|
|
424
|
+
|
|
425
|
+
Returns:
|
|
426
|
+
dict: Result with new server type info.
|
|
427
|
+
"""
|
|
428
|
+
# First Party
|
|
429
|
+
from lmcache.v1.lookup_client.factory import LookupClientFactory
|
|
430
|
+
|
|
431
|
+
if self._lmcache_engine is None:
|
|
432
|
+
return {"error": "engine not available"}
|
|
433
|
+
if self._lmcache_engine_metadata is None:
|
|
434
|
+
return {"error": "metadata not available"}
|
|
435
|
+
|
|
436
|
+
if dryrun:
|
|
437
|
+
server = LookupClientFactory.create_lookup_server(
|
|
438
|
+
self._lmcache_engine,
|
|
439
|
+
self._lmcache_engine_metadata,
|
|
440
|
+
)
|
|
441
|
+
new_type = self._get_lookup_type_str(server)
|
|
442
|
+
if server is not None:
|
|
443
|
+
server.close()
|
|
444
|
+
return {"new": new_type, "dryrun": True}
|
|
445
|
+
|
|
446
|
+
self._lookup_server = LookupClientFactory.create_lookup_server(
|
|
447
|
+
self._lmcache_engine,
|
|
448
|
+
self._lmcache_engine_metadata,
|
|
449
|
+
)
|
|
450
|
+
new_type = self._get_lookup_type_str(self._lookup_server)
|
|
451
|
+
logger.info("Created lookup server: %s", new_type)
|
|
452
|
+
return {"new": new_type}
|
|
453
|
+
|
|
454
|
+
def recreate_lookup_server(self) -> dict:
|
|
455
|
+
"""
|
|
456
|
+
Recreate the lookup server (close + create).
|
|
457
|
+
|
|
458
|
+
Returns:
|
|
459
|
+
dict: Result with old and new server type info.
|
|
460
|
+
"""
|
|
461
|
+
if self._lookup_server is None:
|
|
462
|
+
return {"error": "lookup server not available"}
|
|
463
|
+
|
|
464
|
+
result = self.close_lookup_server()
|
|
465
|
+
create_result = self.create_lookup_server()
|
|
466
|
+
result.update(create_result)
|
|
467
|
+
return result
|
|
468
|
+
|
|
469
|
+
def _get_lookup_type_str(self, obj) -> str:
|
|
470
|
+
"""
|
|
471
|
+
Get type string for lookup client/server, including wrapper info.
|
|
472
|
+
|
|
473
|
+
Returns format: "OuterWrapper(InnerWrapper(CoreType))" or "None"
|
|
474
|
+
"""
|
|
475
|
+
if obj is None:
|
|
476
|
+
return "None"
|
|
477
|
+
|
|
478
|
+
parts = []
|
|
479
|
+
current = obj
|
|
480
|
+
while True:
|
|
481
|
+
parts.append(type(current).__name__)
|
|
482
|
+
if hasattr(current, "actual_lookup_client"):
|
|
483
|
+
current = current.actual_lookup_client
|
|
484
|
+
else:
|
|
485
|
+
break
|
|
486
|
+
|
|
487
|
+
if len(parts) == 1:
|
|
488
|
+
return parts[0]
|
|
489
|
+
result = parts[-1]
|
|
490
|
+
for wrapper in reversed(parts[:-1]):
|
|
491
|
+
result = "%s(%s)" % (wrapper, result)
|
|
492
|
+
return result
|
|
493
|
+
|
|
494
|
+
def get_lookup_info(self) -> dict:
|
|
495
|
+
"""
|
|
496
|
+
Get information about the current lookup client and server.
|
|
497
|
+
|
|
498
|
+
Returns:
|
|
499
|
+
dict: Information about lookup client/server types and role.
|
|
500
|
+
"""
|
|
501
|
+
return {
|
|
502
|
+
"client": self._get_lookup_type_str(self._lookup_client),
|
|
503
|
+
"server": self._get_lookup_type_str(self._lookup_server),
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
# ==================== Health & Info ====================
|
|
507
|
+
|
|
508
|
+
def is_healthy(self) -> bool:
|
|
509
|
+
"""
|
|
510
|
+
Check if the LMCacheManager is healthy.
|
|
511
|
+
|
|
512
|
+
Returns False if:
|
|
513
|
+
- Initialization failed
|
|
514
|
+
- HealthMonitor reports unhealthy
|
|
515
|
+
- Engine reports unhealthy
|
|
516
|
+
|
|
517
|
+
Returns:
|
|
518
|
+
bool: True if healthy, False otherwise
|
|
519
|
+
"""
|
|
520
|
+
if self._init_failed:
|
|
521
|
+
return False
|
|
522
|
+
if self._lmcache_engine is not None and not self._lmcache_engine.is_healthy():
|
|
523
|
+
return False
|
|
524
|
+
if self._health_monitor is not None:
|
|
525
|
+
return self._health_monitor.is_healthy()
|
|
526
|
+
return True
|
|
527
|
+
|
|
528
|
+
def get_inference_info(self) -> dict:
|
|
529
|
+
"""Get inference information by delegating to the connector.
|
|
530
|
+
|
|
531
|
+
Returns:
|
|
532
|
+
dict: Dictionary containing inference information,
|
|
533
|
+
or empty dict if connector is not available.
|
|
534
|
+
"""
|
|
535
|
+
if self._connector is not None and hasattr(
|
|
536
|
+
self._connector, "get_inference_info"
|
|
537
|
+
):
|
|
538
|
+
return self._connector.get_inference_info()
|
|
539
|
+
return {}
|