Bigtable#

一个由 Google Cloud Bigtable 支持的 L2 适配器,能够实现进程外的远程 KV 缓存。它支持层组分片,将大型张量负载划分到多个列限定符中,以确保安全地低于 Bigtable 单元格大小限制。

为什么选择 Bigtable?#

Cloud Bigtable 是企业级 LLM 服务工作负载的 L2 存储后端的优秀选择:

  • 亚毫秒/单数延迟:基于 SSD 的 Bigtable 集群提供实时提示缓存所需的低延迟,防止远程缓存检索成为 LLM 生成的瓶颈。

  • 高并发和吞吐量:水平扩展以处理来自多个 vLLM 实例的数千个并发查询,保护 L1 内存免受缓存未命中的影响。

  • 企业级托管服务:由 Google Cloud 完全管理,提供内置的多区域复制、IAM 访问控制和零停机时间的扩展。

  • 与层级无关的存储灵活性:将 LMCache 配置与数据库部署解耦。选择 SSD 层 作为主要低延迟缓存,或选择 HDD 层 作为经济高效的大规模归档存储。

必填字段:

  • bigtable_project_id (str): 您的 Google Cloud 项目 ID。

  • bigtable_instance_id (str): 您的 Cloud Bigtable 实例 ID。

  • bigtable_table_name (str): Bigtable 表名。

可选字段:

  • bigtable_family_name (str, default "cf"): 列族名称。必须在 Bigtable 表中预先创建。

  • bigtable_column_name (str, default \"data\"): 当禁用分片时使用的列限定符名称。

  • layer_group_size (int, default 10): 每个列组的层数。设置为 0 以禁用层组分片。

  • bigtable_max_chunk_size_mb (float, default 90.0): 禁用分片时(或使用 CacheGen 时)允许的最大写入限制。超过此限制的写入将被安全跳过,以避免数据库异常。

  • credentials_path (str, default None): GCP 服务账户 JSON 密钥文件的绝对路径。如果省略,则默认为应用程序默认凭据 (ADC)。

  • exists_cache_ttl_seconds (float, default 10.0): 用于内部缓存的 TTL(生存时间),单位为秒,该缓存可以保护 Bigtable 免受冗余查找请求。

  • bigtable_write_timeout_ms (float, default 10000.0): 数据库写入的最大超时时间。

  • bigtable_read_timeout_ms (float, default 5000.0): 数据库读取的最大超时。

环境变量回退。 当相应的配置值为空时,将使用这些环境变量:BT_PROJECT_IDBT_INSTANCE_IDBT_TABLE_NAME

教程与配置示例#

教程 1:服务大规模模型(FP8 压缩)#

如果您正在服务极大的模型,其中单个 KV Cache 块非常庞大,您可以启用 FP8 量化压缩。这将 KV Cache 的占用空间压缩 2x 并减少传输到 Bigtable 的网络开销。

在 Bigtable L2 适配器 JSON 规范中添加 "serde" 子字典:

lmcache server \
    --port 65432 \
    --http-port 8080 \
    --l2-adapter '{
        "type": "bigtable",
        "bigtable_project_id": "your-gcp-project-id",
        "bigtable_instance_id": "lmcache-bt-instance",
        "bigtable_table_name": "lmcache-kv-table",
        "layer_group_size": 10,
        "serde": {
            "type": "fp8",
            "fp8_dtype": "float8_e4m3fn"
        }
    }' \
    --l1-size-gb 10.0 \
    --eviction-policy LRU

教程 2:三层混合存储(本地 CPU -> Redis L2 -> Bigtable SSD L3)#

您可以在 Bigtable 前面放置一个 Redis/Valkey 实例,作为快速热缓存,在未命中时将请求级联到 Bigtable。

使用多个 --l2-adapter 参数按顺序配置多个 L2 适配器:

lmcache server \
    --port 65432 \
    --http-port 8080 \
    --l2-adapter '{"type": "resp", "host": "your-redis-host", "port": 6379}' \
    --l2-adapter '{
        "type": "bigtable",
        "bigtable_project_id": "your-gcp-project-id",
        "bigtable_instance_id": "lmcache-bt-instance",
        "bigtable_table_name": "lmcache-kv-table",
        "layer_group_size": 10
    }' \
    --l1-size-gb 10.0 \
    --eviction-policy LRU

教程 3:多层存储级联(SSD 热层 -> HDD 存档)#

为了平衡热缓存命中的低延迟性能和长期归档存储的成本效益,您可以通过两种方式配置分层存储(从 SSD 到 HDD):

方法 B:手动 LMCache 存储级联(替代方案)#

如果您更喜欢管理单独的物理 Bigtable 实例或表(例如,一个 SSD 和一个 HDD),您可以通过在启动命令中顺序配置多个 L2 适配器,直接在 LMCache 中级联它们:

lmcache server \
    --port 65432 \
    --http-port 8080 \
    --l2-adapter '{
        "type": "bigtable",
        "bigtable_project_id": "your-gcp-project-id",
        "bigtable_instance_id": "lmcache-bt-ssd-instance",
        "bigtable_table_name": "lmcache-kv-hot-table",
        "layer_group_size": 10
    }' \
    --l2-adapter '{
        "type": "bigtable",
        "bigtable_project_id": "your-gcp-project-id",
        "bigtable_instance_id": "lmcache-bt-hdd-instance",
        "bigtable_table_name": "lmcache-kv-archive-table",
        "layer_group_size": 10
    }' \
    --l1-size-gb 10.0 \
    --eviction-policy LRU

配置示例:自定义超时和显式服务账户#

您可以配置自定义数据库超时设置,并在 JSON 有效负载中传递显式服务帐户密钥文件路径:

lmcache server \
    --port 65432 \
    --http-port 8080 \
    --l2-adapter '{
        "type": "bigtable",
        "bigtable_project_id": "your-gcp-project-id",
        "bigtable_instance_id": "lmcache-bt-instance",
        "bigtable_table_name": "lmcache-kv-table",
        "credentials_path": "/secrets/gcp/sa_key.json",
        "bigtable_write_timeout_ms": 5000.0,
        "bigtable_read_timeout_ms": 2000.0
    }' \
    --l1-size-gb 10.0 \
    --eviction-policy LRU