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
|
File without changes
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Standard
|
|
3
|
+
from typing import Any, Awaitable, Callable
|
|
4
|
+
import abc
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class BaseJobExecutor(metaclass=abc.ABCMeta):
|
|
8
|
+
@abc.abstractmethod
|
|
9
|
+
async def submit_job(
|
|
10
|
+
self,
|
|
11
|
+
fn: Callable[..., Awaitable[Any]] | Callable[..., Any],
|
|
12
|
+
*args: Any,
|
|
13
|
+
**kwargs: Any,
|
|
14
|
+
) -> Any:
|
|
15
|
+
"""
|
|
16
|
+
Submit a job to the executor.
|
|
17
|
+
|
|
18
|
+
:param fn: The function to execute.
|
|
19
|
+
:param args: The positional arguments to pass to the function.
|
|
20
|
+
:param kwargs: The keyword arguments to pass to the function (e.g., priority).
|
|
21
|
+
|
|
22
|
+
:return: Return type aligned with the function being executed.
|
|
23
|
+
"""
|
|
24
|
+
raise NotImplementedError
|
|
25
|
+
|
|
26
|
+
@abc.abstractmethod
|
|
27
|
+
def shutdown(self, wait: bool = True) -> None:
|
|
28
|
+
"""
|
|
29
|
+
Clean up the executor, optionally waiting for currently running jobs to finish.
|
|
30
|
+
|
|
31
|
+
:param wait: If True, wait for currently running jobs to finish before
|
|
32
|
+
returning.
|
|
33
|
+
"""
|
|
34
|
+
raise NotImplementedError
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Standard
|
|
3
|
+
from asyncio import CancelledError
|
|
4
|
+
from concurrent.futures import Future
|
|
5
|
+
from typing import Any, Awaitable, Callable
|
|
6
|
+
import asyncio
|
|
7
|
+
import itertools
|
|
8
|
+
|
|
9
|
+
# First Party
|
|
10
|
+
from lmcache.v1.storage_backend.job_executor.base_executor import BaseJobExecutor
|
|
11
|
+
|
|
12
|
+
_SENTINEL = object()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class AsyncPQExecutor(BaseJobExecutor):
|
|
16
|
+
"""Execute async functions with a priority queue and using event loop"""
|
|
17
|
+
|
|
18
|
+
def __init__(self, loop: asyncio.AbstractEventLoop, max_workers: int = 4):
|
|
19
|
+
max_size = 0 # infinite
|
|
20
|
+
self.loop = loop
|
|
21
|
+
# (priority, time_id, fn, args, kwargs, done_future)
|
|
22
|
+
self._queue: asyncio.PriorityQueue[
|
|
23
|
+
tuple[
|
|
24
|
+
int,
|
|
25
|
+
int,
|
|
26
|
+
Callable[..., Awaitable[Any]] | object,
|
|
27
|
+
Any,
|
|
28
|
+
dict[str, Any],
|
|
29
|
+
asyncio.Future[Any] | None,
|
|
30
|
+
]
|
|
31
|
+
] = asyncio.PriorityQueue(maxsize=max_size)
|
|
32
|
+
# counter breaks ties for equal priority items (FCFS)
|
|
33
|
+
self._counter = itertools.count()
|
|
34
|
+
self.max_workers = max_workers
|
|
35
|
+
# we don't use asyncio.create_task so that PQ executor can be invoked
|
|
36
|
+
# from sync code
|
|
37
|
+
self._workers: list[Future] = [
|
|
38
|
+
asyncio.run_coroutine_threadsafe(self._worker(), loop)
|
|
39
|
+
for _ in range(max_workers)
|
|
40
|
+
]
|
|
41
|
+
self._closed = False
|
|
42
|
+
|
|
43
|
+
async def submit_job(
|
|
44
|
+
self,
|
|
45
|
+
fn: Callable[..., Awaitable[Any]],
|
|
46
|
+
*args: Any,
|
|
47
|
+
**kwargs: Any,
|
|
48
|
+
) -> Any:
|
|
49
|
+
# Assign highest priority by default
|
|
50
|
+
priority = kwargs.pop("priority", 0)
|
|
51
|
+
done: asyncio.Future[Any] = self.loop.create_future()
|
|
52
|
+
await self._queue.put((priority, next(self._counter), fn, args, kwargs, done))
|
|
53
|
+
return await done
|
|
54
|
+
|
|
55
|
+
async def _worker(self):
|
|
56
|
+
while True:
|
|
57
|
+
try:
|
|
58
|
+
item = await self._queue.get()
|
|
59
|
+
except GeneratorExit:
|
|
60
|
+
# GeneratorExit means the generator/coroutine is being closed,
|
|
61
|
+
# likely during interpreter shutdown.
|
|
62
|
+
# Just exit without calling task_done()
|
|
63
|
+
break
|
|
64
|
+
except CancelledError:
|
|
65
|
+
# Task cancellation, we should exit cleanly
|
|
66
|
+
break
|
|
67
|
+
except Exception:
|
|
68
|
+
# Any other exception, break the loop
|
|
69
|
+
break
|
|
70
|
+
|
|
71
|
+
# Detect sentinel both as raw object and wrapped tuple
|
|
72
|
+
if item is _SENTINEL or (
|
|
73
|
+
isinstance(item, tuple) and len(item) >= 3 and item[2] is _SENTINEL
|
|
74
|
+
):
|
|
75
|
+
self._queue.task_done()
|
|
76
|
+
break
|
|
77
|
+
|
|
78
|
+
_, _, fn, args, kwargs, done = item
|
|
79
|
+
try:
|
|
80
|
+
result = await fn(*args, **kwargs)
|
|
81
|
+
done.set_result(result)
|
|
82
|
+
except Exception as e:
|
|
83
|
+
done.set_exception(e)
|
|
84
|
+
finally:
|
|
85
|
+
# decrement task count
|
|
86
|
+
# join needs to wait until task count is zero
|
|
87
|
+
self._queue.task_done()
|
|
88
|
+
|
|
89
|
+
async def shutdown_async(self, wait: bool = True) -> None:
|
|
90
|
+
"""Async shutdown — safe to call from a coroutine on the event loop.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
wait: If True, drain the queue before shutting down.
|
|
94
|
+
"""
|
|
95
|
+
if self._closed:
|
|
96
|
+
return
|
|
97
|
+
self._closed = True
|
|
98
|
+
|
|
99
|
+
# Enqueue comparable sentinel tuples with the highest priority value so
|
|
100
|
+
# that outstanding work drains before shutdown signals are consumed.
|
|
101
|
+
# Use a very large integer to satisfy the typed queue's expected int priority
|
|
102
|
+
sentinel_priority = 2**31 - 1
|
|
103
|
+
|
|
104
|
+
# Push sentinel for each worker
|
|
105
|
+
for _ in range(self.max_workers):
|
|
106
|
+
await self._queue.put(
|
|
107
|
+
(sentinel_priority, next(self._counter), _SENTINEL, None, {}, None)
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
# Cancel all worker futures to ensure they stop
|
|
111
|
+
# Even when wait=False, we should cancel workers to prevent hanging coroutines
|
|
112
|
+
for fut in self._workers:
|
|
113
|
+
if not fut.done():
|
|
114
|
+
fut.cancel()
|
|
115
|
+
|
|
116
|
+
if wait:
|
|
117
|
+
# Let workers drain tasks and exit gracefully
|
|
118
|
+
await self._queue.join()
|
|
119
|
+
# Wait for all workers to complete (with cancellation handling)
|
|
120
|
+
await asyncio.gather(
|
|
121
|
+
*[asyncio.wrap_future(fut, loop=self.loop) for fut in self._workers],
|
|
122
|
+
return_exceptions=True,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
def shutdown(self, wait: bool = True) -> None:
|
|
126
|
+
"""Sync shutdown — blocks the calling thread until shutdown is complete."""
|
|
127
|
+
future = asyncio.run_coroutine_threadsafe(self.shutdown_async(wait), self.loop)
|
|
128
|
+
if wait:
|
|
129
|
+
# Propagate exceptions if any
|
|
130
|
+
future.result()
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class AsyncPQThreadPoolExecutor(AsyncPQExecutor):
|
|
134
|
+
"""Execute sync functions with a priority queue and using threadpool"""
|
|
135
|
+
|
|
136
|
+
def __init__(self, loop: asyncio.AbstractEventLoop, max_workers: int = 4):
|
|
137
|
+
max_size = 0 # infinite
|
|
138
|
+
self.loop = loop
|
|
139
|
+
self._queue: asyncio.PriorityQueue[
|
|
140
|
+
tuple[
|
|
141
|
+
int,
|
|
142
|
+
int,
|
|
143
|
+
Callable[..., Any] | object,
|
|
144
|
+
Any,
|
|
145
|
+
dict[str, Any],
|
|
146
|
+
asyncio.Future[Any] | None,
|
|
147
|
+
]
|
|
148
|
+
] = asyncio.PriorityQueue(maxsize=max_size)
|
|
149
|
+
# counter breaks ties for equal priority items (FCFS)
|
|
150
|
+
self._counter = itertools.count()
|
|
151
|
+
self.max_workers = max_workers
|
|
152
|
+
self._workers = []
|
|
153
|
+
for _ in range(max_workers):
|
|
154
|
+
self._workers.append(
|
|
155
|
+
asyncio.run_coroutine_threadsafe(self._worker(), self.loop)
|
|
156
|
+
)
|
|
157
|
+
self._closed = False
|
|
158
|
+
|
|
159
|
+
async def _worker(self):
|
|
160
|
+
while True:
|
|
161
|
+
try:
|
|
162
|
+
item = await self._queue.get()
|
|
163
|
+
except GeneratorExit:
|
|
164
|
+
# GeneratorExit means the generator/coroutine is being closed,
|
|
165
|
+
# likely during interpreter shutdown.
|
|
166
|
+
# Just exit without calling task_done()
|
|
167
|
+
break
|
|
168
|
+
except CancelledError:
|
|
169
|
+
# Task cancellation, we should exit cleanly
|
|
170
|
+
break
|
|
171
|
+
except Exception:
|
|
172
|
+
# Any other exception, break the loop
|
|
173
|
+
break
|
|
174
|
+
|
|
175
|
+
# Detect sentinel both as raw object and wrapped tuple
|
|
176
|
+
if item is _SENTINEL or (
|
|
177
|
+
isinstance(item, tuple) and len(item) >= 3 and item[2] is _SENTINEL
|
|
178
|
+
):
|
|
179
|
+
self._queue.task_done()
|
|
180
|
+
break
|
|
181
|
+
|
|
182
|
+
_, _, fn, args, kwargs, done = item
|
|
183
|
+
try:
|
|
184
|
+
result = await asyncio.to_thread(fn, *args, **kwargs)
|
|
185
|
+
done.set_result(result)
|
|
186
|
+
except Exception as e:
|
|
187
|
+
done.set_exception(e)
|
|
188
|
+
finally:
|
|
189
|
+
# decrement task count
|
|
190
|
+
# join needs to wait until task count is zero
|
|
191
|
+
self._queue.task_done()
|
|
192
|
+
|
|
193
|
+
async def shutdown_async(self, wait: bool = True) -> None:
|
|
194
|
+
"""Async shutdown — safe to call from a coroutine on the event loop.
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
wait: If True, drain the queue before shutting down.
|
|
198
|
+
"""
|
|
199
|
+
if self._closed:
|
|
200
|
+
return
|
|
201
|
+
self._closed = True
|
|
202
|
+
# Enqueue comparable sentinel tuples with the highest priority value so
|
|
203
|
+
# that outstanding work drains before shutdown signals are consumed.
|
|
204
|
+
# Use a very large integer to satisfy the typed queue's expected int priority
|
|
205
|
+
sentinel_priority = 2**31 - 1
|
|
206
|
+
for _ in range(self.max_workers):
|
|
207
|
+
await self._queue.put(
|
|
208
|
+
(sentinel_priority, next(self._counter), _SENTINEL, None, {}, None)
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
if wait:
|
|
212
|
+
# Let workers drain tasks and exit gracefully
|
|
213
|
+
await self._queue.join()
|
|
214
|
+
# Cancel all worker futures after queue is drained
|
|
215
|
+
for fut in self._workers:
|
|
216
|
+
if not fut.done():
|
|
217
|
+
fut.cancel()
|
|
218
|
+
# Wait for all workers to complete (with cancellation handling)
|
|
219
|
+
await asyncio.gather(
|
|
220
|
+
*[asyncio.wrap_future(fut, loop=self.loop) for fut in self._workers],
|
|
221
|
+
return_exceptions=True,
|
|
222
|
+
)
|
|
223
|
+
else:
|
|
224
|
+
# When wait=False, just cancel workers immediately
|
|
225
|
+
# This may cause RuntimeError if loop is closed, but that's expected
|
|
226
|
+
for fut in self._workers:
|
|
227
|
+
if not fut.done():
|
|
228
|
+
fut.cancel()
|
|
229
|
+
|
|
230
|
+
def shutdown(self, wait: bool = True) -> None:
|
|
231
|
+
"""Sync shutdown — blocks the calling thread until shutdown is complete."""
|
|
232
|
+
future = asyncio.run_coroutine_threadsafe(self.shutdown_async(wait), self.loop)
|
|
233
|
+
if wait:
|
|
234
|
+
# Propagate exceptions if any
|
|
235
|
+
future.result()
|