从源码构建需先装 clang、cmake、libhwloc-dev、libudev-dev 等系统依赖和 Rust 1.91+;启动前要手动创建 data/d0 到 data/d3 目录;默认只卸载到本机,跨 GPU 集群需用 --config 指定配置并设置 PYTHONHASHSEED=0。
openlake
openlake-projectApache-2.0活跃维护面向大模型推理与 GPU 训练的高性能存储引擎,用 Rust 编写,通过 RDMA 等技术提升模型加载和服务吞吐。
OpenLake is a high performance storage engine for efficient LLM inference and GPU Training
pip install openlake-vllm
openlakedREADME 未给出显存或 GPU 型号要求;RDMA 与 GPUDirect 路径依赖 Linux 与 IB 网卡(如 mlx5_ib0),macOS 仅支持 TCP 模式开发,Windows 需 WSL2。
面向 LLM 推理与 GPU 训练的 Rust 分布式存储引擎,把 KV 缓存和检查点就近放到 GPU 主机上
面向大模型推理与 GPU 训练的高性能存储引擎,用 Rust 编写,通过 RDMA 等技术提升模型加载和服务吞吐。
核心能力
- 基于 io_uring 与 compio 每核异步运行时处理小 IO
- 用 GPUDirect Storage 和 RDMA 实现零拷贝直达显存
- 通过 PacedRDMA 信用流控在突发请求下保护尾延迟
- 用 SIMD Reed Solomon 纠删码做低开销持久化
- 提供 vLLM 连接器把 KV 缓存卸载到本地或集群池
容易踩的坑
- v0.11.0OpenLake: v0.11.0最新正式版2026-11-04 · 2026-11-04 16:22 UTC
What's Changed
- fix(s3): return NoSuchBucket when listing missing bucket by @Keda710 in https://github.com/openlake-project/openlake/pull/295
- (#294) [v0.10] fix(s3): keep child objects visible beneath folder markers by @Keda710 in https://github.com/openlake-project/openlake/pull/296
- perf(vllm): skip lookups covered by the local cache by @anandheritage in https://github.com/openlake-project/openlake/pull/297
- (#299) [v0.10] fix(kv): drain accepted shards after client errors by @Keda710 in https://github.com/openlake-project/openlake/pull/300
- (#303) [v0.10] fix(kv): validate configured slab capacity by @Keda710 in https://github.com/openlake-project/openlake/pull/304
- fix(s3): verify Content-MD5 on PutObject by @stanleys12 in https://github.com/openlake-project/openlake/pull/302
- (#308) [v0.10] fix(s3): correctly encode object names in listings by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/309
- (#306) [v0.10] fix(kv): separate cache entries for different model versions by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/310
- (#307) [v0.10] fix(vllm): require a fixed Python hash seed by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/311
- fix(kv): report local CUDA transfer failures by @Keda710 in https://github.com/openlake-project/openlake/pull/314
- fix(s3): abort multipart uploads without deleting objects by @Keda710 in https://github.com/openlake-project/openlake/pull/315
New Contributors
- @Keda710 made their first contribution in https://github.com/openlake-project/openlake/pull/295
- @anandheritage made their first contribution in https://github.com/openlake-project/openlake/pull/297
- @stanleys12 made their first contribution in https://github.com/openlake-project/openlake/pull/302
Full Changelog: https://github.com/openlake-project/openlake/compare/v.0.10.0...v0.11.0
- v.0.10.0OpenLake: v0.10.02026-09-24 · 2026-09-24 15:00 UTC
查看更新说明
What's Changed
- (#279) [v0.10] fix(core): reject non canonical version ID UUIDs by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/280
- (#281) [v0.10] Fix(config): reject duplicate credential access keys by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/282
- (#284) [v0.10] Fix(kv): enforce configured slab capacity during attach by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/285
- (#271) [v0.10] Fix(bench): reject non 2xx GET responses by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/286
- fix: honor max-keys=0 in S3 listings by @Tanishqyadav937 in https://github.com/openlake-project/openlake/pull/287
- fix(bench): reject zero worker counts and batch sizes by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/289
- fix(bench): reject sizes that overflow byte conversion by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/291
New Contributors
- @Tanishqyadav937 made their first contribution in https://github.com/openlake-project/openlake/pull/287
Full Changelog: https://github.com/openlake-project/openlake/compare/0.9.0...v.0.10.0
- 0.9.0OpenLake: v0.9.02026-09-05 · 2026-09-05 06:45 UTC
查看更新说明
What's Changed
- feat(helm): add Kubernetes orchestration for OpenLake KV by @0xnktd in https://github.com/openlake-project/openlake/pull/254
- (#255) [v0.9] Fix CopyObject parsing for percent query delimiters by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/256
- (#258) [v0.9] KVE: reject duplicate node IDs at startup by @nidhii170706 in https://github.com/openlake-project/openlake/pull/260
- (#257) [v0.9] Core: validate x-amz-checksum-sha256 header in DeleteObjects by @nidhii170706 in https://github.com/openlake-project/openlake/pull/259
- fix(s3): make missing-key deletes idempotent by @0xnktd in https://github.com/openlake-project/openlake/pull/262
- fix(s3): reject bucket names with surrounding whitespace by @Mayank-Rawat-1708 in https://github.com/openlake-project/openlake/pull/266
- fix(s3): honor Range header in HeadObject by @ZenAlexa in https://github.com/openlake-project/openlake/pull/267
- (#253) [v0.9] fix(helm): require shared hostpath for h2 connector by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/269
- (#170) [v0.9] fix(metrics): classify S3 operations using exact query parameters by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/274
- (#272) [v0.9] (core) Validate unique RPC addresses for storage nodes by @gowthamalluri222 in https://github.com/openlake-project/openlake/pull/275
- (#223) [v0.9] vLLM: Wire up exans nvidia nvcomp variant with fixed block by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/277
New Contributors
- @0xnktd made their first contribution in https://github.com/openlake-project/openlake/pull/254
- @Mayank-Rawat-1708 made their first contribution in https://github.com/openlake-project/openlake/pull/266
- @ZenAlexa made their first contribution in https://github.com/openlake-project/openlake/pull/267
- @gowthamalluri222 made their first contribution in https://github.com/openlake-project/openlake/pull/275
Full Changelog: https://github.com/openlake-project/openlake/compare/v0.8.1...0.9.0
- v0.8.1OpenLake: v0.8.12026-08-14 · 2026-08-14 14:39 UTC
查看更新说明
What's Changed
- (#245) [v0.8] Bump OpenLake package versions to 0.8.0 by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/246
- (#247) [v0.9] Make the OpenLake KV connector pipeline parallel aware by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/248
- (#249) [v0.9] Discover and report UCX peer capabilities and L0 topology by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/250
- (#251) [v0.9] Improve the fleet topology reporting and realtime peer capabilities by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/252
Full Changelog: https://github.com/openlake-project/openlake/compare/v0.8.0...v0.8.1
- v0.8.0OpenLake: v0.8.02026-08-12 · 2026-08-12 06:47 UTC
查看更新说明
What's Changed
- (#225) [v0.7] feat: Add OpenLake Operations Console by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/226
- (#227) [v0.7] Add OpenLake node telemetry and KV cache serving metrics by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/228
- (#231) [v0.8] Add UCX support for non dct mellanox nics by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/232
- (#233) [v0.8] Replace busy poll by callback driven FD wake by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/234
- (#235) [v0.8] Add topology collection and historical telemetry to node agent by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/236
- (#235) [v0.8] Support topology and historical telemetry to node agent UI by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/237
- (#238) [v0.8] KVE: Short circuit inference scheduler for small requests by @ArnavBalyan in https://github.com/openlake-project/openlake/pull/239
Full Changelog: https://github.com/openlake-project/openlake/compare/v0.7.0...v0.8.0
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
🔥 Distributed storage for GPU workloads. Built on Rust on io_uring, OpenLake is a state of the art storage engine delivering million+ iops within 1ms.
Updates
- [2026/09] 🔥 OpenLake tops the MLPerf Storage v3.0 2026 object checkpointing, leading NVIDIA and Nebius (blog).
- [2026/08] ExANS: a lossless GPU codec for BF16 KV cache: 1.51× cost savings, now available in OpenLake v0.8 (blog).
- [2026/07] Breaking the KV Wall: managing 100 TB of KV cache and 8× inference throughput with deferred materialization (blog).
- [2026/07] Introducing OpenLake: open source storage that saturates the GPUs: 8× throughput and 600 µs reads (blog).
Why OpenLake?
OpenLake is a storage engine for AI infrastructure. With OpenLake you get high throughput for small I/O and cache like performance while being fully persistent and durable. Keep GPUs fed during training and inference reducing idle time and getting more from your accelerators.
OpenLake is fast with:
- KV Cache Offload. Reduced LLM Inference costs by having Petabyte scale KV cache store co-located on GPU hosts.
- VectorDB: Fast index building and vector serving.
- Checkpointing: Ultra fast checkpoint storage and retrieval for RL and ML workloads.
- Model Training: Small file I/O and fast random reads, reduced GPU costs/training time.
- Context Storage: Store massive conversations, memories and context for fast agentic retrieval.
Learn more: Blogs → | Benchmarks → | KV Offload | Object Store
GPU nodes contribute to create an OpenLake cluster. The inference engine writes KV once and reads it back in milliseconds (using the host RAM and disk), saving prefill for long and repeated prompts.
Quickstart:
1) Setup KV Pool on GPU nodes:
Drop OpenLake into your existing setup. No code changes:
a. Install the connector and start the store:
pip install openlake-vllm
openlaked
b. Run vLLM with OpenLake enabled:
export PYTHONHASHSEED=0
vllm serve <model_name> --kv-transfer-config '{"kv_connector":"OpenLakeConnector","kv_connector_module_path":"openlake_client.openlake_connector","kv_role":"kv_both","kv_connector_extra_config":{"openlake_nodes":["127.0.0.1:9400"],"openlake_device":"local"}}'
Note: By default OpenLake offloads to the same host. To enable OpenLake across your GPU fleet, please start openlaked with a --config.
For Kubernetes clusters, use the Helm KV deployment guide to place one OpenLake instance on each selected node and generate the ordered vLLM peer configuration.
OpenLake enabled vs disabled:
Run OpenLake on existing GPU cluster. Run OpenLake with
(kv_rdma.toml)
and node's self_id: (0, 1, 2...):
openlaked --config kv_rdma_0.toml # gpu 1: ids = 0
openlaked --config kv_rdma_1.toml # gpu 2: ids = 1
Point your vLLM workers at the unified cluster, in id order:
cat > /tmp/openlake-kv.json <<'EOF'
{
"kv_connector": "OpenLakeConnector",
"kv_connector_module_path": "openlake_client.openlake_connector",
"kv_role": "kv_both",
"kv_connector_extra_config": {
"openlake_nodes": ["10.0.0.1:9400", "10.0.0.2:9400"],
"openlake_device": "mlx5_ib0"
}
}
EOF
export PYTHONHASHSEED=0
vllm serve <model_name> --kv-transfer-config "$(cat /tmp/openlake-kv.json)"
A prefix computed on one GPU host is served to any other from the shared pool.
2) PB scale object store for GPU Fleet
Build from source and have an S3 compatible store running in four steps. Install the dependencies and build the OpenLake binary locally.
a. Clone and build:
sudo apt-get install -y build-essential pkg-config clang cmake libhwloc-dev libudev-dev curl git awscli
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y && . "$HOME/.cargo/env"
git clone https://github.com/openlake-project/openlake.git && cd openlake
cargo build --release --bin openlaked
b. Start the store (single node, default config):
mkdir -p data/d0 data/d1 data/d2 data/d3
./target/release/openlaked --config crates/openlake_server/configs/storage-tcp-local.toml
Talk to it with any S3 client:
export AWS_ACCESS_KEY_ID=openlakeadmin
export AWS_SECRET_ACCESS_KEY=openlakeadmin
export AWS_DEFAULT_REGION=us-east-1
aws --endpoint-url http://127.0.0.1:9000 s3 mb s3://demo
aws --endpoint-url http://127.0.0.1:9000 s3 cp ./checkpoint.safetensors s3://demo/
aws --endpoint-url http://127.0.0.1:9000 s3 ls s3://demo/
Both ListObjects versions support encoding-type=url for UTF-8 percent-encoded
keys, prefixes, and delimiters in the XML response. Without this option, key
names retain their existing XML representation. ListObjectsV2 now echoes
StartAfter and returns XML-safe, versioned continuation tokens; treat tokens
as opaque and pass them back unchanged, even when changing the encoding option.
Legacy raw-key tokens remain accepted except for the reserved
openlake-list-v1: token prefix (restart those listings after upgrading).
Build from source:
To build from the source, please follow the platform specific build guides:
Produce binaries for your deployment or test code changes.
# Install system dependencies
sudo apt-get update
sudo apt-get install -y --no-install-recommends ca-certificates build-essential pkg-config clang cmake libhwloc-dev libudev-dev curl git
# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y && . "$HOME/.cargo/env"
# Clone and build OpenLake
git clone https://github.com/openlake-project/openlake.git
cd openlake && cargo build --release --locked -p openlake_server --bin openlaked
# Create the local storage directories
mkdir -p data/d0 data/d1 data/d2 data/d3
# Start OpenLake in TCP mode. Please switch the config path for RDMA.
RUST_LOG=info ./target/release/openlaked --config crates/openlake_server/configs/storage-tcp-local.toml
Install Homebrew first if brew is unavailable.
# Install system dependencies
xcode-select --install
brew install cmake pkg-config
# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y && . "$HOME/.cargo/env"
# Clone and build OpenLake
git clone https://github.com/openlake-project/openlake.git
cd openlake && cargo build --release --locked -p openlake_server --bin openlaked
# Create local storage directories
mkdir -p data/d0 data/d1 data/d2 data/d3
# Start OpenLake in TCP mode. (macOS does not provide the Linux RDMA interfaces)
RUST_LOG=info ./target/release/openlaked --config crates/openlake_server/configs/storage-tcp-local.toml
Build OpenLake with WSL2. See the full Windows development environment guide.
# Run in an administrator PowerShell terminal:
wsl --install -d Ubuntu
wsl
# Then run inside the Ubuntu shell:
# Install system dependencies
sudo apt-get update
sudo apt-get install -y --no-install-recommends ca-certificates build-essential pkg-config clang cmake libhwloc-dev libudev-dev curl git
# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y && . "$HOME/.cargo/env"
# Clone and build OpenLake
git clone https://github.com/openlake-project/openlake.git
cd openlake && cargo build --release --locked -p openlake_server --bin openlaked
# Create local storage directories
mkdir -p data/d0 data/d1 data/d2 data/d3
# Start OpenLake in TCP mode
RUST_LOG=info ./target/release/openlaked --config crates/openlake_server/configs/storage-tcp-local.toml
If you would like support for a different build system, please open an issue on GitHub.
Architecture
OpenLake keeps the path from storage to GPU memory short, predictable, and low latency.
- Zero copy: With GPUDirect Storage and RDMA, data can move directly between NVMe or an RDMA NIC and GPU memory without staging through host memory or the page cache.
- Core local asynchronous I/O: OpenLake runs one pinned
compioruntime per physical core, backed by Linuxio_uring. Requests stay on the same core throughout the hot path, avoiding work stealing and cross core contention. - Burst aware RDMA: PacedRDMA uses credit based flow control to prevent senders from overwhelming receivers, sustaining throughput during request bursts while protecting tail latency.
- Efficient durability: SIMD Reed Solomon erasure coding distributes data and parity across drives, providing durable storage with less capacity overhead than full replication.
Explore the architecture and user docs, inspect the included configurations, or read the OpenLake engineering blog for deeper technical discussions.
Contributing
We welcome and value any contributions and collaborations. Please check out Contributing to OpenLake for how to get involved.
Get in touch
- For technical support, please reach out on discord.
- For technical issues, bugs, and feature requests, please open an issue on GitHub.
- For everything else, visit the website or reach out to the maintainers on discord.