在本期“晨报”中,我选择了两个来自截然不同领域的论文。
使用 GAN(生成对抗网络)的图像生成在过去几年中取得了惊人的进展。在惊叹于一些令人难以置信的图像时,很自然地会问这样的壮举是如何实现的。“GAN 解剖:可视化和理解生成对抗网络”让我们深入了解 GAN 单元正在学习哪些类型的东西,以及操纵这些单元如何影响生成的图像。
2 月份举行了第 16 届 USENIX 网络系统设计与实现研讨会。Kalia 等人的关于数据中心快速 RPC(远程过程调用)的工作让我印象深刻。通过仔细考虑的设计,他们表明,使用商用 CPU 和标准有损以太网的 RPC 性能可以与基于 FPGA(现场可编程门阵列)、可编程交换机和 RDMA(远程直接内存访问)的专用系统相媲美。这有力地提醒我们,在转向更昂贵的解决方案之前,要确保我们充分利用了已有的资源。
- Adrian Colyer,《晨报》
GAN 解剖:可视化和理解生成对抗网络, Bau 等人, arXiv'18
今天的论文选择让我们对 GAN 内部发生的事情有了引人入胜的了解。除了论文之外,代码在 GitHub 上可用,并且可以在项目主页上找到视频演示。
我们对生成图像的 GAN 感兴趣。
对于人类观察者来说,训练有素的 GAN 似乎已经学习了关于图像中对象的事实:例如,门可以出现在建筑物上,但不会出现在树木上。我们希望了解 GAN 如何表示这种结构。对象是以纯像素模式出现,而没有任何诸如门和树木等对象的显式表示,还是 GAN 包含与人类感知的对象相对应的内部变量?如果 GAN 确实包含门和树木的变量,那么这些变量是否会导致这些对象的生成,还是仅仅是相关联?对象之间的关系是如何表示的?
该研究的基础是 渐进式 GAN 的三种变体,这些变体在 LSUN 场景数据集上进行训练。为了了解这些 GAN 内部发生了什么,作者开发了一种结合解剖和干预的技术。
给定一个训练有素的分割模型(即,一个可以将图像中的像素映射到一组预定义对象类别之一的模型),我们可以解剖 GAN 的中间层,以识别各个单元与每个对象类别之间的一致性程度。本文中使用的分割模型在 ADE20K 场景数据集上进行训练,可以将输入图像分割为 336 个对象类别、29 个大型对象的部件和 25 种材料。
解剖可以揭示与某些类别的对象外观相关的单元,但这种关系是因果关系吗?两种不同类型的干预有助于我们更好地理解这一点。首先,我们可以消融这些单元(关闭它们),看看相关的对象是否从先前存在的图像中消失。其次,我们可以强制打开这些单元,看看相关的对象是否出现在先前不存在的图像中。
论文中的图 1 提供了一个极好的概述。在这里我们可以看到 (a) 一组教堂的生成图像和 (b) 解剖识别出与树木匹配的 GAN 单元的结果。当我们消融这些单元时 (c) 树木在很大程度上消失了,当我们有意激活它们时 (d) 树木重新出现。
相同的见解可以用于人工指导的模型改进。在这里我们看到带有伪影的生成图像 (f)。如果我们识别出导致这些伪影的 GAN 单元 (e) 并消融它们,我们可以从生成的图像中移除不需要的伪影 (g)。
对于解剖,我们采用单元的上采样和阈值化特征图,并将其与给定对象类别的分割图进行比较。
一致性程度使用 IoU(交并比)度量来捕获。我们取阈值化图像和定义为属于分割类别的像素的交集,并将其除以它们的并集。结果显示组合像素中与类别相关的部分。
以下示例显示了对于 table 和 sofa 类别具有高 IoU 分数的单元。
我们可以说,如果消融给定的隐藏单元导致对象消失,而激活它导致对象出现,则给定的隐藏单元会导致给定类别的对象生成。对所有位置和图像的平均效果提供了单元对给定类别生成的 ACE(平均因果效应)。
虽然这些度量可以应用于单个单元,但我们发现对象往往依赖于多个单元。因此,我们需要识别一组单元 U,这些单元最大化对象类别 c 的平均因果效应。
这组单元是通过优化一个目标函数来找到的,该目标函数寻找部分消融图像和部分插入图像之间的最大类别差异,使用一个参数来控制每个单元的贡献。
在这里你可以看到增加更大组的隐藏单元的效果,在这种情况下,这些单元被识别为与 tree 类别相关联。
• 涌现出与对象类别的实例相关的单元,具有多样化的视觉外观。这些单元正在学习抽象。
• GAN 单元匹配的所有对象类别的集合提供了 GAN 已经学习到的关于数据的地图。
涌现出的单元是适合场景类型的对象类别:例如,当我们检查在厨房场景上训练的 GAN 时,我们发现与炉灶、橱柜和高脚厨房凳子的腿匹配的单元。另一个引人注目的现象是,许多单元表示对象的部件:例如,会议室 GAN 包含用于人的身体和头部的单独单元。
• 表示的信息类型逐层变化。早期层仍然纠缠在一起;中间层有许多单元匹配语义对象和对象部件;而后期层有单元匹配像素模式,例如材料、边缘和颜色。
这是一个渐进式 GAN 的逐层分解,该 GAN 经过训练以生成 LSUN 客厅图像。
• 与基线渐进式 GAN 相比,添加 minibatch stddev
统计信息提高了输出的真实感。单元分析表明,它还增加了单元表示的概念的多样性。
• 关闭(消融)被识别为与常见对象类别相关的单元会导致相应的对象在很大程度上从生成的场景中消失。但并非每个对象都可以被擦除。有时对象似乎是场景不可或缺的一部分。例如,在生成会议室时,桌椅的大小和密度可以减小,但不能完全消除。
• 通过强制打开单元,我们可以尝试将对象插入到场景中。例如,在各种场景中激活相同的门单元会导致门的出现——但门的实际外观会根据周围的场景而变化。
我们还观察到门不能在大多数位置添加。可以添加门的位置用黄色框突出显示……不可能在天空或树木上触发门。干预提供了对 GAN 如何强制执行对象之间关系的深入了解。即使我们尝试在第 4 层添加门,如果该对象不适合上下文,则该选择可能会在稍后被否决。
通过仔细检查表示单元,我们发现 GAN 表示的许多部分可以被解释,不仅作为与对象概念相关的信号,而且作为对输出中对象合成具有因果效应的变量。这些可解释的效果可用于比较、调试、修改和推理 GAN 模型。
未来工作中仍有未解决的问题。例如,为什么门不能插入天空?GAN 如何在后期层中抑制信号?理解 GAN 的层之间的关系是下一个障碍……
在 Adrian 的博客上阅读这篇文章:https://blog.acolyer.org/2019/02/27/gan-dissection-visualizing-and-understanding-generative-adversarial-networks/。
数据中心 RPC 可以通用且快速, Kalia 等人, NSDI'19
我们已经看到了许多令人兴奋的工作,这些工作利用 RDMA、FPGA 和可编程网络交换机的组合来追求高性能分布式系统。我和任何其他人一样,对所有这些感到兴奋。今天这篇论文的精彩之处在于,Kalia 等人在今年的 NSDI 上凭借该论文获得了最佳论文奖,它表明在许多情况下,我们实际上不需要承担额外的复杂性。或者换句话说,它严重提高了我们应该承担额外复杂性的门槛。
eRPC(高效 RPC)是一个新的通用远程过程调用 (RPC) 库,它提供与专用系统相当的性能,同时在基于有损以太网或无损光纤的传统数据中心网络中的商用 CPU 上运行……我们将 Raft 状态机复制的生产级实现移植到 eRPC,而无需修改核心 Raft 源代码。我们在有损以太网上实现了 5.5 微秒的复制延迟,这比使用可编程交换机、FPGA 或 RDMA 的专用复制系统更快或相当。
eRPC 只需要古老的 UDP(用户数据报协议)。有损以太网就足够了(不需要花哨的无损网络),并且不需要 PFC(优先级流控制)。普遍的看法是,你可以拥有通用的网络,它在任何地方都有效并且对应用程序无侵入性,但性能有限,或者你必须降低到低级接口并进行大量繁重的工作才能获得真正的高性能。
我们工作的目标是回答这个问题:通用 RPC 库是否可以提供与专用系统相当的性能?
令人惊讶的是,是的。
来自使用两个有损以太网集群(旨在模仿微软和 Facebook 数据中心中使用的设置)的评估
• 2.3 微秒中值 RPC 延迟。
• 单个内核上高达 1000 万次 RPC/秒。
• 单个内核上高达 75 Gbps 的大型消息传输。
• 即使每个节点有 20,000 个连接(集群范围内 200 万个),也能保持峰值性能。
eRPC 在 CX5 上的中值延迟仅为 2.3 微秒,表明使用商用以太网 NIC 和软件网络的延迟远低于广泛认为的 10-100 微秒的值。
(CURP [一致无序复制协议] 在现代数据中心通过 eRPC 将是一个非常壮观的组合!)
那么,立即想到的问题是如何?就像,“这是什么魔法?”
……是一个经过仔细考虑的设计,它针对常见情况进行优化,并避免因常见流量模式的交换机缓冲区溢出而触发数据包丢失。
就这些?是的。你不会在这里找到任何超低级、花哨、新颖、奇异的算法。定期提醒你,周到的设计是一项高杠杆活动!当然,你会发现所有部件组合在一起的方式非常特别。
那么,哪些假设适用于常见情况?
• 小消息。
• 短时长的 RPC 处理程序。
• 无拥塞网络。
这并不是说 eRPC 不能处理更大的消息、长时间运行的处理程序和拥塞的网络。它只是在它们不存在时不会支付意外开销。
针对常见情况的优化(我们接下来将介绍)总共将性能提高了高达 66%。在此基础上,eRPC 还实现了零拷贝传输和一种在保持恒定 NIC(网络接口控制器)内存占用量的同时进行扩展的设计。
核心模型如下。RPC 是异步的,最多执行一次。服务器使用唯一的请求类型注册请求处理程序函数,客户端在发出请求时包含请求类型。客户端在 RPC 完成时接收继续回调。消息存储在 eRPC 提供的、不透明的 DMA(直接内存访问)功能的缓冲区中,称为 msgbufs
。每个 RPC 端点(每个最终用户线程一个)都有一个用于数据包 I/O 的 RX 和 TX 队列、一个事件循环和多个会话。
当请求处理程序直接在调度线程中运行时,你可以避免昂贵的线程间通信(增加高达 400 纳秒的请求延迟)。当请求处理程序的持续时间很短时,这很好,但是长处理程序会阻止其他调度处理,从而增加尾部延迟,并阻止快速拥塞反馈。
eRPC 支持在调度线程中运行短时长的请求类型的处理程序(最多几百纳秒),并在工作线程中运行长时间运行的请求的处理程序。要使用哪种模式在注册请求处理程序时指定。这是 eRPC 中唯一需要的额外用户输入。
eRPC 选择使用数据包 I/O 而不是 RDMA 避免了 RDMA 中的循环缓冲区可扩展性瓶颈(参见 §4.1.1)。通过利用现代 NIC 中的多数据包 RX 队列 (RQ) 描述符,eRPC 可以在 NIC 中使用恒定空间,而不是随连接会话数量增长的占用空间(参见附录 A)。
此外,eRPC 用 CPU 管理的连接状态替换了 NIC 管理的连接状态。
这是一个明确的设计选择,基于 CPU 和 NIC 架构之间的根本差异。NIC 和 CPU 都会缓存最近使用的连接状态。CPU 缓存未命中由 DRAM 提供服务,而 NIC 缓存未命中由 CPU 的内存子系统通过慢速 PCIe 总线提供服务。因此,CPU 的未命中惩罚要低得多。其次,CPU 的缓存比现代 NIC 上可用的约 2MB 的缓存大得多,因此缓存未命中频率也更低。
eRPC 中的零拷贝数据包 I/O 提供了与 RDMA 和 DPDK(数据平面开发套件)等较低级别接口相当的性能。即使缓冲区包含多个数据包的数据,msgbuf
布局也确保数据区域是连续的(以便应用程序可以将其用作不透明缓冲区)。第一个数据包的数据和标头也是连续的,以便 NIC 可以通过一次 DMA 读取获取小消息。剩余数据包的标头在末尾,以便在中间留出连续的数据区域。
eRPC 必须确保在所有权返回给应用程序后不会干扰 msgbufs
,这从根本上通过确保它不保留对缓冲区的引用来解决。但是,重传可能会干扰这种方案。eRPC 选择使用“无信号”数据包传输来优化无重传的常见情况。权衡是在发生重传时过程更加昂贵
我们在排队重传数据包后刷新 TX DMA 队列,这会阻塞直到所有排队的数据包都被 DMA 化。这确保了所需的不变性:当响应被处理时,DMA 队列中没有对请求的引用。
eRPC 还为单数据包请求和调度模式请求处理程序的常见情况下的工作负载提供零拷贝接收,这也将 eRPC 的消息速率提高了高达 16%。
会话支持并发请求(默认情况下为八个),这些请求可以相对于彼此乱序完成。会话使用插槽数组来跟踪未完成请求的 RCP 元数据,插槽具有 MTU(最大传输单元)大小的预分配 msgbuf
,供发出短响应的请求处理程序使用。会话信用额度用于实现数据包级流控制。会话信用额度还支持端到端流控制以减少交换机排队。每个会话都获得 BDP(带宽时延乘积)/MTU 信用额度,这确保每个会话都可以达到线路速率。
我们为 eRPC 设计了一个线路协议,该协议针对小型 RPC 进行了优化,并考虑了每个会话的信用额度限制。为了简单起见,我们选择了一个简单的客户端驱动协议,这意味着服务器发送的每个数据包都是对客户端数据包的响应。
客户端驱动的协议具有更少的移动部件,只有客户端需要维护线路协议状态。速率限制也完全成为客户端的责任,从而释放了服务器 CPU。
单数据包 RPC(请求和响应只需要一个数据包)使用最少的数据包。对于多数据包响应和客户端驱动的协议,服务器无法在第一个数据包之后立即发送响应数据包,因此客户端发送一个 RFR(请求响应)数据包。实际上,对于具有四个或更多数据包的响应,这种增加的延迟被证明小于 20%。
eRPC 可以使用 Timely 或 DCQCN(数据中心量化拥塞通知)进行拥塞控制。评估使用 Timely,因为集群硬件无法支持 DCQCN。三项优化将拥塞控制的开销从大约 20% 降低到 9%
• 完全绕过 Timely,在无拥塞会话上接收到的数据包的 RTT(往返时间)小于低阈值。
• 绕过无拥塞会话的速率限制器。
• 每个 RX 或 TX 批次采样一次计时器,而不是每个数据包采样一次计时器以进行 RTT 测量。
这些优化之所以有效,是因为数据中心网络通常是无拥塞的——例如,在一分钟的时间尺度上,99% 的 Facebook 数据中心链路是无拥塞的,而对于 Google 上的 Web 和缓存流量,90% 的 ToR(顶架式)交换机链路(最拥塞的)在 25 微秒的时间尺度上利用率低于 10%。
eRPC 通过将重新排序的数据包视为丢失并丢弃它们来保持简单(当前的 RDMA NIC 也是如此)。当客户端怀疑数据包丢失时,它使用 go-back-N 机制回滚请求的线路协议状态。它回收信用额度并从回滚点重新传输。
这篇评测有再次变得太长的危险,所以我将保持非常简短。下表显示了通过消融各种优化的贡献。
我们得出结论,针对常见情况进行优化对于高性能 RPC 而言既是必要的也是充分的。
在这里你可以看到延迟随线程增加而增加的情况。eRPC 在具有有损以太网的大型集群中以低延迟实现了高消息速率、带宽和可扩展性。
对于大型 RPC,eRPC 可以使用一个内核实现高达 75 Gbps 的速度。
第 7 节讨论了 eRPC 在现有 Raft 库和 Masstree 键值存储中的集成。从 Raft 部分,作者得出结论:“主要的结论是,在商用以太网数据中心中,使用通用网络库可以实现微秒级的持久复制。”
eRPC 的速度来自于优先考虑常见情况的性能,仔细结合各种新旧优化,以及交换机缓冲区容量远超数据中心 BDP 的观察。eRPC 提供的性能直到现在才被认为只有无损 RDMA 光纤或专用网络硬件才有可能实现。它允许未经修改的应用程序接近硬件限制运行。
在 Adrian 的博客上阅读这篇文章:https://blog.acolyer.org/2019/03/18/datacenter-rpcs-can-be-general-and-fast/。
Adrian Colyer 是 Accel 在伦敦的风险合伙人,他的工作是帮助在欧洲和以色列寻找和建立伟大的科技公司。(如果您正在从事有趣的科技相关业务,他很乐意收到您的来信:您可以通过 [email protected] 联系他。) 在加入 Accel 之前,他在技术岗位工作了 20 多年,包括 Pivotal、VMware 和 SpringSource 的 CTO。
版权所有 © 2019 归所有者/作者所有。出版权已许可给 。
经许可转载自 https://blog.acolyer.org
最初发表于 Queue vol. 17, no. 2—
在 数字图书馆 中评论这篇文章
David Collier-Brown - 你对带宽一窍不通
当你的员工或客户说他们的互联网性能很差时,带宽可能不是问题。一旦他们拥有 50 到 100 Mbps 范围内的带宽,问题就是延迟,即 ISP 的路由器处理他们的流量需要多长时间。如果你是一家 ISP,而你所有的客户都讨厌你,请鼓起勇气。这现在是一个可以解决的问题,这要归功于一群执着的人,他们找到了这个问题,解决了它,然后在家庭路由器中证明了他们的解决方案。
Geoffrey H. Cooper - 使用 FDO 和不受信任的安装程序模型的设备入职
设备的自动入职是处理正在安装的越来越多的“边缘”和 IoT 设备的重要技术。设备的入职与大多数设备管理功能不同,因为设备的信任从工厂和供应链转移到目标应用程序。为了通过自动入职加快流程,必须在设备中正式确定供应链中的信任关系,以允许自动化过渡。
Brian Eaton, Jeff Stewart, Jon Tedesco, N. Cihan Tas - 通过关键路径追踪进行分布式延迟分析
低延迟是许多 Google 应用程序(如搜索)的重要功能,延迟分析工具在维持大规模低延迟方面发挥着关键作用。对于包含不断发展功能和数据的服务的复杂分布式系统,将总体延迟保持在最低限度是一项具有挑战性的任务。在大型、真实的分布式系统中,现有的工具(如 RPC 遥测、CPU 性能分析和分布式跟踪)对于理解整个系统的子组件很有价值,但在实践中不足以执行端到端延迟分析。
David Crawshaw - 一切 VPN 焕然一新
VPN(虚拟专用网络)已经有 24 年的历史了。这个概念是为与我们今天所知的互联网截然不同的互联网而创建的。随着互联网的增长和变化,VPN 用户和应用程序也随之发展。在 2000 年代的互联网中,VPN 经历了一个尴尬的青春期,与其他广泛流行的抽象概念交互不良。在过去的十年中,互联网再次发生了变化,这个新的互联网为 VPN 提供了新的用途。一种全新的协议 WireGuard 的开发为构建这些新的 VPN 提供了技术基础。