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,86 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
"""
|
|
3
|
+
StandaloneServiceFactory: Service factory for LMCache standalone mode.
|
|
4
|
+
|
|
5
|
+
Creates LMCache service components without vLLM dependencies.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
# Standard
|
|
9
|
+
from typing import TYPE_CHECKING, Any, Callable, Optional
|
|
10
|
+
|
|
11
|
+
# First Party
|
|
12
|
+
from lmcache.integration.base_service_factory import BaseServiceFactory
|
|
13
|
+
from lmcache.v1.cache_engine import LMCacheEngine, LMCacheEngineBuilder
|
|
14
|
+
from lmcache.v1.config import LMCacheEngineConfig
|
|
15
|
+
from lmcache.v1.health_monitor.base import HealthMonitor
|
|
16
|
+
from lmcache.v1.internal_api_server.api_server import InternalAPIServer
|
|
17
|
+
from lmcache.v1.metadata import LMCacheMetadata
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
# First Party
|
|
21
|
+
from lmcache.v1.manager import LMCacheManager
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class StandaloneServiceFactory(BaseServiceFactory):
|
|
25
|
+
"""Service factory for standalone LMCache mode (no vLLM)."""
|
|
26
|
+
|
|
27
|
+
def __init__(
|
|
28
|
+
self,
|
|
29
|
+
config: LMCacheEngineConfig,
|
|
30
|
+
metadata: LMCacheMetadata,
|
|
31
|
+
gpu_connector: Any,
|
|
32
|
+
broadcast_fn: Callable,
|
|
33
|
+
broadcast_object_fn: Callable,
|
|
34
|
+
):
|
|
35
|
+
self._config = config
|
|
36
|
+
self._metadata = metadata
|
|
37
|
+
self._gpu_connector = gpu_connector
|
|
38
|
+
self._broadcast_fn = broadcast_fn
|
|
39
|
+
self._broadcast_object_fn = broadcast_object_fn
|
|
40
|
+
self._engine: Optional[LMCacheEngine] = None
|
|
41
|
+
|
|
42
|
+
def get_engine_instance_id(self) -> str:
|
|
43
|
+
return self._config.lmcache_instance_id
|
|
44
|
+
|
|
45
|
+
def get_or_create_metadata(self) -> Optional[LMCacheMetadata]:
|
|
46
|
+
return self._metadata
|
|
47
|
+
|
|
48
|
+
def get_or_create_lmcache_engine(self) -> Optional[LMCacheEngine]:
|
|
49
|
+
if self._engine is not None:
|
|
50
|
+
return self._engine
|
|
51
|
+
|
|
52
|
+
instance_id = self._config.lmcache_instance_id
|
|
53
|
+
self._engine = LMCacheEngineBuilder.get_or_create(
|
|
54
|
+
instance_id=instance_id,
|
|
55
|
+
config=self._config,
|
|
56
|
+
metadata=self._metadata,
|
|
57
|
+
gpu_connector=self._gpu_connector,
|
|
58
|
+
broadcast_fn=self._broadcast_fn,
|
|
59
|
+
broadcast_object_fn=self._broadcast_object_fn,
|
|
60
|
+
)
|
|
61
|
+
return self._engine
|
|
62
|
+
|
|
63
|
+
def maybe_create_lookup_client(self):
|
|
64
|
+
return None
|
|
65
|
+
|
|
66
|
+
def maybe_create_prometheus_logger(self):
|
|
67
|
+
return None
|
|
68
|
+
|
|
69
|
+
def maybe_create_lookup_server(self):
|
|
70
|
+
return None
|
|
71
|
+
|
|
72
|
+
def maybe_create_offload_server(self):
|
|
73
|
+
return None
|
|
74
|
+
|
|
75
|
+
def maybe_create_runtime_plugin_launcher(self):
|
|
76
|
+
return None
|
|
77
|
+
|
|
78
|
+
def maybe_create_internal_api_server(
|
|
79
|
+
self, lmcache_manager: "LMCacheManager"
|
|
80
|
+
) -> Optional[InternalAPIServer]:
|
|
81
|
+
return InternalAPIServer(lmcache_manager)
|
|
82
|
+
|
|
83
|
+
def maybe_create_health_monitor(
|
|
84
|
+
self, lmcache_manager: "LMCacheManager"
|
|
85
|
+
) -> Optional[HealthMonitor]:
|
|
86
|
+
return self._create_health_monitor(lmcache_manager, self._config, self._engine)
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Standard
|
|
3
|
+
from collections import OrderedDict
|
|
4
|
+
from typing import TYPE_CHECKING, AbstractSet, Optional
|
|
5
|
+
import asyncio
|
|
6
|
+
import importlib # Added for dynamic import
|
|
7
|
+
|
|
8
|
+
# Third Party
|
|
9
|
+
import torch
|
|
10
|
+
|
|
11
|
+
# First Party
|
|
12
|
+
from lmcache.logging import init_logger
|
|
13
|
+
from lmcache.v1.config import LMCacheEngineConfig
|
|
14
|
+
from lmcache.v1.metadata import LMCacheMetadata
|
|
15
|
+
from lmcache.v1.storage_backend.abstract_backend import StorageBackendInterface
|
|
16
|
+
from lmcache.v1.storage_backend.gds_backend import GdsBackend
|
|
17
|
+
from lmcache.v1.storage_backend.local_cpu_backend import LocalCPUBackend
|
|
18
|
+
from lmcache.v1.storage_backend.local_disk_backend import LocalDiskBackend
|
|
19
|
+
from lmcache.v1.storage_backend.p2p_backend import P2PBackend
|
|
20
|
+
from lmcache.v1.storage_backend.remote_backend import RemoteBackend # noqa: F401
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
# First Party
|
|
24
|
+
from lmcache.v1.cache_controller.worker import LMCacheWorker
|
|
25
|
+
|
|
26
|
+
logger = init_logger(__name__)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def is_cuda_worker(metadata: LMCacheMetadata) -> bool:
|
|
30
|
+
"""
|
|
31
|
+
Check if the current role is worker and CUDA is available.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
metadata: The LMCache engine metadata.
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
True if the worker is not a scheduler and CUDA is available.
|
|
38
|
+
"""
|
|
39
|
+
return metadata.role != "scheduler" and torch.cuda.is_available()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def storage_plugin_launcher(
|
|
43
|
+
config: LMCacheEngineConfig,
|
|
44
|
+
metadata: LMCacheMetadata,
|
|
45
|
+
loop: asyncio.AbstractEventLoop,
|
|
46
|
+
local_cpu_backend: Optional[LocalCPUBackend],
|
|
47
|
+
dst_device: str,
|
|
48
|
+
storage_backends: OrderedDict[str, StorageBackendInterface],
|
|
49
|
+
) -> None:
|
|
50
|
+
"""
|
|
51
|
+
Loads custom storage backends based on configuration.
|
|
52
|
+
|
|
53
|
+
Looks for backend configurations in config.extra_config and instantiates
|
|
54
|
+
them using the specified module and class names.
|
|
55
|
+
"""
|
|
56
|
+
# Get the list of allowed external backends if configured
|
|
57
|
+
storage_plugins = set(config.storage_plugins) if config.storage_plugins else set()
|
|
58
|
+
if storage_plugins and not config.extra_config:
|
|
59
|
+
logger.warning(
|
|
60
|
+
"storage_plugins=%s is set but extra_config is empty; "
|
|
61
|
+
"plugin settings must be provided under extra_config, e.g. "
|
|
62
|
+
"extra_config.storage_plugin.<name>.module_path/class_name",
|
|
63
|
+
sorted(storage_plugins),
|
|
64
|
+
)
|
|
65
|
+
return
|
|
66
|
+
if not config.extra_config:
|
|
67
|
+
return
|
|
68
|
+
|
|
69
|
+
for storage_plugin in storage_plugins:
|
|
70
|
+
try:
|
|
71
|
+
module_path = config.extra_config.get(
|
|
72
|
+
f"storage_plugin.{storage_plugin}.module_path"
|
|
73
|
+
)
|
|
74
|
+
class_name = config.extra_config.get(
|
|
75
|
+
f"storage_plugin.{storage_plugin}.class_name"
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
if not module_path or not class_name:
|
|
79
|
+
logger.warning(
|
|
80
|
+
f"Backend {storage_plugin} missing module_path or class_name"
|
|
81
|
+
)
|
|
82
|
+
continue
|
|
83
|
+
|
|
84
|
+
logger.warning(
|
|
85
|
+
"The 'memory_allocator' argument is deprecated and will "
|
|
86
|
+
"be ignored. Storage backends now manage their own memory "
|
|
87
|
+
"allocators since PR "
|
|
88
|
+
"https://github.com/LMCache/LMCache/pull/1578"
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Dynamically import the module
|
|
92
|
+
module = importlib.import_module(module_path)
|
|
93
|
+
# Get the class from the module
|
|
94
|
+
backend_class = getattr(module, class_name)
|
|
95
|
+
|
|
96
|
+
# Create the backend instance
|
|
97
|
+
backend_instance = backend_class(
|
|
98
|
+
config=config,
|
|
99
|
+
dst_device=dst_device,
|
|
100
|
+
metadata=metadata,
|
|
101
|
+
local_cpu_backend=local_cpu_backend,
|
|
102
|
+
loop=loop,
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
# Add to storage backends
|
|
106
|
+
storage_backends[storage_plugin] = backend_instance
|
|
107
|
+
logger.info(f"Created dynamic backend: {storage_plugin}")
|
|
108
|
+
|
|
109
|
+
except Exception as e:
|
|
110
|
+
logger.error(f"Failed to create backend {storage_plugin}: {str(e)}")
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def CreateStorageBackends(
|
|
114
|
+
config: LMCacheEngineConfig,
|
|
115
|
+
metadata: LMCacheMetadata,
|
|
116
|
+
loop: asyncio.AbstractEventLoop,
|
|
117
|
+
dst_device: str = "cuda",
|
|
118
|
+
lmcache_worker: Optional["LMCacheWorker"] = None,
|
|
119
|
+
skip_backends: Optional[AbstractSet[str]] = None,
|
|
120
|
+
existing_backends: Optional[OrderedDict[str, StorageBackendInterface]] = None,
|
|
121
|
+
) -> OrderedDict[str, StorageBackendInterface]:
|
|
122
|
+
if is_cuda_worker(metadata):
|
|
123
|
+
dst_device = f"cuda:{torch.cuda.current_device()}"
|
|
124
|
+
elif dst_device == "xpu":
|
|
125
|
+
dst_device = f"xpu:{torch.xpu.current_device()}"
|
|
126
|
+
else:
|
|
127
|
+
dst_device = "cpu"
|
|
128
|
+
storage_backends: OrderedDict[str, StorageBackendInterface] = OrderedDict()
|
|
129
|
+
_skip = skip_backends or set()
|
|
130
|
+
|
|
131
|
+
extra_config = config.extra_config
|
|
132
|
+
enable_nixl_storage = extra_config is not None and extra_config.get(
|
|
133
|
+
"enable_nixl_storage"
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
if config.enable_pd and "PDBackend" not in _skip:
|
|
137
|
+
# First Party
|
|
138
|
+
from lmcache.v1.storage_backend.pd_backend import PDBackend
|
|
139
|
+
|
|
140
|
+
storage_backends["PDBackend"] = PDBackend(config, metadata)
|
|
141
|
+
|
|
142
|
+
# TODO(Jiayi): The hierarchy is fixed for now
|
|
143
|
+
# NOTE(Jiayi): The local_cpu backend is always created because
|
|
144
|
+
# other backends might need it as a buffer.
|
|
145
|
+
# Reuse existing LocalCPUBackend when available so that
|
|
146
|
+
# dependent backends (disk, remote, p2p, …) keep working.
|
|
147
|
+
local_cpu_backend: Optional[LocalCPUBackend] = None
|
|
148
|
+
if existing_backends and "LocalCPUBackend" in existing_backends:
|
|
149
|
+
_existing_cpu = existing_backends["LocalCPUBackend"]
|
|
150
|
+
if isinstance(_existing_cpu, LocalCPUBackend):
|
|
151
|
+
local_cpu_backend = _existing_cpu
|
|
152
|
+
|
|
153
|
+
if metadata.role == "scheduler":
|
|
154
|
+
# For scheduler role, local_cpu_backend is None
|
|
155
|
+
pass
|
|
156
|
+
elif not config.enable_pd or config.local_cpu:
|
|
157
|
+
if "LocalCPUBackend" in _skip:
|
|
158
|
+
pass # Skipped — already exists
|
|
159
|
+
elif config.max_local_cpu_size > 0:
|
|
160
|
+
local_cpu_backend = LocalCPUBackend(
|
|
161
|
+
config,
|
|
162
|
+
metadata,
|
|
163
|
+
dst_device,
|
|
164
|
+
lmcache_worker,
|
|
165
|
+
)
|
|
166
|
+
backend_name = str(local_cpu_backend)
|
|
167
|
+
storage_backends[backend_name] = local_cpu_backend
|
|
168
|
+
else:
|
|
169
|
+
logger.info("No cpu memory is allocated as max_local_cpu_size <= 0")
|
|
170
|
+
|
|
171
|
+
if config.enable_p2p and "P2PBackend" not in _skip:
|
|
172
|
+
assert local_cpu_backend is not None
|
|
173
|
+
assert lmcache_worker is not None
|
|
174
|
+
p2p_backend = P2PBackend(
|
|
175
|
+
config,
|
|
176
|
+
metadata,
|
|
177
|
+
loop,
|
|
178
|
+
local_cpu_backend,
|
|
179
|
+
lmcache_worker,
|
|
180
|
+
)
|
|
181
|
+
backend_name = str(p2p_backend)
|
|
182
|
+
storage_backends[backend_name] = p2p_backend
|
|
183
|
+
|
|
184
|
+
if enable_nixl_storage and "NixlStorageBackend" not in _skip:
|
|
185
|
+
# First Party
|
|
186
|
+
from lmcache.v1.storage_backend.nixl_storage_backend import (
|
|
187
|
+
NixlStorageBackend,
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
storage_backends["NixlStorageBackend"] = (
|
|
191
|
+
NixlStorageBackend.CreateNixlStorageBackend(config, loop, metadata)
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
if (
|
|
195
|
+
config.local_disk
|
|
196
|
+
and config.max_local_disk_size > 0
|
|
197
|
+
and "LocalDiskBackend" not in _skip
|
|
198
|
+
):
|
|
199
|
+
assert local_cpu_backend is not None
|
|
200
|
+
local_disk_backend = LocalDiskBackend(
|
|
201
|
+
config,
|
|
202
|
+
loop,
|
|
203
|
+
local_cpu_backend,
|
|
204
|
+
dst_device,
|
|
205
|
+
lmcache_worker,
|
|
206
|
+
metadata,
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
backend_name = str(local_disk_backend)
|
|
210
|
+
storage_backends[backend_name] = local_disk_backend
|
|
211
|
+
|
|
212
|
+
if config.gds_path is not None and "GdsBackend" not in _skip:
|
|
213
|
+
gds_backend = GdsBackend(
|
|
214
|
+
config,
|
|
215
|
+
metadata,
|
|
216
|
+
loop,
|
|
217
|
+
dst_device,
|
|
218
|
+
)
|
|
219
|
+
storage_backends[str(gds_backend)] = gds_backend
|
|
220
|
+
|
|
221
|
+
if config.maru_path is not None and "MaruBackend" not in _skip:
|
|
222
|
+
try:
|
|
223
|
+
# First Party
|
|
224
|
+
from lmcache.v1.storage_backend.maru_backend import MaruBackend
|
|
225
|
+
except ImportError as e:
|
|
226
|
+
raise ImportError(
|
|
227
|
+
"The 'maru' and 'maru_lmcache' packages are required "
|
|
228
|
+
"to use MaruBackend. Please install them according to "
|
|
229
|
+
"the Maru setup documentation."
|
|
230
|
+
) from e
|
|
231
|
+
|
|
232
|
+
maru_backend = MaruBackend(config, metadata, loop, dst_device)
|
|
233
|
+
storage_backends[str(maru_backend)] = maru_backend
|
|
234
|
+
|
|
235
|
+
# Handle remote storage plugins (new way)
|
|
236
|
+
if config.remote_storage_plugins and "RemoteBackend" not in _skip:
|
|
237
|
+
for plugin_name in config.remote_storage_plugins:
|
|
238
|
+
assert local_cpu_backend is not None, (
|
|
239
|
+
"Remote backend requires local CPU backend as a buffer."
|
|
240
|
+
"Please turn on local cpu backend with max_local_cpu_size > 0"
|
|
241
|
+
)
|
|
242
|
+
try:
|
|
243
|
+
remote_backend = RemoteBackend(
|
|
244
|
+
config,
|
|
245
|
+
metadata,
|
|
246
|
+
loop,
|
|
247
|
+
local_cpu_backend,
|
|
248
|
+
dst_device,
|
|
249
|
+
plugin_name=plugin_name,
|
|
250
|
+
)
|
|
251
|
+
backend_name = "RemoteBackend-%s" % plugin_name
|
|
252
|
+
storage_backends[backend_name] = remote_backend
|
|
253
|
+
logger.info(
|
|
254
|
+
"Created remote backend for plugin: %s",
|
|
255
|
+
plugin_name,
|
|
256
|
+
)
|
|
257
|
+
except Exception as e:
|
|
258
|
+
logger.error(
|
|
259
|
+
"Failed to create remote backend for plugin %s: %s",
|
|
260
|
+
plugin_name,
|
|
261
|
+
e,
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
# Handle legacy remote_url (deprecated but still supported)
|
|
265
|
+
if config.remote_url is not None and "RemoteBackend" not in _skip:
|
|
266
|
+
# Log deprecation warning
|
|
267
|
+
logger.warning(
|
|
268
|
+
"remote_url is deprecated and will be removed in a future release. "
|
|
269
|
+
"Please use remote_storage_plugins instead."
|
|
270
|
+
)
|
|
271
|
+
remote_backend = RemoteBackend(
|
|
272
|
+
config,
|
|
273
|
+
metadata,
|
|
274
|
+
loop,
|
|
275
|
+
local_cpu_backend,
|
|
276
|
+
dst_device,
|
|
277
|
+
)
|
|
278
|
+
backend_name = str(remote_backend)
|
|
279
|
+
storage_backends[backend_name] = remote_backend
|
|
280
|
+
|
|
281
|
+
if not config.enable_pd or config.local_cpu:
|
|
282
|
+
# Load storage backends from configuration
|
|
283
|
+
storage_plugin_launcher(
|
|
284
|
+
config,
|
|
285
|
+
metadata,
|
|
286
|
+
loop,
|
|
287
|
+
local_cpu_backend,
|
|
288
|
+
dst_device,
|
|
289
|
+
storage_backends,
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
# Only wrap if audit is enabled in config
|
|
293
|
+
if config.extra_config is not None and config.extra_config.get(
|
|
294
|
+
"audit_backend_enabled", False
|
|
295
|
+
):
|
|
296
|
+
# First Party
|
|
297
|
+
from lmcache.v1.storage_backend.audit_backend import AuditBackend
|
|
298
|
+
|
|
299
|
+
# Conditionally wrap backends with audit logging if enabled in config
|
|
300
|
+
audited_backends: OrderedDict[str, StorageBackendInterface] = OrderedDict()
|
|
301
|
+
for name, backend in storage_backends.items():
|
|
302
|
+
# Wrap each normal backend with AuditBackend
|
|
303
|
+
if not isinstance(backend, LocalCPUBackend):
|
|
304
|
+
audited_backend = AuditBackend(backend)
|
|
305
|
+
audited_backends[name] = audited_backend
|
|
306
|
+
logger.info(f"Wrapped {name} with AuditBackend")
|
|
307
|
+
else:
|
|
308
|
+
audited_backends[name] = backend
|
|
309
|
+
logger.info(f"Do not wrap {name} as it is a LocalCPUBackend")
|
|
310
|
+
return audited_backends
|
|
311
|
+
else:
|
|
312
|
+
# If audit is not enabled, use the original backends
|
|
313
|
+
return storage_backends
|