RustConf 2023 - Rust in the skies over Antarctica

https://www.youtube.com/watch?v=lg_27Ds2Ir0&list=PL85XCvVPmGQgR1aCC-b0xx7sidGfopjCj&index=24

Summary

本视频讲述了一个物理学家在南极使用Rust语言进行的天体物理实验。他介绍了如何利用Rust解决他在项目中遇到的挑战,包括数据压缩和粒子探测技术,以及为什么选择南极作为实验地点的原因。

Highlights

  • [🔭] 物理学家介绍了他的研究领域和对暗物质的探索。
  • [🎈] 项目利用自定义电子设备和气球进行高空实验。
  • [💻] Rust语言在处理有限资源和实现高效数据处理方面表现出色。

Keywords

天体物理学, 暗物质, Rust语言


我会按照您的要求整理并翻译内容,不会遗漏或总结,而是尽量完整地保留原文信息。以下是整理和翻译后的内容:

我将讨论在南极上空的Rust。在开始之前,先简单介绍一下我自己。我是一名天体粒子物理学家,在这个领域工作了10多年。从开始攻读硕士论文起,我就每天都在编程。在这段时间里,我去过很多地方,参与了不同的项目,写了很多不同的代码。

最初,我用Python写了一些个人分析代码。然后我更深入地参与到使用C++的项目中,为大规模生产、模拟和数据处理编写代码。我还为实验室里的小项目写代码,比如让实验室里的小工具可以相互通信,用于进行局部测量。我还把这些都包装起来,为实验室编写web应用程序,这样人们就可以轻松使用各种仪器。

我经历了相当长的journey,最近(更准确地说是去年)我开始接触Rust。同时,我被指派负责我正在从事的项目中一个非常关键的部分,我将在这次演讲中告诉你们。有趣的是,当我自己尝试Rust时,我非常兴奋,同时我发现这正好解决了我需要为我的项目解决的问题。

在讲述这个项目之前,我需要从头开始说起。我们不是要回溯到大爆炸,而是要观察宇宙。我告诉过你们,我是一名天体粒子物理学家。我实际研究的,我的主要任务是研究暗物质。

我们对宇宙的理解相当好,实际上我们有非常精确的理论来解释一切是如何运作的。然而,如果仔细观察这些理论,实际上发现我们并不太了解。发生的情况是,我们很擅长测量物体的重量。我们基本上可以确定宇宙的所有能量密度,比如宇宙的质量。但是,当我们仔细观察,看看我们在宇宙中实际看到的东西,比如单个恒星和星系,我们实际上发现这与我们测量到的质量不符。我们可以在宇宙的许多不同范围尺度上做这个。我这里有两个例子给你们看,我会带你们看一下。

在左下角,这是一张非常著名的图片。在这张图片中,你看到的是两个星系团,它们实际上在相互穿越,可以说是在碰撞。在这些星系团中,最亮的物质,也就是我们可以用望远镜看到的物质,在这种情况下实际上是我们观察到的X射线,来自气体。当这些气体,当这两个星系团相撞时,这些气体会变热,产生X射线,这就是这张图片中粉红色的部分。

这张图片向我们展示的是,我们看到的大部分质量实际上集中在这个粉红色的点周围。但我们也可以应用另一种技术来探测质量,这就是引力透镜效应。如果你应用这种技术,我不想过多地涉及细节,但我们看到实际上有两个质量中心,用蓝色阴影区域表示。这对我们意味着,我们看到的东西和实际上最多质量的地方是不一致的。实际发生的是,在这些星系团中有某种东西,当它们穿越时,它实际上完全没有相互作用,我们什么也没看到,但它似乎存在。

另一个非常著名的例子是星系中恒星的旋转曲线。这在右边。你有两颗恒星,一颗非常靠近星系中心,另一颗较远。如果你想象星系就像一个星星的漩涡,那么你实际上会预期,离得更远的恒星会围绕星系中心旋转得慢得多。就像如果你想象我们的太阳系,外层行星围绕中心旋转得也慢得多。但这也不是我们观察到的。总的来说,我们认为星系里一定有某种东西,它很重,但我们看不见。

