Hugging Face Buckets 后端#
Hugging Face Buckets 后端使用 LMCache 内置的远程存储插件框架,将 LMCache 块存储在 Hugging Face Bucket 中。这是一个持久的远程后端,适合于温暖和冷却的 KV Cache 持久化,而不是最热的本地层。
何时使用它#
当您想要时,请使用 HFBucket 后端:
一个 Hub 原生的持久存储,用于 KV Cache 数据。
一个可以通过
remote_storage_plugins配置的远程后端。在一个 LMCache 部署中有多个命名的桶实例。
避免将其用作最低延迟缓存查找的主要热路径。本地 CPU、本地磁盘和其他低延迟后端更适合最热门的缓存层。
要求和限制#
LMCache 使用
huggingface_hub存储桶 API 进行上传、下载、列出和删除操作。首次内置版本故意采取保守态度:
仅支持完整块。
部分块上传被拒绝。
当存储的对象大小与预期的完整 LMCache 块大小不匹配时,下载将被拒绝。
块元数据未存储在桶对象中。
最小配置#
chunk_size: 256
local_cpu: false
save_unfull_chunk: false
remote_serde: "naive"
blocking_timeout_secs: 10
remote_storage_plugins: ["hfbucket"]
extra_config:
remote_storage_plugin.hfbucket.bucket_handle: "hf://buckets/my-org/lmcache-kv/prod"
remote_storage_plugin.hfbucket.token_env: "HF_TOKEN"
remote_storage_plugin.hfbucket.create_bucket_if_missing: false
remote_storage_plugin.hfbucket.download_tmp_dir: "/tmp/lmcache-hfbucket"
remote_storage_plugin.hfbucket.metadata_cache_ttl_secs: 30
多个实例#
使用实例限定的插件名称来配置同一 LMCache 配置中的多个基于桶的远程存储。
remote_storage_plugins: ["hfbucket.us", "hfbucket.eu"]
extra_config:
remote_storage_plugin.hfbucket.us.bucket_handle: "hf://buckets/my-org/lmcache-kv/us"
remote_storage_plugin.hfbucket.us.token_env: "HF_US_TOKEN"
remote_storage_plugin.hfbucket.eu.bucket_handle: "hf://buckets/my-org/lmcache-kv/eu"
remote_storage_plugin.hfbucket.eu.token_env: "HF_EU_TOKEN"
配置参考#
所有配置键都位于 extra_config.remote_storage_plugin.<plugin_name>.* 下,其中 plugin_name 可以是 hfbucket 或者实例限定名称,例如 hfbucket.prod。
bucket_handle(必需):Hugging Face Bucket 句柄,格式为hf://buckets/<namespace>/<bucket>[/<prefix>]。token_env(可选,默认HF_TOKEN):用于解析 Hugging Face 访问令牌的环境变量。token(可选):直接的令牌覆盖。当两者都设置时,token_env优先。create_bucket_if_missing(可选,默认false):在第一次写入路径时延迟创建存储桶。download_tmp_dir(可选): 连接器本地下载临时空间的根目录。在 Linux 上,将其指向 tmpfs 挂载,例如/dev/shm/lmcache-hfbucket,可以避免下载路径上的磁盘写入。metadata_cache_ttl_secs(可选,默认值为30):缓存确切存在性和大小元数据的生存时间(TTL)。
MP 模式配置#
在多进程(MP)模式下,Hugging Face Buckets 通过传递给 LMCache 服务器的 JSON 规范配置为 L2 适配器。这与上面的非 MP remote_storage_plugins 配置是分开的。每个 --l2-adapter 参数接受一个 JSON 对象,其 \"type\": \"hfbucket\" 字段选择 HFBucket 适配器。
{
"type": "hfbucket",
"bucket_handle": "hf://buckets/my-org/lmcache-kv/prod",
"token_env": "HF_TOKEN",
"create_bucket_if_missing": false,
"download_tmp_dir": "/tmp/lmcache-hfbucket-mp",
"metadata_cache_ttl_secs": 30,
"num_workers": 4,
"max_capacity_gb": 500,
"eviction": {
"eviction_policy": "LRU",
"trigger_watermark": 0.85,
"eviction_ratio": 0.2
}
}
HFBucket L2 适配器字段#
类型(必需):必须是
"hfbucket"。bucket_handle(必需):Hugging Face Bucket 句柄,格式为
hf://buckets/<namespace>/<bucket>[/<prefix>]。token_env:用于解析 Hugging Face 访问令牌的环境变量(默认"HF_TOKEN")。token(可选,直接的令牌回退。当环境变量设置时,token_env优先。对于生产部署,建议使用token_env以避免在适配器 JSON 中存储秘密。)create_bucket_if_missing: 在第一次存储操作时懒惰地创建存储桶(默认值为
false)。这仅在存储桶缺失且令牌有权限创建时有效;它无法修复无效的凭据、无效的句柄或网络故障。download_tmp_dir: 临时加载下载的根目录(默认
/tmp/lmcache-hfbucket-mp)。MP 适配器将桶文件下载到每个任务的临时文件中,然后将其字节复制到 MP 控制器提供的目标MemoryObj缓冲区中。metadata_cache_ttl_secs: 缓存的确切路径大小元数据的 TTL(默认
30)。当其他进程可能在 LMCache 之外修改同一存储桶前缀时,将此值设置得更低,以便更新的元数据比减少 Hugging Face 元数据调用更为重要。num_workers: 用于阻塞 Hugging Face Hub 存储桶 API 调用的工作线程数量(默认
4)。HFBucket Python API 是同步的,因此 MP 模式在适配器的基于 eventfd 的完成接口后面运行上传、查找、加载和删除工作,使用有限的线程池。max_capacity_gb:
get_usage()用于基于水印的 L2 逐出的容量。设置为0(默认)以禁用聚合容量跟踪;此时get_usage()报告适配器未提供逐出信号。逐出: 可选的子字典,用于为此适配器启用 L2 逐出控制器。当存在时,当前正在加载的键会通过查找和锁定路径受到保护,并在解锁之前被
delete()跳过。
与非多租户 HFBucket 的区别#
Hugging Face 桶操作是同步的,但适配器通过在工作线程上运行阻塞调用使提交变为非阻塞。
MP 加载不会分配和返回新的内存。MP 控制器提供目标
MemoryObj缓冲区,适配器将下载的字节复制到这些缓冲区中。键通过
ObjectKey(model_name+kv_rank+chunk_hash+ 可选的cache_salt) 来识别,而不是CacheEngineKey。序列化的 MP 对象名称为<model>@<kv_rank_hex>@<chunk_hash_hex>[@<cache_salt>],然后对其进行编码以形成桶路径。此命名与非 MP HFBucket 连接器的CacheEngineKey对象名称不兼容,因此由非 MP LMCache 填充的桶前缀不能被 MP LMCache 直接读取,反之亦然。完整对象写入是基于批处理的。Hugging Face 的批量写入不是事务性的,因此失败的存储任务可能仍会在桶中留下某些对象。MP 适配器在此类失败后会协调后端元数据,因此实际写入的对象会被计入使用量并在后续删除(提交的存储任务仍会被报告为失败)。
注意事项#
后端在配置的桶前缀下存储对象,使用 LMCache 键的可逆编码,因此
list()返回 LMCache 键字符串,而不是原始桶对象路径。