#simulation #monte-carlo #setting-up #statistical #lattice #running #distributed

ergothic

Rust 库,用于设置和运行分布式蒙特卡洛统计模拟。主要用于晶格量子色动力学。

5 个版本

使用旧 Rust 2015

0.1.4 2019 年 8 月 13 日
0.1.3 2018 年 7 月 15 日
0.1.2 2018 年 7 月 8 日
0.1.1 2018 年 7 月 8 日
0.1.0 2018 年 7 月 8 日

#1257算法

WTFPL 许可证

27KB
427

Ergothic

Ergothic 是一组用于设置和运行分布式统计蒙特卡洛模拟的辅助工具,用 Rust 编写。它是多功能的,可以用于任何基于蒙特卡洛或其变体(如 Metropolis-Hastings)的统计模拟。然而,其主要目的是简化在晶格上模拟量子场论的过程。

Ergothic 将为您执行与您的研究主题无关的常规任务,让您专注于重要的代码。使用 ergothic 编写的模拟可以在单线程本地环境中运行,这使调试变得非常容易,也可以在拥有数万个节点的集群上运行。无需更改代码即可将您的模拟扩展到任何规模,技术细节已经为您处理好了!

基本教程

Ergothic 提供了一个非常简单的 API,您可以使用它来设置您的模拟。您只需要了解以下概念。

样本

样本 是配置空间中的一个点,表示系统的可能配置。例如,在晶格量子色动力学中,一个样本由分配给晶格链的 SU(3) 群元素(称为全息)的赋值组成。

在代码中

创建一个表示模拟中样本配置的数据类型

struct MySample {
  ...
}

为您的样本实现 ergothic::Sample 特性。您需要实现以下 3 个方法

trait Sample {
  fn prepare() -> Self;
  fn thermalize(&mut self) { ... }
  fn mutate(&mut self);
}

这些方法的意义将在以下内容中进行讨论。

变异

变异 是 ergothic 中驱动任何模拟的核心操作。变异通过随机化其自由度来改变您的样本,以便保持一个称为 遍历性 的关键属性。

观察系统在特定样本配置中的概率密度,平均随时间变化,等于统计系综的概率密度。后者是模拟的参数,通常可以从底层物理中推断出来。例如,在格量子场论中,这是欧几里得(Wick旋转)威尔逊作用的指数。

在代码中

实现Sample特质的mutate方法。你在mutate中使用算法必须生成具有正确概率密度的样本,这是绝对关键的。

准备 & 热化

通常,最近初始化的样本将非常不典型。这是因为初始化逻辑通常不知道概率密度函数。它只是用零或随机值填充样本配置的字段。

消除初始化偏差被称为热化。通常,可以通过对样本应用固定的数量(10-20)次突变来实现。但是,ergothic允许你实现自己的热化算法。

在代码中

实现Sample特质的prepare方法。

可选地,你可以实现thermalize方法。默认实现应用mutate 20次。

度量

度量是与物理可观测量相对应的统计计数器。任何ergothic模拟的目的是确定给定度量列表的期望值和统计不确定性。

在代码中

创建一个Simulation并将其度量添加到其中。所有度量都必须提供唯一的人可读名称。

fn main() {
  let mut simulation = ergothic::Simulation::new("Lattice QCD");
  let ground_state_energy = simulation.add_measure("Energy of the ground state");
  ...
}

测量函数

当你的模拟运行时,在每一步你都有一个样本配置。通过测量感兴趣物理可观测量并累积这些值在统计计数器中的值是由测量函数完成的。

在代码中

将lambda传递给入口函数ergothic::Simulation::run

simulation.run(|s: &MyState, ms| {
  // Calculate the values of relevant observables in state `s` and accumulate them in `ms`.
  // Accumulating values is easy: just call
  // ms.accumulate(ground_state_energy, value);
  // where `value` is computed using the sample configuration `s`.
});

示例

让我们将所有这些放在一起,编写一个简单的模拟。我们的模拟将计算xx^2的均值,其中x[0 .. 1]内均匀分布。

extern crate ergothic;
extern crate rand;

struct MySample {
  x: f64,  // Random variable within [0 .. 1].
}