现在,问题是,我告诉过你们,我在这个领域,我们想要探测它。那么,你怎么探测你看不见的东西呢?事实是,我们毫无头绪,但这并不能阻止人们提出理论。某种程度上,希望或想法是,最终这些暗物质粒子,假设它是一种粒子,它们会相互作用,会发生一些事情,我们不知道是什么,但最终会产生一些我们实际上可以探测到的东西。

在这个例子中,它可能是各种粒子。那么这些粒子会在哪里产生呢?我给你们展示过,这是来自外太空的东西。实际上,在太空中某处会有这些粒子的流。对我们在地球上发生的是,我们每秒钟都被大量这些粒子轰击。这些是各种粒子,基本粒子,电子,氢核等等。现在,困难的任务是我们必须弄清楚,这些粒子中哪些来自我们的暗物质相互作用。

在这里,我现在要告诉你们的实验中,我们利用了一个技巧。一些理论预测,暗物质粒子会衰变成我们实际上可以观察到的粒子,它们预测会产生物质和反物质对。反物质与物质相同,只是带相反的电荷,但这里重要的是,它非常罕见。所以,如果我们在所有这些从外太空来到我们这里的粒子中看到一些反物质,那么我们可能就发现了暗物质存在的线索。

那么我们如何识别这样的粒子呢?有很多实验,我正在进行的那个叫做GAPS。GAPS代表通用反粒子谱仪,它是一个粒子探测器。对于它的用途来说,它相当大。它将被挂在一个气球上,我一会儿会告诉你们这个。

首先,我想告诉你们我们实际上是如何测量这些粒子的。有两个非常重要的属性,使我们能够弄清楚我们实际测量的是什么类型的粒子。这两个属性是粒子的速度和能量。对于这两个属性,我们的探测器有两个组件。测量能量的叫做追踪器,我们这里不讨论这个。我想和你们讨论的是TOF系统。TOF代表飞行时间。

你所做的是,你有两个平面的探测器。当你的粒子穿过时,你测量它穿过上平面的时间,然后你测量它穿过下平面的时间。你知道你安装平面的距离,然后你实际上可以计算出粒子的速度。你是这样做的:在粒子物理学中,我们喜欢使用一种叫做塑料闪烁体的东西。它实际上只是透明的塑料。当带电粒子穿过这个塑料闪烁体时,它实际上会产生一点光。你可以检测这个光。底部有一张这些闪烁体的图片,你实际上看不到它,因为你必须把它用这种黑色塑料很好地包裹起来,以遮蔽环境光。

在底部有一张实际实验的图片。这就是我们要挂在气球上的东西。你在顶部看到的是这个飞行时间系统的一个平面,我刚才告诉过你。它可以装进这个房间,但对于气球来说,它相当大。

那么,我演讲的标题是”南极上空的Rust”。现在,我希望我已经让你们对我们想要测量什么,为什么我们想要测量它感到兴奋了。现在是我们要在哪里测量它。问题是,我告诉过你们的这些粒子,它们来自外太空。所以你必须要么去太空,要么至少去到大气层的高处。南极是一个非常好的地方。

首先,一个非常基本的原因是物流在南极非常好。相对来说,把科学实验运送到那里比你想象的要容易。因为你在这里看到的,这个航拍视图是麦克默多站的景象。这是一个大型的,不是定居点,而是一个大型的科学站,全年都有人员。他们的人口大约有一千人。所以有很多人可以帮助你发射你的气球。这是一个原因,所以对我们来说实际上是可行的。

另外两个原因是,首先,如果你有一个气球,你想要有稳定的天气条件。你希望你的气球能飞很长时间,我们希望能飞30天。这意味着它需要稳定的大气条件。事实证明,在南极周围有一个喷射流。所以我们希望能捕捉到这个喷射流,如果它在大约37公里的高度。然后如果我们捕捉到它,它有望在大约30天内保持稳定。

