MCMC样本存储的无框架后端
项目描述
你希望在何处存储你的MCMC抽取?内存中?磁盘上?还是在数据中心运行的数据库中?
无论你希望将它们放在何处,或者哪个PPL生成它们:McBackend都将负责你的MCMC样本。
快速入门
《mcbackend》包由三部分组成
第一部分:MCMC运行和链元数据模式
无论你最喜欢的PPL是用哪种编程语言编写的,McBackend的ProtocolBuffers都可以用于生成C++、C#、Python等语言的代码,以表示MCMC运行、链和模型变量常用的元数据。
在protobufs/meta.proto
中的定义旨在最大限度地与ArviZ
对象兼容,使得根据McBackend模式存储的MCMC抽取很容易转换为用于绘图和分析的InferenceData
对象。
第二部分:存储后端接口
MCMC抽样算法在运行时创建的draws
和stats
需要存储在某处。
这个“某处”在PPLs/MCMC框架(如PyMC或emcee)中称为存储后端。
大多数存储后端都需要用模型变量的元数据初始化,这样它们可以预先为即将接收的 draws
和 stats
分配内存。接收了数千个 draws
和 stats
之后,它们必须提供检索 draws
/stats
的方法。
mcbackend.core
模块包含 Backend
、Run
和 Chain
等类,用于定义任何存储后端的这些接口,无论是内存、文件系统还是数据库存储。尽管当前实现仅限于 Python,但接口签名应该可以移植到例如 C++。
通过 mcbackend.backends
,McBackend 包提供了后端 实现。目前您可以从中选择
backend = mcbackend.NumPyBackend()
backend = mcbackend.ClickHouseBackend( client=clickhouse_driver.Client("localhost") )
# All that matters:
isinstance(backend, mcbackend.Backend)
# >>> True
第三部分:PPL 适配器
任何是 Backend
的东西都可以通过 适配器 包装,使其与您喜欢的 PPL 兼容。
在下面的示例中,初始化了一个 ClickHouseBackend
来存储 PyMC 模型的 MCMC 抽样结果到一个 ClickHouse 数据库中。有关如何在 Docker 中运行它的方法,请参见下面。
import clickhouse_driver
import mcbackend
import pymc as pm
# 1. Create _any_ kind of backend
ch_client = clickhouse_driver.Client("localhost")
backend = mcbackend.ClickHouseBackend(ch_client)
with pm.Model():
# 2. Create your model
...
# 3. Hit the inference button ™ while passing the backend!
pm.sample(trace=backend)
对于 PyMC,适配器从 5.1.1 版本开始存在于 PyMC 代码库中(相关:PyMC #5160),因此您只需要通过 pm.sample(trace=...)
参数传递任何 mcbackend.Backend
即可!
与 PyMC 内置的 NumPy 后端不同,MCMC 抽样结果现在存储在 ClickHouse 中。
检索 draws
& stats
在上面的示例中,我们现在可以从中检索后端的抽样结果。
请注意,由于此示例将抽样结果写入 ClickHouse,我们可以在另一台机器上运行下面的代码,甚至在上面的模型仍在采样时也可以。
backend = mcbackend.ClickHouseBackend(ch_client)
# Fetch the run from the database (downloads just metadata)
run = backend.get_run(trace.run_id)
# Get all draws from a chain
chain = run.get_chains()[0]
chain.get_draws("my favorite variable")
# >>> array([ ... ])
# Convert everything to `InferenceData`
idata = run.to_inferencedata()
print(idata)
# >>> Inference data with groups:
# >>> > posterior
# >>> > sample_stats
# >>> > observed_data
# >>> > constant_data
# >>>
# >>> Warmup iterations saved (warmup_*).
为下一个阶段做出贡献
McBackend 刚刚开始,正在寻找贡献。例如
- 模式讨论:需要哪些元数据?(相关:PyMC #5160)
- 接口讨论:应该如何演进
Backend
/Run
/Chain
? - Python 后端(HDF5,
*.proto
,...) - C++
Backend
/Run
/Chain
接口 - C++ ClickHouse 后端(通过
clickhouse-cpp
)
随着模式和 API 的稳定,中期目标可能是完全用 mcbackend
替换 PyMC 的 BaseTrace
/MultiTrace
。
消除 MultiTrace
是一个长期目标,其背后是使 pm.sample(return_inferencedata=True)
成为默认。
开发
首先克隆存储库并本地安装 mcbackend
pip install -e .
要运行测试
pip install -r requirements-dev.txt
pytest -v
一些测试需要一个在本地的 ClickHouse 数据库服务器。在 Docker 中启动一个
docker run --detach --rm --name mcbackend-db -p 9000:9000 --ulimit nofile=262144:262144 clickhouse/clickhouse-server
编译 ProtocolBuffers
如果您还没有安装它,请首先安装 protobuf 编译器
conda install protobuf
pip install --pre "betterproto[compiler]"
要编译除 Python 之外语言的 *.proto
文件,请查看ProtocolBuffers 文档。
以下脚本使用 betterproto
编译器插件编译它们以用于 Python,以获得看起来很棒的数据类。它还把生成的文件复制到 mcbackend
中的正确位置。
python protobufs/generate.py
项目详情
下载文件
下载适用于您平台的应用程序。如果您不确定该选择哪个,请了解有关安装软件包的更多信息。