impl ergothic::Sample for MySample {
  fn prepare() -> MySample {
    MySample{x: rand::random()}
  }
  
  fn mutate(&mut self) {
    self.x = rand::random();
  }
}

fn main() {
  let mut simulation = ergothic::Simulation::new(
      "Computing expectations of random variable and its square");
  let x = simulation.add_measure("Mean X");  // Mean value of the random variable x.
  let x2 = simulation.add_measure("Mean X^2");  // Mean value of the square of x.
  simulation.run(|s: &MySample, ms| {
    ms.accumulate(x, s.x);  // Accumulate the value of x in the statistical counter for the corresponding measure.
    ms.accumulate(x2, s.x.powi(2));  // Accumulate the value of x^2 in the statistical counter for the corresponding measure.
  });
}

就是这样!这段简单的代码完全可用,也可以在拥有成千上万节点的集群上运行!

运行示例

要调试模式下运行示例,只需运行以下命令

cargo run

就这样!

示例输出

在调试模式下,ergothic模拟将每2秒钟输出一个测量值的表格。以下是上面示例的表格

Simulation uptime: 5 secs
Samples processed: 4839379
Aggregate values:
+----------+--------------------+------------------------+----------------------+
| MEASURE  |    EXPECTATION     |      UNCERTAINTY       | RELATIVE UNCERTAINTY |
+----------+--------------------+------------------------+----------------------+
|   Mean X | 0.4999631317520213 | 0.00013121218432651647 | 0.000262443720333356 |
| Mean X^2 | 0.3332809661876769 | 0.0001355082806320386  | 0.0004065887175679   |
+----------+--------------------+------------------------+----------------------+

我们看到X和X^2的期望值分别是我们通过解析积分所期望的(1/2和1/3)。在处理约500万个样本后,统计不确定性分别为0.03%和0.04%。

扩展规模

现在我们想要充分利用我们大学/软件公司/云服务提供商等所属的巨大计算资源。

计算模型

Ergothic使用“令人尴尬的并行”计算模型。所有参与模拟的节点都在做同样的事情——产生数据点和将这些数据点发送到存储服务。这个模型有很多优点——它超级简单,可完美扩展,没有瓶颈,因为节点之间不进行通信。

你可以使用ergothic_cli命令行工具直接查询数据库来分析你的模拟的中间(或最终)结果。

设置MongoDB

Ergothic 需要一个数据汇聚点,将数据点导出到该点。目前,唯一支持的数据汇聚点类型是 MongoDB,尽管实现其他导出程序应该很容易,并且是 ergothic 的下一个目标之一。

运输模拟

使用以下命令构建相同代码的优化版本

cargo build --release

现在您需要一种将二进制文件分发给集群节点并运行它们的办法。例如,您可以将二进制文件捆绑到 Docker 容器中,并使用 Kubernetes 进行计算调度。

使用以下命令行参数运行容器

./my_simulation --production --mongo mongodb://hostname1:port2[,hostname2:port2,...] --mongo_db ergothic_data --mongo_coll my_simulation

其中

  • hostnames 应解析为运行 MongoDB 节点的计算机。
  • ports 应对应于公开的 MongoDB 端口。
  • --mongo_db 是发送数据点的数据库名称。
  • --mongo_coll 是发送数据点的集合名称。

在生产模式下,每个节点每 5 分钟左右将产生一个数据点。数据点将累积在数据库中。

分析结果

随着模拟的运行,数据点在数据库中累积。本节描述了如何查询数据库以获取汇总值和不确定性。

待办事项:在实现 ergothic_cli 工具之后,解释如何使用它来分析和操作结果。

待完成事项

Ergothic 当前缺少的最重要的功能的清单

  • 数据分析工具 ergothic_cli 用于查询和汇总数据点。
  • 多线程作业 - 能够将模拟扩展到 NxM 线程,其中 N 是节点数,M 是每个节点的线程数。线程之间不应相互通信,计算模型仍然保持尴尬的并行性。
  • 导出到本地文件和其他数据库 - 到其他格式的导出器。

依赖项

~16MB
~281K SLoC