然后还有另一个对我们来说非常重要的特性,你在极地有这个特性。如果你看地球的磁场,那么在赤道周围,地球的磁场是平行于地球表面的。你在这个图中看到的是平行于表面的磁场强度。如果你去到极地,它实际上会弯曲,它会进入磁极。那就是粒子不会被这个场deflect太多的地方。所以它们可以到达大气层中我们可以发送气球到达的这些层。这实际上是同样的效果,为什么你会看到北极光。

如果你有一个气球,有一些特定的挑战。现在,我们更多地来到了演讲的软件部分。实际上,在气球上,你在所有方面都受到限制。首先,你的重量受到限制。它不能太重,否则它就不会升空。我们已经相当重了,我们大约有3.7公吨。但还有其他受限制的东西。例如,你的带宽。你没有无限好的连接到你的气球。所以你必须非常小心你想要发送下来的数据。还有另一件真正受限制的东西,那就是电力。气球有一个太阳能阵列,它只能产生一定量的电力,这不能被超过。

然后,如果你现在想为这个气球写代码,你看看编程语言。问题是,因为你受到如此多的限制,你仍然在气球上有很多科学工作要做。所以你仍然需要处理大量的数字,做很多测试。你能够做的事情也可以用你消耗的能量来表示。

我从一篇出版物中得到了这张图片。这些人在做的事情,这真是一篇很棒的出版物。如果你们感兴趣,我也可以把它放在Discord上。这些人在研究,他们在对不同的编程语言进行基准测试。在x轴上只是编程语言的名称,在y轴上是它为非常具体的任务消耗了多少电力。他们做了很多基准测试。在这个案例中,它是通过二叉树工作。你看到我们心爱的Rust表现得非常好。这真的很棒。如果我们为我们的项目选择了Go,我们在气球上能完成的工作只有现在的六分之一。所以这已经是你在为这样一个项目写代码时必须考虑的事情了。

最后,我很高兴我的幻灯片上有一只企鹅。对于这个气球,我们必须构建大量的电子设备,一切都是定制的。我不想过多地深入细节。这是在UCLA开发的,他们做得非常好。我只想强调两个电子部件。上面两个,红色的那个和中间的那个。红色的是触发系统的一部分。我必须多次提到触发系统,因为触发系统做的是告诉你哪些闪烁体板实际上看到了一些有趣的东西。哪里有粒子穿过。然而,这个触发系统必须非常快,所以它全部是基于固件的。我们的软件没有任何访问权,我们只是从中获得一些位掩码。

现在软件想要讨论的是这个RAR板部分。中间的那个。这实际上是进行信号数字化的部分。上面有一个数字化芯片,但也有一个30位芯片。它实际上是以一种非常聪明的方式完成的。数字化的结果将被放置在操作系统可以访问的内存中。然后实际上,我们可以用我们的Rust代码直接访问这个板上的数字化数据,然后开始处理。这运行Linux。所以企鹅就来了。

其他组件实际上是这些RAR板,我们有很多,因为它们直接连接到这些面板,闪烁体板。但然后所有来自RAR板的数据都在一个中央实例中进一步处理。这是一个嵌入式系统,是一些现成的组件,我们只是购买了它。它通过网络与所有RAR板通信。这也需要大量的编码。然后我们还有另一个组件,我已经提到过的红板,它是触发系统的一部分。这也由一个主实例控制。这也是在UCLA制作的一些定制电子设备。所有这些组件都可以通过以太网相互通信。

就是总结一下所有这些电子设备,这是数据流的视图。这是你的各个组件。你有这些单独的闪烁体板,它们基本上产生模拟信号。然后它们连接到触发系统,也连接到一个读出板。最后,一切都由中央CPU,这个中央嵌入式系统收集。它被传递下去,到达气球上的其他消费者。最后,它也被存储,最后被发送到地面。

