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/rpc_utils.py
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Standard
|
|
3
|
+
from typing import Literal, Optional
|
|
4
|
+
import os
|
|
5
|
+
import socket
|
|
6
|
+
|
|
7
|
+
# Third Party
|
|
8
|
+
import zmq
|
|
9
|
+
import zmq.asyncio
|
|
10
|
+
|
|
11
|
+
# First Party
|
|
12
|
+
from lmcache.logging import init_logger
|
|
13
|
+
|
|
14
|
+
logger = init_logger(__name__)
|
|
15
|
+
|
|
16
|
+
ServiceKind = Literal["lookup", "offload", "lookup_worker", "lookup_scheduler"]
|
|
17
|
+
|
|
18
|
+
# Default timeout constants for socket operations (in milliseconds)
|
|
19
|
+
DEFAULT_SOCKET_RECV_TIMEOUT_MS = 30000
|
|
20
|
+
DEFAULT_SOCKET_SEND_TIMEOUT_MS = 10000
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def get_zmq_context(use_asyncio: bool = True):
|
|
24
|
+
if use_asyncio:
|
|
25
|
+
return zmq.asyncio.Context.instance()
|
|
26
|
+
else:
|
|
27
|
+
return zmq.Context.instance()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def get_zmq_socket(
|
|
31
|
+
context, socket_path: str, protocol: str, role, bind_or_connect: str
|
|
32
|
+
):
|
|
33
|
+
"""
|
|
34
|
+
Create a ZeroMQ socket with the specified protocol and role.
|
|
35
|
+
"""
|
|
36
|
+
socket_addr = f"{protocol}://{socket_path}"
|
|
37
|
+
socket = context.socket(role)
|
|
38
|
+
if bind_or_connect == "bind":
|
|
39
|
+
socket.bind(socket_addr)
|
|
40
|
+
elif bind_or_connect == "connect":
|
|
41
|
+
socket.connect(socket_addr)
|
|
42
|
+
else:
|
|
43
|
+
raise ValueError(f"Invalid bind_or_connect: {bind_or_connect}")
|
|
44
|
+
|
|
45
|
+
return socket
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def get_zmq_socket_with_timeout(
|
|
49
|
+
context,
|
|
50
|
+
socket_path: str,
|
|
51
|
+
protocol: str,
|
|
52
|
+
role,
|
|
53
|
+
bind_or_connect: str,
|
|
54
|
+
recv_timeout_ms: int,
|
|
55
|
+
send_timeout_ms: int,
|
|
56
|
+
) -> zmq.asyncio.Socket:
|
|
57
|
+
"""
|
|
58
|
+
Create a ZeroMQ socket with timeout settings.
|
|
59
|
+
"""
|
|
60
|
+
socket = get_zmq_socket(
|
|
61
|
+
context,
|
|
62
|
+
socket_path,
|
|
63
|
+
protocol,
|
|
64
|
+
role,
|
|
65
|
+
bind_or_connect,
|
|
66
|
+
)
|
|
67
|
+
# Only set RCVTIMEO for client role connect sockets
|
|
68
|
+
if bind_or_connect == "connect":
|
|
69
|
+
socket.setsockopt(zmq.RCVTIMEO, recv_timeout_ms)
|
|
70
|
+
socket.setsockopt(zmq.SNDTIMEO, send_timeout_ms)
|
|
71
|
+
return socket
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def close_zmq_socket(socket: zmq.asyncio.Socket, linger: int = 0) -> None:
|
|
75
|
+
"""
|
|
76
|
+
Close a ZeroMQ socket cleanly.
|
|
77
|
+
|
|
78
|
+
:param socket: The zmq.Socket to be closed.
|
|
79
|
+
:param linger: LINGER period (in milliseconds).
|
|
80
|
+
Default is 0 (drop immediately).
|
|
81
|
+
"""
|
|
82
|
+
try:
|
|
83
|
+
socket.setsockopt(zmq.LINGER, linger) # type: ignore[attr-defined]
|
|
84
|
+
socket.close()
|
|
85
|
+
except Exception as e:
|
|
86
|
+
logger.error(f"Warning: Failed to close socket cleanly: {e}")
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def get_ip():
|
|
90
|
+
"""
|
|
91
|
+
Get the local IP address of the machine.
|
|
92
|
+
"""
|
|
93
|
+
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
94
|
+
try:
|
|
95
|
+
# "Connect" to a public IP — just to determine local IP
|
|
96
|
+
s.connect(("8.8.8.8", 80))
|
|
97
|
+
return s.getsockname()[0]
|
|
98
|
+
except Exception:
|
|
99
|
+
logger.warning(
|
|
100
|
+
"Failed to get local IP address. Falling back to loopback address."
|
|
101
|
+
)
|
|
102
|
+
return "127.0.0.1" # Fallback to loopback
|
|
103
|
+
finally:
|
|
104
|
+
s.close()
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def get_zmq_rpc_path_lmcache(
|
|
108
|
+
engine_id: str,
|
|
109
|
+
service_name: ServiceKind = "lookup",
|
|
110
|
+
rpc_port: int = 0,
|
|
111
|
+
rank: int = 0,
|
|
112
|
+
base_url: Optional[str] = None,
|
|
113
|
+
) -> str:
|
|
114
|
+
"""Get the ZMQ RPC path for LMCache lookup and offload communication.
|
|
115
|
+
|
|
116
|
+
Args:
|
|
117
|
+
engine_id: The engine ID for the RPC path.
|
|
118
|
+
service_name: The service name, one of 'lookup', 'offload',
|
|
119
|
+
'lookup_worker', 'lookup_scheduler'.
|
|
120
|
+
rpc_port: The RPC port number.
|
|
121
|
+
rank: The rank of the worker.
|
|
122
|
+
base_url: Optional base URL for the socket path. If not provided,
|
|
123
|
+
will try to use VLLM_RPC_BASE_PATH or fallback to /tmp/vllm_rpc.
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
The ZMQ socket path string.
|
|
127
|
+
"""
|
|
128
|
+
if base_url is None:
|
|
129
|
+
# Try to import vllm.envs, fallback to default if not available
|
|
130
|
+
try:
|
|
131
|
+
# Third Party
|
|
132
|
+
import vllm.envs as envs
|
|
133
|
+
|
|
134
|
+
base_url = envs.VLLM_RPC_BASE_PATH
|
|
135
|
+
except (ImportError, ModuleNotFoundError):
|
|
136
|
+
# Fallback for testing environments without vllm
|
|
137
|
+
base_url = "/tmp/vllm_rpc"
|
|
138
|
+
logger.debug("vllm not available, using default base_url: %s", base_url)
|
|
139
|
+
# Ensure the directory exists for IPC socket
|
|
140
|
+
os.makedirs(base_url, exist_ok=True)
|
|
141
|
+
|
|
142
|
+
if service_name not in {"lookup", "offload", "lookup_worker", "lookup_scheduler"}:
|
|
143
|
+
raise ValueError(
|
|
144
|
+
f"service_name must be 'lookup' or 'offload', got {service_name!r}"
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
if isinstance(rpc_port, str):
|
|
148
|
+
rpc_port = rpc_port + str(rank)
|
|
149
|
+
else:
|
|
150
|
+
rpc_port += rank
|
|
151
|
+
|
|
152
|
+
logger.debug(
|
|
153
|
+
"Base URL: %s, Engine: %s, Service Name: %s, RPC Port: %s",
|
|
154
|
+
base_url,
|
|
155
|
+
engine_id,
|
|
156
|
+
service_name,
|
|
157
|
+
rpc_port,
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
socket_path = (
|
|
161
|
+
f"{base_url}/engine_{engine_id}_service_{service_name}_"
|
|
162
|
+
f"lmcache_rpc_port_{rpc_port}"
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
return socket_path
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Standard
|
|
3
|
+
import socket
|
|
4
|
+
import threading
|
|
5
|
+
import time
|
|
6
|
+
|
|
7
|
+
# Third Party
|
|
8
|
+
import torch
|
|
9
|
+
|
|
10
|
+
# First Party
|
|
11
|
+
from lmcache.logging import init_logger
|
|
12
|
+
from lmcache.v1.memory_management import MemoryFormat
|
|
13
|
+
from lmcache.v1.protocol import (
|
|
14
|
+
ClientCommand,
|
|
15
|
+
ClientMetaMessage,
|
|
16
|
+
ServerMetaMessage,
|
|
17
|
+
ServerReturnCode,
|
|
18
|
+
)
|
|
19
|
+
from lmcache.v1.server.storage_backend import CreateStorageBackend
|
|
20
|
+
|
|
21
|
+
logger = init_logger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class LMCacheServer:
|
|
25
|
+
def __init__(self, host, port, device):
|
|
26
|
+
self.host = host
|
|
27
|
+
self.port = port
|
|
28
|
+
# self.data_store = {}
|
|
29
|
+
self.data_store = CreateStorageBackend(device)
|
|
30
|
+
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
31
|
+
self.server_socket.bind((host, port))
|
|
32
|
+
self.server_socket.listen()
|
|
33
|
+
|
|
34
|
+
def receive_all(self, client_socket, n):
|
|
35
|
+
data = bytearray()
|
|
36
|
+
while len(data) < n:
|
|
37
|
+
packet = client_socket.recv(n - len(data))
|
|
38
|
+
if not packet:
|
|
39
|
+
return None
|
|
40
|
+
data.extend(packet)
|
|
41
|
+
return data
|
|
42
|
+
|
|
43
|
+
def handle_client(self, client_socket):
|
|
44
|
+
try:
|
|
45
|
+
while True:
|
|
46
|
+
logger.debug("Waiting for command")
|
|
47
|
+
header = self.receive_all(client_socket, ClientMetaMessage.packlength())
|
|
48
|
+
if not header:
|
|
49
|
+
break
|
|
50
|
+
meta = ClientMetaMessage.deserialize(header)
|
|
51
|
+
logger.debug(f"Received command: {meta.command}")
|
|
52
|
+
match meta.command:
|
|
53
|
+
case ClientCommand.PUT:
|
|
54
|
+
t0 = time.perf_counter()
|
|
55
|
+
s = self.receive_all(client_socket, meta.length)
|
|
56
|
+
t1 = time.perf_counter()
|
|
57
|
+
self.data_store.put(meta, s)
|
|
58
|
+
t2 = time.perf_counter()
|
|
59
|
+
logger.debug(
|
|
60
|
+
f"Time to receive data: {t1 - t0}, time to store "
|
|
61
|
+
f"data: {t2 - t1}"
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
case ClientCommand.GET:
|
|
65
|
+
t0 = time.perf_counter()
|
|
66
|
+
lms_memory_obj = self.data_store.get(meta.key)
|
|
67
|
+
t1 = time.perf_counter()
|
|
68
|
+
if lms_memory_obj is not None:
|
|
69
|
+
client_socket.sendall(
|
|
70
|
+
ServerMetaMessage(
|
|
71
|
+
ServerReturnCode.SUCCESS,
|
|
72
|
+
lms_memory_obj.length,
|
|
73
|
+
lms_memory_obj.fmt,
|
|
74
|
+
lms_memory_obj.dtype,
|
|
75
|
+
lms_memory_obj.shape,
|
|
76
|
+
).serialize()
|
|
77
|
+
)
|
|
78
|
+
t2 = time.perf_counter()
|
|
79
|
+
client_socket.sendall(lms_memory_obj.data)
|
|
80
|
+
t3 = time.perf_counter()
|
|
81
|
+
logger.debug(
|
|
82
|
+
f"Time to get data: {t1 - t0}, time to send "
|
|
83
|
+
f"meta: {t2 - t1}, time to send data: {t3 - t2}"
|
|
84
|
+
)
|
|
85
|
+
else:
|
|
86
|
+
client_socket.sendall(
|
|
87
|
+
ServerMetaMessage(
|
|
88
|
+
ServerReturnCode.FAIL,
|
|
89
|
+
0,
|
|
90
|
+
MemoryFormat(1),
|
|
91
|
+
torch.float16,
|
|
92
|
+
torch.Size((0, 0, 0, 0)),
|
|
93
|
+
).serialize()
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
case ClientCommand.EXIST:
|
|
97
|
+
code = (
|
|
98
|
+
ServerReturnCode.SUCCESS
|
|
99
|
+
if self.data_store.contains(meta.key)
|
|
100
|
+
else ServerReturnCode.FAIL
|
|
101
|
+
)
|
|
102
|
+
logger.debug(f"Key exists: {code}")
|
|
103
|
+
client_socket.sendall(
|
|
104
|
+
ServerMetaMessage(
|
|
105
|
+
code,
|
|
106
|
+
0,
|
|
107
|
+
MemoryFormat(1),
|
|
108
|
+
torch.float16,
|
|
109
|
+
torch.Size((0, 0, 0, 0)),
|
|
110
|
+
).serialize()
|
|
111
|
+
)
|
|
112
|
+
case ClientCommand.HEALTH:
|
|
113
|
+
client_socket.sendall(
|
|
114
|
+
ServerMetaMessage(
|
|
115
|
+
ServerReturnCode.SUCCESS,
|
|
116
|
+
0,
|
|
117
|
+
MemoryFormat(1),
|
|
118
|
+
torch.float16,
|
|
119
|
+
torch.Size((0, 0, 0, 0)),
|
|
120
|
+
).serialize()
|
|
121
|
+
)
|
|
122
|
+
logger.debug("Health check successful")
|
|
123
|
+
|
|
124
|
+
# TODO(Jiayi): Implement List
|
|
125
|
+
# case ClientCommand.LIST:
|
|
126
|
+
# keys = list(self.data_store.list_keys())
|
|
127
|
+
# data = "\n".join(keys).encode()
|
|
128
|
+
# client_socket.sendall(
|
|
129
|
+
# ServerMetaMessage(ServerReturnCode.SUCCESS,
|
|
130
|
+
# len(data)).serialize())
|
|
131
|
+
# client_socket.sendall(data)
|
|
132
|
+
|
|
133
|
+
finally:
|
|
134
|
+
logger.info("Client disconnected")
|
|
135
|
+
client_socket.close()
|
|
136
|
+
|
|
137
|
+
def run(self):
|
|
138
|
+
logger.info(f"Server started at {self.host}:{self.port}")
|
|
139
|
+
try:
|
|
140
|
+
while True:
|
|
141
|
+
client_socket, addr = self.server_socket.accept()
|
|
142
|
+
logger.info(f"Connected by {addr}")
|
|
143
|
+
threading.Thread(
|
|
144
|
+
target=self.handle_client, args=(client_socket,)
|
|
145
|
+
).start()
|
|
146
|
+
finally:
|
|
147
|
+
self.server_socket.close()
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def main():
|
|
151
|
+
# Standard
|
|
152
|
+
import sys
|
|
153
|
+
|
|
154
|
+
if len(sys.argv) not in [3, 4]:
|
|
155
|
+
logger.error(f"Usage: {sys.argv[0]} <host> <port> <storage>(default:cpu)")
|
|
156
|
+
exit(1)
|
|
157
|
+
|
|
158
|
+
host = sys.argv[1]
|
|
159
|
+
port = int(sys.argv[2])
|
|
160
|
+
if len(sys.argv) == 4:
|
|
161
|
+
device = sys.argv[3]
|
|
162
|
+
else:
|
|
163
|
+
device = "cpu"
|
|
164
|
+
|
|
165
|
+
server = LMCacheServer(host, port, device)
|
|
166
|
+
server.run()
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
if __name__ == "__main__":
|
|
170
|
+
main()
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# First Party
|
|
3
|
+
from lmcache.logging import init_logger
|
|
4
|
+
from lmcache.v1.server.storage_backend.abstract_backend import LMSBackendInterface
|
|
5
|
+
from lmcache.v1.server.storage_backend.local_backend import LMSLocalBackend
|
|
6
|
+
|
|
7
|
+
logger = init_logger(__name__)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def CreateStorageBackend(device: str) -> LMSBackendInterface:
|
|
11
|
+
match device:
|
|
12
|
+
case "cpu":
|
|
13
|
+
# cpu only
|
|
14
|
+
logger.info("Initializing cpu-only cache server")
|
|
15
|
+
return LMSLocalBackend()
|
|
16
|
+
case _:
|
|
17
|
+
raise ValueError(f"Unsupported device: {device}")
|
|
18
|
+
# TODO(Jiayi): please implement hierarchical remote storage
|
|
19
|
+
# case _:
|
|
20
|
+
# logger.info("Initializing disk-only cache server")
|
|
21
|
+
# return LMSLocalDiskBackend(path=device)
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Standard
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
import abc
|
|
5
|
+
|
|
6
|
+
# First Party
|
|
7
|
+
from lmcache.logging import init_logger
|
|
8
|
+
from lmcache.utils import CacheEngineKey
|
|
9
|
+
from lmcache.v1.protocol import ClientMetaMessage
|
|
10
|
+
from lmcache.v1.server.utils import LMSMemoryObj
|
|
11
|
+
|
|
12
|
+
logger = init_logger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class LMSBackendInterface(metaclass=abc.ABCMeta):
|
|
16
|
+
@abc.abstractmethod
|
|
17
|
+
def put(
|
|
18
|
+
self,
|
|
19
|
+
client_meta: ClientMetaMessage,
|
|
20
|
+
kv_chunk_bytes: bytearray,
|
|
21
|
+
) -> None:
|
|
22
|
+
"""
|
|
23
|
+
Store the KV cache of the tokens into the cache server.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
key: the key of the token chunk, in the format of CacheEngineKey
|
|
27
|
+
client_meta: metadata sent by the client
|
|
28
|
+
kv_chunk_bytes: the kv cache (bytearray) of the token chunk
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
None
|
|
32
|
+
"""
|
|
33
|
+
raise NotImplementedError
|
|
34
|
+
|
|
35
|
+
@abc.abstractmethod
|
|
36
|
+
def contains(
|
|
37
|
+
self,
|
|
38
|
+
key: CacheEngineKey,
|
|
39
|
+
) -> bool:
|
|
40
|
+
"""
|
|
41
|
+
Query if a key is in the cache or not
|
|
42
|
+
"""
|
|
43
|
+
raise NotImplementedError
|
|
44
|
+
|
|
45
|
+
@abc.abstractmethod
|
|
46
|
+
def get(
|
|
47
|
+
self,
|
|
48
|
+
key: CacheEngineKey,
|
|
49
|
+
) -> Optional[LMSMemoryObj]:
|
|
50
|
+
"""
|
|
51
|
+
Retrieve LMSMemoryObj by the given key
|
|
52
|
+
|
|
53
|
+
Input:
|
|
54
|
+
key: the CacheEngineKey
|
|
55
|
+
|
|
56
|
+
Output:
|
|
57
|
+
An LMSMemoryObj object that contains the KV cache bytearray
|
|
58
|
+
with the some metadata
|
|
59
|
+
"""
|
|
60
|
+
raise NotImplementedError
|
|
61
|
+
|
|
62
|
+
@abc.abstractmethod
|
|
63
|
+
def list_keys(
|
|
64
|
+
self,
|
|
65
|
+
) -> List[CacheEngineKey]:
|
|
66
|
+
"""
|
|
67
|
+
List all keys in the cache server
|
|
68
|
+
|
|
69
|
+
Output:
|
|
70
|
+
All keys in the cache server
|
|
71
|
+
"""
|
|
72
|
+
raise NotImplementedError
|
|
73
|
+
|
|
74
|
+
@abc.abstractmethod
|
|
75
|
+
def close(self):
|
|
76
|
+
"""
|
|
77
|
+
Do the cleanup things
|
|
78
|
+
Children classes should override this method if necessary
|
|
79
|
+
"""
|
|
80
|
+
pass
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Standard
|
|
3
|
+
from collections import OrderedDict
|
|
4
|
+
from typing import List, Optional
|
|
5
|
+
import threading
|
|
6
|
+
|
|
7
|
+
# First Party
|
|
8
|
+
from lmcache.logging import init_logger
|
|
9
|
+
from lmcache.utils import CacheEngineKey, _lmcache_nvtx_annotate
|
|
10
|
+
from lmcache.v1.protocol import ClientMetaMessage
|
|
11
|
+
from lmcache.v1.server.storage_backend.abstract_backend import LMSBackendInterface
|
|
12
|
+
from lmcache.v1.server.utils import LMSMemoryObj
|
|
13
|
+
|
|
14
|
+
logger = init_logger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class LMSLocalBackend(LMSBackendInterface):
|
|
18
|
+
def __init__(
|
|
19
|
+
self,
|
|
20
|
+
) -> None:
|
|
21
|
+
self.dict: OrderedDict[CacheEngineKey, LMSMemoryObj] = OrderedDict()
|
|
22
|
+
|
|
23
|
+
self.lock = threading.Lock()
|
|
24
|
+
|
|
25
|
+
# TODO(Jiayi): please add evictor
|
|
26
|
+
|
|
27
|
+
# TODO
|
|
28
|
+
def list_keys(self) -> List[CacheEngineKey]:
|
|
29
|
+
with self.lock:
|
|
30
|
+
return list(self.dict.keys())
|
|
31
|
+
|
|
32
|
+
def contains(
|
|
33
|
+
self,
|
|
34
|
+
key: CacheEngineKey,
|
|
35
|
+
) -> bool:
|
|
36
|
+
with self.lock:
|
|
37
|
+
return key in self.dict
|
|
38
|
+
|
|
39
|
+
# TODO
|
|
40
|
+
def remove(
|
|
41
|
+
self,
|
|
42
|
+
key: CacheEngineKey,
|
|
43
|
+
) -> None:
|
|
44
|
+
with self.lock:
|
|
45
|
+
self.dict.pop(key)
|
|
46
|
+
|
|
47
|
+
def put(
|
|
48
|
+
self,
|
|
49
|
+
client_meta: ClientMetaMessage,
|
|
50
|
+
kv_chunk_bytes: bytearray,
|
|
51
|
+
) -> None:
|
|
52
|
+
with self.lock:
|
|
53
|
+
self.dict[client_meta.key] = LMSMemoryObj(
|
|
54
|
+
kv_chunk_bytes,
|
|
55
|
+
client_meta.length,
|
|
56
|
+
client_meta.fmt,
|
|
57
|
+
client_meta.dtype,
|
|
58
|
+
client_meta.shape,
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
@_lmcache_nvtx_annotate
|
|
62
|
+
def get(
|
|
63
|
+
self,
|
|
64
|
+
key: CacheEngineKey,
|
|
65
|
+
) -> Optional[LMSMemoryObj]:
|
|
66
|
+
with self.lock:
|
|
67
|
+
return self.dict.get(key, None)
|
|
68
|
+
|
|
69
|
+
def close(self):
|
|
70
|
+
pass
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# TODO(Jiayi): please implement the remote disk backend
|
|
74
|
+
# class LMSLocalDiskBackend(LMSBackendInterface):
|
|
75
|
+
# pass
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Standard
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Optional
|
|
5
|
+
|
|
6
|
+
# Third Party
|
|
7
|
+
import torch
|
|
8
|
+
|
|
9
|
+
# First Party
|
|
10
|
+
from lmcache.v1.memory_management import MemoryFormat
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# TODO(Jiayi): Maybe move the memory management in remote
|
|
14
|
+
# cache server to `memory_management.py` as well.
|
|
15
|
+
@dataclass
|
|
16
|
+
class LMSMemoryObj:
|
|
17
|
+
data: bytearray
|
|
18
|
+
length: int
|
|
19
|
+
fmt: MemoryFormat
|
|
20
|
+
dtype: Optional[torch.dtype]
|
|
21
|
+
shape: torch.Size
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|