Skip to main content

High-performance key-value storage engine with Python bindings

Project description

PegaFlow Python Package

High-performance key-value storage engine with Python bindings, built with Rust and PyO3.

Features

  • PegaEngine: Fast Rust-based key-value storage with Python bindings
  • PegaKVConnector: vLLM KV connector for distributed inference with KV cache transfer

Installation

From Source

# Install maturin if you haven't already
pip install maturin

# Build and install in development mode
cd python
maturin develop

# Or build a wheel
maturin build --release

From PyPI (coming soon)

pip install pegaflow

Usage

Basic KV Storage

from pegaflow import PegaEngine

# Create a new engine
engine = PegaEngine()

# Store key-value pairs
engine.put("name", "PegaFlow")
engine.put("version", "0.1.0")

# Retrieve values
name = engine.get("name")  # Returns "PegaFlow"
missing = engine.get("nonexistent")  # Returns None

# Remove keys
removed = engine.remove("name")  # Returns "PegaFlow"

vLLM KV Connector

from vllm import LLM
from vllm.distributed.kv_transfer.kv_transfer_agent import KVTransferConfig

# Configure vLLM to use PegaKVConnector
kv_transfer_config = KVTransferConfig(
    kv_connector="PegaKVConnector",
    kv_role="kv_both",
    kv_connector_module_path="pegaflow.connector",
)

# Create LLM with KV transfer enabled
llm = LLM(
    model="gpt2",
    kv_transfer_config=kv_transfer_config,
)

Connector Modes

PegaKVConnector defaults to read_write: it queries PegaFlow for reusable KV blocks, loads matched blocks into vLLM, and saves newly computed full blocks back to PegaFlow.

Set pegaflow.mode to save_only when another vLLM connector is responsible for reads and PegaFlow should only persist KV blocks for later reuse. This is intended for MultiConnector decode-side setups where an upstream connector owns the external hit/load path, while PegaFlow records the resulting KV cache. In save_only mode, PegaFlow does not query or load KV blocks.

vllm serve Qwen/Qwen3-0.6B \
  --kv-transfer-config '{
    "kv_connector": "MultiConnector",
    "kv_role": "kv_both",
    "kv_connector_extra_config": {
      "connectors": [
        {
          "kv_connector": "<external-read-connector>",
          "kv_role": "kv_both"
        },
        {
          "kv_connector": "PegaKVConnector",
          "kv_role": "kv_both",
          "kv_connector_module_path": "pegaflow.connector",
          "kv_connector_extra_config": {
            "pegaflow.mode": "save_only"
          }
        }
      ]
    }
  }'

Valid values are read_write and save_only.

Development

See the examples directory for more usage examples.

Testing

Running Unit Tests

The test suite includes integration tests that verify the EngineRpcClient can correctly communicate with a running pegaflow-server instance.

Prerequisites

  1. Build the Rust extension:

    cd python
    maturin develop --release
    
  2. Build the server binary:

    cd ..
    cargo build --release --bin pegaflow-server
    
  3. Ensure CUDA is available (tests require GPU):

    python -c "import torch; assert torch.cuda.is_available()"
    

Running Tests

cd python

# Run all tests
pytest tests/ -v

# Run specific test file
pytest tests/test_engine_client.py -v

# Run with coverage
pytest tests/ --cov=pegaflow --cov-report=html

Test Structure

  • tests/conftest.py: Contains pytest fixtures for:

    • pega_server: Automatically starts/stops pegaflow-server for integration tests
    • engine_client: Creates an EngineRpcClient connected to the test server
    • client_context: Provides a ClientContext representing a vLLM instance with GPU KV cache tensors
    • registered_instance: Provides a registered instance ID for query tests
  • tests/test_engine_client.py: Integration tests for:

    • Server connectivity
    • Query operations with various inputs

Test Fixtures

The ClientContext class abstracts a vLLM instance and provides:

  • register_kv_caches(): Register GPU KV cache tensors with the server
  • query(block_hashes): Query available blocks
  • unregister_context(): Unregister context from server

Example test usage:

def test_query(client_context):
    """Test query operation."""
    result = client_context.query([])
    assert result is not None

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pegaflow_llm-0.23.2-cp314-cp314-manylinux_2_34_x86_64.whl (9.4 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.34+ x86-64

pegaflow_llm-0.23.2-cp313-cp313-manylinux_2_34_x86_64.whl (9.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

pegaflow_llm-0.23.2-cp312-cp312-manylinux_2_34_x86_64.whl (9.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

pegaflow_llm-0.23.2-cp311-cp311-manylinux_2_34_x86_64.whl (9.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

pegaflow_llm-0.23.2-cp310-cp310-manylinux_2_34_x86_64.whl (9.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

File details

Details for the file pegaflow_llm-0.23.2-cp314-cp314-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for pegaflow_llm-0.23.2-cp314-cp314-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 87ef78c8b7ce00ee9af9ed9958775f6b5c459add2999a543dbd5597a5b4cc613
MD5 956a55a6580a01da2595c36584d7503a
BLAKE2b-256 b93531110bc5dbabb71ab18548dff4fd625ae8092a71053fb40f0fee4270cc8b

See more details on using hashes here.

File details

Details for the file pegaflow_llm-0.23.2-cp313-cp313-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for pegaflow_llm-0.23.2-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 59486b77576b61c452182f7a1d2746e7fdbcc696f13f3a2523d19891b378c37a
MD5 728fb1116034b0d6119c741c3976b3ae
BLAKE2b-256 be2d6733231e66bb04007d6a6df1f7553687d72a004ea055e9e1226462dbd241

See more details on using hashes here.

File details

Details for the file pegaflow_llm-0.23.2-cp312-cp312-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for pegaflow_llm-0.23.2-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 b091044d4f93d6e4d2e2078dc418f59eba58609dc610913f0db0d2554ed79214
MD5 07e99d0e9a886e1a4754f3afbf6b31d0
BLAKE2b-256 ae804a5ca1d684224b659f45e8d334041568913297cd06fab2d1d03bad6e69fe

See more details on using hashes here.

File details

Details for the file pegaflow_llm-0.23.2-cp311-cp311-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for pegaflow_llm-0.23.2-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 f627b878c8f8b4e11dcfcd805d6c50b2025991c439c44cf174ba24f3b28e6f58
MD5 9b62c4bcb55c58440dd7a2d2845d7b29
BLAKE2b-256 4c5503d0c35d572f4ea49a539f6510ba3298e393bf3e8bfb9dc06e1b2369c1f5

See more details on using hashes here.

File details

Details for the file pegaflow_llm-0.23.2-cp310-cp310-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for pegaflow_llm-0.23.2-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 ffb06e5889ecb3f0c3328b52b67d92656a22130da9ac93f9928473840c914c41
MD5 5962ed5fae34be4775ad128d1578f6bd
BLAKE2b-256 ff5ade975230262ea81399bfaf4c15e59df0c108422f5174be263ed933852a2e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page