EngramDB 的 Python 分发包
Disk-first storage engine for Engram / PLE n-gram memory tables (Rust).
分发名
engramdb-python(PyPI 相似名规避);import 名仍为engramdb。当前 v0.2.10 同时包含两条 Python 接入路径:
- PyO3 原生扩展(优先):
crates/engramdb-pyo3,构建后以python/engramdb/_engramdb.so提供Store/View/PageReader/ LinuxIoUringPageReader。- ctypes C-ABI 回退:
crates/engramdb-python,无 PyO3 构建产物时也能用。
python/engramdb/__init__.py会自动优先加载 PyO3,失败则回退 ctypes。
安装
已发布到 PyPI,包名 engramdb-python,import 名 engramdb:
# 直接安装发布版
python3 -m pip install --upgrade engramdb-python
# 或使用 uv
uv add engramdb-python
开发/本地构建也可以使用:
# 方式 1:maturin 构建 wheel(推荐,直接产生可安装的 native wheel)
cd python
CARGO_HOME=/tmp/cargo-home RUSTFLAGS="-C link-arg=-undefined -C link-arg=dynamic_lookup" \
maturin build --release --interpreter python3
# 方式 2:开发期内直接构建并复制到包目录
CARGO_HOME=/tmp/cargo-home RUSTFLAGS="-C link-arg=-undefined -C link-arg=dynamic_lookup" \
cargo build -p engramdb-pyo3 --release
cp target/release/lib_engramdb.dylib python/engramdb/_engramdb.so
# 在 engram-peft 等项目中用 uv 添加本地开发依赖
cd ~/code/engram-peft
uv add --editable ../EngramDB/python
快速使用
存储 / 视图 / 页读取
import engramdb
# 打开 Store-I:目录内为 shard_000.bin 等定长行文件
store = engramdb.Store("path/to/rows", shards=1, rows_per_shard=100, width=256)
row_bytes = store.fetch([0, 1, 2]) # bytes, 每条 256B
store.close()
# 打开 Store-P 视图
view = engramdb.View("path/to/view.bin")
rec = view.read_record(0) # 一条 e_t 记录
# SGLang 兼容:从多个 fd/offset 读页(Unix 有 PageReader,Linux 另有 IoUringPageReader)
reader = engramdb.PageReader(page_size=4096)
pages = reader.read_pages([fd0, fd1], [offset0, offset1])
线程安全的 Store 连接池
from engramdb import StorePool, ThreadLocalStore
pool = StorePool("path/to/rows", shards=128, rows_per_shard=2_500_012, width=160, pool_size=4)
with pool as store: # 借一个句柄,用完自动归还
data = store.fetch(rowids)
tls = ThreadLocalStore(pool) # 每线程一个句柄
handle = tls.get()
try:
data = handle.fetch(rowids)
finally:
tls.release_current()
PLE rowid、自动发现、FP8 scale
from engramdb import rowids_for_seq, discover_ple, load_ple_weight_scale, load_ple_multipliers
# Qwen PLE / Engram 确定性 rowid:[T, 16]
rows = rowids_for_seq([248044, 1000, 99999, 42])
# 从 checkpoint 自动发现 PLE 表元数据、weight_scale 与 rowid multipliers
info = discover_ple("/path/to/Qwen3.8-Flash-Next")
scale = load_ple_weight_scale("/path/to/Qwen3.8-Flash-Next")
mult = load_ple_multipliers("/path/to/Qwen3.8-Flash-Next")
# discovery 返回的 info 已包含 weight_scale 和 multipliers,可直接用于 rowids
rows = rowids_for_seq([248044, 1000, 99999, 42], info=info)
真实 PLE 磁盘 Adapter
from engramdb import Store
from engramdb.ple_adapter import disk_ple_from_discovery
info = discover_ple("/path/to/Qwen3.8-Flash-Next")
store = Store("/path/to/real-ple-rows", shards=128, rows_per_shard=2_500_012, width=160)
ple = disk_ple_from_discovery(store, info) # 自动使用 weight_scale
快速 e_t tensor 读取(v0.2.9+)
训练/预计算不要再走 Python 逐行 bytes 拼接,使用一次 Store.fetch + torch.frombuffer:
from engramdb import Store, fetch_e_t_tensor
store = Store("/path/to/real-ple-rows", shards=128, rows_per_shard=2_500_012, width=160)
# flat_rowids 是 [T * 16] 的扁平行列表
e_t = fetch_e_t_tensor(
store,
flat_rowids,
scale=0.00019931793212890625,
num_heads=16,
head_dim=160,
dtype=torch.float8_e4m3fn,
out_dtype=torch.float32,
)
# e_t.shape == (T, 16, 160)
也可以走 PleDiskGather 的 tensor 方法:
from engramdb.vllm import PleDiskGather
gather = PleDiskGather(store, row_bytes=160)
e_t = gather.fetch_tensor(flat_rowids, scale=..., num_heads=16, head_dim=160)
PleDiskGather.fetch 也已改为直接返回 Store.fetch 的连续缓冲区,不再做 Python 去重/切片/join。
流式/带 n-gram history 的 rowid 可使用:
from engramdb import rowids_for_seq_with_history
rows = rowids_for_seq_with_history([eos, eos], [10, 11, 12])
DiskPleEmbedding 预取与运行统计
from engramdb.vllm_plugin import DiskPleEmbedding
from concurrent.futures import ThreadPoolExecutor
shared_executor = ThreadPoolExecutor(max_workers=2)
emb = DiskPleEmbedding(
store,
num_embeddings=...,
embedding_dim=160,
dtype=torch.float8_e4m3fn,
cache_size=4096,
prefetch_executor=shared_executor,
prefetch_timeout=0.5,
)
emb.prefetch([rowid1, rowid2, ...])
out = emb(torch.tensor([...]))
stats = emb.get_stats()
wait = emb.get_wait_distribution() # p50 / p90 / p99 / max
emb.close()
后台预取失败会自动回退到同步读取;多个 PLE 模块可以共享同一个 prefetch_executor。
引擎适配层
目标是 不改 vLLM / SGLang 源码,启动前执行一小段 hook 即可把 PLE 表切到 EngramDB。
vLLM
from engramdb import Store
from engramdb.vllm_plugin import install_vllm_ple
store = Store("/path/to/engram-rows", shards=..., rows_per_shard=..., width=...)
install_vllm_ple(
Qwen3_8FlashNextNGramEmbedding, # 实际运行的 vLLM 模型类
store=store,
attr_name="embed_tokens_per_layer",
embedding_dim=hidden_size_per_layer_input,
)
from vllm import LLM
llm = LLM(model="...", ...)
如果已经构造好模型实例,可以用:
from engramdb.vllm_plugin import patch_named_embedding
patch_named_embedding(model, "embed_tokens_per_layer", store=store, embedding_dim=...)
SGLang
from engramdb.sglang import install_sglang_ple
install_sglang_ple(
Gemma4Model, # 实际运行的 SGLang 模型类
store=store,
attr_name="embed_tokens_per_layer",
embedding_dim=hidden_size_per_layer_input,
)
低层 reader 替换:
from engramdb.sglang import install_sglang_io_uring_reader
install_sglang_io_uring_reader()
engram-peft 集成
安装 engramdb-python 后,可以直接使用内置的磁盘版 MultiHeadEmbedding:
import engramdb
from engramdb.integrations import install_disk_multi_head_embedding
store = engramdb.Store("path/to/embedding-store", shards=1, rows_per_shard=100, width=256)
install_disk_multi_head_embedding(store)
# 之后再调用 engram-peft 的 get_engram_model(...) 即可让 Engram 层从磁盘读取 embedding
真实 Qwen PLE FP8 Store 使用专用注入:
from engramdb.integrations import install_real_qwen_ple_embedding
# scale 会从 checkpoint 自动读取;也可以显式传 scale=0.0002
install_real_qwen_ple_embedding(
store,
model_dir="/path/to/Qwen3.8-Flash-Next",
)
多表 / Arrow / 最小服务原型
多表按目录组织:
from engramdb import Database
db = Database("path/to/tables-root")
print(db.list_tables()) # ["alpha", "beta"]
raw = db.fetch("alpha", [1, 3], shards=1, rows_per_shard=100, width=256)
可选 Arrow 读取(需要 pyarrow):
from engramdb.arrow_utils import store_fetch_arrow, table_to_ipc_bytes
table = store_fetch_arrow(store, [0, 1, 2])
ipc = table_to_ipc_bytes(table) # Arrow IPC stream bytes
最小服务(当前为原型,提供两种 wire 模式):
JSON 模式:
from engramdb import Database
from engramdb.server import EngramDBServer
server = EngramDBServer(Database("path/to/tables-root"), host="127.0.0.1", port=8765)
server.serve_forever()
二进制模式(长度前缀 + 1-byte kind,fetch_raw 直接返回原始字节,
fetch_arrow 直接返回 Arrow IPC stream,不需要 base64 包装):
from engramdb import Database, EngramDBBinaryServer, EngramDBClient
server = EngramDBBinaryServer(
Database("path/to/tables-root"),
host="127.0.0.1",
port=8765,
)
server.serve_forever()
# 客户端
with EngramDBClient("127.0.0.1", 8765) as client:
tables = client.list_tables()
raw = client.fetch_raw("alpha", [0, 1, 2], shards=1, rows_per_shard=100, width=256)
ipc = client.fetch_arrow("alpha", [0, 1, 2], shards=1, rows_per_shard=100, width=256)
服务命令包括:
pinglist_tablesfetch/fetch_rawfetch_arrow(JSON 模式返回 base64 封装的 Arrow IPC;二进制模式返回裸 Arrow IPC stream)view_read
注意:PyO3
Store已不再是unsendable,fetch会释放 GIL,因此同一个 Store 可以从多个 Python 线程并发读取(已有test_store_concurrent_fetch冒烟)。 服务端Database.fetch仍会在请求线程中按需打开/复用 Store;生产级连接池化还在后续计划中。
定位(一句话)
让"确定性哈希的 n-gram 记忆表"(Qwen PLE、DeepSeek Engram 等)像数据库一样落盘、建索引、预取、服务化——单机 CPU+NVMe 低延迟推理 / 高吞吐训练预处理。
详细文档见上游仓库 docs/(design.md / specifications / roadmap)以及 examples/interop_engram_peft.py。
Metadata
Release files for engramdb-python 0.2.10
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| engramdb_python-0.2.10.tar.gz | 59.9 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| engramdb_python-0.2.10-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| engramdb_python-0.2.10-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| engramdb_python-0.2.10-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| engramdb_python-0.2.10-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
| engramdb_python-0.2.10-cp310-abi3-macosx_10_12_x86_64.whl | CPython 3.10 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 1.7 MB
Release files / engramdb_python-0.2.10.tar.gz
| Download URL | engramdb_python-0.2.10.tar.gz |
|---|---|
| Size | 59.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b2481361496371459574f2ea1969df2b5939c2d0f35e0f68056dd5ded762c0ca
|
|
BLAKE2b-256 checksum How to use checksums |
f13bf1d73c83e57e221eac776f181785d9f3638c919afaf101e53eeb32b92726
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 31, 2026.
Transparency logRelease files / engramdb_python-0.2.10-cp310-abi3-win_amd64.whl
| Download URL | engramdb_python-0.2.10-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 242.1 kB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
dc025151d9c3ffdfc3d763ead68cfa26e6bac25faba1027e2fe48aa70c38e8b5
|
|
BLAKE2b-256 checksum How to use checksums |
c91f582bb54966da0ad8656ba1ea594dacaa3c91cb02d84abb3522966be061cb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 31, 2026.
Transparency logRelease files / engramdb_python-0.2.10-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | engramdb_python-0.2.10-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 367.2 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
059138ea8052c5b0f2882484535c47bc09d7a5efcb03beed5d1196a8c9a65aa7
|
|
BLAKE2b-256 checksum How to use checksums |
0aed2a852a9c1693add45a66accfab3090fe4a6925b8678055aa117692d8f485
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 31, 2026.
Transparency logRelease files / engramdb_python-0.2.10-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | engramdb_python-0.2.10-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 350.7 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
666e8bcb4d864d5619eb93c4ac03f720440ec5c1bc72f0d3a4a729b4bdad65db
|
|
BLAKE2b-256 checksum How to use checksums |
fa61928151ff846b814c856eb21107cda49d35f1c3dc570d9cf703878482e4dc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 31, 2026.
Transparency logRelease files / engramdb_python-0.2.10-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | engramdb_python-0.2.10-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 348.2 kB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
d16b253a36742484e30961709f71b4f1fb6a1badbf10e48d85121d618da1011d
|
|
BLAKE2b-256 checksum How to use checksums |
fb4c7d2fbe6c27f328d8f4607b71ba81d188821c921e6b346b78680cf5cac1f7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 31, 2026.
Transparency logRelease files / engramdb_python-0.2.10-cp310-abi3-macosx_10_12_x86_64.whl
| Download URL | engramdb_python-0.2.10-cp310-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 357.0 kB |
| Tags | CPython 3.10 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
e90d8c0452f3f4c40cb5883333c309a5841d083657ce52e64fe89d07b8ba1d2f
|
|
BLAKE2b-256 checksum How to use checksums |
c9b76521467c04a0ab5ca8324ffe84ad30f926ffa082d5879d72ecd3dcf0946f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 31, 2026.
Transparency log