跳转到主要内容

MCMC样本存储的无框架后端

项目描述

PyPI version pipeline coverage

你希望在何处存储你的MCMC抽取?内存中?磁盘上?还是在数据中心运行的数据库中?

无论你希望将它们放在何处,或者哪个PPL生成它们:McBackend都将负责你的MCMC样本。

快速入门

《mcbackend》包由三部分组成

第一部分:MCMC运行和链元数据模式

无论你最喜欢的PPL是用哪种编程语言编写的,McBackend的ProtocolBuffers都可以用于生成C++、C#、Python等语言的代码,以表示MCMC运行、链和模型变量常用的元数据。

protobufs/meta.proto中的定义旨在最大限度地与ArviZ对象兼容,使得根据McBackend模式存储的MCMC抽取很容易转换为用于绘图和分析的InferenceData对象。

第二部分:存储后端接口

MCMC抽样算法在运行时创建的drawsstats需要存储在某处。

这个“某处”在PPLs/MCMC框架(如PyMCemcee)中称为存储后端。

大多数存储后端都需要用模型变量的元数据初始化,这样它们可以预先为即将接收的 drawsstats 分配内存。接收了数千个 drawsstats 之后,它们必须提供检索 draws/stats 的方法。

mcbackend.core 模块包含 BackendRunChain 等类,用于定义任何存储后端的这些接口,无论是内存、文件系统还是数据库存储。尽管当前实现仅限于 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

项目详情


下载文件

下载适用于您平台的应用程序。如果您不确定该选择哪个,请了解有关安装软件包的更多信息。

源代码分发

mcbackend-0.5.2.tar.gz (38.7 kB 查看哈希值)

上传时间 源代码

构建分发

mcbackend-0.5.2-py3-none-any.whl (41.1 kB 查看哈希值)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面