现在我实际上谈了很多关于信号、模拟信号和数字化的内容。这就是信号实际上的样子。我告诉过你们这些闪烁体板,我告诉过你们在这些板中会发光。那么现在的问题是你如何检测这个光。实际上你所做的是,你有非常敏感的光电二极管,你把它们放在板的每一端。这些光电二极管是半导体,所以当你向它们照光时,会有电流产生。如果你施加电压,就会有电流,然后你实际上可以测量电压降。这个电压降就是我们的信号。在数字化形式下,你可以在底部的这个图表中看到这个。

在x轴上是纳秒,所以它实际上是一个非常快的信号。在y轴上是毫伏。这就是我们在读出板上得到的信号,然后我们必须在第一阶段处理它。实际上这就是第一个问题出现的地方,因为对我们来说信号相当大。因为在x轴上你有1,24,24个值,每个值都有14位。所以它是一个相当好的数字转换器,但这意味着我们有大量的数据。因为你必须想象我们有160个板,每个都在两侧读出,对于我们有限的气球来说,这可能是相当多的。

这实际上就是我要讲的项目开始的地方。我正在评估为气球开发的软件,然后发现,因为这个触发系统和读出系统本质上没有连接,所以我们只是试图读出所有东西。然后你很快就会遇到问题,因为我告诉过你这是大量的数据。我还告诉过你我们受到限制,所以我们的网络交换机只有每秒1千兆比特。

这限制了我们可以探测粒子的速率,如果我们必须读出所有东西,大约是170赫兹。这不能满足我们的科学要求。科学要求是更像500赫兹。另一件事是,即使是这170赫兹,它也已经超饱和了。你不想使用所有你的余量。所以这是一个大问题。

有两种方法可以解决这个问题。一种方法是实际使用触发系统,只从那些实际看到了什么的板子获取数据,或者触发器声称它们看到了什么的板子。另一种方法是你取你的信号,以某种方式压缩它。你提取对你有趣的值,或者以某种方式切割它。然而,在这里你必须非常小心,因为这个信号中有很多信息。

对我们来说也是,因为我们在寻找新的东西,比如最终的暗物质。所以我们实际上不知道我们会看到什么,当粒子出现在探测器中时,我们的信号会是什么样子。我们必须非常小心,我们可能可以从信号中学到很多东西。所以我们不想过多地削减它。

所以这种解决方案,我们必须以多种方式进行过滤,但这意味着我们必须在我们的TOF系统上运行精心制作的代码来完成所有这些。

除此之外,代码还必须执行其他任务。它必须进行数据采集,一般来说,还要保存数据,检查完整性,可能计算校验和。还有一个命令接口,地面上的人想要向气球发送命令,这必须被处理。还有一些其他与这些探测器有关的任务,比如校准等。所以代码必须做很多事情。

我现在想告诉你为什么Rust帮助我克服了所有这些问题和这些主要问题。对我来说,这真的很棒。就在我被介绍到这个项目的同时,稍早一点,我刚刚开始玩Rust,我真的很喜欢它。我想,哦,如果我能用它做一个真正的项目那就太好了。然后这个任务落到了我的桌上,这真是太棒了。

有一件事实际上真的帮助了我。在学术界,工作组通常很小。我告诉你的这个任务,数据压缩,这是任务关键的。如果我们不能实现这一点,我们就不用飞了。这对任务来说是绝对关键的,速度测量也是如此。我觉得,好吧,我有这个巨大的任务,现在我需要帮助。但在开始的时候,没有其他人,但实际上Rust非常友好,帮助了我。

所以我列出了一些对我来说真正突出的东西。第一个是多线程。我告诉过你我们受到限制,这也意味着即使在今天,所有东西都有多个核心。即使在RAR板上我们也有两个核心,我们必须同时使用所有这些核心。Rust真的很友好,实际上在这个代码中,我仍然在使用Rust书中例子中的线程,它们仍然表现得很好。这太棒了。

然后是另一件事,这些都是小事,但它们是大问题。I/O,我告诉过你我们有所有这些不同的组件,它们必须通过网络相互通信。这意味着我们必须序列化我们的数据结构,我们必须将它们序列化成位和字节。不幸的是,我对这方面有点阅读障碍,但Rust也在这里很友好。在标准库中,你有这些漂亮的方法来处理小端字节。写一个解析器来完成这项工作非常容易,或者相对容易。

