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,828 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Standard
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from enum import Enum
|
|
5
|
+
from typing import Dict, List, Optional, Tuple, Union
|
|
6
|
+
|
|
7
|
+
# Third Party
|
|
8
|
+
import msgspec
|
|
9
|
+
|
|
10
|
+
# First Party
|
|
11
|
+
from lmcache.v1.cache_controller.commands.base import HeartbeatCommand
|
|
12
|
+
from lmcache.v1.cache_controller.commands.full_sync import FullSyncCommand
|
|
13
|
+
|
|
14
|
+
# Type alias for all command types - msgspec needs Union for tagged unions
|
|
15
|
+
AnyCommand = Union[FullSyncCommand, HeartbeatCommand]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class MsgBase(msgspec.Struct, tag=True): # type: ignore
|
|
19
|
+
"""Base class for all messages"""
|
|
20
|
+
|
|
21
|
+
def describe(self) -> str:
|
|
22
|
+
return ""
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# NOTE: The additional layer of abstraction is to
|
|
26
|
+
# differentiate among
|
|
27
|
+
# (1) WorkerMsg: push-pull (lmcache->controller)
|
|
28
|
+
# (2) WorkerReqMsg: req-reply (lmcache->controller)
|
|
29
|
+
# (3) ControlMessage: req-reply (controller->lmcache)
|
|
30
|
+
# (4) OrchMsg: req-reply (ochestrator->controller)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
"""Message from LMCache to Controller"""
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class WorkerMsg(MsgBase):
|
|
37
|
+
"""Message between LMCache and Controller"""
|
|
38
|
+
|
|
39
|
+
def describe(self) -> str:
|
|
40
|
+
return ""
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
"""Worker Request (requiring a reply) Message from LMCache to Controller"""
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class WorkerReqMsg(MsgBase):
|
|
47
|
+
def describe(self) -> str:
|
|
48
|
+
return ""
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class RegisterMsg(WorkerReqMsg):
|
|
52
|
+
"""Message for Registration (REQ-REP mode)"""
|
|
53
|
+
|
|
54
|
+
instance_id: str
|
|
55
|
+
worker_id: int
|
|
56
|
+
ip: str
|
|
57
|
+
port: int
|
|
58
|
+
# URL for actual KV cache transfer, only useful when p2p is enabled
|
|
59
|
+
peer_init_url: Optional[str]
|
|
60
|
+
|
|
61
|
+
def describe(self) -> str:
|
|
62
|
+
return (
|
|
63
|
+
f"Registering instance {self.instance_id}, "
|
|
64
|
+
f"worker {self.worker_id} "
|
|
65
|
+
f"at {self.ip}:{self.port}"
|
|
66
|
+
f" with peer init URL {self.peer_init_url}"
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class DeRegisterMsg(WorkerMsg):
|
|
71
|
+
"""Message for Deregistration"""
|
|
72
|
+
|
|
73
|
+
instance_id: str
|
|
74
|
+
worker_id: int
|
|
75
|
+
ip: str
|
|
76
|
+
port: int
|
|
77
|
+
|
|
78
|
+
def describe(self) -> str:
|
|
79
|
+
return (
|
|
80
|
+
f"Deregistering instance {self.instance_id}, "
|
|
81
|
+
f"worker {self.worker_id} "
|
|
82
|
+
f"at {self.ip}:{self.port}"
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class KVOperationMsg(WorkerMsg):
|
|
87
|
+
"""Base class for KV operation messages (admit/evict) with full context"""
|
|
88
|
+
|
|
89
|
+
instance_id: str
|
|
90
|
+
worker_id: int
|
|
91
|
+
key: int
|
|
92
|
+
location: str
|
|
93
|
+
seq_num: int = 0
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class KVAdmitMsg(KVOperationMsg):
|
|
97
|
+
"""Message for KV chunk admission"""
|
|
98
|
+
|
|
99
|
+
def describe(self) -> str:
|
|
100
|
+
return f"kv_admit {self.key} to {self.instance_id}"
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class KVEvictMsg(KVOperationMsg):
|
|
104
|
+
"""Message for KV chunk eviction"""
|
|
105
|
+
|
|
106
|
+
def describe(self) -> str:
|
|
107
|
+
return f"kv_evict {self.key} from {self.instance_id}"
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
@dataclass
|
|
111
|
+
class WorkerInfo:
|
|
112
|
+
"""Information about a worker for external API consumption."""
|
|
113
|
+
|
|
114
|
+
instance_id: str
|
|
115
|
+
worker_id: int
|
|
116
|
+
ip: str
|
|
117
|
+
port: int
|
|
118
|
+
peer_init_url: Optional[str]
|
|
119
|
+
registration_time: float
|
|
120
|
+
last_heartbeat_time: float
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class OpType(Enum):
|
|
124
|
+
"""Enum for KV operation types"""
|
|
125
|
+
|
|
126
|
+
ADMIT = "admit"
|
|
127
|
+
EVICT = "evict"
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class KVOpEvent(msgspec.Struct):
|
|
131
|
+
"""Lightweight KV operation event for queue storage (without common fields)"""
|
|
132
|
+
|
|
133
|
+
op_type: OpType
|
|
134
|
+
key: int
|
|
135
|
+
seq_num: int
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class BatchedKVOperationMsg(WorkerMsg):
|
|
139
|
+
"""Batched KV operation message with common fields and lightweight operations
|
|
140
|
+
|
|
141
|
+
Design: Common fields (instance_id, worker_id, location) are stored once
|
|
142
|
+
at the batch level, while individual operations only contain the varying
|
|
143
|
+
fields (op_type, key, seq_num). This reduces memory and network overhead.
|
|
144
|
+
"""
|
|
145
|
+
|
|
146
|
+
instance_id: str
|
|
147
|
+
worker_id: int
|
|
148
|
+
location: str
|
|
149
|
+
operations: list[KVOpEvent]
|
|
150
|
+
|
|
151
|
+
def describe(self) -> str:
|
|
152
|
+
return (
|
|
153
|
+
f"Batched KV operations with {len(self.operations)} messages "
|
|
154
|
+
f"from {self.instance_id}:{self.worker_id}"
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
# ============= Full Sync Messages (PUSH mode) =============
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
class FullSyncBatchMsg(WorkerMsg):
|
|
162
|
+
"""Full sync batch message (PUSH mode, no confirmation needed)
|
|
163
|
+
|
|
164
|
+
Used to send a batch of chunk hashes during full sync.
|
|
165
|
+
"""
|
|
166
|
+
|
|
167
|
+
instance_id: str
|
|
168
|
+
worker_id: int
|
|
169
|
+
location: str
|
|
170
|
+
sync_id: str
|
|
171
|
+
batch_id: int # Current batch number (0-indexed)
|
|
172
|
+
keys: list[int] # List of chunk_hash in this batch
|
|
173
|
+
|
|
174
|
+
def describe(self) -> str:
|
|
175
|
+
return (
|
|
176
|
+
f"FullSyncBatch sync_id={self.sync_id} batch_id={self.batch_id} "
|
|
177
|
+
f"keys_count={len(self.keys)} from {self.instance_id}:{self.worker_id}"
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
class FullSyncEndMsg(WorkerMsg):
|
|
182
|
+
"""Full sync end message (PUSH mode)
|
|
183
|
+
|
|
184
|
+
Sent after all batches are sent to signal completion.
|
|
185
|
+
"""
|
|
186
|
+
|
|
187
|
+
instance_id: str
|
|
188
|
+
worker_id: int
|
|
189
|
+
location: str
|
|
190
|
+
sync_id: str
|
|
191
|
+
actual_total_keys: int # Actual total keys sent (for verification)
|
|
192
|
+
|
|
193
|
+
def describe(self) -> str:
|
|
194
|
+
return (
|
|
195
|
+
f"FullSyncEnd sync_id={self.sync_id} "
|
|
196
|
+
f"total_keys={self.actual_total_keys} from "
|
|
197
|
+
f"{self.instance_id}:{self.worker_id}"
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
class HeartbeatMsg(WorkerReqMsg):
|
|
202
|
+
"""Message for heartbeat (REQ-REP mode), include register info for re-register"""
|
|
203
|
+
|
|
204
|
+
instance_id: str
|
|
205
|
+
worker_id: int
|
|
206
|
+
ip: str
|
|
207
|
+
port: int
|
|
208
|
+
peer_init_url: Optional[str]
|
|
209
|
+
|
|
210
|
+
def describe(self) -> str:
|
|
211
|
+
return f"Heartbeat from instance {self.instance_id}, worker {self.worker_id}"
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
class BatchedP2PLookupMsg(WorkerReqMsg):
|
|
215
|
+
"""Batched P2P lookup message"""
|
|
216
|
+
|
|
217
|
+
hashes: list[int]
|
|
218
|
+
instance_id: str
|
|
219
|
+
worker_id: int # TP rank
|
|
220
|
+
|
|
221
|
+
def describe(self) -> str:
|
|
222
|
+
return (
|
|
223
|
+
f"Batched P2P lookup for {len(self.hashes)} keys from "
|
|
224
|
+
f"instance id {self.instance_id} and "
|
|
225
|
+
f"worker id {self.worker_id}"
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
class FullSyncStartMsg(WorkerReqMsg):
|
|
230
|
+
"""Full sync start message (REQ-REP mode, needs confirmation)
|
|
231
|
+
|
|
232
|
+
Sent before starting full sync to notify controller and get confirmation.
|
|
233
|
+
"""
|
|
234
|
+
|
|
235
|
+
instance_id: str
|
|
236
|
+
worker_id: int
|
|
237
|
+
location: str
|
|
238
|
+
sync_id: str # Sync session ID
|
|
239
|
+
total_keys: int # Expected total key count
|
|
240
|
+
batch_count: int # Expected batch count
|
|
241
|
+
|
|
242
|
+
def describe(self) -> str:
|
|
243
|
+
return (
|
|
244
|
+
f"FullSyncStart sync_id={self.sync_id} "
|
|
245
|
+
f"total_keys={self.total_keys} batches={self.batch_count} "
|
|
246
|
+
f"from {self.instance_id}:{self.worker_id}"
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
class FullSyncStatusMsg(WorkerReqMsg):
|
|
251
|
+
"""Full sync status query message (REQ-REP mode)
|
|
252
|
+
|
|
253
|
+
Used to query sync progress and check if freeze mode can be exited.
|
|
254
|
+
"""
|
|
255
|
+
|
|
256
|
+
instance_id: str
|
|
257
|
+
worker_id: int
|
|
258
|
+
sync_id: str
|
|
259
|
+
|
|
260
|
+
def describe(self) -> str:
|
|
261
|
+
return (
|
|
262
|
+
f"FullSyncStatus query sync_id={self.sync_id} "
|
|
263
|
+
f"from {self.instance_id}:{self.worker_id}"
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
"""Worker Request Return Message from Controller back to LMCache"""
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
class WorkerReqRetMsg(MsgBase):
|
|
271
|
+
def describe(self) -> str:
|
|
272
|
+
return ""
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
class RegisterRetMsg(WorkerReqRetMsg):
|
|
276
|
+
"""Register response message with controller configuration
|
|
277
|
+
|
|
278
|
+
Returns configuration information that the worker needs for initialization,
|
|
279
|
+
such as dedicated heartbeat URL.
|
|
280
|
+
"""
|
|
281
|
+
|
|
282
|
+
# Extra configuration from controller to worker
|
|
283
|
+
# e.g., {"heartbeat_url": "tcp://...:8082"}
|
|
284
|
+
extra_config: dict[str, str] = msgspec.field(default_factory=dict)
|
|
285
|
+
|
|
286
|
+
def describe(self) -> str:
|
|
287
|
+
return f"RegisterRet extra_config={self.extra_config}"
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
class HeartbeatRetMsg(WorkerReqRetMsg):
|
|
291
|
+
"""Heartbeat response message with optional commands
|
|
292
|
+
|
|
293
|
+
The controller can use this to send commands to workers through
|
|
294
|
+
the heartbeat mechanism. This provides a general-purpose way to
|
|
295
|
+
trigger actions on workers without adding new message types.
|
|
296
|
+
|
|
297
|
+
The commands field uses msgspec's tagged union for polymorphic
|
|
298
|
+
serialization - each command subclass is identified by its tag.
|
|
299
|
+
Commands are executed sequentially by the worker.
|
|
300
|
+
"""
|
|
301
|
+
|
|
302
|
+
commands: List[AnyCommand] = []
|
|
303
|
+
|
|
304
|
+
def describe(self) -> str:
|
|
305
|
+
if not self.commands:
|
|
306
|
+
return "HeartbeatRet (no commands)"
|
|
307
|
+
cmd_descs = [cmd.describe() for cmd in self.commands]
|
|
308
|
+
return f"HeartbeatRet commands=[{', '.join(cmd_descs)}]"
|
|
309
|
+
|
|
310
|
+
def has_commands(self) -> bool:
|
|
311
|
+
"""Check if there are commands to execute"""
|
|
312
|
+
return len(self.commands) > 0
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
class BatchedP2PLookupRetMsg(WorkerReqRetMsg):
|
|
316
|
+
"""Batched P2P lookup return message"""
|
|
317
|
+
|
|
318
|
+
# (instance_id, location, num_hit_chunks, peer_init_url)
|
|
319
|
+
layout_info: list[tuple[str, str, int, str]]
|
|
320
|
+
|
|
321
|
+
def describe(self) -> str:
|
|
322
|
+
return f"The layout info is {self.layout_info}"
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
class FullSyncStartRetMsg(WorkerReqRetMsg):
|
|
326
|
+
"""Full sync start response message"""
|
|
327
|
+
|
|
328
|
+
sync_id: str
|
|
329
|
+
accepted: bool # Whether sync request is accepted
|
|
330
|
+
error_msg: Optional[str] = None
|
|
331
|
+
|
|
332
|
+
def describe(self) -> str:
|
|
333
|
+
return f"FullSyncStartRet sync_id={self.sync_id} accepted={self.accepted}"
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
class FullSyncStatusRetMsg(WorkerReqRetMsg):
|
|
337
|
+
"""Full sync status response message"""
|
|
338
|
+
|
|
339
|
+
sync_id: str
|
|
340
|
+
is_complete: bool # Whether current worker sync is complete
|
|
341
|
+
global_progress: float # Global progress (0.0 - 1.0)
|
|
342
|
+
can_exit_freeze: bool # Whether freeze mode can be exited
|
|
343
|
+
missing_batches: list[int] = [] # List of missing batch IDs that need to be resent
|
|
344
|
+
|
|
345
|
+
def describe(self) -> str:
|
|
346
|
+
missing_info = (
|
|
347
|
+
f" missing={self.missing_batches}" if self.missing_batches else ""
|
|
348
|
+
)
|
|
349
|
+
return (
|
|
350
|
+
f"FullSyncStatusRet sync_id={self.sync_id} "
|
|
351
|
+
f"complete={self.is_complete} progress={self.global_progress:.2%} "
|
|
352
|
+
f"can_exit_freeze={self.can_exit_freeze}{missing_info}"
|
|
353
|
+
)
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
"""Control Message from Controller to LMCache"""
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
class ControlMsg(MsgBase):
|
|
360
|
+
def describe(self) -> str:
|
|
361
|
+
return ""
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
class ClearWorkerMsg(ControlMsg):
|
|
365
|
+
"""Clear message for a single lmcache worker"""
|
|
366
|
+
|
|
367
|
+
worker_event_id: str
|
|
368
|
+
location: str
|
|
369
|
+
|
|
370
|
+
def describe(self) -> str:
|
|
371
|
+
return f"Clear tokens in location {self.location}"
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
class PinWorkerMsg(ControlMsg):
|
|
375
|
+
"""Pin message for a single lmcache worker"""
|
|
376
|
+
|
|
377
|
+
worker_event_id: str
|
|
378
|
+
location: str
|
|
379
|
+
tokens: list[int]
|
|
380
|
+
|
|
381
|
+
def describe(self) -> str:
|
|
382
|
+
return f"Pin tokens {self.tokens} in location {self.location}"
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
class CompressWorkerMsg(ControlMsg):
|
|
386
|
+
"""Compress message for a single lmcache worker"""
|
|
387
|
+
|
|
388
|
+
worker_event_id: str
|
|
389
|
+
method: str
|
|
390
|
+
location: str
|
|
391
|
+
tokens: Optional[list[int]] = None
|
|
392
|
+
|
|
393
|
+
def describe(self) -> str:
|
|
394
|
+
return (
|
|
395
|
+
f"Compress tokens {self.tokens} in "
|
|
396
|
+
f"locations {self.location} with "
|
|
397
|
+
f"method {self.method}"
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
class DecompressWorkerMsg(ControlMsg):
|
|
402
|
+
"""Decompress message for a single lmcache worker"""
|
|
403
|
+
|
|
404
|
+
worker_event_id: str
|
|
405
|
+
method: str
|
|
406
|
+
location: str
|
|
407
|
+
tokens: Optional[list[int]] = None
|
|
408
|
+
|
|
409
|
+
def describe(self) -> str:
|
|
410
|
+
return (
|
|
411
|
+
f"Decompress tokens {self.tokens} in "
|
|
412
|
+
f"locations {self.location} with "
|
|
413
|
+
f"method {self.method}"
|
|
414
|
+
)
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
class MoveWorkerMsg(ControlMsg):
|
|
418
|
+
"""Move message for a single lmcache worker"""
|
|
419
|
+
|
|
420
|
+
worker_event_id: str
|
|
421
|
+
old_position: str # location (storage backend name)
|
|
422
|
+
new_position: Tuple[str, str] # (target_url, location (storage backend name) )
|
|
423
|
+
tokens: Optional[list[int]] = None
|
|
424
|
+
copy: Optional[bool] = True
|
|
425
|
+
|
|
426
|
+
def describe(self) -> str:
|
|
427
|
+
return (
|
|
428
|
+
f"Move tokens {self.tokens} from {self.old_position} to {self.new_position}"
|
|
429
|
+
)
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
class HealthWorkerMsg(ControlMsg):
|
|
433
|
+
"""Health message for a single lmcache worker"""
|
|
434
|
+
|
|
435
|
+
worker_event_id: str
|
|
436
|
+
|
|
437
|
+
def describe(self) -> str:
|
|
438
|
+
return "Health check"
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
class CheckFinishWorkerMsg(ControlMsg):
|
|
442
|
+
"""Check finish message for a single lmcache worker"""
|
|
443
|
+
|
|
444
|
+
worker_event_id: str
|
|
445
|
+
|
|
446
|
+
def describe(self) -> str:
|
|
447
|
+
return f"Checking finish for worker event {self.worker_event_id}"
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
class ControlRetMsg(MsgBase):
|
|
451
|
+
"""Return message from LMCache to Controller"""
|
|
452
|
+
|
|
453
|
+
def describe(self) -> str:
|
|
454
|
+
return ""
|
|
455
|
+
|
|
456
|
+
|
|
457
|
+
class ClearWorkerRetMsg(ControlRetMsg):
|
|
458
|
+
"""Return message for a ClearWorkerMsg"""
|
|
459
|
+
|
|
460
|
+
num_tokens: int
|
|
461
|
+
|
|
462
|
+
def describe(self) -> str:
|
|
463
|
+
return f"Number of cleared tokens: {self.num_tokens}"
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
class PinWorkerRetMsg(ControlRetMsg):
|
|
467
|
+
"""Pin return message for a single lmcache worker"""
|
|
468
|
+
|
|
469
|
+
num_tokens: int
|
|
470
|
+
|
|
471
|
+
def describe(self) -> str:
|
|
472
|
+
return f"Number of pinned tokens: {self.num_tokens}"
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
class CompressWorkerRetMsg(ControlRetMsg):
|
|
476
|
+
"""Compress return message for a single lmcache worker"""
|
|
477
|
+
|
|
478
|
+
num_tokens: int
|
|
479
|
+
|
|
480
|
+
def describe(self) -> str:
|
|
481
|
+
return f"Compress success: {self.num_tokens}"
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
class DecompressWorkerRetMsg(ControlRetMsg):
|
|
485
|
+
"""Decompress return message for a single lmcache worker"""
|
|
486
|
+
|
|
487
|
+
num_tokens: int
|
|
488
|
+
|
|
489
|
+
def describe(self) -> str:
|
|
490
|
+
return f"Decompress success: {self.num_tokens}"
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
class MoveWorkerRetMsg(ControlRetMsg):
|
|
494
|
+
"""Move return message for a single lmcache worker"""
|
|
495
|
+
|
|
496
|
+
num_tokens: int
|
|
497
|
+
|
|
498
|
+
def describe(self) -> str:
|
|
499
|
+
return f"Moving {self.num_tokens} tokens"
|
|
500
|
+
|
|
501
|
+
|
|
502
|
+
class HealthWorkerRetMsg(ControlRetMsg):
|
|
503
|
+
"""Health return message for a single lmcache worker"""
|
|
504
|
+
|
|
505
|
+
error_code: int
|
|
506
|
+
|
|
507
|
+
def describe(self) -> str:
|
|
508
|
+
return f"Health check error code: {self.error_code}"
|
|
509
|
+
|
|
510
|
+
|
|
511
|
+
class CheckFinishWorkerRetMsg(ControlRetMsg):
|
|
512
|
+
"""Check finish return message for a single lmcache worker"""
|
|
513
|
+
|
|
514
|
+
status: str
|
|
515
|
+
|
|
516
|
+
def describe(self) -> str:
|
|
517
|
+
return f"Check finish status: {self.status}"
|
|
518
|
+
|
|
519
|
+
|
|
520
|
+
"""Orchestration Message from Ochestrator to LMCache"""
|
|
521
|
+
|
|
522
|
+
|
|
523
|
+
class OrchMsg(MsgBase):
|
|
524
|
+
"""Message from Ochestrator to Controller"""
|
|
525
|
+
|
|
526
|
+
def describe(self) -> str:
|
|
527
|
+
return ""
|
|
528
|
+
|
|
529
|
+
|
|
530
|
+
class QueryInstMsg(OrchMsg):
|
|
531
|
+
"""Query instance message"""
|
|
532
|
+
|
|
533
|
+
event_id: str
|
|
534
|
+
ip: str
|
|
535
|
+
|
|
536
|
+
def describe(self) -> str:
|
|
537
|
+
return f"Query instance id of ip {self.ip}"
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
class LookupMsg(OrchMsg):
|
|
541
|
+
"""Lookup message"""
|
|
542
|
+
|
|
543
|
+
event_id: str
|
|
544
|
+
tokens: list[int]
|
|
545
|
+
|
|
546
|
+
def describe(self) -> str:
|
|
547
|
+
return f"Lookup tokens {self.tokens}"
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
class ClearMsg(OrchMsg):
|
|
551
|
+
"""Clear message"""
|
|
552
|
+
|
|
553
|
+
event_id: str
|
|
554
|
+
instance_id: str
|
|
555
|
+
location: str
|
|
556
|
+
|
|
557
|
+
def describe(self) -> str:
|
|
558
|
+
return (
|
|
559
|
+
f"Clear tokens in instance {self.instance_id} and locations {self.location}"
|
|
560
|
+
)
|
|
561
|
+
|
|
562
|
+
|
|
563
|
+
class PinMsg(OrchMsg):
|
|
564
|
+
"""Pin message"""
|
|
565
|
+
|
|
566
|
+
event_id: str
|
|
567
|
+
instance_id: str
|
|
568
|
+
location: str
|
|
569
|
+
tokens: list[int]
|
|
570
|
+
|
|
571
|
+
def describe(self) -> str:
|
|
572
|
+
return (
|
|
573
|
+
f"Pin tokens {self.tokens} in instance "
|
|
574
|
+
f"{self.instance_id} and "
|
|
575
|
+
f"location {self.location}"
|
|
576
|
+
)
|
|
577
|
+
|
|
578
|
+
|
|
579
|
+
class CompressMsg(OrchMsg):
|
|
580
|
+
"""Compress message"""
|
|
581
|
+
|
|
582
|
+
event_id: str
|
|
583
|
+
instance_id: str
|
|
584
|
+
method: str
|
|
585
|
+
location: str
|
|
586
|
+
tokens: Optional[list[int]] = None # `None` means compress all tokens
|
|
587
|
+
|
|
588
|
+
def describe(self) -> str:
|
|
589
|
+
return (
|
|
590
|
+
f"Compress tokens {self.tokens} in instance "
|
|
591
|
+
f"{self.instance_id} and "
|
|
592
|
+
f"locations {self.location} with "
|
|
593
|
+
f"method {self.method}"
|
|
594
|
+
)
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
class DecompressMsg(OrchMsg):
|
|
598
|
+
"""Decompress message"""
|
|
599
|
+
|
|
600
|
+
event_id: str
|
|
601
|
+
instance_id: str
|
|
602
|
+
method: str
|
|
603
|
+
location: str
|
|
604
|
+
tokens: Optional[list[int]] = None # `None` means compress all tokens
|
|
605
|
+
|
|
606
|
+
def describe(self) -> str:
|
|
607
|
+
return (
|
|
608
|
+
f"Decompress tokens {self.tokens} in instance "
|
|
609
|
+
f"{self.instance_id} and "
|
|
610
|
+
f"locations {self.location} with "
|
|
611
|
+
f"method {self.method}"
|
|
612
|
+
)
|
|
613
|
+
|
|
614
|
+
|
|
615
|
+
class MoveMsg(OrchMsg):
|
|
616
|
+
"""Move message"""
|
|
617
|
+
|
|
618
|
+
event_id: str
|
|
619
|
+
old_position: Tuple[str, str]
|
|
620
|
+
new_position: Tuple[str, str]
|
|
621
|
+
tokens: Optional[list[int]] = None
|
|
622
|
+
copy: Optional[bool] = False
|
|
623
|
+
|
|
624
|
+
def describe(self) -> str:
|
|
625
|
+
return (
|
|
626
|
+
f"Move tokens {self.tokens} from {self.old_position} to {self.new_position}"
|
|
627
|
+
)
|
|
628
|
+
|
|
629
|
+
|
|
630
|
+
class HealthMsg(OrchMsg):
|
|
631
|
+
"""Health message"""
|
|
632
|
+
|
|
633
|
+
event_id: str
|
|
634
|
+
instance_id: str
|
|
635
|
+
|
|
636
|
+
def describe(self) -> str:
|
|
637
|
+
return f"Health check for instance {self.instance_id}"
|
|
638
|
+
|
|
639
|
+
|
|
640
|
+
class CheckFinishMsg(OrchMsg):
|
|
641
|
+
"""Check finish message"""
|
|
642
|
+
|
|
643
|
+
event_id: str
|
|
644
|
+
|
|
645
|
+
def describe(self) -> str:
|
|
646
|
+
return f"Checking finish for event {self.event_id}"
|
|
647
|
+
|
|
648
|
+
|
|
649
|
+
class QueryWorkerInfoMsg(OrchMsg):
|
|
650
|
+
"""Query worker info message"""
|
|
651
|
+
|
|
652
|
+
event_id: str
|
|
653
|
+
instance_id: str
|
|
654
|
+
worker_ids: Optional[list[int]]
|
|
655
|
+
|
|
656
|
+
def describe(self) -> str:
|
|
657
|
+
return f"Query worker info of {self.instance_id} : {self.worker_ids}"
|
|
658
|
+
|
|
659
|
+
|
|
660
|
+
class OrchRetMsg(MsgBase):
|
|
661
|
+
"""Return message from Controller to Ochestrator"""
|
|
662
|
+
|
|
663
|
+
def describe(self) -> str:
|
|
664
|
+
return ""
|
|
665
|
+
|
|
666
|
+
|
|
667
|
+
class QueryInstRetMsg(OrchRetMsg):
|
|
668
|
+
"""Query instance return message"""
|
|
669
|
+
|
|
670
|
+
event_id: str
|
|
671
|
+
instance_id: Optional[str]
|
|
672
|
+
|
|
673
|
+
def describe(self) -> str:
|
|
674
|
+
return f"The instance id is {self.instance_id}"
|
|
675
|
+
|
|
676
|
+
|
|
677
|
+
class LookupRetMsg(OrchRetMsg):
|
|
678
|
+
"""Lookup return message"""
|
|
679
|
+
|
|
680
|
+
event_id: str
|
|
681
|
+
layout_info: Dict[str, Tuple[str, int]]
|
|
682
|
+
|
|
683
|
+
def describe(self) -> str:
|
|
684
|
+
return f"The layout info is {self.layout_info}"
|
|
685
|
+
|
|
686
|
+
|
|
687
|
+
class ClearRetMsg(OrchRetMsg):
|
|
688
|
+
"""Clear return message"""
|
|
689
|
+
|
|
690
|
+
event_id: str
|
|
691
|
+
num_tokens: int
|
|
692
|
+
|
|
693
|
+
def describe(self) -> str:
|
|
694
|
+
return f"Number of cleared tokens: {self.num_tokens}"
|
|
695
|
+
|
|
696
|
+
|
|
697
|
+
class PinRetMsg(OrchRetMsg):
|
|
698
|
+
"""Pin return message"""
|
|
699
|
+
|
|
700
|
+
event_id: str
|
|
701
|
+
num_tokens: int
|
|
702
|
+
|
|
703
|
+
def describe(self) -> str:
|
|
704
|
+
return f"Number of pinned tokens: {self.num_tokens}"
|
|
705
|
+
|
|
706
|
+
|
|
707
|
+
class CompressRetMsg(OrchRetMsg):
|
|
708
|
+
"""Compress return message"""
|
|
709
|
+
|
|
710
|
+
event_id: str
|
|
711
|
+
num_tokens: int
|
|
712
|
+
|
|
713
|
+
def describe(self) -> str:
|
|
714
|
+
return f"Compressed {self.num_tokens} tokens"
|
|
715
|
+
|
|
716
|
+
|
|
717
|
+
class DecompressRetMsg(OrchRetMsg):
|
|
718
|
+
"""Decompress return message"""
|
|
719
|
+
|
|
720
|
+
event_id: str
|
|
721
|
+
num_tokens: int
|
|
722
|
+
|
|
723
|
+
def describe(self) -> str:
|
|
724
|
+
return f"Decompressed {self.num_tokens} tokens"
|
|
725
|
+
|
|
726
|
+
|
|
727
|
+
class MoveRetMsg(OrchRetMsg):
|
|
728
|
+
"""Move return message"""
|
|
729
|
+
|
|
730
|
+
event_id: str
|
|
731
|
+
num_tokens: int
|
|
732
|
+
|
|
733
|
+
def describe(self) -> str:
|
|
734
|
+
return f"Moving {self.num_tokens} tokens"
|
|
735
|
+
|
|
736
|
+
|
|
737
|
+
class HealthRetMsg(OrchRetMsg):
|
|
738
|
+
"""Health return message"""
|
|
739
|
+
|
|
740
|
+
event_id: str
|
|
741
|
+
# worker_id -> error_code
|
|
742
|
+
error_codes: Dict[int, int]
|
|
743
|
+
|
|
744
|
+
def describe(self) -> str:
|
|
745
|
+
return f"error_codes: {self.error_codes}"
|
|
746
|
+
|
|
747
|
+
|
|
748
|
+
class CheckFinishRetMsg(OrchRetMsg):
|
|
749
|
+
"""Check finish return message"""
|
|
750
|
+
|
|
751
|
+
status: str
|
|
752
|
+
|
|
753
|
+
def describe(self) -> str:
|
|
754
|
+
return f"Event status: {self.status}"
|
|
755
|
+
|
|
756
|
+
|
|
757
|
+
class QueryWorkerInfoRetMsg(OrchRetMsg):
|
|
758
|
+
"""Query worker info return message"""
|
|
759
|
+
|
|
760
|
+
event_id: str
|
|
761
|
+
worker_infos: list[WorkerInfo]
|
|
762
|
+
|
|
763
|
+
def describe(self) -> str:
|
|
764
|
+
return f"worker infos: {self.worker_infos}"
|
|
765
|
+
|
|
766
|
+
|
|
767
|
+
class ErrorMsg(WorkerReqRetMsg):
|
|
768
|
+
"""Control Error Message"""
|
|
769
|
+
|
|
770
|
+
error: str
|
|
771
|
+
|
|
772
|
+
def describe(self) -> str:
|
|
773
|
+
return f"Error: {self.error}"
|
|
774
|
+
|
|
775
|
+
|
|
776
|
+
Msg = Union[
|
|
777
|
+
RegisterMsg,
|
|
778
|
+
RegisterRetMsg,
|
|
779
|
+
DeRegisterMsg,
|
|
780
|
+
KVAdmitMsg,
|
|
781
|
+
KVEvictMsg,
|
|
782
|
+
BatchedKVOperationMsg,
|
|
783
|
+
ClearWorkerMsg,
|
|
784
|
+
ClearWorkerRetMsg,
|
|
785
|
+
PinWorkerMsg,
|
|
786
|
+
PinWorkerRetMsg,
|
|
787
|
+
CompressWorkerMsg,
|
|
788
|
+
CompressWorkerRetMsg,
|
|
789
|
+
DecompressWorkerMsg,
|
|
790
|
+
DecompressWorkerRetMsg,
|
|
791
|
+
MoveWorkerMsg,
|
|
792
|
+
MoveWorkerRetMsg,
|
|
793
|
+
HealthWorkerMsg,
|
|
794
|
+
HealthWorkerRetMsg,
|
|
795
|
+
CheckFinishWorkerMsg,
|
|
796
|
+
CheckFinishWorkerRetMsg,
|
|
797
|
+
LookupMsg,
|
|
798
|
+
LookupRetMsg,
|
|
799
|
+
ClearMsg,
|
|
800
|
+
ClearRetMsg,
|
|
801
|
+
PinMsg,
|
|
802
|
+
PinRetMsg,
|
|
803
|
+
CompressMsg,
|
|
804
|
+
CompressRetMsg,
|
|
805
|
+
DecompressMsg,
|
|
806
|
+
DecompressRetMsg,
|
|
807
|
+
MoveMsg,
|
|
808
|
+
MoveRetMsg,
|
|
809
|
+
HealthMsg,
|
|
810
|
+
HealthRetMsg,
|
|
811
|
+
CheckFinishMsg,
|
|
812
|
+
CheckFinishRetMsg,
|
|
813
|
+
ErrorMsg,
|
|
814
|
+
QueryInstMsg,
|
|
815
|
+
QueryInstRetMsg,
|
|
816
|
+
HeartbeatMsg,
|
|
817
|
+
HeartbeatRetMsg,
|
|
818
|
+
BatchedP2PLookupMsg,
|
|
819
|
+
BatchedP2PLookupRetMsg,
|
|
820
|
+
QueryWorkerInfoMsg,
|
|
821
|
+
QueryWorkerInfoRetMsg,
|
|
822
|
+
FullSyncStartMsg,
|
|
823
|
+
FullSyncStartRetMsg,
|
|
824
|
+
FullSyncBatchMsg,
|
|
825
|
+
FullSyncEndMsg,
|
|
826
|
+
FullSyncStatusMsg,
|
|
827
|
+
FullSyncStatusRetMsg,
|
|
828
|
+
]
|