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,73 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
|
|
3
|
+
"""L2 storage logging subscriber — debug logs for L2 store/prefetch events."""
|
|
4
|
+
|
|
5
|
+
# Future
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
# First Party
|
|
9
|
+
from lmcache.logging import init_logger
|
|
10
|
+
from lmcache.v1.mp_observability.event import Event, EventType
|
|
11
|
+
from lmcache.v1.mp_observability.event_bus import EventCallback, EventSubscriber
|
|
12
|
+
|
|
13
|
+
logger = init_logger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class L2LoggingSubscriber(EventSubscriber):
|
|
17
|
+
"""Logs L2 store and prefetch events at debug level."""
|
|
18
|
+
|
|
19
|
+
def get_subscriptions(self) -> dict[EventType, EventCallback]:
|
|
20
|
+
return {
|
|
21
|
+
EventType.L2_STORE_SUBMITTED: self._on_store_submitted,
|
|
22
|
+
EventType.L2_STORE_COMPLETED: self._on_store_completed,
|
|
23
|
+
EventType.L2_PREFETCH_LOOKUP_SUBMITTED: self._on_lookup_submitted,
|
|
24
|
+
EventType.L2_PREFETCH_LOOKUP_COMPLETED: self._on_lookup_completed,
|
|
25
|
+
EventType.L2_PREFETCH_LOAD_SUBMITTED: self._on_load_submitted,
|
|
26
|
+
EventType.L2_PREFETCH_LOAD_COMPLETED: self._on_load_completed,
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
def _on_store_submitted(self, event: Event) -> None:
|
|
30
|
+
logger.debug(
|
|
31
|
+
"L2 store submitted: %d keys to adapter %d",
|
|
32
|
+
event.metadata["key_count"],
|
|
33
|
+
event.metadata["adapter_index"],
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
def _on_store_completed(self, event: Event) -> None:
|
|
37
|
+
logger.debug(
|
|
38
|
+
"L2 store completed: adapter %d, %d succeeded, %d failed",
|
|
39
|
+
event.metadata["adapter_index"],
|
|
40
|
+
event.metadata["succeeded_count"],
|
|
41
|
+
event.metadata["failed_count"],
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
def _on_lookup_submitted(self, event: Event) -> None:
|
|
45
|
+
logger.debug(
|
|
46
|
+
"L2 prefetch lookup submitted: request %d, %d keys to %d adapters",
|
|
47
|
+
event.metadata["request_id"],
|
|
48
|
+
event.metadata["key_count"],
|
|
49
|
+
event.metadata["adapter_count"],
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
def _on_lookup_completed(self, event: Event) -> None:
|
|
53
|
+
logger.debug(
|
|
54
|
+
"L2 prefetch lookup completed: request %d, %d prefix hits",
|
|
55
|
+
event.metadata["request_id"],
|
|
56
|
+
event.metadata["prefix_hit_count"],
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
def _on_load_submitted(self, event: Event) -> None:
|
|
60
|
+
logger.debug(
|
|
61
|
+
"L2 prefetch load submitted: request %d, %d keys to %d adapters",
|
|
62
|
+
event.metadata["request_id"],
|
|
63
|
+
event.metadata["key_count"],
|
|
64
|
+
event.metadata["adapter_count"],
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
def _on_load_completed(self, event: Event) -> None:
|
|
68
|
+
logger.debug(
|
|
69
|
+
"L2 prefetch load completed: request %d, %d loaded, %d failed",
|
|
70
|
+
event.metadata["request_id"],
|
|
71
|
+
event.metadata["loaded_count"],
|
|
72
|
+
event.metadata["failed_count"],
|
|
73
|
+
)
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
|
|
3
|
+
"""Lookup hash file-logging subscriber.
|
|
4
|
+
|
|
5
|
+
Subscribes to ``MP_LOOKUP`` events and writes lookup hash data to
|
|
6
|
+
rotating JSONL files for offline analysis. Because the EventBus
|
|
7
|
+
drain thread dispatches callbacks off the hot path, no extra queue
|
|
8
|
+
or worker thread is needed — file I/O happens in the EventBus
|
|
9
|
+
background thread.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
# Future
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
# Standard
|
|
16
|
+
from dataclasses import dataclass
|
|
17
|
+
from datetime import datetime, timezone
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
from typing import Optional
|
|
20
|
+
import io
|
|
21
|
+
import json
|
|
22
|
+
|
|
23
|
+
# First Party
|
|
24
|
+
from lmcache.logging import init_logger
|
|
25
|
+
from lmcache.v1.mp_observability.event import Event, EventType
|
|
26
|
+
from lmcache.v1.mp_observability.event_bus import EventCallback, EventSubscriber
|
|
27
|
+
|
|
28
|
+
logger = init_logger(__name__)
|
|
29
|
+
|
|
30
|
+
# Pattern for discovering existing log files on disk.
|
|
31
|
+
_LOG_FILE_GLOB = "lookup_hashes_*.jsonl"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _format_timestamp(ts: float) -> str:
|
|
35
|
+
"""Format a unix timestamp as a compact datetime string.
|
|
36
|
+
|
|
37
|
+
Example: 20260401_143025
|
|
38
|
+
"""
|
|
39
|
+
dt = datetime.fromtimestamp(ts, tz=timezone.utc)
|
|
40
|
+
return dt.strftime("%Y%m%d_%H%M%S")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@dataclass
|
|
44
|
+
class LookupHashLogConfig:
|
|
45
|
+
"""Configuration for lookup hash file logging.
|
|
46
|
+
|
|
47
|
+
When ``output_dir`` is non-empty, chunk hashes computed during
|
|
48
|
+
lookup are written to rotating JSONL files for offline analysis.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
output_dir: str = ""
|
|
52
|
+
"""Directory to write lookup hash JSONL files.
|
|
53
|
+
Empty string disables logging."""
|
|
54
|
+
|
|
55
|
+
rotation_interval_sec: int = 6 * 3600
|
|
56
|
+
"""Time interval in seconds before rotating to a new file
|
|
57
|
+
(default 6 hours)."""
|
|
58
|
+
|
|
59
|
+
rotation_max_size: int = 100 * 1024 * 1024
|
|
60
|
+
"""Max file size in bytes before rotating even if the time
|
|
61
|
+
interval has not elapsed (default 100MB)."""
|
|
62
|
+
|
|
63
|
+
max_files: int = 100
|
|
64
|
+
"""Max number of log files to keep before deleting oldest."""
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def enabled(self) -> bool:
|
|
68
|
+
"""Whether lookup hash logging is enabled."""
|
|
69
|
+
return bool(self.output_dir)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class LookupHashLoggingSubscriber(EventSubscriber):
|
|
73
|
+
"""EventBus subscriber that writes lookup hashes to rotating JSONL files.
|
|
74
|
+
|
|
75
|
+
Leverages the EventBus drain thread for async I/O instead of maintaining
|
|
76
|
+
its own queue and worker.
|
|
77
|
+
|
|
78
|
+
Files rotate when either the time interval or file size limit is
|
|
79
|
+
reached, whichever comes first. File names include a
|
|
80
|
+
human-readable timestamp, e.g.::
|
|
81
|
+
|
|
82
|
+
lookup_hashes_20260401_143025_000003.jsonl
|
|
83
|
+
|
|
84
|
+
Each JSONL line has the format::
|
|
85
|
+
|
|
86
|
+
{"timestamp": 1711929600.123, "request_id": "req-abc",
|
|
87
|
+
"model_name": "DeepSeek-V3",
|
|
88
|
+
"chunk_size": 256, "seq_len": 1024,
|
|
89
|
+
"dtypes": ["float8_e4m3fn"],
|
|
90
|
+
"shapes": [[32, 256, 128]],
|
|
91
|
+
"chunk_hashes": ["0xab...", ...]}
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
def __init__(self, config: LookupHashLogConfig) -> None:
|
|
95
|
+
self._config = config
|
|
96
|
+
self.output_dir = Path(config.output_dir)
|
|
97
|
+
self.output_dir.mkdir(parents=True, exist_ok=True)
|
|
98
|
+
|
|
99
|
+
# File state (only accessed from the EventBus drain thread)
|
|
100
|
+
self._current_file_size: int = 0
|
|
101
|
+
self._current_file: Optional[Path] = None
|
|
102
|
+
self._current_handle: Optional[io.TextIOWrapper] = None
|
|
103
|
+
self._current_file_opened_at: float = 0.0
|
|
104
|
+
|
|
105
|
+
# Discover existing log files so max_files limit accounts
|
|
106
|
+
# for files from previous runs.
|
|
107
|
+
self._file_list: list[Path] = sorted(
|
|
108
|
+
self.output_dir.glob(_LOG_FILE_GLOB),
|
|
109
|
+
key=lambda p: p.stat().st_mtime,
|
|
110
|
+
)
|
|
111
|
+
self._file_count: int = len(self._file_list)
|
|
112
|
+
|
|
113
|
+
logger.info(
|
|
114
|
+
"LookupHashLoggingSubscriber started: output_dir=%s, "
|
|
115
|
+
"rotation_interval=%ds, "
|
|
116
|
+
"rotation_max_size=%d, max_files=%d, "
|
|
117
|
+
"existing_files=%d",
|
|
118
|
+
self.output_dir,
|
|
119
|
+
config.rotation_interval_sec,
|
|
120
|
+
config.rotation_max_size,
|
|
121
|
+
config.max_files,
|
|
122
|
+
len(self._file_list),
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
# -- EventSubscriber interface -----------------------------------------
|
|
126
|
+
|
|
127
|
+
def get_subscriptions(self) -> dict[EventType, EventCallback]:
|
|
128
|
+
return {
|
|
129
|
+
EventType.MP_LOOKUP: self._on_lookup_hashes,
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
def shutdown(self) -> None:
|
|
133
|
+
"""Close the current file handle on EventBus shutdown."""
|
|
134
|
+
if self._current_handle is not None:
|
|
135
|
+
self._current_handle.close()
|
|
136
|
+
self._current_handle = None
|
|
137
|
+
logger.info("LookupHashLoggingSubscriber closed")
|
|
138
|
+
|
|
139
|
+
# -- Callback ----------------------------------------------------------
|
|
140
|
+
|
|
141
|
+
def _on_lookup_hashes(self, event: Event) -> None:
|
|
142
|
+
"""Write a lookup hash event to the current JSONL file."""
|
|
143
|
+
meta = event.metadata
|
|
144
|
+
timestamp = event.timestamp
|
|
145
|
+
|
|
146
|
+
if self._needs_rotation(timestamp):
|
|
147
|
+
self._rotate_file(timestamp)
|
|
148
|
+
|
|
149
|
+
chunk_hashes_raw = meta.get("chunk_hashes", [])
|
|
150
|
+
data = {
|
|
151
|
+
"timestamp": timestamp,
|
|
152
|
+
"request_id": meta.get("request_id", ""),
|
|
153
|
+
"model_name": meta.get("model_name", ""),
|
|
154
|
+
"chunk_size": meta.get("chunk_size", 0),
|
|
155
|
+
"seq_len": meta.get("seq_len", 0),
|
|
156
|
+
"dtypes": meta.get("dtypes", []),
|
|
157
|
+
"shapes": meta.get("shapes", []),
|
|
158
|
+
"chunk_hashes": [
|
|
159
|
+
"0x" + h.hex() if isinstance(h, bytes) else hex(h)
|
|
160
|
+
for h in chunk_hashes_raw
|
|
161
|
+
],
|
|
162
|
+
}
|
|
163
|
+
line = json.dumps(data) + "\n"
|
|
164
|
+
if self._current_handle is not None:
|
|
165
|
+
self._current_handle.write(line)
|
|
166
|
+
self._current_handle.flush()
|
|
167
|
+
self._current_file_size = self._current_handle.tell()
|
|
168
|
+
|
|
169
|
+
# -- File rotation -----------------------------------------------------
|
|
170
|
+
|
|
171
|
+
def _needs_rotation(self, now: float) -> bool:
|
|
172
|
+
"""Check if the current file needs rotation."""
|
|
173
|
+
if self._current_handle is None:
|
|
174
|
+
return True
|
|
175
|
+
elapsed = now - self._current_file_opened_at
|
|
176
|
+
if elapsed >= self._config.rotation_interval_sec:
|
|
177
|
+
return True
|
|
178
|
+
if self._current_file_size >= self._config.rotation_max_size:
|
|
179
|
+
return True
|
|
180
|
+
return False
|
|
181
|
+
|
|
182
|
+
def _rotate_file(self, now: float) -> None:
|
|
183
|
+
"""Close current file and open a new one."""
|
|
184
|
+
if self._current_handle is not None:
|
|
185
|
+
self._current_handle.close()
|
|
186
|
+
self._current_handle = None
|
|
187
|
+
|
|
188
|
+
time_str = _format_timestamp(now)
|
|
189
|
+
self._current_file = (
|
|
190
|
+
self.output_dir / f"lookup_hashes_{time_str}_{self._file_count:06d}.jsonl"
|
|
191
|
+
)
|
|
192
|
+
self._current_handle = open(self._current_file, "w", encoding="utf-8")
|
|
193
|
+
self._current_file_opened_at = now
|
|
194
|
+
self._current_file_size = 0
|
|
195
|
+
self._file_count += 1
|
|
196
|
+
self._file_list.append(self._current_file)
|
|
197
|
+
|
|
198
|
+
# Enforce max file count
|
|
199
|
+
while len(self._file_list) > self._config.max_files:
|
|
200
|
+
oldest = self._file_list.pop(0)
|
|
201
|
+
try:
|
|
202
|
+
if oldest.exists():
|
|
203
|
+
oldest.unlink()
|
|
204
|
+
except Exception as e:
|
|
205
|
+
logger.error(
|
|
206
|
+
"Failed to delete old lookup hash file %s: %s",
|
|
207
|
+
oldest,
|
|
208
|
+
e,
|
|
209
|
+
)
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
|
|
3
|
+
"""MP Server logging subscriber — debug logs for store/retrieve/lookup events.
|
|
4
|
+
|
|
5
|
+
Logs are emitted via Python's standard logging module. When OpenTelemetry
|
|
6
|
+
is installed, ``init_logger`` automatically attaches an OTel
|
|
7
|
+
``LoggingHandler`` so records are forwarded to OTel when a
|
|
8
|
+
``LoggerProvider`` is configured at startup.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
# Future
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
# First Party
|
|
15
|
+
from lmcache.logging import init_logger
|
|
16
|
+
from lmcache.v1.mp_observability.event import Event, EventType
|
|
17
|
+
from lmcache.v1.mp_observability.event_bus import EventCallback, EventSubscriber
|
|
18
|
+
|
|
19
|
+
logger = init_logger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class MPServerLoggingSubscriber(EventSubscriber):
|
|
23
|
+
"""Logs MP server store/retrieve/lookup events at debug level."""
|
|
24
|
+
|
|
25
|
+
def get_subscriptions(self) -> dict[EventType, EventCallback]:
|
|
26
|
+
return {
|
|
27
|
+
EventType.MP_STORE_START: self._on_store_start,
|
|
28
|
+
EventType.MP_STORE_END: self._on_store_end,
|
|
29
|
+
EventType.MP_RETRIEVE_START: self._on_retrieve_start,
|
|
30
|
+
EventType.MP_RETRIEVE_END: self._on_retrieve_end,
|
|
31
|
+
EventType.MP_LOOKUP_PREFETCH_START: self._on_lookup_prefetch_start,
|
|
32
|
+
EventType.MP_LOOKUP_PREFETCH_END: self._on_lookup_prefetch_end,
|
|
33
|
+
EventType.MP_VLLM_BLOCK_ALLOCATION: self._on_block_allocation,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
def _on_store_start(self, event: Event) -> None:
|
|
37
|
+
logger.debug(
|
|
38
|
+
"MP store start: session=%s device=%s",
|
|
39
|
+
event.session_id,
|
|
40
|
+
event.metadata.get("device"),
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
def _on_store_end(self, event: Event) -> None:
|
|
44
|
+
logger.debug(
|
|
45
|
+
"MP store end: session=%s device=%s stored_count=%s",
|
|
46
|
+
event.session_id,
|
|
47
|
+
event.metadata.get("device"),
|
|
48
|
+
event.metadata.get("stored_count"),
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
def _on_retrieve_start(self, event: Event) -> None:
|
|
52
|
+
logger.debug(
|
|
53
|
+
"MP retrieve start: session=%s device=%s",
|
|
54
|
+
event.session_id,
|
|
55
|
+
event.metadata.get("device"),
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
def _on_retrieve_end(self, event: Event) -> None:
|
|
59
|
+
logger.debug(
|
|
60
|
+
"MP retrieve end: session=%s device=%s retrieved_count=%s",
|
|
61
|
+
event.session_id,
|
|
62
|
+
event.metadata.get("device"),
|
|
63
|
+
event.metadata.get("retrieved_count"),
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
def _on_lookup_prefetch_start(self, event: Event) -> None:
|
|
67
|
+
logger.debug(
|
|
68
|
+
"MP lookup/prefetch start: session=%s",
|
|
69
|
+
event.session_id,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
def _on_lookup_prefetch_end(self, event: Event) -> None:
|
|
73
|
+
logger.debug(
|
|
74
|
+
"MP lookup/prefetch end: session=%s found_count=%s",
|
|
75
|
+
event.session_id,
|
|
76
|
+
event.metadata.get("found_count"),
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
def _on_block_allocation(self, event: Event) -> None:
|
|
80
|
+
records = event.metadata.get("records", [])
|
|
81
|
+
for rec in records:
|
|
82
|
+
logger.debug(
|
|
83
|
+
"vLLM block allocation: req_id=%s "
|
|
84
|
+
"new_blocks=%d new_tokens=%d "
|
|
85
|
+
"block_ids=%s",
|
|
86
|
+
rec.req_id,
|
|
87
|
+
len(rec.new_block_ids),
|
|
88
|
+
len(rec.new_token_ids),
|
|
89
|
+
rec.new_block_ids[:10],
|
|
90
|
+
)
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
|
|
3
|
+
"""StorageManager logging subscriber — debug logs for SM events.
|
|
4
|
+
|
|
5
|
+
Logs are emitted via Python's standard logging module. When OpenTelemetry
|
|
6
|
+
is installed, ``init_logger`` automatically attaches an OTel
|
|
7
|
+
``LoggingHandler`` so records are forwarded to OTel when a
|
|
8
|
+
``LoggerProvider`` is configured at startup.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
# Future
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
# First Party
|
|
15
|
+
from lmcache.logging import init_logger
|
|
16
|
+
from lmcache.v1.mp_observability.event import Event, EventType
|
|
17
|
+
from lmcache.v1.mp_observability.event_bus import EventCallback, EventSubscriber
|
|
18
|
+
|
|
19
|
+
logger = init_logger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class SMLoggingSubscriber(EventSubscriber):
|
|
23
|
+
"""Logs StorageManager events at debug level."""
|
|
24
|
+
|
|
25
|
+
def get_subscriptions(self) -> dict[EventType, EventCallback]:
|
|
26
|
+
return {
|
|
27
|
+
EventType.SM_READ_PREFETCHED: self._on_read_prefetched,
|
|
28
|
+
EventType.SM_READ_PREFETCHED_FINISHED: self._on_read_prefetched_finished,
|
|
29
|
+
EventType.SM_WRITE_RESERVED: self._on_write_reserved,
|
|
30
|
+
EventType.SM_WRITE_FINISHED: self._on_write_finished,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
def _on_read_prefetched(self, event: Event) -> None:
|
|
34
|
+
logger.debug(
|
|
35
|
+
"SM read prefetched: %d succeeded, %d failed",
|
|
36
|
+
len(event.metadata["succeeded_keys"]),
|
|
37
|
+
len(event.metadata["failed_keys"]),
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
def _on_read_prefetched_finished(self, event: Event) -> None:
|
|
41
|
+
logger.debug(
|
|
42
|
+
"SM read prefetched finished: %d succeeded, %d failed",
|
|
43
|
+
len(event.metadata["succeeded_keys"]),
|
|
44
|
+
len(event.metadata["failed_keys"]),
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
def _on_write_reserved(self, event: Event) -> None:
|
|
48
|
+
logger.debug(
|
|
49
|
+
"SM write reserved: %d succeeded, %d failed",
|
|
50
|
+
len(event.metadata["succeeded_keys"]),
|
|
51
|
+
len(event.metadata["failed_keys"]),
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
def _on_write_finished(self, event: Event) -> None:
|
|
55
|
+
logger.debug(
|
|
56
|
+
"SM write finished: %d succeeded, %d failed",
|
|
57
|
+
len(event.metadata["succeeded_keys"]),
|
|
58
|
+
len(event.metadata["failed_keys"]),
|
|
59
|
+
)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
|
|
3
|
+
# First Party
|
|
4
|
+
from lmcache.v1.mp_observability.subscribers.metrics.l0_lifecycle import (
|
|
5
|
+
L0LifecycleSubscriber,
|
|
6
|
+
)
|
|
7
|
+
from lmcache.v1.mp_observability.subscribers.metrics.l1 import L1MetricsSubscriber
|
|
8
|
+
from lmcache.v1.mp_observability.subscribers.metrics.l1_lifecycle import (
|
|
9
|
+
L1LifecycleSubscriber,
|
|
10
|
+
)
|
|
11
|
+
from lmcache.v1.mp_observability.subscribers.metrics.l2 import L2MetricsSubscriber
|
|
12
|
+
from lmcache.v1.mp_observability.subscribers.metrics.sm import SMMetricsSubscriber
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"L0LifecycleSubscriber",
|
|
16
|
+
"L1LifecycleSubscriber",
|
|
17
|
+
"L1MetricsSubscriber",
|
|
18
|
+
"L2MetricsSubscriber",
|
|
19
|
+
"SMMetricsSubscriber",
|
|
20
|
+
]
|