你可能会立即问,为什么我们不使用序列化库。问题是我们决定在这里完全定制,真正榨干我们拥有的所有资源。

然后另一件真正重要的事情是错误检查。Rust的Result很棒。它真的符合我们的需求。当你在气球上时,这个气球基本上是自主运行的。由于网络连接非常有限,它必须自己做决定。Result真的有帮助,对于代码中的每一步,我们都是这样编码的,对于每个函数调用你都会得到一个Result。代码检查,好,现在发生了什么,好,发生了什么,我们如何缓解这个问题。即使我们还不知道该怎么做,至少它会写一个日志条目。

当我们使用代码并分析它的表现如何以及有什么问题时,我们会知道。我不需要说,但在气球上也不允许panic。使用Result真的帮助缓解了这个问题。

另一件事是测试和基准测试。当我开始这个项目时,我是独自一人,没有其他人会为我写测试,我有点时间压力,需要让事情运转起来。Cargo真的很友好,它为测试提供的环境让事情变得非常容易。这个代码是任务关键的,这意味着我不能犯任何错误。在开始的时候,至少我没有任何人在我背后看着我。所以我完全依赖于测试,但我们计划明年飞行,我不能花太多时间。所以它变得如此容易,我真的很感激。

基准测试是另一回事。基准测试,所以我试图首先以一种简单的方式编写代码,这样即使几个月后我也能理解我在做什么。但由于资源如此有限,我确实需要做一些基准测试,看看我是否能达到我被指派的目标。Rust也让这变得非常容易。

这基本上是演讲技术部分的结束。我想告诉你一些我在天体粒子物理学界的Rust经验,或者至少在我工作的实验的社区中的经验。

这实际上是这个组内的第一个Rust项目。在此之前,或者基本上,在大多数天体粒子物理学的工作组中的情况是什么,至少从我多年来看到的情况来看。大多数代码是C++。我认为这有两个主要原因。一个是许多人依赖的库,这是root和Geant4库。root来自CERN,提供了一个非常好的输入输出接口。实际上CERN在这种格式中存储所有数据。Geant4是一个非常流行的库,用于模拟粒子在物质中的相互作用。它们是用C++编写的,所以大多数人想要与之接口。

另一个问题是,学术界的工作组通常真的很小,他们承受着发表的巨大压力。所以人们通常没有时间花在学习新东西上。有一些代码是某人很久以前用C++ 98标准写的,它仍然有效,所以你压力很大,不得不使用它。

那么对我来说情况如何呢?实际上,正如我告诉你的,我刚刚出于好奇开始使用Rust。我很快发现它实际上满足了我所有的要求,这可能是我实现这个任务的唯一方法。所以当我告诉他们时,人们实际上非常友好。我最近在我们的合作会议上介绍了这个,我只得到了积极的反应。我原本预计可能会有更多的反弹,或者有人会说,哦,为什么你不像我们一直做的那样做,但并没有发生这种情况。

所以我想鼓励你,如果你有一个新项目,你想使用Rust,即使你在一个以前没有使用过的环境中,也许值得尝试一下。

还有一些事情是社区仍然可以为我们做的。我不知道,这不是我在要求这个,这只是我的个人观点。Python做了什么,他们提供了一个包,可以非常容易地读取root文件,而不依赖于所有这些root库。我认为这对于Python在我的领域是一种突破,或者不是Python的突破,但它肯定帮助了它的采用。你可以很容易地读取这些root文件。我真的很喜欢Polars,这肯定有帮助。Polars是一个Rust数据框架库,这肯定有帮助。

是的,有了这个,我来到了我的结论。这是我的总结,我希望我让你们对GAPS实验和寻找暗物质有点兴奋。我希望我能说服你们Rust非常适合这个任务。它实际上将会升空,飞行,希望明年在南极的天空中盘旋,或者无论何时发射。是的,我想感谢你们所有人,感谢你们收看这个直播。谢谢。