<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[HFAI Blog RSS]]></title><description><![CDATA[幻方 AI 专注前沿科技研发，以 AI 技术激发创造力和想象力，让人类更多梦想变成现实。幻方 AI 包含「萤火」深度学习训练平台、幻方量化（使用 AI 进行投资的对冲基金）、AI 基础科学研究。]]></description><link>https://www.high-flyer.cn</link><generator>GatsbyJS</generator><lastBuildDate>Wed, 14 Oct 2026 10:41:15 GMT</lastBuildDate><item><title><![CDATA[FlashAttention：具有 IO 感知，快速且内存高效的新型注意力算法]]></title><description><![CDATA[Transformer 模型的核心是自注意力机制（self attention），其在序列长度上时间和存储的复杂度都在  级别。随着大语言模型（LLMs）规模的不断扩大，为 LLM…]]></description><link>https://www.high-flyer.cn/blog/flash_attn/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/flash_attn/</guid><dc:creator><![CDATA[Vachel]]></dc:creator><pubDate>Thu, 19 Oct 2023 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Transformer 模型的核心是自注意力机制（self attention），其在序列长度上时间和存储的复杂度都在 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;O(N^2)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.0641em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.02778em;&quot;&gt;O&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10903em;&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8141em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 级别。随着大语言模型（LLMs）规模的不断扩大，为 LLM 配备更长的上下文背景，在工程实现上面临着非常大的挑战。&lt;/p&gt;
&lt;p&gt;来自斯坦福大学计算机系与纽约州立大学布法罗分校的科研团队发表了一种新型的注意力算法，名叫 FlashAttention ，其不仅拥有比 PyTorch 标准注意力快 2~4 倍的运行速度，所需内存还减少了 5~20 倍。后续发布的 FlashAttention2，Flash Decoding 还拥有更夸张的性能加速表现。&lt;/p&gt;
&lt;p&gt;幻方基础研究研发的&lt;a href=&quot;/blog/hai-llm&quot;&gt;大模型训练工具 HAI-LLM&lt;/a&gt; 全系采用 FlashAttention，大幅提高显卡利用率，实现了非常优异的训练表现。本系列文章将为大家深入浅出聊聊 FlashAttention 背后的技术和我们的实践经验。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文地址&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/abs/2205.14135&quot;&gt;https://arxiv.org/abs/2205.14135&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;项目源码&lt;/strong&gt;：&lt;a href=&quot;https://github.com/Dao-AILab/flash-attention&quot;&gt;https://github.com/Dao-AILab/flash-attention&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;背景&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%83%8C%E6%99%AF&quot; aria-label=&quot;背景 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;背景&lt;/h2&gt;
&lt;p&gt;传统的注意力算法其内存效率是 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;O(N^2)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.0641em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.02778em;&quot;&gt;O&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10903em;&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8141em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的。过去一些优化注意力机制的方法是采用近似值，例如稀疏近似、低秩近似以及它们的组合。尽管这些方法可以将计算降低到线性或接近线性（&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;O(N)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.02778em;&quot;&gt;O&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10903em;&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;），但它们过于关注降低每秒所执行的浮点运算次数（FLops），并且倾向于忽略来自内存访问（IO）的开销。&lt;/p&gt;
&lt;p&gt;多年来 GPU FLOPS 的增长速度一直比内存吞吐量（TB/s）的增长更快。我们在 A100 或同级别显卡上优化模型训练的实践中发现，内存吞吐量才是影响训练进一步提效的重要瓶颈。FLOPS 和内存吞吐量需要紧密结合，才能充分提高的训练效率。这就需要我们在软件层面上进行更加细致的设计。&lt;/p&gt;
&lt;p&gt;如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 352px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/0f85be112184d6143d30b192d6933a59/e5a29/01.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 89.57055214723925%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAASABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAQFAQMG/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAL/2gAMAwEAAhADEAAAAe7l00iYuGVXuAB//8QAHBAAAQQDAQAAAAAAAAAAAAAAAwECBBMAEBEh/9oACAEBAAEFAp8qlRmsG1/hhLbGWvGN4m//xAAYEQACAwAAAAAAAAAAAAAAAAABAhEgMf/aAAgBAwEBPwEM05T/xAAWEQEBAQAAAAAAAAAAAAAAAAARICH/2gAIAQIBAT8BNWP/xAAiEAABAgMJAAAAAAAAAAAAAAACAAERMTITICEiQWFigZL/2gAIAQEABj8CEAqmhMJPxWMfKK0IIzRM5ZdtFU793P/EAB0QAAIDAAIDAAAAAAAAAAAAAAERACExEEFhcdH/2gAIAQEAAT8hYi9/Q+wh1U9mGxMvohHQ8y1Z4iN0sCrTWbLZ4Icf/9oADAMBAAIAAwAAABAoyDz/xAAXEQEAAwAAAAAAAAAAAAAAAAABESAh/9oACAEDAQE/EEwcU//EABYRAQEBAAAAAAAAAAAAAAAAAAEgkf/aAAgBAgEBPxAYsI//xAAeEAEAAgICAwEAAAAAAAAAAAABESEAMUFxEGGBkf/aAAgBAQABPxB0x1cU1D2roclBiAQ14p4aenGqJqx46Zy5RxJg6tdEYZrJZLQuwiIfmTpLgQ08F6xBbDPQfnj/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;01&quot;
        title=&quot;01&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/0f85be112184d6143d30b192d6933a59/e5a29/01.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/0f85be112184d6143d30b192d6933a59/d2f63/01.jpg 163w,
https://hfai-static.high-flyer.cn/static/0f85be112184d6143d30b192d6933a59/c989d/01.jpg 325w,
https://hfai-static.high-flyer.cn/static/0f85be112184d6143d30b192d6933a59/e5a29/01.jpg 352w&quot;
        sizes=&quot;(max-width: 352px) 100vw, 352px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;上图展示了 CPU 和 GPU 不同层级内存的吞吐量和容量。可以看到内存不是一个单一的部件，它在本质上是分层的，一般的规则是：内存越快，越昂贵，容量越小。&lt;/p&gt;
&lt;p&gt;以 A100 为例：A100 GPU 有 40~80GB 的高带宽内存（HBM），带宽为 1.5-2.0 TB/s，而每 108 个流处理器有 192KB 的 SRAM，带宽估计在 19TB/s 左右。可以看到虽然 SRAM 容量小了很多，但是速度却提升了10倍，所以如何高效的利用 SRAM 是提速注意力算法的关键。&lt;/p&gt;
&lt;h2 id=&quot;标准注意力算法&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A0%87%E5%87%86%E6%B3%A8%E6%84%8F%E5%8A%9B%E7%AE%97%E6%B3%95&quot; aria-label=&quot;标准注意力算法 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;标准注意力算法&lt;/h2&gt;
&lt;p&gt;我们首先看看标准注意力算法背后的计算逻辑：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/889f325ebe5fe450ddcf3c5aa642d1f8/5ebd7/02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 25.153374233128833%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAyklEQVQY0z2Pva6EIBSEff9Xs6ABDgIHFBMSo5HrAmIodBPJ3a+aaeano5TCyzRNxhhrrXOuCa21eQkhHMfx989Pd33fE0KEEACgtWaMcc4R0VqLiISQbdtyzqWU66WUEmO8rqvW2oUQjDGMMSklIgJAa0ZE772U0nvf+pdlQcR5nr33tdbnebqUEgBwzimlSilEFEJwzpVSLZExhoiMMWstAIzjuK6rc+6+727fdynlMAzOuTYpxphS+nw+Mcacc7MppZ9th8/z/AJt5gxmTZzz5gAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;02&quot;
        title=&quot;02&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/889f325ebe5fe450ddcf3c5aa642d1f8/a6d36/02.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/889f325ebe5fe450ddcf3c5aa642d1f8/222b7/02.png 163w,
https://hfai-static.high-flyer.cn/static/889f325ebe5fe450ddcf3c5aa642d1f8/ff46a/02.png 325w,
https://hfai-static.high-flyer.cn/static/889f325ebe5fe450ddcf3c5aa642d1f8/a6d36/02.png 650w,
https://hfai-static.high-flyer.cn/static/889f325ebe5fe450ddcf3c5aa642d1f8/5ebd7/02.png 704w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;可以看到标准注意力算法基本上将 HBM 加载/存储操作视为0成本（它并不能感知 IO）。&lt;/p&gt;
&lt;p&gt;下图展示了 GPT-2 模型中一个 Attention 算子的完整计算耗时统计：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/461d1f3fc17e9781510bca12cb498aac/1b42c/03.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 111.65644171779141%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAAWABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMFBgIE/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgAB/9oADAMBAAIQAxAAAAHXWuW1yPscCqScslFv/8QAHBAAAgIDAQEAAAAAAAAAAAAAAgMBBAUREgAU/9oACAEBAAEFAslaNT1wJT7Kxp4noQLob9P6HWFMlae1K//EABcRAAMBAAAAAAAAAAAAAAAAAAEQETH/2gAIAQMBAT8BGlRf/8QAFxEBAQEBAAAAAAAAAAAAAAAAARARIf/aAAgBAgEBPwFOE2f/xAAgEAEAAgEDBQEAAAAAAAAAAAABAAIRAyEyBBASQWGB/9oACAEBAAY/AtOpQR+swp+Xe3TDnON942b+VT5BJSzbjGhqO/uVpyx7Wf/EAB0QAQADAAMAAwAAAAAAAAAAAAEAESExQVFhcaH/2gAIAQEAAT8h9vwl38MvQ1tIYFFRRCA0vZSLgopA4kzBymB9ylzPak2OjFdc1/J//9oADAMBAAIAAwAAABDAx8D/xAAYEQEBAAMAAAAAAAAAAAAAAAABEBEhYf/aAAgBAwEBPxBKEw32f//EABoRAAICAwAAAAAAAAAAAAAAAAEQESFBYbH/2gAIAQIBAT8QEDDM9Uq0v//EAB0QAQEAAwEAAwEAAAAAAAAAAAERACExUUFhccH/2gAIAQEAAT8Q6LKUYkpLvjeYDUiBROUX7wiFgQrcnkqaDNB+T8w5hCCxYG1yvc6WfzKS+aet6bvJpGKsgdQfJjJRtM29c//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;03&quot;
        title=&quot;03&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/461d1f3fc17e9781510bca12cb498aac/6aca1/03.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/461d1f3fc17e9781510bca12cb498aac/d2f63/03.jpg 163w,
https://hfai-static.high-flyer.cn/static/461d1f3fc17e9781510bca12cb498aac/c989d/03.jpg 325w,
https://hfai-static.high-flyer.cn/static/461d1f3fc17e9781510bca12cb498aac/6aca1/03.jpg 650w,
https://hfai-static.high-flyer.cn/static/461d1f3fc17e9781510bca12cb498aac/7c09c/03.jpg 975w,
https://hfai-static.high-flyer.cn/static/461d1f3fc17e9781510bca12cb498aac/1b42c/03.jpg 1005w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;可以看到，masking，softmax 和 dropout 操作占用了大量时间，而主要利用 FLOPS 的矩阵乘法（Matmul）却只占用了一部分时间。因此，感知硬件 IO 进行优化的 FlashAttention 算法被提出，其可以大幅减少冗余的 HBM IO 并充分利用 SRAM 进行计算加速。&lt;/p&gt;
&lt;h2 id=&quot;flashattention&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#flashattention&quot; aria-label=&quot;flashattention permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;FlashAttention&lt;/h2&gt;
&lt;p&gt;FlashAttention 思路是：既然标准注意力算法要将 S 写回 HBM，而这个步骤只为了重新加载计算 Softmax，那么我们可以将其保存在 SRAM 中，等执行完所有中间步骤后，再将最终结果写回 HBM。如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/890f0cd9d1814a44043b20a1969b37a5/a8417/04.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 42.331288343558285%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsTAAALEwEAmpwYAAABtUlEQVQY0yWQy28ScRzE93/0ZDx5MjE1pjFpPHmyB20TD76NqSQUA82mNBiQFUFWbSCL2KfiA4qEhV1Y9r37e+5vv4Yyx5l8MpmRLvTBhdl3kDufWUIIfTY+H55Ng8liYSMUw6WSJBlNRnu1bLb4LFN8onber3zpnnz3+otr2nnDtWwAqJyUNvLrle5+5HqMMwAQQjDCMUGH9beapn7/9mU6/i1EyhmXClruefNx3/jJME0hxQz51EfYX5iGSFMAIJTKn2QviEIvEDGGmIogrNXz2mlL2lI213M3jwdtHGFMcJIkyzZO7bm5ggNEtgtbvU5z9OPYMQ3XtVngl8pPP6pF6WF1887e2lH/kGMWxRFjbAVb5lQsWXAi9KiwbfxqD3tHvj1Hoc0TULpqvSFLb1qvHlTu9yanJCYiTTHHIQsxCefGZAVjxjO1DGeMoMR3/Mv/QGl/+NxRpI3C7asvr7TOFBIhADg4kW/lbxx0dmPXS1IBAJTSkf5vOtPLrXe5anan9FrRqgjHMYokKggRhAtuWZbruINxf2gOIhYCQArL0ZxzgrAfeo2uut8sl75W/+h/V+l/x0WgfuR4qocAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;04&quot;
        title=&quot;04&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/890f0cd9d1814a44043b20a1969b37a5/a6d36/04.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/890f0cd9d1814a44043b20a1969b37a5/222b7/04.png 163w,
https://hfai-static.high-flyer.cn/static/890f0cd9d1814a44043b20a1969b37a5/ff46a/04.png 325w,
https://hfai-static.high-flyer.cn/static/890f0cd9d1814a44043b20a1969b37a5/a6d36/04.png 650w,
https://hfai-static.high-flyer.cn/static/890f0cd9d1814a44043b20a1969b37a5/a8417/04.png 941w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;可以看到 FlashAttention 将多个操作融合在一起，其只从 HBM 加载一次，执行融合的算子操作，然后将结果写回 HBM。融合操作主要采用了如下两种技术：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Tiling：矩阵分块计算，在不访问整个输入的情况下计算 Softmax 函数的缩减，在前向和后向传播时都使用；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Recomputation：时间换空间，不存储中间注意力矩阵而采用重计算的方式，仅在后向传播时使用。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;完整的伪代码如下：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/9a1a42bebd7f7c37e17c447c836d6588/7b1dc/05.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 58.89570552147239%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsTAAALEwEAmpwYAAABhElEQVQoz4XR226jMBAGYN7/5SJFCoeAY2OMgQF8NjEgSFVot9F2pf2uRvLYmn8c3W43jHFVVYQQSikAaK2VUkKI4ZuUUikl3wghQgjR5XJJ0zTLsjiOsyyjlBZFkSRJ0zRd1wFA3/da633fX79EhBCMMee867qiKNq25Zwzxvq+H8dRSjmOI2NsGIbnYZ5n55z3fl3XqD1UVQUAzaGuawBgjCmljDFKKWvt+ZBzzlo7DMM4jtM0Rff7HWOMEKIHpVRVVWVZYozbtj3ze++11saYZVm899ZaY8xnZkLI2XrOdvadxet/IiHE4/FI0xQhBACUUs5527YAIKX8555+LocQKKWEEIRQecjzHGMsDt5755wx5vl8/qmllF8LW9e1aRrGGOdcCLGuawhhmiZzsNaea7PWnrG11vNh27Zonmd8yPO8LMu6ruM4Rgg1TdP3vZTy/GrGmLU2hLAsy8/YAJAkiXtjjBFC7IfX67V9+50/ul6veZ5v2/bXwdm97/t78W7f9w93L6IpCqq73wAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;05&quot;
        title=&quot;05&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/9a1a42bebd7f7c37e17c447c836d6588/a6d36/05.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/9a1a42bebd7f7c37e17c447c836d6588/222b7/05.png 163w,
https://hfai-static.high-flyer.cn/static/9a1a42bebd7f7c37e17c447c836d6588/ff46a/05.png 325w,
https://hfai-static.high-flyer.cn/static/9a1a42bebd7f7c37e17c447c836d6588/a6d36/05.png 650w,
https://hfai-static.high-flyer.cn/static/9a1a42bebd7f7c37e17c447c836d6588/7b1dc/05.png 956w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;1-tiling-分块计算&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-tiling-%E5%88%86%E5%9D%97%E8%AE%A1%E7%AE%97&quot; aria-label=&quot;1 tiling 分块计算 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Tiling 分块计算&lt;/h3&gt;
&lt;p&gt;对于有限的 SRAM 容量，&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;N^2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8141em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10903em;&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8141em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的存储用量使得序列长度（N）限定在了一定范围，因此我们要进行矩阵分块计算。对于矩阵乘法与逐点操作（scale，masking，dropout）的分块计算是比较容易实现的，主要障碍是 Softmax 函数，因为其需要将所有的分数列耦合在一起。为此研究者使用了一个技巧：既然 Softmax 与注意力 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant=&quot;bold&quot;&gt;K&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\mathbf{K}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.6861em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathbf&quot;&gt;K&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的列是耦合的，通过引入了两个额外的统计量 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;m(x),l(x)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.01968em;&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 来进行解耦，实现了分块计算。具体如下：&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;:&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mrow&gt;&lt;mi&gt;max&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;/mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mtext&gt;  &lt;/mtext&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;:&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;.&lt;/mi&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;.&lt;/mi&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;.&lt;/mi&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mtext&gt;   &lt;/mtext&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;:&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mtext&gt;   &lt;/mtext&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;:&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;m(x):=\max_i x_i, ~~f(x):=[e^{x_i-m(x)}...e^{x_B-m(x)}], ~~l(x):=\sum_i f(x)_i, ~~softmax(x):=\frac{f(x)}{l(x)}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;:=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop&quot;&gt;&lt;span class=&quot;mop&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3117em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3117em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace nobreak&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mspace nobreak&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10764em;&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;:=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.138em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.888em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3281em;&quot;&gt;&lt;span style=&quot;top:-2.357em;margin-left:0em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.143em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.888em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3448em;&quot;&gt;&lt;span style=&quot;top:-2.3567em;margin-left:0em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.05017em;&quot;&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1433em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mspace nobreak&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mspace nobreak&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.01968em;&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;:=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.0497em;vertical-align:-0.2997em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop&quot;&gt;&lt;span class=&quot;mop op-symbol small-op&quot; style=&quot;position:relative;top:0em;&quot;&gt;∑&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.162em;&quot;&gt;&lt;span style=&quot;top:-2.4003em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2997em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10764em;&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3117em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mspace nobreak&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mspace nobreak&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;so&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10764em;&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;ma&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;:=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.53em;vertical-align:-0.52em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.01em;&quot;&gt;&lt;span style=&quot;top:-2.655em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.01968em;&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.485em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.10764em;&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.52em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;对于两个向量 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo&gt;∈&lt;/mo&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;msup&gt;&lt;mi&gt;R&lt;/mi&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;x^{(1)},x^{(2)}\in R^B&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.0824em;vertical-align:-0.1944em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.888em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.888em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;∈&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8413em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.00773em;&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8413em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.05017em;&quot;&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，解耦拼接向量 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo&gt;∈&lt;/mo&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;msup&gt;&lt;mi&gt;R&lt;/mi&gt;&lt;mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;x=[x^{(1)},x^{(2)}]\in R^{2B}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.4306em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.138em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.888em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.888em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;∈&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8413em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.00773em;&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8413em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.05017em;&quot;&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的 Softmax 计算：&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;max&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mtext&gt;   &lt;/mtext&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;m(x)=m([x^{(1)},x^{(2)}])=\max(x^{(1)},x^{(2)}), f(x)=[e^{m(x^{(1)})-m(x)}f(x^{(1)}) ~~ e^{m(x^{(2)})-m(x)}f(x^{(2)})]&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.138em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.888em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.888em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;])&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.138em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.888em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.888em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10764em;&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.2897em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.0397em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.9667em;&quot;&gt;&lt;span style=&quot;top:-2.9667em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5357em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10764em;&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.888em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mspace nobreak&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mspace nobreak&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.0397em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.9667em;&quot;&gt;&lt;span style=&quot;top:-2.9667em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5357em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10764em;&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.888em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mtext&gt;    &lt;/mtext&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;l(x)=l([x^{(1)},x^{(2)}])=e^{m(x^{(1)})-m(x)}l(x^{(1)}) + e^{m(x^{(2)})-m(x)}l(x^{(2)}), ~~ softmax(x)=\frac{f(x)}{l(x)}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.01968em;&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.138em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.01968em;&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.888em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.888em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;])&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.2897em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.0397em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.9667em;&quot;&gt;&lt;span style=&quot;top:-2.9667em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5357em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.01968em;&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.888em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.2897em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.0397em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.9667em;&quot;&gt;&lt;span style=&quot;top:-2.9667em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5357em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.01968em;&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.888em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mspace nobreak&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mspace nobreak&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mord&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;so&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10764em;&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;ma&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.53em;vertical-align:-0.52em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.01em;&quot;&gt;&lt;span style=&quot;top:-2.655em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.01968em;&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.485em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.10764em;&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.52em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;需要注意的是，可以利用 GPU 多线程同时并行计算多个块的 Softmax。为了充分利用硬件性能，多个块的计算不是串行的，而是并行。&lt;/p&gt;
&lt;h3 id=&quot;2-重计算&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%E9%87%8D%E8%AE%A1%E7%AE%97&quot; aria-label=&quot;2 重计算 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. 重计算&lt;/h3&gt;
&lt;p&gt;为了避免产生冗余的 HBM 读写次数，FlashAttention 没有为后向传递保存很大的中间结果矩阵。&lt;/p&gt;
&lt;p&gt;在标准注意力实现中，后向传递计算 Q,K,V 的梯度时，需要用到 NxN 的中间矩阵 S,P ，但这两个矩阵并没有保存下来。研究用的技巧是重计算，保存了两个统计量 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;m(x),l(x)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.01968em;&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，后向传递时在高速的 SRAM 上快速地重新计算，通过分块的方式重新计算出注意力矩阵 S,P 。这种方式比标准方法要快很多。&lt;/p&gt;
&lt;h2 id=&quot;实验&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%AE%9E%E9%AA%8C&quot; aria-label=&quot;实验 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;实验&lt;/h2&gt;
&lt;p&gt;相比于标准的注意力算法，FlashAttention 虽然由于反向传播需要重新计算导致 GFLOPs 增加，但是 FlashAttention 有效减少了 HBM 的 I/O ，运行时间显著减少，如下图左所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/73af47bd77921a706841144dfefa1106/5819f/06.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 20.245398773006134%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAtUlEQVQI11WPy27DIBAA/f+fl1MttSbBJngbWLy8gnlWUZRD5zBznmmM0Xt/u7VWa22vtNwyErJluTLG2OKcz6XlnOW6fl8uP/MXSDkh4jzPRLRtm5SSiPjKtdbh9JsSZ8l9jJTLYb2hwPktGpMBjPEKaeKcM8YAABFDCGMMa21v/ayJ77dFLodz+0OB0tanxy/gQcrG610dRFP/MP5TWwkxaK2FECk9Y4y5vI6MMQC7vAvv3B9sHeIAl50vAgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;图片&quot;
        title=&quot;图片&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/73af47bd77921a706841144dfefa1106/a6d36/06.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/73af47bd77921a706841144dfefa1106/222b7/06.png 163w,
https://hfai-static.high-flyer.cn/static/73af47bd77921a706841144dfefa1106/ff46a/06.png 325w,
https://hfai-static.high-flyer.cn/static/73af47bd77921a706841144dfefa1106/a6d36/06.png 650w,
https://hfai-static.high-flyer.cn/static/73af47bd77921a706841144dfefa1106/e548f/06.png 975w,
https://hfai-static.high-flyer.cn/static/73af47bd77921a706841144dfefa1106/5819f/06.png 1042w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;同时从上图右也可以看到，随着 Block Size 增大，HBM 的访问次数减少，运行时间也随之减少。当  Block Size 超过256 时，尽管 HBM 访问次数在减少，但运行时间并没有减少。这时性能受到了其他因素的限制，例如，计算受限。另外需要注意的是，更大的 Block Size 可能会导致执行一次融合算子操作需要的显存超出 SRAM 的大小。&lt;/p&gt;
&lt;p&gt;在 A100 显卡上进行实验，FlashAttention 的加速效果如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/c1ef78d565bc4914b3f18e0e90aaf3a5/302a4/07.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 69.93865030674846%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAACz0lEQVQozyXR22/cVBAH4P1781CkUnoBKmgJTVsRCVEUCfKCRAWV6IqKNhXR0hCtWqVxs9mL9+Z6s/d4bZ8559g+t7WPvQc5zMO8zPw00nwVY0yA8HgyBQBCSNkxRgghQGmaGmOWnj+bzUhZGDAiBIdhABi01hWl1gu3O+y2Lz1PZ1mRFzrTuc4lXyupOOfTQXPQtxEgJdYxFiySFHGKOItFBQBhHIUo9j0KgYAVD5YJRXzSRxFlAIgz5c2Jv4wZVctRFKG1v0jQpYipqAAmIgrnJ9a4/m748pVzfOxUn43rx+fPqtgDEkUqgbbVtN68b7yt1/86rL06aNVqZ//UWJJW8sKMnbNf7mw93/38ty+v73/3RfX21h8/fPXn9mcw9YwxJwe/P769tXfjk/1vPv3xxrUHt67VHl1//WSbsaJijMEE2WcfLgZ2+/S0Yb0ffLAunO6020qFMsZ4i2mv1XA77W7Dsq3TbvPcG9oLp691UdlsNkJIJgSXMghRGKIQMI1iLstknus4YUJKxoUfhH6IEGASM6HWxpjysu+vPjqO53kYABDCACUGoHRdbszmU9f9GAYBviIEXE7J/1RSqak76Nvt1WqV59qYTZHnuS4kX0upGOfjoT3o9zDBRZHrTK9VJhIVE8GZrABATOI0TRmXXGQUJPg8AjFzSEQ5YCSZVFJhxGIi/FlCAlVSeTImpTMIwRlOvMHo4qTpnp67R0fTxln75SEJKWDItA4uYdQZjfp2u37Std6139Qax/9eUW2MN+sdfL99+NNObffr6s87Rw9vvd7fefHgDln4xhjXqj198m318b0Xe/efP7r76+7do92bf+895OKKKkmiidNfzSeO3bE7zXGvu1pOvbGbXr0U+ZdjdzgfjfqdVq/ZcgYDWEz82STPN2VYKcVFiUFoRGmEKU0YyzJtyu8VjHMhZcI5JpTSKI7jhHOty+l/PrHeiOqbNWgAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;图片&quot;
        title=&quot;图片&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/c1ef78d565bc4914b3f18e0e90aaf3a5/a6d36/07.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/c1ef78d565bc4914b3f18e0e90aaf3a5/222b7/07.png 163w,
https://hfai-static.high-flyer.cn/static/c1ef78d565bc4914b3f18e0e90aaf3a5/ff46a/07.png 325w,
https://hfai-static.high-flyer.cn/static/c1ef78d565bc4914b3f18e0e90aaf3a5/a6d36/07.png 650w,
https://hfai-static.high-flyer.cn/static/c1ef78d565bc4914b3f18e0e90aaf3a5/e548f/07.png 975w,
https://hfai-static.high-flyer.cn/static/c1ef78d565bc4914b3f18e0e90aaf3a5/302a4/07.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;内存的变化为：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/ba76f74a993e63da6afbe5838b062cbb/302a4/08.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 47.852760736196316%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsTAAALEwEAmpwYAAABUElEQVQoz32Ry07CQBSG+6om7gwXjYo+gdGFETBY45q4s4mBFgiQUIxoBLkl1QUVBSy1Tm2raae3mTE0uECqX85iFuc7c/IfyvM8hJCqqoOA0Wj0EiBJkiiKz8OhrqmEYIQQWYKSZdl1Xdu2TdO0loCWRTONbLE1kd/FVzCdSgAARVHG47FpmpRhGBhj8jerB5fraQ5CCzoehNAJgBD6vk8BAP6XI8n87mnJcx1CyK++cBnhGX1R7oly5CifoItzebGR0jQNIYTwLBJ/MZV4uhBNcrEUm6BL4bKu68tJMrxwXu5tn5Q2M8VYit2h/1j769MYTEB3MK21hwwvnOVa+9l6NMmu7DEbx4V4mls7zG1lCq5jh/wMoXUvPHH1Dt98vCjf1ZoPLN++agqVRrd606/e9iuNbuW6g3HYnX8e85naBzA01dBU5U0KBBwUCj3ENwhUIz0cJInFAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;图片&quot;
        title=&quot;图片&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/ba76f74a993e63da6afbe5838b062cbb/a6d36/08.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/ba76f74a993e63da6afbe5838b062cbb/222b7/08.png 163w,
https://hfai-static.high-flyer.cn/static/ba76f74a993e63da6afbe5838b062cbb/ff46a/08.png 325w,
https://hfai-static.high-flyer.cn/static/ba76f74a993e63da6afbe5838b062cbb/a6d36/08.png 650w,
https://hfai-static.high-flyer.cn/static/ba76f74a993e63da6afbe5838b062cbb/e548f/08.png 975w,
https://hfai-static.high-flyer.cn/static/ba76f74a993e63da6afbe5838b062cbb/302a4/08.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;可以看到，在不同的序列长度下组合 dropout 和 masking，都有不同程度的加速效果；随着序列长度的增加，FlashAttention 对于内存消耗有着不断优化的效果。&lt;/p&gt;
&lt;h2 id=&quot;总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%80%BB%E7%BB%93&quot; aria-label=&quot;总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;总结&lt;/h2&gt;
&lt;p&gt;多数大语言模型输入输出的最大序列长度只有 2K 或 4K，本质原因是 transformer 的核心组件 self-attention 块的计算复杂度和空间复杂度是 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;O(N^2)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.0641em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.02778em;&quot;&gt;O&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10903em;&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8141em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的。FlashAttention 的成功启发我们，可以通过分块计算、算子融合和重计算技术，实现深度学习模型的优化与加速，这对于AI工业实践走向深水区有很大的借鉴意义。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[StreamingLLM：一种能够接受近乎无限长度文本的大模型框架]]></title><description><![CDATA[使 LLM 模型可以处理无限长文本是一项重要挑战，因为存储之前所有的 KV 会受限于内存，模型很难生成超过其训练序列长度的文本。 最近来自 MIT 高性能 AI 计算的研究者们发布了一个能够接受400万 token 的大模型结构，名叫 StreamingLLM…]]></description><link>https://www.high-flyer.cn/blog/streamingllm/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/streamingllm/</guid><dc:creator><![CDATA[Vachel]]></dc:creator><pubDate>Thu, 12 Oct 2023 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;使 LLM 模型可以处理无限长文本是一项重要挑战，因为存储之前所有的 KV 会受限于内存，模型很难生成超过其训练序列长度的文本。&lt;/p&gt;
&lt;p&gt;最近来自 MIT 高性能 AI 计算的研究者们发布了一个能够接受400万 token 的大模型结构，名叫 StreamingLLM，它只保留最新的 token 和 attention sinks，而丢弃中间的 token。这样，模型无需刷新缓存就能从最近的标记生成流畅的文本。这种方式不仅不会降低多少推理速度，而且理论上能够处理无限长度的输入。&lt;/p&gt;
&lt;p&gt;StreamingLLM 非常适合用在模型需要持续运行而不需要大量内存或依赖过去数据的场景，例如基于 LLM 的日常助手。截止该稿撰写时，此项目已获得4.6k的 Github Star。本文将和大家一起深入了解这项工作的细节。&lt;/p&gt;
&lt;p&gt;论文地址：&lt;a href=&quot;https://arxiv.org/abs/2309.17453&quot;&gt;https://arxiv.org/abs/2309.17453&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;源码地址：&lt;a href=&quot;https://github.com/mit-han-lab/streaming-llm&quot;&gt;https://github.com/mit-han-lab/streaming-llm&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;概述&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A6%82%E8%BF%B0&quot; aria-label=&quot;概述 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;概述&lt;/h2&gt;
&lt;p&gt;将 LLM 应用于无限输入流时，会遇到两个主要挑战：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;缓存冗余&lt;/strong&gt;：在解码阶段，基于 Transformer 的 LLM 会缓存之前所有 token 的 KV，这会导致内存使用过多，增加解码延迟；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外推困境&lt;/strong&gt;：现有模型的长度外推能力有限，即当序列长度超过预训练时设定的注意窗口大小时，其性能就会下降。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一种直观的方法被称为 Window Attention，其仅在最近 token 的 KV 状态上维护一个固定大小的滑动窗口。虽然这种方法能保持稳定的内存使用率和解码速度，但一旦序列长度超过缓存大小，开始对 token 的 KV 进行删除，模型的性能就会急剧下降。如下图 b 所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/6bdd4281c63b57a6e6f7480ca9edeb1d/302a4/01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 33.74233128834356%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsTAAALEwEAmpwYAAABfklEQVQY0x2QzXKUQBgAeTkfwhfIC1hlmXMu3jzqxaMHT1ap5Vb8ycHaZEnYjXE3LAvDDAwwBIa/bDYDQxjms7CvXX1poy54WZZVVQFA23U1z5q6yjnveymE8DzX2e1czxuGQXYdSzPG0oRNCCGMt3P092pBaQgA/aDeWcnctND2dlCjUmq9Xq/Mc8/ZagAYdVYXH+bmtbmgQQAAxrNZ8erLTUQpTIyvzfT5J+fyZgMASo1/Vsv33y8t2/tvQXfJ8c+zl1+dNImm+PgiO/rmr5a27FopJaPkZME+/nagb3s14p395iKYmS6onlf3deZb9vmL09DeoCluDo/t8PT5l8URafb7IudBUf9YeeTalkMf3eW43J+a22zjPimZR+ssK+y4mJ0tW3ZnHLK8IqSJEnhsy0OzDXec0thxZVUPD/s+5xGjm9BrHqajrIxQTG4j5Mak64QRID/0EWcMxlGBTvOUYlykDEBLIWJMsI9oTJVWWusgoggjHGASYNG1/wAz/nM1rUrFjQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;01&quot;
        title=&quot;01&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/6bdd4281c63b57a6e6f7480ca9edeb1d/a6d36/01.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/6bdd4281c63b57a6e6f7480ca9edeb1d/222b7/01.png 163w,
https://hfai-static.high-flyer.cn/static/6bdd4281c63b57a6e6f7480ca9edeb1d/ff46a/01.png 325w,
https://hfai-static.high-flyer.cn/static/6bdd4281c63b57a6e6f7480ca9edeb1d/a6d36/01.png 650w,
https://hfai-static.high-flyer.cn/static/6bdd4281c63b57a6e6f7480ca9edeb1d/e548f/01.png 975w,
https://hfai-static.high-flyer.cn/static/6bdd4281c63b57a6e6f7480ca9edeb1d/302a4/01.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;center style=&quot;font-size:12px;color:#C0C0C0&quot;&gt;图1  StreamingLLM 与现有方法的对比&lt;/center&gt;&lt;br/&gt;
&lt;p&gt;另一种策略是带重计算的滑动窗口（如上图 c 所示），这种方法会从最近的 token 中重建 KV 状态，虽然它在长文本中表现良好，但其速度明显较慢，在现实应用中并不实用。&lt;/p&gt;
&lt;p&gt;研究者探寻 Window Attention 失效的原因，发现了自回归 LLMs 的一个有趣现象：大模型的 Attention 计算中，大量 Attention 权重被分配给某些初始 token，无论这些 token 与语言建模任务是否相关。如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/c6cc25fcc565502e53e282c3803b3950/302a4/02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 23.926380368098158%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAAsTAAALEwEAmpwYAAABPElEQVQY0wExAc7+AMDCw7u7u8HCwt7V1fTh4czMzcHCwcLDw9jT0/jm5dTLyry/wLq6usfFxe7e4MzL0MvJwurg5r++vdzU0AChfHN0eHpxc3OqnJn1x720nZV3e351dneVjonuw8PDn5+FhYF0dXd5dnTYtbVpdsp8hpi6rtFWaLCjo6gA5biwqG1mcnl7s7Gv8u3r7NjPxq6gd3d4nKCe683St7Hezs3Qj4eBfH+A4NXTnaLYoa/X0MndjJnTv8XeALTL9Om6saV9caWqr8fY/Iqs9dzO176mmY6aouPJ1nd4zpK4/8/ExIqGgsnI25+iwpeXkNXG2JSXobatpAB3k+nI4Pzav73KtLaxwPFZctmSsPbi2tvEv8PYw9Z2cMJYeeKrwvrMwsHHvdF4huGMpNS0rNWIneS7w9DlatKp25BkmgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;02&quot;
        title=&quot;02&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/c6cc25fcc565502e53e282c3803b3950/a6d36/02.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/c6cc25fcc565502e53e282c3803b3950/222b7/02.png 163w,
https://hfai-static.high-flyer.cn/static/c6cc25fcc565502e53e282c3803b3950/ff46a/02.png 325w,
https://hfai-static.high-flyer.cn/static/c6cc25fcc565502e53e282c3803b3950/a6d36/02.png 650w,
https://hfai-static.high-flyer.cn/static/c6cc25fcc565502e53e282c3803b3950/e548f/02.png 975w,
https://hfai-static.high-flyer.cn/static/c6cc25fcc565502e53e282c3803b3950/302a4/02.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;center style=&quot;font-size:12px;color:#C0C0C0&quot;&gt;图2  LLama2 7B 模型的注意力分数的可视化&lt;/center&gt;&lt;br/&gt;
&lt;p&gt;研究者们将这些 token 命名为 “attention sinks”。尽管这些初始 token 缺乏语义，但它们收集了显著的注意力分数。研究者将这个现象归因于计算中的 Softmax 操作，它要求注意力分数总和为 1 。因此当前 query 对许多先前 token 没有很强匹配的时候，仍需要在某个与语义不太相关的地方，分配这些不需要的注意力值，来使得最终分数总和为 1。初始 token 作为 sink token 的原因很直观：由于自回归语言建模的特性，初始 token 对几乎所有后续标记都是可见的，这使得它们更容易被训练成 attention sinks。&lt;/p&gt;
&lt;h2 id=&quot;方法&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%96%B9%E6%B3%95&quot; aria-label=&quot;方法 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;方法&lt;/h2&gt;
&lt;p&gt;借助上面的观察，研究者们提出了 StreamingLLM，一种简单而高效的框架。如图1 d 所示，该模型就是把初始 token 的 KV 保留下来，然后再拼上滑动窗口的 KV，就可以保持稳定的模型性能，因为保留 attention sinks 可以让窗口内的注意力分数分布接近正常。&lt;/p&gt;
&lt;h3 id=&quot;1-window-attention-失效的原因&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-window-attention-%E5%A4%B1%E6%95%88%E7%9A%84%E5%8E%9F%E5%9B%A0&quot; aria-label=&quot;1 window attention 失效的原因 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Window Attention 失效的原因&lt;/h3&gt;
&lt;p&gt;在本节中，我们将使用 attention sinks 的概念来解释 Window Attention 失败的原因，并以此详细阐述 StreamingLLM 的灵感来源。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/e1c82b004408fc37805801d9444806b0/302a4/03.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 19.631901840490798%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAuUlEQVQI1x3HWU7FMAwAwN7/ek+IRQhRBGkTx4mdxW3dLAjmb5Y5Zx8j1TOE6BFn08q47RbRa9dtN0+Px+e69ktzJAcgImOM+W8hD5v5iQH1FIoRkS1VLjLmlCqI5LjsgaXNlEu0JhNKpnGWcZ+L/VpLSqO1dutuzPb63Bg6uZvBO2veXm6GztAzIsD28c7uW2m/E4ymizBH5yLAJbWWcuTMwROCHn+9aknBU/DXIYdIpoBgEayUrKq/1fziEuvX+WsAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;03&quot;
        title=&quot;03&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/e1c82b004408fc37805801d9444806b0/a6d36/03.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/e1c82b004408fc37805801d9444806b0/222b7/03.png 163w,
https://hfai-static.high-flyer.cn/static/e1c82b004408fc37805801d9444806b0/ff46a/03.png 325w,
https://hfai-static.high-flyer.cn/static/e1c82b004408fc37805801d9444806b0/a6d36/03.png 650w,
https://hfai-static.high-flyer.cn/static/e1c82b004408fc37805801d9444806b0/e548f/03.png 975w,
https://hfai-static.high-flyer.cn/static/e1c82b004408fc37805801d9444806b0/302a4/03.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;center style=&quot;font-size:12px;color:#C0C0C0&quot;&gt;图3  2万 token 下不同 LLM 的语言建模困惑&lt;/center&gt;&lt;br/&gt;
&lt;p&gt;上图很明显可以得到，当文本长度超过缓存大小时，由于排除了初始标记，困惑度会激增。这表明，无论初始词块与被预测词块的距离如何，初始词块对于保持 LLM 的稳定性都至关重要。&lt;/p&gt;
&lt;p&gt;图2 展示了 llama2 7b 模型的所有层和 head 的注意力图。可以发现，除了最下面两层之外，模型在所有层和 head 都始终专注于初始 token。这意味着：在注意力计算中，去掉这些初始 token 的 KV 将去掉 SoftMax 函数（公式 1）中分母的很大一部分。这种改变会导致注意力分数的分布发生显著变化，从而偏离正常推理设置中的预期。&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;M&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/msup&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/msup&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msubsup&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/msubsup&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;≫&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/msub&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;∈&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;.&lt;/mi&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;.&lt;/mi&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;.&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;SoftMax(x)_i = \frac{e^{x_i}}{e^{x_i}+\sum_{j=2}^{N}e^{x_i}}, x_1 \gg x_j, j \in 2,...,N&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.05764em;&quot;&gt;S&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10764em;&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10903em;&quot;&gt;tM&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3117em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.6629em;vertical-align:-0.7519em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.911em;&quot;&gt;&lt;span style=&quot;top:-2.5703em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.6401em;&quot;&gt;&lt;span style=&quot;top:-2.8326em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3448em;&quot;&gt;&lt;span style=&quot;top:-2.3448em;margin-left:0em;margin-right:0.1em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.6595em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3147em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mop mtight&quot;&gt;&lt;span class=&quot;mop op-symbol small-op mtight&quot; style=&quot;position:relative;top:0em;&quot;&gt;∑&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8852em;&quot;&gt;&lt;span style=&quot;top:-2.1786em;margin-left:0em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.05724em;&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;mrel mtight&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-2.8971em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.10903em;&quot;&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.4603em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace mtight&quot; style=&quot;margin-right:0.1952em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.6401em;&quot;&gt;&lt;span style=&quot;top:-2.8326em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3448em;&quot;&gt;&lt;span style=&quot;top:-2.3448em;margin-left:0em;margin-right:0.1em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.6595em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3147em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.394em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.7385em;&quot;&gt;&lt;span style=&quot;top:-2.931em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3448em;&quot;&gt;&lt;span style=&quot;top:-2.3448em;margin-left:0em;margin-right:0.1em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.6595em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3147em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.7519em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;≫&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.9456em;vertical-align:-0.2861em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3117em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.05724em;&quot;&gt;j&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2861em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.05724em;&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;∈&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8778em;vertical-align:-0.1944em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10903em;&quot;&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;那么初始 token 为什么会如此重要，该论文的研究者给出了如下两种可能：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;初始 token 的语义至关重要；&lt;/li&gt;
&lt;li&gt;或者模型学习偏重于初始 token 的绝对位置&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;研究者用“\n”替代前四个标记符，发现模型仍然会非常重视初始换行符。这表明，初始token的绝对位置比其语义价值更加重要。&lt;/p&gt;
&lt;h3 id=&quot;2-具有-attention-sinks-的滑动-kv-缓存&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%E5%85%B7%E6%9C%89-attention-sinks-%E7%9A%84%E6%BB%91%E5%8A%A8-kv-%E7%BC%93%E5%AD%98&quot; aria-label=&quot;2 具有 attention sinks 的滑动 kv 缓存 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. 具有 attention sinks 的滑动 KV 缓存&lt;/h3&gt;
&lt;p&gt;研究者提出的 StreamingLLM 是一种直接的方法，其可以在不进行任何模型微调的情况下恢复窗口注意的困惑度。除了当前的滑动窗口 token 之外，研究者还在注意力计算中重新引入了几个初始 token 的 KV。如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 556px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/eb65b558b3134f7c9bf312b28676b76c/96638/banner.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 41.104294478527606%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAB8ElEQVQY003Py2/SAACAcf4WL4wMTt40LjEaTYyejAfPHkxmvBgNis74iInxwZTFJ9tgsAEuc7AhUCjjkdIxYFspg0JaFsAAXVtcS2kpILSKJ7/77/CpRFFsNhskSTFUpYKaSqmXWPJ5JjyTAg2Q755xPTDjgh7aggZXfO4biJtNxyVMVhR5NFIURSVJ0v7eLk7UyFoq79NVtjQkrM151YegpvBDfd0ZOWWtXrSgU3bixjs/e2GSBjyyoiij4RgPBgNBELpSv8028F1jLvEiG38CA4boxl1gddqx5vy4FtJbAw9swUeL3lmLJ+paZRKRviSNcafTSSa3ERSrEhDq1ZbBiSNYl/dNViI6DNDlYcdKgjjrqFyyFy8vF8+Ff9tu3q5eOyPy/BgPh8NOh+/1Bm22mdt+ldl6lg4/jm7qwe93vI5bm+4Vhyfw2ul/ugzcX/Tql4Jz780bn7+Ud+DuL0bFcRyyv1fAiFoZIkBtA9KwGR0RnPgZVRf9J2IhaywGwxFg2l2cWiKurB+ddtWvWpDs+ZP0gkklyzJN0xzHCzxVzS8Udoyl9Nts4g2Wmj3MfkIROHeAIQjizuAfQHQews3xgj2UPrB+5QroGCv/RbXEOsmTtEC1xF5/RFEM/S+BZ9sM2apXuyzDHzOsKP59/gOuWmr0aBXiMgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;banner&quot;
        title=&quot;banner&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/eb65b558b3134f7c9bf312b28676b76c/96638/banner.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/eb65b558b3134f7c9bf312b28676b76c/222b7/banner.png 163w,
https://hfai-static.high-flyer.cn/static/eb65b558b3134f7c9bf312b28676b76c/ff46a/banner.png 325w,
https://hfai-static.high-flyer.cn/static/eb65b558b3134f7c9bf312b28676b76c/96638/banner.png 556w&quot;
        sizes=&quot;(max-width: 556px) 100vw, 556px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;center style=&quot;font-size:12px;color:#C0C0C0&quot;&gt;图4  StreamingLLM 的 KV 缓存结构&lt;/center&gt;&lt;br/&gt;
&lt;p&gt;StreamingLLM 中的 KV 缓存在概念上可以分为两部分：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;attention sinks（四个initial tokens）稳定注意力计算；&lt;/li&gt;
&lt;li&gt;滑动 KV 缓存保留了最新的标记，这对于语言建模至关重要。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在确定相对距离并将位置信息添加到 token 时，StreamingLLM 专注于缓存中的位置，而不是原始文本中的位置。这种区别对于 StreamingLLM 的性能至关重要。例如，如果当前缓存的 token 为 [0, 1, 2, 3, 6, 7, 8]，那么在解码第 9 个令牌的过程中，分配的位置为 [0, 1, 2, 3, 4, 5, 6, 7]，而不是原始文本中的位置 [0, 1, 2, 3, 6, 7, 8, 9]。&lt;/p&gt;
&lt;h3 id=&quot;3-带有-attention-sinks-的预训练-llms&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-%E5%B8%A6%E6%9C%89-attention-sinks-%E7%9A%84%E9%A2%84%E8%AE%AD%E7%BB%83-llms&quot; aria-label=&quot;3 带有 attention sinks 的预训练 llms permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. 带有 attention sinks 的预训练 LLMs&lt;/h3&gt;
&lt;p&gt;如1小节所述，模型过度关注多个初始 token 的一个重要原因是缺乏一个指定的 sink token 来卸载过多的注意力分数。因此，模型会无意中将全局可见的标记（主要是初始 token）指定为 attention sinks。一种可能的补救办法是有意识地加入一个可训练的全局 attention sinks 标记，称为 “Sink Token”，作为不必要注意力分数的存放处。另外，也可以用类似于 SoftMax-off-by-One 的变体来取代传统的 SoftMax 函数：&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;S&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;M&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/msup&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msubsup&gt;&lt;mo&gt;∑&lt;/mo&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;/msubsup&gt;&lt;msup&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;SoftMax_1(x)_i=\frac{e^{x_i}}{1+\sum_{j=1}^{N}e^{x_i}}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.05764em;&quot;&gt;S&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10764em;&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10903em;&quot;&gt;tM&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3117em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.6629em;vertical-align:-0.7519em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.911em;&quot;&gt;&lt;span style=&quot;top:-2.5703em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mop mtight&quot;&gt;&lt;span class=&quot;mop op-symbol small-op mtight&quot; style=&quot;position:relative;top:0em;&quot;&gt;∑&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8852em;&quot;&gt;&lt;span style=&quot;top:-2.1786em;margin-left:0em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.05724em;&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;mrel mtight&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-2.8971em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.10903em;&quot;&gt;N&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.4603em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace mtight&quot; style=&quot;margin-right:0.1952em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.6401em;&quot;&gt;&lt;span style=&quot;top:-2.8326em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3448em;&quot;&gt;&lt;span style=&quot;top:-2.3448em;margin-left:0em;margin-right:0.1em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.6595em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3147em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.394em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.7385em;&quot;&gt;&lt;span style=&quot;top:-2.931em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3448em;&quot;&gt;&lt;span style=&quot;top:-2.3448em;margin-left:0em;margin-right:0.1em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.6595em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3147em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.7519em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;这种 Softmax 方法不要求所有上下文 token 的注意力分数总和为 1。但要注意的是，这种替代方法等同于在注意力计算中使用 KV 特征全为零的 token 。作者将这种方法命名为 “Zero Sink”，以便与其提出的框架保持一致。&lt;/p&gt;
&lt;h2 id=&quot;实验&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%AE%9E%E9%AA%8C&quot; aria-label=&quot;实验 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;实验&lt;/h2&gt;
&lt;p&gt;研究者使用四个著名的最新模型对 StreamingLLM 进行了评估：Llama-2、MPT、PyThia 和 Falcon。研究者将 StreamingLLM 与密集注意力、窗口注意力和带重计算的滑动窗口方法等既定基准进行比较。&lt;/p&gt;
&lt;h3 id=&quot;1-长文本语言建模测试&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-%E9%95%BF%E6%96%87%E6%9C%AC%E8%AF%AD%E8%A8%80%E5%BB%BA%E6%A8%A1%E6%B5%8B%E8%AF%95&quot; aria-label=&quot;1 长文本语言建模测试 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. 长文本语言建模测试&lt;/h3&gt;
&lt;p&gt;研究者首先使用 PG19 测试集评估 StreamingLLM 的语言建模复杂度。如之前图3所示，在跨度为 20K token 的文本上，StreamingLLM 的困惑度可以与 Oracle 基准（滑动窗口与重新计算）相媲美。同时，当输入长度超过预训练窗口时，密集注意力技术就会失效，而当输入长度超过缓存大小时，窗口注意力技术就会陷入困境，导致初始标记被剔除。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/134a6c6c49b7ff72b13902fe6dcd7cdc/302a4/05.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 15.337423312883436%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAIAAAAcOLh5AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAs0lEQVQI1wXBbwvBQBwA4H3/T8GS8kKRkMR1aWYsGy0vthGaLGZ2u38/Z3aex5CSbayOg1r23IyjLRHlcDfuOr2+OwhuB1LkSwtjNEEYnZOkyLPFyplhjOz1Kbkb+fsx8hvToD1xm8gyizJPylvK0iiN/OOOvDN69th1n4VOGm5pkZHjml28V2g/Y89QSmmt1afiTHGupJR1VYMASigjDACqWgv4cgGUCwD4ac1ByY9iXPwBCgGd70zFh7wAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;05&quot;
        title=&quot;05&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/134a6c6c49b7ff72b13902fe6dcd7cdc/a6d36/05.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/134a6c6c49b7ff72b13902fe6dcd7cdc/222b7/05.png 163w,
https://hfai-static.high-flyer.cn/static/134a6c6c49b7ff72b13902fe6dcd7cdc/ff46a/05.png 325w,
https://hfai-static.high-flyer.cn/static/134a6c6c49b7ff72b13902fe6dcd7cdc/a6d36/05.png 650w,
https://hfai-static.high-flyer.cn/static/134a6c6c49b7ff72b13902fe6dcd7cdc/e548f/05.png 975w,
https://hfai-static.high-flyer.cn/static/134a6c6c49b7ff72b13902fe6dcd7cdc/302a4/05.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;center style=&quot;font-size:12px;color:#C0C0C0&quot;&gt;图5  StreamingLLM 优化的 LLM 在 4M token 文本上语言建模表现&lt;/center&gt;&lt;br/&gt;
&lt;p&gt;上图进一步证实了 StreamingLLM 可以可靠地处理异常扩展的文本。在 400 多万个 token 上，四种著名的 LLM 依托 StreamingLLM 框架表现出稳定的性能，其困惑度几乎与具有重新计算基线的滑动窗口的困惑度相匹配。&lt;/p&gt;
&lt;h3 id=&quot;2-sink-token-的有效性&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-sink-token-%E7%9A%84%E6%9C%89%E6%95%88%E6%80%A7&quot; aria-label=&quot;2 sink token 的有效性 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Sink Token 的有效性&lt;/h3&gt;
&lt;p&gt;为了验证方法3中提出的 sink token 的有效性，即在所有预训练样本中引入 sink token 用于改善 StreamingLLM，研究者训练了两种语言模型，每个模型有160万个参数。在相同的条件下，一个模型采用原始训练设置上，另一个在每个训练样本的开头加入了一个 sink token。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 403px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/f71c5d97b739d36aa021256804629f50/045fd/06.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 59.50920245398773%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsTAAALEwEAmpwYAAABoElEQVQoz1VSa4+jMAzs//9lJ932dFIphIfYhWUpuTTQdiGBJHZODo/TzQcrSuyZsZ0TIuZ5/ng8wFmjvx2A+x/gnAe69gEAYAOccyfvvVJqXhYEN/2pABwiAsAR9eLEaL/VkqUpY6zv+5XFGHOa5znkEbEeupfsvPcIQBHRe++MNi9u5qmq6yi61HVdlmXTNNba0/V6bdtWa02pCLxiUoq1kjwjgrPeaHBWKSWlfD6fnHMpJSnneS6EMMYgBiWwvEqbujTWrRRUjx63582O956UkyQhhdDeYfh1v31kF847C9vlUQz7mQaWJMntdpumaZ3QCipwRjRFmUV3eV8ZnPs3S0Qk22madl03juNmMlRCyKODne9N8V4kr3EKZpGeggDZ3rJDPFra49aLmZ5tGX81lTbW7yDbiCil1FrDzoeI1loIv4V6A/oiHqHndV1E71lUFXFdpsuykDLnXAgxDINSKsuyZVniODbGMMY453meV1U19MMlus5qPP/80X59/v711rbt6XC7Yp2HtWRPCMEYO5/PUsqwm32d3tP+AP8CntayCg/wCw4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;06&quot;
        title=&quot;06&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/f71c5d97b739d36aa021256804629f50/045fd/06.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/f71c5d97b739d36aa021256804629f50/222b7/06.png 163w,
https://hfai-static.high-flyer.cn/static/f71c5d97b739d36aa021256804629f50/ff46a/06.png 325w,
https://hfai-static.high-flyer.cn/static/f71c5d97b739d36aa021256804629f50/045fd/06.png 403w&quot;
        sizes=&quot;(max-width: 403px) 100vw, 403px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;center style=&quot;font-size:12px;color:#C0C0C0&quot;&gt;图 6  有无 sink token 下的 Loss 下降曲线&lt;/center&gt;&lt;br/&gt;
&lt;p&gt;如上图所示，与普通模型相比，使用 sink token 训练的模型表现出相似的收敛动态。使用 sink token 预训练的模型与使用 vanilla 方法训练的模型的性能相似。值得注意的是，vanilla 模型需要将多个标记作为 attention sink 相加以保持稳定的困惑度。相比之下，使用 sink token 训练的模型仅使用 sink token 实现了令人满意的性能。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/e6e4ea59b770759bbc870017076634a3/302a4/07.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 19.018404907975462%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA/0lEQVQI1wH0AAv/ALe7vcXCwuzj58nGxbe5uuXb2dnY3LO1ttDOze/c3cC3u7W7uuDW1tnM0re4tMnHx+rh5r6/wLi5t+LY2ACgb2J3fX7h0c24qK5xbWy5qaOvsduEhYmLjIrtxr+5Vktva264sqyPfr9kcpKUjX7FxuBuhcVxcnC+sq0A4aWbqn122tDS39zpsam2vKqtm6Ppm6zgrKOi3tzh8bGgvGJXua6xg3zQQFzRjZSuvsrpUnLpaoDCtbzIAOvv9/XX0d3U2N3c3tba49jP08TG3NXh/PLs7vDt8e70+Pve1efT1r++1qeu1rnA3NLW4sTL7cnU9+Pn99XSr436WBXnAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;07&quot;
        title=&quot;07&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/e6e4ea59b770759bbc870017076634a3/a6d36/07.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/e6e4ea59b770759bbc870017076634a3/222b7/07.png 163w,
https://hfai-static.high-flyer.cn/static/e6e4ea59b770759bbc870017076634a3/ff46a/07.png 325w,
https://hfai-static.high-flyer.cn/static/e6e4ea59b770759bbc870017076634a3/a6d36/07.png 650w,
https://hfai-static.high-flyer.cn/static/e6e4ea59b770759bbc870017076634a3/e548f/07.png 975w,
https://hfai-static.high-flyer.cn/static/e6e4ea59b770759bbc870017076634a3/302a4/07.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;center style=&quot;font-size:12px;color:#C0C0C0&quot;&gt;图 7  使用 sink token 后的注意力分数可视&lt;/center&gt;&lt;br/&gt;
&lt;p&gt;上图展示了使用和不使用 sink token 预训练的模型的注意力图。可以看到，没有 sink token 的模型，类似于 Llama2 7B（如图 2 所示），显示了早期层的局部注意力和更深的层关注初始标记。相比之下，使用 sink token 训练的模型始终集中在层和头部的接收器上，表明有效的注意力卸载机制。&lt;/p&gt;
&lt;p&gt;研究者还展示了使用 StreamingLLM 进行流式 QA 的结果，还有一系列消融实验，效率实验等，感兴趣的读者可以阅读论文原文了解其细节。&lt;/p&gt;
&lt;h2 id=&quot;总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%80%BB%E7%BB%93&quot; aria-label=&quot;总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;总结&lt;/h2&gt;
&lt;p&gt;总的来说，该工作是一个非常典型的观察规律、分析原因、运用到实际方法的工作。其提出的 attention sink，也许像 BERT 中放在句首用于分类的 [CLS] 标记，或者是图神经网络中的 Super Node，接收的是全局或者说整个句子的信息。实际上这种方式不仅仅可以用在 LLM 上，所有 attention-based 的模型都可以参考这一方式将输入序列的长度变得更加灵活。而对于其他 AI 研究领域来说，则是很好的将解释模型与研发模型结合的例子。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Continuous Batching：一种提升 LLM 部署吞吐量的利器]]></title><description><![CDATA[由于 LLM 巨大的 GPU 内存开销和计算成本，在大多数应用中，机器学习工程师通常通过内部调整（如量化和对 CUDA 核的定制）来优化。然而，由于 LLM 通过迭代生成其输出，并且 LLM 推理通常涉及内存而不是计算，因此在很多实践中，优化系统级批处理可以使性能差异达到1…]]></description><link>https://www.high-flyer.cn/blog/continuous-batching/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/continuous-batching/</guid><dc:creator><![CDATA[Vachel]]></dc:creator><pubDate>Sun, 10 Sep 2023 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;由于 LLM 巨大的 GPU 内存开销和计算成本，在大多数应用中，机器学习工程师通常通过内部调整（如量化和对 CUDA 核的定制）来优化。然而，由于 LLM 通过迭代生成其输出，并且 LLM 推理通常涉及内存而不是计算，因此在很多实践中，优化系统级批处理可以使性能差异达到10倍甚至更多。&lt;/p&gt;
&lt;p&gt;一种最近提出的优化方法是连续批处理（Continuous batching），也称为动态批处理或基于迭代级的批处理。其具有如下惊人的效果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于vLLM，使用连续批处理和连续批处理特定的内存优化，可以实现多达23倍的吞吐量提升；&lt;/li&gt;
&lt;li&gt;对于 HuggingFace 本地生成推理，使用连续批处理，可以实现8倍的吞吐量提升；&lt;/li&gt;
&lt;li&gt;基于 NVIDIA 的 FasterTransformer，使用优化过的模型实现，可以实现4倍的吞吐量提升。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本博客接下来将详细介绍相关技术的细节。&lt;/p&gt;
&lt;p&gt;&lt;small&gt;文章翻译自: &lt;a href=&quot;https://www.anyscale.com/blog/continuous-batching-llm-inference&quot;&gt;https://www.anyscale.com/blog/continuous-batching-llm-inference&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;h2 id=&quot;llm-推理&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#llm-%E6%8E%A8%E7%90%86&quot; aria-label=&quot;llm 推理 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;LLM 推理&lt;/h2&gt;
&lt;p&gt;LLM 推理是一个迭代过程，在每个新前馈循环后获得一个额外的完成标记。例如，如果您提示一个句子”What is the capital of California:“，它需要进行十次前馈循环才能得到完整的回答[“S”,“a”,“c”,“r”,“a”,“m”,“e”,“n”,“t”,“o”]。&lt;/p&gt;
&lt;p&gt;如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 621px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/e12243478cfe843761c4bf905292ad5b/3075e/01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 48.46625766871166%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAABsklEQVQoz4VSXWsTQRQN5C/uj5L+AJ/7VMSXUilqq9RiUjVUYgoFS1tJjGltsiTNzNw7O7t39h6ZjdUIkQ4czjDMPffcjxaAFoC2qrZUNQOAqipLzxQ5gVwkogbOuei9T/cyhJC+PknxqtpO3Jz1BwBZXUc4CpF8BBcKxxWccw2IqAEzR2ZOglsprq7rfwWTwxVrVkmN+7uBLMaHuvxxqG7aUyJWa41aa9WYhiUleBDc6LApuZaMfQDPz8TdvAL/PICb9XC7KOGI4b1P7hJLURT/F4wxtkWkFaXM5gsDmw9kPtwDT/ZwfXmM7a5DYAPnLIwxeNRh6kGMsRXjSpCmJ7Ic7qCYPMPo+g2eHns871nMlwTPqY8s6z3c6HAlKJmxDoX5Jpyfolp8Rj69QOcyoD8kjGcMJkYIQX5PebPgn6FozMqqhpueyP1oF8XtC1xddbH9ocR+32Knx8h9hPckRH8dPsRvWBvNjCXw/FzsXRch7+D7+Bz7ZwGdC8LRYIHJ+48onJNQloDq1iN7WGcSFT7/JPbmJcrZWwxHA+x+qfDuK+Ogf4/h6yPwcinFWsnrDn8BIKyQsvfzZh4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;01&quot;
        title=&quot;01&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/e12243478cfe843761c4bf905292ad5b/3075e/01.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/e12243478cfe843761c4bf905292ad5b/222b7/01.png 163w,
https://hfai-static.high-flyer.cn/static/e12243478cfe843761c4bf905292ad5b/ff46a/01.png 325w,
https://hfai-static.high-flyer.cn/static/e12243478cfe843761c4bf905292ad5b/3075e/01.png 621w&quot;
        sizes=&quot;(max-width: 621px) 100vw, 621px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;上图示例显示了一个支持最大序列长度为8个标记（T1，T2，…，T8）的假设模型。从 Prompt（黄色）开始，迭代过程逐个生成一个标记（蓝色）。一旦模型生成了一个结束序列标记（红色），生成循环停止。这个例子显示了仅包含一个输入序列的 Batch，因此 Batch 大小为1。&lt;/p&gt;
&lt;p&gt;现在，我们已经了解了 LLM 推理的迭代过程，接下来我们来探讨一些不熟悉的事情：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;LLM 推理是内存 IO 限制，而不是计算限制。换句话说，目前加载 1MB 的数据到 GPU 所需的时间比 1MB 的数据在GPU上计算所需的时间长。这意味着 LLM 推理的吞吐量很大程度上取决于您能将多少批数据装入到高速GPU 内存中；&lt;/li&gt;
&lt;li&gt;GPU 内存的消耗量随着基本模型大小和标记长度的增加而增加。如果我们将序列长度限制为 512，那么在一个批处理中，我们最多只能处理28个序列；一个序列长度为 2048 则批处理大小最多只能为7个序列。需要注意的是，这只是一个上限，因为中间计算结果没有留下存储的空间。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这意味着优化内存使用有很多余地。这就是为什么像 AutoGPTQ 这样的模型量化策略具有如此强大的力量的原因；如果您可以将内存使用量减半，您将能够为更大的批处理提供更多的空间。然而，并不是所有的策略都需要对模型权重进行修改。例如，FlashAttention 通过重新组织注意计算来减少内存IO，从而发现显著的性能提升。&lt;/p&gt;
&lt;p&gt;连续批处理是另一种内存优化技术，它不需要对模型权重进行修改。接下来，我们解释一下连续批处理如何工作，以及如何提高LLM生成过程的内存效率。&lt;/p&gt;
&lt;h2 id=&quot;朴素批处理与静态批处理&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%9C%B4%E7%B4%A0%E6%89%B9%E5%A4%84%E7%90%86%E4%B8%8E%E9%9D%99%E6%80%81%E6%89%B9%E5%A4%84%E7%90%86&quot; aria-label=&quot;朴素批处理与静态批处理 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;朴素批处理与静态批处理&lt;/h2&gt;
&lt;p&gt;我们称这种传统的批处理方法为静态批处理，因为批大小在推理完成之前保持不变。以下是LLM推理中静态批处理的示意图：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/28d7172c5c27e843bc31bb91aacac16c/302a4/02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 23.31288343558282%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAAsTAAALEwEAmpwYAAABN0lEQVQY0xXBzUvCUAAA8P2NHTp4kS4dOgRRECpUhxDqEghBMSS0EtRMEgwqEs0ydU4Cw4/82rfuvbf39rY5m4cR/X6MAUWs/6BZtzUAOoAQAoQQAABj7Ps+QaKhj4jGz5UOPzT4gSY3uV84MxY2dV1Gbu523sKF52S8pEozRE1CCMEYW5ZtUSxwkWltu105OE+nA6y6mQHHe2zxtTsuN1CDY8TGfqsSvSiU4tWlaSLbMiFECELLdijRJ/XQqBbmyieRm+padPx4FHtqqXd9j0/k5Ow9I74HQSMwrG4cXmUuX2QFUNsyMcaOszAJmLd3lM+gUV//Km+dsYnTUDpWFEds0pYE1/cZ5ZtV+yk8yVIhn/qYSzpdeUvn38J1HUMsar1rfVKg0oOhlTKdVY7Dvdu8NRWWnvcHtLfzboNcCxIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;02&quot;
        title=&quot;02&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/28d7172c5c27e843bc31bb91aacac16c/a6d36/02.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/28d7172c5c27e843bc31bb91aacac16c/222b7/02.png 163w,
https://hfai-static.high-flyer.cn/static/28d7172c5c27e843bc31bb91aacac16c/ff46a/02.png 325w,
https://hfai-static.high-flyer.cn/static/28d7172c5c27e843bc31bb91aacac16c/a6d36/02.png 650w,
https://hfai-static.high-flyer.cn/static/28d7172c5c27e843bc31bb91aacac16c/e548f/02.png 975w,
https://hfai-static.high-flyer.cn/static/28d7172c5c27e843bc31bb91aacac16c/302a4/02.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，在第一遍迭代（左）中，每个序列从提示词（黄）中生成一个标记（蓝色）。经过几轮迭代（右）后，完成的序列具有不同的尺寸，因为每个序列在不同的迭代结束时产生不同的结束序列标记（红色）。尽管序列3在两次迭代后完成，但静态批处理意味着 GPU 将在批处理中的最后一个序列完成。&lt;/p&gt;
&lt;p&gt;与传统深度学习模型不同，LLM 的批处理方法比较复杂，因为其推理是迭代性的。直观上，这是因为请求可能提前完成，但是释放其资源并添加可能处于不同完成状态的新请求是棘手的。这意味着，随着 GPU 在批次中不同序列的生成长度与最大生成长度不同而未充分利用。在上面的右图，这通过序列1、3和4的序列末标记后的白色方块来说明。&lt;/p&gt;
&lt;p&gt;静态批处理不充分利用GPU的频率是多少？这取决于批次中序列的生成长度。例如，可以使用LLM推断来发射单个标记作为分类任务（有更好的方法可以做到这一点，但让我们以此为例）。在这种情况下，每个输出序列具有相同的大小（1个标记）。如果输入序列也具有相同的大小（例如，512个标记），则每个静态批次将实现最佳的GPU利用率。&lt;/p&gt;
&lt;p&gt;另一方面，LLM 驱动的聊天机器人服务不能假定固定长度的输入序列，也不能假定固定长度的输出序列。在撰写本文时，专有模型提供的最大上下文长度超过8K个标记。使用静态批处理，生成输出的变化可能会导致GPU严重未充分利用。难怪OpenAI首席执行官Sam Altman称计算成本高得惊人。&lt;/p&gt;
&lt;p&gt;如果没有对用户输入和模型输出的限制假设，未经优化的生产级 LLM 系统无法充分利用 GPU 并导致不必要的较高成本。&lt;/p&gt;
&lt;h2 id=&quot;连续批处理&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%BF%9E%E7%BB%AD%E6%89%B9%E5%A4%84%E7%90%86&quot; aria-label=&quot;连续批处理 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;连续批处理&lt;/h2&gt;
&lt;p&gt;行业意识到这种批处理的低效性，并提出了更有效的解决方案。OSDI 2022 上发表的 Orca 是第一篇解决这个问题的论文。它采用了迭代级调度，其中批大小根据每次迭代确定。结果是，一旦批中的一个序列完成生成，就可以在其位置插入一个新的序列，从而实现比静态批处理更高的GPU利用率。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/10738c93c0d5b194e103c4bd291b65b8/302a4/03.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 22.699386503067483%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAAsTAAALEwEAmpwYAAABPElEQVQY0wExAc7+APTz8vPy7/by6ePo6+rt8Ozs6+vr6/Pz8+/v7/7///n49/Tz7+7t6vPt4efo6OPm7Obk5u7h2/Dt4unt5wDfyXzbx3/PwoaRstPF1+7y7+zq6+vr6+vq6unz9fnp37zdxHHeyYPSxIKBpclgpe12ltO1hY7Qw4nrt04A4MZt08F5kqy2pcPo4ev19/Xw7Ozt7+/v9PTz8vT759ij28Fm2sd9na6pTZLefIbEnZGklbKtm6uxnF2AAOHGaubLb+jKZHidtZ6/4t3l7/Dv7e7u7vX19PT1++rcrOPHZd/HcfPOXI2trpN9o6OKk7WrfNahb3ihtADexGjjyXTcyHzy1YKQr8WsyOz49O7r7O308/Ly8/js4r3fxnLeyHzk0Yrs0YSyxstztPmam8vfjYjwzmUb2ut7mf/soQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;03&quot;
        title=&quot;03&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/10738c93c0d5b194e103c4bd291b65b8/a6d36/03.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/10738c93c0d5b194e103c4bd291b65b8/222b7/03.png 163w,
https://hfai-static.high-flyer.cn/static/10738c93c0d5b194e103c4bd291b65b8/ff46a/03.png 325w,
https://hfai-static.high-flyer.cn/static/10738c93c0d5b194e103c4bd291b65b8/a6d36/03.png 650w,
https://hfai-static.high-flyer.cn/static/10738c93c0d5b194e103c4bd291b65b8/e548f/03.png 975w,
https://hfai-static.high-flyer.cn/static/10738c93c0d5b194e103c4bd291b65b8/302a4/03.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，使用连续批处理完成七条序列。左图显示了单个迭代后的批，右图显示了多次迭代后的批。一旦一个序列产生结束序列标记，我们在其位置插入新的序列（即序列S5、S6和S7）。这实现了更高的 GPU 利用率，因为 GPU 不需要等待所有序列完成才开始新的一个。&lt;/p&gt;
&lt;p&gt;现实情况比这个简化模型更复杂：因为预填充阶段需要计算，并且与生成阶段的计算模式不同，因此它不能很容易地与令牌的生成一起进行批量。连续批处理框架目前通过超参数来管理这个问题：等待已服务比和等待结束序列标记的请求比（waiting_served_ratio）。&lt;/p&gt;
&lt;p&gt;目前，HuggingFace 已经将连续批处理作为他们的基于 Rust 和 Python 的文本生成推理服务器的生产版本。我们使用他们的实现来了解连续批处理在 benchmarks 中的性能特征。&lt;/p&gt;
&lt;h2 id=&quot;实验验证&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%AE%9E%E9%AA%8C%E9%AA%8C%E8%AF%81&quot; aria-label=&quot;实验验证 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;实验验证&lt;/h2&gt;
&lt;p&gt;我们旨在了解连续批量处理与静态批处理在模拟实时推理工作负载上的表现。本质上，我们关心成本。我们将成本分解为吞吐量（Throughput）和延迟（Latency）这两个指标，因为成本直接取决于您在给定延迟下以多高效的方式提供服务的程度。&lt;/p&gt;
&lt;p&gt;我们在一个 NVIDIA A100 GPU 上进行吞吐量（Throughput）和延迟（Latency）的基准测试。我们的 A100 有 40GB 的 GPU 内存。我们选择了 Meta的OPT-13B 模型，因为每个测试框架都与此模型配合良好。我们选择了 13B变体，因为它既不需要张量并行，又足够大以产生内存效率挑战。我们选择不使用张量并行，尽管静态批处理和连续批处理都可以使用张量并行。&lt;/p&gt;
&lt;p&gt;我们测试了两种静态批处理框架和三种连续批处理框架，他们分别是：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 594px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/457efa838e8773189ff0babd287c3c06/5fd3e/04.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 50.306748466257666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB8klEQVQoz33KSW/TQBjGcX9EaLm0SoXK9yGldBMRvSBxQEWiEuKAROmhCAR10mZpmtjxMl5iZ2kWZ7Od8fsgT9IAqsRIfz2jmZ+0uR/Sxl6Ijb2QNvdDZA5DZA4WbR2mRf+UOZhh6XHv/3bS01ectnMc2zlOW0cc67tzPHnJRWsvYjzOhqseZUOs78zwTPg5Mku/thOtjPTuok/vv93h5KJLb8972P3YQ/a0g+cf2jj6PMbxeYzXX6NlMY7PJqnFp8sB3px1kD3tIvdltnJSy2+SqtRg6Bp5ro1+10PTMdC0DUTTAItDywCaz8BMHb7nwmY6fNdEEk9XTlrJP/vgJAkhIVpsQv81UrnGKF9SUVFsqtQtXN/ouN9yjYF5Q3RHhPaAi3XaE1xVNFRVV2zx1hRv3YDQGXJImjsk3Q2guQE17AEUqwe9OYJq9UVWe4bWgOAPSKzTiaCwHoRlPdTZnTDpv9fnkBzXo1pdRUM3iVkOHNeDppswmQ3dYGhoBgzTQl1RYdkOhsEYqUtzm/7CG6m3EM8TSHJJpe9yFT/yVVJYF05nBtMbiZg/huWPYben4p7+Wa0x5FIDcklFvqyJ0nv65vdiSNXbOlVubhGMJhRGHHOOB8WcEHOAJ0AwmiJfuMalXEDhqij6+UtGsVRBGHP8BpTcwK0K8hgGAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;04&quot;
        title=&quot;04&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/457efa838e8773189ff0babd287c3c06/5fd3e/04.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/457efa838e8773189ff0babd287c3c06/222b7/04.png 163w,
https://hfai-static.high-flyer.cn/static/457efa838e8773189ff0babd287c3c06/ff46a/04.png 325w,
https://hfai-static.high-flyer.cn/static/457efa838e8773189ff0babd287c3c06/5fd3e/04.png 594w&quot;
        sizes=&quot;(max-width: 594px) 100vw, 594px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;吞吐量测试结果&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%90%9E%E5%90%90%E9%87%8F%E6%B5%8B%E8%AF%95%E7%BB%93%E6%9E%9C&quot; aria-label=&quot;吞吐量测试结果 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;吞吐量测试结果&lt;/h3&gt;
&lt;p&gt;根据我们对静态批处理的了解，我们猜测在序列长度波动较大的每个批次中，连续批处理的表现会显著更好。为了证明这一点，我们针对每个框架分别运行我们的吞吐量基准测试4次，每次在具有更高序列长度波动的数据集上进行。&lt;/p&gt;
&lt;p&gt;为了做到这一点，我们创建了一个包含 1000 个序列，每个序列具有 512 个输入标记的数据集。我们通过忽略端尾标记并设置最大标记配置来始终生成每个请求的序列长度。然后我们生成 1000 个生成长度，每个请求都来自一个由均值为 128 的指数分布产生的样本。我们使用指数分布，因为它是对像 ChatGPT 这样的应用程序中可能遇到的生成长度的一个好近似。为了改变每个运行的方差，我们仅选择小于或等于 32、128、512 和 1536 的样本。总输出序列长度最多为 512+32=544、512+128=640、512+512=1024 和 512+1536=2048。&lt;/p&gt;
&lt;p&gt;然后我们使用一个简单的基准测试脚本向我们的模型服务器提交 HTTP 请求。基准测试脚本以突发方式提交所有请求，使计算饱和。&lt;/p&gt;
&lt;p&gt;结果如下：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/e751e4793ee9c6b55675cbc11f5fe112/302a4/05.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 29.447852760736193%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAAsTAAALEwEAmpwYAAABX0lEQVQY0xXJ206CYAAAYN6qNTdrDq1MeQ+dmWv1QN10YZe6VSvNlIGIB8ylTPEAKuCB488hBPxbt9+HmGTaIFKgmbZbmEtjFoUZ/5J2aEwnUlL1altL8m+XnWKsW4yNy4lNLSlWk/v6tUVhCP9yxpWi/ecI8XhCP532ihH+9ZwrRe1mwqYSWgPV8bjWiO+/UKWOajiq46jWQE0ibjcvEDi5h9MHn71zBgXnu+AO8sHoNmQLWicnERm9mzd6NzKZUeic3sltmlmFzqnt/5LJLMJOOZbj5kuBXy/Frez6nhuGju8D9xd4Pi/JG1W3DuF6pyimBTx/vVNUYAPPF/cKUvqolCqf5WrtHScqJDWYLWTLkSxn7x3MI2wPRxNRtiFkuKmg6gDCn4WwMoBxhMyEQ/B2h+wxdapFMsxgwgnb7VyS1qqqeZ4ZBCzPrxTVhnA4m4uaDsKQ5YUNAGYQ9MfjP02MGhpKNPAyAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;05&quot;
        title=&quot;05&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/e751e4793ee9c6b55675cbc11f5fe112/a6d36/05.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/e751e4793ee9c6b55675cbc11f5fe112/222b7/05.png 163w,
https://hfai-static.high-flyer.cn/static/e751e4793ee9c6b55675cbc11f5fe112/ff46a/05.png 325w,
https://hfai-static.high-flyer.cn/static/e751e4793ee9c6b55675cbc11f5fe112/a6d36/05.png 650w,
https://hfai-static.high-flyer.cn/static/e751e4793ee9c6b55675cbc11f5fe112/e548f/05.png 975w,
https://hfai-static.high-flyer.cn/static/e751e4793ee9c6b55675cbc11f5fe112/302a4/05.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;可以看到，静态批处理和朴素连续批处理在较低的序列长度波动下表现大约相同。然而，随着方差增加，静态批处理的性能显著下降，直到生成长度达到 1536 时，性能下降至 81 个字符/秒。FasterTransformers 在静态批处理方面的表现明显优于静态批处理，几乎与连续批处理保持同步，直到生成长度达到 1536。&lt;/p&gt;
&lt;p&gt;令人印象深刻的在这里的是vLLM。对于每个数据集，vLLM的性能是朴素连续批处理的两倍以上。我们尚未分析vLLM 性能中优化贡献最大是什么，但我們怀疑 vLLM 动态预留空间的能力，而不是提前预留空间，使得 vLLM 可以显著增加批量大小。&lt;/p&gt;
&lt;p&gt;我们将这些性能结果相对静态批处理的关系绘制出来：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/b599416aeedb57e037e55a05ef1a931e/302a4/06.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 49.079754601226995%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsTAAALEwEAmpwYAAABiUlEQVQoz32Ru4sUQRCH94+UC8RMg83NhAvF0Py8QM9T1AMx8kRh0UDEu0XEwGQeK67iTvV7uufVjyqZub1NTvyC5hfU11XVPbPWbTYVTDDGOOeCsx1CCACoKuAMhGDVVKi0HoYBEWc+oFRGXqKU6uq64lVeFkVRZFm2WpWc88YZWysplZTSaOOcG2UpRfA+pUT/BRHHc8q84V3oiWgGAFrrEAJeIaW0CzSFECMRPft6kvF8lKWUAOC9vyiKMaZLCCmlFMIoLPL3rBEUUn/+9ujD3UL+3HY2xuxkItqqMYpGhBgQEw3Dg08Hm/ZPmXXF/t6T13u5glEeX6jr4jQPIvJGJJyuQHy0PG6xPVvWP+7PD9/MLbVHr9Tn2zdevLuea9h2ttb6EKyLjYHjL4/b6M/PxK/Tg4cf7/UUD5/D9/1rTxdzg93JqV7eufVycbO8kK21057YtlHD2jQ8ETHes/ybdpuQUm29WJfGQUJsOhTrlTS/wzTd7J8fkzDK2hltxQjjSve9v1r2F7b3K1+XOCGZAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;06&quot;
        title=&quot;06&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/b599416aeedb57e037e55a05ef1a931e/a6d36/06.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/b599416aeedb57e037e55a05ef1a931e/222b7/06.png 163w,
https://hfai-static.high-flyer.cn/static/b599416aeedb57e037e55a05ef1a931e/ff46a/06.png 325w,
https://hfai-static.high-flyer.cn/static/b599416aeedb57e037e55a05ef1a931e/a6d36/06.png 650w,
https://hfai-static.high-flyer.cn/static/b599416aeedb57e037e55a05ef1a931e/e548f/06.png 975w,
https://hfai-static.high-flyer.cn/static/b599416aeedb57e037e55a05ef1a931e/302a4/06.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;需要注意的是，FasterTransformer 的4倍改进虽然令人印象深刻，但我们非常感兴趣在 NVIDIA 实现它时进行基准测试。然而，即使使用优化后的模型，连续批处理在静态批处理方面仍然具有显著的改进。如果您像 vLLM 一样采用连续批处理和迭代级调度来实现进一步的内存优化，性能差距就会变得非常巨大。&lt;/p&gt;
&lt;h2 id=&quot;延时测试结果&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%BB%B6%E6%97%B6%E6%B5%8B%E8%AF%95%E7%BB%93%E6%9E%9C&quot; aria-label=&quot;延时测试结果 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;延时测试结果&lt;/h2&gt;
&lt;p&gt;类似地，我们在一个真实的用例上进行延迟-吞吐量权衡优化。我们对每个框架进行基准测试，并测量随着每个框架的累积分布函数（CDF）的变化，该函数如何随着每个框架的部署而变化。&lt;/p&gt;
&lt;p&gt;与吞吐量基准测试相同，我们配置模型以始终生成指定数量的每个请求的标记。我们通过从1个标记到512个标记的均匀分布中采样长度来准备100个随机的提示。我们通过从均值为128且最大大小为1536的指数分布中采样100个输出长度来进行预测。这些数字之所以选择，是因为它们在现实世界中是合理的，并允许生成器充分利用我们模型的全部上下文长度（512+1536=2048）。&lt;/p&gt;
&lt;p&gt;我们没有像在吞吐量基准测试中那样同时提交所有请求。而是通过预先延迟每个请求一定的时间来进行基准测试。我们通过泊松分布来确定每个请求提交后等待多长时间。泊松分布由λ和预期率（即每秒击中模型端点的查询数量）进行参数化。我们测量在 QPS 为1和 QPS 为4时的延迟，以了解随着负载的变化，延迟分布如何变化。&lt;/p&gt;
&lt;p&gt;结果如下：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/98e00f7af77d8872cffafa3a9efb9b7c/302a4/07.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 28.22085889570552%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAAsTAAALEwEAmpwYAAABWElEQVQY0xXEW0+CUAAAYH5YF6fd3tyitlpr/bxWvSRZudqy0jStJc5LKgICanJEOFeTy4HW9/AJvevUQEr1pf9715uj+zR735s+bpmFTF9KfZ6vaXdpu7jtlXaNQtosZBqX682rjfFDxivtCEbxuJ0/bOcPOneHcm7feDpaymdNSaxcZsevx+bzUeUiCyonoHrydpFtSqJbO23kxNaNSL5OBQ05I+KOiGtQbxpQ6xdrBKkY6hQbDA68hUaQwbCKvCGGxhKryFUQHDGsEyh866ZiTdTJTP8BMOCUJySKcRhTntiYzRClPMFhbGNGogT6kTV3UcAJTxy2Esr1evmjXpPlmix3VW3Blg5lyA9oxGcQWfM5ixOAydC0SMThyu8bpve7ojw2bSAUSuXb4stDpVpttXvTWXfyowAH+OE8iCxEFBu4PNEXXkNRnZADP+yY4wlliyhuqvofkVomnSwX+RAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;07&quot;
        title=&quot;07&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/98e00f7af77d8872cffafa3a9efb9b7c/a6d36/07.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/98e00f7af77d8872cffafa3a9efb9b7c/222b7/07.png 163w,
https://hfai-static.high-flyer.cn/static/98e00f7af77d8872cffafa3a9efb9b7c/ff46a/07.png 325w,
https://hfai-static.high-flyer.cn/static/98e00f7af77d8872cffafa3a9efb9b7c/a6d36/07.png 650w,
https://hfai-static.high-flyer.cn/static/98e00f7af77d8872cffafa3a9efb9b7c/e548f/07.png 975w,
https://hfai-static.high-flyer.cn/static/98e00f7af77d8872cffafa3a9efb9b7c/302a4/07.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;可以看到，在提高吞吐量的同时，连续批处理系统也改善了中位数延迟。这是因为连续批处理系统允许在有空间的情况下，将新的请求添加到现有的批次中。但是，其他百分位数呢？事实上，我们发现它们在所有百分位数上都改善了延迟：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/c5fee1ba3a27ddf2135cce9fe5c4cd54/302a4/08.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 47.852760736196316%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAABbklEQVQoz3VS267jIBDL/39g9mGfWmlbmqQntwIJM2OvhrRHp6vuSBZGA8YGGjxLRCEi38g5I4SArusx9D2GYcCt65BSQikFZoZP1fBZXX/n+XyuOJ1OvF6vnOeZKWXmOLPvAkO4MYTAy+XCZV35qRozo0rB8HXHvETE+ECMsTpRERgIkgCPsXIAJuWzw23bOAxXF3o7yUBOsTBucqiY0fZMTTMtrzTZaQDdEIAK581jnXgLJ6iRZlo37kU5xZ2b+GKj5gc1LdQt0lTqxpfYv2imseM4nN0EYUpR5ZSE4lmLO1oPR1WEH0XeBPvwm/MyVsFNUCN6HOzx6UhfF/cW73/zJoQ/FlO0ZVltmhezOJntyUzFDJ4MdvwRO7iTZ/3kXn71Tco7HymzbJkoG0spNZo/q4gw50xVraf7A3r/5cjn3nu587X+bX4RaEm2BrYi0sKsBdCqanu/39txHNtpmiovpdSew7k91zr2fW//AtlNC/mc5zD8AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;08&quot;
        title=&quot;08&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/c5fee1ba3a27ddf2135cce9fe5c4cd54/a6d36/08.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/c5fee1ba3a27ddf2135cce9fe5c4cd54/222b7/08.png 163w,
https://hfai-static.high-flyer.cn/static/c5fee1ba3a27ddf2135cce9fe5c4cd54/ff46a/08.png 325w,
https://hfai-static.high-flyer.cn/static/c5fee1ba3a27ddf2135cce9fe5c4cd54/a6d36/08.png 650w,
https://hfai-static.high-flyer.cn/static/c5fee1ba3a27ddf2135cce9fe5c4cd54/e548f/08.png 975w,
https://hfai-static.high-flyer.cn/static/c5fee1ba3a27ddf2135cce9fe5c4cd54/302a4/08.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;QPS=1时，每个框架的生成请求中累积分布函数（CDF）的形状都有所不同，这是由于连续批处理系统中的迭代级批调度导致的。所有连续批处理在 QPS=1 时表现约等于静态批处理；与静态批处理相比，FasterTransformers 的表现明显更好。&lt;/p&gt;
&lt;p&gt;连续批处理改善所有百分位数的延迟的原因与改善 p50 的延迟原因相同：新的请求可以添加，而不管其他序列在生成批次中多远。然而，与静态批处理一样，连续批处理仍然受到 GPU 可用空间的限制。随着您的服务系统接收到的请求数量饱和，即平均批量大小更高，那么在收到新请求时，立即在 GPU 上注入新请求的机会就越少。我们可以看到，随着平均QPS增加到4，这一点变得更加明显：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/ad42db3ac8e54cd2ebfc291571e21573/302a4/09.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 47.852760736196316%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAABkElEQVQoz21Sa4/cMAjM//+B7sdqc9VtLvuIk/gJhjnhZFfXqiMhcIxhBjLoCeamzKxE1H3OWadp0vl207vZ/a7zPGuMUSuRioj+DwMO6Nd8xzhecLmMGMcR1+sV67oipYQcV9zmCdP0ha9pwvXzE9u2nS8VPzGINFi3EILGmDSlqH5ddQ9Rmcmy/7KuxsidcfeNVbkeDEspMHmtSe+w+w+se4QcL6AiUBUQC0JpSCQotUJqQksrWvSQEiFUev4QQkAppfMO/gOLfx5KrJAIKgtiFaTKoBzR8g4pAZIDhMnUQVQ7AYuHfd9BxEo14Db/OeciaKJItSGmAs4RWiPEijU+2OMoIGfjVzys2w5i1m17wFTbx1ypL4PiBi0Besp5j+G0Xuyf87AuN/H337KtXlKMsnsvdfcilEUbdyW9lurbXvgZG4z0kKJHjguYG7hmUC3vlXJrtjC01v8EmzWI6M3Iznb3Yme5g4j+UsABcOaZ2YmIU1XXWnOPx8Mty+K89+75fDoi6ndmFr9yzWqt7hsNPAtsE6SEmQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;09&quot;
        title=&quot;09&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/ad42db3ac8e54cd2ebfc291571e21573/a6d36/09.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/ad42db3ac8e54cd2ebfc291571e21573/222b7/09.png 163w,
https://hfai-static.high-flyer.cn/static/ad42db3ac8e54cd2ebfc291571e21573/ff46a/09.png 325w,
https://hfai-static.high-flyer.cn/static/ad42db3ac8e54cd2ebfc291571e21573/a6d36/09.png 650w,
https://hfai-static.high-flyer.cn/static/ad42db3ac8e54cd2ebfc291571e21573/e548f/09.png 975w,
https://hfai-static.high-flyer.cn/static/ad42db3ac8e54cd2ebfc291571e21573/302a4/09.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;QPS=4 时，每个框架的生成请求中累积分布函数（CDF）的形状与 QPS=1 时的情况相似，FasterTransformer 的分布与静态批处理的分布相似。然而，与 QPS=1 相比，FasterTransformer 的曲线更接近于静态批处理，而 text-generation-inference 和 Ray Serve 的连续批处理实现与 FasterTransformer 的曲线相似，但明显不如 vLLM。&lt;/p&gt;
&lt;p&gt;我们观察到，随着系统的饱和，FasterTransformer 变得更加接近于静态批处理，而 text-generation-inference 和 Ray Serve 的连续批处理实现正在朝着与 FasterTransformer 的曲线相似的方向发展。换句话说，随着系统的饱和，立即在 GPU 上注入新请求的机会更少，因此请求延迟上升。这与 vLLM 的曲线相吻合：在 QPS=1 和 QPS=4 之间，它的最大批量大约增加了 1500 个token。&lt;/p&gt;
&lt;h2 id=&quot;总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%80%BB%E7%BB%93&quot; aria-label=&quot;总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;总结&lt;/h2&gt;
&lt;p&gt;LLMs 具有令人惊叹的功能，我们相信其影响仍有很大的发掘空间。我们已经分享了如何使用一种新的服务技术：连续批处理，以及它如何超越静态批处理。它通过减少浪费安排新请求的机会来提高吞吐量，并能够立即将新请求注入计算流中来改善延迟。我们期待人们如何利用连续批处理，以及这个行业将从此走向何方。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[LLaMA-2 技术详解（一）：数据打标]]></title><description><![CDATA[LLaMA 是目前备受关注的开源大语言预训练模型。最近  Meta  发布了  LLaMA 2，它是 LLaMA 的下一代版本，具有商业友好的许可证。LLaMA 2 有 3 种不同的尺寸：7B、13B 和 70B，在对话用例下微调的模型版本被称为 LLaMA 2-Chat…]]></description><link>https://www.high-flyer.cn/blog/llama2-1/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/llama2-1/</guid><dc:creator><![CDATA[Freja/Vachel]]></dc:creator><pubDate>Thu, 10 Aug 2023 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;LLaMA 是目前备受关注的开源大语言预训练模型。最近  Meta  发布了  LLaMA 2，它是 LLaMA 的下一代版本，具有商业友好的许可证。LLaMA 2 有 3 种不同的尺寸：7B、13B 和 70B，在对话用例下微调的模型版本被称为 LLaMA 2-Chat。Llama-2-Chat 模型在大多数基准测试中都优于现有的开源聊天模型，在对有用性和安全性的人工评估中，LLama-2-Chat 与 ChatGPT，PaLM 等一些流行的封闭源模型不相上下。&lt;/p&gt;
&lt;p&gt;LLama-2-Chat 几乎是现有开源模型中唯一做了 RLHF 的模型。LLaMA-2 经过 5 轮 RLHF 后，在 Meta 自己的 Reward 模型与 GPT-4 的评价下，都表现出了超过 ChatGPT 性能。&lt;/p&gt;
&lt;p&gt;本文将为大家整理 LLaMA-2 论文中提到用来训练 Reward Model 的数据获取流程。&lt;/p&gt;
&lt;h2 id=&quot;标注流程&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A0%87%E6%B3%A8%E6%B5%81%E7%A8%8B&quot; aria-label=&quot;标注流程 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;标注流程&lt;/h2&gt;
&lt;p&gt;LLaMA-2 的打标主要考虑有用性(Helpfulness)和安全性(Safety)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;有用性(Helpfulness)：response 对 prompt 中问题回答得有多好，是否提供了需要的信息&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安全性(Safety)：回答是否是安全的，例如教用户造炸弹，是不安全的&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/29bcbd03f5cecc6c9fe1bcd3d13f2bc6/302a4/01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 47.239263803680984%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAAsTAAALEwEAmpwYAAABmUlEQVQozzWQO28TURCF/a/4ezQpKEEUtBFIdEhQEiQKUoDcOCRk8Tux43W89u7eva953bmL7ITR0TRnPmnOGXiUh6r5cnH59cew7pwN+F9gPOwaO70vZ6vy0HnjY2tjY2PrnvfAI1eNLWZ3y1XpIibVnHNEUlUWbW0Y3U5uJvMAyKKSkuYsqkDJeBi4SF1AzT1JKvfGRhRJnQuIFIA5pX3DxSQYjx7pYedG18YG5JSMg4EDspE4KTHvWxsB09HwRBSRieVgYL2Ju7r7M72rmrBYWR+J5QTbiOvHuqwa44KP4CMGpM4FF8EDnULknI8Pt6bLOfenoSfYA10X0+FVUbddyr0kTap932vOHjjp8Tpr9iHWxlZ1u3k8NMY+w32vP5dsQH+v6cVZ+Wspm3Lz/vO3m/FCkpLIbOa3W7m4HL58ff7q3ceztx/enH8yLnQBB5LS/c52Hhzo979gogLAert3Ph5rUXVeALSsDqNifj1eXBXz8XwFyA5oEJFZBEiQpe8TMQOndCrfAwVkkoQsfArzpJT7gByR/wGdlfjXEn999gAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;01&quot;
        title=&quot;01&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/29bcbd03f5cecc6c9fe1bcd3d13f2bc6/a6d36/01.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/29bcbd03f5cecc6c9fe1bcd3d13f2bc6/222b7/01.png 163w,
https://hfai-static.high-flyer.cn/static/29bcbd03f5cecc6c9fe1bcd3d13f2bc6/ff46a/01.png 325w,
https://hfai-static.high-flyer.cn/static/29bcbd03f5cecc6c9fe1bcd3d13f2bc6/a6d36/01.png 650w,
https://hfai-static.high-flyer.cn/static/29bcbd03f5cecc6c9fe1bcd3d13f2bc6/e548f/01.png 975w,
https://hfai-static.high-flyer.cn/static/29bcbd03f5cecc6c9fe1bcd3d13f2bc6/302a4/01.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，对 LLaMA-2 预训练模型经过对话用例微调之后，由人反馈参与的 RLHF 持续提升模型的能力，其打标流程主要有如下几个步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;标注者写一个 prompt&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;调用模型，随机参数，生成两个回答：response_1, response_2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;标注者针对这两个回答标注如下信息：&lt;/p&gt;
&lt;p&gt;a. 哪个回答更好：response_1 或者 response_2&lt;/p&gt;
&lt;p&gt;b. 好的程度：非常显著的好，好一点，不确定（忽略不计的好）&lt;/p&gt;
&lt;p&gt;c. response_1 是否安全&lt;/p&gt;
&lt;p&gt;d. response_2 是否安全&lt;/p&gt;
&lt;p&gt;e. 哪个回答更安全：response_1 或者 response_2&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最终每一条标记数据组织成如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&apos;prompt&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;P&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 如果是多轮对话数据，则除了最后一轮的回答，前文的问题和回答都在prompt里&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&apos;response_1&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;R1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&apos;response_2&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;R2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&apos;chosen_response&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&apos;prefer_degree&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;significantly better&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;better&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;slightly better&apos;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;negligibly better/unsure&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&apos;response_1_safe&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;yes&apos;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;no&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&apos;response_2_safe&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;yes&apos;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;no&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&apos;safer_response&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;

&lt;span class=&quot;token string&quot;&gt;&apos;打分人&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; xxx&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&apos;response_1_model&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; model_name1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&apos;response_2_model&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; model_name2，
&lt;span class=&quot;token string&quot;&gt;&apos;标注时间&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; date&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token string&quot;&gt;&apos;标注的超参&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;最长生成长度&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; max_len
    &lt;span class=&quot;token string&quot;&gt;&apos;temperature&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; temperature
    &lt;span class=&quot;token string&quot;&gt;&apos;多轮对话的超参&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这里，在调用模型生成两个回答时，LLaMA-2 会尽可能选择差异大的参数，使得生成的两个回答尽可能不同，方便用户进行准确的打标反馈。&lt;/p&gt;
&lt;h2 id=&quot;写-prompt-以及打分的思路&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%86%99-prompt-%E4%BB%A5%E5%8F%8A%E6%89%93%E5%88%86%E7%9A%84%E6%80%9D%E8%B7%AF&quot; aria-label=&quot;写 prompt 以及打分的思路 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;写 Prompt 以及打分的思路&lt;/h2&gt;
&lt;p&gt;为了让 RLHF 训练能更有效的提升模型的能力，LLaMA-2 论文里提到了若干 Prompt 构造以及打分的 Tips。&lt;/p&gt;
&lt;h3 id=&quot;对抗-prompt-的编写&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%AF%B9%E6%8A%97-prompt-%E7%9A%84%E7%BC%96%E5%86%99&quot; aria-label=&quot;对抗 prompt 的编写 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;对抗 Prompt 的编写&lt;/h3&gt;
&lt;p&gt;除了正常用户交互的 Prompt，为了产生更多具有代表性的数据，LLaMA-2 会让标注者写了一些有对抗性的 Prompt：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Risk category：可能会让 LLM 产生不安全内容的话题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;非法和刑事活动（例如恐怖主义、盗窃、人口贩运）&lt;/li&gt;
&lt;li&gt;仇恨和有害活动（例如，诽谤、自残、饮食障碍、歧视）&lt;/li&gt;
&lt;li&gt;不合格的建议（例如，医疗建议、财务建议、法律建议）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Attack vector：可能让 LLM 产生错误行为的提示：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;心理操作（例如权威操作）&lt;/li&gt;
&lt;li&gt;逻辑操作（例如错误前提）&lt;/li&gt;
&lt;li&gt;句法操作（例如拼写错误）&lt;/li&gt;
&lt;li&gt;语义操作（例如隐喻）&lt;/li&gt;
&lt;li&gt;视角操作（例如角色扮演）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;对抗-prompt-的打分&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%AF%B9%E6%8A%97-prompt-%E7%9A%84%E6%89%93%E5%88%86&quot; aria-label=&quot;对抗 prompt 的打分 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;对抗 Prompt 的打分&lt;/h3&gt;
&lt;p&gt;对于上面写得对抗性 Prompt，模型需要按照下面的流程回答，才能算作好的回答：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先解决安全问题&lt;/li&gt;
&lt;li&gt;解释用户可能面临的潜在风险&lt;/li&gt;
&lt;li&gt;在可能的情况下尽可能提供其他有用信息&lt;/li&gt;
&lt;li&gt;避免负面的用户体验&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;负面的用户体验包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不要鼓励或者支持犯罪活动&lt;/li&gt;
&lt;li&gt;不要鼓励或支持用户自己或者对他人进行危险行为&lt;/li&gt;
&lt;li&gt;不要包含、鼓励或支持对用户或其他人的攻击性和辱骂行为&lt;/li&gt;
&lt;li&gt;不要包含、鼓励或支持明确的性别相关内容&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;其他细节&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%85%B6%E4%BB%96%E7%BB%86%E8%8A%82&quot; aria-label=&quot;其他细节 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;其他细节&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. 两个回答从什么模型来？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;两个回答（Response）由不同的模型变体、不同的生成温度（Temperature）生成，目的是增加回答多样性。&lt;/p&gt;
&lt;p&gt;但是需要注意的是，这里选择的模型，应该是正在训练的最新模型和上一版本的模型，以保证 Reward Model 是在最新的数据分布进行打分，给当前模型输出的打分足够准确。&lt;/p&gt;
&lt;p&gt;论文里把这个过程称为 Iterative reward modeling data，是保证 Reward 模型在最新数据分布上使用当前版本模型和上一个迭代版本的模型进行采样的关键，同时还可以进行两个版本模型的评估比较。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 为什么只生成两个回答？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;InstructGPT 是给定一个 Prompt 生成 K 个回答（K 通常为6左右），让标注者排序。与之对比，LLaMA-2 的标注方式有如下好处：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;相同标注量下，Prompt 多样性更高；&lt;/li&gt;
&lt;li&gt;同一个 Prompt，标注员的标注难度更低&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. LLaMA-2 数据量有多大？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;LLaMA-2 每周更新一次标注数据。如下表所示，每一行是一周新标注的数据，LLaMA-2 总共约有百万条自己标注的数据：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/adbb7a59002bb39f3e26eebfa59fcc9d/302a4/02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 55.21472392638037%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABiElEQVQoz13S266DIBQE0P7/rzVN2noFEaKtqYgIRhRvdZ9UGtOceXZljxNOUkqllJSSEJLn+fP5xBiHYZjnOaWUEOL7flEUlFK0pyiKJEniOMYYn4qiqOtaCMEY832fc+4+lVIKISiljLG+77XWCKGyLOd5zrIsCAIhxMlaO88zAIzjmCSJtdYYU9c1AGzblqap1hoA1nVljC3LAgBd11FKAeBkjJmmCQDatr1cLsMw9H3POXfY87yqqhzGGDustQ7D8D/2PM9a2/d90zSwJ45jKSUALMtCCFnX1WGE0Adba48yQRDYPUoph//VdrhtW8bY9/I4jgBQ1/X1erXWDsPgqm7bdlz+xUopjPEHt23bdR0AlGV5Pp/7PQ4DAELIjff7z03TRFH0vWyMAYCqqnzfH8dxGAZ3bds2Sqmr/X6/0zQ9MCHkg7s9AMA5v9/v0zQZY47Boig61s7z/BjsWztJErcKQuh2u3HOX69XlmXu2QVBkGWZ1loIgTEWQiilHo9HHMdN0/wB9x5lCQchYjQAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;02&quot;
        title=&quot;02&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/adbb7a59002bb39f3e26eebfa59fcc9d/a6d36/02.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/adbb7a59002bb39f3e26eebfa59fcc9d/222b7/02.png 163w,
https://hfai-static.high-flyer.cn/static/adbb7a59002bb39f3e26eebfa59fcc9d/ff46a/02.png 325w,
https://hfai-static.high-flyer.cn/static/adbb7a59002bb39f3e26eebfa59fcc9d/a6d36/02.png 650w,
https://hfai-static.high-flyer.cn/static/adbb7a59002bb39f3e26eebfa59fcc9d/e548f/02.png 975w,
https://hfai-static.high-flyer.cn/static/adbb7a59002bb39f3e26eebfa59fcc9d/302a4/02.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;表格含义如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;batch：第几周&lt;/li&gt;
&lt;li&gt;Num comparisons：有多少条数据，每一条数据如上文所述，包括了一个问题，两个回答，以及标注&lt;/li&gt;
&lt;li&gt;Avg Turns：平均对话轮数&lt;/li&gt;
&lt;li&gt;Avg Tokens：每条样本中的平均 Token 数量&lt;/li&gt;
&lt;li&gt;Avg Tokens in prompt：Prompt 里的平均 Token 数量&lt;/li&gt;
&lt;li&gt;Avg Tokens in response：Response 里的平均 Toekn 数量&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;总共 141w 条数据，但是每周都更换了生成回答的模型，这样来保证 Reward Model 学习的是微调后最新的生成结果。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 数据随时间的变化&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;由上表所示，每周标注的数据越来越多，这是因为标注者在不断的增加，他们也越来越熟练。同时对话轮数越来越多，增加了 Reward Model 学习的难度。&lt;/p&gt;
&lt;p&gt;Prompt 越来越困难。LLaMA-2 论文里提到，刚开始要求标注者问一些简单的问题，后面要求标注者问更难的问题。下图可以看到，越往后的时间，Response 得到的分数越低，因为问题更难：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/f958988883b58725a89394aba64fff37/23296/03.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 78.52760736196319%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAAACXBIWXMAAAsTAAALEwEAmpwYAAACvUlEQVQoz11SW0/bMBjt/xeaBqNA2R5242XTeIGtN1oGghVEW0ZL2tzaUpI4cXzJxU7SJGs7uYVp29GR/dn+zmf72IUszyF0fJ9/74PPrYluUOZHLgr/JsYhwUzEbohWQ4RCSlkhTVPoQs7iTz8mG1+l9+e6NMYUs5By5kXMjwKPuyi0nCD0Ip9yjNi6hBBnWUYojXly1LG2T7RiXdmqDg8uRsftx0rXOG5PD68fDi5G7860w+tJW4GuK04B3ZAQXqCUYoxZwMqtwdvy1eu6tN/UXlXlzcpwqzLcXLFYk3dPlM3q8GVl+PF8ZNp+6EUe5QUAACEk8EJLV92xdnTW3arrb5ra64a65v6KpRNFBE21WJdLDbXSNXSDFgCwMUZ+EGGSUD+zJw9fqudbVXWnoZeeqJQa2k5zXGpopYYosXuivPg2kCa4YJqm67q+x5AwMxCumtZN6/KgdrNT7u2Vf76qybvV+w/l1l7lbruu7DX1/YayU1fEzrZtU0qCIHp+A4ZJHFDuTMbqfV8bSL1Oe3h3a41HutSvnbX2Kz9LDa1Yk9VHKtyGEPo+h67YeUUfwgBhTmlECfcp872IeDPPS0JMbq5axbrwTzOIEGOMPY/dqo6sW51ObzAY9XrK3Z3c6d63233DcJF4W1EX4ZhAcnja2fgmq2YgPonjOJSGVOubo0m7Iw0GI0nS+33t9nbQ7UqmiTDm4jpY+EJoYsr31dPLx8ljYT5fpGk6ny+iOI3iWRzPoiiJItHGsSDncRzPOBdBGHKxmmR5zGchLSxXSJIEAMtxbNsGtgAA6962LcuCENo2sCwLY4wQchzbRRi66EkMIXSfgZ7xJ/4zDQAwDMM0zel0yhh7Ev+Hdd5aAQCAEGKMp9Mp53yxWPxaYblc/iNerLBcLvM8n81meZ5nWZamaZZl65n5fL5OWOM31mdL1YFlBAwAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;03&quot;
        title=&quot;03&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/f958988883b58725a89394aba64fff37/a6d36/03.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/f958988883b58725a89394aba64fff37/222b7/03.png 163w,
https://hfai-static.high-flyer.cn/static/f958988883b58725a89394aba64fff37/ff46a/03.png 325w,
https://hfai-static.high-flyer.cn/static/f958988883b58725a89394aba64fff37/a6d36/03.png 650w,
https://hfai-static.high-flyer.cn/static/f958988883b58725a89394aba64fff37/23296/03.png 675w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;而 significantly better 的标签量越来越少，而 unsure 的标签量越来越多，这是因为模型的性能在不断的提升，所以采样到的两个回答都是高质量的。如下图所示，时间越往后，显著好的标签量越来越少，好的微乎其微的标签量越来越多：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/9e79221e41a57a6fac489fd9c29f38eb/9a1cf/04.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.576687116564415%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAACRElEQVQozyVS2a6bMBTk/3+rUtWXJmQBwgWDbZbgc+xjYwwBkt5UaUej0bzOEr3f73XdEzbkhTwer2laJsmHaVqQCaf6cmMsPqbX69fhcMnzWqNXyill9/0Zvd/vbdttU4tKxnHa92jMpNFr7a2d4VY0TMZxcjqn2Y0lWSlaKEpRlnJ/viLnnPcPsot1i3PL6B6WAtFEFMhMdlyd3+y0WTNZ7alVOmMWRwJHOEbOjURBDRbRA06d0loHspvWi7ErDiMWLeQCEqZSBjeOHcG1xKxGAZH33tkH0Q4mxOXhyK8ZL3l8kpdUpnmTZCL/aioh+6HXrkPbAtVdxwdoFEbLvFY9y9JfxeFHL3LX8PYSJ0UWs+R0/pnw/NCV5646iPQiit/V9cyzS1Oksqz7LgrLCozx+CjyHDJxP2X6lrlOuKYZO2kbOUrupHBgSdEnqn06sFYHY5ZoCsGAJz1bt6oWoSPACQaEuwYMoAg/HjQvtKhM/aV5aepcC4a9ipZ5rjqb1npQo7Uz0WxMIJo/tZlJ64B6BgxoFjAL6gnviGZGGDXYKIRg7cw7eyig6Z3sXXt3zd0p8LL/qPu/mZnIeGuCMTOZyXxMiIiITNDoAfy5xDPDK8O4gEuJ5xKuFR6+IC4gqXRW66TWsnOFpFJa0dno9XqF8Jimxft5CY91WZ/787GsYV63dZvnTdvgp7XHURnfwli0mvVU91oZ/7nn6x/2ffv+/kZEKWXTNJzzQQ2DGrq2EYLf+66u2OTHP8/9uW/b+tj37S8168OJr8HBTwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;04&quot;
        title=&quot;04&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/9e79221e41a57a6fac489fd9c29f38eb/a6d36/04.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/9e79221e41a57a6fac489fd9c29f38eb/222b7/04.png 163w,
https://hfai-static.high-flyer.cn/static/9e79221e41a57a6fac489fd9c29f38eb/ff46a/04.png 325w,
https://hfai-static.high-flyer.cn/static/9e79221e41a57a6fac489fd9c29f38eb/a6d36/04.png 650w,
https://hfai-static.high-flyer.cn/static/9e79221e41a57a6fac489fd9c29f38eb/9a1cf/04.png 924w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. 多轮数据怎么标注？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;可以确定的是，多轮对话的数据体现在 Prompt 中，需要标注的是最后一轮的对话。但是构建多轮的 Prompt 论文没有详细提及，我们思考可以采用如下方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;用户写一个 Prompt：P1&lt;/p&gt;
&lt;p&gt;a. 单轮 Prompt：用户直接写&lt;/p&gt;
&lt;p&gt;b. 多轮 Prompt：用户先和非标注模型对话多轮，最后一轮再进行标注&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;生成：内部调用两个模型，生成 response_1，response_2&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;标注：用户标注哪个回答是更优的，以及更优的程度，被选择的回答标记为 R1&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这样标注数据的多样性得以保证，但是需要交互界面做一定的调整，让用户选择标注或者对话模式。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[深入浅出 GPT-4 的体系结构]]></title><description><![CDATA[GPT-4（Generative Pre-trained Transformer 4）是 OpenAI 发布的最新 GPT 系列模型。它是一个大规模多模态模型，相比 GPT-3.5 / ChatGPT，GPT-…]]></description><link>https://www.high-flyer.cn/blog/gpt-4/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/gpt-4/</guid><dc:creator><![CDATA[Vachel/小杞]]></dc:creator><pubDate>Thu, 27 Jul 2023 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;GPT-4（Generative Pre-trained Transformer 4）是 OpenAI 发布的最新 GPT 系列模型。它是一个大规模多模态模型，相比 GPT-3.5 / ChatGPT，GPT-4 可以接受图像和文本两种形式的输入，产生文本输出。输出依旧是一个自回归的单词预测任务。技术上，GPT-4 采用了专家混合（MoE）技术，进一步增强模型的能力。整体来说，GPT-4 在各种专业和学术基准上表现出了人类的水平，对于生成式的幻觉、安全问题均有较大的改善。&lt;/p&gt;
&lt;p&gt;本文将和大家一起深入探索 GPT-4 的架构和能力。&lt;/p&gt;
&lt;p&gt;论文地址：&lt;a href=&quot;https://arxiv.org/abs/2303.08774&quot;&gt;https://arxiv.org/abs/2303.08774&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;模型结构&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E7%BB%93%E6%9E%84&quot; aria-label=&quot;模型结构 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型结构&lt;/h2&gt;
&lt;p&gt;GPT-4 的体系结构由16个不同的专家模型组成，每个模型都有 111B 个参数，总计约 1.76 万亿个参数。除了更大的参数规模外，另一个重要的细节是 GPT-4 使用了专家混合（Mixture of Experts，简写为 MoE）架构，这意味着模型中的不同组件或“专家”协同工作，每个组件都有助于最终输出。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/acb239c23f63b5a55341a1d50096f21d/47311/01.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 73.61963190184049%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAQFAwb/xAAVAQEBAAAAAAAAAAAAAAAAAAADBP/aAAwDAQACEAMQAAAB6l/O3NUgUhg//8QAGRAAAwEBAQAAAAAAAAAAAAAAAQIDBAAi/9oACAEBAAEFAtN6rfXZ0jio1JXxXeoTwAB3/8QAGhEAAgIDAAAAAAAAAAAAAAAAAQIAIgMRMf/aAAgBAwEBPwE5krXkZgTsT//EABsRAAIBBQAAAAAAAAAAAAAAAAECAAMRISIx/9oACAECAQE/ARRbbPYqkCxn/8QAHRAAAgIBBQAAAAAAAAAAAAAAAQIAESEDBBITMf/aAAgBAQAGPwJwrmrmmQStiWWvMZk3XAHwdYNRQ2amBP/EABsQAQADAQADAAAAAAAAAAAAAAEAESExYXGh/9oACAEBAAE/ITexgvkRSdM3Ipc8W+iM4Xf1R7Cy2KtIbQB4n//aAAwDAQACAAMAAAAQA9//xAAaEQACAgMAAAAAAAAAAAAAAAABIQARMVFh/9oACAEDAQE/ECk6YarUOwUDP//EABoRAAICAwAAAAAAAAAAAAAAAAABESExcZH/2gAIAQIBAT8QR4s1exTZLP/EABoQAQEBAQEBAQAAAAAAAAAAAAERIQBBUXH/2gAIAQEAAT8QYA4AQTlL0ZVcO25xCM8N+GfvS6kBMyUv1vRkbRdQizy96VKAO//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;01&quot;
        title=&quot;01&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/acb239c23f63b5a55341a1d50096f21d/6aca1/01.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/acb239c23f63b5a55341a1d50096f21d/d2f63/01.jpg 163w,
https://hfai-static.high-flyer.cn/static/acb239c23f63b5a55341a1d50096f21d/c989d/01.jpg 325w,
https://hfai-static.high-flyer.cn/static/acb239c23f63b5a55341a1d50096f21d/6aca1/01.jpg 650w,
https://hfai-static.high-flyer.cn/static/acb239c23f63b5a55341a1d50096f21d/7c09c/01.jpg 975w,
https://hfai-static.high-flyer.cn/static/acb239c23f63b5a55341a1d50096f21d/47311/01.jpg 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;上图可视了采用 MoE 的 Transformer 层。在 GPT-4 中 Attention 的参数量有 55B，MoE 的参数量是  111B * 16，一共 120 层 Transformer。每个 token 会通过一个路由算法选择两个 MLP 进行计算，参数 seq_len 为 8k，每个 MLP 分到 1k 个 token。&lt;/p&gt;
&lt;p&gt;GPT-4 的模型宽度，深度基本和 GPT-3 (175B) 差不多，区别在于 MLP 的数量要多16倍。&lt;/p&gt;
&lt;h2 id=&quot;并行策略&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%B9%B6%E8%A1%8C%E7%AD%96%E7%95%A5&quot; aria-label=&quot;并行策略 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;并行策略&lt;/h2&gt;
&lt;p&gt;GPT-4 训练采用的并行策略是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;张量并行：8&lt;/li&gt;
&lt;li&gt;流水并行：16&lt;/li&gt;
&lt;li&gt;数据并行：196&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;总计使用约 3125 台机器（25000 张 A100）进行训练。其中 batch size 为 60M token，seq_len 为 8k。&lt;/p&gt;
&lt;p&gt;张量并行和流水并行包含了 GPT-4 完整的模型参数，其结构如下：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/481630be27f60dcc77e75f7e1b05f9aa/47311/02.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 57.668711656441715%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAAMABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAIBAwb/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAAB3KuqXEi//8QAGRAAAgMBAAAAAAAAAAAAAAAAARMCBBID/9oACAEBAAEFArIk/kJJrArsbfy2mtpf/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAIhAAAQIGAQUAAAAAAAAAAAAAAQACAwQRISIxUUFCQ4GC/9oACAEBAAY/ArCZ12EUT7TP0cvSuI2/JtYxXtHAon1ivJ5ssnudfqv/xAAeEAACAgICAwAAAAAAAAAAAAABEQAhQVFhoTFxwf/aAAgBAQABPyFC2EuTc38WEOrewHpiGPiDQ7ELijOwr1Cc9yT4J//aAAwDAQACAAMAAAAQMw//xAAVEQEBAAAAAAAAAAAAAAAAAAAAAf/aAAgBAwEBPxBH/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAIBABAAICAQQDAAAAAAAAAAAAAREhADGBQVFhoXGR8f/aAAgBAQABPxBTaKBq7G578ZX4RgT8gr764YiSVrBpp+sIAkySTDdr7yZRBijwoI8jjICqI7EFUHrP/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;02&quot;
        title=&quot;02&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/481630be27f60dcc77e75f7e1b05f9aa/6aca1/02.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/481630be27f60dcc77e75f7e1b05f9aa/d2f63/02.jpg 163w,
https://hfai-static.high-flyer.cn/static/481630be27f60dcc77e75f7e1b05f9aa/c989d/02.jpg 325w,
https://hfai-static.high-flyer.cn/static/481630be27f60dcc77e75f7e1b05f9aa/6aca1/02.jpg 650w,
https://hfai-static.high-flyer.cn/static/481630be27f60dcc77e75f7e1b05f9aa/7c09c/02.jpg 975w,
https://hfai-static.high-flyer.cn/static/481630be27f60dcc77e75f7e1b05f9aa/47311/02.jpg 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;其中，张量并行通讯耗时占比小于 15%，PipeDream 流水线气泡占比 28% 左右，Interleaved 1F1B 流水线气泡占比 16% 左右。&lt;/p&gt;
&lt;h2 id=&quot;专家并行&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%B8%93%E5%AE%B6%E5%B9%B6%E8%A1%8C&quot; aria-label=&quot;专家并行 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;专家并行&lt;/h2&gt;
&lt;p&gt;专家混合（Mixture of Experts，简写为 MoE）是一种在模型增强的道路达到极限时采用的实用方法。运作原理很简单——由更简单的模型或“专家”组成一个小组，每个模型或专家都针对数据的特定方面，然后利用他们的集体智慧。&lt;/p&gt;
&lt;p&gt;在实践中，这就像处理一项复杂的任务。比如建造一所房子会招聘建筑师、工程师和室内设计师等专业人士，每个人都有自己独特的专业知识。类似地，MoE模型由多个“专家”组成，每个专家都精通某个特定领域，协作以提供增强的结果。如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/f7662aec05bd44800b77700796f4e0ed/d54e4/03.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 31.288343558282207%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAAsTAAALEwEAmpwYAAABPUlEQVQY01XQyW6CQACAYd7VU30iYtLYQ9ObSU0aYy8uaU1IuqiApYLAADIyMsOwDYvEmaa39n+BL/kl8ScuRMd52zSGYaQ0vQp+FULkXo0MEIRB4AcQHjwfHAPX95M0kzjnQgiMMU6orSieojDGzP0+Jkmo6fZ8nmU5SWhTN3XXHSYTXZa/h0Ndlt3pVPoFuQD2HpkLdzwC4zEXAkXoZK286ci6fxD8ClHsbZ4LGpi3d0+93uNNf9bvfw0GkmaCV81ZrveLD90/ExDhF9VebszZm2aH6IiTleYsN9biXd+abkUwsSy426WOkyMkkYSYlrlV1RM6Y4wJIcADn+s1RIhSiuMYeN5WVf1jGEJYMJZVVVoyWpY5Y1LbNEWRwzDMs+zStt3lUhZFFJ0oTdqm6bqOlQWEYZrSuq7+zxU/YqI+k+6QA8AAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;03&quot;
        title=&quot;03&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/f7662aec05bd44800b77700796f4e0ed/a6d36/03.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/f7662aec05bd44800b77700796f4e0ed/222b7/03.png 163w,
https://hfai-static.high-flyer.cn/static/f7662aec05bd44800b77700796f4e0ed/ff46a/03.png 325w,
https://hfai-static.high-flyer.cn/static/f7662aec05bd44800b77700796f4e0ed/a6d36/03.png 650w,
https://hfai-static.high-flyer.cn/static/f7662aec05bd44800b77700796f4e0ed/d54e4/03.png 747w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;对于 MoE 模型进行并行训练，这里可以做一个初步的估计：按照目前最大的 8 路张量并行，16 路流水线并行计算，每个 GPU 上的参数量是 14B，假设用 FP32 的梯度，则参数和梯度需要占用 84 GB 的显存，目前市面上还没有能完整放下显卡。因此，GPT-4 大概率会使用专家并行（Expert Parallelism）技术来节省显存占用。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/f0427f836f96964adca62366de253fcf/47311/04.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 117.17791411042946%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAAXABQDASIAAhEBAxEB/8QAGQABAQEAAwAAAAAAAAAAAAAAAAQBAwUG/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAIDBP/aAAwDAQACEAMQAAAB9zlnBk16rUn19gyxgP/EABgQAAMBAQAAAAAAAAAAAAAAAAECAwQT/9oACAEBAAEFAm0LZMs5MktoorogWHUBJxAnkIGaJnnhlKJ//8QAHREAAQQCAwAAAAAAAAAAAAAAAQACAxESISIxgf/aAAgBAwEBPwGxjw16iY70E6Z7u0Z3k2v/xAAdEQACAgEFAAAAAAAAAAAAAAAAAQIDIRESIjFB/9oACAECAQE/AdHu5ZErPWRpjHoVMFg//8QAHxAAAQMFAQEBAAAAAAAAAAAAAQACEQMSEyEiMUFR/9oACAEBAAY/AqoLTDN+rK0P1+uU2FPxNYXH3ajFTFP7DlyGwq/Q7VkqLgv/xAAbEAEAAwEBAQEAAAAAAAAAAAABABEhMXFBYf/aAAgBAQABPyEf8bVS6ZQYWoI8lEBtdnw7i4T9lJt9XeykedA5wUZzYiYVvfY+SW3yf//aAAwDAQACAAMAAAAQiBB9/8QAHBEAAgICAwAAAAAAAAAAAAAAAREAIUFhMZHw/9oACAEDAQE/ELoYHpi6eY6avbgUguSD1UMiM//EAB0RAAICAQUAAAAAAAAAAAAAAAERACFBMVFhkfD/2gAIAQIBAT8QqHFs81axFAl+4hIENAu7g1BP/8QAHhABAAICAgMBAAAAAAAAAAAAAQARITFBYXGRwVH/2gAIAQEAAT8Q2yyKuGE1qHipFbyiAiYG/A/ncd6NKaxnpzHaWZoDt6icFN5CX7i5SuZyP2Wk30KPKLKcrwD5P//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;04&quot;
        title=&quot;04&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/f0427f836f96964adca62366de253fcf/6aca1/04.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/f0427f836f96964adca62366de253fcf/d2f63/04.jpg 163w,
https://hfai-static.high-flyer.cn/static/f0427f836f96964adca62366de253fcf/c989d/04.jpg 325w,
https://hfai-static.high-flyer.cn/static/f0427f836f96964adca62366de253fcf/6aca1/04.jpg 650w,
https://hfai-static.high-flyer.cn/static/f0427f836f96964adca62366de253fcf/7c09c/04.jpg 975w,
https://hfai-static.high-flyer.cn/static/f0427f836f96964adca62366de253fcf/47311/04.jpg 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;模型能力&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E8%83%BD%E5%8A%9B&quot; aria-label=&quot;模型能力 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型能力&lt;/h2&gt;
&lt;p&gt;GPT-4 做的这些改进效果是显著的，相比前代 GPT-3.5/ChatGPT，他具备了新的能力：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;具有图像理解能力，突破纯文字的模态，增加了图像模态的输入&lt;/p&gt;
&lt;p&gt;如下图所示的例子，GPT-4 可以根据图标，计算格鲁吉亚和西亚的日均肉消耗量：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/9961129e0adeb0792395bc0f64623e6a/37523/05.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 109.20245398773005%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAYAAADAQbwGAAAACXBIWXMAAAsTAAALEwEAmpwYAAADtElEQVQ4y3VV247bVBTNB8AL9AWJb0BIfAL/gCqkPgBCSCAeERKoD1SIlo6GAcFwqYoGEBqQ4A1KOy3wgkTicW6+JE4mySTETez4ljhxJhfbWWjvxJlMZ7qlneOznbPO2mufs53SNA35fB6KoiArZiHLMs8lSUKxSF6EKIpoNBoYDofo9/tn3HEcdtd1MRgMkDKMLmzbhmPbSKfTkGQJhUIBiqowWKGQhyBkeMNqtQpFkVGr11GpaGi1mmi322i1WtB1nTdIYW0L9Ho99CwLhmnC6PXQ6XbxsNPhkeYU7xgGLMdGW3+IUrWBKI6xWCwQr8YU/SQBAvNsGyOib9sIvD5GnofA8zAbBcB8jngyBcIQ8XSOB3+lMaE50VkseEwlDwQ4DgLIuo475RIOKhoONA33tDLuVyvL+crvamVk9PZpbitSzDAJRCvg9//+E09sf4xnv/gUz3y+w35pZwtPbd/E09s3cemTLTy5dR3PffMlTN9fklmBnWNI9kCr4Opvd/DRvfv48O4B+9eHAr6Titgr5rFXLOB2IYdfyiVMw/AMwzVgoiHZDz//jsuvvYdX376GV976AFfeuIqqVsfjLAFKLPXoDv/8K2Jndw9f3d7H7q0fsfvtT2h1DH43jyKEccyeVPdChpxyGILq1dz/DMKVF5B780VkXn4e/31/Y7kois6Iv+nnqswp0wIArT/2kXn3MrLXXkf6nZdQ+/UWx+MoZFk2/dEKr6ucGP1pNg8xDSNM5yHm8enuCchiEa8P8UWWOjk5AfkijjEaDRGMRhiPxwiCgJ9pHG2MdJ/PPQfL97PZDCm6f3SpaVIulVBSVWhaGbXaETcIwzT48nueB891YVkW/991HL6q1AcoZtsWg6ZOyx9zx7BsmxcPfJ/nXr/PGRAbAh74A44TkQtT3jyH1Fm440hFiFkRgnCIXD7H3adUUrnjHB83Ua/XcXRUhWEYiKLoPCBZGIacArEzTROW1YNpGOh2uxyndMIoYraz6RTT6WStZaI5a5gATiYTKLKEtt5GrVZjHRsNYnKESqXCrKgflstl7pO63uaN15ub5lLDBHA8DpDJpBmAu3cui2KhgLKmcRcnOShO4LSYm7LjwHYc7pm9nsnsNwDHEAQBqqpAPBQgSTIORZG1pE9CPp9Ds9lCv++xLI+zUw2jEMOhz0eiPxjwBr7vsw9Wc6os6UmfDYqRU/X5GLkey3ZGQ/pgNY4bfP5UReEUZVmCqqrsdN4c14XvD1iv5fl0mQg9U8r/AzXVVKN9WLLWAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;05&quot;
        title=&quot;05&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/9961129e0adeb0792395bc0f64623e6a/a6d36/05.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/9961129e0adeb0792395bc0f64623e6a/222b7/05.png 163w,
https://hfai-static.high-flyer.cn/static/9961129e0adeb0792395bc0f64623e6a/ff46a/05.png 325w,
https://hfai-static.high-flyer.cn/static/9961129e0adeb0792395bc0f64623e6a/a6d36/05.png 650w,
https://hfai-static.high-flyer.cn/static/9961129e0adeb0792395bc0f64623e6a/37523/05.png 720w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;支持更长的上下文窗口&lt;/p&gt;
&lt;p&gt;如之前所描述的，GPT-4 的 seq_len 为 8k，是 ChatGPT 上下文长度的2倍。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;复杂任务处理能力大幅提升&lt;/p&gt;
&lt;p&gt;在多类考试测验中以及与其他 LLM 的 benchmark 比较中发现，GPT-4 在更复杂、更细微的任务处理上，回答更可靠、更有创意。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;改善幻觉、安全等局限性&lt;/p&gt;
&lt;p&gt;LLM 的生成模式不可避免会有一些幻觉问题。GPT-4 在测试中发现其可以显著减轻在各类任务上幻觉问题，比最新的 GPT-3.5 模型提高 40% 左右。同样在安全能力的升级上，GPT-4 明显超出 ChatGPT 和 GPT3.5。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[CC_Cleaner：一种丝滑高效且易扩展的数据清洗流程]]></title><description><![CDATA[AGI 是数据 x 算法 x 算力的完美实践，是科研 + 工程 + 组织的优雅艺术。而在大模型训练的前置阶段，大数据的清洗是数据处理的基础。 以 Common Crawl 数据集为例，它可以轻松地在 Amazon 上获取到，是一个免费的、规模达到 PB…]]></description><link>https://www.high-flyer.cn/blog/cc_cleaner/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/cc_cleaner/</guid><dc:creator><![CDATA[WT/XT/MC]]></dc:creator><pubDate>Thu, 06 Jul 2023 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;AGI 是数据 x 算法 x 算力的完美实践，是科研 + 工程 + 组织的优雅艺术。而在大模型训练的前置阶段，大数据的清洗是数据处理的基础。&lt;/p&gt;
&lt;p&gt;以 Common Crawl 数据集为例，它可以轻松地在 Amazon 上获取到，是一个免费的、规模达到 PB 级别的网络爬虫数据集，其包括了超过 12 年间收集到的数据：原始网页数据（WARC）、元数据提取（WAT）和文本提取（WET）。如何对庞杂的原始数据进行清洗，得到高质量的数据集是一个值得研究的问题。本文将为大家介绍幻方基础研究实践优化后的数据清洗流程: cc_cleaner。&lt;/p&gt;
&lt;h2 id=&quot;概述&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A6%82%E8%BF%B0&quot; aria-label=&quot;概述 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;概述&lt;/h2&gt;
&lt;p&gt;FaceBook 在《CCNet: Extracting High Quality Monolingual Datasets from Web Crawl》工作中提出了从 WET 数据出发，清洗得到高质量数据集的流程。我们在此基础上做出了一些改进，提出了一种更为灵活、高效、强可拓展性的数据清洗流程，实现了更适合萤火集群的 cc_cleaner，其主要流程如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/694fd5e008f5fb1f3745bedb4655888f/302a4/01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60.73619631901841%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAA7DAAAOwwHHb6hkAAACNklEQVQoz33T207bQBCA4bz/w/SmRaIcRRFUqkqBoCTOiSTOem2vT3Hs+Gz/VZYSwk1XGo21Hn1ezax7AF3X7RNVVdF1LdBS17XOWZbRtDVlWVJWJUVZkGc5ylNYloVlS7I809F0Hb13LEwqVqZASoUpPNamiS1DLGlhLWyM0ZipMUGtXVzlEkjF/PUVX0gcSzKfTsn9kF7TvoHf7iUr6TM0HC5vTbabiJuLGXmdM7kxcdcBgalY3y/Iyozljz7KUYjJHGVJit2O1FYf4Nc7iWkHGBPF1d2aNNlq0I8UxvUCJQLCtcfo9AU/8hG/DIpdxsPjI77va2MvHcDL3y6WGzIcf4BX3ycspEP/bI4vQmJvgzOwSPOU0WCo+5wmqe7v+ywO4M2TQqojcBtzfTZDKJeX8xnBOkLYgsFwoOv3yHv/jwf7CbS9SIPXd4JdsuXy1CBKAoyrJaZhsTQXPD89fwL2+fj5AJ78lCyFYjRWnN8s2cYbLk/HhHHI6kES2htMsaLf7+v6tm0P2HH0muYN/PJDMJqtMSYeJxczosDn9npOUZQ8PT0Sx7FG9nfwf6vX/jvhn7GPCmIs6TF9dSmKDNtWlFWB4ziku1SDTdvoC97UDVVV6sFUdaVj/77XNI0euxQWKhUkZURZ77C2C/0hK57rHGQO2zykrPPDnojn+i8KMpco895OWBQFnqdYLUy8nWRXJVRNiZ2sdIGdLGm7ljBTpGVM1ZZ6b79ksqDtGja5R1wEGvwLOJGJ9Qwv4YIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;01&quot;
        title=&quot;01&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/694fd5e008f5fb1f3745bedb4655888f/a6d36/01.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/694fd5e008f5fb1f3745bedb4655888f/222b7/01.png 163w,
https://hfai-static.high-flyer.cn/static/694fd5e008f5fb1f3745bedb4655888f/ff46a/01.png 325w,
https://hfai-static.high-flyer.cn/static/694fd5e008f5fb1f3745bedb4655888f/a6d36/01.png 650w,
https://hfai-static.high-flyer.cn/static/694fd5e008f5fb1f3745bedb4655888f/e548f/01.png 975w,
https://hfai-static.high-flyer.cn/static/694fd5e008f5fb1f3745bedb4655888f/302a4/01.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;相较于 cc_net，幻方 cc_cleaner 具有以下优点/特点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;更为完整的流程&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;相较于从 WET 出发的 cc_net，幻方 cc_cleaner 从原始的 WARC 文件出发，提供了更加完整的数据 pipeline&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;扩展性更高、流程配置化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据清洗步骤中的算法、模型均可进行配置（如图所示），采用模块化方案，用户要自定义算法也只需继承原有函数，给定一个配置文件即可定义整个数据清洗流程&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;任务流程无感知&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;适配了萤火集群，任务被打断重启之后，不会重复处理数据，无需额外异常处理&lt;/li&gt;
&lt;li&gt;自动进行任务分配，能方便地进行水平扩容&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;速度更快&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于高速文件系统 3fs（高达 7TB/s 读取，500GB/s 写入），大大提高了文件处理的效率&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;文本预处理&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%96%87%E6%9C%AC%E9%A2%84%E5%A4%84%E7%90%86&quot; aria-label=&quot;文本预处理 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;文本预处理&lt;/h2&gt;
&lt;p&gt;不同于 cc_net，我们的 cc_cleaner 从原始的 warc 数据开始做处理，通过 URL 过滤、文本抽取两步之后，生成对应的 WET 文件。其中 URL 过滤我们使用了一个包含 4.6M 个域名的黑名单，去除了包含欺诈/色情内容的网页。&lt;/p&gt;
&lt;p&gt;清洗之后的 WET 文件在之后流程的使用中并不方便，为了更快、更方便地处理数据，我们为每一个 WET 文件生成了对应的 meta 文件，用于存储 WET 的信息摘要，其中包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;原网页 URL&lt;/li&gt;
&lt;li&gt;标题&lt;/li&gt;
&lt;li&gt;对应 WET 文件路径&lt;/li&gt;
&lt;li&gt;Data index（指明该 meta 对应的文件内容位置、长度等）&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;可以看到，meta 文件是 WET 的索引，通过更新 meta 中的内容，我们就可以实现对原始 WET 文件的修改、删除等操作。在生成 meta 文件时，我们会顺便生成文本的 minhash 用于去重，对于每一个文本，会生成一个 128 位的 int64 hash 值。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/3852bf13bb8ac36df58f504a168c1418/0f79a/02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 71.16564417177914%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAABVUlEQVQoz5VRAYokIQz0/788uJ7uaY1GY6JR2z2c3oNjWY6dEgMpKVJWDBHVUj/+ovVZ2lXbZJ2iU/sUvaTN0mZtM9ertMXXdo3RzXmezkHv/RZr68SFskQSTDkSR5L0ainLfsKv349tP63zpRRjnX08DlW9xaP3WmsRKSKcM3MWkbIaXvfF1FrO45mZDcYYvP94E0S0xNbZgPjlbc551xvL0biqKnh4nk8MAQByZoOIkVLv7f+jxhiZWV4nhHAcBzMbANj2hbdsOwAiWrath5RSTLG1NsZARBEJiKqKiCxCRKqaUqq14ItX1abNhBDAgWrtY/z7z+sbfJJzzpzzWpUDOPadiK7r+onhOz8AcA5MjBHDcvKWmIgRo/Eetm1LKd3sTwNzLoRgfPD7cXgf3ko7RvxclbWWiO7JvXciYpFSKxG1pjHFWjXzSqiUQjmrqpQy+vgDb7Qwh93ww1AAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;02&quot;
        title=&quot;02&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/3852bf13bb8ac36df58f504a168c1418/a6d36/02.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/3852bf13bb8ac36df58f504a168c1418/222b7/02.png 163w,
https://hfai-static.high-flyer.cn/static/3852bf13bb8ac36df58f504a168c1418/ff46a/02.png 325w,
https://hfai-static.high-flyer.cn/static/3852bf13bb8ac36df58f504a168c1418/a6d36/02.png 650w,
https://hfai-static.high-flyer.cn/static/3852bf13bb8ac36df58f504a168c1418/0f79a/02.png 689w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;center style=&quot;font-size:12px;color:#C0C0C0&quot;&gt;生成出来的 meta&lt;/center&gt;&lt;br/&gt;
&lt;h2 id=&quot;去重&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%8E%BB%E9%87%8D&quot; aria-label=&quot;去重 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;去重&lt;/h2&gt;
&lt;p&gt;对于文本预处理中生成的每一个 meta 文件，有一个 128 位的 int64 hash 值，我们利用这个 hash 值进行去重。另外，cc_cleaner 的预处理内置了按行去重的功能，开启后将在处理 meta 时就把重复的行提前去掉。&lt;/p&gt;
&lt;p&gt;对于 url page 的去重，首先按照去重率要求对 128 位 hash 进行分块，对于每一块 hash 的去重都是一个独立的任务，可以并行进行操作。cc_cleaner 会将每一块 hash 按照资源总量再次进行分配（例如 10 节点 * 256 核，就模 2560 进行二次分片），从前向后遍历数据，hash 相同的数据认为是重复的，并记录重复数据 index。之后将每块中记录的重复 index 从 meta 中删除，生成新的 meta，就实现了全局的去重。&lt;/p&gt;
&lt;h2 id=&quot;语言分类&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AF%AD%E8%A8%80%E5%88%86%E7%B1%BB&quot; aria-label=&quot;语言分类 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;语言分类&lt;/h2&gt;
&lt;p&gt;语言分类是对 WET 数据使用语言分类器进行分类，cc_cleaner 内置了 cc_net 使用的 fastText 分类器，用户也可以指定其他的分类器。通过遍历 meta 可以读取到原始的网页内容，对网页内容进行 lid 打分后，保留得分最高且大于 0.5 的 3 个分类，记录进 meta。如果没有语言得分超过 0.5，那这个数据将会被丢弃。&lt;/p&gt;
&lt;h2 id=&quot;质量清洗&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%B4%A8%E9%87%8F%E6%B8%85%E6%B4%97&quot; aria-label=&quot;质量清洗 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;质量清洗&lt;/h2&gt;
&lt;p&gt;在抽取文本数据、去重并确定了网页数据的语言之后，仍然需要对文本进行一定的清洗来提高质量，称为质量清洗。幻方 cc_cleaner 内置了 cc_net 使用的 perplexity，这是一个在高质量数据上训练好的打分器，用来对 tokenize 之后的数据进行困惑度打分。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 592px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/f0247370b08b8f898b99ec43a404a0c8/1b853/03.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 65.6441717791411%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAABwklEQVQoz3WSyW4bQQxE/R+a3rvJXtjbbB5LiSxZpyBIjvn/Twk0kBHETgo88PLAYqGeuJAaYsm0Hpe2Lr6Moa/0fPbUMHdfR+eTQTJWs2F4DGN81xPnXDDmU5vffs63H/Pbt9DmML6005WWI6SstVLGGmuNNcqCdqC1Fn9gKUPrtE6hdV9niNkCIFWfO6aSagnjVqaee8UyhTYBguDsAUul09zyQjR3iGQDhZxin2OtVNDX1YXkqIU+W83Z4fC3bSnjNNJcQksQE6TqImFuofaYyUDwbYm1SXF4QO/aYSFdIOeTNmBDktpo67QDA2idU9oaDBZQCM7/CYe+1OM1TS8+V6yjlGoYDnu27K595/wfsFAGAR0goEdAxESC3xNh78P5vgyMDewjrDGM27Kd+vk8vl5KJCukkFoow7UVSnOhuHLKgFJWfrLNue+1HCffYn5uacmQXByJllKPY976dKQ8WV8Bovn8s8h1efn+a/p6q9t5+nItz6/9dC3bpZ5uZbusl1ueV2mTSy32BalhQIf2AXPGLEYfQiaXM/i2UG+c38vI90Le/e1pCyk/Xk4uRYiOWutUaywljNVKMXAu+P/1G6srdVe557itAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;03&quot;
        title=&quot;03&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/f0247370b08b8f898b99ec43a404a0c8/1b853/03.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/f0247370b08b8f898b99ec43a404a0c8/222b7/03.png 163w,
https://hfai-static.high-flyer.cn/static/f0247370b08b8f898b99ec43a404a0c8/ff46a/03.png 325w,
https://hfai-static.high-flyer.cn/static/f0247370b08b8f898b99ec43a404a0c8/1b853/03.png 592w&quot;
        sizes=&quot;(max-width: 592px) 100vw, 592px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;center style=&quot;font-size:12px;color:#C0C0C0&quot;&gt;lid+困惑度打分示例&lt;/center&gt;&lt;br/&gt;
&lt;p&gt;除此之外，cc_cleaner 还提供了以下清洗流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Document-level 过滤规则，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;丢弃单词数不在 50~100000 之间的文档&lt;/li&gt;
&lt;li&gt;丢弃平均单词长度不在 3~10 之间的文档&lt;/li&gt;
&lt;li&gt;丢弃“符号-单词”比例大于 0.1 的 （’#’ 和 ’…’ 符号）文档&lt;/li&gt;
&lt;li&gt;丢弃超过90%的行以 ‘•’ 开头或超过 30% 的行以 ’…’ 结尾的文档&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;line-level 过滤规则，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;丢弃主要包含大写字母的行&lt;/li&gt;
&lt;li&gt;丢弃只包含数字的行&lt;/li&gt;
&lt;li&gt;如果行的内容是一个计数（例如：转发 12次 评论 5条 点赞 30个）就丢弃&lt;/li&gt;
&lt;li&gt;丢弃只包含一个单词的行&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;小结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%B0%8F%E7%BB%93&quot; aria-label=&quot;小结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;小结&lt;/h2&gt;
&lt;p&gt;通过上述流程，我们就生成了可以最终的 meta 数据，只需要通过 meta 数据读取原本的 wet 数据，进行 tokenize 之后就可以生成用于大语言模型训练的数据。可以发现，我们除了生成 wet 数据的文本提取步骤，其余的步骤都是对远小于原始数据的 meta 文件进行操作，用到的分类器、语言模型等均可以进行配置，这大大降低了研究人员修改数据清洗流程生成数据集的难度、时间。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[HAI-LLM：高效且轻量的大模型训练工具]]></title><description><![CDATA[为了更好地发挥 GPU 集群的计算能力，训练具有惊人功能的、强大的万亿参数模型，一个高效简洁的大模型训练工具十分必要。幻方-基础研究最近研发了一款深度学习训练工具，名为 HAI-LLM，其实现了四种并行训练方式：ZeRO…]]></description><link>https://www.high-flyer.cn/blog/hai-llm/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/hai-llm/</guid><dc:creator><![CDATA[High-flyer]]></dc:creator><pubDate>Tue, 27 Jun 2023 11:00:00 GMT</pubDate><content:encoded>&lt;p&gt;为了更好地发挥 GPU 集群的计算能力，训练具有惊人功能的、强大的万亿参数模型，一个高效简洁的大模型训练工具十分必要。幻方-基础研究最近研发了一款深度学习训练工具，名为 HAI-LLM，其实现了四种并行训练方式：&lt;strong&gt;ZeRO 支持的数据并行、流水线并行、张量切片模型并行和序列并行&lt;/strong&gt;。这种并行能力适应了不同工作负载的需求，可以支持数万亿规模的超大模型并扩展到数千个 GPU。基于萤火集群的特性而自研的 haiscale 高性能算子，可以帮助 HAI-LLM 极大优化大模型训练的&lt;strong&gt;显存效率和计算效率&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;本文将为大家介绍 HAI-LLM 工具的背后技术和使用方式。&lt;/p&gt;
&lt;h2 id=&quot;显存与计算效率&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%98%BE%E5%AD%98%E4%B8%8E%E8%AE%A1%E7%AE%97%E6%95%88%E7%8E%87&quot; aria-label=&quot;显存与计算效率 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;显存与计算效率&lt;/h2&gt;
&lt;p&gt;首先，我们先了解训练巨大模型的显存和计算效率的挑战。&lt;/p&gt;
&lt;h3 id=&quot;显存效率&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%98%BE%E5%AD%98%E6%95%88%E7%8E%87&quot; aria-label=&quot;显存效率 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;显存效率&lt;/h3&gt;
&lt;p&gt;训练万亿参数模型所需的显存远远超出了单张 GPU 的显存大小。在使用 Adam 优化器进行混合精度训练时，存储模型状态量（参数、梯度和优化器状态量）就需要约 12TB 的显存。作为比较，使用有 40 GB 的显存的英伟达 A100 GPU 训练大模型，仅仅为了存储模型状态，就需要 400 张这样的 GPU。&lt;/p&gt;
&lt;p&gt;模型前向传播过程中会保存中间激活值，直到反向传播计算完 Loss 后才释放，这种额外消耗的显存会随 batch 大小而增加。假设 batch 设置为 1 的情况下，训练万亿参数模型就会产生超过 400 GiB 的激活显存。即使可以用 Checkpoint 方式（计算换显存）提前处理掉激活显存，但是对于训练而言，显存需求仍然非常之高。&lt;/p&gt;
&lt;p&gt;必须在多个 GPU 设备之间有效地划分模型状态量和激活显存，才能让这种大模型在不耗尽显存的情况下开始训练。&lt;/p&gt;
&lt;h3 id=&quot;计算效率&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AE%A1%E7%AE%97%E6%95%88%E7%8E%87&quot; aria-label=&quot;计算效率 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;计算效率&lt;/h3&gt;
&lt;p&gt;经估算端到端训练一个万亿参数的模型大约需要 5000 Zflops（即 5 后面带有 24 个零；这个估算结果基于 OpenAI 的研究《law of scaling》。这意味着训练这样一个模型需要 4000 张 A100 以 50％ 的计算效率运行大约 100 天。&lt;/p&gt;
&lt;p&gt;尽管大型超级计算 GPU 集群可以拥有超过 4000 个 GPU，但是由于 batch 大小的限制，要在这种规模上实现高计算效率仍然是一项挑战。计算效率随着计算时间对通信时间的比例的增加而增加。该比例与 batch 大小成正比。但是，训练模型的 batch 大小有一个上限：超过这个上限收敛情况会明显变差。&lt;/p&gt;
&lt;p&gt;实际上最大的模型之一，GPT-3 的训练 batch 大小约 1500。如果使用大约 4000 张 GPU，即使我们可以自由设置 batch 大小为 4000，每张卡上的 batch 大小也只有 1，这将影响扩展性。&lt;/p&gt;
&lt;h2 id=&quot;3d并行&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3d%E5%B9%B6%E8%A1%8C&quot; aria-label=&quot;3d并行 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3D并行&lt;/h2&gt;
&lt;p&gt;设计高效的并行方式对训练大模型至关重要。HAI-LLM 结合萤火集群的特性，可以实现三种并行训练方式的灵活组合：数据并行、流水并行、张量并行，并使用序列并行方式对 Transformer 进一步并行优化，极大地提升显存利用和计算效果。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 606px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/f8d2dbed5ae23b7c1a14716c2ea332c5/4d4a2/01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 57.668711656441715%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAADxklEQVQozwXBaUybdRwA4B+ZW0w0RhfjvEmciyZ+UGf2wWg0MS7xg1FhuoyCdJS2tCIDAsUN3CYDyjFK27e00Jce2JYVWloo0NKDFlp6jBYolxhwoIsIY8A4zJTFvv+fzwOlrS3wk1ELiJimX5kDOhro6J6Z+EeVGDuotdtUEf/8Yjg4nzJ2x0amm8Q1mzrlwbqyObUiYEmbvHNmg3/m8KY9cpDTbD2bK+kFKBbfAN/fm0csm6ugGnVT2sQ4ym778YrLjn3DsUdBbxJ7eqewT2p4uCavP9yQ1uGf3G/QLlPvSj1z2GiLIUflw0yJKyOj2Qmwjwjm2Tjo46FLxvkEdszGiMhtZ/oDUyQZXUWLLcFYFX3Mg/YWPFC34Dr3a8bfcJNRhVex1ZVk8tt8hKX03L+gdL17XuEEeIAIpokQTz8VwfZECH909zHdvihGA7+g1RImdnqI/K5oxi1FA/mjJJ8Ea2pQ4Z1DqSPOFKh9hCV1olzmsA3mSU54OBKALy/mvtIUG9mWTYzi5dBgqmHAjYGBGTLkmES1egzvNNTj3o0yvF9egItcFlZbY1hjT+Al3RjJUnqJqmWY6Su1YnuO9rOObA3AhxlfvF4d8WxWBT1YEnQw6v5BtJnjxNwVQZM+jHdrr+J6US5ucTJx8lollhlDWGoIEY7aj3KJi/SX21OdFw2oYevOanJ0AO98+tULVNQnHh7VkIC7GZOGEjLZ78DkyK8460qQDZWJrOpoXDF3YsDtJm3WAKE7QqihvMR+2ZbS5XSihqPV22jbs3W62iNQmJd18mCgxPvQXYn7Pdmpv0wlZDe+xOzFf2PWe6K4ND6Hs8vLzOTCAuN2etGv8JCQLMC4rg7+Z+J0YXsW3Wtg9MdElaIz5z4/9wQ0FWee3jKz/r1n/ha3NR/g3VuNZC2wihvD07imDzHxcPRRNBrBYGgUnT1Dh5ayXuwus6CRewt/5hjD8mvUi6JK0fu8PN5bgjwBwPXvz7+9Y2HP7vZydu9pPgmtWE2GnfE729v+ha3lNrc4ejtmTU5P74djkSUT1VXR/4Nj0VE1sGP6rishF1Hp5VXlHwm4gjd5XD4IC4QANNV41EVXpnvbSl+TiStOSJTDxx1a0ymzUncqt0z4HNVKvWowGN5op9UvC9nCJ+nqjnRttfakltY8VSEXHRPkC57n5/GhUFiYxmazAaimakB8BgD20tiljY+N1QJksC68xOPzPi4qKj7Nzs55j8cXnhFeET8uldUdffr68TRwAmilGuAv5AM/nw9cDheUlBLq6+vhf99fV0K7M+0sAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;01&quot;
        title=&quot;01&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/f8d2dbed5ae23b7c1a14716c2ea332c5/4d4a2/01.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/f8d2dbed5ae23b7c1a14716c2ea332c5/222b7/01.png 163w,
https://hfai-static.high-flyer.cn/static/f8d2dbed5ae23b7c1a14716c2ea332c5/ff46a/01.png 325w,
https://hfai-static.high-flyer.cn/static/f8d2dbed5ae23b7c1a14716c2ea332c5/4d4a2/01.png 606w&quot;
        sizes=&quot;(max-width: 606px) 100vw, 606px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;center style=&quot;font-size:12px;color:#C0C0C0&quot;&gt;彩色块显示有 32 张 GPU （八个计算节点，每个节点有四个 GPU）的系统上进行 3D 并行训练的 GPU 映射。同一颜色的 GPU 在同一节点上&lt;/center&gt;&lt;br/&gt;
&lt;h3 id=&quot;数据并行&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E5%B9%B6%E8%A1%8C&quot; aria-label=&quot;数据并行 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;数据并行&lt;/h3&gt;
&lt;p&gt;为了减少显存的占用，HAI-LLM 采用 ZeRO 数据并行的方式，把训练优化器的状态均分到 1/N 个 GPU 上 （N 是数据并行的数量），如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 565px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/a9bfe5779582a85b6bcd883631e17927/07eba/02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 53.987730061349694%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACY0lEQVQoz22T22sTURDG81cKFilasS+Cb0J90D5UEF+qooKIIi1Fwb74UKxYsdq7xqQ2t2abbRKziUnW3Vz2lt09u/uT3bRVxIHhHOYMc775Zr5UEATE/sei/55BECZ5gTjxQPC3heH4PRVfYpNqR0jHFcpVjUyxSVFWyRab5KQOxZJEGAb8a7Jc4bBcJpfL4ThOEkv5vk/P6FO4+I7jp19Idx7y4WCG1fQs68VbbElzqHotAdqz+yizaZT5PfpU0dUesizTarWwLAshBKkwCBGRQHtUxPxUp2TcJKNMsV2ZJtOa5nv7Km7QTn73EWgLFbTlLJo4wLEFmqZiWia2bRODSxCalsGLe5/ZXCtQ6T/ha32WLek23xpz7DfvMPLVpKDtGCw/32F1OY8pjhgaOqqqYRgGtuPgC59UTKQvPNZelijs1cip19mQz7OWn2SrOsle/TIDu5agEYHL9opE9qNCf5RBH3TptLsMBoOk5TOEuv6L/A78OHLZb19jQz7H28wEm8cT7NYvMrRreG6EpnVpSCHdOvQsCbV/iNJo0+vpJwU9UlE0XgvLhpEb0DXeoPQXaeiLNPtLtAavEOHgbLKuD54PI6+DPergOC6jkYPn+QgRkvI9D33Yo3RlHWUhT95YYqc6z/uD++zWH5BWHmN7GoTjKZdvbFO9m8EHHMul2Wpimg49s8HQaY459AIP5VkZbbNO1Zyh2LpAtjpFoXWJcmcaVzSTtfEjj5+vZbordTw8LNNMpjwc2gzMI2y3Oi4YhdFZS4GICEKImYh3PhbRqUpORTDOE0kspmyskhAhAn4Dtqon1KgBOuQAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;02&quot;
        title=&quot;02&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/a9bfe5779582a85b6bcd883631e17927/07eba/02.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/a9bfe5779582a85b6bcd883631e17927/222b7/02.png 163w,
https://hfai-static.high-flyer.cn/static/a9bfe5779582a85b6bcd883631e17927/ff46a/02.png 325w,
https://hfai-static.high-flyer.cn/static/a9bfe5779582a85b6bcd883631e17927/07eba/02.png 565w&quot;
        sizes=&quot;(max-width: 565px) 100vw, 565px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;在做前向和反向传播时，ZeRO 数据并行会先做 allgather 获得完整的参数，然后在前向和反向传播结束后释放掉，只保留 1/N 的参数和梯度。&lt;/p&gt;
&lt;p&gt;使用比较简单，HAI-LLM 提供了hai_llm.optim.ZeroOptimizer 工具，该工具可以自动切分优化器状态并执行梯度同步。代码示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hai_llm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;optim &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; AdamW&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ZeroOptimizer

opt_cls &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; partial&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;AdamW&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; lr&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1e-3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; weight_decay&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
optimizer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ZeroOptimizer&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parameters&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    opt_cls&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    group&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;dp_group&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    max_grad_norm&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;cfg&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;optim&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;max_grad_norm&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    grad_scaler&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;scaler
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;训练的时候只需要执行 &lt;code class=&quot;language-text&quot;&gt;optimizer.step()&lt;/code&gt; 就可以完成数据并行的梯度同步和参数更新。&lt;/p&gt;
&lt;h3 id=&quot;流水并行&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%B5%81%E6%B0%B4%E5%B9%B6%E8%A1%8C&quot; aria-label=&quot;流水并行 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;流水并行&lt;/h3&gt;
&lt;p&gt;流水并行把模型切分成 M 个阶段，分别放在 M 个 GPU 上，能够大幅节省显存占用和提升扩展性能。训练的时候每个阶段接收上一阶段的输出作为输入，然后传给下一个阶段。如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/5b0224178ce4b5a8d77f5dd5fb667bb0/9a86a/03.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 26.380368098159508%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABG0lEQVQY022Pz0vCABzF/UO71CkIQkIiOlQW1ZauoWOmST/oUJcuXboFEdmKUIuk+WM6a5vUQYgJox9un3BgJPjgy+PL4z3eizAGbx2Hh4rBwuYh2Z0Mud0ce/l9VFUlf5wieyYTjWdQFJVyuRR6fN8POdJzXYxmk3a7jWmaoWBZFvXaM7FlhemYQCq5jawmSBwsIR+tkZIl5hZFpqICxfvb0cAgCMJnyAN0Og66XiWjKkzMbDAvxUmfrCCkV0mKEqK4hZQQmJxd5/RcCz39YeC4yZ7n4bo9HNvCaL1Sqj1RfLzj8uKKwk0BTdOo6jot8wXn/SP0DAr9NRzef2GA65JJrd7g5/ObL9+j0ijSqBuh1u12sW0Lgv5I4C+ncFwQlKAU4AAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;03&quot;
        title=&quot;03&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/5b0224178ce4b5a8d77f5dd5fb667bb0/a6d36/03.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/5b0224178ce4b5a8d77f5dd5fb667bb0/222b7/03.png 163w,
https://hfai-static.high-flyer.cn/static/5b0224178ce4b5a8d77f5dd5fb667bb0/ff46a/03.png 325w,
https://hfai-static.high-flyer.cn/static/5b0224178ce4b5a8d77f5dd5fb667bb0/a6d36/03.png 650w,
https://hfai-static.high-flyer.cn/static/5b0224178ce4b5a8d77f5dd5fb667bb0/9a86a/03.png 792w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;可以看到，这种并行方式会造成大量的 GPU 空闲（Idle）。为了减少浪费，&lt;em&gt;Gpipe&lt;/em&gt; 和 &lt;em&gt;PipeDream&lt;/em&gt; 的概念被提出：如果同时进行多个迭代，每个节点在同一时刻负责不同的迭代的计算，就可以避免数据依赖，不用在原地干等了：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/4cfd94ff5c9751f7ddf28548a285e906/9a86a/04.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.44171779141104%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACc0lEQVQoz2WSS08TURSA+Svu3blUVy6MO9m4IIYYExMlLDQUBCOlmJZ2eLWlvBNF04KKicEQjEaEJoIRNdMpCFNKO1NgplN5yBAKyKP9DMUijTc5OXdzvnu+c25RNpvlKPInfzcMA1mWkUIiYUkiJIpIYQlRDKEqKhvmBun0Fp8nJxgb+8hWOp2rKzoNOopMJktSX2Zk9AuXSpu5UdmD39/P8xcDBAL9+J/56R96TGDcS++IQPewnY5XTZTVB0itpSkyTRNFUQqgqprIvXyl9BFnLru4dseFt6UVodVFS6CW5iELLcMWPCPVNPVZaW5xUl7pREttUJTJZNjf3y8AxmJxguPj3K95SHGZj/Ml7dT5vHS9sdH5zkbH2zp8Qzbc3QIetxdBaKS5ScA0NwqVT+fd3R3MXyt8C8f4GlaYT6jE9B9MikGCEx+QpkWi8gLzkXlShsHP1AoHBwf/gDnYKeDW9h6yusr7T7PEY1HiCwso8QQRJUxodo6oukB0MUFYDhFb0siwd7yUI+XDw0OOcl55KaEyNiFyrriBC9fbqHX4aPd48fV66BkUsD6p557PQUW7DWufk1vOB4xOTR0D19fXiEQiJA3jRFnTdGZnJMqqGjl7tZWLJW7sXXa6XjvwDNbR8dLG3fZHWDqtlLvtVHRXExSnCr/NyfxyQA1JCtPmcXOz0ktVl4ClU6BpwElNZwPWHjv1T51YfAKOgIvbrnpm1L/AvGYelp/hzs4Oa6srbG6aLGoxvoshFrVllpMGespAN5LMynPIURnNSJHe3i4E/tcpYG79Ziaqo2t6bpuyMs3EZJBpaZqEmkCJx0nqRkHdH5fI6PT/7TXiAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;04&quot;
        title=&quot;04&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/4cfd94ff5c9751f7ddf28548a285e906/a6d36/04.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/4cfd94ff5c9751f7ddf28548a285e906/222b7/04.png 163w,
https://hfai-static.high-flyer.cn/static/4cfd94ff5c9751f7ddf28548a285e906/ff46a/04.png 325w,
https://hfai-static.high-flyer.cn/static/4cfd94ff5c9751f7ddf28548a285e906/a6d36/04.png 650w,
https://hfai-static.high-flyer.cn/static/4cfd94ff5c9751f7ddf28548a285e906/9a86a/04.png 792w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;在 HAI-LLM 中，模型的切分是在 Builder 里由用户切分的（比如 GPTBuilder），用户可以继承 &lt;code class=&quot;language-text&quot;&gt;hai_llm.builders.base_builder.BaseBuilder&lt;/code&gt; 并实现自己的 build_model 方法，在该方法中创建每个 GPU  对应的模型实例并传入 &lt;code class=&quot;language-text&quot;&gt;_blocks2model&lt;/code&gt; 中。Builder 创建出来的模型包含一个 &lt;code class=&quot;language-text&quot;&gt;forward_backward&lt;/code&gt; 方法，用户可以传进输入、损失函数、标签，该方法会执行前向传播和反向传播并返回 Loss：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;loss&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _ &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gpt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;forward_backward&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; criterion&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;criterion&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; labels&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;上面等同于以下过程：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;output &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gpt&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
loss &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; criterion&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;output&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
loss&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;backward&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;张量并行&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%BC%A0%E9%87%8F%E5%B9%B6%E8%A1%8C&quot; aria-label=&quot;张量并行 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;张量并行&lt;/h3&gt;
&lt;p&gt;张量并行把全连接层的参数和计算切分到 K 个 GPU 上，能够节省显存占用和提升扩展性能。假设 K=2，张量并行把矩阵乘法 &lt;code class=&quot;language-text&quot;&gt;X @ A @ B&lt;/code&gt; 变成 &lt;code class=&quot;language-text&quot;&gt;X @ A1 @ B1 + X @ A2 @ B2&lt;/code&gt;，其中 A 沿着纵轴切成 A1 和 A2，B 沿着横轴切成 B1 和 B2；GPU 0 会存放参数 A1 和 B1 并负责 &lt;code class=&quot;language-text&quot;&gt;X @ A1 @ B1&lt;/code&gt; 的计算，GPU 1 则存放参数 A2 和 B2 并负责 &lt;code class=&quot;language-text&quot;&gt;X @ A2 @ B2&lt;/code&gt; 的计算。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/5378ea1708825764d28ca4f64e40060a/1cfc2/05.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 76.07361963190185%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD1ElEQVQ4y3VTCUybdRT/fS2XgdpxddIMD4ZDRZBpMQXddM4r3eGxMbdkEzKcjGQgA6PBkDinorBNGbAwOzdcYBwV2lEGtaUHox2MMgTG0e8r14Q4U6EHY7CBmL/5yqHG+Ute/se7fu/lPWAJjVev4zYhbknK68DWw2UgxMy5Pno2XFqRHdvaVxLVZS3xfy9PCUCCqq+PgxDCunJvGi3uO2GGgTlCOOyj2jiYqumzm9W9E5Wfnm9/CKj1+aE6c43BIhvXW5VET9cSI30hFUEGPgDOr5qi3TPtsk6H6ULbTHuFfNLwrZ+zpRBs5KWA1hN6ZoroLI7B7DNtUYiRB508nRym7aueaR5qIE39NaRloCwj8CVtGBDi80tjYcZCV93Cn9119jsdMmbCUMCfbC4Ennt9D+JeSYDCQrxFL2yL2Xv42Gq2jsziOhBi8jIx5UmVmqKcloHyrI7h8sgPpY3ghe4GsX3lcfDtSGHCy+EP5qeJ/XEPUAAiAPgGBfhCvDWJ8/6hHct9CmHPs+oiSA7lc5/emL5svw5ADOvjz/NGIN8Hi81ckmWIN29HaroERtGTVCuA34JDE8fXx4d8zyqDOeBS+Jc9i8gwAdZHPIB7guvBBY/Pwzm/QGqaF4JJH37WAS/fjQAe8QSeABALwPsflf0XHI9FvWZuMfMy6ykAN/yCU9Q8YSjIJSpFIrrPg8vxxP/BwLhgYJy4MjyFUqMLNbf/DgjAq7DqG5RFPe+5+NcAQnSIE63FJx9IVuyOZyVjy4bYRZ8oURya+ico7YCDujJkR7FKzTWNXITOUvuOpk821DqmirY5Zbh6aif6Ln+2t7f5SLKbPYAuQpCfum2lGqb+OwrPxL8Ibf+km6FUZ8PO3O5H2cxK8/ncZqucyDt/SuC/1vswAA+X9aR9bqxkduLHQG83m3qCM9nvrgQcvCQF0nLyBDqLQ6mnnT162pnCKkanC2EaUUoMjELXOtb4WI9dBULvw8JNaRyZOScOj9+3KWLDgXQgep3LWL5n1iy33WqTWeeuKcw4+NHRNXraOWBgXH/oaWdO6eUpZOQmQ9VT9VSF7vQXI3e1QUdrze5+ZaS8KkhLjF395jFH8K4vLdFAk/cNlXT//M91tvnOi5a71xRdbsNd+9OEm7bseJxdw7c+7whlWTZ0lh/RW2pIXbfqDYhpdns4DrqAmR4qGicki/q4lIZwez1uWbs5QkGASBCwKv7Z6AgB7ue7tyYIwNrKLoLEgu4AQubQ1C/LbLYqiHqgcTMw68XO28xo8Yn58ZLiO78rPAGCKoWcWp4GAD7sTP4FpKv3mtbVK84AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;05&quot;
        title=&quot;05&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/5378ea1708825764d28ca4f64e40060a/a6d36/05.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/5378ea1708825764d28ca4f64e40060a/222b7/05.png 163w,
https://hfai-static.high-flyer.cn/static/5378ea1708825764d28ca4f64e40060a/ff46a/05.png 325w,
https://hfai-static.high-flyer.cn/static/5378ea1708825764d28ca4f64e40060a/a6d36/05.png 650w,
https://hfai-static.high-flyer.cn/static/5378ea1708825764d28ca4f64e40060a/1cfc2/05.png 900w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;HAI-LLM 中的模型均支持张量并行的方式，如果用户需要自定义模型结构，我们在 &lt;code class=&quot;language-text&quot;&gt;haiscale.tensor&lt;/code&gt; 中提供了以下四个用来构建张量并行模型的工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;ColumnParallelLinear&lt;/code&gt;：沿着纵轴切分的全连接层算子；&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;RowParallelLinear&lt;/code&gt;：沿着横轴切分的全连接层算子；&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;VocabParallelEmbedding&lt;/code&gt;：沿着字典维度切分的 Embedding；&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;vocab_parallel_cross_entropy&lt;/code&gt;：接收沿着字典维度切分的输入，进行交叉熵损失函数计算。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;用户使用 haiscale.tensor 构建模型可以不需要关心具体的张量并行通讯的实现。具体的使用方法可以参考 GPT 和 LLaMA 的模型代码。&lt;/p&gt;
&lt;h3 id=&quot;序列并行&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%BA%8F%E5%88%97%E5%B9%B6%E8%A1%8C&quot; aria-label=&quot;序列并行 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;序列并行&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Megatron-LM&lt;/em&gt; 提出的序列并行方案旨在通过一些方式分摊张量并行中无法分摊的显存。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/67814872f879b23097be8c9ae2077c1d/914ae/06.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 30.061349693251532%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABkklEQVQY0zWQW2vTYABA8zf1L6hQBvriYBacL+Lj3Ibo8IaIjIFFixXrtlqrM91i2mYtXS5rUtYladovzWXZ2h5ZwfN64DwciTnMZ+CLhDjOyJKUoeeRBmOusim+iBBRylAkzLIZyXCE6/kIz2eeXjGapIwmMdeda6T1i022nAIHhy7V0y6f6zXelw7YaKtUzCa79T7Feo9ay+S7pbLWbLBX+cmLowYFu8k3pY2sZDwT73gp3iDdcXPkO09p1E54qxR5+OkDm6UONw2V1a9blMt/KCsNfvyukt9/xY12i92qzN2OxW15m9eFHbQjl3vmCstOHunWMMcT5zmj05DiSYW1vS/syAOWBgYbtW2aqonujdHaKuvKR3K2Ratj8rjvsaKVKP3aJx7AsveI+2cPkOTpIYrQONYseu4AT4xpdU30cYAfhdhnAX+Pdc4DgReH2HGMrhvYIsS9iNB0E6N7jnLZQslUpMXJS+gaFlGUMJ/NcBybNIoWKhATdKtHGKeL8dMso9/vk0wmC+96AUbP5j//ACDLpiB/f7MtAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;06&quot;
        title=&quot;06&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/67814872f879b23097be8c9ae2077c1d/a6d36/06.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/67814872f879b23097be8c9ae2077c1d/222b7/06.png 163w,
https://hfai-static.high-flyer.cn/static/67814872f879b23097be8c9ae2077c1d/ff46a/06.png 325w,
https://hfai-static.high-flyer.cn/static/67814872f879b23097be8c9ae2077c1d/a6d36/06.png 650w,
https://hfai-static.high-flyer.cn/static/67814872f879b23097be8c9ae2077c1d/914ae/06.png 860w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，在张量并行的基础上，将 Transformer 核的 LayerNorm 以及 Dropout 层的输入按序列长度维度进行了切分，使得每个 GPU 上面只需要做一部分的 Dropout 和 LayerNorm 。这样做进一步降低了计算资源和显存的开销。&lt;/p&gt;
&lt;p&gt;HAI-LLM 实现了 &lt;code class=&quot;language-text&quot;&gt;allreduce_sequence_parallel&lt;/code&gt; 方法，用户可以通过一行代码实现模型中 Transformer 算子的序列并行。如下代码所示：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;cfg&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;gpt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sequence_parallel &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; step &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;resume_step&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cfg&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;train&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;steps&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;

    allreduce_sequence_parallel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gpt&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;module&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;训练配置&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AE%AD%E7%BB%83%E9%85%8D%E7%BD%AE&quot; aria-label=&quot;训练配置 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;训练配置&lt;/h2&gt;
&lt;p&gt;HAI-LLM 通过 Python 文件进行模型图纸、超参数配置，通过 load_config 函数加载后会把字典转换成 AttrDict 对象，能够直接通过属性访问。使用方式如下例所示：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hai_llm&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;utils &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; load_config

cfg &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; load_config&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;environ&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;CONFIG&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;toy/toy_config.py&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; cfg&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;model_builder&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cls&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;cfg&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;build_model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;配置文件中至少需要描述清楚如下几个部分：3D 并行设置 parallel，模型图纸 model_builder，超参数 model_param 和中间结果保存 checkpoint。HAI-LLM 目前提供了 GPT-3，LLaMA，PaLM 三种模型的复现和配置案例。&lt;/p&gt;
&lt;h2 id=&quot;效果评估&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%95%88%E6%9E%9C%E8%AF%84%E4%BC%B0&quot; aria-label=&quot;效果评估 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;效果评估&lt;/h2&gt;
&lt;p&gt;HAI-LLM 提供了 &lt;code class=&quot;language-text&quot;&gt;/eval_benchmark/eval.py&lt;/code&gt; 脚本在验证集上测试模型的 Loss，其需要通过 hfai 提交到集群中运行。输入模型的配置文件、Checkpoint 位置、验证集数据等信息，指定对应的评估方法即可。如下所示：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;hfai python eval_benchmark/eval.py &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    --cfg &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;config-file&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    --ckpt_path &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;checkpoint-dir&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    --load_step &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;load_step&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    --val_ckpt_path &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;val-checkpoint-dir&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    --data_path &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;val-data-path&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
    -- -n xx -p &lt;span class=&quot;token number&quot;&gt;40&lt;/span&gt; -f -i ubuntu2004-cu113&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;同时，/eval_benchmark/ 下也提供了几种常用的模型效果评估方法，方便用户对训练好的模型进行评测。评估方法包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hellaswag&lt;/li&gt;
&lt;li&gt;winogrande&lt;/li&gt;
&lt;li&gt;piqa&lt;/li&gt;
&lt;li&gt;triviaqa&lt;/li&gt;
&lt;li&gt;mmlu&lt;/li&gt;
&lt;li&gt;race&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[HAI Platform：开源的 AI 训练平台]]></title><description><![CDATA[当下 AI 大模型如火如荼的发展，许多厂商开始构建起基于 GPU 的大规模深度学习训练集群。随着算力需求的扩大，一个能对 GPU 资源进行统一高效利用的 AI 平台，越来越成为各 AI 团队降本提效的重要武器。 构建一个能管理大规模 GPU 集群资源的 AI…]]></description><link>https://www.high-flyer.cn/blog/hai-platform/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/hai-platform/</guid><dc:creator><![CDATA[High-Flyer]]></dc:creator><pubDate>Thu, 11 May 2023 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;当下 AI 大模型如火如荼的发展，许多厂商开始构建起基于 GPU 的大规模深度学习训练集群。随着算力需求的扩大，一个能对 GPU 资源进行统一高效利用的 AI 平台，越来越成为各 AI 团队降本提效的重要武器。&lt;/p&gt;
&lt;p&gt;构建一个能管理大规模 GPU 集群资源的 AI 平台，主要会遇到如下几个痛点问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;资源调度&lt;/strong&gt;：算力规模不断扩大，而训练任务的计算需求又多种多样，如何处理任务和算力的关系以最大化集群资源使用？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用效率&lt;/strong&gt;：集群使用有峰谷差异，同时又要应对突发任务的需求，如何兼顾时效性和集群整体效率？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;迭代适配&lt;/strong&gt;：集群会有升级迭代，在调整算力规模、类型、使用规则等场景下，如何让平台快速适配，尽可能降低切换成本？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;针对上述问题，幻方 AI 在自建的萤火集群上进行多年的研发与测试，积累了&lt;strong&gt;一套高效管理 GPU 集群资源的 AI 训练平台方案，名叫 HAI Platform&lt;/strong&gt;。其&lt;strong&gt;以任务级分时调度共享 AI 算力的理念将集群零散资源进行整合再分配&lt;/strong&gt;，成功支持在 1500+ 计算节点上稳定运行深度学习训练和其他多类型任务，日常算力占用率 95% 以上，日常 GPU 使用率 75% 以上，计算和存储节点间的数据吞吐 7TB/s 以上，服务了上百个 AI 团队。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/560a8da7016ee4f5ec8d115a3c9dd59b/00d43/01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 69.32515337423312%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAADnElEQVQ4y2WU3U8cVRjGDzbGCxO8IcYLY73oghcmrPFP8A/QGrcXpqYBAtK1fKRqC23StGqJHwWWUgpaYrS2ENMmhoXYXgulprK4pIANa6GzuzO7szM7s7MzuzNzzpzzmNnGr/Til+d5z0lO3vecJ4cQQkh7ezvpiX/Y1NkzQDq6+/fHB4Zu9h47sdh3/PRCvP9k8oPjp5LdfR8lO7oHkp09gw06egaT3fGPk719Jxfi/UNL8YHh+cMdR18gbW1tpLm5mew+yj61J+XJn7tSdE/KQ1ZU6IaFsmlBNyoNtLIJrfyvqpoBpViCpht4uJfloxOX28j5kVNkPDGyb2Hp9tMAiKwUo1bdcQKA84AyzgMmAOb5lAFoeC7AfMqY41LGAQoAZtUxEpPTB8i5c33kiy+HydDpT8lPyVsEwMsB9VzwAAioADgAAVAfDc8ZuOdDcMAoZKHv3ue2vAM1t2dNzs5FyNuxgy+++97hKwcPHZl5K3bk0rHB4RuzX88G06MJTH2VEFNjF3E5ZHwSMxNTmJ6YxvT4FK5+ew3Sdgr69grX/1hF4eG2dem7mxFy794vr29trUOWFSiFYoOcrEDKK0LKycjmFexKeexKOWw9yGDzwQ6k7B52MhmouhlOy1lj5Jo1PjEVIZputFMaQAgR3kW4FwgeiIAxBIw11HU9OLaNatUGpVT4PoVhWkIracL3PB7OX6lYlbGLMxFSKpWiFbsGq+YJyiH8QAg/QOgR1jWPwWMcllOH4/rwfRdVpyYKqoayYYJzEXaJuuva8z/eiJBCoRh1ajW4ni8YC0LwXzwvPITCdmoNn1ctoRVKKBuGkBWl7rqe47qep5eN4rXrcwdI5pEUlfIysjlZKLoldNOGYT1GMy1oYQbLJhRVh6RqyBVNXimbsG27fH1u7o3FxcXI0tLSq3Nz8690dHY9Q2zHiRbUIrLZbCMfQvAnCNcp9UXVroqKafCyYaCkaerZTz57fnl5hWQyO+Tu3V/JmTNnCalU7fZCsYBcLhs8DlqYsL9V/FMzRrnr1rlpmoFpmjAMQ5355sr+C2MJklpf35dObzSdH/mcEFUvv1ZUVchyHpT68KkHn/oIAvYEjFHU6rXwpWFZVmV0PPHS91d/ID/fut3U2tpKurq6CFleXX1uPZ2OpVKp2G9ra7G19VRsLZWK/Z5Ox9IbG7F0qP/zG+/c39w8tHLnzpvv9x599sTQELkwOkZaWlrCf4b8BUoNduSc7DOzAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;01&quot;
        title=&quot;01&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/560a8da7016ee4f5ec8d115a3c9dd59b/a6d36/01.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/560a8da7016ee4f5ec8d115a3c9dd59b/222b7/01.png 163w,
https://hfai-static.high-flyer.cn/static/560a8da7016ee4f5ec8d115a3c9dd59b/ff46a/01.png 325w,
https://hfai-static.high-flyer.cn/static/560a8da7016ee4f5ec8d115a3c9dd59b/a6d36/01.png 650w,
https://hfai-static.high-flyer.cn/static/560a8da7016ee4f5ec8d115a3c9dd59b/e548f/01.png 975w,
https://hfai-static.high-flyer.cn/static/560a8da7016ee4f5ec8d115a3c9dd59b/00d43/01.png 1000w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;现在，&lt;strong&gt;幻方 AI 将正式开源 HAI Platform，将这套久经考验的 AI 训练平台服务于更广阔的 AI 社区&lt;/strong&gt;。HAI Platform 可以被部署在私有集群或公有云的 GPU 资源中，帮助您高效利用 GPU 集群资源，提升团队整体研发效率。我们希望让更多“想象力”和“创造力”生长，期待与各方科学家及开发者们一同共建 AI 时代。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;产品地址&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/hai-platform&quot;&gt;https://github.com/HFAiLab/hai-platform&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;产品文档&lt;/strong&gt;：&lt;a href=&quot;https://hfailab.github.io/hai-platform/&quot;&gt;https://hfailab.github.io/hai-platform/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;安装与设置&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%AE%89%E8%A3%85%E4%B8%8E%E8%AE%BE%E7%BD%AE&quot; aria-label=&quot;安装与设置 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;安装与设置&lt;/h2&gt;
&lt;p&gt;使用 HAI Platform，首先需要如下基础设施：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个部署 K8S 的&lt;strong&gt;算力集群&lt;/strong&gt;，包括管理节点、计算节点、服务节点（用于服务部署、数据库、监控等）；&lt;/li&gt;
&lt;li&gt;一个或多个&lt;strong&gt;存储集群&lt;/strong&gt;，让所有计算节点可访问的&lt;strong&gt;文件系统&lt;/strong&gt;，存储信息包括代码，数据，日志，配置文件等；&lt;/li&gt;
&lt;li&gt;算力集群与存储集群之间所有节点通过&lt;strong&gt;高速网络互联&lt;/strong&gt;，建议使用 RDMA 。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;接下来，您可以按照&lt;a href=&quot;https://github.com/HFAiLab/hai-platform/blob/main/README.md&quot;&gt;开源仓库中 HAI Platform 搭建指南&lt;/a&gt;进行安装和部署。&lt;/p&gt;
&lt;h2 id=&quot;任务调度&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6&quot; aria-label=&quot;任务调度 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;任务调度&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;任务是 HAI Platform 使用的基本单位，而非用户&lt;/strong&gt;。所有用户提交的任务都由 HAI Platform 统一管理和调度。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/cb55e1ea12c6caa78b7a87d47cfc2522/0a47e/02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 89.57055214723925%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFfUlEQVQ4yzWUe0xTdxTHDzCN29g0+8Ns0z0zZrJsUzHL5hLj2FJ8ZDoVUZkBUQuysfnAF6hUESygbAxoy6uFlvIUeSgULYXS0rI+b9vblpY+aHt7ey9gNNFFo4C5v6Uu+++bk3w/+X5PTg6kpR1YdvjIkZUIIZgL+hKCfm+Kekz5AQDEA8By6T0NZF1vSBAr1Hv6mq99CACvAcCrBqsTXF4f9CrUEB8LwGazIT09HeBQ7smYKKygqmFN5c3BTe1yFcuMOzYOj6kSNTrjBsw1/YXgjvrb8m55cmlL98aylr713aOGRLc/9KV90pXYJRte/lnCx0uPHj36dkZGRhzkHD/1pg8hqLg5JCzvHET8fsVjrcXx3D7lm3f7/PNGq3VBIpM/uybteVLWcee5aHB4XqZWz7fLlc+0VgdSTej3A0Ds78ePf5SZmfkKFBUVxUcTkiQpoWgaUZHICzJMoBmaQnRwCjk17cg6LEBTxgEUCbiRD1ch890qNGlWLNIz91HQ79kb9ZeXl72empoaAyUlxS+BETIsmZuZQaQXWwzaVYwT1zJml5NxYCOMQ9fPuHENM+X3MsEpjHHp+5iwx7xA0rNo3GI/EPWfPJX3zo4dO+Ig/8LFFdGBnyAlk6EIsgcji2GKZgx+kqk1BpkJP804iFlmkphhxjwk82BujvFF5phhd2TRRVCoXjuZ5kIIzl0tjd+5c2cMlDd1Lu2bZUDnCTVLsCCqNwWea73koiUQWRCagwtyF7FgniYXXKHIgtoTXngwO/NSd9lCzyYJCjXp3Ptu+x5ANNTBgwcB4j5JiLW+QGDwEr0deBg1Wwikn6aQJRBBQnMQDbvDCJuOIDdBIbWHRA/nZl/qHjuBXP8BMzTzCIr5omU/7doF0Dsgb+i62btn2IQfrldiPTWjlma5yS42+UK1ItN0w11nsE7vJWpxPyFQOIO1kTDBt/lCgi5rQGD1hcQCpeVrAIg7zM5+b/fu3XHALbux7Y8q3oZoZAB4AwDeip4BHcLB4HeD8dELcM0jsP/DAE83DbJJClptJFwe94PYRsKlhwjST5xb8tO2LXGpqamxIGm7mcLnCT4/x5d8f/zPxvzfKurz+rrqzjtHGk+aFOITnUZHdjtOsKtVNjaLK8lK5kqyf+C2ZG3ithzdXCr9dVNh7VpACPbVdMfk5OQAKCfMSKuziPPqOgqK22VUoXQAVw61zLnHmp5aRsSPO00OX5uDdFUrMM+ePN6DlFO8R1vO19Fri8SO9VfE1LpLDYcSRX9D0pXW2KRoR8W44UebGf/0bF37JY6kb6qgqUc/erfN79W0UriqjegyOTGpndQJVRhWXM4nuWU8+kxFgz+lql2XWtU2taeiOS23ugOiC+NGgZNOL3SOW6BSpimuvKd3V8oNeqGIH7olun5f2lhBt0xYrWKcNPaabPiUWkz5Nc2U8V4TdatDGOjrFD7q7hBm7gRYKlix/P2y6OMYdQaXtLpp6LQFigY8tK/fM2vkVZ/111xNo/8qyQg3q3VWiZ0ydBswm2FQELHLeZRUJKD3nxSQ6adrn6adqmGvQghurE6IvwgQBxyZPpYjMwDntraIM6h3c2QG/S/SIXNmYy+WLR7AGnQuc6uDNkqVSltHyXa6u4Q1I7j888zp8xfC5/Lzn+SdOcMuzy+A3P8rJ15pil3HEcFXHGHxd2Vt098US7BrCqvllpvGWnECk1oDFikexqQTJrxVXBxslVwLtNfnhbtu7I10Vex7Ki1NybLcyoKLuWnLklevAkgq5MPmS3zYerEyMbmobnsSR8Aq7BhKrhvWsmqGxll8+QSLf0/LEowYk2t1weRaQzhZoLRu5ff2bxX0D+4obRStST9wYGX2sWPvcrlc+Bf5a3X2ieKbuQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;02&quot;
        title=&quot;02&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/cb55e1ea12c6caa78b7a87d47cfc2522/0a47e/02.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/cb55e1ea12c6caa78b7a87d47cfc2522/222b7/02.png 163w,
https://hfai-static.high-flyer.cn/static/cb55e1ea12c6caa78b7a87d47cfc2522/ff46a/02.png 325w,
https://hfai-static.high-flyer.cn/static/cb55e1ea12c6caa78b7a87d47cfc2522/0a47e/02.png 600w&quot;
        sizes=&quot;(max-width: 600px) 100vw, 600px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;center style=&quot;font-size:12px;color:#C0C0C0&quot;&gt;用户独占 vs 分时调度&lt;/center&gt;&lt;br/&gt;
&lt;p&gt;幻方 AI 提出&lt;strong&gt;分时调度理念&lt;/strong&gt;对集群资源进行管理。用户提交任务，如运行 python / bash 代码，启动开发容器等，由平台根据当前资源需求、集群忙闲程度等进行任务的中断和加载。任务代码需要遵循平台编码规则以确保可以&lt;strong&gt;断点续跑&lt;/strong&gt;，具体流程如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;接受集群的打断信号；&lt;/li&gt;
&lt;li&gt;保存 checkpoint（模型参数，优化器参数等）；&lt;/li&gt;
&lt;li&gt;通知集群打断；&lt;/li&gt;
&lt;li&gt;从 checkpoint 恢复，继续运行。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;注意！&lt;/strong&gt; 部署 HAI Platform 的集群不会将 GPU 资源池化，而是&lt;strong&gt;以计算节点为基本单位&lt;/strong&gt;，根据资源类型、网络区域等条件进行分类标记。HAI Platform 鼓励用户一次性用满多张 GPU，进行并行训练。 用户提交任务时需选定节点数量 n，则该任务可获得 n 的整数倍个 GPU，比如在8卡计算节点上提交使用4个节点的任务，则该任务会获得32张 GPU 进行并行训练。&lt;/p&gt;
&lt;p&gt;更详细的内容可以阅读&lt;a href=&quot;https://hfailab.github.io/hai-platform/guide/schedule.html&quot;&gt;《分时调度》&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&quot;用户管理&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E7%94%A8%E6%88%B7%E7%AE%A1%E7%90%86&quot; aria-label=&quot;用户管理 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;用户管理&lt;/h2&gt;
&lt;p&gt;HAI Platform 提供以&lt;strong&gt;配额&lt;/strong&gt;的方式记录集群的各类资源，通过&lt;strong&gt;优先级&lt;/strong&gt;管理用户的使用权限。例如：某用户在 NORMAL 优先级上拥有10个计算节点的配额，其在 HAI Platform 上提交若干个任务，则最多同时以 NORMAL 优先级调度10个计算节点运行。算力资源优先满足高优先级用户的训练需求，同优先级内则交替使用集群算力资源。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/34d0586f30912e86f780b6508a0f3c6c/fdaf8/03.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 44.171779141104295%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAABsklEQVQoz1WPS2/TUBCF/ecBCdjRLSxgwb8oqBLdAIWiCokqTuwbO37bcWxfXz8/NLckEiMdzZnnmXHefYt48yXg2bXH1W3I+7uYVzeKF598i6vbgJef/X+xx/Nrj9c3ez7cxXz8mfL2a2RrT3mFs88bVN7wJzlxv4148FMeVMa20PiV4TGu2ZUarzKoekQdB75vAu53Eb+8mB+bkN9BQdDMqKPBYehh7JlHw6kqqMsC3dQwTzCPmK5hnQZYJgbdUuUpRRqTRiFVkVFmCXkS0xxLltHg6K5Dty2678mynCiOOdY1fW/otKYsK9quozeGsqrwlcLdbtm4LocowvN9Gwtv2hZnXRYEYuM4Utc167pe0Pc9i/SsK2dLkoSiKGjb1nKZOZvTtB1tp20hCALCMEQpxel0ous6O9g0jeUCybuuy263I45jy33fv9SdaZoZp9leIEqyYBgGe9U8z/bCaZoslx4ZyvOcqqqskPRnWXaZccwwYMzAND29K6qyRN4XyFvGmP9iz/PY7/f2K7n0cDjYhVJ3tO7RWtsloi7Kws85WSD8HIsX0TRN7XXCxYuo1P4C2OajNSzpYIwAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;03&quot;
        title=&quot;03&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/34d0586f30912e86f780b6508a0f3c6c/a6d36/03.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/34d0586f30912e86f780b6508a0f3c6c/222b7/03.png 163w,
https://hfai-static.high-flyer.cn/static/34d0586f30912e86f780b6508a0f3c6c/ff46a/03.png 325w,
https://hfai-static.high-flyer.cn/static/34d0586f30912e86f780b6508a0f3c6c/a6d36/03.png 650w,
https://hfai-static.high-flyer.cn/static/34d0586f30912e86f780b6508a0f3c6c/fdaf8/03.png 674w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;center style=&quot;font-size:12px;color:#C0C0C0&quot;&gt;任务优先级列表&lt;/center&gt;&lt;br/&gt;
&lt;p&gt;同时，每个用户都可以归属于某一个&lt;strong&gt;用户组&lt;/strong&gt;。计算资源和优先级配额是按用户为单位进行分配的，而同组的用户可以共享自定义环境、私有数据存储。&lt;/p&gt;
&lt;p&gt;此外，HAI Platform 还提供了管理员用户身份，其有权限执行用户创建、停用、归档等操作，调整各类资源和优先级配额，管理后台开发容器等。&lt;/p&gt;
&lt;h2 id=&quot;环境管理&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E7%8E%AF%E5%A2%83%E7%AE%A1%E7%90%86&quot; aria-label=&quot;环境管理 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;环境管理&lt;/h2&gt;
&lt;p&gt;部署 HAI Platform 的集群会包含&lt;strong&gt;基础环境&lt;/strong&gt;和用户&lt;strong&gt;自定义环境&lt;/strong&gt;两种环境管理模式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基础环境由平台统一管理，包含大部分主流依赖包，任务运行时默认加载。通常根据系统、GPU 驱动及 CUDA 版本等要求统一管理若干个基础环境。基础环境供平台所有用户共享；&lt;/li&gt;
&lt;li&gt;自定义环境由用户自行安装依赖，可以基于基础环境进行扩展。自定义环境可以在同组内共享。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; haienv
haienv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_env&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;env_name&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;两种环境都可以通过 &lt;code class=&quot;language-text&quot;&gt;haienv&lt;/code&gt; 工具进行管理，适用于各种任务场景。通过基础环境的构建，我们希望尽可能降低 AI 研发前期的环境构建成本。&lt;/p&gt;
&lt;p&gt;更详细的内容可以阅读&lt;a href=&quot;https://hfailab.github.io/hai-platform/guide/environment.html&quot;&gt;《环境配置》&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&quot;可视化交互&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%8F%AF%E8%A7%86%E5%8C%96%E4%BA%A4%E4%BA%92&quot; aria-label=&quot;可视化交互 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;可视化交互&lt;/h2&gt;
&lt;p&gt;为了方便用户与 GPU 集群的交互，HAI Platform 提供了用户界面，&lt;a href=&quot;https://github.com/HFAiLab/hai-platform-studio&quot;&gt;HAI Platform Studio&lt;/a&gt; ，其主要功能包括但不限于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;管理和启动基于 JupyterLab 的开发容器，配合 Jupyter 插件，可以进行代码调试或任务提交；&lt;/li&gt;
&lt;li&gt;管理提交的任务，支持任务的实时监控、日志分析和任务状态管理；&lt;/li&gt;
&lt;li&gt;集成了讨论区、任务性能监控、任务调度管理等功能。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;另外，HAI Platform Studio 子应用 &lt;code class=&quot;language-text&quot;&gt;/monitor&lt;/code&gt; 集成了一定的监控和管理能力，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户及任务管理：创建用户；修改用户分组、Quota；管理用户开发容器和任务；&lt;/li&gt;
&lt;li&gt;节点管理：查看分组节点以及各个节点的详细信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/79dc98bc6128d2e9d77ae57fbeffab77/66caf/04.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 90.79754601226993%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAAsTAAALEwEAmpwYAAACw0lEQVQ4y31Ta5NTNwy9fxhK2e3yWJahBdoZ/lc/ddL+CBaG3ST3Ycu2LNkSIzlJ+YRnFOn6IZ1zpEzPrt/C9av38OvNO7h99wle3f0Fv73+AC/e/Ak3tx/h9YdP7p9e3bn9cv3WzeInV3fw/OV7uHr5R7i5/difv/j972l/XPXxMCtSU2pdK4tW7hfD2txzF7+zbFHXEJWaaKnkMeSiEbIGyP9NISU5LosQsRCRVCxC3C7Gl5j9DtYqiFUgZQFI5/1GzJoL7qY1WTVSW42K1jjrWKI/W6WgbuumiFVFpPXelbjtplRQayXl1lR60954pBO5WD95bl03IE2lKRFrJdJmiYibFcBKuykja4hJtxB1i+BxsDiA+5TyxSBlP88FtSDqugZPbAitYCXeTQHKuIRVC5JbLtUNKylRc2TMzSgNRNyc6roFNaqmlv2wUT4cF93vj/4gl6IxgktgFw0hm9i5OGJDMy+rtta8mCFN3uHUCtaBECBrzugaASS/YChM02XZXCenC1mJSOd5vaB0eSBrytiswNDQ6RVtrWvvowFm9sj67N+238e57fEJoaGy79Z7426S8G7ygQxw1sK96WOPjbrHMkbIdaQxBZbMEBqjXLAZ/dGUCK7ReXm3Kl1m7RzbQkSXZeg99LNaXaQZI6dsmzYOhsStklW6+HOcrfsZvfjo+EBaq71D77JTNlG/Pi5uXx4XvX+YR/ww68PB9me9fxjnkIo3xvQ2HW2Z/pDSSDjmMOmyRv/TL2vw8fh22HTZQI/L5gO/ns7OSZx+rT5So2HSrIhTXtYg87wKM0uEJNbIz/soqXYJESQXdAsB5LxM6oIkSyDp3jH5gXIEF9+oWMdF/h/o85lp2H5ANx43XSMrkk9HPyX8d4qQGLG65YJcK3GIifHkC1aGlP2cuTExuxUk3i/Ih61y770a5RDTP98BjlRb1mfh/sMAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;04&quot;
        title=&quot;04&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/79dc98bc6128d2e9d77ae57fbeffab77/a6d36/04.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/79dc98bc6128d2e9d77ae57fbeffab77/222b7/04.png 163w,
https://hfai-static.high-flyer.cn/static/79dc98bc6128d2e9d77ae57fbeffab77/ff46a/04.png 325w,
https://hfai-static.high-flyer.cn/static/79dc98bc6128d2e9d77ae57fbeffab77/a6d36/04.png 650w,
https://hfai-static.high-flyer.cn/static/79dc98bc6128d2e9d77ae57fbeffab77/66caf/04.png 853w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;center style=&quot;font-size:12px;color:#C0C0C0&quot;&gt;HAI Platform Studio 概览界面&lt;/center&gt;&lt;br/&gt; 
&lt;p&gt;更多内容可以阅读开源仓库：&lt;a href=&quot;https://github.com/HFAiLab/hai-platform-studio%E3%80%82&quot;&gt;https://github.com/HFAiLab/hai-platform-studio。&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;数据管理&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E7%AE%A1%E7%90%86&quot; aria-label=&quot;数据管理 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;数据管理&lt;/h2&gt;
&lt;p&gt;部署 HAI Platform 的集群会将训练数据存储在文件系统中。训练中的任务会实时从文件系统中读取数据，流转到计算节点。这里，优良的文件系统将是提高 GPU 利用率，进而提升集群整体效率的决定性因素之一。&lt;/p&gt;
&lt;p&gt;为了最大化 GPU 利用率，降低数据读取的成本，幻方 AI 自研了&lt;a href=&quot;/blog/3fs&quot;&gt;&lt;strong&gt;高速文件系统 3FS&lt;/strong&gt;&lt;/a&gt;，其专门针对深度学习训练中样本读取的场景进行优化，能支持计算和存储节点间 7TB/s 以上的数据吞吐。3FS 需要用户将原始数据中较多的小文件聚合成大文件进行存储，推荐使用 &lt;a href=&quot;/blog/ffrecord&quot;&gt;FFRecord 格式规范&lt;/a&gt;来聚合文件。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GTC 2023 | 按需分配的AI算力 Ⅱ]]></title><description><![CDATA[“切勿错过AI的决定性时刻”这句 NVIDIA GTC 的广告语自周三起，一时间传遍全网。依照惯例，大会由熟悉的面孔黄仁勋围绕AI、芯片等科技，发布了一系列前沿技术产品。 今年幻方 AI 再度受邀，在 NVIDIA GTC 2023 大会中进行了一次技术主题分享。  自 201…]]></description><link>https://www.high-flyer.cn/blog/gtc2023/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/gtc2023/</guid><dc:creator><![CDATA[High-Flyer]]></dc:creator><pubDate>Mon, 03 Apr 2023 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://hfai-static.high-flyer.cn/74c7c66218af34e58b9cb8dbf249a4b1/00.gif&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;“切勿错过AI的决定性时刻”这句 NVIDIA GTC 的广告语自周三起，一时间传遍全网。依照惯例，大会由熟悉的面孔黄仁勋围绕AI、芯片等科技，发布了一系列前沿技术产品。&lt;/p&gt;
&lt;p&gt;今年幻方 AI 再度受邀，在 NVIDIA GTC 2023 大会中进行了一次技术主题分享。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/9de6fd54f0bed1f8748f62aa9a5d7133/47311/01.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 52.760736196319016%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMFBAb/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAAB71lKOm8WH//EABoQAAIDAQEAAAAAAAAAAAAAAAIDAQQRAAX/2gAIAQEAAQUCiC2wRwutsp701ixdJYqR/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAHxAAAgIBBAMAAAAAAAAAAAAAAQIAETEDEBJRIjNx/9oACAEBAAY/AvYK+zxYhrzUHM2e9lV8X3AmmKUYE//EAB4QAAIBAwUAAAAAAAAAAAAAAAERABAhMUFRYYGR/9oACAEBAAE/IcKJt8RQLOoI9hGcu+1BOE3kCGnEbk5uNT//2gAMAwEAAgADAAAAEK8f/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQIBAT8QJ//EAB0QAQEAAgIDAQAAAAAAAAAAAAERACExUUFhkbH/2gAIAQEAAT8QFLzcHQXica8Y9KoQQHRp9zrsYl29v7gA6AvWUOa6FFLR3kO6gQC1lV5XP//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;01&quot;
        title=&quot;01&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/9de6fd54f0bed1f8748f62aa9a5d7133/6aca1/01.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/9de6fd54f0bed1f8748f62aa9a5d7133/d2f63/01.jpg 163w,
https://hfai-static.high-flyer.cn/static/9de6fd54f0bed1f8748f62aa9a5d7133/c989d/01.jpg 325w,
https://hfai-static.high-flyer.cn/static/9de6fd54f0bed1f8748f62aa9a5d7133/6aca1/01.jpg 650w,
https://hfai-static.high-flyer.cn/static/9de6fd54f0bed1f8748f62aa9a5d7133/7c09c/01.jpg 975w,
https://hfai-static.high-flyer.cn/static/9de6fd54f0bed1f8748f62aa9a5d7133/47311/01.jpg 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;自 2019 年起，我们为了满足自己科研作业的大规模算力需求，逐步构建了幻方萤火深度学习智算平台，其包括存储网络相关基础设施、分时调度算法、以及深度优化的 hfai 框架。在实际的工作中，我们常常遇到很多模型训练与落地的挑战，本次讲座分享的内容就是过去一段时间，我们在软件和硬件上，取得的一些突破以及积累的相关解决方案。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/5625dd3762b132dbea2b2a699aeea3b7/47311/02.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 73.61963190184049%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAAPABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAMEBQYH/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwEC/9oADAMBAAIQAxAAAAFsSg2WVQc8KP8A/8QAHRAAAQQCAwAAAAAAAAAAAAAAAgABAxEEEgUUFf/aAAgBAQABBQIJ0T7I+ntxVyLPjbzgax//xAAXEQEAAwAAAAAAAAAAAAAAAAAAAhEx/9oACAEDAQE/Adip/8QAFhEAAwAAAAAAAAAAAAAAAAAAAQIQ/9oACAECAQE/AQs//8QAHxABAAEDBAMAAAAAAAAAAAAAAQACAxEQEiExJGGR/9oACAEBAAY/ArXqW67mSjdyvQ5j5FP2A8gy6AdZ0//EABoQAQADAQEBAAAAAAAAAAAAAAEAESFRMUH/2gAIAQEAAT8hwHZU9eFCaNERL68w/YPSpWRnBpw9IVjP/9oADAMBAAIAAwAAABDAH//EABcRAAMBAAAAAAAAAAAAAAAAAAABEVH/2gAIAQMBAT8QTpStP//EABYRAQEBAAAAAAAAAAAAAAAAABEAAf/aAAgBAgEBPxDFYv/EAB0QAQEAAgIDAQAAAAAAAAAAAAERADEhQVFhcbH/2gAIAQEAAT8QCgFuqcvQZG8ScFkE0cUvvKrItN+GIQtUTlRJtvnKOshGg9Z3t+4QCq5//9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;02&quot;
        title=&quot;02&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/5625dd3762b132dbea2b2a699aeea3b7/6aca1/02.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/5625dd3762b132dbea2b2a699aeea3b7/d2f63/02.jpg 163w,
https://hfai-static.high-flyer.cn/static/5625dd3762b132dbea2b2a699aeea3b7/c989d/02.jpg 325w,
https://hfai-static.high-flyer.cn/static/5625dd3762b132dbea2b2a699aeea3b7/6aca1/02.jpg 650w,
https://hfai-static.high-flyer.cn/static/5625dd3762b132dbea2b2a699aeea3b7/7c09c/02.jpg 975w,
https://hfai-static.high-flyer.cn/static/5625dd3762b132dbea2b2a699aeea3b7/47311/02.jpg 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;以下是本次 GTC 主题分享的内容概要，也是我们阶段性的最佳实践。&lt;/p&gt;
&lt;h2 id=&quot;ffrecord&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ffrecord&quot; aria-label=&quot;ffrecord permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;FFRecord&lt;/h2&gt;
&lt;p&gt;目前网上的开源文件格式，比如 TFRecord 等在不需要随机访问样本的情况下能够获得优秀的性能；但在很多机器学习的场景下，用户训练模型时每一步需要随机采样多个样本。为此，我们专门设计了 &lt;a href=&quot;/blog/ffrecord&quot;&gt;FFRecord (Fire Flyer Record) 文件格式&lt;/a&gt;，帮助用户更加方便地享受 &lt;a href=&quot;/blog/3fs&quot;&gt;3FS 高速存储&lt;/a&gt;批量读取带来的效率提升。同时我们实现了和 PyTorch 完全兼容的接口，方便用户的迁移和加速。&lt;/p&gt;
&lt;p&gt;用 ImageNet 性能测试显示，用 FFRecord 能够比大量小文件读取的 Pytorch dataloader 性能提升近 40%。不仅如此，为了方便用户在萤火集群上的训练，我们构建以 FFRecord 为基础的&lt;a href=&quot;/blog/hfai_datasets&quot;&gt;幻方 AI 数据集仓库&lt;/a&gt;。目前数据集仓库里已收纳了 20 多种大规模公开数据集，近 120 多个用户私有数据集。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/d34710ea275b6ff151d97e081958a0ba/47311/03.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 57.05521472392638%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMBAgf/xAAVAQEBAAAAAAAAAAAAAAAAAAABAP/aAAwDAQACEAMQAAAB1C0KJ4Cf/8QAGBAAAwEBAAAAAAAAAAAAAAAAAREhABD/2gAIAQEAAQUCVdGPf//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABgQAAMBAQAAAAAAAAAAAAAAAAAQMQEC/9oACAEBAAY/AqYRcr//xAAaEAEAAgMBAAAAAAAAAAAAAAABABEQIVGh/9oACAEBAAE/IRjrTlRoHYlN0cTxj//aAAwDAQACAAMAAAAQGP8A/8QAFhEBAQEAAAAAAAAAAAAAAAAAARBB/9oACAEDAQE/EBNn/8QAFxEAAwEAAAAAAAAAAAAAAAAAARARQf/aAAgBAgEBPxA3F//EAB0QAQEAAgEFAAAAAAAAAAAAAAERACExEEFhgZH/2gAIAQEAAT8QZ0OUDDREbnouUHiKOaVOUzRns18nT//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;03&quot;
        title=&quot;03&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/d34710ea275b6ff151d97e081958a0ba/6aca1/03.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/d34710ea275b6ff151d97e081958a0ba/d2f63/03.jpg 163w,
https://hfai-static.high-flyer.cn/static/d34710ea275b6ff151d97e081958a0ba/c989d/03.jpg 325w,
https://hfai-static.high-flyer.cn/static/d34710ea275b6ff151d97e081958a0ba/6aca1/03.jpg 650w,
https://hfai-static.high-flyer.cn/static/d34710ea275b6ff151d97e081958a0ba/7c09c/03.jpg 975w,
https://hfai-static.high-flyer.cn/static/d34710ea275b6ff151d97e081958a0ba/47311/03.jpg 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;hfainn&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hfainn&quot; aria-label=&quot;hfainn permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;hfai.nn&lt;/h2&gt;
&lt;p&gt;幻方 AI 对 Pytorch 框架进行了深度优化，结合幻方萤火集群的特点，&lt;a href=&quot;/blog/hfnn&quot;&gt;对一些常用的 AI 算子重新研发&lt;/a&gt;，提升效率，进一步提升了模型整体的训练效率。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/3ace2389bd771d11237b7567ea1cc252/47311/04.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 47.852760736196316%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAAKABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAECBAf/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHSbDRIYf/EABoQAAICAwAAAAAAAAAAAAAAAAECABARITH/2gAIAQEAAQUCCRToHMHVr//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABcQAAMBAAAAAAAAAAAAAAAAAAECICL/2gAIAQEABj8CO2r/xAAXEAEBAQEAAAAAAAAAAAAAAAABADER/9oACAEBAAE/IcRwG6bWAdMtIbF//9oADAMBAAIAAwAAABAQD//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABsQAQACAwEBAAAAAAAAAAAAAAEAESExYUHR/9oACAEBAAE/EEafYQUThmFYFDaZfsLva9gBwBdwAIAcIAKCif/Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;04&quot;
        title=&quot;04&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/3ace2389bd771d11237b7567ea1cc252/6aca1/04.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/3ace2389bd771d11237b7567ea1cc252/d2f63/04.jpg 163w,
https://hfai-static.high-flyer.cn/static/3ace2389bd771d11237b7567ea1cc252/c989d/04.jpg 325w,
https://hfai-static.high-flyer.cn/static/3ace2389bd771d11237b7567ea1cc252/6aca1/04.jpg 650w,
https://hfai-static.high-flyer.cn/static/3ace2389bd771d11237b7567ea1cc252/7c09c/04.jpg 975w,
https://hfai-static.high-flyer.cn/static/3ace2389bd771d11237b7567ea1cc252/47311/04.jpg 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;更快&lt;/strong&gt;。为了让模型计算得更快，我们通过优化 CUDA kernel，融合多运算，优化模型结构等，使得深度学习算子计算更高效。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/d5d293d0940d3ab1809dde81d39ed279/47311/05.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 47.852760736196316%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAAKABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAECBAf/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHSo3AQw//EABgQAQEAAwAAAAAAAAAAAAAAAAECERIg/9oACAEBAAEFAtMEhRx//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAGhAAAQUBAAAAAAAAAAAAAAAAAgARICEykf/aAAgBAQAGPwLZMqI+x//EABoQAQABBQAAAAAAAAAAAAAAAAEAESAxUXH/2gAIAQEAAT8hWzsZlMddr//aAAwDAQACAAMAAAAQQ8//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAbEAEAAgIDAAAAAAAAAAAAAAABABEhMYGR0f/aAAgBAQABPxCl0FQZV3NiPggUA20bZ5AC6Ahqf//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;05&quot;
        title=&quot;05&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/d5d293d0940d3ab1809dde81d39ed279/6aca1/05.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/d5d293d0940d3ab1809dde81d39ed279/d2f63/05.jpg 163w,
https://hfai-static.high-flyer.cn/static/d5d293d0940d3ab1809dde81d39ed279/c989d/05.jpg 325w,
https://hfai-static.high-flyer.cn/static/d5d293d0940d3ab1809dde81d39ed279/6aca1/05.jpg 650w,
https://hfai-static.high-flyer.cn/static/d5d293d0940d3ab1809dde81d39ed279/7c09c/05.jpg 975w,
https://hfai-static.high-flyer.cn/static/d5d293d0940d3ab1809dde81d39ed279/47311/05.jpg 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;更省&lt;/strong&gt;。现代模型越来越大，在不改变精度的情况下，我们通过压位等技术，在训练时减少了部分常用函数中间变量的内存，大幅节省训练的内存占用。&lt;/p&gt;
&lt;h2 id=&quot;haiscale&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#haiscale&quot; aria-label=&quot;haiscale permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;haiscale&lt;/h2&gt;
&lt;p&gt;随着模型规模和数据规模的扩大，越来越多的模型训练都要在多机多卡上进行。因此并行训练中的优化至关重要。&lt;a href=&quot;/blog/haiscale&quot;&gt;Haiscale 是一个轻量级的高性能并行训练工具&lt;/a&gt;，集成了幻方 AI 多年的并行训练研发经验，能很轻松地兼容 PyTorch 进行并行训练提速，其包含：&lt;code class=&quot;language-text&quot;&gt;haiscale.ddp&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;haiscale.fsdp&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;haiscale.pipline&lt;/code&gt; 三大套件，它们都以幻方自研的 hfreduce 多机多卡通信方案为底座，进行并行训练的加速。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/31cb1fbe7e0428f669e498fdfff6ea34/47311/06.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 52.14723926380368%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAAKABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMBAgf/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHSHtgCgf/EABkQAQACAwAAAAAAAAAAAAAAAAEAAhAiMf/aAAgBAQABBQJNquWU5//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABkQAAEFAAAAAAAAAAAAAAAAAAABAiAiMf/aAAgBAQAGPwJbPNj/AP/EABoQAAICAwAAAAAAAAAAAAAAAAERABAhMWH/2gAIAQEAAT8hEoAy0NRmWPEo+VpR/9oADAMBAAIAAwAAABBDz//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABsQAQACAgMAAAAAAAAAAAAAAAEAESExUWGR/9oACAEBAAE/EBXB2PiogUC6FuhYyhnEzd9TJru2f//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;06&quot;
        title=&quot;06&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/31cb1fbe7e0428f669e498fdfff6ea34/6aca1/06.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/31cb1fbe7e0428f669e498fdfff6ea34/d2f63/06.jpg 163w,
https://hfai-static.high-flyer.cn/static/31cb1fbe7e0428f669e498fdfff6ea34/c989d/06.jpg 325w,
https://hfai-static.high-flyer.cn/static/31cb1fbe7e0428f669e498fdfff6ea34/6aca1/06.jpg 650w,
https://hfai-static.high-flyer.cn/static/31cb1fbe7e0428f669e498fdfff6ea34/7c09c/06.jpg 975w,
https://hfai-static.high-flyer.cn/static/31cb1fbe7e0428f669e498fdfff6ea34/47311/06.jpg 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;haiprof&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#haiprof&quot; aria-label=&quot;haiprof permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;haiprof&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/blog/haiprof&quot;&gt;haiprof (High-flyer’s AI Profile)&lt;/a&gt; 是一个针对 PyTorch 模型的性能分析工具，用户能够在无需修改代码的情况下分析模型性能瓶颈，能随时调用，为整个训练过程做全方位的“CT”。&lt;/p&gt;
&lt;p&gt;在任务运行的过程中，haiprof 会收集以下信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU/GPU 利用率、功率、内存占用&lt;/li&gt;
&lt;li&gt;用户读写流量、IB 流量&lt;/li&gt;
&lt;li&gt;内存带宽、跨 NUMA 带宽&lt;/li&gt;
&lt;li&gt;forward、backward、optimizer、dataloader 的耗时&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;haiprof 还支持对 PyTorch 代码进行更深入的 tracing，分析不同函数、算子的时间开销。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://hfai-static.high-flyer.cn/36bf68813134ea91bcd638609a524d65/07.gif&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;自研路由算法&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%87%AA%E7%A0%94%E8%B7%AF%E7%94%B1%E7%AE%97%E6%B3%95&quot; aria-label=&quot;自研路由算法 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;自研路由算法&lt;/h2&gt;
&lt;p&gt;对于影响深度学习训练快慢的因素，人们常常容易忽略网络传输在训练提速中的重要作用。特别是在大规模集群，分布式训练的场景中，网络的拥塞可能直接导致 GPU 算力的失效，就像空有一段段双向 8 车道的快速路，但如果道路规划凌乱，高速路也只能沦为大型停车场。&lt;/p&gt;
&lt;p&gt;在实际的应用中，我们便发现网络拥塞无处不在。而&lt;a href=&quot;/blog/network-1&quot;&gt;自研路由算法，帮助我们突破了传统的 fattree 架构，带我们来到了更加广阔的世界&lt;/a&gt;。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;这一算法，能够支持我们多台大型 800 口互联，集群算力的提升突破了物理上传统 fattree 的上限；&lt;/li&gt;
&lt;li&gt;支持我们使用同一个网络来支持存储和互联，大大降低了集群搭建的成本，提升了可维护性，增加了稳定性；&lt;/li&gt;
&lt;li&gt;我们能够在原有典型 fattree上，构建其他低速子树，支持其他的异构运算节点，让所有节点都有各自需要的互联能力，提高了平台算力的多样性。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/06ddb1c7bdf228c74ac64d7189e6415f/47311/08.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 54.601226993865026%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAALABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAMBAgQG/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAe80y9GFhf/EABoQAQEBAAMBAAAAAAAAAAAAAAIBAwQQEhP/2gAIAQEAAQUCTp0vJzMNiPgrT5Z9f//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABwQAQACAQUAAAAAAAAAAAAAAAEAESECEDEykf/aAAgBAQAGPwLVlq5lfIJwxsnQ2//EABoQAQADAQEBAAAAAAAAAAAAAAEAITERcaH/2gAIAQEAAT8hzr4HkH/aWYhHSVHbhtb5AA4UE//aAAwDAQACAAMAAAAQF8//xAAVEQEBAAAAAAAAAAAAAAAAAAAQIf/aAAgBAwEBPxCn/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGhABAQEBAQEBAAAAAAAAAAAAAREAMSFh0f/aAAgBAQABPxAmoj3x8440oAOh+678FhGPzPqgS4SUx1LiRgIBwN//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;08&quot;
        title=&quot;08&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/06ddb1c7bdf228c74ac64d7189e6415f/6aca1/08.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/06ddb1c7bdf228c74ac64d7189e6415f/d2f63/08.jpg 163w,
https://hfai-static.high-flyer.cn/static/06ddb1c7bdf228c74ac64d7189e6415f/c989d/08.jpg 325w,
https://hfai-static.high-flyer.cn/static/06ddb1c7bdf228c74ac64d7189e6415f/6aca1/08.jpg 650w,
https://hfai-static.high-flyer.cn/static/06ddb1c7bdf228c74ac64d7189e6415f/7c09c/08.jpg 975w,
https://hfai-static.high-flyer.cn/static/06ddb1c7bdf228c74ac64d7189e6415f/47311/08.jpg 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[haiprof | 模型训练性能分析工具]]></title><description><![CDATA[全世界都在给 GPT 的训练和推理算账，以至于微软会迫不及待地分享“每美元的推理能获得 2 倍的性能”的喜讯，其传递的信号或许是：一丁点的算力浪费，都在这场 AI…]]></description><link>https://www.high-flyer.cn/blog/haiprof/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/haiprof/</guid><dc:creator><![CDATA[小杞]]></dc:creator><pubDate>Mon, 27 Mar 2023 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;全世界都在给 GPT 的训练和推理算账，以至于微软会迫不及待地分享“每美元的推理能获得 2 倍的性能”的喜讯，其传递的信号或许是：&lt;strong&gt;一丁点的算力浪费，都在这场 AI 竞争里是致命的&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;而越往后发展，模型训练效率的高低，越发成为科研人员不容忽视的难点。无论从加快训练测试更多参数，还是从节省研发成本的角度来说，低效的任务训练已经变得不可容忍。摆在眼前的，对于科研用户来说，一套趁手易用的模型性能分析工具，是工作中的必备利器。那么如何快速得给模型做一个全方位的“体检”，如何更简单高效的地定位模型训练中的“病灶”？今天就为大家介绍幻方 AI 研发的&lt;strong&gt;模型性能分析工具 haiprof&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&quot;haiprof&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#haiprof&quot; aria-label=&quot;haiprof permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;haiprof&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://hfai-static.high-flyer.cn/36bf68813134ea91bcd638609a524d65/01.gif&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;haiprof (High-flyer’s AI Profile) 是一个针对 PyTorch 模型的性能分析工具，用户能够在无需修改代码的情况下分析模型性能瓶颈。在任务运行的过程中，haiprof 会收集以下信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU/GPU 利用率、功率、内存占用&lt;/li&gt;
&lt;li&gt;用户读写流量、IB 流量&lt;/li&gt;
&lt;li&gt;内存带宽、跨 NUMA 带宽&lt;/li&gt;
&lt;li&gt;forward、backward、optimizer、dataloader 的耗时&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;haiprof 还支持对 PyTorch 代码进行更深入的 tracing，分析不同函数、算子的时间开销。&lt;/p&gt;
&lt;p&gt;使用方式如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;hai python train.py -- --nodes &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt; --options profile.time&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;120&lt;/span&gt; --options profile.trace&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
haiprof train.py --time &lt;span class=&quot;token number&quot;&gt;120&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;先提交任务，后开启分析工具。接下来我们将会以一个真实场景下，用户模型训练的优化过程作为示例，来演示 haiprof 的使用方法。&lt;/p&gt;
&lt;h2 id=&quot;模型运行全景-profile-请求&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E8%BF%90%E8%A1%8C%E5%85%A8%E6%99%AF-profile-%E8%AF%B7%E6%B1%82&quot; aria-label=&quot;模型运行全景 profile 请求 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型运行全景 profile 请求&lt;/h2&gt;
&lt;h3 id=&quot;1-查看任务log&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-%E6%9F%A5%E7%9C%8B%E4%BB%BB%E5%8A%A1log&quot; aria-label=&quot;1 查看任务log permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. 查看任务Log&lt;/h3&gt;
&lt;p&gt;这是一个正在运行的训练任务的日志，在日志中我们打印出了每个 step 的 forward、backward 耗时。我们可以看到，这个任务的 forward 耗时要远远大于 backward 。通常来说，大部分模型的 forward 时间和  backward 是差不多或者更小的。这个训练任务显然存在着一些问题。接下来我们用 haiprof 分析一下该模型。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 468px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/d744480d8b30a7e416faf2cb6c476d5d/7883a/02.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 88.95705521472392%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAASABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAECAwQH/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAHokxS52QtKkZgf/8QAHBABAAIBBQAAAAAAAAAAAAAAAgERAAMSITEy/9oACAEBAAEFAttThNw1Sl8aasrvB5//xAAVEQEBAAAAAAAAAAAAAAAAAAARIP/aAAgBAwEBPwFj/8QAFxEAAwEAAAAAAAAAAAAAAAAAAQIgUf/aAAgBAgEBPwELkf/EABoQAAIDAQEAAAAAAAAAAAAAAAABAhAxIpH/2gAIAQEABj8CHWMlzLwx1Kv/xAAdEAACAgIDAQAAAAAAAAAAAAAAASExEcEQQWFx/9oACAEBAAE/IWr8N1saiTgkG2ZpZY6XvCLYKL/mx0aD/9oADAMBAAIAAwAAABDkCEL/xAAXEQEAAwAAAAAAAAAAAAAAAAABABBB/9oACAEDAQE/EEawRv8A/8QAGBEBAAMBAAAAAAAAAAAAAAAAAQAQESH/2gAIAQIBAT8QQOJiX//EAB4QAQACAQQDAAAAAAAAAAAAAAEAETEhQVFhkbHw/9oACAEBAAE/EObateaSh9Z0QQs+mGhdLd5nA7B3ypQtsGxF4HvG5vqicjif/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;02&quot;
        title=&quot;02&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/d744480d8b30a7e416faf2cb6c476d5d/7883a/02.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/d744480d8b30a7e416faf2cb6c476d5d/d2f63/02.jpg 163w,
https://hfai-static.high-flyer.cn/static/d744480d8b30a7e416faf2cb6c476d5d/c989d/02.jpg 325w,
https://hfai-static.high-flyer.cn/static/d744480d8b30a7e416faf2cb6c476d5d/7883a/02.jpg 468w&quot;
        sizes=&quot;(max-width: 468px) 100vw, 468px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;2-使用-haiprof-命令行工具&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%E4%BD%BF%E7%94%A8-haiprof-%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7&quot; aria-label=&quot;2 使用 haiprof 命令行工具 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. 使用 haiprof 命令行工具&lt;/h3&gt;
&lt;p&gt;这里我们先使用 hfai prof 命令工具对正在运行中的任务做一个简单的 profile，使用上只需要指定任务的 ID 或者名字，然后设置 profile 的时长。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;haiprof train.py –time &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;现在我们成功提交了对 &lt;code class=&quot;language-text&quot;&gt;train.py&lt;/code&gt; 这个任务的 profile 请求，然后我们需要等待 60 秒，profile 完成后会把结果写入 log 文件夹。接下来我们可以使用 haiprof 提供的可视化工具进行分析。&lt;/p&gt;
&lt;h3 id=&quot;3-运行数据可视化分析&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-%E8%BF%90%E8%A1%8C%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96%E5%88%86%E6%9E%90&quot; aria-label=&quot;3 运行数据可视化分析 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. 运行数据可视化分析&lt;/h3&gt;
&lt;p&gt;我们在 haiprof 库提供了一个 &lt;code class=&quot;language-text&quot;&gt;Analyzer&lt;/code&gt; 工具，用户只需要输入 profile 的 log 文件夹路径即可。&lt;/p&gt;
&lt;p&gt;我们先调用 &lt;code class=&quot;language-text&quot;&gt;show_overview&lt;/code&gt; 函数来看看任务的整体运行情况&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/7e1f86fd49c57c4491eca04b24f8ddd1/47311/03.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 55.21472392638037%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMBAgf/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAAB0liJZuMCv//EABoQAAIDAQEAAAAAAAAAAAAAAAACBBExASH/2gAIAQEAAQUCZaFro6+yMjj7/8QAFhEBAQEAAAAAAAAAAAAAAAAAERAh/9oACAEDAQE/AXSf/8QAFhEBAQEAAAAAAAAAAAAAAAAAERAh/9oACAECAQE/ATGf/8QAGRAAAgMBAAAAAAAAAAAAAAAAAAECEDFx/9oACAEBAAY/Ao9MMQh1/8QAGxAAAgMAAwAAAAAAAAAAAAAAAAERITFRYXH/2gAIAQEAAT8hVRMQ7oiuqsRjDgZqNjtqbMPD/9oADAMBAAIAAwAAABDvD//EABURAQEAAAAAAAAAAAAAAAAAABAh/9oACAEDAQE/EID/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/EAf/xAAdEAEAAgICAwAAAAAAAAAAAAABABExQSFhcYHw/9oACAEBAAE/EA76kSzA2c68S+LRFNOHPvMq+F0RDQb01qK7LZl6nwdz/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;03&quot;
        title=&quot;03&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/7e1f86fd49c57c4491eca04b24f8ddd1/6aca1/03.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/7e1f86fd49c57c4491eca04b24f8ddd1/d2f63/03.jpg 163w,
https://hfai-static.high-flyer.cn/static/7e1f86fd49c57c4491eca04b24f8ddd1/c989d/03.jpg 325w,
https://hfai-static.high-flyer.cn/static/7e1f86fd49c57c4491eca04b24f8ddd1/6aca1/03.jpg 650w,
https://hfai-static.high-flyer.cn/static/7e1f86fd49c57c4491eca04b24f8ddd1/7c09c/03.jpg 975w,
https://hfai-static.high-flyer.cn/static/7e1f86fd49c57c4491eca04b24f8ddd1/47311/03.jpg 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;从上图中我们可以看到整个任务的 IB 平均流量、 CPU、GPU 平均利用率，以及内存、显存的占用情况等等。我们观察到这个训练任务的 GPU 利用率非常低，只有 30%，而 CPU 利用率却有 60%~70%。&lt;/p&gt;
&lt;p&gt;接下来我们通过 &lt;code class=&quot;language-text&quot;&gt;show_one_rank&lt;/code&gt; 函数来看看详细的情况&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/e9c16a5f07621e549d3be7d43fe3c8a0/47311/04.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 55.21472392638037%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAALABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAMCB//EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHpbZIKF//EABkQAAIDAQAAAAAAAAAAAAAAAAABAhFBQv/aAAgBAQABBQKqXMhmSP/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABkQAAIDAQAAAAAAAAAAAAAAAAAhASAxof/aAAgBAQAGPwJdHBlP/8QAGhABAAMBAQEAAAAAAAAAAAAAAQARIVExYf/aAAgBAQABPyFOS8PUq8A/ICyg5yAcSypRmsmEDk//2gAMAwEAAgADAAAAEDcP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQIBAT8QZ//EABsQAQADAQEBAQAAAAAAAAAAAAEAESExUUGB/9oACAEBAAE/EHIDwLA77yUD0mYOlPpCzFSHH9idYAWFTgAAyf/Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;04&quot;
        title=&quot;04&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/e9c16a5f07621e549d3be7d43fe3c8a0/6aca1/04.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/e9c16a5f07621e549d3be7d43fe3c8a0/d2f63/04.jpg 163w,
https://hfai-static.high-flyer.cn/static/e9c16a5f07621e549d3be7d43fe3c8a0/c989d/04.jpg 325w,
https://hfai-static.high-flyer.cn/static/e9c16a5f07621e549d3be7d43fe3c8a0/6aca1/04.jpg 650w,
https://hfai-static.high-flyer.cn/static/e9c16a5f07621e549d3be7d43fe3c8a0/7c09c/04.jpg 975w,
https://hfai-static.high-flyer.cn/static/e9c16a5f07621e549d3be7d43fe3c8a0/47311/04.jpg 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;这里我们看到 GPU 的利用率时高时低，有一半的时间的利用率都接近 0。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;由此我们可以推测该训练任务阻塞在 CPU 运算上&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&quot;任务毫秒级-tracing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BB%BB%E5%8A%A1%E6%AF%AB%E7%A7%92%E7%BA%A7-tracing&quot; aria-label=&quot;任务毫秒级 tracing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;任务毫秒级 tracing&lt;/h2&gt;
&lt;h3 id=&quot;1-使用-haiprof-命令行工具&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-%E4%BD%BF%E7%94%A8-haiprof-%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7&quot; aria-label=&quot;1 使用 haiprof 命令行工具 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. 使用 haiprof 命令行工具&lt;/h3&gt;
&lt;p&gt;为了更详细地分析模型的运行时间，我们可以使用 haiprof 的 tracing 功能，用户只需要在使用 hai python 提交任务的时候指定选项 profile.trace=1，就可以自动地对任务进行毫秒级别的 tracing。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;hai python train.py -n &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; -p &lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;-f –opons profile.trace&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; –options profile.warmup&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;120&lt;/span&gt; –options profile.time&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;该命令代表先预热 120 秒，然后 tracing 15 秒&lt;/p&gt;
&lt;h3 id=&quot;2-运行数据可视化分析&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%E8%BF%90%E8%A1%8C%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96%E5%88%86%E6%9E%90&quot; aria-label=&quot;2 运行数据可视化分析 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. 运行数据可视化分析&lt;/h3&gt;
&lt;p&gt;Tracing 结束后结果以 json 格式保存在 log 目录里。我们可以把结果拷贝到当前目录然后使用 tensorboard 查看结果：&lt;/p&gt;
&lt;p&gt;打开 tensorboard，在 overview 页面我们可以看到模型运行过程中的 GPU SM 利用率、不同部分的时间占比等。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/c7bccd3b22aed7bdd918bef709e1dd85/47311/05.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.25766871165644%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQDBQf/xAAWAQEBAQAAAAAAAAAAAAAAAAACAAP/2gAMAwEAAhADEAAAAdHXepTo0Tkf/8QAGxAAAwACAwAAAAAAAAAAAAAAAQIDABESExX/2gAIAQEAAQUCMZ66kxZDi4DJ5sMlJYp//8QAGREAAwADAAAAAAAAAAAAAAAAAAECESFR/9oACAEDAQE/AZrrY6edM//EABgRAAMBAQAAAAAAAAAAAAAAAAACURIT/9oACAECAQE/AeawwsP/xAAeEAACAgICAwAAAAAAAAAAAAAAAQIRMmESMUKRkv/aAAgBAQAGPwLBGEPYuUYXocX01R5/QoQutn//xAAbEAACAgMBAAAAAAAAAAAAAAAAIQEREDFBcf/aAAgBAQABPyF/ITcheo3kiZ2GGUytrP/aAAwDAQACAAMAAAAQRx//xAAdEQABAgcAAAAAAAAAAAAAAAABABEhUWFxscHw/9oACAEDAQE/EJOtHYRxON1Tlf/EABgRAQADAQAAAAAAAAAAAAAAAAEAMZFR/9oACAECAQE/EBbGR4Mn/8QAHBABAQEBAAIDAAAAAAAAAAAAAREhADFhcaHw/9oACAEBAAE/EFCiF0dz54JFE8uB97xXGy7t18byKKoMYkeHD8fXF1UjVVV2d//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;05&quot;
        title=&quot;05&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/c7bccd3b22aed7bdd918bef709e1dd85/6aca1/05.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/c7bccd3b22aed7bdd918bef709e1dd85/d2f63/05.jpg 163w,
https://hfai-static.high-flyer.cn/static/c7bccd3b22aed7bdd918bef709e1dd85/c989d/05.jpg 325w,
https://hfai-static.high-flyer.cn/static/c7bccd3b22aed7bdd918bef709e1dd85/6aca1/05.jpg 650w,
https://hfai-static.high-flyer.cn/static/c7bccd3b22aed7bdd918bef709e1dd85/7c09c/05.jpg 975w,
https://hfai-static.high-flyer.cn/static/c7bccd3b22aed7bdd918bef709e1dd85/47311/05.jpg 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;在 GPU kernel 页面我们可以看到不同 GPU kernel 算子的时间占比。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/73bc7dcbd1bcd7aef453dd4f2d6ecfd5/47311/06.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.87116564417178%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQDBQf/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAdBhszNWGA//xAAYEAADAQEAAAAAAAAAAAAAAAABAgMAIf/aAAgBAQABBQKyIk6CazMZ5jzHf//EABoRAAICAwAAAAAAAAAAAAAAAAABAhESIVH/2gAIAQMBAT8BcpVpmT6f/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAISUf/aAAgBAgEBPwGFwhcP/8QAGxAAAQUBAQAAAAAAAAAAAAAAAQACERNBIDL/2gAIAQEABj8CLqpjEHUEzi8Dj//EABkQAAMBAQEAAAAAAAAAAAAAAAABESExQf/aAAgBAQABPyFta+F0p/RzqqEniCCQXh2f/9oADAMBAAIAAwAAABA3H//EABYRAQEBAAAAAAAAAAAAAAAAAAEAYf/aAAgBAwEBPxBaEG3X/8QAGREAAgMBAAAAAAAAAAAAAAAAAAERIZFh/9oACAECAQE/EFPa4cGH/8QAGxABAQADAQEBAAAAAAAAAAAAAREAITFBUXH/2gAIAQEAAT8QH5BtqkN9hurHKpgULsbl35+pzuHigWC46KG+OMeHn3EAh59z/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;06&quot;
        title=&quot;06&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/73bc7dcbd1bcd7aef453dd4f2d6ecfd5/6aca1/06.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/73bc7dcbd1bcd7aef453dd4f2d6ecfd5/d2f63/06.jpg 163w,
https://hfai-static.high-flyer.cn/static/73bc7dcbd1bcd7aef453dd4f2d6ecfd5/c989d/06.jpg 325w,
https://hfai-static.high-flyer.cn/static/73bc7dcbd1bcd7aef453dd4f2d6ecfd5/6aca1/06.jpg 650w,
https://hfai-static.high-flyer.cn/static/73bc7dcbd1bcd7aef453dd4f2d6ecfd5/7c09c/06.jpg 975w,
https://hfai-static.high-flyer.cn/static/73bc7dcbd1bcd7aef453dd4f2d6ecfd5/47311/06.jpg 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;在 trace 页面，我们可以看到整个模型运行的 timeline，里面包括的 forward、backward、optimizer 的时间，以及不同算子、函数的时间占比。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/7bac22323da257acdebe19062cc99229/47311/07.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.87116564417178%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAQFAQf/xAAVAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAAB6KvR2KlD4n//xAAYEAADAQEAAAAAAAAAAAAAAAAAAgMRAf/aAAgBAQABBQJozzsJnJqMZwfN/8QAGBEAAgMAAAAAAAAAAAAAAAAAABIBAlH/2gAIAQMBAT8Be2jSf//EABcRAAMBAAAAAAAAAAAAAAAAAAACElH/2gAIAQIBAT8BhcJXD//EABkQAQACAwAAAAAAAAAAAAAAAAABMRAiMv/aAAgBAQAGPwKNVOUKx//EABsQAAIDAAMAAAAAAAAAAAAAAAABESExYXHR/9oACAEBAAE/Ib4pAcW6IOPSyHDEwUH/2gAMAwEAAgADAAAAECs//8QAFxEAAwEAAAAAAAAAAAAAAAAAAAFhkf/aAAgBAwEBPxCjWVen/8QAFxEAAwEAAAAAAAAAAAAAAAAAAGGRAf/aAAgBAgEBPxBaYKQ//8QAHRABAQABBQEBAAAAAAAAAAAAAREAITFBYXEQUf/aAAgBAQABPxCwCrxddNs2EQyiXCxNGLNOwceYgyc/vXxRCImx7n//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;07&quot;
        title=&quot;07&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/7bac22323da257acdebe19062cc99229/6aca1/07.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/7bac22323da257acdebe19062cc99229/d2f63/07.jpg 163w,
https://hfai-static.high-flyer.cn/static/7bac22323da257acdebe19062cc99229/c989d/07.jpg 325w,
https://hfai-static.high-flyer.cn/static/7bac22323da257acdebe19062cc99229/6aca1/07.jpg 650w,
https://hfai-static.high-flyer.cn/static/7bac22323da257acdebe19062cc99229/7c09c/07.jpg 975w,
https://hfai-static.high-flyer.cn/static/7bac22323da257acdebe19062cc99229/47311/07.jpg 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这里我们看到，这个模型中有相当一部分的算子运算是在 CPU 上做的，这导致了在大部分的时间 GPU 都处于空闲状态&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&quot;诊断后优化&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AF%8A%E6%96%AD%E5%90%8E%E4%BC%98%E5%8C%96&quot; aria-label=&quot;诊断后优化 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;诊断后优化&lt;/h2&gt;
&lt;p&gt;接下来我们根据这个发现优化一下模型，把这部分算子放到 GPU 上计算。改完后重新提交任务：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;hai python train.py -n &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; -p &lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt; -f –name v2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;我们可以看到，优化过后的模型 forward 的时间只有原来的 1/3，整体训练速度提升了一倍。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/cb9557963ffcd6202dbf11813e8ca71e/5b6f0/08.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 48.46625766871166%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAAKABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEDBAb/xAAWAQEBAQAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAe8V0Z0NA3//xAAaEAABBQEAAAAAAAAAAAAAAAACAAMREjIi/9oACAEBAAEFAiMI5TdKllM4/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAh/9oACAEDAQE/ARyL/8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQIBAT8BJ//EABoQAAICAwAAAAAAAAAAAAAAAAAQAaIxMuH/2gAIAQEABj8C4YqaVUr/xAAbEAADAAIDAAAAAAAAAAAAAAAAAREhQTFRsf/aAAgBAQABPyHEwp31gqtthnsNu5afpwn/2gAMAwEAAgADAAAAEMsf/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAR/9oACAEDAQE/EGYtL//EABcRAQEBAQAAAAAAAAAAAAAAAAEAMWH/2gAIAQIBAT8QAZ2b/8QAHhABAAICAQUAAAAAAAAAAAAAAQARITFxQVGRweH/2gAIAQEAAT8QHiNVqxBXuhNcpbG7mfqdceZvDmhqqq/Cf//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;08&quot;
        title=&quot;08&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/cb9557963ffcd6202dbf11813e8ca71e/6aca1/08.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/cb9557963ffcd6202dbf11813e8ca71e/d2f63/08.jpg 163w,
https://hfai-static.high-flyer.cn/static/cb9557963ffcd6202dbf11813e8ca71e/c989d/08.jpg 325w,
https://hfai-static.high-flyer.cn/static/cb9557963ffcd6202dbf11813e8ca71e/6aca1/08.jpg 650w,
https://hfai-static.high-flyer.cn/static/cb9557963ffcd6202dbf11813e8ca71e/5b6f0/08.jpg 701w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[全球气象预测开源大模型 OpenCastKit]]></title><description><![CDATA[用 AI 方法对现代数值天气预报（numerical weather prediction, NWP）进行改进提升近两年受到了广泛关注，如 Nvidia 发布的 FourCastNet、 DeepMind 发布的 GraphCast…]]></description><link>https://www.high-flyer.cn/blog/opencast/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/opencast/</guid><dc:creator><![CDATA[Vachel]]></dc:creator><pubDate>Fri, 17 Mar 2023 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;用 AI 方法对现代数值天气预报（numerical weather prediction, NWP）进行改进提升近两年受到了广泛关注，如 Nvidia 发布的 FourCastNet、 DeepMind 发布的 GraphCast 和华为发布的盘古气象大模型，在与欧洲中期天气预报中心（ECMWF）的高分辨率综合预测系统（IFS）对比中都获得了不错的效果。&lt;/p&gt;
&lt;p&gt;基于此，我们最近复现整合了这些工作，并将这些成果贡献给开源社区。我们基于 FourCastNet 和 GraphCast 论文构建了一个新的全球AI气象预测项目 —— &lt;strong&gt;OpenCastKit&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/003f92d95ed5c1691b094973a13340c5/681f1/01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46.62576687116564%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAABdElEQVQoz22SS24UMRRFa//bQGwgrAAxRJEyCWIGgtBNV5Vd/v+q7IPs7kQkMDh6/un5+l5PQnueROIkAt/nwLdL5CIdxnli3gmp/BdlHL9ngbaBWWyc5wVlHZMxDiEkm7ZIZdiMY14lUltWqRCbGfNFKFapx5lnlHasm8bZRFCJWmDKMWI2hQ+JlDoZHwK5FGqtHH8x5kfFWIf1Aes83kUeLl95/+UDn57umbSL11t8IMRIiGmMUy7XRkd9VfejoozFWI/ujU3g/vTIu8c7Pv78zPTj14nOeRZcFjn88KngY8HFjAv/0j3s1nSbRH+6tCS7c2SYFlc5r5q1N4qZmMvAxzQ87PRxDyim696oz+RbQIsYQU6rb6zKs++F1qDWRmuN4zgwxuKcH971tbfUW+3eK6WJKTFtsbHZwF4KDV4Od896sx5A2fdXe29JOWOsHXUSoSFNoNZj3NjV1JtCax3aWErZr4pG0u1GfVHelWltxg/5A1pst4emvgstAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;01&quot;
        title=&quot;01&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/003f92d95ed5c1691b094973a13340c5/a6d36/01.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/003f92d95ed5c1691b094973a13340c5/222b7/01.png 163w,
https://hfai-static.high-flyer.cn/static/003f92d95ed5c1691b094973a13340c5/ff46a/01.png 325w,
https://hfai-static.high-flyer.cn/static/003f92d95ed5c1691b094973a13340c5/a6d36/01.png 650w,
https://hfai-static.high-flyer.cn/static/003f92d95ed5c1691b094973a13340c5/681f1/01.png 899w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;项目地址&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/OpenCastKit&quot;&gt;https://github.com/HFAiLab/OpenCastKit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这个项目提供了一个强大的、基于ERA5数据训练的开源气象模型和参数，可以生成全球高分辨率的气象预测。具体来说，它包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个统一的数据处理工具，抽取ERA5数据和特征并整理成高性能训练数据格式 &lt;a href=&quot;/blog/ffrecord&quot;&gt;FFRecord&lt;/a&gt;；&lt;/li&gt;
&lt;li&gt;基于 &lt;a href=&quot;/blog/hfnn&quot;&gt;hfai 算子&lt;/a&gt;和 &lt;a href=&quot;/blog/hf-reduce&quot;&gt;hfreduce 并行通信&lt;/a&gt;优化的 FourCastNet 模型源码和 GraphCast 模型源码，供社区研究优化；&lt;/li&gt;
&lt;li&gt;基于1979年到2022年15TB的ERA5数据，在萤火高性能集群上训练的模型参数，可以进行微调，获得高精度预测结果。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;同时，我们上线了一个每日更新的 &lt;strong&gt;HF-Earth&lt;/strong&gt;，实时展示气象大模型输出的全球预报效果：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/65256dac668d56ea96d5ff7d27b5cce0/8ce52/02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 76.68711656441718%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsTAAALEwEAmpwYAAACHklEQVQ4y5WUT0jTcRjG9/v99g/StjX3h1VSh0wLp2g6pwxm6pTEmNpyQYSHNCgiqlUeosJLHUaRlyBiROAlBCl2GCLUJYiikxHV0MyDawNragPD2SecWzDMbR0eXvi+z/d5n4fvl1cmk8n4F1RKJUajme1FxVhMRkp26DCWGDAYjGx1J43Nh4IgpGrpbhOnz5/h6t2HnB2+Q5PLtYmTV1AUN4gnumtZiI6zuDLFzNJXXsyv8Gr+G+OjQ+g1qrRoHkExPbV2v4lE6CKE/axFHrC2NMbP1fdEIiH4HiA44i0scmZioMsKjwZYDvr49XKI5NsbJN7dIjLpI/LsHAQHcVaYskxsGVkpCEzUlbFwrZfVucck46MkxwaI3j5KeKSPqL8b/G6u2Pam+HIxj6BaFHnjqma2xcqXU04W750kcd9D7PoREjc7iV9q5fdgM74DuzYE8zlcx9OmcuY66/jQVsWnw5XM9juY7ncQ9tqJeWzEPXbazdp05FyPkq4dZi0/ehuI9Nh43VHD52M2prrrmWypJn68kefNBxEK/YcZ4uXynSz3NRLz2JnpaeCj28Z0Vz0TbVb2FKmzuHkjZ+Awawg4Kwi1V/Hk0D4ulFnQqeRZaQoWzJou5OjljSzKESRFCpKkQKnalnIjyWQoJAlJFBHTKNCh8BeCIKLTatDbvOgrW1FLmf5/LocM1jeLXluMqrQGi3sYjU6PUiHPKfgHVrqybOScGAgAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;02&quot;
        title=&quot;02&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/65256dac668d56ea96d5ff7d27b5cce0/a6d36/02.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/65256dac668d56ea96d5ff7d27b5cce0/222b7/02.png 163w,
https://hfai-static.high-flyer.cn/static/65256dac668d56ea96d5ff7d27b5cce0/ff46a/02.png 325w,
https://hfai-static.high-flyer.cn/static/65256dac668d56ea96d5ff7d27b5cce0/a6d36/02.png 650w,
https://hfai-static.high-flyer.cn/static/65256dac668d56ea96d5ff7d27b5cce0/8ce52/02.png 681w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Demo地址&lt;/strong&gt;：&lt;a href=&quot;https://www.high-flyer.cn/hf-earth/&quot;&gt;https://www.high-flyer.cn/hf-earth/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;经过一段时间的测试来看，AI气象大模型对台风、极端降水等事件的预测上效果明显，在长期气候变化的分析中可以起到一定作用。希望在此开源项目的基础上，构建出更加强大的 AI 气象应用。&lt;/p&gt;
&lt;h2 id=&quot;数据集&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E9%9B%86&quot; aria-label=&quot;数据集 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;数据集&lt;/h2&gt;
&lt;p&gt;欧洲中期天气预报中心（ECMWF）提供了一个公开可用的综合数据集 ERA5，其将物理模型数据与来自世界各地的观测数据结合起来，形成一个全球完整的、一致的数据集，以小时级到天级不等，提供包括温度、风量、降水、水文、气压等多项全球气象指标数据，供各种气象预报模型学习。&lt;/p&gt;
&lt;p&gt;官方地址：&lt;a href=&quot;https://www.ecmwf.int/en/forecasts/datasets/reanalysis-datasets/era5&quot;&gt;https://www.ecmwf.int/en/forecasts/datasets/reanalysis-datasets/era5&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;FourCastNet 与 GraphCast 使用了不同规模的 ERA5 数据来训练，产生的预测效果各自不同。前者仅使用了 20 个相关气象指标，包括 4 个不同位势高度下的温度、风速、相对湿度和一些近地表变量，其旨对极端天气、自然灾害进行预警；而后者使用了更加全面的数据，其包含 37 个不同位势高度下的气象指标和 5 个地表气象指标，总计 227 个指标，其旨在对气象变化进行更加全面的评估和预报。&lt;/p&gt;
&lt;p&gt;对此，我们将这些数据进行了归纳整理，通过 &lt;a href=&quot;/blog/hfai_datasets&quot;&gt;hfai.datasets&lt;/a&gt; 工具进行管理优化。原始数据通过特征处理，转化成 “&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;→&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;X_{t-1},X_t \rightarrow X_{t+1}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8917em;vertical-align:-0.2083em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.07847em;&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2083em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.07847em;&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2806em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;→&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8917em;vertical-align:-0.2083em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.07847em;&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2083em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;” 的模式，通过高性能训练样本格式 ffrecord 进行保存，从而可以在萤火集群中进行高效的并行训练。更多信息可以浏览 &lt;a href=&quot;https://doc.hfai.high-flyer.cn/api/datasets.html#hfai.datasets.ERA5&quot;&gt;hfai 数据集仓库&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&quot;模型构建和优化&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E6%9E%84%E5%BB%BA%E5%92%8C%E4%BC%98%E5%8C%96&quot; aria-label=&quot;模型构建和优化 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型构建和优化&lt;/h2&gt;
&lt;p&gt;为了进行 0.25° 分辨率下的全球气象预测，FourCastNet 采用自适应傅里叶神经算子 AFNO，而 GraphCast 采用了图神经网络。前者计算效率高效，可以灵活且可扩展地建模跨空间和不同指标之间的依赖关系；后者通过构建节点之间的联系，更加详细捕捉如“蝴蝶效应”般的气候因子影响。前者在小 batchsize 上可以进行数据并行以加速训练，而后者球体节点之间的 message passing 参数规模更大，需要进行流水线并行（或称模型并行）的改造，以实现模型的完整训练。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/874989270f94772cab92f3fe9d4d956b/a6d36/03.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 65.6441717791411%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAACBklEQVQoz21SPW8TQRD1r6LhJxDRUFDwH/gBkaihoEcUFIgClCJRkCKhCCqIIyIQYEcQYlsGbN/lbu/2fPtxs7O7s4vuLooB8brZmaeZ9/YNpJRCCCkloo0xpnn58mS4++F4tFrEGJum0VoDgLVO66YrGyGktc5aN/Dexw4UKMY4ZcuHR1tPhlv7x3d4/dH7SEQhBCIyBouiYIxZ265x7g9yiCHG6Cm8mzzdeX1z5+31/fE9slGIuiyLLMurap1lWVEUSqkQgvf+khxC6C+MIbjgf7FPk3x4Ic4RHQC00qQEAES01iJiu+aKTES9cgCoOK/XWlSgpZFSdtN2o44IAIwxiLg5GxH7V15xxrIkXQlZ92RjjNbae6+1Vkr1pTFmIDoAAGNsuVwag9BYUes1F1qBUo1SMsvyJEk552XJOedCiEvNsgMAFEWxWCwBmh/p2TwZz9Nvs5+n6yohiqvVijHWO3x16UZz12i1EZlJOVqI91N2dH7xpqy/E0WlpDEm/o2W3BuglOqfGnDj+Wo0naVVHSg2TdvqP/b/ZOfa9GA38WV2tr136/7e7ReHd6Waeh+ttaoDYuscAIQQ/iFrokDerVVz8PnBo1c3Hh9cez7cdhhr0WYjSRLOeZbleZ63cejJvQeI6D0550OIwujT6e7J7NnXxWGbC4vOOUQ0xtgO3bC31v4Gn9faRp5JRVsAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;FourCastNet 模型结构&quot;
        title=&quot;FourCastNet 模型结构&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/874989270f94772cab92f3fe9d4d956b/a6d36/03.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/874989270f94772cab92f3fe9d4d956b/222b7/03.png 163w,
https://hfai-static.high-flyer.cn/static/874989270f94772cab92f3fe9d4d956b/ff46a/03.png 325w,
https://hfai-static.high-flyer.cn/static/874989270f94772cab92f3fe9d4d956b/a6d36/03.png 650w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/bbac24433e758289d8f952c3122084b2/27b7a/04.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 80.3680981595092%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAADvElEQVQ4y12TW3PTRhTH9Q370NfO0K/QgQYYLmkTZwoTBgoDfWgJAUoL4ZImJXUgbohDHBIHEyWWbXyPZNmSJcuWJflKnPw6Ei3t9Lzsztk9u+d/OYLjOMiyQrl8QK1Wo16vY9s2hmGgqiqapqEoFUqlEsfHx/T7fXRdp1qtYpom2t81ft4PwT9cmH/C4sJ88JAf7XYb13U5PDzEsiwWF54x//Rx8Em326XT6TAYDOj1enS7PV6+CDP36Bfy+TzCH+EVTl+c4uy5C6y+WqfVspAkiXg8TqVSIRJZZez8N5w+d5Hw8grlcolMJsOBLAfr27cJzoxf5uK349yZ/RmhVD7g7PgVQpeuc+XaDSZD16nVNMrlMq1WK4A0PnWDCxPTATV+Z373fqf+6roO127e5auxCd6920XwITZMHc9roygKsdh2AN3zvE8UmIZBrVoN9kdHRwGX/w2n3UKRy0FesO0WxVIZWVbp9YZBwaeLjossH9BoaMAho9Ew4OyjMBrZbJ56vUHb6dDr9RmNPiCUywaRP/d4FX3P1naRra0Cu+IBnuerdoxpOoTDJVZWVBTFCz4ajY5IJIqsRVNsbOTYjpdIiDLpdA1Blhs0zD4PlpcQ03lMw6OiNvG8Do5zyK2b+5z4Isrnn0WYnt5Bll0fOJJUwbS6yFmN3UWJ3G6FSqWJ4BdqqsHJy2PMPX+KqujUNIPRqE8kIjM+vsql0CrfTUaYCq2xsJBnOBwEwhVKJd5tiSz9sIAUT2G12gi+mbfe7HDi1pecnDnFRjRGUkpj2yYvlvNcurzKxESYq1eXOHM2zN3ZZGAtUdxjPbbJs1/n+enraWKbm8FwCOJ+ivv3H3Ny9hTnZ85xb+Y2y+HfGQx66PUuodA6Y2NhJidXmApF2d83Ah5frqxx595D7vx4m9mr3/Pw0QPib2IIqXSOVDLF7t4e4v4uxVwWo25yOPqotKK4/DafZW5OIpmsB7nh8IhmyyWXLSBJKVLpFNlUEjGxg+Cbs9WqY5p1mpZF22liNZvBfOp6FcPQAo/+E//34Mfcv3vBn9v4Vp2q6mIYTRI7Fo2Gi6o2yL63sW0HRbEwjA/BdMhyO1Dftl0KBZt2e0iz6aLrAwaDIwSt1mf+SYNMqkMu6/Ey3CKf65DJeCTeepRKHTJpl+S+SzbbRhRtJMkhmbRYjxrE4ybFYod0ekCx2PUhf2B726Ba7aDrPdbWdFS1S6HgEF3TMI0+omixGdOxrD6vX9dIJAx0vcPiYoFk0kTTOqxHVapVl78Aux5lIfMAHx0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;GraphCast 模型结构&quot;
        title=&quot;GraphCast 模型结构&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/bbac24433e758289d8f952c3122084b2/a6d36/04.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/bbac24433e758289d8f952c3122084b2/222b7/04.png 163w,
https://hfai-static.high-flyer.cn/static/bbac24433e758289d8f952c3122084b2/ff46a/04.png 325w,
https://hfai-static.high-flyer.cn/static/bbac24433e758289d8f952c3122084b2/a6d36/04.png 650w,
https://hfai-static.high-flyer.cn/static/bbac24433e758289d8f952c3122084b2/27b7a/04.png 804w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;这里我们采用自研的 &lt;a href=&quot;/blog/haiscale&quot;&gt;haiscale 高性能并行训练工具库&lt;/a&gt;对两种模型进行复现优化。对于 FourCastNet，我们使用 &lt;code class=&quot;language-text&quot;&gt;haiscale.ddp&lt;/code&gt; 或者 &lt;code class=&quot;language-text&quot;&gt;haiscale.fsdp&lt;/code&gt; 进行数据并行优化，实验中我们采用小 batchsize 即实现了论文效果的复现；对于 GraphCast，完整参数基本无法塞入单张显卡，因此对于不同的环节，如球体中 grid 节点与 mesh 节点进行message passing，我们需要对其拆分，让其分布在不同的显卡上，通过 &lt;code class=&quot;language-text&quot;&gt;haiscale.pipeline&lt;/code&gt; 对不同环节进行串联，实现模型并行训练。具体如下：&lt;/p&gt;
&lt;h3 id=&quot;fourcastnet-数据并行&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#fourcastnet-%E6%95%B0%E6%8D%AE%E5%B9%B6%E8%A1%8C&quot; aria-label=&quot;fourcastnet 数据并行 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;FourCastNet 数据并行&lt;/h3&gt;
&lt;p&gt;FourCastNet 模型的训练包括 pretrian、finetune 和 precipitation 三个部分。模型采用递进式，即以 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;X_t&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8333em;vertical-align:-0.15em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.07847em;&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2806em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 作为输入，预测下一步 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;X_{t+1}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8917em;vertical-align:-0.2083em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.07847em;&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2083em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;。一次训练输出多步，与真值对比计算 loss。如下伪代码所示：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;datasets &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; ERA5
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; haiscale&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ddp &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; DistributedDataParallel
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;utils&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;distributed &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; DistributedSampler

model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; FourCastNet&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DistributedDataParallel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
optimizer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;optim&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Adam&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parameters&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; lr&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.01&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ERA5&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;split&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;train&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
sampler &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DistributedSamper&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; shuffle&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
dataloader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loader&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;batch_szie&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sampler&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;sampler&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; num_workers&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pin_memory&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; drop_last&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# training ...&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; step&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xt0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; xt1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; xt2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pt2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dataloader&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    xt1_pred &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xt0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;            &lt;span class=&quot;token comment&quot;&gt;# pretrain&lt;/span&gt;
    xt2_pred &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xt1_pred&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;          &lt;span class=&quot;token comment&quot;&gt;# finetune&lt;/span&gt;
    pt2_pred &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xt2_pred&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; precip&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;# preciptation&lt;/span&gt;

    pretrain_loss &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; criterion&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xt1_pred&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; xt1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    finttune_loss &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; criterion&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xt2_pred&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; xt2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    precip_loss &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; criterion&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pt2_pred&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pt2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;token comment&quot;&gt;# optim ...&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# stop hfreduce&lt;/span&gt;
model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reducer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stop&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;haiscale.ddp 默认采用 hfreduce 进行通信优化，我们还可以使用优化算子，加入一行 &lt;code class=&quot;language-text&quot;&gt;model = hfai.nn.to_hfai(model)&lt;/code&gt; 代码进行进一步加速。在萤火集群上我们使用 96 张 A100 进行数据并行加速，耗时 16~17 个小时左右基本可以完成 FourCastNet 的整体训练。&lt;/p&gt;
&lt;h3 id=&quot;graphcast-数据并行&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#graphcast-%E6%95%B0%E6%8D%AE%E5%B9%B6%E8%A1%8C&quot; aria-label=&quot;graphcast 数据并行 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;GraphCast 数据并行&lt;/h3&gt;
&lt;p&gt;不同于 FourCastNet，GraphCast 只有主干模型一个，其也是采用递进式，不过以 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;G&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;X_{t-1}, X_t, T, C, G&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8917em;vertical-align:-0.2083em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.07847em;&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2083em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.07847em;&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2806em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.13889em;&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.07153em;&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;G&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 作为输入，预测下一步 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;X_{t+1}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8917em;vertical-align:-0.2083em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.07847em;&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mbin mtight&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2083em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;。这里 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;T, C&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8778em;vertical-align:-0.1944em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.13889em;&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.07153em;&quot;&gt;C&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 代表了时间戳信息和地理位置信息，&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;G&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;G&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.6833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;G&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 代表所构建的球体 Graph 信息。如下伪代码所示：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;datasets &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; ERA5
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; haiscale&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ddp &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; DistributedDataParallel
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; haiscale&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pipeline &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; PipeDream&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; make_subgroups&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; partition
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;utils&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;distributed &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; DistributedSampler

dist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;init_process_group&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_device&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;local_rank&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
rank&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; world_size &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_rank&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_world_size&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

dp_group&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pp_group &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; make_subgroups&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pp_size&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;pp_size&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
dp_rank&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dp_size &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dp_group&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rank&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dp_group&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;size&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
pp_rank&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pp_size &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pp_group&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rank&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pp_group&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;size&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; GraphCast_sequentail&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; partition&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pp_group&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rank&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pp_group&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;size&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; balance&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DistributedDataParallel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; process_group&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;dp_group&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; PipeDream&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;chunks&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; process_group&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;pp_group&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
optimizer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;optim&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Adam&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parameters&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; lr&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.01&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ERA5&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;split&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;train&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
sampler &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DistributedSamper&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; num_replicas&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;dp_size&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; rank&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;dp_rank&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; shuffle&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
dataloader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loader&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;batch_szie&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sampler&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;sampler&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; num_workers&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pin_memory&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; drop_last&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
earth_graph &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; generate_graph&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# training ...&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; step&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xt0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; xt1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; xt2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dataloader&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    loss &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;forward_backward&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xt0&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; xt1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; earth_graph&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; criterion&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;criterion&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; labels&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xt2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;token comment&quot;&gt;# optim ...&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# synchronize all processes&lt;/span&gt;
model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;module&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reducer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stop&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
dist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;barrier&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;在使用 haiscale.pipeline 进行流水线并行训练时，需要我们提前将模型进行拆分，通过 &lt;code class=&quot;language-text&quot;&gt;haiscale.SequentialModel&lt;/code&gt; 进行模型的串联。同时 haiscale 提供了一个统一的 &lt;code class=&quot;language-text&quot;&gt;forward_backward&lt;/code&gt; 接口，进行样本和标签的统一输入和结果输出。在萤火集群上我们使用 256 张 A100 进行模型并行加速（单节点 8 卡做流水并行，32 节点做数据并行），耗时 3 天左右基本可以完成 GraphCast 的整体训练。&lt;/p&gt;
&lt;p&gt;关于代码的更多细节可以访问项目地址&lt;a href=&quot;https://github.com/HFAiLab/OpenCastKit&quot;&gt;阅读源码&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&quot;预测结果&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E9%A2%84%E6%B5%8B%E7%BB%93%E6%9E%9C&quot; aria-label=&quot;预测结果 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;预测结果&lt;/h2&gt;
&lt;p&gt;参照论文中的评估方式，我们采用递归输出未来多天的预测结果，与真实值对比，通过误差增长曲线来比较不同AI气象大模型的预测效果。如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/c4f74e4daf8f3e1550828982f75a266d/d67fd/05.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46.62576687116564%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAABNElEQVQoz2VSWa6DMBDr/Q/Z/rRA2MlGFsBPHgotr5YiDZHHdma4xRjRdh2ezycejweMMeBdyhnOOZRVBWut1Kqu8XoVuN/vwkspCXeeZ9RNC60NbiEEWOehjcEwDFjXFUTOSYyMD4gpwVm787RB3/fYtg0HiqpGN0yglgjyfCOGAKVqGB/le8lZUv7nEa9Swfr9nmlvjMvohyMbK9XAhfQxiBHjOF4EyS+qBsb63XRZdkGllBQE51TVHfK6nU2E9x5FUZw8jqVQLeYQTx7vRDDnLAk5s1I1SMtH7BDM7wXxNYRqOjg/X0xPQT5DNti08DFfSAfye4Y0nYxDP+ofHmsRZLqSC3Dz6XSkO2pyKNgPIwZtf3g8nKFsme78FTgn/lts1FrLOep9JFnqb940TZce8v4AzIy9LTXlK+gAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;05&quot;
        title=&quot;05&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/c4f74e4daf8f3e1550828982f75a266d/a6d36/05.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/c4f74e4daf8f3e1550828982f75a266d/222b7/05.png 163w,
https://hfai-static.high-flyer.cn/static/c4f74e4daf8f3e1550828982f75a266d/ff46a/05.png 325w,
https://hfai-static.high-flyer.cn/static/c4f74e4daf8f3e1550828982f75a266d/a6d36/05.png 650w,
https://hfai-static.high-flyer.cn/static/c4f74e4daf8f3e1550828982f75a266d/d67fd/05.png 670w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;可以看到，在进行 14 天的中期天气预报测试中，无论是GraphCast 还是 FourCastNet，递归预测导致误差随时间逐步增长。整体误差上看 GraphCast 考虑了地理时间和地理位置的因素，预测误差比 FourCastNet 要小。受此启发，我们将时间和地理信息加入 FourCastNet 进行模型训练（FourCastNet+），发现最终模型输出的预测误差几乎与 GraphCast 一致。&lt;/p&gt;
&lt;p&gt;下面我们以 2022 年 6 月 22 日开始连续输出 14 天的预测，展示 OpenCastKit 的预测效果：&lt;/p&gt;
&lt;div align=&quot;center&quot;&gt;
   &lt;img src=&quot;https://hfai-static.high-flyer.cn/28d61042cf7f7bccad2060c6cbe4fe68/ft.gif&quot; alt=&quot;Logo&quot; width=&quot;300&quot;&gt;
   &lt;img src=&quot;https://hfai-static.high-flyer.cn/2f1bfc481f37e845b7c40b4d56493d5a/fw.gif&quot; alt=&quot;Logo&quot; width=&quot;300&quot;&gt;
   &lt;p&gt;FourCastNet 温度预测与风力预测&lt;/p&gt;
   &lt;img src=&quot;https://hfai-static.high-flyer.cn/a8c31edb1e988cf68cee99a124a1fb8f/gt.gif&quot; alt=&quot;Logo&quot; width=&quot;300&quot;&gt;
   &lt;img src=&quot;https://hfai-static.high-flyer.cn/72d044cd91646892b0aa802796a8f6b6/gw.gif&quot; alt=&quot;Logo&quot; width=&quot;300&quot;&gt;
   &lt;p&gt;GraphCast 温度预测与风力预测&lt;/p&gt;
   &lt;img src=&quot;https://hfai-static.high-flyer.cn/c2946ce70679f2e5e3c2187e12fd2f29/tt.gif&quot; alt=&quot;Logo&quot; width=&quot;300&quot;&gt;
   &lt;img src=&quot;https://hfai-static.high-flyer.cn/94dee423a294778a3e5b997b47a95f75/tw.gif&quot; alt=&quot;Logo&quot; width=&quot;300&quot;&gt;
   &lt;p&gt;真实温度与风力&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;可以看到 FourCastNet 和 GraphCast 都可以对风力和温度的衍变进行比较准确的预测。其中 GraphCast 相对来说更加接近真实情况，包括气象指标的细节纹理更丰富和一致，还有在6月30号开始在我国东南沿海的两次台风路径的预测。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[萤火跑模型 | 高性能 Stable Diffusion 助力高质量 AI 绘图]]></title><description><![CDATA[AI 绘画最近成功破圈，成了炙手可热的热门话题。DALLE，GLIDE，Stable Diffusion 等基于扩散机制的生成模型让 AI 作图发生质变，让人们看到了“AI 转成生产力”的曙光。 在这些扩散模型中，Stable Diffusion…]]></description><link>https://www.high-flyer.cn/blog/stable-diffusion/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/stable-diffusion/</guid><dc:creator><![CDATA[Daylight & Vachel]]></dc:creator><pubDate>Thu, 22 Dec 2022 14:00:00 GMT</pubDate><content:encoded>&lt;p&gt;AI 绘画最近成功破圈，成了炙手可热的热门话题。DALLE，GLIDE，Stable Diffusion 等基于扩散机制的生成模型让 AI 作图发生质变，让人们看到了“AI 转成生产力”的曙光。&lt;/p&gt;
&lt;p&gt;在这些扩散模型中，Stable Diffusion 以其优秀的效果和开源的权重成为了其中的代表，受到广泛的关注和体验。其基于 &lt;a href=&quot;https://laion.ai/blog/laion-5b/&quot;&gt;Laion5B&lt;/a&gt; 超大规模“文本 - 图像”对数据集，Stable AI 宣称用了 5000 张 A100 耗时几个月训练而成。幻方 AI 近期在萤火二号上使用 Google Caption 数据集复现了 Stable Diffusion 的训练，并进行了优化。通过幻方自研的 &lt;a href=&quot;/blog/hfai_pl&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hfai.pl&lt;/code&gt;&lt;/a&gt; 插件将源代码 Pytorch Lightning 框架与萤火集群的特性轻松整合，并通过 &lt;a href=&quot;/blog/3fs&quot;&gt;3FS&lt;/a&gt;、&lt;a href=&quot;/blog/hf-reduce&quot;&gt;hfreduce&lt;/a&gt;、&lt;a href=&quot;/blog/hfnn&quot;&gt;算子&lt;/a&gt;等优化工具对模型训练提速。&lt;/p&gt;
&lt;p&gt;本文将分享我们对 Stable Diffusion 训练优化的心得体验，帮助研究者和开发者们降低研究门槛。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文标题&lt;/strong&gt;：High-Resolution Image Synthesis with Latent Diffusion Models&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原文地址&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/abs/2112.10752&quot;&gt;https://arxiv.org/abs/2112.10752&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;源码地址&lt;/strong&gt;：&lt;a href=&quot;https://github.com/CompVis/stable-diffusion&quot;&gt;https://github.com/CompVis/stable-diffusion&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型仓库&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/stable-diffusion&quot;&gt;https://github.com/HFAiLab/stable-diffusion&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;模型介绍&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E4%BB%8B%E7%BB%8D&quot; aria-label=&quot;模型介绍 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型介绍&lt;/h2&gt;
&lt;p&gt;Stable Diffusion 基于 Latent Diffusion 进行了扩大训练，其将 Text Encoder 从 BERT 更换为 CLIP Text Encoder。我们首先了解下 Latent Diffusion 的模型设计。&lt;/p&gt;
&lt;p&gt;过往虽然扩散模型的生成能力非常强大，在许多不同类型的生成任务上都达到了 SOTA 的水平，但由于其迭代生成的特点在训练和推理时往往都需要耗费非常多的 GPU 资源。Latent Diffusion 针对这一点做出了改进，通过将扩散过程从图片的像素域转变为在编码后的潜空间上，这种方式大幅降低了扩散模型运行时的复杂度，同时也能保留较好的细节和图像生成效果。整体结构如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/98a7c10b6e1017c47e1324b48238964a/1acf3/latent_diffusion_model_structure.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 48.46625766871166%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABJ0AAASdAHeZh94AAACdElEQVQozzWLW2/aBgBG/d/3spdJk6ZtUrusaZuuy9JqS0oxt4aLMbXBxncM2LGxqUnBECiE0CyazqRo+16OzpE+4VqS+WReIbdFKq6Ik5n00x5W1qeilXgtvuKs9jsF+QJzqtNPNZyZyQenwnn3DYOhR61cplVvoCgqgt3QsYMtx3/8ym+NF1iJhRooKFcyovaOD3aZululaop0Qgk1VDATg9fVV/z8/idmoU/3xUvs8zdkkxBh09PI3ZhOs0ArbBKsxhifephZD2lwSUUXqdtVqv/RmHZx5xbtoMmF+hfr5TXz0ZjILJJFHYQHS+efnsp83KcTKigjmV48xIgT1LGNMu7SDbpokYEa2BhJgjVNMTOdQeZiZga/DI858p/gpTpCIimMzAn1xgXH5SOel59T7Va5HltEoUdo1zECn8BtkCRXJJ7CMBhQNEqctk6YLCO+O/6eb374luHVGEETm+junLfvT3lWecrT4hF/1k6IlQKRK+M3zzCHPl79hMjrMZZOcSyJZ6WXPCn+yP5uh6M6NESJ2XSGsJTbzGQNR61R0AoUlHPqTp/Lj33alknh8oJ+bFFsnqMObCptBT2IKeslqoZItsy5uf2bw9c78mWO4Ncq+GKRJHQwpwb9qIcWa8h+m5Z7SWckIXl1Wl7j0Vtek7Ja4m3lDH9mYQQzvHjDen1DnucIs03GYjfn/20WA77cxBzu75kvPpOkE/Z3t9zub9nuvvD1/sB2tyGexOy2a4zRNW604nC3Z7laIeiOTt81yBeLxzB0u4x9k/3+QJqmfOwoPDw8ME1TksmEOIpY36yJ4+jx83m5JUxzVqsV8/mCfwETGrBJgUgDMwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;latent diffusion structure&quot;
        title=&quot;latent diffusion structure&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/98a7c10b6e1017c47e1324b48238964a/a6d36/latent_diffusion_model_structure.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/98a7c10b6e1017c47e1324b48238964a/222b7/latent_diffusion_model_structure.png 163w,
https://hfai-static.high-flyer.cn/static/98a7c10b6e1017c47e1324b48238964a/ff46a/latent_diffusion_model_structure.png 325w,
https://hfai-static.high-flyer.cn/static/98a7c10b6e1017c47e1324b48238964a/a6d36/latent_diffusion_model_structure.png 650w,
https://hfai-static.high-flyer.cn/static/98a7c10b6e1017c47e1324b48238964a/e548f/latent_diffusion_model_structure.png 975w,
https://hfai-static.high-flyer.cn/static/98a7c10b6e1017c47e1324b48238964a/3c492/latent_diffusion_model_structure.png 1300w,
https://hfai-static.high-flyer.cn/static/98a7c10b6e1017c47e1324b48238964a/1acf3/latent_diffusion_model_structure.png 1596w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;latent-encoding&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#latent-encoding&quot; aria-label=&quot;latent encoding permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Latent Encoding&lt;/h3&gt;
&lt;p&gt;Latent Diffusion 通过在一般的扩散模型中增加一个变分自编码器来实现像素空间和隐空间的转换。在训练 DDPM 模型前首先会在 ImageNet 上训练一个 VAE 模型，其旨在学习一个编码器和解码器，用于将图像压缩成潜在编码。VAE 会将图片压缩到原来的 1/4 ~ 1/8 的大小，因此可以极大的降低在隐空间进行操作时的计算复杂度。而在这种情况下压缩再还原后的图片也能较好的保留原图片的信息，基本不会因为压缩产生过大的损失。&lt;/p&gt;
&lt;h3 id=&quot;cross-attention-for-multimodal-generation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#cross-attention-for-multimodal-generation&quot; aria-label=&quot;cross attention for multimodal generation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Cross-Attention for Multimodal Generation&lt;/h3&gt;
&lt;p&gt;Latent Diffusion 创新的使用了注意力机制来进行条件控制信息和图像生成过程的融合。在条件控制生成上，作者在 U-Net 模型的每一层都引入了条件控制信息来控制图像生成的方向。而在控制信息和图像生成过程的融合上，作者引入了 Cross Attention。基于注意力的融合机制使得模型可以更容易的使用不同类型的条件控制信息，例如文本生成图片，图片生成图片，或是语义图生成图片等等。&lt;/p&gt;
&lt;h3 id=&quot;text-based-generation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#text-based-generation&quot; aria-label=&quot;text based generation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Text-based Generation&lt;/h3&gt;
&lt;p&gt;和 Latent Diffusion 不同，Stable Diffusion 的重点在于文本生成图片。Stable Diffusion 使用了远大于 Latent Diffusion 的 LAION-5B 数据集中的 25 亿“图片 - 文本”对进行训练。此外受到 Imagen 等其他生成工作的启发，还将 Latent Diffusion 中使用到的 BERT Text Encoder 替换成了效果更好的由 CLIP/ViT-L-14 预训练的 Text Encoder。&lt;/p&gt;
&lt;h2 id=&quot;模型实践&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E5%AE%9E%E8%B7%B5&quot; aria-label=&quot;模型实践 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型实践&lt;/h2&gt;
&lt;h3 id=&quot;训练数据集&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AE%AD%E7%BB%83%E6%95%B0%E6%8D%AE%E9%9B%86&quot; aria-label=&quot;训练数据集 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;训练数据集&lt;/h3&gt;
&lt;p&gt;为了验证 Stable Diffusion 模型的训练性能，我们使用 Google Conceptual Caption 数据集复现了 Stable Diffusion 的训练。Google Conceptual Caption 是一个相对小范围的多模态数据集，其中有 285 万“图像 - 文本”对。该数据集已集成在幻方 AI 的数据集仓库中，转化为 ffrecord 训练数据格式存储在 3FS 高速存储里。用户可以通过如下方式调取获得高速的训练数据读取：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;datasets &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; GoogleConceptualCaption
dataset &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; GoogleConceptualCaption&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;split&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;train&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; transform&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;transform&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
dataloader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dataset&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loader&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;**&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;hfaipl&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hfaipl&quot; aria-label=&quot;hfaipl permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;hfai.pl&lt;/h3&gt;
&lt;p&gt;Pytorch Lightning (PL) 在 PyTorch 基础上进行了封装，拥有其独特的并行训练接口。Stable Diffusion 源码基于 PL 所构建，为了使其利用起萤火集群的各种优化特性，我们采用幻方开发的 &lt;code class=&quot;language-text&quot;&gt;hfai.pl&lt;/code&gt; 插件来进行适配，具体包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;hfai.pl.HFAIEnvironment&lt;/code&gt;，自动适配萤火集群的多卡并行环境，在训练时加入插件就可以正常使用；&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;hfreduce_bind_numa&lt;/code&gt;，使用 hfreduce 加速通信，绑定 buma 避免多卡间额外的网络开销；&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;hfai.pl.nn_to_hfai&lt;/code&gt;，使用 hfai 优化算子替换模型中的基础算子，加速训练。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;具体操作如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在配置文件中将 &lt;code class=&quot;language-text&quot;&gt;trainer&lt;/code&gt; 的 &lt;code class=&quot;language-text&quot;&gt;strategy&lt;/code&gt; 指定为 &lt;code class=&quot;language-text&quot;&gt;hfreduce_bind_numa&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;trainer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;max_epochs&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;300&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;strategy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hfreduce_bind_numa
    &lt;span class=&quot;token punctuation&quot;&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在训练代码中，使用 &lt;code class=&quot;language-text&quot;&gt;nn_to_hfai&lt;/code&gt; 算子加速和 &lt;code class=&quot;language-text&quot;&gt;HFAIEnvironment&lt;/code&gt; 的环境设置功能：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;diffusionModelModule &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; nn_to_hfai&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;diffusionModelModule&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;

trainer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Trainer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;from_argparse_args&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;trainer_opt&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;**&lt;/span&gt;trainer_kwargs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
trainer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;plugins &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;HFAIEnvironment&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;通过如上简单几步操作就可以将萤火集群的加速特性融入到 Stable Diffusion 的训练代码中。测试在使用 &lt;code class=&quot;language-text&quot;&gt;hfai.pl&lt;/code&gt; 前后模型训练速度的变化，可以发现模型的单次 forward 时长从 0.787 秒加快到了 0.758 秒，速度提升了 &lt;strong&gt;3.8%&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&quot;训练优化&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AE%AD%E7%BB%83%E4%BC%98%E5%8C%96&quot; aria-label=&quot;训练优化 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;训练优化&lt;/h3&gt;
&lt;p&gt;我们在 Google Conceptual Caption 上使用 256x256 的分辨率进行训练，使用了在 ImageNet 上预训练的权重来初始化用来进行隐空间映射的 VQVAE 模型。&lt;/p&gt;
&lt;p&gt;在训练时我我们尝试了使用 4，8，16，32 节点分别进行 Stable Diffusion 的训练以测试不同并行条件下的敏感度。在逐步扩大 Stable Diffusion 训练规模的过程中，我们发现 Stable Diffusion 对学习率非常敏感，然而学习率不能轻易随 Batchsize 增大而增大，这很容易导致梯度爆炸的发生。因此，我们在训练时采用了 Warmup 和 Gradient Clipping 的方法来帮助模型加速收敛，避免无法收敛的情况。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/8374e436aec216f20212d145df173243/ec3e2/train_loss.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 57.668711656441715%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABKElEQVQoz5WSyXIDIRBD+f8fzSk2w9qbRIqZ2EmcS8JB1VDQr6Ui5ZxLKQDW/1dSVTNz94gA8Kpk6Ixxh9aQAilbtV5FIrnWioir+K7XONAGG/ssfBFEXEpEmnMC8BONc5G8dHdcK6TCjVw4Ac8LANK1IVDUHVw/yFyLkMLT4ctoJJOIxEluo5vbd8/uAYTPfM30EkdEpOcY7iKzPrv+iWxmlz1RPWpen3aCRIBwCe2nMcbJiQcsgOTuJHde4FHvCF8Pzo7LB23+Ju9onmR3X+TRyi2/HzXXdpRW7kNaL3P2amgaVSyLq4cDTb2rf5G37UDuXczq6G4y2r20o4nlacNimlf1W9dj2ludeVh6pLUf769muxARkjK3mqqbImKO/VXmGET4vqkfCvTDY/yodoAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;train_loss&quot;
        title=&quot;train_loss&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/8374e436aec216f20212d145df173243/a6d36/train_loss.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/8374e436aec216f20212d145df173243/222b7/train_loss.png 163w,
https://hfai-static.high-flyer.cn/static/8374e436aec216f20212d145df173243/ff46a/train_loss.png 325w,
https://hfai-static.high-flyer.cn/static/8374e436aec216f20212d145df173243/a6d36/train_loss.png 650w,
https://hfai-static.high-flyer.cn/static/8374e436aec216f20212d145df173243/e548f/train_loss.png 975w,
https://hfai-static.high-flyer.cn/static/8374e436aec216f20212d145df173243/ec3e2/train_loss.png 997w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;上图中橙色和蓝色曲线分别展示了有无使用 Warmup 和 Gradient Clipping 训练时的 loss 情况。如橙色曲线所示，当不使用 Clipping 和 Warmup 策略，模型在训练到第 400 个 step 的时候就出现了梯度爆炸的现象，无法继续正常进行收敛。而在使用之后，模型训练的学习率增长变得更加平缓，能够有效的避免发生梯度爆炸的发生。&lt;/p&gt;
&lt;h2 id=&quot;训练结果&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AE%AD%E7%BB%83%E7%BB%93%E6%9E%9C&quot; aria-label=&quot;训练结果 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;训练结果&lt;/h2&gt;
&lt;p&gt;我们将模型在 Googlecc 数据集上训练了 240K Steps 后进行测试。在 COCO FID-30K（一个 COCO Caption 数据集中随机挑选的子集，由 3w 张图片组成）上，模型取得了 16.5 的 FID 指标，说明模型生成的图片能比较好的体现出文本中的内容。&lt;/p&gt;
&lt;p&gt;以下是一些样例文本和将他们输入模型后生成的图片：&lt;/p&gt;
&lt;p&gt;(a) A photo of a woman skiing on a white mountain.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/442b9c6f57eb7f9c6acbe4a8b6e0b29a/44d59/skiing.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 25.153374233128833%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABPElEQVQY0wExAc7+ABlssRhyujh2sB1yuhxrqzhBRzs6QF89Z0E8QzY/TCBMkiBPmx1OlxZCkhpDkD+BvVSY03yduJCz1Je62gAVdL0ic76mRG1JUpQLbLY0PjtTPVSYJrFNOVA1Qk8bUp8VWK42UqZmeLdeh7s7hc1apt+xWLe4oNSw1ukADW+8O4XHWE1gVnunU5PJiJCRZ2hkRSxNMC83R01WYIW1MnW1iS2m0p3TXo+/a5jPh7TchE+LqKTIttfpAJ/B3sbT4nmChLfDyN3k7ujx9aakso6WlWtwdVFTWdHX3azA2k1WcJCpwztlqtXa5Ofl6XJ/hJu4y8/d7QD08e3y9fXt7/Ha4ebV3ujL1OPIyd7p6/Ts9vjS3N/c4+ji5+7W2tvJ1uSdsM7s7O/9/f3n5evBx9fN2Oeoja8b88bGxgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;example1&quot;
        title=&quot;example1&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/442b9c6f57eb7f9c6acbe4a8b6e0b29a/a6d36/skiing.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/442b9c6f57eb7f9c6acbe4a8b6e0b29a/222b7/skiing.png 163w,
https://hfai-static.high-flyer.cn/static/442b9c6f57eb7f9c6acbe4a8b6e0b29a/ff46a/skiing.png 325w,
https://hfai-static.high-flyer.cn/static/442b9c6f57eb7f9c6acbe4a8b6e0b29a/a6d36/skiing.png 650w,
https://hfai-static.high-flyer.cn/static/442b9c6f57eb7f9c6acbe4a8b6e0b29a/e548f/skiing.png 975w,
https://hfai-static.high-flyer.cn/static/442b9c6f57eb7f9c6acbe4a8b6e0b29a/3c492/skiing.png 1300w,
https://hfai-static.high-flyer.cn/static/442b9c6f57eb7f9c6acbe4a8b6e0b29a/44d59/skiing.png 1553w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;(b) A painting of a squirrel eating a burger.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/c90160787c6cc5508547a5c031d25949/44d59/squirrel.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 25.153374233128833%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABPElEQVQY0wExAc7+AIYeKI0lHH4vHVAtHDgyHkhCM0tCMkpIPVxbTHZoU6ZtOqlxOatuOq9uQY92XY+2uZaormeZtDmfzEGw1wCVGSO4WlCYWkVIMRsrPjFISD1ORz1cUEJHSkNiWk29cDTKeDWweUWSaUt1bmaKmJmBd3yPZVNbmK84sOYAvzc/saSsjY92KX9VDGdTo5+Eu6V3oXZQYVE/RD03wmUkzHQ5rpuHdF5UenRgfa+4dF5hdWJVpcixTrXfAHFrVZeZpYyqZqCpZ2alZsSZXN+hYI10XJN0WFhCN7BhLMapbLCykph6bHNnVV20yGFXXY5zZOGwcXuywwAvjC1zokuns0O+nlOkuXGulXOPY0hzWUV4XUtGOTN7Zj+LeEWJajucWSmAVzY7qs9Xi5xlgI1vkaRQoMd4OYXeO3OhagAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;example2&quot;
        title=&quot;example2&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/c90160787c6cc5508547a5c031d25949/a6d36/squirrel.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/c90160787c6cc5508547a5c031d25949/222b7/squirrel.png 163w,
https://hfai-static.high-flyer.cn/static/c90160787c6cc5508547a5c031d25949/ff46a/squirrel.png 325w,
https://hfai-static.high-flyer.cn/static/c90160787c6cc5508547a5c031d25949/a6d36/squirrel.png 650w,
https://hfai-static.high-flyer.cn/static/c90160787c6cc5508547a5c031d25949/e548f/squirrel.png 975w,
https://hfai-static.high-flyer.cn/static/c90160787c6cc5508547a5c031d25949/3c492/squirrel.png 1300w,
https://hfai-static.high-flyer.cn/static/c90160787c6cc5508547a5c031d25949/44d59/squirrel.png 1553w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;(c) A photo of a red train being operated on a train track.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/bb36e7407383ac3d369e5922828bb3f8/44d59/train.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 25.153374233128833%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABPElEQVQY0wExAc7+ACFHOKSip7bV5VeblStuPGCJUXGUa2aEXXZud3mDh9PV19TBxOTp6cTWx7PGt8vn5tzf4bSNnsKyvN3k5ABKXjKzIzqri6VDmI81Y0BOcEClh36iZnJqYIGKrpamoZCpUnC7saxWh2VMflSvsrinW2xWOldZgpnNycgAZXc5zxo/vVx3a3qOWnRummxani1UUEdYd3+Vj7Sbg1tC2hlDokxVn2d0XVJcVys4ixImrjVJjF5vc2hnAIuMd2wsRWpUYoSPonugroRFT2srTGBtdo+On5+zmFpQSEosOEc1PFVATW1qX1FXUzs5PHUdK5sYLVFOVABYTlplYWqEhpGSnrBlkLNJRVFxbHh0anKep6yds4RcUEhoVFR4bXGWnZmQwUZna1tgYWZRVlQ+QUJIR0gIW4z4egN9+QAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;example3&quot;
        title=&quot;example3&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/bb36e7407383ac3d369e5922828bb3f8/a6d36/train.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/bb36e7407383ac3d369e5922828bb3f8/222b7/train.png 163w,
https://hfai-static.high-flyer.cn/static/bb36e7407383ac3d369e5922828bb3f8/ff46a/train.png 325w,
https://hfai-static.high-flyer.cn/static/bb36e7407383ac3d369e5922828bb3f8/a6d36/train.png 650w,
https://hfai-static.high-flyer.cn/static/bb36e7407383ac3d369e5922828bb3f8/e548f/train.png 975w,
https://hfai-static.high-flyer.cn/static/bb36e7407383ac3d369e5922828bb3f8/3c492/train.png 1300w,
https://hfai-static.high-flyer.cn/static/bb36e7407383ac3d369e5922828bb3f8/44d59/train.png 1553w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;(d) A photo of a dog playing in a green field next to a lake.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/4e42ab4a95fcc9d8166529d71e6cb193/f02b9/dog.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 25.153374233128833%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABPElEQVQY0wExAc7+AHSHlnGLmXKNm3iNm2F0f0ljW2KCdlN3cURiXDRBMFliPGR4RE96R0txTTA9NkZKP2RwR2Z3PGV2Mmd1OgBrhY+crLiCmKhxiZtheoZwkWdHVlVCRFVmc3BCX0t0jT+FsFF9ql9qnVJTcz1nfE9rjFNkik9ih0pigUsAgIyUtKWYoazAdYifcIWOpsxpZ3lAZGJSs8R7qs9akLdHzNKAx6+Dp9BQgaZDWYWQkKato6+pY42bZIiUAGyLQ4ycW5mwjY2fmm9/fmeLQYyzS6XFVbbSXJ/CP3mgPaCtZai4ZpG/PnOaNXmsb6qrlo+QdIK3e3uodwBgjSaFtjCNvSmCsixxljttgU17j1B3jkt9klN3jVBpijSJskKVvkmBqDtmizN8r0SFsFuBsl6PxViJt1Cxuo6bP9xvFwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;example4&quot;
        title=&quot;example4&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/4e42ab4a95fcc9d8166529d71e6cb193/a6d36/dog.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/4e42ab4a95fcc9d8166529d71e6cb193/222b7/dog.png 163w,
https://hfai-static.high-flyer.cn/static/4e42ab4a95fcc9d8166529d71e6cb193/ff46a/dog.png 325w,
https://hfai-static.high-flyer.cn/static/4e42ab4a95fcc9d8166529d71e6cb193/a6d36/dog.png 650w,
https://hfai-static.high-flyer.cn/static/4e42ab4a95fcc9d8166529d71e6cb193/e548f/dog.png 975w,
https://hfai-static.high-flyer.cn/static/4e42ab4a95fcc9d8166529d71e6cb193/3c492/dog.png 1300w,
https://hfai-static.high-flyer.cn/static/4e42ab4a95fcc9d8166529d71e6cb193/f02b9/dog.png 1554w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;可见虽然训练数据集规模较小，但模型仍然达到了较好的生成效果。&lt;/p&gt;
&lt;!-- ### HFAI 实践

在萤火集群上复现 Stable Diffusion 训练的过程中，由于 Stable diffusion 使用的 pytorch lighting 在集群环境上并不完全适配无法直接运行，因此需要使用 hfai.pl 来配置。此外为了加速 stable diffusion 的训练速度，我们还使用了 hfai 的其他工具，例如 hfreduce，hfai.nn 算子等，大幅加快了训练速度。并且通过 hfai lab 中的 tensorboard 插件，可以非常方便的监测模型训练过程中 loss，梯度的变化以及模型生成图片的情况。


![tensorboard](tensorboard.png) --&gt;
&lt;h2 id=&quot;体验总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%93%E9%AA%8C%E6%80%BB%E7%BB%93&quot; aria-label=&quot;体验总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;体验总结&lt;/h2&gt;
&lt;p&gt;Stable Diffusion 作为 AI 作图领域的旗舰模型，受到了广泛的关注，在小范围数据上训练也可以实现惊艳的生成效果。我们借助幻方萤火集群，通过简单几步改造，能比较轻松地实现 Stable Diffusion 的训练加速，证明了萤火集群的易用性和实力。​综合体验打分如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;研究指数：★★★★&lt;/p&gt;
&lt;p&gt;作者提出了一种在隐空间上进行扩散的生成模型结构，降低了扩散模型运行开销的同时保证了生成质量。模型还应用了交叉注意力机制来辅助条件控制生成，并且支持多种不同模态条件下的图像生成。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开源指数：★★★★★&lt;/p&gt;
&lt;p&gt;作为首个完全开源代码、训练数据和预训练权重的 AI 绘画预训练大模型，stable-diffusion 在学术界和其他相关领域都产生了极大的影响力。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;门槛指数：★★&lt;/p&gt;
&lt;p&gt;由于模型对资源占用有所优化，且开源工作完善，因此单个普通 GPU 即可运行模型推理。但训练开销较高。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通用指数：★★★★&lt;/p&gt;
&lt;p&gt;作者提出的在隐空间上进行扩散的方法对一般的扩散模型都能够适用，并且基于交叉注意力的条件控制方法也能将模型应用于许多不同任务类型，对生成领域研究工作有广泛的借鉴意义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;适配指数：★★★&lt;/p&gt;
&lt;p&gt;该项目依赖 pytorch-lightning，需要对萤火集群进行一定适配，但通过 hfai.pl 工具也能比较容易的在幻方 AI 环境运行并获得加速效果。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;幻方 AI 紧跟 AI 研究的前沿浪潮，致力于用领先算力助力 AI 落地与价值创造，欢迎各方数据研究者与开发者们一同共建。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[hfai 心法总章 | 快速上手攻略]]></title><description><![CDATA[幻方 AI 发布了其沉淀多年的深度学习套件 hfai，吸引了众多同行研究员和开发者们咨询试用。整个套件的功能较多，而熟悉掌握了这套规则，是能够轻松地调用起平台的算力资源，从而高效完成训练任务的。为此，我们专门创建了“hfai 使用心法”系列专辑，陆续为大家介绍 hfai…]]></description><link>https://www.high-flyer.cn/blog/hfai_total/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/hfai_total/</guid><dc:creator><![CDATA[High-Flyer]]></dc:creator><pubDate>Fri, 16 Dec 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;幻方 AI 发布了其沉淀多年的深度学习套件 hfai，吸引了众多同行研究员和开发者们咨询试用。整个套件的功能较多，而熟悉掌握了这套规则，是能够轻松地调用起平台的算力资源，从而高效完成训练任务的。为此，我们专门创建了“hfai 使用心法”系列专辑，陆续为大家介绍 hfai 一些功能的设计思路和原理，帮助大家更快上手 hfai，游刃有余得应对深度学习作业的各项挑战。&lt;/p&gt;
&lt;p&gt;本终章为大家连贯的演示 hfai 心法在一个实际训练中的流畅应用。&lt;/p&gt;
&lt;video controls poster=&quot;https://hfai-static.high-flyer.cn/resource/hfai_total_poster_v1.png&quot;&gt;
    &lt;source id=&quot;mp4&quot; src=&quot;https://hfai-static.high-flyer.cn/resource/hfai_total_v1.mp4?raw=1&quot; type=&quot;video/mp4&quot;&gt;
&lt;/video&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;p&gt;&lt;strong&gt;官方文档&lt;/strong&gt;：&lt;a href=&quot;https://doc.hfai.high-flyer.cn/index.html&quot;&gt;https://doc.hfai.high-flyer.cn/index.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;案例代码&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/hfai-models&quot;&gt;https://github.com/HFAiLab/hfai-models&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;hfai-workspace&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hfai-workspace&quot; aria-label=&quot;hfai workspace permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;/blog/hfai_workspace/&quot;&gt;hfai workspace&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;打通本地与萤火之间的任督二脉。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;其旨在同步本地工程目录代码到远程萤火超算中，更丝滑地利用萤火超算的算力运行您的项目工程。&lt;/p&gt;
&lt;h2 id=&quot;hfai-datasets&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hfai-datasets&quot; aria-label=&quot;hfai datasets permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;/blog/hfai_datasets/&quot;&gt;hfai datasets&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;运转数据入萤火训练的不二法门。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一套专门为数据集量身定制的“神功”，解决大规模的训练数据，上传、管理和部署。&lt;/p&gt;
&lt;h2 id=&quot;hfai-python&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hfai-python&quot; aria-label=&quot;hfai python permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;/blog/hfai_python/&quot;&gt;hfai python&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;任务提交任意所至，萤火训练行云流水。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;其可以帮助大家方便快捷地发起、管理训练任务。&lt;/p&gt;
&lt;h2 id=&quot;haienv&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#haienv&quot; aria-label=&quot;haienv permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;/blog/hfai_venv/&quot;&gt;haienv&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;运行环境的影分身术。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;其可以完成“本地 - 萤火，环境共享”——快速实现运行环境的集群部署。&lt;/p&gt;
&lt;h2 id=&quot;hfai-images&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hfai-images&quot; aria-label=&quot;hfai images permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;/blog/hfai_images/&quot;&gt;hfai images&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;自建镜像，环境配置的最后绝招。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当面对一些特殊的场景，单单通过安装 Python 依赖已不足以满足需求，其可以帮助研究者构建项目特有镜像。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[haiscale | 幻方萤火高性能并行训练工具库]]></title><description><![CDATA[haiscale (Highflyer AI Scale) 是一个轻量级的高性能并行训练工具库，其整合了幻方 AI 多年的并行训练研发优化经验，能够帮助 PyTorch 用户更加高效、便捷地在大规模集群上训练模型。 haiscale…]]></description><link>https://www.high-flyer.cn/blog/haiscale/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/haiscale/</guid><dc:creator><![CDATA[小杞]]></dc:creator><pubDate>Tue, 06 Dec 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;haiscale (Highflyer AI Scale) 是一个轻量级的高性能并行训练工具库，其整合了幻方 AI 多年的并行训练研发优化经验，能够帮助 PyTorch 用户更加高效、便捷地在大规模集群上训练模型。&lt;/p&gt;
&lt;p&gt;haiscale 中包含了以下几种工具：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;haiscale.ddp&lt;/code&gt;: 分布式数据并行工具，以幻方 AI 自研的 &lt;a href=&quot;https://www.high-flyer.cn/blog/hf-reduce/&quot;&gt;hfreduce&lt;/a&gt; 通信为后端，相比于 NCCL 能够获得更好的多卡拓展性能；&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;haiscale.fsdp&lt;/code&gt;: 极致优化 &lt;code class=&quot;language-text&quot;&gt;Fully Sharded Data Parallel (FSDP)&lt;/code&gt; 算法的实现，相比于 PyTorch FSDP 速度更快、占用显存更少；&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;haiscale.pipeline&lt;/code&gt;: 分布式流水线并行（或称模型并行）工具包，包含 GPipe, PipeDream 等算法，支持多机多卡训练；&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;haiscale.cpu_offload&lt;/code&gt;: 神经网络模型 Offload 工具，节省训练占用的显存。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下图展示了 haiscale 三种并行方式的性能，其相比 PyTorch 官方自带工具都有显著的性能提升：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/824a9800a50b56571ffc37e53ff3d98d/2cefc/bench.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 28.834355828220858%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAB3UlEQVQY0x2OPWgTYQCGP+haEAQHXVwcxMXFpRqMrVpxFZ1FxL0URNsIRbo4iqliIbSCVgRrIZY0TWhqQtKf/BSTaK/5P6lNcjHJnaT33eXu+757JU7vMzw8vERVtTtHh7+m9vNZj/QzP92oFZ5RpTq6/b1wWm0rE4VcxiNJkqd4sD+tNmqT8bD/jN3rjjnMfryXyz9dDUem8vkfk8VS6W756A8h9G9nDzYFmAmwPiA4TIN+zKRTbmEeA9wCmPF/BbOhyIWxtUz5var3ATDomgKD6ui0WweEkGFi6doGHAEAA8McgGGavuDqyqiwDM4dMM65zYXDbO44TVkevzfjna8kFpGWimZr561VaFuoKd0EIeQkoT0txjiHYXHRZ2IQgNajC/6V5Zu6rsNkAobNHSaAPncgV+RbD2Zf+urxOXz6lmS14HPxJddFrNTZvThETpFWsx6lFgMXwqaUWs2mgkaz5cukdkf0497gsHAEZ2q3IxRFARy47s++mpejc1iOJu1q6AX3p4qIfX2TFkvhIVKvShfqvw9dm5HIjdD62vWtRNydTiXPbWxGh8uV6kg2m70aCATGQ+tB99b2zpVsOnPi9qOJ89GlmWveD58vhxaeuLyL79yvH569BID8A9QueKCdmrETAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;bench&quot;
        title=&quot;bench&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/824a9800a50b56571ffc37e53ff3d98d/a6d36/bench.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/824a9800a50b56571ffc37e53ff3d98d/222b7/bench.png 163w,
https://hfai-static.high-flyer.cn/static/824a9800a50b56571ffc37e53ff3d98d/ff46a/bench.png 325w,
https://hfai-static.high-flyer.cn/static/824a9800a50b56571ffc37e53ff3d98d/a6d36/bench.png 650w,
https://hfai-static.high-flyer.cn/static/824a9800a50b56571ffc37e53ff3d98d/e548f/bench.png 975w,
https://hfai-static.high-flyer.cn/static/824a9800a50b56571ffc37e53ff3d98d/3c492/bench.png 1300w,
https://hfai-static.high-flyer.cn/static/824a9800a50b56571ffc37e53ff3d98d/2cefc/bench.png 1400w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;用于测试的模型是 &lt;strong&gt;GPT-2 Medium&lt;/strong&gt;，相关代码已开源至 hfai 模型仓库。下面将为大家简要介绍。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;API文档&lt;/strong&gt;：&lt;a href=&quot;https://doc.hfai.high-flyer.cn/api/haiscale_ddp.html&quot;&gt;https://doc.hfai.high-flyer.cn/api/haiscale_ddp.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;示例模型&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/hfai-models/tree/main/gpt&quot;&gt;https://github.com/HFAiLab/hfai-models/tree/main/gpt&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;安装&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%AE%89%E8%A3%85&quot; aria-label=&quot;安装 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;安装&lt;/h2&gt;
&lt;p&gt;haiscale 提供 Python 接口，通过如下方式安装：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;如果要使用 haiscale DDP，首先需要先安装 hfreduce （如果不需要使用 DDP 可跳过这步）：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sudo apt install libnuma-dev
sudo apt install libibverbs-dev
pip install hfreduce --extra-index-url https://pypi.hfai.high-flyer.cn/simple --trusted-host pypi.hfai.high-flyer.cn&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装 haiscale：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;pip install haiscale --extra-index-url https://pypi.hfai.high-flyer.cn/simple --trusted-host pypi.hfai.high-flyer.cn&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;haiscaleddp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#haiscaleddp&quot; aria-label=&quot;haiscaleddp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;haiscale.ddp&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;haiscale.ddp.DistributedDataParallel&lt;/code&gt; (haiscale DDP) 是一个分布式数据并行训练工具，使用 hfreduce 作为通讯后端，反向传播的同时会异步地对计算好的梯度做 allreduce。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/66f02e5b23fbe59d0e77df6fe423a535/bca35/DDP.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 58.282208588957054%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAA7DAAAOwwHHb6hkAAACpklEQVQoz5WSS2gTURSGZ6trRRcu1I2Pna7EvW5E0JVIqVAF3VSkPkAXgqjoxsemQqFWsK34tlUx0baxWlpbq6YhttYWtE1tkkmTTHLndWfy6Kdzo+Bj5YWf/97DvWfmfOdownIRtiTwgumQzBdJG+K/lTIEeWGjFYSDIWxcWcKwJVnTwZE+luMp2a6HZUtMWyoPPm5atbOwJJbrY7s+OWGjF0w0v7xIsB6Gethet5+6xmO8ehulqbmVhotXeTL4ls7oGKdf9PAoFudDYpb26CjhyQlmMln6YmMMfBonaRTJFi20UOQNb0Y/crs7TP3h4xw5fY6R2ASnWm9y6HIzve/GuBuLcyHSz9P4BB/n57kX+0D/9BSJhRwDE+OMTE+RLgiFTVuyYjXL1mwg/HJI/akpSwjHIx+wdT18v4J0fXxZUu64PqZwsCyJ7XhIr6xw/cKirdqwiXWbt/Kk5zWOX0E3BFlhKyZFy/1HwaO5pE6+YKp9EBO/SVu1vpawKxTBdCSphRx6ziCTL1A0nT8ui58JU5kcRtH62Zi/Ei5duYblazcS6hsk6I9hOhQth3TOIGsISqUqUpbxvIpy1y1jmR62HZRfwpUVFbMdv1by6+Eo45OztHR0sGXHNnbW76V3aIg9Z5rYdrSBBy97ON/Vxu4rx7gWvk/f5wFOhc5zfeQW8cQkN/rb6Ry8wxf9G8J0g7GpqmaEIhF2HdjHwRNNDMdinGy5TOOVs/SODtMa6aap/RJ3B3sZmYnSPNRGVzzMdGqGx++f8Tzex1d9XqHSAk4Bj3IFSlWwgm56ZaoVWKyiOuh7VRbL4MmKKrUkQboVNeCBe7Kq8CQXcmi/QAeJg+BMMsWcnmE2lVYK9om0zmw6TSKdqZ11nTld55ueUT6n1+L5H4P9HZrqSiVFkYI6AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;DDP&quot;
        title=&quot;DDP&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/66f02e5b23fbe59d0e77df6fe423a535/a6d36/DDP.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/66f02e5b23fbe59d0e77df6fe423a535/222b7/DDP.png 163w,
https://hfai-static.high-flyer.cn/static/66f02e5b23fbe59d0e77df6fe423a535/ff46a/DDP.png 325w,
https://hfai-static.high-flyer.cn/static/66f02e5b23fbe59d0e77df6fe423a535/a6d36/DDP.png 650w,
https://hfai-static.high-flyer.cn/static/66f02e5b23fbe59d0e77df6fe423a535/bca35/DDP.png 683w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;haiscale DDP 的使用方式和 pytorch DDP 几乎相同，以下是使用示例：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; haiscale&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ddp &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; DistributedDataParallel

model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; MyModel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DistributedDataParallel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
optimizer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;optim&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Adam&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parameters&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; lr&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.01&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# training ...&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; step&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dataloader&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    optimizer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;zero_grad&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    output &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    loss_fn&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; output&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;backward&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    optimizer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;step&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# stop hfreduce&lt;/span&gt;
model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reducer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;stop&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;如果需要做梯度累加，可以使用 &lt;code class=&quot;language-text&quot;&gt;model.no_sync()&lt;/code&gt; 来减少通讯的开销。注意只需要最后一次反向传播时做 allreduce：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; haiscale&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ddp &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; DistributedDataParallel

ddp &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DistributedDataParallel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; ddp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;no_sync&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;input&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; inputs&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        ddp&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;backward&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# no synchronization, accumulate grads&lt;/span&gt;
ddp&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;another_input&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;backward&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# synchronize grads&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;haiscalefsdp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#haiscalefsdp&quot; aria-label=&quot;haiscalefsdp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;haiscale.fsdp&lt;/h2&gt;
&lt;p&gt;Fully Sharded Data Parallel (FSDP) 是 META 在 ZERO-3 的基础上提出的分布式数据并行工具，它把模型的参数进行切分并分散到不同的 GPU 上，每块 GPU 上只有 &lt;code class=&quot;language-text&quot;&gt;1/ngpus&lt;/code&gt; 的参数。在做前向和反向传播时，FSDP 会先做 allgather 获得完整的参数，然后在前向和反向传播结束后释放掉，只保留 &lt;code class=&quot;language-text&quot;&gt;1/ngpus&lt;/code&gt; 的参数和梯度。FSDP 通过&lt;strong&gt;参数分片&lt;/strong&gt;的方式，能够减少模型参数、梯度、优化器状态的显存占用，帮助我们训练更大规模的模型。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/a3e18d9cef6129e91bc72e0de3edde9e/83e77/FSDP.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46.62576687116564%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACTklEQVQozz2STUiTARjH33O3iM5Bl+jetWtUp4LoEp2KPEkHPQhCCBEWzESE2CxypC1an04pC9xCnbJM5/dHW+7Due19373fX/tQf7EZPfDnf/vzPL//IxiWi2bYuF6d2gGotofp1bC8OprtYnt1VMtBtVwUy0HSLXTTQTEdVMNBMWxkw0YxHETNRLDdGgeHsFeUiESnWdlOk1jbYmZplc3dPDPLG6zu5oitbxPf/M1qvsDcnyyZskyqLJKVKpQUjYKsUFB0hFyhRCa3T3h8kgtXruPzv6Tt0RNudnbhGw1zqaObQGSS24MB2gPDBGLTtH/8xPvEAsFEnIm1FX6lU3xfSbKv6gi9Twc5ffY8wTfvqB6ApJnkyzK5kkS2KJEpSai6RVGsUJZVyrJGoSwjKfp/N5uY/kno6fVx6sw5AsHXeI2jVuBeWaYgVjDdKqbjYbtVSmIFWdFxvDpNTI5XQ5TVFn/TdtEth2YfQvfDxwgnTuIfHqE5Fd1ErGgt5UsikmLgunUMw8U0vWM3XAzTRVFsdN3F9RpUvUNsp4awvpViZm6BV+F3XLx2lf7nQ9zr6eLG/Tb6Roe53HGXF5EP3Ol/QKffx8BYiFsD3YzGJvBNPSP08zOx9VlC8TA5qYjgVhutzdLZHH1DfmLz84zFpnj7dYLZ5SQjkxGiiwuEol8Yi//g2+I8weg4yfQO06kES9kNdgq7JDNrpAp5hNZP6RZe9YBa44iKYR4DdqqohtU6Q9YMZFVvFVCSFTTdRtFMVM2moprIqoGi2+yLMn8BbQ1uomCEUNcAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;FSDP&quot;
        title=&quot;FSDP&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/a3e18d9cef6129e91bc72e0de3edde9e/a6d36/FSDP.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/a3e18d9cef6129e91bc72e0de3edde9e/222b7/FSDP.png 163w,
https://hfai-static.high-flyer.cn/static/a3e18d9cef6129e91bc72e0de3edde9e/ff46a/FSDP.png 325w,
https://hfai-static.high-flyer.cn/static/a3e18d9cef6129e91bc72e0de3edde9e/a6d36/FSDP.png 650w,
https://hfai-static.high-flyer.cn/static/a3e18d9cef6129e91bc72e0de3edde9e/83e77/FSDP.png 889w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;haiscale.fsdp.FullyShardedDataParallel&lt;/code&gt; 的使用方法和 DDP 类似，但&lt;strong&gt;优化器必须在 FSDP 之后创建&lt;/strong&gt;，并且保存模型参数的时候需要先调用 &lt;code class=&quot;language-text&quot;&gt;summon_full_params&lt;/code&gt;。以下是使用示例：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; haiscale&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fsdp &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; FullyShardedDataParallel

model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; MyModel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; FullyShardedDataParallel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
optimizer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;optim&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;AdamW&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parameters&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; lr&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.01&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# training ...&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; step&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dataloader&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    optimizer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;zero_grad&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    output &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    loss_fn&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; output&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;backward&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    optimizer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;step&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# save checkpoint&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;summon_full_params&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; rank &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        state &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;state_dict&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;save&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;state&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;model.pt&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;haiscale FSDP 还支持传入 &lt;code class=&quot;language-text&quot;&gt;auto_wrap_policy&lt;/code&gt; 参数，具体作用可以参考 &lt;a href=&quot;https://pytorch.org/docs/1.12/fsdp.html&quot;&gt;PyTorch FSDP 的文档&lt;/a&gt;以及我们提供的 &lt;a href=&quot;https://github.com/HFAiLab/hfai-models/tree/main/gpt&quot;&gt;GPT-2 示例&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&quot;haiscalepipeline&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#haiscalepipeline&quot; aria-label=&quot;haiscalepipeline permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;haiscale.pipeline&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/8367cb02031b4ce2a576d98cd78a00aa/f7616/pipeline.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60.73619631901841%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAA7DAAAOwwHHb6hkAAACwklEQVQoz22S60vTcRTG9wf1qne+6QJdoF4kkoWpYRfzltYyzUqSWWalmRTqijQxySLopoamZk5Et8zaLXVsU3f/bW7plr9Nd/nEbyuJ8sDDl/NweDjneb6yRCLB35XqE6wERWYtbsyLbpxOB3abA4/PhS/oZjko4BCsqL9NM601Y7UJ2O02VlZWkP0RiUQiyTcai7Hs89A/NMH2Q3WkZdaTXyjnquIiza+raftQk4Ry4BpyxSXSMhvYld3AifyzvHv7KiUYjUZxuVzE4nFisRh2ux3V2CjpJ6+zM6eVgit36Bi8SftoPY+H6+hSNVLbVI28rIyjRfXsPt7G8XIFY9P9yLY6ORgMEgqFWFtbw2ByodZbWQ358S4LhMRVFr0mLAtmjEYjNruT1VCYkCgSja+nBCXE43H+FZcqKEZxeEKpJv6bC/8gwf+zUsm2IkXxJ05PgEGVji+aaWbNOr6Y9MzMa5P4btEzt/CVKf0MIxMGPqs1fP2uxu11IpP883q9WCwW/H4/kfV1PG4Xn8Yn2bbvElnFRdS0lVF0t4KCxgqKmqqoaj1PTUsJuYWn2ba3kpMXSilvOsXwZB8yKWopkKWlJZxOJ4FAIAmjXsutB+087H1Oz1A3T9730PKyA+XrLjr7u+l4quReYxMNyi4e9b6gve8JWrNu65M3NjYIRzaS24prIuFIJMlrNGoMBh3zpllm5+bxLQeIhEWiMWk+nPx6MikMURQ3IVng9wmMjM9w+mILxRWXuapUcO5mKYfzM6jrvECmfAf7j52grKoFeW0Fise3yChMp+dNV8pDQRA2kfRU8DA8oiKruJbmZ83kK0rZk3OQ6w9vUHn/DAey0ziSe5aS6kZud9eSXpLH/rwDfNQMbn2ytLrko1sQGJ7S0ftRjd6oxbxoxWI3odIOoDcY0RqNLDqsLNhsONwOwusivwACSSYRTESHWQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;pipeline&quot;
        title=&quot;pipeline&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/8367cb02031b4ce2a576d98cd78a00aa/a6d36/pipeline.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/8367cb02031b4ce2a576d98cd78a00aa/222b7/pipeline.png 163w,
https://hfai-static.high-flyer.cn/static/8367cb02031b4ce2a576d98cd78a00aa/ff46a/pipeline.png 325w,
https://hfai-static.high-flyer.cn/static/8367cb02031b4ce2a576d98cd78a00aa/a6d36/pipeline.png 650w,
https://hfai-static.high-flyer.cn/static/8367cb02031b4ce2a576d98cd78a00aa/f7616/pipeline.png 766w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，&lt;code class=&quot;language-text&quot;&gt;haiscale.pipeline&lt;/code&gt; 工具包中提供了三种流水线并行的算法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;GPipe&lt;/code&gt;: 把模型切分成 &lt;code class=&quot;language-text&quot;&gt;ngpus&lt;/code&gt; 份，所有 microbatch 的前向传播结束之后再做反向传播；&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;PipeDream&lt;/code&gt;: 把模型切分成 &lt;code class=&quot;language-text&quot;&gt;ngpus&lt;/code&gt; 份，前向和反向传播交替执行（non-interleaved 1F1B）；&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Interleaved1F1B&lt;/code&gt;: 把模型切分成 &lt;code class=&quot;language-text&quot;&gt;ngpus * num_model_chunks&lt;/code&gt; 份，前向和反向传播交替执行。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对于中等规模的模型（比如 GPT-2 Medium），我们推荐优先使用 PipeDream，相比于 GPipe 和 Interleaved1F1B 占用显存更少，速度更快。
对于超大规模的模型（比如 GPT-3），我们可以更加均匀、细粒度的切分它，这时候推荐使用 Interleaved1F1B。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;haiscale.pipeline&lt;/code&gt; 提供了一个统一的 &lt;code class=&quot;language-text&quot;&gt;forward_backward&lt;/code&gt; 接口，我们需要传入损失函数 &lt;code class=&quot;language-text&quot;&gt;criterion&lt;/code&gt; 和标签数据 &lt;code class=&quot;language-text&quot;&gt;labels&lt;/code&gt;，损失函数会通过 &lt;code class=&quot;language-text&quot;&gt;loss = criterion(*outputs, *labels)&lt;/code&gt; 的方式调用，&lt;code class=&quot;language-text&quot;&gt;forward_backward&lt;/code&gt; 接口会返回一个元组 &lt;code class=&quot;language-text&quot;&gt;(losses, outputs)&lt;/code&gt;，其中&lt;code class=&quot;language-text&quot;&gt;losses&lt;/code&gt; 代表每个 microbatch 的 loss 值，&lt;code class=&quot;language-text&quot;&gt;outputs&lt;/code&gt; 代表模型的输出。只有最后一个 rank 的进程能够获得 loss 和输出，其他进程得到的是 &lt;code class=&quot;language-text&quot;&gt;(None, None)&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;下面通过示例展示 GPipe 和 PipeDream 的用法：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; haiscale&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pipeline &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; GPipe&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; PipeDream&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; partition

dist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;init_process_group&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_device&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;local_rank&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
rank&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; world_size &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_rank&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_world_size&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;manual_seed&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;12345&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;loss_fn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;out &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; nn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Sequential&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; partition&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; rank&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; world_size&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# chunks: number of microbatches&lt;/span&gt;
model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; PipeDream&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; chunks&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# or model = GPipe(model.cuda(), chunks=32)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; dataloader&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    losses&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; outputs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;forward_backward&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; criterion&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;loss_fn&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; labels&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; return_outputs&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; rank &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; world_size &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        loss &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; losses&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# losses: torch.Size([32])&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# eval&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;no_grad&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    out &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; rank &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; world_size &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# calculate metrics ...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以下是 Interleaved1F1B 的使用示例：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; haiscale&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pipeline &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Interleaved1F1B&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; partition

dist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;init_process_group&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_device&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;local_rank&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
rank&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; world_size &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_rank&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_world_size&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;manual_seed&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;12345&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;loss_fn&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;out &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; nn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Sequential&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
modules &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; partition&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; rank&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; world_size&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; num_model_chunks&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# len(modules) = 2&lt;/span&gt;
modules &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;m&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; m &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; modules&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Interleaved1F1B&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;modules&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; chunks&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; dataloader&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    losses&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; outputs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;forward_backward&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; criterion&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;loss_fn&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; labels&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; return_outputs&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; rank &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; world_size &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        loss &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; losses&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# losses: torch.Size([32])&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# eval&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;no_grad&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    out &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; rank &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; world_size &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# calculate metrics ...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;数据并行和流水线并行组合&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E5%B9%B6%E8%A1%8C%E5%92%8C%E6%B5%81%E6%B0%B4%E7%BA%BF%E5%B9%B6%E8%A1%8C%E7%BB%84%E5%90%88&quot; aria-label=&quot;数据并行和流水线并行组合 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;数据并行和流水线并行组合&lt;/h2&gt;
&lt;p&gt;haiscale 还支持同时使用 DDP 和流水线并行。比如我们有 16 块 GPU，我们可以把这 16 块 GPU 划分成两个组，每个组有 8 块 GPU，然后两个组之间做数据并行，组内做流水线并行。&lt;/p&gt;
&lt;p&gt;看如下使用示例：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; haiscale&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ddp &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; DistributedDataParallel &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; DDP
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; haiscale&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pipeline &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; PipeDream&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; partition&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; make_subgroups

dist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;init_process_group&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_device&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;local_rank&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
rank&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; world_size &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_rank&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_world_size&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

dp_group&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pp_group &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; make_subgroups&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pp_size&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; nn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Sequential&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; partition&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pp_group&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rank&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pp_group&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;size&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DDP&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; process_group&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;dp_group&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; PipeDream&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; chunks&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; process_group&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;pp_group&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

criterion &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; nn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;MSELoss&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; dataloader&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;forward_backward&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; criterion&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;criterion&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; labels&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;cpu-offload&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#cpu-offload&quot; aria-label=&quot;cpu offload permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;CPU Offload&lt;/h2&gt;
&lt;p&gt;除了以上的并行策略，在深度学习的训练过程中，我们常常会遇到显存不足的问题。&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;haiscale.cpu_offload.CPUOffload&lt;/code&gt; 能够帮助我们在训练中把一部分需要保存的中间变量移动到 CPU 内存上，然后在反向传播时把需要用到的 tensor 传输回 GPU 显存里，从而达到节省显存的目的。&lt;/p&gt;
&lt;p&gt;haiscale 采用&lt;strong&gt;异步传输拷贝&lt;/strong&gt;策略，能够把一部分的传输时间和 GPU 的计算重叠起来，从而减少拷贝带来的开销，提升整体计算效率。&lt;/p&gt;
&lt;p&gt;使用时需要指定 &lt;code class=&quot;language-text&quot;&gt;offload_ratio&lt;/code&gt; 参数，其代表需要 offload 的中间变量的比例，&lt;code class=&quot;language-text&quot;&gt;offload_ratio=1&lt;/code&gt; 代表所有保存的中间变量都会被移动到 CPU 内存里。&lt;/p&gt;
&lt;p&gt;以下是使用示例：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; haiscale&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cpu_offload &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; CPUOffload

model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; MyModel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
optimizer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;optim&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;AdamW&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parameters&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; lr&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.01&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; dataloader&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    optimizer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;zero_grad&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; CPUOffload&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;offload_ratio&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; tag&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;MyModel&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        output &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    loss_fn&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; output&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;backward&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    optimizer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;step&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[萤火跑模型 | 多卡并行实现 YOLOv5 高性能训练]]></title><description><![CDATA[YOLO 系列模型在整个深度学习目标检测领域有举足轻重的地位，近些年模型性不断发展，工程落地中的应用也十分广泛。 最近来自美国的 Ultralytics 公司发布了第五代 YOLO 模型: YOLOv5。相比上代模型，YOLOv…]]></description><link>https://www.high-flyer.cn/blog/yolov5/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/yolov5/</guid><dc:creator><![CDATA[Vachel]]></dc:creator><pubDate>Wed, 30 Nov 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;YOLO 系列模型在整个深度学习目标检测领域有举足轻重的地位，近些年模型性不断发展，工程落地中的应用也十分广泛。&lt;/p&gt;
&lt;p&gt;最近来自美国的 Ultralytics 公司发布了第五代 YOLO 模型: YOLOv5。相比上代模型，YOLOv5 以更轻量的参数，更极致的推理速度，一经发布受到了学术界和工业界相关人士的广泛关注。&lt;/p&gt;
&lt;p&gt;幻方 AI 最近在萤火集群上对该项工作进行了体验和优化。YOLOv5 没有相应的论文说明，仅开源了代码。我们通过自研的 &lt;a href=&quot;/blog/3fs&quot;&gt;3FS&lt;/a&gt;、&lt;a href=&quot;/blog/hfai_datasets&quot;&gt;数据集仓库&lt;/a&gt;、&lt;a href=&quot;/blog/hf-reduce&quot;&gt;hfreduce&lt;/a&gt;、&lt;a href=&quot;/blog/hfnn&quot;&gt;算子&lt;/a&gt;等对模型训练进行优化，实现了近 50% 的训练提速。本文为大家简要描述。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;项目地址&lt;/strong&gt;：&lt;a href=&quot;https://github.com/ultralytics/yolov5&quot;&gt;https://github.com/ultralytics/yolov5&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型仓库&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/yolov5&quot;&gt;https://github.com/HFAiLab/yolov5&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;模型简介&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E7%AE%80%E4%BB%8B&quot; aria-label=&quot;模型简介 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型简介&lt;/h2&gt;
&lt;p&gt;YOLOv5 是一种单阶段目标检测算法，下图展示了其整体结构框图：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/797428e49460c7fda820bbc9e5f980fb/9b29b/01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.44171779141104%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACmklEQVQozy2TyW4bBxBE5zPzDbnkFDiAPyAn3xLpEgNBAuQgWosd2vES2RZpgpQsm6tEcrgPZyVn3xcOX0A5DTSqGnUqVLVQ+/47Pjw9ojqUeT+o8mV+yWBxy820xmexSb32imX/kmp9yPjjESd/P+Kiccqg32Nxc0Rn0oD9jsOUeY6gbFwMJ0adLJhdtzFVC8Xw8G0X33bwHRffNNFkiTiDwfor/fFnpmORUe8dv714RGf8CcN2iDwXoT40OGlKVK7GXNREKjWR8+sVmrxi0m0xEceYhk6SF8yu/mVwccquKAldF8XYYmxUREvBTAKKKEYwdA1zaxCGPuW+JElisiwhS2OkxRRd14h9jz3QOf6F1z/9SAYEto2srfnjzWMiX6bT7vH87BTBsbYcNkky8iQlDKIH9B2Hu8EdsqbDfk+ZRLRmGtXeAoqMNE6QNZnufYOv6hBRk5CmMwRxHdPrzui9OqJx18ZSFnT1EVYQsM9Sdq7DzvfIkoKV0qUnfsQ1HdIoRNYUKu+fYNpLsrwkiyME6b5J9+2v6JM2g/Gcq+sV4nzFqlUjcR1y16bwXLI0wdQNLGODb5mkYYjj2jQH56SxSRTG5FGEEEi3qO0/KfMUWXM4rp3REa+x+wOywHuoA/uS2WhI6gVQpJBn/C8Q2y6muvl2JhGCtx0ROisWa59+/S+k+g9MRm9RLYPcD7gVdeYrhWbzE7+/O6YzV4nkNduZiOokXNbbPPvnKc9vLvHdDCFw5mjqPe2RTKX6kuXtOTe9M35+doyuxix0B0nRaTUbvGhWmKgW4VpiOx0jbUPqrXte1054+eWKwMsRyrQg9kJie4O+jQhCCF2bOLAhTWGXQZGjLJdQlId3eAjrkPyBk0YUUfLNcp7yH2b5HUaq/GedAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;01&quot;
        title=&quot;01&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/797428e49460c7fda820bbc9e5f980fb/a6d36/01.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/797428e49460c7fda820bbc9e5f980fb/222b7/01.png 163w,
https://hfai-static.high-flyer.cn/static/797428e49460c7fda820bbc9e5f980fb/ff46a/01.png 325w,
https://hfai-static.high-flyer.cn/static/797428e49460c7fda820bbc9e5f980fb/a6d36/01.png 650w,
https://hfai-static.high-flyer.cn/static/797428e49460c7fda820bbc9e5f980fb/e548f/01.png 975w,
https://hfai-static.high-flyer.cn/static/797428e49460c7fda820bbc9e5f980fb/3c492/01.png 1300w,
https://hfai-static.high-flyer.cn/static/797428e49460c7fda820bbc9e5f980fb/9b29b/01.png 3840w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;对于一个目标检测算法而言，我们通常可以将其划分为4个通用的模块，具体包括：输入端、基准网络、Neck网络与Head输出端，对应于上图中的4个红色模块。YOLOv5 在 YOLOv4 的基础上添加了一些新的改进思路，使其速度与精度都得到了极大的性能提升。主要的改进思路如下所示：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;输入端&lt;/strong&gt;：表示输入的图片，该阶段通常包含一个图像预处理阶段，即将输入图像缩放到网络的输入大小，并进行归一化等操作。YOLOv5 提出了一些改进思路，如在网络训练阶段，使用 Mosaic 数据增强操作提升模型的训练速度和网络的精度；提出一种自适应锚框计算与自适应图片缩放方法；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基准网络&lt;/strong&gt;：通常是一些性能优异的分类器种的网络，该模块用来提取一些通用的特征表示。融合其它检测算法中的一些新思路。YOLOv5 中不仅使用了 CSPDarknet53 结构，而且使用了 Focus 结构作为基准网络；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Neck网络&lt;/strong&gt;：目标检测网络在 BackBone 与最后的 Head 输出层之间往往会插入一些层，利用它可以进一步提升特征的多样性及鲁棒性。虽然 YOLOv5 同样用到了 SPP 模块、FPN+PAN 模块，但是实现的细节有些不同；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Head输出层&lt;/strong&gt;：用来完成目标检测结果的输出。针对不同的检测算法，输出端的分支个数不尽相同，通常包含一个分类分支和一个回归分支。YOLOv5 输出层的锚框机制与 YOLOv4 相同，主要改进的是训练时的损失函数 GIOU_Loss，以及预测框筛选的 DIOU_nms。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;模型实践&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E5%AE%9E%E8%B7%B5&quot; aria-label=&quot;模型实践 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型实践&lt;/h2&gt;
&lt;p&gt;幻方 AI 基于 Ultralytics 开源的 YOLOv5 代码，进行多级多卡的训练支持，开源至 HFAI YOLOv5，并采用幻方一系列优化工具进行提速升级，包括 hfai.datasets 高速数据集仓库，hfreduce 并行训练，hfai.nn 高性能算子等功能。&lt;/p&gt;
&lt;h3 id=&quot;数据集&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E9%9B%86&quot; aria-label=&quot;数据集 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;数据集&lt;/h3&gt;
&lt;p&gt;YOLOv5 开源代码里给出的训练案例，使用的训练数据只有 128 张图片构成的 COCO 子数据集。数据规模较小，且 Dataloader 读取训练样本时需要在存储系统里打开大量的小文件，整体训练吞吐会受到很大影响。&lt;/p&gt;
&lt;p&gt;源代码里用 Yaml 配置训练数据集，通过如下方式构建 Dataloader:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;utils&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; DataLoader&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Dataset

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;LoadImagesAndLabels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Dataset&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;

    f &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# image files&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; p &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; path &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;isinstance&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        p &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Path&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# os-agnostic&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;is_dir&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# dir&lt;/span&gt;
            f &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; glob&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;glob&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;**&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;*.*&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; recursive&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;is_file&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# file&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                t &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strip&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;splitlines&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                parent &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sep
                f &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;replace&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;./&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; parent&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;startswith&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;./&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; x &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; x &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; t&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# local to global path&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;raise&lt;/span&gt; FileNotFoundError&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&apos;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;prefix&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;p&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; does not exist&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;im_files &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;replace&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;/&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sep&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; x &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; f &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lower&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; IMG_FORMATS&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;可以看到，单个样本直接从本地存储系统中读取，如果使用 COCO 全量数据集，则需要打开的小文件数量对存储系统的压力不可小觑。&lt;/p&gt;
&lt;p&gt;这里，我们采用自研的&lt;strong&gt;高速数据集仓库，&lt;a href=&quot;https://doc.hfai.high-flyer.cn/api/datasets.html&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hfai.datasets&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;，优化训练数据的格式。将大量的小文件通过 &lt;a href=&quot;/blog/ffrecord&quot;&gt;FFRecord&lt;/a&gt; 整合转化为若干个集中的大文件，并且可以使用 FFRecord 中优化的随机读和批量读，进行数据样本的高速随机访问。同时，hfai 数据集仓库封装了很多常用的公开数据集，并且采用幻方自研的高速存储 3FS 进行保存，可以实现极大的性能优化。改造非常简单，如下例所示：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;datasets &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; COCODetection
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; ffrecord &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; FileReader
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; ffrecord&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;torch &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Dataset&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; DataLoader

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;LoadImagesAndLabels&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Dataset&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data_dir &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; COCODetection&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;train&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data_dir
    self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; FileReader&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data_dir &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;train2017.ffr&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; check_data&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;通过上面两行代码，就可以轻松加载 hfai 数据集仓库中的 &lt;a href=&quot;https://doc.hfai.high-flyer.cn/api/datasets.html#hfai.datasets.CocoDetection&quot;&gt;COCODetection 数据集&lt;/a&gt;，大幅提升训练样本的读取效率。更多的数据集和使用，可以阅读 &lt;a href=&quot;https://doc.hfai.high-flyer.cn/api/datasets.html&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hfai.datasets&lt;/code&gt; 官方文档&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id=&quot;hfai-训练改造&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hfai-%E8%AE%AD%E7%BB%83%E6%94%B9%E9%80%A0&quot; aria-label=&quot;hfai 训练改造 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;hfai 训练改造&lt;/h3&gt;
&lt;p&gt;萤火提供了统一的训练管理平台，可以将大量的训练任务依据优先级负载均衡到不同的GPU上执行，充分利用起计算算力。对于 YOLOv5 的训练，我们可以加大数据并行，极大加速训练速度。操作上只需要加入如下几行代码：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;引入 hfai&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; hfai&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用 hfreduce, &lt;code class=&quot;language-text&quot;&gt;hfai.nn&lt;/code&gt; 替换代码中的参数&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nn &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; hfnn
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parallel &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; DistributedDataParallel

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;local_rank&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;

  model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hfnn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to_hfai&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DistributedDataParallel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; device_ids&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;local_rank&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用 &lt;code class=&quot;language-text&quot;&gt;hfai.multiprocessing.spawn&lt;/code&gt; 启动多卡并行训练，绑定 numa 避免网络拥塞以提高训练效率&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  args &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; parse_args&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  ngpus &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;device_count&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;multiprocessing&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;spawn&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; nprocs&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;ngpus&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; bind_numa&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;训练每步都轮询一次萤火集群，看当前的计算资源是否足够继续训练，做好断点的保存&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;start_epoch&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; start_step&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; optimizer&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; load_ckpt&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;train&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; epoch &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;start_epoch&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; epochs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; step&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; batch &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dataloader&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; step &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; start_step&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
      
      &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;

      &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; rank &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; local_rank &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;receive_suspend_command&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        save_ckpt&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; epoch&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; step&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; optimizer&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;go_suspend&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;通过如上4步简单的改造，我们就可以基本利用起萤火集群的特性，对 YOLOv5 的训练进行优化提升。更多详细的代码改造细节，可以阅读我们在模型仓库中&lt;a href=&quot;https://github.com/HFAiLab/yolov5&quot;&gt;开源的代码&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&quot;训练结果&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AE%AD%E7%BB%83%E7%BB%93%E6%9E%9C&quot; aria-label=&quot;训练结果 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;训练结果&lt;/h2&gt;
&lt;p&gt;我们申请 4 个萤火计算节点进行并行训练。通过 hfai 命令行工具提交任务，测试萤火集群对 YOLOv5 训练加速的性能。如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/0069e8cf48e5304cc07e5a23fc65866f/92153/result.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 35.58282208588957%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAAHABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAQG/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgAB/9oADAMBAAIQAxAAAAHdjKsB/wD/xAAYEAEAAwEAAAAAAAAAAAAAAAADAQISE//aAAgBAQABBQI7qaLK9apqP//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPwFMf//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPwFdf//EAB0QAAEEAgMAAAAAAAAAAAAAAAEAAgMhERJhgZH/2gAIAQEABj8CcCzZmxxfKjfG2tbHauMjxf/EABoQAAICAwAAAAAAAAAAAAAAAAERACFBUcH/2gAIAQEAAT8hZeCUOAlQwYRVOOGaV0yxP//aAAwDAQACAAMAAAAQ9/8A/8QAFxEBAQEBAAAAAAAAAAAAAAAAAQARIf/aAAgBAwEBPxAACGOl/8QAGBEBAAMBAAAAAAAAAAAAAAAAAQARIbH/2gAIAQIBAT8QVbitjyf/xAAaEAEBAAMBAQAAAAAAAAAAAAABEQAhMWGB/9oACAEBAAE/EFspwEXR28jZjJgU4FkS9OhhCHlewh6Ps+Z//9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;result&quot;
        title=&quot;result&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/0069e8cf48e5304cc07e5a23fc65866f/6aca1/result.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/0069e8cf48e5304cc07e5a23fc65866f/d2f63/result.jpg 163w,
https://hfai-static.high-flyer.cn/static/0069e8cf48e5304cc07e5a23fc65866f/c989d/result.jpg 325w,
https://hfai-static.high-flyer.cn/static/0069e8cf48e5304cc07e5a23fc65866f/6aca1/result.jpg 650w,
https://hfai-static.high-flyer.cn/static/0069e8cf48e5304cc07e5a23fc65866f/92153/result.jpg 891w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;可以看到，左右两图分别展示了萤火集群特性（hfai）相比原始训练方式（raw）和不使用算子，hfreduce (hfai w/o nn&amp;#x26;hfreduce) 的加速效果。如左图所示，完整的萤火集群特性相比原始训练方式有将近 &lt;strong&gt;50%&lt;/strong&gt; 的训练提速，这得益于优秀的训练数据集管理和优良的算子与通信能力；如右图所示，在使用同样的数据加载模式下，hfreduce 和 hfai 优化算子可以进一步提升训练速度，充分利用显卡计算资源，整体获得将近 20% 的训练提速。&lt;/p&gt;
&lt;p&gt;下面给大家展示一些萤火集群训练出的 YOLOv5 模型在目标检测任务上的效果：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/8dc03f22d32bc55f8f9a66b1b2777eb8/0f529/cases.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 76.07361963190185%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAEH0lEQVQ4ywXBWUzTBwDA4f+TD8sezLJky/a2xE1n0AlT53ST4RhShKLS0nK0pS2l3LRAD6AHPYDSUigFCtgWKkdLudQKItlEJnNqHEuciT4sWfayzSV72/H42/cJ1Qo9FVIV2io1EqkGdV0bk8txbqxust43QUu7FqmymJ0GBamwA78/yLBdRWt9NW15Z4iXXkSX+yknXjtA8enTCPeVNexdVZC6VIc8T0miuoFqfTXlDbWMOAf5JD+bc+LjzBolDPXICZguc92ZT8BUxnqRiO2ir4h164hKsogW5iP4Cr9gvLQBlySOosiJSqVhbD6G0W1lfDqOoduC1eNAVZyPtekSa5Mmrvu0xH2NqM8e595YhPW9bZaGLawVixBamxsxtTRh72ylp6MRe1c7kakRJqZCjIdHmJwYYdg/jEWn4XHGw8MbblLxbhJjLsJlSpZDE4xNjtKi70JaqEQILdwhsfmIha2HJDefE13ZolMnYdWtY7JHhqP+Ar7ucvpDTZi056iyialZtJFbkkPtlyK+Mefxna2AuOYsLlUlQvvICgOhJHcWn7Fz+wV3F2/Q39FE/Pok3kyE9FyYyJAdb8SGSlLFSX+a7HYzJfIzfG26wr4ll0f2i7xKSPkpXIeQJ5Mjyj1KQJaPo1rEQGUBt6d89EbHWJlqY3/OTHtFLn1RF4GZWTKPnmEbD2IxK5m7UkiyKJu1qmwWyrNZ7ZIjWL0WQtMBrB4TBmcH9qAHj8uAs0NLg1aKr1dDd4eG7r5elnZ2uTa/hNHjxR0MY29uxt3axVrNPJYCD2O6CYQ7K8ssfb/KTHKFSNDPdnqOUvEHyMoP02rVoi7N4ljWO7SYe/nlz/8orRzmfLGN+N0fic5vci11iyGPn7a2JF7vFsJEhZyg1YlY3YZNWcVTi5FETyHrbik3DWVs9stprf0EcYUG/1SaIx8e46OcHHRdXpyeGOPuMF39ASRFCuRqHYLB3Emv147LYcLltREMuFmalbOZ0HNzSkk6VklwoIRDh97nrTcP8u7bb3Dw9QO8d+QI6novDqOGuoZmpBIzF0VihPTiIuPJNWTpB1QmNmnrsTEWdDNkNBO12dlIxkjNzyBX1KKoN1FeZ+X81XrKagz0um2ERgcID4YJjY4yNDyI8Mfvv7H7/GfyrSFqhyaYc7uY1mhpPS+m76qUx9EZfF1+Tn1WQG5hBfoOD9dSW8SSG+jLLuOuMBLqNDFrqGDW1Ynw79//sL5zD5G+hd0nD3lyK4Mo5wRFWRfwVRvYSiwTtrgxdTu4lcnw8sVL/nr1K/tPU9QpS9CXlWJuVNNyqQCHTouw/8M+u4+f4IjNsXF/j9j8AodPfc7Rk3kMuHzshiPsBQaZik5zd2uDvQffktm+zVw6SK2ukiqlAmWNko9PnkIuk/E/l+fi2ypsGNcAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;cases&quot;
        title=&quot;cases&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/8dc03f22d32bc55f8f9a66b1b2777eb8/a6d36/cases.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/8dc03f22d32bc55f8f9a66b1b2777eb8/222b7/cases.png 163w,
https://hfai-static.high-flyer.cn/static/8dc03f22d32bc55f8f9a66b1b2777eb8/ff46a/cases.png 325w,
https://hfai-static.high-flyer.cn/static/8dc03f22d32bc55f8f9a66b1b2777eb8/a6d36/cases.png 650w,
https://hfai-static.high-flyer.cn/static/8dc03f22d32bc55f8f9a66b1b2777eb8/e548f/cases.png 975w,
https://hfai-static.high-flyer.cn/static/8dc03f22d32bc55f8f9a66b1b2777eb8/0f529/cases.png 1259w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;体验总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%93%E9%AA%8C%E6%80%BB%E7%BB%93&quot; aria-label=&quot;体验总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;体验总结&lt;/h2&gt;
&lt;p&gt;YOLOv5 作为目标检测领域的旗舰模型，受到了广泛的关注。其不提供论文直接开源代码，并且用 Yaml 配置文件来指导深度学习模型的构建，在深度学习领域中也是独树一帜。我们借助幻方萤火集群，很轻松地实现了集群特性与这套新的开发模式的打通，获得明显的加速效果，证明了萤火集群的易用性和实力。&lt;/p&gt;
&lt;p&gt;综合体验打分如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;研究指数：★★★&lt;/p&gt;
&lt;p&gt;该模型是目标检测领域下的旗舰模型，成熟且已在工业界成功地落地实践。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开源指数：★★★★★&lt;/p&gt;
&lt;p&gt;数据和代码都已开源，代码逻辑清晰可读性高。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;门槛指数：★★★&lt;/p&gt;
&lt;p&gt;样例数据量小，模型规模不大。代码开发模式新颖。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通用指数：★★&lt;/p&gt;
&lt;p&gt;模型只针对目标检测场景，其他场景待验证。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;适配指数：★★★★★&lt;/p&gt;
&lt;p&gt;依赖简单，PyTorch 框架构建的模型，只需要修改几行代码就能在萤火集群上执行。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;幻方 AI 紧跟 AI 研究的前沿浪潮，致力于用领先算力助力AI落地与价值创造，欢迎各方数据研究者与开发者们一同共建。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[hfai.pl | 兼具萤火集群的优化特性的 PyTorch Lightning]]></title><description><![CDATA[Pytorch Lightning（简称 pl） 是在 PyTorch 基础上进行封装的库，它能帮助开发者脱离 PyTorch 一些繁琐的细节，专注于核心代码的构建，在 PyTorch 社区中备受欢迎。本文为大家介绍如何在 PyTorch Lightning…]]></description><link>https://www.high-flyer.cn/blog/hfai_pl/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/hfai_pl/</guid><dc:creator><![CDATA[Freja]]></dc:creator><pubDate>Thu, 17 Nov 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Pytorch Lightning（简称 pl） 是在 PyTorch 基础上进行封装的库，它能帮助开发者脱离 PyTorch 一些繁琐的细节，专注于核心代码的构建，在 PyTorch 社区中备受欢迎。本文为大家介绍如何在 PyTorch Lightning 上轻松的应用幻方萤火集群的系列优化特性。&lt;/p&gt;
&lt;h2 id=&quot;集群环境适配&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E9%9B%86%E7%BE%A4%E7%8E%AF%E5%A2%83%E9%80%82%E9%85%8D&quot; aria-label=&quot;集群环境适配 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;集群环境适配&lt;/h2&gt;
&lt;p&gt;若集群每个计算节点有 &lt;code class=&quot;language-text&quot;&gt;x&lt;/code&gt; 张 GPU。用户提交任务时需选定节点数量 &lt;code class=&quot;language-text&quot;&gt;N&lt;/code&gt;，则该任务可获得 &lt;code class=&quot;language-text&quot;&gt;N*x&lt;/code&gt; 个 GPU。每个进程中全局环境变量含义如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;world_size&lt;/code&gt; (hfai): 节点数量，用 &lt;code class=&quot;language-text&quot;&gt;N&lt;/code&gt; 表示&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;rank&lt;/code&gt; (hfai): 节点 id，用 &lt;code class=&quot;language-text&quot;&gt;n&lt;/code&gt; 表示，&lt;code class=&quot;language-text&quot;&gt;n&lt;/code&gt; 属于 &lt;code class=&quot;language-text&quot;&gt;0&lt;/code&gt; ~ &lt;code class=&quot;language-text&quot;&gt;N-1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;local_rank&lt;/code&gt; (hfai): GPU id, 用 &lt;code class=&quot;language-text&quot;&gt;k&lt;/code&gt; 表示，&lt;code class=&quot;language-text&quot;&gt;k&lt;/code&gt; 属于 &lt;code class=&quot;language-text&quot;&gt;0&lt;/code&gt; ~ &lt;code class=&quot;language-text&quot;&gt;x-1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;与 PyTorch &lt;code class=&quot;language-text&quot;&gt;init_process_group&lt;/code&gt; 的变量有如下对应：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;world_size&lt;/code&gt; (PyTorch): 进程数量，每个 GPU 对应一个进程，因此总进程数目为总 GPU 数目，计算方法为 &lt;code class=&quot;language-text&quot;&gt;N*x&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;rank&lt;/code&gt; (PyTorch): 进程 id，利用节点 id 和 GPU id 可以计算出进程的 id，计算方法为 &lt;code class=&quot;language-text&quot;&gt;n*x+k&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在一般的 PyTorch 代码中，我们需要进行如下的分布式初始化：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;ip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;environ&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;MASTER_ADDR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
port &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;environ&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;MASTER_PORT&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2223&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
hosts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;environ&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;WORLD_SIZE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# number of nodes&lt;/span&gt;
rank &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;environ&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;RANK&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# node id&lt;/span&gt;
gpus &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;device_count&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# gpus per node&lt;/span&gt;
dist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;init_process_group&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    backend&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;nccl&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
    init_method&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;tcp://&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;ip&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;port&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
    world_size&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;hosts&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;gpus&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
    rank&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;rank&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;gpus&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;local_rank
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_device&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;local_rank&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;pl 对分布式初始化进行了封装，用户不需要自己初始化，只需指定节点数量和 GPU 数量即可。为了适配到幻方萤火集群，我们提供了 &lt;code class=&quot;language-text&quot;&gt;HFAIEnvironment&lt;/code&gt; 环境插件，只需要几行代码即可将 pl 的分布式参数无缝适配到萤火集群当中。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pl &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; HFAIEnvironment
trainer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pytorch_lightning&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Trainer&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    gpus&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; num_nodes&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;N&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    plugins&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;HFAIEnvironment&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 定义 HFai 环境并作为插件输入&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;绑定-numa&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E7%BB%91%E5%AE%9A-numa&quot; aria-label=&quot;绑定 numa permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;绑定 numa&lt;/h2&gt;
&lt;p&gt;为了规避跨 numa 传输带来的带宽损耗，建议对训练代码进行 numa 绑定，在一般的 PyTorch 代码中，我们通过使用 &lt;code class=&quot;language-text&quot;&gt;hfai.multiprocessing&lt;/code&gt; 启动多进程，并指定 &lt;code class=&quot;language-text&quot;&gt;bind_numa=True&lt;/code&gt; 来进行 numa 的绑定，代码如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; torch
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; hfai

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gpu_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_device&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gpu_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# ......&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    ngpus &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;utils&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;num_gpus&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 调用 cuda 函数会导致子进程产生错误&lt;/span&gt;
    hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;multiprocessing&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fork&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; args&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; nprocs&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;ngpus&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; bind_numa&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;pl 中对多进程的启动进行了封装，用户只需要在 &lt;code class=&quot;language-text&quot;&gt;strategy&lt;/code&gt; 中指定使用 &lt;code class=&quot;language-text&quot;&gt;ddp&lt;/code&gt; 或者 &lt;code class=&quot;language-text&quot;&gt;ddp_spawn&lt;/code&gt; 就可以指定多进程的启动方式。因此我们提供了两种新的 &lt;code class=&quot;language-text&quot;&gt;strategy&lt;/code&gt;：&lt;code class=&quot;language-text&quot;&gt;ddp_bind_numa&lt;/code&gt; 和 &lt;code class=&quot;language-text&quot;&gt;ddp_spawn_bind_numa&lt;/code&gt;，用户选择这两种 strategy，就可以在指定多进程启动方式的同时绑定 numa，使用方式如下所示：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 使用 ddp_bind_numa 或者 ddp_spawn_bind_numa&lt;/span&gt;
trainer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pytorch_lightning&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Trainer&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;strategy&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ddp_spawn_bind_numa&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;使用-hfreduce&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%BF%E7%94%A8-hfreduce&quot; aria-label=&quot;使用 hfreduce permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;使用 hfreduce&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/blog/hf-reduce&quot;&gt;hfreduce&lt;/a&gt; 是幻方 AI 自研的高性能多卡并行通信工具，其能够更高效的在多显卡之间交换梯度信息，加速模型训练。&lt;/p&gt;
&lt;p&gt;在一般的 PyTorch 代码中，我们通过使用 &lt;code class=&quot;language-text&quot;&gt;hfai.nn.parallel.DistributedDataParallel&lt;/code&gt; 替换 PyTorch 自带的 &lt;code class=&quot;language-text&quot;&gt;torch.nn.parallel.DistributedDataParallel&lt;/code&gt; 即可使用 hfreduce。&lt;/p&gt;
&lt;p&gt;由于 pl 中对 DDP 的初始化进行了封装，因此我们提供了 &lt;code class=&quot;language-text&quot;&gt;hfreduce_bind_numa&lt;/code&gt; 和 &lt;code class=&quot;language-text&quot;&gt;hfreduce_spawn_bind_numa&lt;/code&gt; 两种 &lt;code class=&quot;language-text&quot;&gt;strategy&lt;/code&gt;。用户在初始化 &lt;code class=&quot;language-text&quot;&gt;Trainer&lt;/code&gt; 的时候进行如下指定即可。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 使用 hfreduce_bind_numa 或者 hfreduce_spawn_bind_numa&lt;/span&gt;
trainer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pl&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Trainer&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;strategy&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;hfreduce_bind_numa&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;自动打断重启&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%87%AA%E5%8A%A8%E6%89%93%E6%96%AD%E9%87%8D%E5%90%AF&quot; aria-label=&quot;自动打断重启 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;自动打断重启&lt;/h2&gt;
&lt;p&gt;幻方萤火平台采用任务级分时调度的底层设计，给每个任务分配集群运行时间片。按照分时调度的方案规则，训练任务会被中断、并自动调起。因此在该平台上运行的代码需要在训练循环中进行打断信号的捕获和参数保存，以便之后恢复训练。断点保存的示例代码如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; epoch &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;epochs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; step &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data_batch&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;distributed&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_rank&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; gpu_id &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 在0号节点的0号进程上接收集群调度信息&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;receive_suspend_command&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 
                model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;save&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 保存模型、迭代器等参数到文件&lt;/span&gt;
                time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sleep&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 最多预留5秒完成断点保存，之后会被强制打断&lt;/span&gt;
                hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;client&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;go_suspend&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 发送准备好被打断的信号&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;pl 对训练循环进行了封装，因此我们提供了 &lt;code class=&quot;language-text&quot;&gt;ModelCheckpointHF&lt;/code&gt; 作为回调，在收到打断信号的 step 进行模型的保存，在每次任务启动时，检测是否需要从上一个断点恢复训练，使用方法如下所示：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pl &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; ModelCheckpointHF
output_dir &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;hfai_out&apos;&lt;/span&gt;
cb &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ModelCheckpointHF&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dirpath&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;output_dir&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
trainer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pytorch_lightning&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Trainer&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;callbacks&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;cb&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 自动处理集群打断信号&lt;/span&gt;

ckpt_path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&apos;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;output_dir&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;cb&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;CHECKPOINT_NAME_SUSPEND&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;.ckpt&apos;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 检查是否有断点模型被保存&lt;/span&gt;
ckpt_path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ckpt_path &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exists&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ckpt_path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;
trainer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fit&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    model_module&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    ckpt_path&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;hfai_suspend_ckpt_path &lt;span class=&quot;token comment&quot;&gt;# 自动恢复训练&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;使用-hfai-优化算子&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%BF%E7%94%A8-hfai-%E4%BC%98%E5%8C%96%E7%AE%97%E5%AD%90&quot; aria-label=&quot;使用 hfai 优化算子 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;使用 hfai 优化算子&lt;/h2&gt;
&lt;p&gt;幻方 AI 依托萤火二号集群，对 PyTorch 框架进行了深度优化，结合萤火集群的特点，对一些常用的 AI 算子重新研发，提升效率，进一步提升了模型整体的训练效率。&lt;/p&gt;
&lt;p&gt;在 pl 框架中，我们只需要增加如下一行代码，就可以将 PyTorch 中的算子转换成 hfai 优化后的算子：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; pytorch_lightning &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; pl
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ToyNetModule&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pl&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;LightningModule&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# ...&lt;/span&gt;
pl_module &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ToyNetModule&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
model_module &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; nn_to_hfai&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pl_module&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 将算子转换为 hfai 算子&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;使用-ffrecord&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%BF%E7%94%A8-ffrecord&quot; aria-label=&quot;使用 ffrecord permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;使用 FFRecord&lt;/h2&gt;
&lt;p&gt;为了在 PyTorch Lightning 中使用 ffrecord 的 Dataloader，我们需要在 Dataloader 设置 &lt;code class=&quot;language-text&quot;&gt;skippable=False&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; ffrecord&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;torch &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Dataset&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; DataLoader

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyDataset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Dataset&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# ...&lt;/span&gt;

dataset &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; MyDataset&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
dataloader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DataLoader&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dataset&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; batch_size&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; num_workers&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;num_workers&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; skippable&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;使用示例&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B&quot; aria-label=&quot;使用示例 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;使用示例&lt;/h2&gt;
&lt;p&gt;上面介绍了如何将 pl 框架的代码融入萤火集群的各种优化特性当中，下面提供一个完整的示例帮助大家理解：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pl &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; HFAIEnvironment
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pl &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; ModelCheckpointHF
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; pytorch_lightning &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; pl

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ToyNetModule&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pl&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;LightningModule&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;

output_dir &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;hfai_out&apos;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 模型保存路径&lt;/span&gt;
cb &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ModelCheckpointHF&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dirpath&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;output_dir&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 可以接收集群打断信号的回调类&lt;/span&gt;
trainer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pl&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Trainer&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    gpus&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 每个节点 x 个 GPU&lt;/span&gt;
    num_nodes&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;N&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 节点数量&lt;/span&gt;
    strategy&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ddp_bind_numa&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 支持 ddp_bind_numa, ddp_spawn_bind_numa, hfreduce_bind_numa, hfreduce_spawn_bind_numa&lt;/span&gt;
    plugins&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;HFAIEnvironment&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 自动适配 HFAI 分布式环境&lt;/span&gt;
    callbacks&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;cb&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 自动处理集群打断信号&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
model_module &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; nn_to_hfai&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ToyNetModule&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 将算子转换为 hfai 算子&lt;/span&gt;

ckpt_path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&apos;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;output_dir&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;cb&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;CHECKPOINT_NAME_SUSPEND&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;.ckpt&apos;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 判断之前是否保存了断点模型&lt;/span&gt;
ckpt_path &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ckpt_path &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exists&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ckpt_path&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;
trainer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fit&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    model_module&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    ckpt_path&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;ckpt_path &lt;span class=&quot;token comment&quot;&gt;# 自动恢复训练&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;通过上面的简单适配，PyTorch Lightning 就能够应用幻方萤火集群的系列优化特性啦。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[hfai images | 自定义镜像，解决环境配置的最后一里路]]></title><description><![CDATA[幻方 AI 发布了其沉淀多年的深度学习套件 hfai ，吸引了众多同行研究员和开发者们咨询试用。整个套件的功能较多，而熟悉掌握了这套规则，是能够轻松地调用起平台的算力资源，从而高效完成训练任务的。为此，我们专门创建了 “hfai 使用心法” 系列专辑，陆续为大家介绍 hfai…]]></description><link>https://www.high-flyer.cn/blog/hfai_images/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/hfai_images/</guid><dc:creator><![CDATA[High-Flyer]]></dc:creator><pubDate>Fri, 11 Nov 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;幻方 AI 发布了其沉淀多年的&lt;a href=&quot;/blog/hfai_usage&quot;&gt;深度学习套件 hfai&lt;/a&gt; ，吸引了众多同行研究员和开发者们咨询试用。整个套件的功能较多，而熟悉掌握了这套规则，是能够轻松地调用起平台的算力资源，从而高效完成训练任务的。为此，我们专门创建了 “hfai 使用心法” 系列专辑，陆续为大家介绍 hfai 一些功能的设计思路和原理，帮助大家更快上手 hfai，游刃有余的应对深度学习作业的各项挑战。&lt;/p&gt;
&lt;p&gt;之前的文章为大家介绍了使用 &lt;a href=&quot;/blog/hfai_venv&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;haienv&lt;/code&gt;&lt;/a&gt; 构建运行环境和执行任务，然而对于一些特殊的场景，如强化学习、物理仿真等，单单通过安装 Python 依赖已不足以满足需求。研究者往往会构建项目特有镜像。如何将这类需求在萤火集群上支持是幻方 AI 研发者们在思考研究的问题。&lt;/p&gt;
&lt;p&gt;最近，&lt;code class=&quot;language-text&quot;&gt;hfai images&lt;/code&gt; 功能面世，为研究者和开发者们提供了一套解决此类方法的绝招。本期文章将为大家详细介绍。&lt;/p&gt;
&lt;h2 id=&quot;使用场景&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF&quot; aria-label=&quot;使用场景 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;使用场景&lt;/h2&gt;
&lt;p&gt;如&lt;a href=&quot;/blog/hfai_venv&quot;&gt;上一期文章所介绍&lt;/a&gt;的，haienv 为萤火集群的用户提供了自建 Python 运行环境的能力，其支持 pip, conda 两种方式满足大部分用户环境构建的需求。&lt;/p&gt;
&lt;p&gt;而 &lt;code class=&quot;language-text&quot;&gt;hfai images&lt;/code&gt; 解决的是一些&lt;strong&gt;非 Python 环境安装的问题&lt;/strong&gt;，比如物理仿真里要安装模拟器，分子计算工具等。&lt;/p&gt;
&lt;p&gt;幻方 AI 对集群中的镜像进行了深度优化和封装，以满足萤火集群高性能的深度学习训练要求。因此 hfai 虽支持用户的自有镜像构建，但需要符合 hfai 的规范和流程，其过程&lt;strong&gt;需要幻方管理员的参与和支持&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;在确定使用 &lt;code class=&quot;language-text&quot;&gt;hfai images&lt;/code&gt; 之前，请您审视自己的环境安装需求，确定只有自有镜像这一条路比较方便后，可以&lt;a href=&quot;https://mp.weixin.qq.com/s/1orFQWkCzxH1sGZa8twleQ&quot;&gt;和管理员联系&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&quot;使用流程&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%BF%E7%94%A8%E6%B5%81%E7%A8%8B&quot; aria-label=&quot;使用流程 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;使用流程&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;hfai images&lt;/code&gt; 的使用流程包含如下几步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;获取集群中的 base 镜像的 tar 包。我们提供了 &lt;code class=&quot;language-text&quot;&gt;cuda_111&lt;/code&gt; 和 &lt;code class=&quot;language-text&quot;&gt;cuda_113&lt;/code&gt; 两个版本，基于 &lt;code class=&quot;language-text&quot;&gt;Ubuntu 20.04&lt;/code&gt;；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在本地加载上述 tar 包，比如 &lt;code class=&quot;language-text&quot;&gt;registry.high-flyer.cn/platform/hf_training:ubuntu2004-cu113-20221019&lt;/code&gt;；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;基于上述 base 镜像构建自己的镜像（比如 &lt;code class=&quot;language-text&quot;&gt;python:3.8-alpine&lt;/code&gt;）；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;docker save&lt;/code&gt; 自己的镜像，保存成 tar 包（比如 &lt;code class=&quot;language-text&quot;&gt;python-alpine.tar&lt;/code&gt;），通过 &lt;code class=&quot;language-text&quot;&gt;hfai workspace&lt;/code&gt; 上传到萤火集群；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开 Studio &lt;a href=&quot;https://doc.hfai.high-flyer.cn/start/hfai_intro.html#id9&quot;&gt;进入 workspace 目录&lt;/a&gt;，使用 &lt;code class=&quot;language-text&quot;&gt;hfai images load&lt;/code&gt; 命令（比如 &lt;code class=&quot;language-text&quot;&gt;hfai images load python-alpine.tar&lt;/code&gt;）；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;等待完成，可以通过 &lt;code class=&quot;language-text&quot;&gt;hfai images list&lt;/code&gt; 命令查看。这里镜像加载完成后返回如下结果：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/c98dd0f7edfe7f395b76af9cbb2adadc/e2310/hfai_list_case.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 12.269938650306749%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAUUlEQVQI11WNQQoAMQgD+wsrBbXa/v+JWVLwsIeBaKIZe2+4O0QEc84fqorMfJxzUFW498LMXp6aHrOc11oYEfGCPKDZmkXUDcOkH/cd6ULuPuOBNpRmCM1rAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;hfai list case&quot;
        title=&quot;hfai list case&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/c98dd0f7edfe7f395b76af9cbb2adadc/a6d36/hfai_list_case.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/c98dd0f7edfe7f395b76af9cbb2adadc/222b7/hfai_list_case.png 163w,
https://hfai-static.high-flyer.cn/static/c98dd0f7edfe7f395b76af9cbb2adadc/ff46a/hfai_list_case.png 325w,
https://hfai-static.high-flyer.cn/static/c98dd0f7edfe7f395b76af9cbb2adadc/a6d36/hfai_list_case.png 650w,
https://hfai-static.high-flyer.cn/static/c98dd0f7edfe7f395b76af9cbb2adadc/e2310/hfai_list_case.png 968w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;等状态变成 &lt;code class=&quot;language-text&quot;&gt;loaded&lt;/code&gt; 之后，您才可以通过 &lt;code class=&quot;language-text&quot;&gt;hfai python test.py -- -n 1 --image registry.high-flyer.cn/hfai/python:3.8-alpine&lt;/code&gt; 来使用您所构建的镜像。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[在 MM 系列框架上使用 FFRecord]]></title><description><![CDATA[FFRecord 是幻方AI提供的训练数据格式，其可以整合大量零散的小文件，支持训练数据的随机索引，极大发挥分布式高速存储的性能，提高训练效率。然而，对于 mmdetection, mmsegmentation 等广受研究者欢迎的 mm…]]></description><link>https://www.high-flyer.cn/blog/mm_ffrecord/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/mm_ffrecord/</guid><dc:creator><![CDATA[小杞]]></dc:creator><pubDate>Thu, 03 Nov 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;/blog/ffrecord&quot;&gt;FFRecord&lt;/a&gt; 是幻方AI提供的训练数据格式，其可以整合大量零散的小文件，支持训练数据的随机索引，极大发挥分布式高速存储的性能，提高训练效率。然而，对于 &lt;a href=&quot;https://mmdetection.readthedocs.io/en/latest/&quot;&gt;mmdetection&lt;/a&gt;, &lt;a href=&quot;https://mmdetection.readthedocs.io/en/latest/&quot;&gt;mmsegmentation&lt;/a&gt; 等广受研究者欢迎的 mm-* 系列框架，其深度封装了数据和模型，让萤火集群的用户不能方便快捷的进行 FFRecord 转化。对此，幻方AI针对这类场景进行了优化，提供了 &lt;a href=&quot;https://doc.hfai.high-flyer.cn/api/utils.html#hfai.utils.mm.FFRecordClient&quot;&gt;&lt;strong&gt;FFRecordClient 接口&lt;/strong&gt;&lt;/a&gt;。用户能够在配置文件中选择使用 FFRecordClient 来替换默认的读取后端。&lt;/p&gt;
&lt;p&gt;那么 FFRecordClient 和之前的 FFRecord 有什么不同？它具体该如何使用？本期文章将为大家分享。在阅读本文之前，建议读者先了解一下 &lt;a href=&quot;https://zhuanlan.zhihu.com/p/339190576&quot;&gt;MMCV FileClient 的原理&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&quot;方法介绍&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%96%B9%E6%B3%95%E4%BB%8B%E7%BB%8D&quot; aria-label=&quot;方法介绍 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;方法介绍&lt;/h2&gt;
&lt;p&gt;我们知道，FFRecord 可以将大量的小文件整合到几个大文件中。与 TFRecord 这种开源文件格式不同，FFRecord 可以支持随机读取，批量读取，可以极大地提高高速存储的数据读取性能。对于 mm-* 系列框架中的数据封装，FFRecord 扩展了&lt;strong&gt;文件夹打包能力&lt;/strong&gt;，以适配这种场景。具体的使用方式如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; ffrecord
ffrecord&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pack_folder&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/path/to/dataset&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;packed.ffr&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;在训练中，可以使用  FFRecordClient 读取后端&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在训练代码中导入 FFRecordClient：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;utils&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改配置文件，为所有的读取小文件的操作添加 &lt;code class=&quot;language-text&quot;&gt;file_client_args&lt;/code&gt; 参数，比如在 mmseg 中：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;file_client_args&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    backend&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ffrecord&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    fname&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;packed.ffr&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

train_pipeline &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;LoadImageFromFile&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; file_client_args&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;file_client_args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;LoadAnnotations&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; reduce_zero_label&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; file_client_args&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;file_client_args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Resize&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; img_scale&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2048&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;512&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ratio_range&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;使用示例&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B&quot; aria-label=&quot;使用示例 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;使用示例&lt;/h2&gt;
&lt;p&gt;接下来我们展示两个示例，分别是在 mmdetection 和 mmsegmentation 上的使用。&lt;/p&gt;
&lt;h3 id=&quot;mmdetection&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#mmdetection&quot; aria-label=&quot;mmdetection permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;mmdetection&lt;/h3&gt;
&lt;p&gt;以 coco 数据集为例，假设我们已经有 coco 的原始数据集，目录结构如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;coco/
├── annotations
├── train2017
└── val2017&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;我们先打包整个数据集到 &lt;code class=&quot;language-text&quot;&gt;data/coco/coco.ffr&lt;/code&gt; 中：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; ffrecord
ffrecord&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pack_folder&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;coco/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;data/coco/coco.ffr&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后把 annotations 文件夹单独拷贝出来放到 &lt;code class=&quot;language-text&quot;&gt;data/coco/annotations&lt;/code&gt;，现在目录结构如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;data
└── coco
    ├── annotations
    └── coco.ffr&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在训练代码中导入 FFRecordClient：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;utils&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改配置文件 &lt;code class=&quot;language-text&quot;&gt;configs/_base_/datasets/coco_detection.py&lt;/code&gt; 的内容为： &lt;a href=&quot;https://doc.hfai.high-flyer.cn/performance/resources/mm/coco_detection.html&quot;&gt;coco_detection.py&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;mmsegmentation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#mmsegmentation&quot; aria-label=&quot;mmsegmentation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;mmsegmentation&lt;/h3&gt;
&lt;p&gt;以 ADE20k 数据集为例，假设我们已经有 ADE20k 的原始数据集，目录结构如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ADEChallengeData2016
├── annotations
├── images
├── objectInfo150.txt
└── sceneCategories.txt&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;我们先打包整个数据集到 &lt;code class=&quot;language-text&quot;&gt;data/ade20k.ffr&lt;/code&gt; 中：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; ffrecord
ffrecord&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pack_folder&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;ADEChallengeData2016/&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;data/ade20k.ffr&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在训练代码中导入 FFRecordClient：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;utils&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;mm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改配置文件 &lt;code class=&quot;language-text&quot;&gt;configs/_base_/datasets/ade20k.py&lt;/code&gt; 的内容为： &lt;a href=&quot;https://doc.hfai.high-flyer.cn/performance/resources/mm/ade20k.html&quot;&gt;ade20k.py&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[萤火跑模型 | 能量函数指导的图图翻译扩散模型]]></title><description><![CDATA[扩散模型作为一种新的深度生成模型，在图像生成领域取得了 SOTA 的效果，并且逐渐在诸多应用领域展现出强大的性能，如视频生成、分子图建模等。 最近来自人民大学李崇轩课题组的研究者们提出了一种基于能量函数的扩散模型生成指导方法 EGSDE…]]></description><link>https://www.high-flyer.cn/blog/egsde/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/egsde/</guid><dc:creator><![CDATA[Chongxuan Li]]></dc:creator><pubDate>Thu, 20 Oct 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;扩散模型&lt;/strong&gt;作为一种新的深度生成模型，在图像生成领域取得了 SOTA 的效果，并且逐渐在诸多应用领域展现出强大的性能，如视频生成、分子图建模等。&lt;/p&gt;
&lt;p&gt;最近来自人民大学李崇轩课题组的研究者们提出了一种基于能量函数的扩散模型生成指导方法 EGSDE。该方法旨在通过预定义的能量函数对预训练好的扩散模型进行指导，从而实现可控生成。现有指导生成方法如 classifier-guidance 等可以理解为 EGSDE 的特例。理论上，研究者从专家产物的角度解释了 EGSDE 的采样分布。&lt;/p&gt;
&lt;p&gt;该项目利用了幻方AI深度学习训练平台的算力及加速性能，在无监督的图到图翻译任务上进行了大量实验，在若干数据集上取得了最好的“可信-真实”权衡结果。该项工作被人工智能顶级学术会议 NeurIPS 2022 收录，本文将为大家简要描述。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文标题&lt;/strong&gt;：EGSDE: Unpaired Image-to-Image Translation via Energy-Guided Stochastic Differential Equations&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文地址&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/abs/2207.06635&quot;&gt;https://arxiv.org/abs/2207.06635&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型仓库&lt;/strong&gt;：&lt;a href=&quot;https://github.com/ML-GSAI/EGSDE&quot;&gt;https://github.com/ML-GSAI/EGSDE&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;模型介绍&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E4%BB%8B%E7%BB%8D&quot; aria-label=&quot;模型介绍 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型介绍&lt;/h2&gt;
&lt;h3 id=&quot;1-研究动机&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-%E7%A0%94%E7%A9%B6%E5%8A%A8%E6%9C%BA&quot; aria-label=&quot;1 研究动机 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. 研究动机&lt;/h3&gt;
&lt;p&gt;无监督的图到图翻译的任务是在没有成对数据的情况下学习源域到目标域的映射，且希望翻译后的图像一方面要去掉原图的域特有特征使其更“真实”，另一方面可以保留原图的域无关特征使其更“可信”。例如将猫翻译到狗，要把原图的鼻子、胡须这种特有特征去掉，同时保留原图的姿势、色调这种无关特征。&lt;/p&gt;
&lt;p&gt;随着扩散模型的发展，逐渐开始涌现一些基于扩散模型的图到图翻译方法并且取得了 SOTA 的结果。这些方法往往是在目标域训练一个扩散模型保证“真实”，在测试的阶段用上原图的信息实现“可信”，但是并没有用上源域的训练数据。&lt;/p&gt;
&lt;p&gt;基于此，该工作的研究者们希望同时利用源域和目标域的数据训练一个能量函数，通过能量函数对预训练好的目标域扩散模型进行指导生成，从而实现更“可信”且“真实”的图到图翻译。整体结构如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/4d293888ddc63a7cd5b399f7126d2449/a3767/banner.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 40.49079754601227%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAACk0lEQVQozwGIAnf9AIGlVgBKTT8AxdPLAWNdXwUoCxQcBCAgIgASEAsAAAACAAAABwAAAAUAAAAB1hcAAeVuDBCjOQANAAAABgABAQ09PTwST1JRCAAAAAIcHhwCAGRNLwG0lmUD+v//AP///wCxIUsrGZCQOQCQhAw4HRwRMjQzLyYlIRMIHzwCfnReJrKBSzi/fkIgu5luDhYTDBQNCAUXBwYEGA8MBhNJLhkEAF1DHQDNn1MAzd7kHO7t7Uj///8C////ANi9pgCdkX0Ac11bAIV2XACak3kAPZzYDVS/+Rn///8EAABIAMShXADgo3EA///kAAAAAADWeCoAAGxuNkmDfU6ZrqSTo9bZ2KVmZmGgWlhVjWtvYFiDgnOVgH13fHZ3XVmHg22dfXtsY3Z4TGmJg2qbdHJcVHp8SIORhGePbHNIV4J+UJiMf2KZAH+DXYyafWL/i21TzBc8NChfW1j/XVhX/3Fya66JgHf/gnhx94OEdLKMfm//f3lpzIuGcNmRd2X/fntmqJOFaP+Sb1f/e4Rkrpp/Y/+SdFn/AIqbaV18f33Hoaeujo6RjyZYWVirXVxeqnp8cGuEhIC5ioiLmouSg25/gYHFj5WRfomRgI6EhYfOo6yea4SNd6KMjZSysL+haoGHfa2YnKKvABULExCkpqNKAAAAD76poQrMu68zAAAAA29wchNMeo8LaJKnDdavfg+kgkEMx5pkFKCFYh1whYYjVYu1HWGXvhKCgoQQcm11FQERAAe5rKM0AP///wD///8eAAAAAMGyoAK8q6EQAAEUAoB7cQblcBQf63QWIfV8GRzNZRMT53MUJuxwDCLwYwAVC6XjGxGh2CgXoNMifJybCBgMHAK2pZgQvUsBoavh0ssAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;banner&quot;
        title=&quot;EGSDE 的框架图&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/4d293888ddc63a7cd5b399f7126d2449/a6d36/banner.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/4d293888ddc63a7cd5b399f7126d2449/222b7/banner.png 163w,
https://hfai-static.high-flyer.cn/static/4d293888ddc63a7cd5b399f7126d2449/ff46a/banner.png 325w,
https://hfai-static.high-flyer.cn/static/4d293888ddc63a7cd5b399f7126d2449/a6d36/banner.png 650w,
https://hfai-static.high-flyer.cn/static/4d293888ddc63a7cd5b399f7126d2449/e548f/banner.png 975w,
https://hfai-static.high-flyer.cn/static/4d293888ddc63a7cd5b399f7126d2449/a3767/banner.png 1210w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;2-模型方法&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%E6%A8%A1%E5%9E%8B%E6%96%B9%E6%B3%95&quot; aria-label=&quot;2 模型方法 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. 模型方法&lt;/h3&gt;
&lt;p&gt;该方法的核心要义是如何根据任务设计合适的能量函数。在图像翻译任务中，研究者将能量函数 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;ε&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\varepsilon(y,x,t)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;ε&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 拆成两项对数势函数，分别负责生成图像的“真实”和“可信”。&lt;/p&gt;
&lt;div class=&quot;math math-display&quot;&gt;&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mtable rowspacing=&quot;0.25em&quot; columnalign=&quot;right&quot; columnspacing=&quot;&quot;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;[&lt;/mo&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;∇&lt;/mi&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;/msub&gt;&lt;mi&gt;ε&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/msub&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;]&lt;/mo&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mover accent=&quot;true&quot;&gt;&lt;mi&gt;w&lt;/mi&gt;&lt;mo&gt;ˉ&lt;/mo&gt;&lt;/mover&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\begin{aligned}
d_y = [f(y,t)-g(t)^2(s(y, t) - \nabla_y \varepsilon(y,x_0,t))]dt + g(t)d\bar{w}
\end{aligned}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.5241em;vertical-align:-0.5121em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mtable&quot;&gt;&lt;span class=&quot;col-align-r&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.0121em;&quot;&gt;&lt;span style=&quot;top:-3.1479em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1514em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2861em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10764em;&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8641em;&quot;&gt;&lt;span style=&quot;top:-3.113em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;∇&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1514em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2861em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;ε&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;))]&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;mord accent&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.5678em;&quot;&gt;&lt;span style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.02691em;&quot;&gt;w&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;accent-body&quot; style=&quot;left:-0.1667em;&quot;&gt;&lt;span class=&quot;mord&quot;&gt;ˉ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.5121em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;math math-display&quot;&gt;&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mtable rowspacing=&quot;0.25em&quot; columnalign=&quot;right left&quot; columnspacing=&quot;0em&quot;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;mi&gt;ε&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;ε&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;ε&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant=&quot;double-struck&quot;&gt;E&lt;/mi&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;∣&lt;/mi&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;∣&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;ε&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi mathvariant=&quot;double-struck&quot;&gt;E&lt;/mi&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;∣&lt;/mi&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;∣&lt;/mi&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;ε&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\begin{aligned} 
\varepsilon(y,x,t) &amp;#x26;= \lambda_s\varepsilon_s(y, x, t) + \lambda_i\varepsilon_i(y, x, t) \\ 
&amp;#x26;= \lambda_s\mathbb{E}_{q_{t | 0}(x_t | x)}\varepsilon_s(y, x_t, t) - \lambda_i\mathbb{E}_{q_{t | 0}(x_t | x)}\varepsilon_i(y, x_t, t) 
\end{aligned}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:3.0788em;vertical-align:-1.2894em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mtable&quot;&gt;&lt;span class=&quot;col-align-r&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.7894em;&quot;&gt;&lt;span style=&quot;top:-3.9494em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;ε&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-2.4494em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.2894em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;col-align-l&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.7894em;&quot;&gt;&lt;span style=&quot;top:-3.9494em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;λ&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1514em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;ε&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1514em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;λ&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3117em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;ε&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3117em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-2.4494em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;λ&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1514em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathbb&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3448em;&quot;&gt;&lt;span style=&quot;top:-2.5198em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.03588em;&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3448em;&quot;&gt;&lt;span style=&quot;top:-2.3448em;margin-left:-0.0359em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5357em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;∣0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3695em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2963em;&quot;&gt;&lt;span style=&quot;top:-2.357em;margin-left:0em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.143em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;∣&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.4388em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;ε&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1514em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2806em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;λ&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3117em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathbb&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3448em;&quot;&gt;&lt;span style=&quot;top:-2.5198em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.03588em;&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3448em;&quot;&gt;&lt;span style=&quot;top:-2.3448em;margin-left:-0.0359em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5357em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;∣0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3695em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2963em;&quot;&gt;&lt;span style=&quot;top:-2.357em;margin-left:0em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.143em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;∣&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.4388em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;ε&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3117em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2806em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.2894em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;进一步，研究者将负责“真实”的对数势函数 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;ε&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\varepsilon_s(y,x,t)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;ε&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1514em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 定义为原图和生成的图片经过域独特的特征提取器 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi mathvariant=&quot;double-struck&quot;&gt;E&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\mathbb{E}_s(\cdot,\cdot)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathbb&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1514em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 后之间的相似度（余弦相似度），负责“可信”的 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;ε&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\varepsilon_i(y,x,t)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;ε&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3117em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 则定义为两者经过域无关的特征提取器 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi mathvariant=&quot;double-struck&quot;&gt;E&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\mathbb{E}_i(\cdot,\cdot)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathbb&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3117em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 后之间的负相似度（负 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;L&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;L_2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8333em;vertical-align:-0.15em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;L&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 距离的平方）。&lt;/p&gt;
&lt;div class=&quot;math math-display&quot;&gt;&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mtable rowspacing=&quot;0.25em&quot; columnalign=&quot;right left&quot; columnspacing=&quot;0em&quot;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;ε&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi mathvariant=&quot;double-struck&quot;&gt;E&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi mathvariant=&quot;double-struck&quot;&gt;E&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;ε&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;∣&lt;/mi&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;∣&lt;/mi&gt;&lt;msub&gt;&lt;mi mathvariant=&quot;double-struck&quot;&gt;E&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi mathvariant=&quot;double-struck&quot;&gt;E&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;∣&lt;/mi&gt;&lt;msubsup&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;∣&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msubsup&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\begin{aligned}
\varepsilon_s(y, x_t, t) &amp;#x26;=cos(\mathbb{E}_s(y,t), \mathbb{E}_s(x_t, t)) \\ 
\varepsilon_i(y, x_t, t) &amp;#x26;=-||\mathbb{E}_i(y,t), \mathbb{E}_i(x_t, t)||_2^2 
\end{aligned}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:3.0241em;vertical-align:-1.2621em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mtable&quot;&gt;&lt;span class=&quot;col-align-r&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.7621em;&quot;&gt;&lt;span style=&quot;top:-3.9221em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;ε&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1514em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2806em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-2.3979em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;ε&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3117em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2806em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.2621em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;col-align-l&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.7621em;&quot;&gt;&lt;span style=&quot;top:-3.9221em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;cos&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathbb&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1514em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathbb&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1514em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2806em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-2.3979em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;∣∣&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathbb&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3117em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathbb&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3117em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2806em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;∣&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;∣&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8641em;&quot;&gt;&lt;span style=&quot;top:-2.453em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.113em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.247em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.2621em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;直观上来说，去噪过程中能量函数的减少一方面导致原图和翻译图片间的特有特征相似度变低，从而去掉原图中源域特有的特征，另一方面导致两者的域无关的特征相似度变高，从而保留原图中域无关的特征。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/610f0d3794432c34a425a6d794d2f0f3/f213e/3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46.62576687116564%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAA7DAAAOwwHHb6hkAAACkElEQVQoz1WSe0hTcRTHv9fd393Nuaa5a9M0X1n0j/5RWIpFDyOyUCwTi4b5SJulORJNbQqbm5uPmppPchn5bEYPyST/cOmUUjPESCuMiEZhRf/0TxH84hoFO3DgcDjnc77ncKBVhHkX+W9VFcg2qopkwf4F8mChwDNo/WnIvQGge+k7WkdfolBnIVuidkjX+ghE4aVgCcuyHCESjnCEEE5CCAeOcEBNvhbN9XViLwOCdQBU4SGhwsTrJcU0pbD1j6ttzveRlFKxRglAAODH83wAYYkvR7gQwhIFYQlEh+a8RlGuK4t1DU54jPns44ONRmnI8CPOAUg6bz2JeTDnoren3n3tcrzJbBqe31R80ylrym4kZZYycQCknBS8lF9VJ8YwVVfHdPd0v114Nhf4RZ4ghPbbhaD5mUAKSPofL6qHFr79Hppf+XRnxuXqffphpG10OafvXk9Kl7Mqikh4gZfya1fB4soisLOlY83ww5Gw3Aw1ywBKGcP4qgIDlKAUvVcHN3TNrIS3jX9UWmd/Su86F4mYH7hfztgmWxgRJPOU4T9QvCFii70gpPoy8SUB/IGLQThk8kOUXY7kCTkQ59m68AtVPZM4VWFCQ34Srp2IRE36USz/vSmiY7fDTWF0zhUmWXedjVanE9M5D6RlbN5fWZk02mjOc1RezsucbTaKorDnuOBfeim+t8GcNWYqz65bTVKKknqtO5BNNIM9VgOr7qBHfmEyNNqEdJv+DG3M2ksrClJqVQlp8t3b4iJiDkfuatRn/ei4kEiNeYkv/gFLDblwM3LECDapCsb2sxJrnwaWrtSTtVYLNVcZqGNq2qA33AClVFJq3Rlhbdd/NlTo6IDdPiG+keiTz1+5Af8AGZXnK45hqVcAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;3&quot;
        title=&quot;特征提取器的实现&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/610f0d3794432c34a425a6d794d2f0f3/a6d36/3.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/610f0d3794432c34a425a6d794d2f0f3/222b7/3.png 163w,
https://hfai-static.high-flyer.cn/static/610f0d3794432c34a425a6d794d2f0f3/ff46a/3.png 325w,
https://hfai-static.high-flyer.cn/static/610f0d3794432c34a425a6d794d2f0f3/a6d36/3.png 650w,
https://hfai-static.high-flyer.cn/static/610f0d3794432c34a425a6d794d2f0f3/e548f/3.png 975w,
https://hfai-static.high-flyer.cn/static/610f0d3794432c34a425a6d794d2f0f3/f213e/3.png 1192w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;实现上，如上图所示，研究者用分类器除去最后一层的剩下部分和低通滤波器分别当做域独特的特征提取器 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi mathvariant=&quot;double-struck&quot;&gt;E&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\mathbb{E}_s(\cdot,\cdot)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathbb&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1514em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 和域无关的特征提取器 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi mathvariant=&quot;double-struck&quot;&gt;E&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\mathbb{E}_i(\cdot,\cdot)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathbb&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3117em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;。&lt;/p&gt;
&lt;p&gt;至此，能量函数和扩散模型已知，从一个带噪声的原图出发，可以通过扩散模型对 EGSDE 进行采样实现图到图的翻译。除此之外，将 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi mathvariant=&quot;double-struck&quot;&gt;E&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\mathbb{E}_s(\cdot,\cdot)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathbb&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1514em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 依赖的二分类器拓展到多分类器，该方法也很容易拓展到多域翻译任务。&lt;/p&gt;
&lt;p&gt;理论上，研究者展示了对 EGSDE 的离散化采样近似等价于从如下专家产物形式的分布采样:&lt;/p&gt;
&lt;div class=&quot;math math-display&quot;&gt;&lt;span class=&quot;katex-display&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;&gt;&lt;semantics&gt;&lt;mtable rowspacing=&quot;0.25em&quot; columnalign=&quot;right&quot; columnspacing=&quot;&quot;&gt;&lt;mtr&gt;&lt;mtd&gt;&lt;mstyle scriptlevel=&quot;0&quot; displaystyle=&quot;true&quot;&gt;&lt;mrow&gt;&lt;mover accent=&quot;true&quot;&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;~&lt;/mo&gt;&lt;/mover&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;∣&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;∣&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;∣&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;∣&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;msub&gt;&lt;mi&gt;Z&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/msub&gt;&lt;/mfrac&gt;&lt;/mrow&gt;&lt;/mstyle&gt;&lt;/mtd&gt;&lt;/mtr&gt;&lt;/mtable&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\begin{aligned} 
\tilde{p}(y_t|x_0) = \frac{p_{r1}(y_t|x_0)p_{r2}(y_t|x_0)p_{f}(y_t|x_0)}{Z_t} 
\end{aligned}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:2.563em;vertical-align:-1.0315em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mtable&quot;&gt;&lt;span class=&quot;col-align-r&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.5315em;&quot;&gt;&lt;span style=&quot;top:-3.5315em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3.427em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord accent&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.6679em;&quot;&gt;&lt;span style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.35em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;accent-body&quot; style=&quot;left:-0.1667em;&quot;&gt;&lt;span class=&quot;mord&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1944em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2806em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;∣&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.427em;&quot;&gt;&lt;span style=&quot;top:-2.314em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.07153em;&quot;&gt;Z&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2806em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.677em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.02778em;&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2806em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;∣&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.02778em;&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2806em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;∣&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.10764em;&quot;&gt;f&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2861em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2806em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;∣&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3011em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.836em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.0315em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;这为 EGSDE 中每个部分的作用提供了解释，其中扩散模型和 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;ε&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\varepsilon_s(y,x,t)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;ε&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1514em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 对应于负责“真实”的专家，&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;ε&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\varepsilon_i(y,x,t)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;ε&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3117em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 对应于负责“可信”的专家。&lt;/p&gt;
&lt;h2 id=&quot;实验&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%AE%9E%E9%AA%8C&quot; aria-label=&quot;实验 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;实验&lt;/h2&gt;
&lt;p&gt;在实验中，研究者选择 FID 作为对“真实”的衡量，L2、PSNR、SSIM 作为对“可信”的衡量，人工测量 AMT 作为同时两方面的衡量，在 AFHQ 和 CelebA-HQ 数据集验证方法的有效性。如下表所示，EGSDE 取得了最好的“可信-真实”权衡结果，且通过调整超参可以进一步改善 FID。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/4843c6099002ce89bf4a711474ce39f1/f43e4/4.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 94.47852760736197%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAABYlAAAWJQFJUiTwAAADOUlEQVQ4y41Uaa+qSBT0//+myU0mE/UuURZRQGTnAgrI0mwqWpNzfN55X14ynTSchl7qVNXpmW0fYJgmbNuGYZjY700YpoG9ZSFJEpTlGeeyRF1XqJsGZVUhTVP4voc0PSIvcnzHMeI4xvl8xkyIBq7roq5r9H2PcRiRZRm+owhd13GnRf0woGlqOK6Dqq5xvV7heR5vIoRAGEW4XC6Y0YM+tk2LWtQQnUDbtnwATTwej/B9/+fAsiz5/ysWbcuHVlX13JAWbbc7SIaERfSO5iLQtR1sx8H9fmck4zjidrthmqY/dvpP8znl3VbHR/gJSxxAretauJ6PV3s8Hn+MX+PXe0ZwVUWFqiuYx+8YphFD38P1vJ+JhOC1+BVTo5hQ/f59JlqBjbKBZEp48/5GP/UY+oHJ/7/td9Qz0TRYSWto5haf/hd8ESJLM+iGgWEY2DakYNM0LFIQBCziOAxwHAdBGDK6tmufHPZdDydwsEjeMV5GTNcJ53OBJElZvaIoeBGpTOMoipDnOW9uWRaPKabNyVqs8nK5xNL5RPvo8Jju0A0d2naL0+nERpdkGaZpIk0TbDQNO30HKghZUbBcznHKMi4CcgSLstlskB9z5oAsoqoKVFXl023Hhq7rbOIsO3FFHWybqyUMIxwOFkTbMY+c8vVyRSNqnJqMzUq8kUEJOXUqqTAMOSav0Rx6Uyc6CBCtIV7Z2K1ooRgK/gkWPJk6pea4LgtBaRMqWlBVJduJqofGhJzcQPF+v0fX908OF/MF5s4SPQbcb3dstA0UVWV1TdPAWpL4Aom/v/H59YWdrvMFsvz4wNvbXzieTszj9XrDjBBZewtlXuJxfzCHJISmaYjjBGEYsJp+EHCKxBndLoTccZ58dl3/H4d8OZQF0vr4wyHxQmmQcpSey4JkrCLZ58VzXVWc5tOv5S8OGwF5J2MevPOP/pfXCCFxSMoSCrrCiENOPUl+eKPDyJdEE3PY9x0kScZXsMKAEXiAU7QOB+bF81z2JdkmSWL2J1mJlKd5q/WKqSjOBW7ThBmhWK1WXFLEH6UkyxLW0pqVPlgW+5RQ0iaatmVknu9ht9tBVmTkRcHZkbH/BfERj/uaSh5YAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;4&quot;
        title=&quot;在AFHQ数据集的量化结果对比&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/4843c6099002ce89bf4a711474ce39f1/a6d36/4.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/4843c6099002ce89bf4a711474ce39f1/222b7/4.png 163w,
https://hfai-static.high-flyer.cn/static/4843c6099002ce89bf4a711474ce39f1/ff46a/4.png 325w,
https://hfai-static.high-flyer.cn/static/4843c6099002ce89bf4a711474ce39f1/a6d36/4.png 650w,
https://hfai-static.high-flyer.cn/static/4843c6099002ce89bf4a711474ce39f1/e548f/4.png 975w,
https://hfai-static.high-flyer.cn/static/4843c6099002ce89bf4a711474ce39f1/f43e4/4.png 1120w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;为了验证 DAT 的有效性，研究者们展示了一些可视化结果。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/7fa8db2ef96b0c4de519a8064cfeab4a/acf8f/5.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.87116564417178%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAEIElEQVQ4yx2SeUzTdxiHv+oSp2ggayzMKkwCgngwipQWSgtU6F2OAuNoEQqUQ1ppi0C52l8FBHr9OIYiLSDIJQXHoQw3ZUgYkI0RcHNmU7yWuUM3smz/uMx3qe+fb97PkzyfvAgh5Drr6EMAgDj04wghtL22tpYw3NXiKxFEcsUcpjBDwOSWSITcwqRY0TlpTGg1ixhUx3AJQAhtu7+64sxsS+PQ0Ns5XaTcm57ANRckx06xIwIxhJCLE14iS+1oOZcLFfnp0KCSwflCCVTlpoK5RAZKMceEENohSEjZlyEWGuVxkTf5DHIDQmgXCoiNd5dnJP290FUPpVLuzwihPWnxfNSkq0waMulG2s5X9XTp1bZRvN42YDR0ftJQPTSKVQg0khQUwkt2L5AkvbpzSQ/abNFLhNB7yG0/yaNYnvPPFK4Dq07zC0LbXczNzR5jYw5/duwpASuWm8ji8nlJmTKRSCpL5BWUhBIzNDRXRYtTmagsyPvzZose8CrlK2aWkuDs7p27y98kj1zG9R24lasux3Y6lc9mpXTgpbmgyU6BekUmYEVS0MpTAS/LB5WEb3TebC7P7Z6dW0w2lyu0ncY6sZPlrHEPQu86wa6epAD0EmCXc/mxxShx4HXjNkvTYL9ZP9DVbBg0lCqvWrSqcbvJkACwiZCrByGeF7Mf+Qa77/Q99v4ZeQ4RVWvkB9swxWJ7vfrboc7G9btj9q8n2yqf3lues/V3Gs631+RuGEozFsKDfBclvKilk4c/mKOERuizBZEPwgOPbDDood/ps+LWpTzGYzaLloZYTFqIQSN/jes1YME0MNFaAb0XVDDZbVm3GBW3c0VhwKQegUKJEEZM1TAz3A3H/XwdptN8qE3lADnQH6Yq80CXygG3fbvV6GKrmbQ6P7Zxa8T64vaN/s37a0sPP50Y3rozM3XdYq+yNerLtmrVsicSXsTzsoLcnwav2B+RSEQ8PTzwRXYM/Vk0i/G8SSp4Ig478YfX4QNZaMRmJnZbKlftprJnEwPtP6zNT3//2ZXm3+6tzI8O9zZ2jrRX/t5nLf0xkuy3yQsLfkwN8HlADWOaE6OoT8n+Po8iGfRN1Ufsh2IW9VchOyoThVHItOpi6RaOaaC55uyb62b1616sCKZ7LEt4s3Iym08B2ofekJ8mhGuWanDYW/8N9PO5as2Jf6scdMwPZnRFUCfhA4HgokAXsErvhRt9f413N8HUtcuwtjj73+SADW5NOlasF7XTmFYBpYWpIBUwAVOdgbGBnjeHDnoM5EUFQyGbDtHMcGiRJYA0ggyeXh5K57vs+Orz/hM9ZgW1+5KJ1dtr5+I1RcwvF77wtY2ZvKcdXXSrQSmk+HueolPIbKy8ONDNde8hqg8p2N/rQBwl5CSLQzkqoh31iebHMgj/A0gy3dH2pnY+AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;5&quot;
        title=&quot;(a)关于能量函数的消融实验；（b）EGSDE的可视化效果&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/7fa8db2ef96b0c4de519a8064cfeab4a/a6d36/5.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/7fa8db2ef96b0c4de519a8064cfeab4a/222b7/5.png 163w,
https://hfai-static.high-flyer.cn/static/7fa8db2ef96b0c4de519a8064cfeab4a/ff46a/5.png 325w,
https://hfai-static.high-flyer.cn/static/7fa8db2ef96b0c4de519a8064cfeab4a/a6d36/5.png 650w,
https://hfai-static.high-flyer.cn/static/7fa8db2ef96b0c4de519a8064cfeab4a/e548f/5.png 975w,
https://hfai-static.high-flyer.cn/static/7fa8db2ef96b0c4de519a8064cfeab4a/3c492/5.png 1300w,
https://hfai-static.high-flyer.cn/static/7fa8db2ef96b0c4de519a8064cfeab4a/acf8f/5.png 1340w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，研究者在 “Male→Female” 任务上展示了关于能量函数权重的消融实验，&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\lambda_s&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8444em;vertical-align:-0.15em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;λ&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1514em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 越大，生成的图片越像女性、越“真实”， &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;λ&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\lambda_i&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8444em;vertical-align:-0.15em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;λ&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3117em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 越大，生成的图片保留原图更多的信息、越“可信”，验证了能量函数的作用。&lt;/p&gt;
&lt;h2 id=&quot;总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%80%BB%E7%BB%93&quot; aria-label=&quot;总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;总结&lt;/h2&gt;
&lt;p&gt;研究者们提出了一种基于能量函数的扩散模型生成指导方法 EGSDE。该方法旨在通过预定义的能量函数对预训练好的扩散模型进行指导，从而实现可控生成。该方法实现了更“可信”且“真实”的图到图翻译，同时可以推广应用到更多的场景领域。&lt;/p&gt;
&lt;p&gt;同时，研究者采用幻方 AI 的一系列深度学习自研套件，极大加速了模型的训练过程，获得了大量的实验结果。我们欢迎更多优秀的课题与幻方合作，一道推动 AI 技术的发展与落地。&lt;/p&gt;
&lt;p&gt;综合体验打分如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;研究指数：★★★★&lt;/p&gt;
&lt;p&gt;该模型改进提升了扩散模型方法，推动了图图翻译场景下的技术发展。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开源指数：★★★★★&lt;/p&gt;
&lt;p&gt;数据和代码都进行了完整且规整的开源。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;门槛指数：★★★&lt;/p&gt;
&lt;p&gt;数据规模，模型大小适中，适合多级多卡数据并行训练。一般单卡训练难度比较大。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通用指数：★★★★&lt;/p&gt;
&lt;p&gt;该方法能适用于很多可控生成任务，如材料和药物领域新分子的生成。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;适配指数：★★★★★&lt;/p&gt;
&lt;p&gt;依赖简单，很容易与幻方 AI 的训练优化工具结合，提效明显。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;幻方 AI 紧跟 AI 研究的前沿浪潮，致力于用领先算力助力 AI 落地与价值创造，欢迎各方数据研究者与开发者们一同共建。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[萤火跑模型 | 英伟达元宇宙创造营 GET3D]]></title><description><![CDATA[随着多个行业朝着大规模的 3D 虚拟世界发展，能够生成大量的、高质量的、多样的 3D 内容的工具是非常被需要的。英伟达的最新工作 GET3D 希望训练更好的 3D 生成模型，来生成下游任务可以直接使用的、保真纹理和复杂几何细节的 3D 模型。 幻方 AI…]]></description><link>https://www.high-flyer.cn/blog/get3d/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/get3d/</guid><dc:creator><![CDATA[Freja]]></dc:creator><pubDate>Tue, 18 Oct 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;随着多个行业朝着大规模的 3D 虚拟世界发展，能够生成大量的、高质量的、多样的 3D 内容的工具是非常被需要的。英伟达的最新工作 GET3D 希望训练更好的 3D 生成模型，来生成下游任务可以直接使用的、保真纹理和复杂几何细节的 3D 模型。&lt;/p&gt;
&lt;p&gt;幻方 AI 最近对这项工作进行了整理和优化，在幻方萤火二号上复现了实验。通过幻方自研的 &lt;a href=&quot;/blog/3fs&quot;&gt;3FS&lt;/a&gt;、&lt;a href=&quot;/blog/hf-redcue&quot;&gt;hfreduce&lt;/a&gt;、&lt;a href=&quot;/blog/hfnn&quot;&gt;算子&lt;/a&gt;，对模型训练进行提速，从单机多卡的训练支持优化到多级多卡的训练支持，帮助研究者和开发者们降低使用门槛。本期文章将为大家详细描述。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文标题&lt;/strong&gt;：GET3D: A Generative Model of High Quality 3D Textured Shapes Learned from Images&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原文地址&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/pdf/2209.11163.pdf&quot;&gt;https://arxiv.org/pdf/2209.11163.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;项目主页&lt;/strong&gt;：&lt;a href=&quot;https://nv-tlabs.github.io/GET3D/&quot;&gt;https://nv-tlabs.github.io/GET3D&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型仓库&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/GET3D&quot;&gt;https://github.com/HFAiLab/GET3D&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;模型介绍&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E4%BB%8B%E7%BB%8D&quot; aria-label=&quot;模型介绍 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型介绍&lt;/h2&gt;
&lt;h3 id=&quot;3d-生成模型&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3d-%E7%94%9F%E6%88%90%E6%A8%A1%E5%9E%8B&quot; aria-label=&quot;3d 生成模型 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3D 生成模型&lt;/h3&gt;
&lt;p&gt;最近，英伟达发布了最新的 GET3D 模型，可以通过 2D 图像训练，生成具有高保真纹理和复杂几何细节的 3D 形状。在此之前，学术界也有大量的 3D 生成模型，他们所生成的 3D 模型存在如下问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;缺乏几何细节&lt;/li&gt;
&lt;li&gt;缺乏纹理&lt;/li&gt;
&lt;li&gt;在合成过程中只能使用神经渲染器，3D 软件中不方便使用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;过去工作的方法以及生成的 3D 模型效果如下表所示，其中 Ours 代表 GET3D 模型的生成几何结果，Ours-tex 代表 GET3D 模型生成的带纹理结果：
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/12e535126a7b14aea4a0f4e18b3b1625/dcccd/previous.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 34.355828220858896%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsTAAALEwEAmpwYAAABgklEQVQY0xXKzXKaQAAAYJ6ur9FznqO3XnpKOpnEIgoSUcgi/3+7wEJAMbqwBqlYnHQQX6PT7/wx177PNsV2Tz4Oh2Jfvle0ohS/k4KUJSk3O0Ip3ezJrjocKN3u9mVFfzfNblt0Xcec2/bniJXAKo6i8YtkB1B6Bd9GgoUiGYC5ZqYYPwuiYjoIQn6pwAhHIZqyTyUhzLXvRxNeVMBbkryoerresNPZl693S8OeyeBelLM85yVZdTyMsQg0nOVJkhiG2TQN8/fz84HlJvMFhJDXbdNxFc34/jyxbYddvD5KKkRIWCjySg98X1I1xw+iEOmaSghh/rTt/S/O8GAIIbcESZY7jqu6MF+vZXXlRXGWprKm4yyPoxAYVr4p0gQHnnVqT8yxrkfcZGWYIUKPU8H0fN00f3AzYLkLWeEVNY5jTpzL+v/wNBUsz4/CcDzmCSmZYRgCiPJie7lcdMetT+2xPs4UcO66sqqsAN1ut+Qtg0k6DFcnQLQ+XvvetOy2Pf8DkOE3ccuDIhIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;previous&quot;
        title=&quot;previous&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/12e535126a7b14aea4a0f4e18b3b1625/a6d36/previous.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/12e535126a7b14aea4a0f4e18b3b1625/222b7/previous.png 163w,
https://hfai-static.high-flyer.cn/static/12e535126a7b14aea4a0f4e18b3b1625/ff46a/previous.png 325w,
https://hfai-static.high-flyer.cn/static/12e535126a7b14aea4a0f4e18b3b1625/a6d36/previous.png 650w,
https://hfai-static.high-flyer.cn/static/12e535126a7b14aea4a0f4e18b3b1625/e548f/previous.png 975w,
https://hfai-static.high-flyer.cn/static/12e535126a7b14aea4a0f4e18b3b1625/dcccd/previous.png 1127w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;get3d&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#get3d&quot; aria-label=&quot;get3d permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;GET3D&lt;/h3&gt;
&lt;p&gt;GET3D 希望克服上述模型存在的问题，生成具有丰富几何细节、带纹理的、下游 3D 软件中可以直接使用的 3D 模型。并且训练过程只需要 2D 的监督图像训练。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GET3D 包括生成器部分和辨别器部分，生成网路包括如下两个分支：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;几何生成分支&lt;/strong&gt;：可微的输出任意拓扑的表面几何结果&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;纹理生成分支&lt;/strong&gt;：根据查询的表面点来产生纹理场（texture field），还可以扩展到表面的其他属性，比如材质&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;生成器生成 3D 模型及纹理后，通过一个有效的可微栅格器，将生成的带纹理 3D 模型投影到 2D 的高分辨率图片，并使用 2D 辨别器来区分生成器所生成模型的投影图像和真实图像、生成器所生成模型的投影轮廓和真实轮廓。整个过程都是可微分的，使得整个对抗训练可以从辨别器传递到两个分支。模型整体结构如下图所示。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/099ef3726c996670fe4ec4df7cb6503d/000c7/framework.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 33.74233128834356%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsTAAALEwEAmpwYAAABdUlEQVQY0zWQy27TQABF/Z18AX/AJ7BkhZCQECsWqFKliiqCQEJp0+K0gZY0aRI/Spxx4mBSj53Y8565KCDu8ugsjq7nnIN1sICDUcY5A1hn/0I4OCiuq4JZY62xsNZqA8A0QjPpZf6gXOf+56+z22m9Y8EgvekkWbK67LU/tVvLeVTvuBQ2mMXD0d3V9SQMp3ejE865ZNxrP+2S23Vyf7+cEynldqnj/ob8JKPh1ffBRRQFD5QC7qGg8wU5/vDl9PwsDH2ltBbS02bfB8A5xzmvRSUkA/aBAF69OXz0+MlBq6O1UVKyptZK4p9vrEc+9so0808upsOxNqp7cHPeiwBz1IsPT8PVMn32/OXbd50giKM4nkxm4/H1t8FxXTeCca/7wifjPCPkd5YDeP/6R/+SALrVT85GGf6vKKoFWYRhlCRxmk73n0nlKW24lCXdlnQruNpVLF8XdEPphhppd1XzK8srWrOalZRmqxVrGilUVVZaqD8WCXrxvZBX2QAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;framework&quot;
        title=&quot;framework&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/099ef3726c996670fe4ec4df7cb6503d/a6d36/framework.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/099ef3726c996670fe4ec4df7cb6503d/222b7/framework.png 163w,
https://hfai-static.high-flyer.cn/static/099ef3726c996670fe4ec4df7cb6503d/ff46a/framework.png 325w,
https://hfai-static.high-flyer.cn/static/099ef3726c996670fe4ec4df7cb6503d/a6d36/framework.png 650w,
https://hfai-static.high-flyer.cn/static/099ef3726c996670fe4ec4df7cb6503d/e548f/framework.png 975w,
https://hfai-static.high-flyer.cn/static/099ef3726c996670fe4ec4df7cb6503d/000c7/framework.png 1137w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;GET3D 输入是两个采样的高斯分布（z1 和 z2），通过非线性映射网络得到两个隐含表示（w1 和 w2），非线性网络是 8 层的 MLP 网络，每层是 512 维和 leaky-ReLU 的激活函数。两个隐含表示的具体含义如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;纹理隐含向量（w1）：用来控制 3D 模型的形状&lt;/li&gt;
&lt;li&gt;几何隐含向量（w2）：用来控制 3D 模型的纹理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3D 几何生成器&lt;/strong&gt;：GET3D 的几何生成器包含最近提出的可微分表面表征 DMTet，DMTet 将 3D 模型表示成一个可变形三角面片的四面体（tetrahedron）及每个顶点的符号距离场（signed distance field，SDF），通过移动顶点来使得几何形状变形，达到从四面体可微分的恢复 3D 模型表面的目的。通过使用 DMTet，生成器可以生成任意拓扑结构和类别的 3D 模型。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 371px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/29ce43dbf4c2b2d042ab4d46ade09911/d4635/tetrahedron.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.576687116564415%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAABi0lEQVQoz32S6XabMBCF/f7P5qaO6xDWY8AQFu0IWYCQJgdwSdqmuf+0fJoZ3XuA33LOwT/6cnPXAQCEENc0HfSdlMX/gGGVtVYppbX+gKdpQgjVVfXr6cc8zwu/ns3GcM6dc8aYqqpOp1PXdVmWHY9Ha+0DBoBxHDHGmBCM8V7cGOP7/vl8FkL0fY8xvlwuaZpSSv+AKWVKKcG5lH0nuoUfNAyDdW5rcnuuLMuu6/blNjOPs8DBjEg72ym+xSL0wPeclPs9QkgYhlrrPM+jKNr2F/itLktyHa16a0omSS1ueZ6AXRh/FWMMIRQEQbIqTdMHrNSdUDxabcH41+eGlg5mKjBnHACklHVdbxMCQBRFfd9/WIVQa629j3Kc71kdU9kORk3zwBnfLdlljPls5OHVf1m6YhVi1c/LsaxuFSmowEVRBKEPAHvZL0IymYkQ+hI/E9noQWOKqGzOwZPqled5SZJ8js1f+XlYxQVv2gYTlGbXFjWi41t45Prh38VzF2OsKG9bhe9TvcHvy1Dq6x8O0CsAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;tetrahedron&quot;
        title=&quot;tetrahedron&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/29ce43dbf4c2b2d042ab4d46ade09911/d4635/tetrahedron.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/29ce43dbf4c2b2d042ab4d46ade09911/222b7/tetrahedron.png 163w,
https://hfai-static.high-flyer.cn/static/29ce43dbf4c2b2d042ab4d46ade09911/ff46a/tetrahedron.png 325w,
https://hfai-static.high-flyer.cn/static/29ce43dbf4c2b2d042ab4d46ade09911/d4635/tetrahedron.png 371w&quot;
        sizes=&quot;(max-width: 371px) 100vw, 371px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;纹理生成器&lt;/strong&gt;：GET3D 将纹理参数化为纹理场（texture field），纹理生成器以纹理隐含向量（w2）和几何隐含向量（w1）为条件，将具体的表面点，映射到 RGB 表示的颜色空间中。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;可微分渲染和训练&lt;/strong&gt;：GET3D 将生成的 3D 几何模型和纹理场，使用可微分渲染器渲染到 2D 的图片，再使用 2D 辨别器来监督辨别器的学习。辨别器的学习目标是更准确的分辨真实物体的图片和生成物体的渲染图片。&lt;/p&gt;
&lt;h2 id=&quot;模型实践&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E5%AE%9E%E8%B7%B5&quot; aria-label=&quot;模型实践 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型实践&lt;/h2&gt;
&lt;p&gt;幻方 AI 基于英伟达开源的 &lt;a href=&quot;https://github.com/nv-tlabs/GET3D&quot;&gt;GET3D&lt;/a&gt; 代码，进行多级多卡的训练支持，开源至 &lt;a href=&quot;https://github.com/HFAiLab/GET3D&quot;&gt;HFAI GET3D&lt;/a&gt; ，并采用幻方一系列优化工具进行提速升级，包括 hfreduce 并行训练、hfai 集群训练断点挂起等功能。&lt;/p&gt;
&lt;h3 id=&quot;数据集&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E9%9B%86&quot; aria-label=&quot;数据集 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;数据集&lt;/h3&gt;
&lt;p&gt;GET3D 使用 &lt;a href=&quot;https://shapenet.org&quot;&gt;ShapeNET&lt;/a&gt; 数据集进行试验，ShapeNet数据集是一个有丰富标注的、大规模的3D图像数据集。ShapeNetCore 是 ShapeNet 的一个子集，其中包括近 51,300 个独特的 3D 模型。它提供了 55 个常见的对象类别和注释。GET3D 使用 ShapeNetCoreV1 数据集作为训练及测试数据。&lt;/p&gt;
&lt;p&gt;我们对 ShapeNET 数据进行了渲染，将 3D 模型全部投影为 2D 图片以备训练。&lt;/p&gt;
&lt;h3 id=&quot;模型训练&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E8%AE%AD%E7%BB%83&quot; aria-label=&quot;模型训练 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型训练&lt;/h3&gt;
&lt;p&gt;萤火提供了统一的训练管理平台，可以将大量的训练任务依据优先级负载均衡到不同的GPU上执行，充分利用起计算算力。我们只需加入如下几行代码，便可以把训练任务提交给萤火集群运行。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;登录幻方萤火二号，引入 hfai&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;import hfai&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;初始化 hfreduce 分布式参数&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;from hfai.nn.parallel import DistributedDataParallel
model = DistributedDataParallel(model, device_ids=[local_rank])
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

# training ...
for epoch in range(epochs):
    for step, (x, y) in enumerate(dataloader):
        # training
        optimizer.zero_grad()
        output = model(x)
        loss_fn(y, output).backward()
        optimizer.step()&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于每一轮训练，加入接收集群调度的逻辑代码，并做好模型 checkpoint 的保存&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;start_epoch, start_step, others = hfai.checkpoint.init(model, optimizer, ckpt_path=&apos;latest.pt&apos;)
for epoch in range(start_epoch, epochs):
    for step, (x, y) in enumerate(dataloader):
        if step &amp;lt; start_step:
            continue

        output = model(x)
        loss_fn(y, output).backward()
        model.try_save(epoch, step, others=None)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;训练结果&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AE%AD%E7%BB%83%E7%BB%93%E6%9E%9C&quot; aria-label=&quot;训练结果 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;训练结果&lt;/h3&gt;
&lt;p&gt;我们申请 4 个节点，32 张 A100 显卡进行并行训练。通过hfai命令行工具提交任务，在萤火二号上，以车类别作为数据来训练 GET3D，每个 64 个 kimg 仅耗时 10 分钟左右，相比单卡性能提升了 32 倍以上。GPU 利用率在 95% 左右，充分利用其了显卡的计算性能。模型在训练到第 5000 个 kimg 基本达到了收敛状态。&lt;/p&gt;
&lt;p&gt;训练效果可视化如下：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 465px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/cdffd407250a6b1e094f2f046d368095/9ff85/vis1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46.62576687116564%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB7klEQVQozyWQy28SURTG+QuracC2PB2CYI2UFgQHaIFoFTeS2G40Wk2JTUxjijRhw0Yxra4MNTUxWiDpzNzHMPfOkzsz1o3O8OUszknO7zy+gCACUYIiQKIEBQkKAEkAISzLsoJlBcmKBLEIoASxH8jrBF7npQgCgggEHwMQK0RVFIqmyi9BPB9PfownP0djJCtUMyCSJYiF+Q4AL+cwRDLGMqGqIIFPp19f7b/lG9upfIHL5XK1+nqJb9S2BoOBoii6ppu6QSnF8hTLU4hwgFJqmJZwMXr6+En54XY2X4olkkvLK9cXgwsL1xZvRJfiqTjHPW8fHH/+8vHbuYjwzLJUXwFCiOu63U4nxXFr2WzxXqFcqdTqjc1avbJZ3SgU1u/zxQf10qNm9dmL6s5e8+XBxXhiGial1INt2+n3+yvhSCQcCQWDkXA4Go3GYrFEIn4rlbpzO8MluXgiwWVW81uN1SL//sOx6ziEkAD1DzAMYzg8a7Va7f12r9d7d3i49/rNzu5us9nk+fLdbDaTTi+HQpGbyfTaxsnpCWPMhz1aUzWNMWZZM9u2r67+uu4fx3EYY7PZjBACADw66nS73eHZ99+jsaEbqqpSqnqG+bs1L9G8KfNS03RN03VdNwzTNC3GGLM9WZY5d+v/z/8A8zOXTFFY3AYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;vis1&quot;
        title=&quot;vis1&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/cdffd407250a6b1e094f2f046d368095/9ff85/vis1.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/cdffd407250a6b1e094f2f046d368095/222b7/vis1.png 163w,
https://hfai-static.high-flyer.cn/static/cdffd407250a6b1e094f2f046d368095/ff46a/vis1.png 325w,
https://hfai-static.high-flyer.cn/static/cdffd407250a6b1e094f2f046d368095/9ff85/vis1.png 465w&quot;
        sizes=&quot;(max-width: 465px) 100vw, 465px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 459px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/3ea0a7e52194d60e55bd0e674d24bdb5/48711/vis4.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 57.668711656441715%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsTAAALEwEAmpwYAAACbUlEQVQoz12S70sUQRjH92/qRRH2A00vsyjYC01JTa1Oyh+FpEmaxqFp59n6QhL0EI+k7JJ6ERESHWT5oxcZcb1IO8673Z3dvZ2ZndnZ3bs9FOpujaAPz4t5nuEzDHwfLi3KGQmIEhBl5aCAKsqqJCteFVug/LuVQEYCaVFOixKXkWRRAhJQZKDKQAGqBhQVKKqqZVU1q5TOiqp5cxmoEvB8OS3KnJbVdR3qEGJsEGoRQk1mmVYeYUqoxex8LucaBsElEMIQIl2HWjarqBqHsWEYBrPzSNfk1A8Es5lMJrERS8SndtbnE2tLX9Y/MsZsxyGEEmLgvyCMizIh5Fdi7fOr0djsvcXojPCg+9Htyon+C3Mj/tE7ft7vD4VCqVSKYEypyWyXmMzzOUKt+MvJyED501DLzOPBqbHerlb+ZuMpX1VF2fHyhovV9XX++ku1L6a7PsWGNt9OJ9aWQXrbIBQjxBFiPhnrGWw72t9yciBQHe6uCndWTN6qDHb47l719bX5gp01kZH693PNH+avrERal0J8/E2UMgchyBkG2dn+ubG6IkyMVZ89395w5uE133DTifuNh4Mth0KBI+EbZeHOY8Pt5ULv6Wej56aGLi8vxxizEEIcxtg0mVvYhxBGowvrG5u7yeTmavzd6+dLEWF2vH+8p6kvwNfW1vE839FcMxIc3Pr2nTEGYUnGGEMICSGu6zpOjtl2zi0U9vbzhT3TciDEQFYEQbgeCMwvLH7d2qKUoiLYk4tpYWwgdNBgfBCJYRBKqWXZuq4nk8mc49i2hUo5Fb/tCZ5fgvxP8S1MCGWMIYQgRN62/JF/AytqMuVdNty6AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;vis4&quot;
        title=&quot;vis4&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/3ea0a7e52194d60e55bd0e674d24bdb5/48711/vis4.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/3ea0a7e52194d60e55bd0e674d24bdb5/222b7/vis4.png 163w,
https://hfai-static.high-flyer.cn/static/3ea0a7e52194d60e55bd0e674d24bdb5/ff46a/vis4.png 325w,
https://hfai-static.high-flyer.cn/static/3ea0a7e52194d60e55bd0e674d24bdb5/48711/vis4.png 459w&quot;
        sizes=&quot;(max-width: 459px) 100vw, 459px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 464px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/e3b009811d3744d98fb47b08ad6fcd2b/69096/vis2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.25766871165644%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAACfUlEQVQoz0WRy0sbURTG55/ysQkJmQh6Z/KYSSaJaaGNK5NCXejCTU3BCpW2q9qiiyJR1xUsuOmm+RN8gNBiM5m5d2Yyc1+TycOkFsok0X4cDpfD+X18lyO0TGSYyICWiSwT2eb0YUHLhpYzLhsi25wUtAxotSBqmVA3oNB6II1whJDtWI6LbBciO5yPt01k/7eA082WAQXDRC1oGSZyXEy5rxvmz1+3t791x/UI5ZhyyrjteGGWR9i0QtiEArRsZDseoZdX13t7n9bX1zc2NjY3N3d2dj7u7X/e/9JoNEwTcr/Tdr226zlt13La0ApdBIwJY7zteivl8uzsLABgcXFRluV0OgUA0DSttFzc2nrV1PVBf8A4I4QSSjEhnocFjPFgcPf9/DydlHPZrKoqAIBUKpnLZSc9r2nl58+Ojuq63iKE9PsDxjillBAqYA8PR6OTw8NEPC7LsqoquWxWUTKl5eV8XpMkUCjk19Zevq5tfXj/7uBg//T0KyGEUkYIEQghQRBcXl2XSiVJkpJJGSwtpVJJVclk0qmMkpYksASAmtVKT54Wi8XyStkwDN/3MSbCOAC5G9zVarW5uTlRjEcikfn5+UgkspBYABJIJERRjCcSC7Isqaqiabmbm5sgCKYwpdT3O82mXq1Wtrff/Gg0dnffVioVURRnZmai0aiiKLlctlAoFIuFer3u+x0ylkDoVJ1OJwg63W5vOBwNR38Y5xcXF8fHJ9Xqi2g0GovFKpUKQlYQBIyxB5iMccbGLdTEi3O/3x/c3/+FEK6urmYymbOzb8PhEGMy+WkYe2xB6SPKOGOcc8745B4k6HbdtttsNnu93mQ1PHUI438pGDHJGh1rqQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;vis2&quot;
        title=&quot;vis2&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/e3b009811d3744d98fb47b08ad6fcd2b/69096/vis2.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/e3b009811d3744d98fb47b08ad6fcd2b/222b7/vis2.png 163w,
https://hfai-static.high-flyer.cn/static/e3b009811d3744d98fb47b08ad6fcd2b/ff46a/vis2.png 325w,
https://hfai-static.high-flyer.cn/static/e3b009811d3744d98fb47b08ad6fcd2b/69096/vis2.png 464w&quot;
        sizes=&quot;(max-width: 464px) 100vw, 464px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 483px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/7c3aa1899dfe9b7cd2861e78c7434268/77a9e/vis3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60.122699386503065%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsTAAALEwEAmpwYAAACR0lEQVQoz02Q3UtTcRjHz9/UdRcJuVCxRHM6EQOxzdKRlL3QtDSp0RJcZDNzkmNq4EFCs1UEYReKKXQRFN64tvN7Oefs/N7O2cuZ1EX9zlj45Xv18Hy+z4uS12AeIA0iDWKApCHCEOuejbp1iHQgjTWINYjyAOU0qEgSnCBlqwmxibCJdBNiA0AMoFc/yQOUBzVYhmGIdGwQiDQNZBEGMh1qpmUyIUyLQqSjOl/rzwGkYN0wzIJFqGXRdXXmxVxkfn5qdXU6k0nsf02ra8+Syflc7pfrVoUoUsYsixQKxDALWDcUyhil1HHcgz01/uRsV1ebz9fYcKahubklFGoPD/l9jU2XBwbef3iL8BFj3HFKnDMmKSZhzjmxWGpheDF5/tXLztjjzonJ7tGb3e3t566HW8fuBIKhflWN7u/PHhwsZbPfbbv4H6acC8qsaDTY1xeYGO9ILbalFjvTqe70Us/cbGA51fNmfeDzpzFVfbCcDq+9HtV1IIRNKVUolWtXKpWtrXfB4JWRkeGxSO+98Y6piZZYtCnxtDUWvTB01X8/4p+O9Y5cuxiL+n/++FYslgkhEmbe5o5T3P6yvbOze3h4tLu7t7mxkVxIPHp4Izx8aXAw3N8fjNw6PXn31FzitmVRzlltskcz+QTXrbquWy6XqlLH5YrLmJPN5hOJ5zPx+ObGysfMCoTAth3qSSG0jjMvjcotalmcc9sWpVLJtm3GWPX4T7X6W9i2BzJCqEIIoSf4ukRd3KsJLgSlhBLC5I/klH83/wXXSTfoc/KHPgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;vis3&quot;
        title=&quot;vis3&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/7c3aa1899dfe9b7cd2861e78c7434268/77a9e/vis3.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/7c3aa1899dfe9b7cd2861e78c7434268/222b7/vis3.png 163w,
https://hfai-static.high-flyer.cn/static/7c3aa1899dfe9b7cd2861e78c7434268/ff46a/vis3.png 325w,
https://hfai-static.high-flyer.cn/static/7c3aa1899dfe9b7cd2861e78c7434268/77a9e/vis3.png 483w&quot;
        sizes=&quot;(max-width: 483px) 100vw, 483px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;体验总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%93%E9%AA%8C%E6%80%BB%E7%BB%93&quot; aria-label=&quot;体验总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;体验总结&lt;/h2&gt;
&lt;p&gt;GET3D 模型通过 2D 图像训练，生成具有高保真纹理和复杂几何细节的 3D 形状，解决了以往生成模型几何细节缺失、纹理缺失或者下游引擎无法使用等问题。能够生成大量的、高质量的、多样的 3D 内容，帮助多个行业更快速的朝着大规模的 3D 虚拟世界发展。幻方 AI 对 GET3D 代码适配到了多级多卡的训练，借助萤火平台对 GET3D 的训练进行了优化，最终达到了&lt;strong&gt;超过单卡 32 倍的训练速度&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;综合体验打分如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;研究指数：★★★★&lt;/p&gt;
&lt;p&gt;该模型以低成本、2D 监督、端到端的方法实时生成 3D 模型，生成模型几何细节丰富、纹理自然。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开源指数：★★★★&lt;/p&gt;
&lt;p&gt;数据处理和代码都已经开源，代码逻辑清晰、可读性高，HFAI 对其增加了多级多卡的训练支持。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;门槛指数：★★&lt;/p&gt;
&lt;p&gt;数据量、模型大小中等，普通高性能单卡即可运行，但是正常训练需要花费一周左右。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通用指数：★★★★&lt;/p&gt;
&lt;p&gt;该方法使用 2D 领域生成网络的思想进行 3D 模型的生成，未来具有很大的拓展空间。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;适配指数：★★★★★&lt;/p&gt;
&lt;p&gt;该项目依赖简单，很容易与幻方AI的训练优化工具结合，提效明显。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;幻方 AI 紧跟 AI 研究的前沿浪潮，致力于用领先算力助力AI落地与价值创造，欢迎各方数据研究者与开发者们一同共建。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[萤火跑模型 | 分布式训练大规模深度图神经网络]]></title><description><![CDATA[图（Graph…]]></description><link>https://www.high-flyer.cn/blog/distributed-deepgcns/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/distributed-deepgcns/</guid><dc:creator><![CDATA[Vachel]]></dc:creator><pubDate>Tue, 11 Oct 2022 15:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;图&lt;/strong&gt;（Graph）数据在现实世界中非常常见，例如社交网络、交通网络、物理系统等等，近几年&lt;strong&gt;图神经网络&lt;/strong&gt;的发展将图数据的分析与深度神经网络结合，在越来越多的领域发挥出重要的作用，例如电商推荐、生物化学结构分析、反恐反诈风险控制等等。数据规模也呈现越来越大之势，动辄上千万节点规模的图，让很多图神经网络的训练需要探寻并行计算的方式以加速。&lt;/p&gt;
&lt;p&gt;然而，图数据与视觉、自然语言等领域的数据不同，没有划分好的训练样本，很多情况下训练样本是从一个巨大的图中去随机采样，特征也需要在采样的过程中遍历邻接节点，这种天然特性使得对大规模图的并行训练并不容易。&lt;/p&gt;
&lt;p&gt;幻方AI最近尝试对图神经网络的并行训练进行优化，以 &lt;a href=&quot;https://ogb.stanford.edu/&quot;&gt;OGB 图数据集&lt;/a&gt;作为训练样本，在幻方萤火集群上复现 &lt;a href=&quot;https://github.com/lightaime/deep_gcns_torch&quot;&gt;DeepGCNs&lt;/a&gt; 的实验。基于幻方自研的&lt;a href=&quot;/blog/3fs&quot;&gt;3FS&lt;/a&gt;、&lt;a href=&quot;/blog/hf-reduce&quot;&gt;hfreduce&lt;/a&gt;等工具，采用灵活的分布式训练方法，进行不同任务场景下的 GNN 训练提速，取得预期效果。本期文章将为大家详细描述。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文标题&lt;/strong&gt;：DeepGCNs: Can GCNs Go as Deep as CNNs?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原文地址&lt;/strong&gt;：&lt;a href=&quot;https://www.deepgcns.org/&quot;&gt;https://www.deepgcns.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型仓库&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/Distributed-DeepGCNs&quot;&gt;https://github.com/HFAiLab/Distributed-DeepGCNs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据集仓库&lt;/strong&gt;: &lt;a href=&quot;https://doc.hfai.high-flyer.cn/api/datasets.html#hfai.datasets.OGB&quot;&gt;https://doc.hfai.high-flyer.cn/api/datasets.html#hfai.datasets.OGB&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;模型介绍&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E4%BB%8B%E7%BB%8D&quot; aria-label=&quot;模型介绍 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型介绍&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.deepgcns.org/&quot;&gt;&lt;strong&gt;DeepGCNs&lt;/strong&gt;&lt;/a&gt; 集成了近两年一系列前沿的 GNN 工作，其旨在构建如 CNN 一样的深层图卷积网络，解决优化深层结构中的一系列问题，以达到更优的表现效果。具体包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;尝试构建深层的图卷积网络（GCN），探索深层 GCN 结构导致的信息传递快，容易梯度消息、过渡平滑和过渡拟合的问题；&lt;/li&gt;
&lt;li&gt;设计提出残差、密集连接和空洞卷积等方案，使得深层图卷积网络表示更加稳定；&lt;/li&gt;
&lt;li&gt;设计提出使用新的聚合、归一化函数，以统一信息的传递；&lt;/li&gt;
&lt;li&gt;研究逆连接、组卷积、权重绑定和平衡模型，以提高深层图卷积模型的内存和参数效率。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;DeepGCNs 的结构如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/9bd9ae00ddc60f1a385245887710eb13/b4098/structure.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 31.901840490797547%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABZklEQVQY0yWP7W6aAAAAff/36ZIucVrRaq1atUMQkG8ERUT5HgK3tP17uVxyPbqWa2gRhwaef0R1L5i2z0nT8BWF4nYHWkJfxdRl8tjE0ETi0KQpbAJXxjL2PDKbRxXTS5MbsrxD3itsPre8fYi8zpZsF0s2qxWubtGUZxxlxGzSJwumTMe/+bv6A7cJhjRk0H/m7o2o7xK9skg5u1tCd4OsyizUgPVWwVkuMN/nXEybKj9xdaeYyivZac5hJ2DIL9TRjLM1RVwPuToj8qtE73vHHBGov9CdA/3tkZ1scxIElKcn6jCi/hdxNl4w9wLJccxBHOIoA+rLmEAX2K373N0BVSx+BaGqcqLQp6wqwijmoOsYmoZnWbRtR9cWmNoHb7MJt5PIfDZBlZa0qcRhv0AQRuSXT5oy+Ak2bcslisjzgrLI8VyXJE2pHw+6rvtSyLIcz/NoWvB9nyTNvnmSpDiOw48F/wH+NrbCkfcQ2QAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;structure.png&quot;
        title=&quot;structure.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/9bd9ae00ddc60f1a385245887710eb13/a6d36/structure.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/9bd9ae00ddc60f1a385245887710eb13/222b7/structure.png 163w,
https://hfai-static.high-flyer.cn/static/9bd9ae00ddc60f1a385245887710eb13/ff46a/structure.png 325w,
https://hfai-static.high-flyer.cn/static/9bd9ae00ddc60f1a385245887710eb13/a6d36/structure.png 650w,
https://hfai-static.high-flyer.cn/static/9bd9ae00ddc60f1a385245887710eb13/b4098/structure.png 816w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;在 OGB 公开图数据集的很多任务测试中，DeepGCNs 都取得了优异的效果。&lt;/p&gt;
&lt;p&gt;可以看到，大规模图与深度图卷积模型的结合在越来越多的场景中发挥出惊人的效果，在 OGB 的公开结果测试排名中可以看到，对显卡算力的需求越来越大。如何高效的利用计算资源，尽可能加速图卷积网络的训练，是之后走向落地商用的必研究课题。&lt;/p&gt;
&lt;h2 id=&quot;图的分布式训练&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%9B%BE%E7%9A%84%E5%88%86%E5%B8%83%E5%BC%8F%E8%AE%AD%E7%BB%83&quot; aria-label=&quot;图的分布式训练 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;图的分布式训练&lt;/h2&gt;
&lt;p&gt;那么，如何对图数据进行分布式训练呢？在这之前，我们先看下图领域下的三大任务：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;点属性预测（Node Property Prediction）&lt;/li&gt;
&lt;li&gt;边属性预测（Link Property Prediction），也叫作链接预测&lt;/li&gt;
&lt;li&gt;图属性预测（Graph Property Prediction）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里图属性预测任务下，训练样本数据的构建方式和一般视觉、自然语言任务类似，输入的单个样本是一个完整的图，分布式训练可以在样本层面做拆分。具体方式如下例所示：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;utils&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;distributed &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; DistributedSampler
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; torch_geometric&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loader &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; DataLoader

train_sampler &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DistributedSampler&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;train_data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
train_loader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DataLoader&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;train_data&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; batch_size&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sampler&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;train_sampler&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; num_workers&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pin_memory&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;而点属性预测和边链接预测则不同，训练样本一般是从一张大规模图中随机游走采样而成，特别是当需要考虑一些多步特征的情况，分布式训练所需的训练样本拆分就难以操作。&lt;/p&gt;
&lt;p&gt;那么这两种任务就无法进行并行训练了呢？幻方AI就这个问题进行了调研和实验，总结了如下两种并行训练方式：&lt;/p&gt;
&lt;h3 id=&quot;1-分割子图&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-%E5%88%86%E5%89%B2%E5%AD%90%E5%9B%BE&quot; aria-label=&quot;1 分割子图 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. 分割子图&lt;/h3&gt;
&lt;p&gt;一种并行训练的方式是&lt;strong&gt;对大规模图进行图分割&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;一般来说大规模图数据里，或多或少会存在一些社群分割，例如社交网络、学术网络等。在同一社群中节点彼此比较相似，链接性更高。因此，对于一个大规模图，可以将图根据连通性切割分为若干个子图，然后这些子图上进行分布式数据并行训练。&lt;/p&gt;
&lt;p&gt;然而，这种方式需要进行数据的预处理，前期比较耗时。同时，图分割通过某一指标进行切分，实际上人为去除了某些社群间链接的特征，这在某些场景上来说，不可避免会对最终的落地效果造成影响。&lt;/p&gt;
&lt;h3 id=&quot;2-并行轮次&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%E5%B9%B6%E8%A1%8C%E8%BD%AE%E6%AC%A1&quot; aria-label=&quot;2 并行轮次 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. 并行轮次&lt;/h3&gt;
&lt;p&gt;另外一种并行训练的方式，是&lt;strong&gt;并行轮次&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;并行轮次的出发点是：既然不能在每 Epoch 上将训练样本拆分到多张卡上计算，那可以考虑让每张计算显卡单独计算一个 Epoch，合并梯度，减少训练轮次，进而提升训练效率。&lt;/p&gt;
&lt;p&gt;以 DeepGCNs 的点预测任务为例：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; epoch &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;epochs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    train_parts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gdata&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;random_partition_graph&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;gdata&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;total_no_of_nodes&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cluster_number&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cluster_number&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    train_data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; gdata&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;generate_sub_graphs&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;train_parts&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cluster_number&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cluster_number&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;可以看到，在单卡上每 Epoch 都需要在这张大图 &lt;code class=&quot;language-text&quot;&gt;gdata&lt;/code&gt; 中随机划分出多个部分，然后依此构建多个子图，组成训练样本。这种方式在单卡训练上没有问题，然后扩展到多卡并行会启动多个进程，每轮每个进程都会单独随机采样出训练样本，这使得无法使用 &lt;code class=&quot;language-text&quot;&gt;DistributedSampler&lt;/code&gt; 在多卡对训练样本进行划分。&lt;/p&gt;
&lt;p&gt;因此，索性不对训练样本进行划分，让每进程（或者说每张卡）单独完成一个 Epoch 的训练，然后再同步梯度。&lt;/p&gt;
&lt;p&gt;值得注意的是，这种方式虽然简单易执行，但实际效果上是增加了 Batch Size，因此相应的需要增大一些学习率以保证训练效果。另一方面，每个进程都需要从保存在内存里的大图中采样出子图样本，因此对集群的性能要求相应比较高。&lt;/p&gt;
&lt;h2 id=&quot;实验&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%AE%9E%E9%AA%8C&quot; aria-label=&quot;实验 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;实验&lt;/h2&gt;
&lt;p&gt;这里我们通过实验来验证并行训练的效果。&lt;/p&gt;
&lt;h3 id=&quot;数据集&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E9%9B%86&quot; aria-label=&quot;数据集 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;数据集&lt;/h3&gt;
&lt;p&gt;幻方AI的数据集仓库&lt;a href=&quot;https://doc.hfai.high-flyer.cn/api/datasets.html#hfai.datasets.OGB&quot;&gt;集成了 OGB 大规模图公开数据集&lt;/a&gt;，通过 3FS 高速存储加速图数据的读取。具体的使用方式如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;datasets &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; OGB

gdata &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; OGB&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data_name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;ogbn-proteins&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
gdata&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_data&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; epoch &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;epochs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# training model ...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;如上例代码，我们加载 hfai 数据仓库中的 &lt;code class=&quot;language-text&quot;&gt;ogbn-proteins&lt;/code&gt; 数据，将这个大图加载入内存。&lt;/p&gt;
&lt;h3 id=&quot;模型训练&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E8%AE%AD%E7%BB%83&quot; aria-label=&quot;模型训练 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型训练&lt;/h3&gt;
&lt;p&gt;我们测试“并行轮次”的方法，观察模型的收敛速度。首先我们测试单卡上，DeepGCNs 的收敛情况：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/b43c99bd3cc73034f6cbb50e99917b89/350de/result_1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 34.96932515337423%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAA7DAAAOwwHHb6hkAAABRklEQVQoz0WRWY7bMBAFfZbRlljcmk2JkhXZIzlz/yPVgNQg+SLQaBTrvb4FiTgfWOaZwQiNmRARkkZ+G0/jN/p00hslitCaRB9ftH5jtK7ubtvGcRxI8NxiVHwQtnVlsEpjZqIq06TcbaCVnV4POjuhGmmNVmAnT0brCSGwP3fO9xsJgds/w5wZTKSx+TJMl2Eb9grobfpvqEf9qAC9d/zZd47zxDvHLWrCh8hjXfllldbmyzD9GIYS+WDwGY2xmg7ppJMd40I1vIAHoUbWxOiFZcncrdTOyixFwXqhccsFcAUodCWyftKWyAXoPfu+c55vRH4iF5Oc5/p+uBWJ5QAB4zyNyRXQmVRn7RirXTG/G4dzjsfjwev1uiJrmhj9FXl0woddKLNyZRdi7XCYv+j8QlKpXQ7TXzo96n7p8Pl81qPkeeYbxqHdIvpnIXAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;result_1.png&quot;
        title=&quot;result_1.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/b43c99bd3cc73034f6cbb50e99917b89/a6d36/result_1.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/b43c99bd3cc73034f6cbb50e99917b89/222b7/result_1.png 163w,
https://hfai-static.high-flyer.cn/static/b43c99bd3cc73034f6cbb50e99917b89/ff46a/result_1.png 325w,
https://hfai-static.high-flyer.cn/static/b43c99bd3cc73034f6cbb50e99917b89/a6d36/result_1.png 650w,
https://hfai-static.high-flyer.cn/static/b43c99bd3cc73034f6cbb50e99917b89/e548f/result_1.png 975w,
https://hfai-static.high-flyer.cn/static/b43c99bd3cc73034f6cbb50e99917b89/350de/result_1.png 998w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;之后，我们将实验扩展到8卡并行，测试 DeepGCNs 的收敛：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/ba113dc72bed1ce648cd95ad67914545/46e51/result_2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 34.355828220858896%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAA7DAAAOwwHHb6hkAAABN0lEQVQoz02SWW7FIAxFs5ZmaBsGD5A5L6Td/55uhVOp/UAghI7PtWmIBT4QppzxGQRvLoOZbbnIaP2Mng90o0CY0fuMQQvauGH0BCLCeZ54vV52blQTIgn2bcMYkz1MOUNVEFjR8Ykhf6PzGTklDGHCkL/s3kWBiuC6Ltz3bQUbFkWIjGWeH2CYIaoQEXgSK1CNqllSsb2XE21Y4ALZu33fcRwHnHNo5NdwW1eMlC2iqprhf2DnxAx7l9DrhY52uMAWswKvq1ibGhGFI8WyzE/P+EQtUqNEYjMZKiCuEGF8hGRxey0Yo4JiwLptFrnOwYBjFAP6KGipArP1IxKZ8QPcIEx4D09fO7lsiDF4rOuKUgqmaXoiO0pYluUB8gOshvUH1Gg2hPBnWO0qcKQEooD9OFDuYoY/oTXcIJoapyYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;result_2.png&quot;
        title=&quot;result_2.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/ba113dc72bed1ce648cd95ad67914545/a6d36/result_2.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/ba113dc72bed1ce648cd95ad67914545/222b7/result_2.png 163w,
https://hfai-static.high-flyer.cn/static/ba113dc72bed1ce648cd95ad67914545/ff46a/result_2.png 325w,
https://hfai-static.high-flyer.cn/static/ba113dc72bed1ce648cd95ad67914545/a6d36/result_2.png 650w,
https://hfai-static.high-flyer.cn/static/ba113dc72bed1ce648cd95ad67914545/e548f/result_2.png 975w,
https://hfai-static.high-flyer.cn/static/ba113dc72bed1ce648cd95ad67914545/46e51/result_2.png 1003w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;从上面两次测试结果中可以看到，使用多卡训练下模型收敛的速度更快，因为在同一时间模型喂入了更多的子图数据，梯度同步获得的损失信息更多。这里需要注意，因为子图是通过随机采样出来的，因此在不同的进程中需要使用不同的随机算子，使得喂入的子图是不一样的。从实验可得，并行轮次可以有效提升训练效率，更快模型收敛，进而能直接节省训练的轮次，节省训练时间。&lt;/p&gt;
&lt;h2 id=&quot;体验总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%93%E9%AA%8C%E6%80%BB%E7%BB%93&quot; aria-label=&quot;体验总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;体验总结&lt;/h2&gt;
&lt;p&gt;综上，图神经网络的并行加速还是切实可行的。采用不同于常规分布式训练的方式，更多的计算资源可以被利用起以加速图神经网络的训练。&lt;/p&gt;
&lt;p&gt;综合体验打分如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;研究指数：★★★★&lt;/p&gt;
&lt;p&gt;该模型着眼的是图数据场景，具有很广泛的研究应用场景。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开源指数：★★★★★&lt;/p&gt;
&lt;p&gt;数据和代码都已开源，代码逻辑清晰可读性高。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;门槛指数：★★★&lt;/p&gt;
&lt;p&gt;数据规模中等，模型计算对算力的需求较高，需要多显卡并行加速训练。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通用指数：★★★★&lt;/p&gt;
&lt;p&gt;模型是通用的图神经网络模型，在很多图数据上都可以适配应用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;适配指数：★★★★★&lt;/p&gt;
&lt;p&gt;依赖简单，很容易与幻方AI的训练优化工具结合，提效明显。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;幻方 AI 紧跟 AI 研究的前沿浪潮，致力于用领先算力助力AI落地与价值创造，欢迎各方数据研究者与开发者们一同共建。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[萤火跑模型 | 多卡并行助力 BEVFormer 三小时全精度训练]]></title><description><![CDATA[感知系统是自动驾驶系统中不可或缺的部分，系统中包括许多视觉任务，例如目标检测分割、目标跟踪、语义和实例分割、车道线检测等等。感知系统通过对周围环境状态的准确估计，为预测、规划等下游任务提供重要的依据。其中如何利用车载环视相机采集到的多个视角图像，实现精准的 3D…]]></description><link>https://www.high-flyer.cn/blog/bevformer/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/bevformer/</guid><dc:creator><![CDATA[Freja]]></dc:creator><pubDate>Tue, 13 Sep 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;感知系统是自动驾驶系统中不可或缺的部分，系统中包括许多视觉任务，例如目标检测分割、目标跟踪、语义和实例分割、车道线检测等等。感知系统通过对周围环境状态的准确估计，为预测、规划等下游任务提供重要的依据。其中如何利用车载环视相机采集到的多个视角图像，实现精准的 3D 目标检测和分割是感知系统中最为基础且重要的任务。&lt;/p&gt;
&lt;p&gt;2021年9月特斯拉的 AI Day 上，Karpathy 展示了他们的纯视觉自动驾驶感知框架，核心是基于 Transformer 网络结构，在鸟瞰图（BEV，Bird’s eye view）视角下进行感知，紧随其后，学术界也逐渐涌现了基于 Transformer 和 BEV 的优秀工作，其中 BEVFormer 通过构建时空融合网络，在 nuScenes 和 Waymo 的检测比赛上都榜上有名，受到了诸多关注。&lt;/p&gt;
&lt;p&gt;然而，最近不少学者和开发者在复现优化 BEVFormer 模型时发现，&lt;strong&gt;当使用多显卡加速模型的训练时，随着并行 GPU 数的增加，训练最终的结果反而变差了&lt;/strong&gt;。这无疑对自动驾驶模型的产业落地造成了不少制约。&lt;/p&gt;
&lt;p&gt;幻方 AI 最近对 BEVFormer 进行了整理和优化，分析了其多显卡并行训练精度降低的原因。通过幻方自研的 &lt;a href=&quot;/blog/3fs&quot;&gt;3FS&lt;/a&gt;、&lt;a href=&quot;/blog/ffrecord&quot;&gt;FFRecord&lt;/a&gt; 对模型训练进行提速；利用 &lt;a href=&quot;/blog/autotune&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hfai.autotune&lt;/code&gt;&lt;/a&gt; 进行自动集群参数的搜索，最终在幻方萤火集群上&lt;strong&gt;耗时差不多三小时完成了 BEVFormer 的大规模多卡并行训练，并实现了最终精度的复现&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;本期文章将为大家详细描述我们的训练优化过程，为研究者和开发者们提供效率提升的思路。&lt;/p&gt;
&lt;p&gt;论文标题：BEVFormer: Learning Bird’s-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers&lt;/p&gt;
&lt;p&gt;原文地址：&lt;a href=&quot;https://arxiv.org/abs/2203.17270&quot;&gt;https://arxiv.org/abs/2203.17270&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;项目主页：&lt;a href=&quot;https://github.com/HFAiLab/BEVFormer&quot;&gt;https://github.com/HFAiLab/BEVFormer&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;bevformer-模型介绍&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#bevformer-%E6%A8%A1%E5%9E%8B%E4%BB%8B%E7%BB%8D&quot; aria-label=&quot;bevformer 模型介绍 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;BEVFormer 模型介绍&lt;/h2&gt;
&lt;p&gt;BEVFormer 模型基于可变形注意力机制，融合多视角相机到 BEV（Bird’s eye view）视角进行感知，适用于多种自动驾驶感知任务。该模型采用稀疏注意力机制提高了计算的效率，通过融合时空信息获得了更加准确的感知任务性能。BEVFormer 在 3 月份的 nuScenes 3D 目标检测任务上获得了第一名的成绩，mAP 和 NDS 两个指标均超过以往方法 3 个点以上。在 Waymo 组织的 Camera Track 比赛中，BEVFormer 模型同样获得了冠军。BEVFormer 模型整体架构如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/0634a2e0f42ec36dfed1fe183cbe87e3/133ae/bevformer.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 38.036809815950924%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsTAAALEwEAmpwYAAABq0lEQVQY0wXBW2+TUAAAYH79suzJBxNj1LgX44sxZmbOuSVuaVZrSy8gLbS0FNpS4HA9Bw6cK8fv0+IMgSiIQ69AqewlowRjTPJTvZ83CB2DoEZISME440JyUos2F1IQThhnWgo91laozt3oBCGMQLYLE8exl+Zsd46XWy9LAeGyaAVjPM+LMIxxhyuWEoY1RuExqtKylb0iXWe7vuGGw8X6919zsvSmy10cAykx58cCdk+6r+t/8rICFcYd0Q5h4UV0H7aUS8H5Zrtdue7UWIynurV2LMdJkkQpLiWmlFWwFqyhnOR1QRnVQFb+vPs1eBmjpuWce75vbzZz0xjpk4VlWY4dRVGvlFAKorosi6Iou7ZRSvV9r715/erb7ePnL1+vri5sxz0H+mx4PXr6+PL4bj68NkafkiSSXV26k/NqjJuadJ17yOeWe44z7cP7tzf3z9/vHi4vLxamyRsQzO47BCSFxr/ler3igpfn/XH6kPm2UopSPjYPxmJU11DLsvTH7c1g8IwQklK2TX0KfJBmIM13+7DBRKmeC8mkKioIAIjjCFalUkpK+R+ElayV3tCyUgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;BEVFormer 框架图&quot;
        title=&quot;图1 BEVFormer整体架构图&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/0634a2e0f42ec36dfed1fe183cbe87e3/a6d36/bevformer.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/0634a2e0f42ec36dfed1fe183cbe87e3/222b7/bevformer.png 163w,
https://hfai-static.high-flyer.cn/static/0634a2e0f42ec36dfed1fe183cbe87e3/ff46a/bevformer.png 325w,
https://hfai-static.high-flyer.cn/static/0634a2e0f42ec36dfed1fe183cbe87e3/a6d36/bevformer.png 650w,
https://hfai-static.high-flyer.cn/static/0634a2e0f42ec36dfed1fe183cbe87e3/e548f/bevformer.png 975w,
https://hfai-static.high-flyer.cn/static/0634a2e0f42ec36dfed1fe183cbe87e3/3c492/bevformer.png 1300w,
https://hfai-static.high-flyer.cn/static/0634a2e0f42ec36dfed1fe183cbe87e3/133ae/bevformer.png 1424w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BEVFormer 包括三个关键模块，第一个关键模块是 BEV 空间的查询向量（BEV Queries）。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;模型设计了 BEV 视角下的网格特征，初始时为每个网格生成查询向量，通过对时序信息和空间信息的查询，将时空特征聚合到 BEV 查询向量的特征中，该特征为 3D 目标检测和地图语义分割的多种自动驾驶感知任务提供了丰富的感知依据。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 603px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/f9050eef9b378f470662e5d33105f666/9128f/BEV-FV-small.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 30.67484662576687%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAAsTAAALEwEAmpwYAAABeUlEQVQY0wFuAZH+AJmy45ix4Zav3Y2n04KdynmUwHSOuXOLtW2Ern2VwWZwaCYrACw5ES88EiIzDBopCxglDx4pERgkDxcjCwCjve2euOiYseKRrduLp9SHos+EoMuDnsmCnMaYrtOKkZNcX1JhZF5hZlxncV5jal1aYFtbYFthZV9bXlwAvs3mt8rlscfmqcDipbzcoLbUnLLMma7Hlae8oK++rK2wk4+SnJeanpqbop2enpuckJCTmpiZmJSXlZGUAGdkXWdmYXh5eH+Cg4iLjoeLinp/dXJ3aWFmU2FoUpOUkY+OlJKSlZSUlpiXmY+MkJORlY+RlI2Pk46NkgBcWVZgXFlkYFxmYV1nY19xbmp+enR3cWZxbF57dWiCgnxbXVhgZF1mamFqcGVjaV9namNkZ2FkZmJjZWEAwsG/x8bFy8rJuLe2qqqpp6emwcHAysnJy8nI1dPRwcG8naGXo6eenqKUkJaIh4+BkpiOoKSdo6aeo6WenQ+/rvie4t4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;相机和 BEV 视角对比图&quot;
        title=&quot;相机和 BEV 视角对比图&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/f9050eef9b378f470662e5d33105f666/9128f/BEV-FV-small.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/f9050eef9b378f470662e5d33105f666/222b7/BEV-FV-small.png 163w,
https://hfai-static.high-flyer.cn/static/f9050eef9b378f470662e5d33105f666/ff46a/BEV-FV-small.png 325w,
https://hfai-static.high-flyer.cn/static/f9050eef9b378f470662e5d33105f666/9128f/BEV-FV-small.png 603w&quot;
        sizes=&quot;(max-width: 603px) 100vw, 603px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;为什么选择聚合到 BEV 视角？传感器的观测视角为相机视角，如上图左边图所示，自动驾驶汽车往往在车身装备多个摄像机，从而组成环视视角。BEV 视角相当于在车辆正上方 10-20 米的高度俯视进行观察，如上图右边图所示。&lt;/p&gt;
&lt;p&gt;相比相机视角，使用 BEV 视角有两个好处，首先下游的规划、决策等任务都需要在车辆所处的 3D 世界下进行，而相机视角是 2D 像素世界，两者存在维度不匹配的问题，因此将多传感器数据融合到 BEV 视角，更加有利于下游模块的执行。其次，不同的物体在 BEV 视角下没有变形问题、视觉遮挡问题、物体重叠问题等，能够使得模型集中于解决感知问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二个关键模块是空间交叉注意力模型（Spatial Cross-Attention）。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;BEVFormer 通过 Transformer 结构融合多个视角的图片特征。在每个时间刻，对于每个栅格的 BEV 查询向量，将其所在位置投影到像素平面获得参考点，在参考点周围进行加权特征采样后更新 BEV 查询向量，从而完成空间的特征聚合。&lt;/p&gt;
&lt;p&gt;该模块通过 Transformer 实现了从相机视角到 BEV 视角的特征图空间变化。特斯拉公布的方法是将每一个 BEV 查询向量，与各个视角下的所有特征计算注意力，密集的操作导致了过高的内存开销和计算复杂度。而 BEVFormer 通过将 BEV 视角位置投影到像素视角位置，进行对应位置的稀疏注意力计算，融合多视角的同时，大大降低了计算量和内存开销，与此同时，所学习到的注意力初始分布更加集中，梯度的有效性更高，有利于模型后续学习。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三个关键模块是时序自注意力模型（Temporal Self-Attention）。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;每一时刻的 BEV 特征都与上一时刻对齐后的 BEV 特征进行自注意力计算，以保证时序特征的动态更新。在自动驾驶感知任务中，时序信息能够弥补空间中发生的观测限制，并且提供感知所需要的运动信息。具体而言，首先时序信息是空间信息的很好的补充，当物体重叠导致暂时的遮挡、物体过大导致只能获得部分观测时，模型可以融合前后的时序信息获得更好的特征表示，以更加准确的完成感知任务。此外，时序信息可以提供物体的运动状态，例如物体的运动速度、运动方向等等，来帮助预测、规划等下游任务更好的进行。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/0d4924bfb88a4ee2f7adcf3d20f472d3/e4611/bev_q.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 44.78527607361963%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAAsTAAALEwEAmpwYAAABfElEQVQoz3WRTW/TQBCG/f8vPXBBPSBx5FAOCFoHJf0MCtCWOpFQGqHWNQmKyYfb7HpmZ2a/kG2pEoc+p5H2HWn2eRPVstvttNZVVQGAiFjrmHm9Wv0uioc8n8/nYq33XkQAQLVh731iWxBRRJjZWhtjfKy2P64ux1k2nowvzs9PBv3JJJtOp8zsfSAmJgohJLFFRLohhBBjPDo87KXpcHT15u27Xv/s7PR4f//1wfsDQNOEmZ1vYgkzE7NSiplDC4n/fn3TG5x++Jju7b36dPT58jobfv2Wz5c1WQP6/iKdfemrapUIMypdlmWNQMIaka0L3hqtDNS+pfmOE2RBQ8rIz2F6OxqAfkqYiACogTVqw4bIIGIxuykXdwg6xOC8M4ydME32ftRb5zPXna3rBhExjGJZ12q72/7KjpdlDoQshgR98DFG55yuYTGb/F0UxJKEEABAa92p6uQh4eN2iVg/i3ymDTftNlX9/9TsG6L1av2neNhsNl1zL/EPfPL3dM51Z/IAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;时空融合示意图&quot;
        title=&quot;时空融合示意图&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/0d4924bfb88a4ee2f7adcf3d20f472d3/a6d36/bev_q.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/0d4924bfb88a4ee2f7adcf3d20f472d3/222b7/bev_q.png 163w,
https://hfai-static.high-flyer.cn/static/0d4924bfb88a4ee2f7adcf3d20f472d3/ff46a/bev_q.png 325w,
https://hfai-static.high-flyer.cn/static/0d4924bfb88a4ee2f7adcf3d20f472d3/a6d36/bev_q.png 650w,
https://hfai-static.high-flyer.cn/static/0d4924bfb88a4ee2f7adcf3d20f472d3/e548f/bev_q.png 975w,
https://hfai-static.high-flyer.cn/static/0d4924bfb88a4ee2f7adcf3d20f472d3/e4611/bev_q.png 1298w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，最左边初始化了 BEV 视角下的栅格图，对于每一个位置，初始化一个 BEV 查询向量。BEV 查询向量一方面通过空间交叉注意力机制将多视角空间特征进行聚合（图中蓝色箭头），另一方面通过时序自注意力机制将历史的时序特征融合到当前时刻（图中绿色箭头），最终获得融合时空特征的 BEV 查询向量，组合得到可以支持下游任务的 BEV 视角特征。&lt;/p&gt;
&lt;h2 id=&quot;bevformer-实验介绍&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#bevformer-%E5%AE%9E%E9%AA%8C%E4%BB%8B%E7%BB%8D&quot; aria-label=&quot;bevformer 实验介绍 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;BEVFormer 实验介绍&lt;/h2&gt;
&lt;h3 id=&quot;数据集&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E9%9B%86&quot; aria-label=&quot;数据集 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;数据集&lt;/h3&gt;
&lt;p&gt;BEVFormer 使用 nuScenes 数据集进行试验，nuScenes 数据集是第一个提供自动汽车全套传感器数据的大型数据集，包括了 6 个相机、1 个激光雷达、5 个毫米波雷达、以及 GPS 和 IMU。与另一个常用的自动驾驶领域 KITTI 数据集相比，其包含的对象注释多了 7 倍多，nuScenes 自动驾驶数据集因其数据的质量、规模与难度都比之前数据集有大幅提升，而获得了很多研究者的关注。&lt;/p&gt;
&lt;h3 id=&quot;检测指标&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A3%80%E6%B5%8B%E6%8C%87%E6%A0%87&quot; aria-label=&quot;检测指标 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;检测指标&lt;/h3&gt;
&lt;p&gt;BEVFormer 在 nuScenes 数据集的 上获得了 0.517 的 NDS（nuScenes detection score）、0.416 的 mAP（mean average precision）。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/e1177871235211703aee6d7a8e8cd267/1f083/nuscenes_score.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 20.245398773006134%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAw0lEQVQI1x3IwW6EIBAAUP//y9aiS9dEGGZGtspA0xVsTdRwbNrTS15jjQELa34xsTEGEcdxdA7AAv4B1lrvJ2PMxGzGkYgAHCJaaxtGQu++r1xrPY6z1srMpZRlCRLCPM8Swrq+EPE/l33fU0qfKTFPDQAQ4/rzdZzHdV61Vu/9tm3P50cUWZY5xphzJqJSiohspUiQnLOINJ3q2tttGIaUUowxpaS1RnRt+3bv+06pvr8zkXMOHb5rba1RShHR4zH8Ah350RZncjvrAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;BEVFormer 在 nuScenes 数据集上的指标列表图&quot;
        title=&quot;BEVFormer 在 nuScenes 数据集上的指标列表图&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/e1177871235211703aee6d7a8e8cd267/a6d36/nuscenes_score.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/e1177871235211703aee6d7a8e8cd267/222b7/nuscenes_score.png 163w,
https://hfai-static.high-flyer.cn/static/e1177871235211703aee6d7a8e8cd267/ff46a/nuscenes_score.png 325w,
https://hfai-static.high-flyer.cn/static/e1177871235211703aee6d7a8e8cd267/a6d36/nuscenes_score.png 650w,
https://hfai-static.high-flyer.cn/static/e1177871235211703aee6d7a8e8cd267/1f083/nuscenes_score.png 660w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;训练时间&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AE%AD%E7%BB%83%E6%97%B6%E9%97%B4&quot; aria-label=&quot;训练时间 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;训练时间&lt;/h3&gt;
&lt;p&gt;BEVFormer Base 模型需要每张 GPU 上 28G 的显存，在单张 A100 上训练完成（24 个 epoch）需要大约 14 天的时间，在 8 张 A100 上训练完成需要接近 2 天的时间。&lt;/p&gt;
&lt;p&gt;高昂的训练时间成本，阻碍了科研者和开发者在模型改进的快速迭代。因此幻方 AI 将 BEVFormer 适配到幻方萤火集群，帮助使用者快速有效的进行实验迭代。&lt;/p&gt;
&lt;h2 id=&quot;bevformer-萤火训练&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#bevformer-%E8%90%A4%E7%81%AB%E8%AE%AD%E7%BB%83&quot; aria-label=&quot;bevformer 萤火训练 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;BEVFormer 萤火训练&lt;/h2&gt;
&lt;h3 id=&quot;训练时间对比&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AE%AD%E7%BB%83%E6%97%B6%E9%97%B4%E5%AF%B9%E6%AF%94&quot; aria-label=&quot;训练时间对比 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;训练时间对比&lt;/h3&gt;
&lt;p&gt;我们首先保持默认参数，只通过增加并行 GPU 数（相当于增大 batch size），进行模型训练时间和模型性能的对比，结果如下面表格所示。从表格中可以看出，随着并行 GPU 数量的增加，训练 24 个 epoch 的时间逐渐缩短，从最长 14 天 20 小时缩短到 3 小时 12 分中。表格中 &lt;code class=&quot;language-text&quot;&gt;~&lt;/code&gt; 符号代表估算时间，即通过单次迭代的时间对总训练时间进行估算。另外，单卡的训练由于时间过长，只进行时间估算，未统计性能。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;模型&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;并行 GPU 数量&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;训练耗时&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;NDS&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;mAP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;BEVFormer Base&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;1&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;~ 14 天 20 小时&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;-&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;BEVFormer Base&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;8&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;~ 44 小时 24 分&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0.517&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0.416&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;BEVFormer Base&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;80&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;6 小时 28 分&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0.460&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0.365&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;BEVFormer Base&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;160&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;3 小时 30 分&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0.385&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0.337&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;增加-gpu-数量速度变快但性能下降&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%A2%9E%E5%8A%A0-gpu-%E6%95%B0%E9%87%8F%E9%80%9F%E5%BA%A6%E5%8F%98%E5%BF%AB%E4%BD%86%E6%80%A7%E8%83%BD%E4%B8%8B%E9%99%8D&quot; aria-label=&quot;增加 gpu 数量速度变快但性能下降 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;增加 GPU 数量，速度变快但性能下降？&lt;/h3&gt;
&lt;p&gt;从上面表格结果可以看出，在相同的参数训练下，随着并行 GPU 数量的增加（相当于 batch size 增大），训练时间越来越短。但是与此同时，随着并行数量的增加，最终训练出的模型性能越来越差，如下图的变化曲线所示。当我们使用 160 张卡进行训练时，训练模型最终的 NDS 和 mAP 指标与 8 卡时大约相差 15 个点。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/bcbcef9b37ff972fe01ba37dc8670053/2bef9/default.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 33.74233128834356%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA30lEQVQY002PC47DMAhEc/97Vmqjyk5twHzNrlNlN08IITTD2BsQNGrMbGqqKiIsXD/1/X5HhIgexzjX/7Q2Xq99jLF16J6OimTk0/PEw5lZRD+fA9GJ8k5Eiqx7GyJm5pzTwrp0Nr4UMcYopZz5CZBz5qn89qmqlznn10NKpCsoPACg1uoemamava9+nb6Z74jL+oK7iBzH4e5/ryVaZXaZW2vurqpmtgZbAzGVXswMEUXEzFQtItydWXu3WoVZNlWlEwB4PB6lFEREQACYJ8z8Fez7/nw+EZEIe++/yT9UQJiaAOWhggAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;默认参数性能指标变化曲线图&quot;
        title=&quot;默认参数性能指标变化曲线图&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/bcbcef9b37ff972fe01ba37dc8670053/a6d36/default.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/bcbcef9b37ff972fe01ba37dc8670053/222b7/default.png 163w,
https://hfai-static.high-flyer.cn/static/bcbcef9b37ff972fe01ba37dc8670053/ff46a/default.png 325w,
https://hfai-static.high-flyer.cn/static/bcbcef9b37ff972fe01ba37dc8670053/a6d36/default.png 650w,
https://hfai-static.high-flyer.cn/static/bcbcef9b37ff972fe01ba37dc8670053/e548f/default.png 975w,
https://hfai-static.high-flyer.cn/static/bcbcef9b37ff972fe01ba37dc8670053/2bef9/default.png 1024w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么增加并行 GPU 数（相当于增大 batch size），会导致训练结果变差呢？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们探究后发现：这是因为深度学习网络的损失函数是非凸函数，基于凸优化理论的优化算法容易收敛到局部最优解。而当我们增大 &lt;code class=&quot;language-text&quot;&gt;batch size&lt;/code&gt;，梯度下降的方向更加确定，随机性更小，更容易收敛到附近的局部最优解，而无法达到全局最优解。&lt;/p&gt;
&lt;h3 id=&quot;如何增加并行的同时保持性能&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%A6%82%E4%BD%95%E5%A2%9E%E5%8A%A0%E5%B9%B6%E8%A1%8C%E7%9A%84%E5%90%8C%E6%97%B6%E4%BF%9D%E6%8C%81%E6%80%A7%E8%83%BD&quot; aria-label=&quot;如何增加并行的同时保持性能 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;如何增加并行的同时保持性能？&lt;/h3&gt;
&lt;p&gt;随着 &lt;code class=&quot;language-text&quot;&gt;batch size&lt;/code&gt; 的增大，样本梯度的方差会同比减小，梯度方向更确定，如果要保持增大 &lt;code class=&quot;language-text&quot;&gt;batch size&lt;/code&gt; 之前的梯度方差，我们可以选择增加学习率。&lt;/p&gt;
&lt;p&gt;增加学习率有两方面好处，一方面可以提高收敛速率，因为大 &lt;code class=&quot;language-text&quot;&gt;batch size&lt;/code&gt; 下，梯度估计更准，增大学习率可以加快模型收敛到最优解。另一方面有助于帮助模型逃出局部最优解，增大学习率可以增大下降步幅，使得模型有机会逃出局部最优解，从而收敛到更好的最优解。&lt;/p&gt;
&lt;p&gt;那么如何调整到合适的学习率呢？以往针对大 &lt;code class=&quot;language-text&quot;&gt;batch size&lt;/code&gt; 的研究提出了下面两种缩放学习率的方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sqrt 缩放：Krizhevsky 等人 [1] 提出，当 &lt;code class=&quot;language-text&quot;&gt;batch size&lt;/code&gt; 增大 &lt;code class=&quot;language-text&quot;&gt;k&lt;/code&gt; 倍时，学习率应该增大 &lt;code class=&quot;language-text&quot;&gt;sqrt(k)&lt;/code&gt; 倍。&lt;/li&gt;
&lt;li&gt;线性缩放：Goyal 等人[2] 提出了更简单的线性缩放规则，他们认为当 &lt;code class=&quot;language-text&quot;&gt;minibatch&lt;/code&gt; 大小乘以 &lt;code class=&quot;language-text&quot;&gt;k&lt;/code&gt; 时，将学习率乘以 &lt;code class=&quot;language-text&quot;&gt;k&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们从实验中发现，按照上述原则调整学习率确实消除了小批量和大批量之间的部分性能差距，但是调整后的模型性能，与小 &lt;code class=&quot;language-text&quot;&gt;batch size&lt;/code&gt; 的性能还相差甚大。&lt;/p&gt;
&lt;p&gt;为什么会有这样的现象呢？文献 [3] 指出，随着 &lt;code class=&quot;language-text&quot;&gt;batch size&lt;/code&gt; 变得越来越大，得到最佳测试结果所能允许的学习率范围越来越小。也就是说，当 &lt;code class=&quot;language-text&quot;&gt;batch size&lt;/code&gt; 比较小时，轻微改变学习率对于模型最终的性能影响不大，因此我们可以很容易的找到合适的学习率。但是当 &lt;code class=&quot;language-text&quot;&gt;batch size&lt;/code&gt; 变大，轻微的学习率变化对最终训练的模型性能影响也随之变大，因此我们需要不断的精细化查找，才能找到合适的参数，这为我们分布式并行训练带来了挑战。&lt;/p&gt;
&lt;h2 id=&quot;hfai-优化工具实践&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hfai-%E4%BC%98%E5%8C%96%E5%B7%A5%E5%85%B7%E5%AE%9E%E8%B7%B5&quot; aria-label=&quot;hfai 优化工具实践 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;HFai 优化工具实践&lt;/h2&gt;
&lt;p&gt;为了获得更高的训练精度和更快的训练速度，我们使用幻方 AI 的 Autotune 和 FFRecord 两个工具对训练过程进行优化。&lt;/p&gt;
&lt;h3 id=&quot;autotune-自动搜索集群最佳参数&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#autotune-%E8%87%AA%E5%8A%A8%E6%90%9C%E7%B4%A2%E9%9B%86%E7%BE%A4%E6%9C%80%E4%BD%B3%E5%8F%82%E6%95%B0&quot; aria-label=&quot;autotune 自动搜索集群最佳参数 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Autotune: 自动搜索集群最佳参数&lt;/h3&gt;
&lt;p&gt;Autotune 是幻方 AI 针对萤火集群训练平台设计的自动调参工具，可以根据用户设定好的参数范围自动发起集群训练，并统计不同参数下的模型表现。使用时只只需要增加几行代码，就可以使用 Autotune 进行简单的高效的大规模参数调优。&lt;/p&gt;
&lt;p&gt;在 BEVFormer 的训练中，Autotune 很好的解决了前面所提到的大规模并行训练时面临的精细化调参的挑战。根据学习率的 sqrt 缩放原则 [1] 和线性缩放原则 [2]，我们可以大致确定在使用上百张GPU进行训练时应该使用的学习率的大致范围，通过 Autotune 我们可以发起多个训练任务来同时对指定范围内的参数进行搜索，快速筛选出最好的参数组合。如下图所示，使用 Autotune 我们可以一键发起数个调参任务：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/3c3f6e24a1ba43efb06c45f7f828bd08/6f464/autotune_tasks.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 69.32515337423312%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABJ0AAASdAHeZh94AAABi0lEQVQ4y6WT647bIBCF/f5P1zeIuu6uEmXthJkBG2xyqjMOVlrvqj+KNAJj+Dhz6/q3n+j7HqfTCefzGf8z4lzRXcOMeZ6RUsI0TSilHCwnRQgBwzBiHEdfXz9HfPzqcb/0uAeBiKK/BHSXIUBEkHN28LIsB1PZztButxuGccT1c8DH+zvCeIWaQVURTdHFJNAQEGNylTFGmJnPNAILrRSs64qVD6j64zElzLm4u4/HA2ut6NSBd4iqH2xK2prKCSIgl7IpNvPw8GGKaEAOBwqBLxDGSJ/gBiGwNKCqA/mf+w1I6zTpHqN/KWxA7qc07a4fgKbyJZDutNgR/LdCM3XwAcjsNIjqUR0hr0D++x44GaKZ15H5vAGZdV72zK4Ezrta2RXaVwqfWSZIxA8tzzKpdcucK3zJckvGFsP8J1BigEnY3WRJ0D3Gj5cbkIC6FFfbgHT5ACxLRslb+xFUa917s7nYOuZmjOOm1lsy5/3RHfhdoxPEemSsct56+sebQFN2lfxuxdxmFvZvDKtCvQLEXB8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;任务截图&quot;
        title=&quot;任务截图&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/3c3f6e24a1ba43efb06c45f7f828bd08/a6d36/autotune_tasks.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/3c3f6e24a1ba43efb06c45f7f828bd08/222b7/autotune_tasks.png 163w,
https://hfai-static.high-flyer.cn/static/3c3f6e24a1ba43efb06c45f7f828bd08/ff46a/autotune_tasks.png 325w,
https://hfai-static.high-flyer.cn/static/3c3f6e24a1ba43efb06c45f7f828bd08/a6d36/autotune_tasks.png 650w,
https://hfai-static.high-flyer.cn/static/3c3f6e24a1ba43efb06c45f7f828bd08/e548f/autotune_tasks.png 975w,
https://hfai-static.high-flyer.cn/static/3c3f6e24a1ba43efb06c45f7f828bd08/3c492/autotune_tasks.png 1300w,
https://hfai-static.high-flyer.cn/static/3c3f6e24a1ba43efb06c45f7f828bd08/6f464/autotune_tasks.png 1464w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;这样只需要和正常发起一次训练一样的工作量和等待时间，我们就可以得到调参结果。而在使用 Autotune 完成训练后，我们同样可以简单的查看各参数训练结果的排序，便于筛选最优参数：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/7bdfd7f1b10933bb933c37bd9f1865cb/8ea22/autotune_result.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 49.69325153374233%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABJ0AAASdAHeZh94AAAA8ElEQVQoz32SWw6FIAxE2f8iFd9v0BVwc5oMQa/xY9JS6HTa4uq6TlVVpXEc0zzPf1iW5XaepsnA+77vDXDIOhG2bWtBWSV47y0mUGDf97RtWxqGwe6bpjELj+u6Lj/G5xIifBJIPo7DgB9jTOd5GlBKHsqV73AgkTIqcSFSgNoSahmQR+EbYdnquq43RbSGfQPEz45cWQHwkHZoTe3JL9tVyxDSMjYrRDoBgCKRfBGDp8JMWC5FBXiMcqCNE3sjlAV5y1qEKkKiuWgkxJktZCEEe8Mdc9diTSF/Uf8NX0Sc+VsqShIzvq7LgDLyIFb+DyKI4tbwXiVtAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;结果统计&quot;
        title=&quot;结果统计&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/7bdfd7f1b10933bb933c37bd9f1865cb/a6d36/autotune_result.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/7bdfd7f1b10933bb933c37bd9f1865cb/222b7/autotune_result.png 163w,
https://hfai-static.high-flyer.cn/static/7bdfd7f1b10933bb933c37bd9f1865cb/ff46a/autotune_result.png 325w,
https://hfai-static.high-flyer.cn/static/7bdfd7f1b10933bb933c37bd9f1865cb/a6d36/autotune_result.png 650w,
https://hfai-static.high-flyer.cn/static/7bdfd7f1b10933bb933c37bd9f1865cb/e548f/autotune_result.png 975w,
https://hfai-static.high-flyer.cn/static/7bdfd7f1b10933bb933c37bd9f1865cb/8ea22/autotune_result.png 1023w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;从上图可见，在使用 160 张 GPU 训练 BEVFormer 时，我们找到的最优参数组合是：&lt;code class=&quot;language-text&quot;&gt;lr&lt;/code&gt; 为 &lt;code class=&quot;language-text&quot;&gt;1e-3&lt;/code&gt;、&lt;code class=&quot;language-text&quot;&gt;warmup_iters&lt;/code&gt; 为 &lt;code class=&quot;language-text&quot;&gt;600&lt;/code&gt;、&lt;code class=&quot;language-text&quot;&gt;min_lr_ratio&lt;/code&gt; 为 &lt;code class=&quot;language-text&quot;&gt;1e-4&lt;/code&gt;， 在这组参数下我们取得了 0.490 的 NDS 和 0.389 的 mAP 指标，相比默认参数增加并行的结果，NDS 提高了 0.115，相比 8 张 GPU 时也仅仅下降了 0.027，但训练时间缩短了 14 倍。&lt;/p&gt;
&lt;h3 id=&quot;ffrecord加速数据读取&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ffrecord%E5%8A%A0%E9%80%9F%E6%95%B0%E6%8D%AE%E8%AF%BB%E5%8F%96&quot; aria-label=&quot;ffrecord加速数据读取 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;FFRecord：加速数据读取&lt;/h3&gt;
&lt;p&gt;前面的文章我们介绍了幻方高性能数据格式 &lt;a href=&quot;/blog/ffrecord&quot;&gt;FFRecord&lt;/a&gt;，使用 FFRecord 格式我们可以获得更快的数据读取速度。针对 mmlab 系列开源仓库，我们提供了 &lt;a href=&quot;https://github.com/HFAiLab/ffrecord_converters&quot;&gt;mmconverter&lt;/a&gt;，用户可以通过简单的三步将 mmlab 代码中使用的数据格式转化为 FFRecord 数据格式，达到适配幻方集群文件系统和提高训练速度的目的。&lt;/p&gt;
&lt;p&gt;如下表所示，使用 FFRecord 格式后，不同并行数量任务都获得了一定的性能提升，最终 3 小时就可以完成 BEVFormer 的训练。表格中 &lt;code class=&quot;language-text&quot;&gt;~&lt;/code&gt; 符号代表估算时间，即通过单次迭代的时间对总训练时间进行估算。另外，单卡的训练由于时间过长，只进行时间估算，未统计性能。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;模型&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;并行 GPU 数量&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;训练耗时&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;训练耗时（FFRecord）&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;NDS&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;mAP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;BEVFormer Base&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;1&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;~ 14 天 20 小时&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;~ 13 天 12 小时&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;-&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;BEVFormer Base&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;8&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;~ 44 小时 24 分&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;~ 39 小时 12 分&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0.517&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0.416&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;BEVFormer Base&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;80&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;6 小时 28 分&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;6 小时&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0.498&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0.391&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;BEVFormer Base&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;160&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;3 小时 12 分&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;3 小时 10 分&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0.490&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0.389&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;下面曲线将使用默认参数的性能曲线与使用 Autotune 搜索到的最佳参数进行了对比。可以看到，使用 Autotune 找到的最佳参数，随着并行数量的增加，性能下降更加平缓，从 1 张 GPU 增加到 160 张 GPU，NDS 和 mAP 都只下降了 0.027，相比默认参数的下降幅度有了很大的提升。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/5dd3211c1904e972356dbd24ea4f7779/44a54/autotune.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 33.12883435582822%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA80lEQVQY01VQ2YoEMQjs///PYYYO3ebQeMTEJT3Lwha+WIcFHne+L7yQUVVZWFRY+YLrPE8zcx8pdUT7wxiGqJ/PCXAftVadWqSQkU41N3ZONaU7mVlrtTUBiN7DPeaMiGCO66ql1B2OiLkmDyajuR79YVQVAERkrWht51V/xz16lwMRI2LFighzQ0V13cxazJwzqO51zkAMkVjrezxE5GitxX/wYB485zSzUoqI/Ekiu/9L7HDO2d2fTwx3H2MMG8QEbXf2B5t7DHNuJ6IBWM50mNnXQUTv9zulRESEVGt194hQVSJiZgB4vV611t4JsbVGPxNPlqn4LkBeAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;性能变化曲线对比图&quot;
        title=&quot;性能变化曲线对比图&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/5dd3211c1904e972356dbd24ea4f7779/a6d36/autotune.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/5dd3211c1904e972356dbd24ea4f7779/222b7/autotune.png 163w,
https://hfai-static.high-flyer.cn/static/5dd3211c1904e972356dbd24ea4f7779/ff46a/autotune.png 325w,
https://hfai-static.high-flyer.cn/static/5dd3211c1904e972356dbd24ea4f7779/a6d36/autotune.png 650w,
https://hfai-static.high-flyer.cn/static/5dd3211c1904e972356dbd24ea4f7779/e548f/autotune.png 975w,
https://hfai-static.high-flyer.cn/static/5dd3211c1904e972356dbd24ea4f7779/44a54/autotune.png 1017w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;看到这里的你有没有遇到过模型训练久、实验效率低的问题呢？快来申请幻方助力科研的免费 GPU 资源，使用幻方一系列深度学习训练神器，提升你的训练体验吧！&lt;/p&gt;
&lt;h2 id=&quot;参考文献&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE&quot; aria-label=&quot;参考文献 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;参考文献&lt;/h2&gt;
&lt;p&gt;[1] Krizhevsky, Alex. “One weird trick for parallelizing convolutional neural networks.” arXiv preprint arXiv:1404.5997 (2014).&lt;/p&gt;
&lt;p&gt;[2] Goyal, Priya, et al. “Accurate, large minibatch sgd: Training imagenet in 1 hour.” arXiv preprint arXiv:1706.02677 (2017).&lt;/p&gt;
&lt;p&gt;[3] Breuel, Thomas M. “The effects of hyperparameters on SGD training of neural networks.” arXiv preprint arXiv:1508.02788 (2015).&lt;/p&gt;
&lt;p&gt;[4] 代季峰对话张祥雨 | 自动驾驶感知新时代！新一代环视感知算法BEVFormer有哪些优势。&lt;a href=&quot;https://hub.baai.ac.cn/view/19213&quot;&gt;https://hub.baai.ac.cn/view/19213&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[hfai.autotune | 一行代码，自动调参]]></title><description><![CDATA[调参是深度学习中的必经过程，研究者们往往需要花费大量的时间进行调参，以获取最好效果的模型参数。对于参数规模不大的小模型，手工运行实验进行参数调优还是可以接受的方法，但当遇上大模型时，只凭人工进行参数优化就会变得难以实操，也难以高效利用GPU…]]></description><link>https://www.high-flyer.cn/blog/autotune/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/autotune/</guid><dc:creator><![CDATA[Daylight]]></dc:creator><pubDate>Mon, 05 Sep 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;调参是深度学习中的必经过程，研究者们往往需要花费大量的时间进行调参，以获取最好效果的模型参数。对于参数规模不大的小模型，手工运行实验进行参数调优还是可以接受的方法，但当遇上大模型时，只凭人工进行参数优化就会变得难以实操，也难以高效利用GPU集群的强大算力。&lt;/p&gt;
&lt;p&gt;为了解决这一问题，幻方 AI 基于萤火集群的特性，研发了一套辅助调参工具，Autotune。用户只需要设定好参数搜索范围，在幻方萤火集群上发起训练，Autotune 会自动帮您尝试所有的参数组合，合理分配算力进行测试，最后统计输出不同参数下的模型表现。&lt;/p&gt;
&lt;h2 id=&quot;设计思路&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AE%BE%E8%AE%A1%E6%80%9D%E8%B7%AF&quot; aria-label=&quot;设计思路 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;设计思路&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;hfai.autotune&lt;/code&gt; 旨在降低调参门槛，改动少部分代码即可实现自动调参。&lt;/p&gt;
&lt;p&gt;萤火集群可以通过 hfai 命令或在 JupyterLab 中手动发起的方式来提交训练任务，然而这些方法并不能支持大批量的任务发起。因此在 Autotune 的设计中我们选择 &lt;a href=&quot;https://doc.hfai.high-flyer.cn/api/client.html#hfai.client.create_experiment_v2&quot;&gt;create_experiment_v2&lt;/a&gt; 接口，实现一次提交多任务的目标。&lt;/p&gt;
&lt;p&gt;用户在使用时设定需要测试的参数组或直接指定参数范围，Autotune 将需要调优的参数进行组合进行网格搜索。这里需要创建多个可以同时训练的任务，在算力允许的范围内运行尽可能多的任务以加速调参过程。&lt;/p&gt;
&lt;p&gt;不同任务的训练结果会集中记录在一个日志文件夹中，统计输出时会从这个文件夹中读取所有参数的结果，进行排序后返回。&lt;/p&gt;
&lt;h2 id=&quot;任务发起&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BB%BB%E5%8A%A1%E5%8F%91%E8%B5%B7&quot; aria-label=&quot;任务发起 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;任务发起&lt;/h2&gt;
&lt;p&gt;介绍完 &lt;code class=&quot;language-text&quot;&gt;hfai.autotune&lt;/code&gt; 的设计思路之后，那么其如何使用呢？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;只需要加入一行 Python 代码即可&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hfai.autotune.run(config, args, log_dir)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这里必备的三个参数是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;config&lt;/code&gt;: 萤火集群训练任务的基本配置文件，参考&lt;a href=&quot;https://doc.hfai.high-flyer.cn/api/client.html?highlight=create#hfai.client.create_experiment_v2&quot;&gt;配置文件格式&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;args&lt;/code&gt;: 调参参数，在代码中指定。&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;log_dir&lt;/code&gt;: 记录训练结果的文件夹，在代码中指定。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;接下来就可以开始调参优化了。具体的，有两种主要的参数搜索模式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;发起固定参数搜索任务&lt;/li&gt;
&lt;li&gt;发起参数网格搜索任务&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;发起固定参数搜索任务&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%8F%91%E8%B5%B7%E5%9B%BA%E5%AE%9A%E5%8F%82%E6%95%B0%E6%90%9C%E7%B4%A2%E4%BB%BB%E5%8A%A1&quot; aria-label=&quot;发起固定参数搜索任务 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;发起固定参数搜索任务&lt;/h3&gt;
&lt;p&gt;输入参数为列表形式，每个列表内的元素是包含了超参数的一个字典，如下例所示：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; hfai
args &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;lr&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bs&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;256&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;lr&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bs&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;autotune&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;run&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; log_dir&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;此时，Autotune 会分别使用args列表中的两组参数发起两个调参任务。&lt;/p&gt;
&lt;h3 id=&quot;发起参数网格搜索任务&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%8F%91%E8%B5%B7%E5%8F%82%E6%95%B0%E7%BD%91%E6%A0%BC%E6%90%9C%E7%B4%A2%E4%BB%BB%E5%8A%A1&quot; aria-label=&quot;发起参数网格搜索任务 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;发起参数网格搜索任务&lt;/h3&gt;
&lt;p&gt;输入参数为字典形式，每个超参数通过指定其搜索范围来发起任务。&lt;/p&gt;
&lt;p&gt;每个参数的输入可以有两种形式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对应一个三元组表示参数搜索的起始值，终止值以及搜索步长&lt;/li&gt;
&lt;li&gt;对应一个列表表示参数所有可能的取值&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如下例所示：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; hfai
args &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;lr&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.002&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.006&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.001&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bs&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;320&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;autotune&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;run_grid_search&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; log_dir&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

args &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;lr&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.002&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.003&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.004&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.005&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bs&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;128&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;192&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;256&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;autotune&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;run_grid_search&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; log_dir&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;此时，Autotune 会分别遍历args中的 &lt;code class=&quot;language-text&quot;&gt;lr&lt;/code&gt; 和 &lt;code class=&quot;language-text&quot;&gt;bs&lt;/code&gt; 两个参数的所有取值，并将其组合成最终搜索的参数组。例如在这里 &lt;code class=&quot;language-text&quot;&gt;lr&lt;/code&gt; 共有4个不同取值，而 &lt;code class=&quot;language-text&quot;&gt;bs&lt;/code&gt; 也有4个不同取值，那么就会发起总共 &lt;code class=&quot;language-text&quot;&gt;4 x 4 = 16&lt;/code&gt; 个使用不同 &lt;code class=&quot;language-text&quot;&gt;lr&lt;/code&gt; 和 &lt;code class=&quot;language-text&quot;&gt;bs&lt;/code&gt; 组合的调参任务。&lt;/p&gt;
&lt;h2 id=&quot;本地调试&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%9C%AC%E5%9C%B0%E8%B0%83%E8%AF%95&quot; aria-label=&quot;本地调试 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;本地调试&lt;/h2&gt;
&lt;p&gt;为了方便用户在本地进行代码调试，Autotune 提供了&lt;strong&gt;一键调试模式&lt;/strong&gt;，&lt;code class=&quot;language-text&quot;&gt;set_debug_mode&lt;/code&gt;，方便用户在本地运行代码，测试无误后再发至集群进行大规模搜参。使用案例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; hfai
hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;autotune&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_debug_mode&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
args &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;lr&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.002&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.006&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.001&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bs&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;320&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;autotune&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;run&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; log_dir&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;在本地调试一组任务时，Autotune 只会使用所有参数组中的&lt;strong&gt;任意一组参数&lt;/strong&gt;发起单个训练任务。默认情况下，Autotune 在非调试模式下运行。&lt;/p&gt;
&lt;h2 id=&quot;训练代码改动&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AE%AD%E7%BB%83%E4%BB%A3%E7%A0%81%E6%94%B9%E5%8A%A8&quot; aria-label=&quot;训练代码改动 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;训练代码改动&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;hfai.autotune&lt;/code&gt; 通过尽量少的训练代码改动来支持自动调参功能。在训练代码中只需要在每次训练开始之前调用 Autotune 提供的 &lt;code class=&quot;language-text&quot;&gt;get_args&lt;/code&gt; 接口来获取任务使用的参数组合，将参数应用到训练配置中就可以进行训练。在训练完成后，同样只需要调用提供的 &lt;code class=&quot;language-text&quot;&gt;report&lt;/code&gt; 方法就可以将模型测试结果汇报并记录。&lt;/p&gt;
&lt;p&gt;如下例所示：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; hfai
args &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;autotune&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_args&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
lr&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; batch_size &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;lr&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;bs&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# ...&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# training codes&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# ...&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# finish training&lt;/span&gt;

metrics &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;prec&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.81&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;recall&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.79&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;loss&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.15&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;autotune&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;report&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;metrics&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;结果统计&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E7%BB%93%E6%9E%9C%E7%BB%9F%E8%AE%A1&quot; aria-label=&quot;结果统计 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;结果统计&lt;/h2&gt;
&lt;p&gt;训练结束后，Autotune 会对每个参数训练得到的结果进行汇总统计，按照指定的方式对指标进行排序，返回表现优秀的实验。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; hfai
hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;autotune&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;show_result&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;log_dir&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; metric&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;acc&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;下图展示了某任务的调参训练结果：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/84e395df7afdb63e458cd4adf7caaea4/909c7/show_result.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 98.15950920245399%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAMCAQf/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAH0TcqGHAsEgf/EABgQAAIDAAAAAAAAAAAAAAAAAAABEBEg/9oACAEBAAEFAkipWf/EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQMBAT8BH//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQIBAT8BH//EABQQAQAAAAAAAAAAAAAAAAAAADD/2gAIAQEABj8CH//EABkQAQADAQEAAAAAAAAAAAAAAAEQESEAUf/aAAgBAQABPyFG67HW+sBBybyP/9oADAMBAAIAAwAAABAwCAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAcEAEAAgMBAQEAAAAAAAAAAAABABEhMVFxQeH/2gAIAQEAAT8QYCr7mDC1n38loc+wFWi9yxFk6TYeQUWuxV9agYJ//9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;结果截图&quot;
        title=&quot;结果截图&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/84e395df7afdb63e458cd4adf7caaea4/6aca1/show_result.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/84e395df7afdb63e458cd4adf7caaea4/d2f63/show_result.jpg 163w,
https://hfai-static.high-flyer.cn/static/84e395df7afdb63e458cd4adf7caaea4/c989d/show_result.jpg 325w,
https://hfai-static.high-flyer.cn/static/84e395df7afdb63e458cd4adf7caaea4/6aca1/show_result.jpg 650w,
https://hfai-static.high-flyer.cn/static/84e395df7afdb63e458cd4adf7caaea4/7c09c/show_result.jpg 975w,
https://hfai-static.high-flyer.cn/static/84e395df7afdb63e458cd4adf7caaea4/909c7/show_result.jpg 1041w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[hfai.nn.CPUOffload | 模型训练的显存节省利器]]></title><description><![CDATA[在深度学习模型的训练中，研究者与开发者们尝尝会碰到显存不足的问题 (OOM, out of memory…]]></description><link>https://www.high-flyer.cn/blog/cpuoffload/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/cpuoffload/</guid><dc:creator><![CDATA[Freja]]></dc:creator><pubDate>Wed, 31 Aug 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在深度学习模型的训练中，研究者与开发者们尝尝会碰到显存不足的问题 (OOM, out of memory) ，比如模型参数规模大，或者训练过程中产生的额外开销大，又或者是程序代码的问题，没有足够的显存资源，对我们科研与开发产生了诸多限制。&lt;/p&gt;
&lt;p&gt;以往，我们通过代码优化、梯度累计、半精度等等一系列方法，以降低深度学习模型训练的显存需求，然而随着模型参数规模的发展，业务数据越来越复杂，显存需求快速增长，那么除了这些 trick 之外，还有什么既简单、又高效的显存节省方法吗？本期文章介绍的主角， &lt;code class=&quot;language-text&quot;&gt;hfai.nn.CPUOffload&lt;/code&gt;，给您提供一条不一样的显存节省之路。&lt;/p&gt;
&lt;p&gt;那么 &lt;code class=&quot;language-text&quot;&gt;hfai.nn.CPUOffload&lt;/code&gt; 为什么可以节省显存？如何使用？它和 PyTorch 原始版本有何不同？本期文章将为大家分享 CPUOffload 设计背后的故事，讲述幻方 AI 设计 CPUOffload 的理念，展现 CPUOffload 的性能和便捷。&lt;/p&gt;
&lt;h2 id=&quot;概述&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A6%82%E8%BF%B0&quot; aria-label=&quot;概述 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;概述&lt;/h2&gt;
&lt;p&gt;训练模型的过程中，显存占用主要包括如下三部分&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;权重矩阵&lt;/li&gt;
&lt;li&gt;前向传播的中间向量&lt;/li&gt;
&lt;li&gt;反向传播的梯度矩阵&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我们以 ResNet50 网络在输入尺寸为（256，3，224，224）时的计算过程作为示例，分析上述三个部分的显存占用。通过 &lt;code class=&quot;language-text&quot;&gt;hfai.utils.profile_memory&lt;/code&gt; 工具，我们可以很容易的获得模型各部分的细节，如下图所示（由于网络层数较多，只展示部分网络）：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/d0265db6c11b1adcd1d6073ddc6c4f56/6f278/profile_memory.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 57.668711656441715%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsTAAALEwEAmpwYAAABd0lEQVQoz52Sy5LcIAxF/f9/OJWFzUMgHo3BSLTbdpcnNkkvprLKXVCA6khXggEMPFtj4v/Q8Ovry+iJqP4IEP073+eeiAZjDKCZy0xEtVb6q9YaM/f1x6ZHW2vDnBJVSinN88XHGL335VbPwszLrefzSUTLsrxer1LKBeec930nIufctm2tNUTMOQshcs5EZIyx1iJiSimEYIxZ1zWEkFIanHPnebbWpml63wKAWus0TaWUfd+llEopRIy3jDG11lJKjPHqucNCiA9MROM4dlNaa6WUc67DPbosy+PxGBDx/X4z86ey1pqIhBCllG3bAEAp5b2PMXbbrbVa6wUDQD8AwHmex3EIIXqueZ67ESllrxxCsNb2QV62pZS1Xo+cUjrPc9/3aZqYeRzHfmOtlVIiovc+hAAA/ZH/9Lyua59Qt22MYWalVM75OA64hYjhllKKmWutF4yIfWBSyg4jIjMDQCnlOA5rLQA450II3nutdf8tv3v+Bq2aolkjQRbUAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;profile memory&quot;
        title=&quot;profile memory&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/d0265db6c11b1adcd1d6073ddc6c4f56/a6d36/profile_memory.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/d0265db6c11b1adcd1d6073ddc6c4f56/222b7/profile_memory.png 163w,
https://hfai-static.high-flyer.cn/static/d0265db6c11b1adcd1d6073ddc6c4f56/ff46a/profile_memory.png 325w,
https://hfai-static.high-flyer.cn/static/d0265db6c11b1adcd1d6073ddc6c4f56/a6d36/profile_memory.png 650w,
https://hfai-static.high-flyer.cn/static/d0265db6c11b1adcd1d6073ddc6c4f56/e548f/profile_memory.png 975w,
https://hfai-static.high-flyer.cn/static/d0265db6c11b1adcd1d6073ddc6c4f56/3c492/profile_memory.png 1300w,
https://hfai-static.high-flyer.cn/static/d0265db6c11b1adcd1d6073ddc6c4f56/6f278/profile_memory.png 1488w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/cc8f6588a826430328c80352643912da/0f586/sum.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 7.361963190184048%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAABCAIAAABR8BlyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIklEQVQI12N48+bNCzB4/fr127dvf6KCX0gAwoWL//z5EwDIaDmUavzhowAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;sum&quot;
        title=&quot;sum&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/cc8f6588a826430328c80352643912da/a6d36/sum.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/cc8f6588a826430328c80352643912da/222b7/sum.png 163w,
https://hfai-static.high-flyer.cn/static/cc8f6588a826430328c80352643912da/ff46a/sum.png 325w,
https://hfai-static.high-flyer.cn/static/cc8f6588a826430328c80352643912da/a6d36/sum.png 650w,
https://hfai-static.high-flyer.cn/static/cc8f6588a826430328c80352643912da/e548f/sum.png 975w,
https://hfai-static.high-flyer.cn/static/cc8f6588a826430328c80352643912da/3c492/sum.png 1300w,
https://hfai-static.high-flyer.cn/static/cc8f6588a826430328c80352643912da/0f586/sum.png 1498w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;每一行为一个 &lt;code class=&quot;language-text&quot;&gt;nn.Module&lt;/code&gt; 类型网络的详情信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;module name&lt;/code&gt;：&lt;code class=&quot;language-text&quot;&gt;nn.Module&lt;/code&gt; 类型网络的名称&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;type&lt;/code&gt;：网络的类型&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;parameter size&lt;/code&gt;: 网络参数量&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;activation size&lt;/code&gt;: 中间变量的 tesnor 大小（不包括参数）&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;#calls&lt;/code&gt;：被调用的次数&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;input shape&lt;/code&gt;：输入的 tensor 形状&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;output shape&lt;/code&gt;：输出的 tensor 形状&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;peak mem&lt;/code&gt;：峰值显存，forward 过程中的峰值显存减去 forward 之前已经占用的显存&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;forward time&lt;/code&gt;：网络 forward 的时间，如果多次调用，则时间累加&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后三行统计了模型的参数总量、中间变量总量、单次迭代前向传播的时间。从上图可以看到 ResNet50 在批大小为 256 时，参数总量为 97 MiB，中间变量为 20974 MiB，中间变量占比较大。而反向传播由于需要保存权重矩阵的梯度和中间变量的梯度，往往需要前向传播的 2 倍或更多的显存空间。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果我们要减少整体显存占用，不考虑模型的分开存放，有如下两种思路&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一种思路是使用更小的模型&lt;/strong&gt;。当数据量小的时候，我们可以使用更小的模型进行拟合；但当数据量大、分布广时，我们需要使用更大的模型，以达到更好的拟合效果。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二种思路是减小中间变量的显存占用。网络前向传播产生中间变量，反向传播使用中间变量，因此我们可以在中间变量没有被使用的时间，将其移到 CPU 上，以减少显存占用，这个过程我们称之为 CPUOffload。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;cpuoffload-原理&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#cpuoffload-%E5%8E%9F%E7%90%86&quot; aria-label=&quot;cpuoffload 原理 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;CPUOffload 原理&lt;/h2&gt;
&lt;p&gt;中间变量在 PyTorch 中被称为 &lt;a href=&quot;https://pytorch.org/tutorials/intermediate/autograd_saved_tensors_hooks_tutorial.html#:~:text=Saved%20tensors%20hooks,tensors%20should%20be%20packed%20%2F%20unpacked.&amp;#x26;text=The%20pack_hook%20function%20will%20be,instead%20of%20the%20original%20tensor.&quot;&gt;save tensor&lt;/a&gt;, 我们通过 &lt;code class=&quot;language-text&quot;&gt;torch.autograd.graph.saved_tensors_hooks&lt;/code&gt; 钩子可以在中间变量产生时（前向传播过程中）对其进行打包（pack），在中间变量被使用时（反向传播过程中）对其进行解包（unpack）。一个简单的使用例子如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pack_hook&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;device&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cpu&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;unpack_hook&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;packed&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    device&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; tensor &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; packed
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; tensor&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;device&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;randn&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; requires_grad&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;autograd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;graph&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;saved_tensors_hooks&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pack&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; unpack&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    y &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; x

y&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;backward&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;allclose&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;grad&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;上面的代码是在中间变量产生时，将中间变量移动到 CPU 上，在需要使用中间变量时移动到 GPU 上，从 GPU 移动到 CPU 的过程为 Host2Device（H2D），从 CPU 移动到 GPU 的过程为 Device2Host（D2H）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://hfai-static.high-flyer.cn/ab40bec15d83acf3149006236782bd36/GPU2CPU.gif&quot; alt=&quot;&quot; title=&quot;H2D&quot;&gt;
&lt;img src=&quot;https://hfai-static.high-flyer.cn/c2e9db09155a951580fedd1bedb64de4/CPU2GPU.gif&quot; alt=&quot;&quot; title=&quot;D2H&quot;&gt;&lt;/p&gt;
&lt;p&gt;PyTorch 提供了 &lt;a href=&quot;https://github.com/pytorch/pytorch/blob/master/torch/autograd/graph.py#L76&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;torch.autograd.graph.save_on_cpu&lt;/code&gt;&lt;/a&gt; 同样实现了此功能。我们可以很方便的对模型中的某些中间变量进行 CPUOffload，一个简单的使用例子如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;TorchCPUOffload&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Module&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; module&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token builtin&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;__init__&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;module &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; module

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;forward&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;**&lt;/span&gt;kwargs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;autograd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;graph&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;save_on_cpu&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pin_memory&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;module&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;**&lt;/span&gt;kwargs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; nn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Sequential&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    nn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Linear&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    TorchCPUOffload&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Linear&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    nn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Linear&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;randn&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
loss &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
loss&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;backward&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;上面的代码定义了一个包括三层全连接层的网络，通过 &lt;code class=&quot;language-text&quot;&gt;torch.autograd.graph.save_on_cpu&lt;/code&gt; 的方法，第二层全连接层所产生的中间变量，会在不用时移动到 CPU 中，以减少显存占用。&lt;/p&gt;
&lt;h2 id=&quot;pytorch-cpuoffload-分析&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pytorch-cpuoffload-%E5%88%86%E6%9E%90&quot; aria-label=&quot;pytorch cpuoffload 分析 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;PyTorch CPUOffload 分析&lt;/h2&gt;
&lt;p&gt;如上述所述，我们可以实现中间变量的 CPUOffload，但在实际优化测试过程中，我们发现如下问题：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一个问题是 &lt;code class=&quot;language-text&quot;&gt;torch.autograd.graph.save_on_cpu&lt;/code&gt; 无法自定义 CPUOffload 比例&lt;/strong&gt;，进入该环境的模型所产生的中间变量，只能全部 CPUOffload。如果想要细粒度的控制 CPUOffload 的比例，则需要开发者自己计算模型各层的中间变量占比，并在代码中增加对应的钩子，以达到按比例 CPUOffload，实现起来较为复杂。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二个问题是 &lt;code class=&quot;language-text&quot;&gt;torch.autograd.graph.save_on_cpu&lt;/code&gt; 速度慢&lt;/strong&gt;，CPUOffload 是以时间换取显存，但是使用 pytorch 默认的版本，显存节省的成本过高。我们以 ResNet50 为例进行速度和显存的测试，具体数据如下表格所示，可以看到在节省百分之十的显存时，模型训练速度慢了将近一倍。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;模型&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;CPUOffload 比例&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;100 个 iter 耗时&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;显存峰值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;ResNet50&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;32.339 s&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;22.4 G&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;ResNet50&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0.1&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;57.461 s&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;20.3 G&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;ResNet50&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0.5&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;165.153 s&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;11.8 G&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;ResNet50&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;1&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;297.812 s&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;4.4 G&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;（以上实验在 python3.6、 torch1.10.0+cu113 环境下完成）&lt;/p&gt;
&lt;h2 id=&quot;hfainncpuoffload-使用方法&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hfainncpuoffload-%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95&quot; aria-label=&quot;hfainncpuoffload 使用方法 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;hfai.nn.CPUOffload&lt;/code&gt; 使用方法&lt;/h2&gt;
&lt;p&gt;为了解决如上的问题，幻方研发设计了 &lt;code class=&quot;language-text&quot;&gt;hfai.nn.CPUOffload&lt;/code&gt;，与 pytorch &lt;code class=&quot;language-text&quot;&gt;torch.autograd.graph.save_on_cpu&lt;/code&gt; 的上述问题对应，&lt;code class=&quot;language-text&quot;&gt;hfai.nn.CPUOffload&lt;/code&gt; 进行了如下优化：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;首先，&lt;code class=&quot;language-text&quot;&gt;hfai.nn.CPUOffload&lt;/code&gt; 提供了 &lt;code class=&quot;language-text&quot;&gt;offload_ratio&lt;/code&gt; 参数，自动将对应比例的中间变量进行 CPUOffload，使得开发者可以进行更加灵活的选择和更加简单的开发。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;另外 &lt;code class=&quot;language-text&quot;&gt;hfai.nn.CPUOffload&lt;/code&gt; 通过使用独立的 &lt;code class=&quot;language-text&quot;&gt;torch.cuda.Stream&lt;/code&gt; 进行 H2D 和 D2H，使得整体速度有了较大提升。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;以 ResNet50 为例子，这里为大家展示 &lt;code class=&quot;language-text&quot;&gt;hfai.nn.CPUOffload&lt;/code&gt; 的使用方法和性能。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nn &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; CPUOffload
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; torchvision

model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; torchvision&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;models&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;resnet50&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
x &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;randn&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;256&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;244&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;224&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; CPUOffload&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;offload_ratio&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; tag&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;resnet&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    out &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;hfai.nn.CPUOffload&lt;/code&gt; 的使用十分简单，在上面的代码中，通过简单的一行代码，即可实现将特定比例的中间变量进行 CPUOffload，其中 &lt;code class=&quot;language-text&quot;&gt;offload_ratio&lt;/code&gt; 指定了 CPUOffload 的比例，&lt;code class=&quot;language-text&quot;&gt;tag&lt;/code&gt; 标签标识了当前 CPUOffload 的模型名称。&lt;/p&gt;
&lt;p&gt;另外 &lt;code class=&quot;language-text&quot;&gt;hfai.nn.CPUOffload&lt;/code&gt; 的使用十分灵活，我们可以通过不同的标签来进行不同模型的 CPUOffload；在不同的迭代中，我们也可以为相同的模型选择不同的 CPUOffload 比例。&lt;/p&gt;
&lt;h2 id=&quot;hfainncpuoffload-性能对比&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hfainncpuoffload-%E6%80%A7%E8%83%BD%E5%AF%B9%E6%AF%94&quot; aria-label=&quot;hfainncpuoffload 性能对比 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;code class=&quot;language-text&quot;&gt;hfai.nn.CPUOffload&lt;/code&gt; 性能对比&lt;/h2&gt;
&lt;p&gt;我们将 &lt;code class=&quot;language-text&quot;&gt;hfai.nn.CPUOffload&lt;/code&gt; 与 &lt;code class=&quot;language-text&quot;&gt;torch.autograd.graph.save_on_cpu&lt;/code&gt; 在相同模型和相同输入的情况下进行了比较，比较结果如下表所示，可以看到在不同的 &lt;code class=&quot;language-text&quot;&gt;offload_ratio&lt;/code&gt; 下，&lt;code class=&quot;language-text&quot;&gt;hfai.nn.CPUOffload&lt;/code&gt; 的训练时间都比 &lt;code class=&quot;language-text&quot;&gt;torch.autograd.graph.save_on_cpu&lt;/code&gt; 更快。在更低的 &lt;code class=&quot;language-text&quot;&gt;offload_ratio&lt;/code&gt; 下，&lt;code class=&quot;language-text&quot;&gt;hfai.nn.CPUOffload&lt;/code&gt; 的独立 &lt;code class=&quot;language-text&quot;&gt;Stream&lt;/code&gt; 能够保证计算过程和 tensor 移动拥有更好的并行性，因此加速更加明显，在 &lt;code class=&quot;language-text&quot;&gt;offload_ratio&lt;/code&gt; 为 0.1 时达到了 43.0% 的提速。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;center&quot;&gt;模型&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;Offload 比例&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;显存峰值&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;100 个 iter 耗时 (pytorch)&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;100 个 iter 耗时 (hfai)&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;提速比例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;ResNet50&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;22.4 G&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;32.339 s&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;32.339 s&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;ResNet50&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0.1&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;20.3 G&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;57.461 s&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;32.727 s&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;43.0%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;ResNet50&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;0.5&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;11.8 G&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;165.153 s&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;136.115 s&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;16.6%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;center&quot;&gt;ResNet50&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;1&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;4.4 G&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;297.812 s&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;266.686 s&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;10.4%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;看到这里，您是不是也跃跃欲试了呢？我们欢迎广大研究者和开发者安装体验 &lt;a href=&quot;https://doc.hfai.high-flyer.cn/start/install.html&quot;&gt;hfai&lt;/a&gt;，来试用这一深度学习训练神器！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[hfai datasets | 运转数据入萤火训练的不二法门]]></title><description><![CDATA[幻方 AI 发布了其沉淀多年的深度学习套件 hfai ，吸引了众多同行研究员和开发者们咨询试用。整个套件的功能较多，而熟悉掌握了这套规则，是能够轻松地调用起平台的算力资源，从而高效完成训练任务的。 为此，我们专门创建了 “hfai 使用心法” 系列专辑，陆续为大家介绍 hfai…]]></description><link>https://www.high-flyer.cn/blog/hfai_datasets/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/hfai_datasets/</guid><dc:creator><![CDATA[High-Flyer]]></dc:creator><pubDate>Mon, 29 Aug 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;幻方 AI 发布了其沉淀多年的&lt;a href=&quot;/blog/hfai_usage&quot;&gt;深度学习套件 hfai&lt;/a&gt; ，吸引了众多同行研究员和开发者们咨询试用。整个套件的功能较多，而熟悉掌握了这套规则，是能够轻松地调用起平台的算力资源，从而高效完成训练任务的。&lt;/p&gt;
&lt;p&gt;为此，我们专门创建了 “hfai 使用心法” 系列专辑，陆续为大家介绍 hfai 一些功能的设计思路和原理，帮助大家更好更快地习得心法，带着 hfai 这套“神功”游刃有余的应对深度学习作业的各项挑战，举重若轻、例不虚发。&lt;/p&gt;
&lt;p&gt;之前的文章为大家介绍了如何上传项目代码，构建运行环境和执行任务，一切准备就绪，就差训练数据了。对于大规模的训练数据，上传、管理和部署都是不小的挑战，幻方 AI 研发提供了一套专门为数据集量身定制的“神功”，帮助大家更好的运行大规模的数据，训练出惊艳的模型。&lt;/p&gt;
&lt;h2 id=&quot;studio-数据管理页&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#studio-%E6%95%B0%E6%8D%AE%E7%AE%A1%E7%90%86%E9%A1%B5&quot; aria-label=&quot;studio 数据管理页 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Studio 数据管理页&lt;/h2&gt;
&lt;p&gt;在萤火集群上的训练数据集，我们都可以通过 &lt;a href=&quot;https://studio.yinghuo.high-flyer.cn/#/datasets&quot;&gt;Studio 数据管理页&lt;/a&gt; 进行浏览与使用。如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/83801a5481d15f0ceec2956680811083/1d8ab/studio.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.44171779141104%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAwb/xAAWAQEBAQAAAAAAAAAAAAAAAAACAAH/2gAMAwEAAhADEAAAAeH0RWaCQy//xAAZEAADAQEBAAAAAAAAAAAAAAABAgNCMTL/2gAIAQEAAQUCzBzKlaGr4HW9f//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABoQAQACAwEAAAAAAAAAAAAAAAEAAhARYhL/2gAIAQEABj8ChapVejcbW8jyahn/xAAaEAEAAgMBAAAAAAAAAAAAAAABADERIZFh/9oACAEBAAE/ISr5AKDWDPGD/QwR4QlRDtP/2gAMAwEAAgADAAAAEAA//8QAFxEAAwEAAAAAAAAAAAAAAAAAABEhMf/aAAgBAwEBPxDROn//xAAWEQEBAQAAAAAAAAAAAAAAAAAAESH/2gAIAQIBAT8QWY//xAAbEAEAAgMBAQAAAAAAAAAAAAABACERMaFBkf/aAAgBAQABPxAK5HINX9gLqRYNXUxCHShYGqJxzsgOU9n/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;studio&quot;
        title=&quot;studio&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/83801a5481d15f0ceec2956680811083/6aca1/studio.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/83801a5481d15f0ceec2956680811083/d2f63/studio.jpg 163w,
https://hfai-static.high-flyer.cn/static/83801a5481d15f0ceec2956680811083/c989d/studio.jpg 325w,
https://hfai-static.high-flyer.cn/static/83801a5481d15f0ceec2956680811083/6aca1/studio.jpg 650w,
https://hfai-static.high-flyer.cn/static/83801a5481d15f0ceec2956680811083/7c09c/studio.jpg 975w,
https://hfai-static.high-flyer.cn/static/83801a5481d15f0ceec2956680811083/01ab0/studio.jpg 1300w,
https://hfai-static.high-flyer.cn/static/83801a5481d15f0ceec2956680811083/1d8ab/studio.jpg 1627w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;可以看到，幻方 AI 收纳整理了数十种常用的大规模公开数据集，并持续更新中。如果您所需要的数据集在其中，通过 &lt;a href=&quot;https://doc.hfai.high-flyer.cn/api/datasets.html&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hfai.datasets&lt;/code&gt;&lt;/a&gt; 方法就可以轻松获取高性能存储支持下的训练数据，进行快速训练。&lt;/p&gt;
&lt;p&gt;当然，这些数据不可能满足所有的研究场景。如果您需要上传您自己的数据，可以点击 &lt;code class=&quot;language-text&quot;&gt;创建私有数据集&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 597px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/e77f8894d1cfbad51a8ed9d929300ce0/17602/create_self.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 28.834355828220858%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABGklEQVQY05WRy06DYBCFeQq1ltpybYFSaLmWHyjQIqap8QXcuDBuXPj+m8+AwcS4MC5OTmYyc2bOjGQ4W6r2TF61KIbDdGEiK8t/o+/rIXmh4O39g+eXVxTT4WqqcC2r3My0XxjzI0/u9G++nRuDsCSbLpsgI0wrItEQi5qieSARR6KsJtxXJKIhyY+UzZldUiLqjqQ4sktLgv0BUd2zcoNBVGotl7hsEeWJJK/ZFw2pqNmlfWE3DEmLE1FWUbcX6vaRvOrYxjmKuUZbbdAtj7luf1neaCsUO8ZJL9hxh5s9oToJk5mGH+XDtodh4wrHj35YHNHH4+2liWqxWHqYXo6+Tln6JaoVIC9MLC/CCzP8MMPxIgzb//Mxn/HotxfONAqgAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;create self&quot;
        title=&quot;create self&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/e77f8894d1cfbad51a8ed9d929300ce0/17602/create_self.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/e77f8894d1cfbad51a8ed9d929300ce0/222b7/create_self.png 163w,
https://hfai-static.high-flyer.cn/static/e77f8894d1cfbad51a8ed9d929300ce0/ff46a/create_self.png 325w,
https://hfai-static.high-flyer.cn/static/e77f8894d1cfbad51a8ed9d929300ce0/17602/create_self.png 597w&quot;
        sizes=&quot;(max-width: 597px) 100vw, 597px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;私有数据集&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E7%A7%81%E6%9C%89%E6%95%B0%E6%8D%AE%E9%9B%86&quot; aria-label=&quot;私有数据集 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;私有数据集&lt;/h2&gt;
&lt;p&gt;私有数据集在幻方萤火集群中进行账号级的隔离，您的数据只有您的账号下可以进行访问。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;上传的数据需要满足如下条件&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;每个文件不小于 256MB （512 x 512KB）&lt;/li&gt;
&lt;li&gt;满足条件1的情况下，文件数量尽可能大于100，小于200&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;这里需要特别注意的是，大量的小文件构成的数据集会对集群存储性能造成严重影响&lt;/strong&gt;，因此，如果您的数据是这种大量的小文件，我们建议您将数据转化为幻方 AI 自研的 &lt;a href=&quot;/blog/ffrecord&quot;&gt;FFRecord&lt;/a&gt; 数据格式。&lt;/p&gt;
&lt;h3 id=&quot;为什么要转换为-ffrecord-&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E8%BD%AC%E6%8D%A2%E4%B8%BA-ffrecord-&quot; aria-label=&quot;为什么要转换为 ffrecord  permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;为什么要转换为 FFRecord ?&lt;/h3&gt;
&lt;p&gt;幻方 AI 自研了一套适合深度学习模型训练场景的文件读写系统 &lt;a href=&quot;/blog/3fs&quot;&gt;3FS&lt;/a&gt;，和一般的文件系统不同，3FS 文件系统有如下的一些特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大量打开、关闭小文件的开销比较大&lt;/li&gt;
&lt;li&gt;支持高吞吐的随机批量读取&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;FFRecord 能够充分利用 3FS 文件系统的高效读取性能，其包括如下优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;合并多个小文件，减少了训练时打开大量小文件的开销，对存储后端更加友好&lt;/li&gt;
&lt;li&gt;支持随机批量读取，提升读取速度&lt;/li&gt;
&lt;li&gt;包含数据校验，保证读取的数据完整可靠&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此，我们建议用户将训练数据尽可能都转换成 FFRecord 格式，以利用萤火集群的高性能存储，获得极致的训练加速体验。转换指引和案例代码可以阅读&lt;a href=&quot;https://github.com/HFAiLab/ffrecord_converters&quot;&gt;这里&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id=&quot;数据上传&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E4%B8%8A%E4%BC%A0&quot; aria-label=&quot;数据上传 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;数据上传&lt;/h3&gt;
&lt;p&gt;用户上传数据的完整流程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;a href=&quot;https://studio.yinghuo.high-flyer.cn/#/datasets&quot;&gt;Studio&lt;/a&gt; 中点击 &lt;strong&gt;【创建私有数据集】&lt;/strong&gt;，填写数据信息；&lt;/li&gt;
&lt;li&gt;幻方管理员沟通，审核数据内容；&lt;/li&gt;
&lt;li&gt;审核通过，点击 &lt;strong&gt;【更新授权】&lt;/strong&gt; 获取上传 token;&lt;/li&gt;
&lt;li&gt;使用&lt;a href=&quot;https://help.aliyun.com/document_detail/120075.html&quot;&gt;阿里云OSS工具&lt;/a&gt;，通过授权的token，将符合条件的数据上传；&lt;/li&gt;
&lt;li&gt;幻方管理员审核，数据流转到萤火集群；&lt;/li&gt;
&lt;li&gt;数据在萤火集群准备好后，用户可以在&lt;a href=&quot;https://studio.yinghuo.high-flyer.cn/#/datasets&quot;&gt;Studio&lt;/a&gt; 中获得数据在集群中的地址&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;更详细的操作请阅读 Studio 中的&lt;a href=&quot;https://studio.yinghuo.high-flyer.cn/#/doc/private_dataset&quot;&gt;私有数据集创建指引&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/bf4666a281961f01caeefa25d4357872/4a8d4/private.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 77.30061349693251%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAIDBv/EABcBAAMBAAAAAAAAAAAAAAAAAAABAgP/2gAMAwEAAhADEAAAAcrKtpAI/8QAGBABAQEBAQAAAAAAAAAAAAAAAQIAEBH/2gAIAQEAAQUCqvdII6hOO//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABsQAAMBAAMBAAAAAAAAAAAAAAABESExQWFx/9oACAEBAAE/IXRdzvR5tviphxEKparyL60NXbT/2gAMAwEAAgADAAAAEMc//8QAFhEBAQEAAAAAAAAAAAAAAAAAARAx/9oACAEDAQE/EBHJ/8QAFhEBAQEAAAAAAAAAAAAAAAAAARAR/9oACAECAQE/EERxn//EABsQAQACAwEBAAAAAAAAAAAAAAEAESExUWGB/9oACAEBAAE/EM0YALKPrqNpIcKLXLgHRQ6VMIQQ8RoVU8WI6S6z/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;private&quot;
        title=&quot;private&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/bf4666a281961f01caeefa25d4357872/6aca1/private.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/bf4666a281961f01caeefa25d4357872/d2f63/private.jpg 163w,
https://hfai-static.high-flyer.cn/static/bf4666a281961f01caeefa25d4357872/c989d/private.jpg 325w,
https://hfai-static.high-flyer.cn/static/bf4666a281961f01caeefa25d4357872/6aca1/private.jpg 650w,
https://hfai-static.high-flyer.cn/static/bf4666a281961f01caeefa25d4357872/4a8d4/private.jpg 802w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;由上述过程描述中可以了解到，用户数据到萤火集群采用如下方式流转：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;用户端 —&gt; 阿里云对象存储 —&gt; 萤火集群&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;幻方 AI 采用特定的阿里云对象存储（OSS）进行用户数据上传的中转，其上传速度取决于用户自己的网络环境。萤火集群和 OSS 之间有专线连接，保证数据的快速流转。&lt;/p&gt;
&lt;p&gt;如果您的数据规模巨大，或网络条件有限，可以&lt;a href=&quot;https://mp.weixin.qq.com/s/1orFQWkCzxH1sGZa8twleQ&quot;&gt;联系幻方管理员&lt;/a&gt;采用其他方式来上传。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[hfai python | 任务提交任意所至，萤火训练行云流水]]></title><description><![CDATA[幻方 AI 发布了其沉淀多年的深度学习套件 hfai ，吸引了众多同行研究员和开发者们咨询试用。整个套件的功能较多，而熟悉掌握了这套规则，是能够轻松地调用起平台的算力资源，从而高效完成训练任务的。 为此，我们专门创建了 “hfai…]]></description><link>https://www.high-flyer.cn/blog/hfai_python/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/hfai_python/</guid><dc:creator><![CDATA[High-Flyer]]></dc:creator><pubDate>Fri, 19 Aug 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;幻方 AI 发布了其沉淀多年的&lt;a href=&quot;/blog/hfai_usage&quot;&gt;深度学习套件 hfai&lt;/a&gt; ，吸引了众多同行研究员和开发者们咨询试用。整个套件的功能较多，而熟悉掌握了这套规则，是能够轻松地调用起平台的算力资源，从而高效完成训练任务的。&lt;/p&gt;
&lt;p&gt;为此，我们专门创建了 “hfai 使用心法” 系列专辑，分集陆续为大家介绍 hfai 一些功能的设计思路和原理，帮助大家更好更快地习得心法，带着 hfai 这套“神功”游刃有余的应对深度学习作业的各项挑战，举重若轻、例不虚发。&lt;/p&gt;
&lt;p&gt;上两个招式为大家介绍了 &lt;a href=&quot;/blog/hfai_workspace&quot;&gt;hfai workspace&lt;/a&gt; 和 &lt;a href=&quot;/blog/hfai_venv&quot;&gt;haienv&lt;/a&gt;，其可以帮助用户快速&lt;strong&gt;同步本地（个人电脑、个人集群等）工程目录（代码、数据），环境&lt;/strong&gt;到远程集群中。而这套组合拳下来，其实我们可以认为是“蓄力”和“提气”的过程，接下来就是“神功”最核心的部分，本次文章将为大家介绍 &lt;code class=&quot;language-text&quot;&gt;hfai python&lt;/code&gt;，其可以帮助大家&lt;strong&gt;方便快捷地发起、管理训练任务&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&quot;使用场景&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF&quot; aria-label=&quot;使用场景 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;使用场景&lt;/h2&gt;
&lt;p&gt;如&lt;a href=&quot;/blog/hfai_venv&quot;&gt;之前文章所介绍&lt;/a&gt;的，用户将本地的数据、代码、环境传到远程萤火集群之后，接下来就可以提交任务训练模型了。然而，如何将萤火集群的算力均匀合理的分配给不同任务，用户又如何查看管理自己的任务呢？&lt;/p&gt;
&lt;p&gt;这些功能都可以通过 &lt;code class=&quot;language-text&quot;&gt;hfai python&lt;/code&gt; 来实现。&lt;/p&gt;
&lt;h2 id=&quot;基本概念&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5&quot; aria-label=&quot;基本概念 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;基本概念&lt;/h2&gt;
&lt;p&gt;在使用之前，一些基本概念先介绍一下。&lt;/p&gt;
&lt;p&gt;幻方AI提出了&lt;strong&gt;任务级分时调度&lt;/strong&gt;的概念来管理萤火集群，&lt;strong&gt;算力的分配以任务为单位而不是用户&lt;/strong&gt;。用户可以自由地提交任务，自由地申请算力规模，由集群调度系统统一分配资源。如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/df50cdfcaa5b0f64df35a34b1d863593/0a47e/01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 89.57055214723925%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFfElEQVQ4yzWUe0xTdxTHDzCN29g0+8Ns0z0zZrJsUzHL5hKjbgGdGT5QUGZElIc6MgRkgPIQBAoI0fFogVJKSwuUV0GhQssbin3Q1+2T0sJte+9twWCii0YBd39LXfbfNyf5fvL9npwciIk5s+nCxYtbEUKwjDtCcOf8ycnxsU8AIBgANguGpiGpgh3CG56M7G0u+RQA3gKAN1V6M1jnHSAenoTgQID4hASIjY0FOJ+cGuCHXa9i77jbObCvTToRpsFMe2XjE6HTCvUerXXhG9b9yR/Lu6ThpS1de8taend3japCbU7Xt0aLNbRDItv8VcjnG+Pj49+PjY0Ngsspae86EILKzgecctEAYvYNP5XrTC+Nc45Vm8O5qtbr1/gS6YsSQc+zsvb7L5sGZKuSicnVNunYC7nehCZmlKcBIPCPlJTP4uLi3oDCwsJgf0KCIPiU14soknxFeNzI56WQF59D5uk2pJex0Jy6H5GLNuTAJpBmsApZNMPrXt8jhDvtp/z+8vKyt6OiogKguLjoNZAkPPxlnw8R89p13DhBmzE5rbGaaZN2hDYp+mgbNk3POedpfE5LW5W9tMeuWSO8S2hKZzzj96empX8QERERBFk3crb4B043wbe4SGTEyXUP5aVVToKuU+P0jNNLm9xLtMXto8ftBL2yvEw7yGVaZiPXrW4KNcgtMVaEIPNWafDRo0cDoJwr2ti7RIPC7mrma3HUMLv4Uj5PrOsWyTWOBl+TWt1rmgVizeoi1ybtnrWVJd9r3WFwvbC4KcRV2KLvOVbAH+rs2bMAQV+EBOpfIVDNu8XtmAc169xIuUAh3SKJOBocyWwepF0gkc1NoUk7gR4vL73WPUY3sv4HjJ1eRVDEbNp07NgxAHG/lN3RKY6UzWIXGsa0PdWjumbprJE363DVNc0usAfNeL1y3l2HOd2sYQteR3rcTIPDxerQL7L0DhePNab7HgCCLiQkfnTixIkgYJRV/FL5V+0ef2QAeAcA3vOfAeXGQOm0gfrJP2BdRWD8G0GtYgEkFgqEBgJuTjmBZyAg9zGCc1czNxw/cigoOjo6EPitnSeZtayvM5n8n1LuNGYnV7LTxZ31WabRxlT1CO+qSG1OasM8CdUTWEIYg58YzuAn/cxoSdzHaInfXyr4fV9e3U5ACKJrugIuX7kCMDajQXKFjpdW3379VpuEyhX0Y6ODLcvWce5z7SjvqWjW7Gg1kdbqYZ09Mr125WRa7ZNDWfXenQU80+4CHrUrl30+tOkhHCwQBh7wdxyeUv2KabAvM+rbcvP4vXPZ3B7lyFCr0y4XUobJVneHxqIVGEkFZ0KnLbrNJErKa70ZlWxnZFWbIqqqdS6ysjkmuVoE/oUx/ECLeR5EUzq4I5EX3R1S2u5I1UoOl+nq5t5+JGis9LbMGPQ8jFSLZzHMNsWjHPJmSiXlUt0izqK4g/OkS8SJOw6wkbVl88dl/scxasY3CG1LIDLghf12n6PPvqyurf7TWXMrxvtXcayneUqp5xu9qi6VzqCUsEhMVku1cFne06ks4lxG3fOYtJqEbQhBxfaQ4ByAIMiXqALzJSrIvzdTmD+gsuVL1MorgkFNXKNYm8Tr17IVNo3Q5FMLxsYM7cVHvF3FYT7Wzd9817JueDKzs5+lZ2QklF+/Acn/Vw4t4Abuym+C7/I5RQfKWhd+KOJrS4YNum6bTyvEPFqBHtcJMEIrmNFgQl4RLuSXLLY1XPN0VJwiOyqjnwtKTyXqupMgJzlm06Ht2wAO5jFhfy4TDufcDQ0vrD9yMJ8Vltf+ILxeNhNW82A6jCl9GMYcmgljjcyG1ynw8DoVEc4aMxxmiu8dZvUNRJQ2cnecO3N6a9KlSx8yGAz4FzZIdizZpH0MAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;01.png&quot;
        title=&quot;01.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/df50cdfcaa5b0f64df35a34b1d863593/0a47e/01.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/df50cdfcaa5b0f64df35a34b1d863593/222b7/01.png 163w,
https://hfai-static.high-flyer.cn/static/df50cdfcaa5b0f64df35a34b1d863593/ff46a/01.png 325w,
https://hfai-static.high-flyer.cn/static/df50cdfcaa5b0f64df35a34b1d863593/0a47e/01.png 600w&quot;
        sizes=&quot;(max-width: 600px) 100vw, 600px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;计算资源在时间维度上进行切分，将算力分配到不同的任务上。这种方式既提升了集群整体的利用率，也方便了用户对于不同任务弹性伸缩用卡规模，人人都有机会调用大规模的算力进行 AI 科研。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/bdce3353392d8abd035d069bd65ea73a/302a4/04.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 57.05521472392638%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABcRAAAXEQHKJvM/AAACl0lEQVQoz4WRS47cNhCGlQA+gW2kk80AuUEWmSAbn0jrLIwsgkSbXCInMGLfwHBPunucxzx6NB71uzUaSa0XJVIiRYmi/qA1hhfZZPGh6mdVET9ZhmEYn51vohd/Lr3fFmHx83x3sJyQWrYbW/u8sRyfWLtMWrdubDlBYd3sD9YipL/YbvTrjuHrhHcGrZWRc2UQ3hrG2/Hk6QOpXrop+0l0MDVg9oCZl8K075bmeu+Zq61rEiZMAKbQMJnUZtn2JuHtD4S3PxLevsyF+ioXyjD+vrZPirrrad0hIBVWQYptlGO+8fDHpY3Z3MF7e4nrjYdVmCEkFQhvkQs1cJw7RsLb7weH7y+uT4hQ+bEw3/rq1dk/6s3kUv0+uVJvZnP1enKpXk+vBv3q7EKt/EQllKu0lCpmtfJJ1cWsbpnU35aNNozpXxcnMeXlIee4v9/1e3sM724K136H/c1H7Efc2zGSLEPCJLKqQVLKPsg5YiY1ld0pk9owqNTPCG9LJjWWftSf3TqY3S0xtu8euXWG+O7mA8a2g4XrI8wY0lIionUfFhxp1eii7k5p3Q0XPs+qpnyICFZ+0l8/ZJj7BFde9h9SXHoZtmGGA2GIqUBY8N5NGWJWayb1adn0hlG2eJZWDbsPE3xww2669vX57qDPt6GebQJ9vg0+5UdWD7EOM6ZjKnREReeTqk9K2dH645NZi+dpKWVCBdYHgsnKx3TtY7YJMdsEmCy9T3q6CbCPCxx7EzY4xP3gUIJJ/d2wlFyop4S366yUkZeVvhMVwSKiwSJ+xDnkweJ4dtQRDcJCBFklg4SJIKLCD3IeplXjF3X3zfCHWdV8ngv1BW3xJYDR/9EBI9ZiJHqMuMJIKIxo3Y2yqnmSVo3xLzTm7OGcex4HAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;04.png&quot;
        title=&quot;04.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/bdce3353392d8abd035d069bd65ea73a/a6d36/04.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/bdce3353392d8abd035d069bd65ea73a/222b7/04.png 163w,
https://hfai-static.high-flyer.cn/static/bdce3353392d8abd035d069bd65ea73a/ff46a/04.png 325w,
https://hfai-static.high-flyer.cn/static/bdce3353392d8abd035d069bd65ea73a/a6d36/04.png 650w,
https://hfai-static.high-flyer.cn/static/bdce3353392d8abd035d069bd65ea73a/e548f/04.png 975w,
https://hfai-static.high-flyer.cn/static/bdce3353392d8abd035d069bd65ea73a/302a4/04.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;在萤火集群上，训练任务分优先级，高优先级的任务可以抢占低优先级的算力资源。同等优先级内的任务以“&lt;strong&gt;先到先服务&lt;/strong&gt;”的原则提供算力资源。hfai 提供了很多便利的工具（如：&lt;a href=&quot;https://doc.hfai.high-flyer.cn/api/client.html&quot;&gt;hfai.client&lt;/a&gt;，&lt;a href=&quot;/blog/checkpoint&quot;&gt;hfai.checkpoint&lt;/a&gt;），方便您的代码在训练过程中&lt;strong&gt;接收集群调度信息，设置断点保存&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&quot;本地代码调试&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%9C%AC%E5%9C%B0%E4%BB%A3%E7%A0%81%E8%B0%83%E8%AF%95&quot; aria-label=&quot;本地代码调试 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;本地代码调试&lt;/h2&gt;
&lt;p&gt;一般的，我们平常执行深度学习训练，例如训练 &lt;a href=&quot;https://github.com/HFAiLab/hfai-models/tree/main/bert&quot;&gt;Bert&lt;/a&gt;：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;python bert.py -c large.yml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;当您需要使用幻方萤火训练模型时，您可以在本地调试修复问题，再提交集群运行。hfai 提供了模拟打断的信号帮助您测试集群运行方式的适配性，如下面例子：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;hfai python bert.py -c large.yml ++ --suspend_seconds &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt; --life_state &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这里&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;++&lt;/code&gt; 标志了当前任务是在本地进行模拟调试&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;--suspend_seconds&lt;/code&gt; 表示每隔多少秒发送一个模拟打断信号&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;--life_state&lt;/code&gt; 表示任务记录的训练位置，这个数值用户可以自己在代码里设置，详情参考&lt;a href=&quot;https://doc.hfai.high-flyer.cn/api/client.html#hfai.client.set_whole_life_state&quot;&gt;这里&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过如上方式，您可以测试您的训练代码是否可以准确接收集群的打断信号，做好模型的断点保存，同时在下一次任务拉起时，是否可以就当前断点继续往下执行。&lt;/p&gt;
&lt;h2 id=&quot;提交任务&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%8F%90%E4%BA%A4%E4%BB%BB%E5%8A%A1&quot; aria-label=&quot;提交任务 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;提交任务&lt;/h2&gt;
&lt;p&gt;完成了本地调试之后，您就可以向萤火提交任务了，命令如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;hfai python bert.py -c large.yml -- --nodes &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; --name train_bert&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这里&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;--&lt;/code&gt; 标志了当前是要提交任务&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;--nodes&lt;/code&gt; 表示使用多少个节点进行训练，这里&lt;strong&gt;任务最少分配一个节点8张A100&lt;/strong&gt;，如果您的任务不需要这么多显卡，可以在代码中进行设定&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;--name&lt;/code&gt; 表示当前任务的命名。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;需要注意的是，&lt;strong&gt;外部免费用户不用设置优先级 &lt;code class=&quot;language-text&quot;&gt;--priority&lt;/code&gt;&lt;/strong&gt;，集群会自动将闲置算力分配出来调度任务。当然，如果您需要不被打断的高优先级训练任务，可以联系幻方洽谈商用。&lt;/p&gt;
&lt;h2 id=&quot;任务管理&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BB%BB%E5%8A%A1%E7%AE%A1%E7%90%86&quot; aria-label=&quot;任务管理 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;任务管理&lt;/h2&gt;
&lt;p&gt;任务提交成功之后，您可以在 &lt;a href=&quot;https://studio.yinghuo.high-flyer.cn&quot;&gt;studio&lt;/a&gt; 页面中查看你任务的运行情况。如下图所示，界面里展示了所提交的任务，任务的 GPU、CPU 使用率，还有集群整体的繁忙程度等。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/b4e805f8a020f713c7fd378a3e80b597/d1882/02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60.73619631901841%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAA7DAAAOwwHHb6hkAAACAElEQVQoz3VS124bQQz0b8RFPuna9nq7V1QgBwnipwTI///LBKQlI0CQhzkuubzZYXkQboFNZ7QiQ/oNg6l87nXBrnV4+Q/ud82YOL9TE9uHL7sOflphQoF0GcImvLYSFH9q+v/icdfhZT/i5TCyf7cPT80A7StiPbHVYYb0BU2v8dp9oOnNJ8jftRK9TnDTEYNJMJGqXPC8H/FAn96R5ICD8JDKYVQerYycqHxFJwN6FRmxniHDguAz5mlBO3gMKnM+iWPCzkQIO2HQCVp7jCowyWgSx3oivJEKv6HTBSZmlNMRoixw8wprwwfhYzNithHvacKPEHF1AScXcXEBZxtwJuvip73EGUUldGvF8POK5v2E6XvBW+hBXNxD7wvKdMTkCoovbP/BLV59gdMRJizwcYNQGdLNaFXCMykkwt4UqHyBSheoeIQMK2TY/sIK6VcIxobBVvQ6QriJe0y9pnY83QkpOOqI/WBusNj3+tM/jBad9JBugokzOuFwGB33uRWeQT5PmQhdvSKtbzwY6SqknWDyGdLPUKHyYNRtpWzauAp65D750WQMKt7WphkwpAljrUwW6wU+b1i//oZdLhCl8kOhnGHjgrx+Q7n+4gqIjKohQmEyHl9vi23SystM0kkBKTkMBpoWNm9oheNzXq68SnQnXWHV9A+VTiUfBo0/LFprm828HhcAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;02.png&quot;
        title=&quot;02.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/b4e805f8a020f713c7fd378a3e80b597/a6d36/02.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/b4e805f8a020f713c7fd378a3e80b597/222b7/02.png 163w,
https://hfai-static.high-flyer.cn/static/b4e805f8a020f713c7fd378a3e80b597/ff46a/02.png 325w,
https://hfai-static.high-flyer.cn/static/b4e805f8a020f713c7fd378a3e80b597/a6d36/02.png 650w,
https://hfai-static.high-flyer.cn/static/b4e805f8a020f713c7fd378a3e80b597/e548f/02.png 975w,
https://hfai-static.high-flyer.cn/static/b4e805f8a020f713c7fd378a3e80b597/3c492/02.png 1300w,
https://hfai-static.high-flyer.cn/static/b4e805f8a020f713c7fd378a3e80b597/d1882/02.png 1562w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;您也可以获取到任务每时的训练状态，如下所示，方便您更好的管理，调优深度学习模型。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/e156efa7f2b09acfc9f81533403a5d5d/0d98f/03.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 30.67484662576687%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABTklEQVQY002RUU/bMBSF80tqu6nt2LGTuGkKXRGjaoc6RIcQjCGqdrCxl73s/z99U4LE9nB07nk4n650MmMtZWzIJ5rCR/JcU7hAbkpMEXDOU9c1pXNYY5BCoP5Tn0dCIoRAa03WH0aPmSVLN7Xvfn5aspx7Fq0lpgo9naPTjLyeomJCxQYREqaq6JLGFROEkGQ9vW08j7uOb7s5TzcnvNwv+fO84fdhza/vWx4Ot1wf91w/PXD7cuDu9Zm7n0d2xz2fv37hx37D2aIZPs16ahUMV6vA9qJ89/XScnbqWXzoSG3CtR3+45pwsaFcfSJdbilXl8xW51xtatrkkHJMJqXEmgl11KTKDN5Ew7S2NLWnigFrLXKiyUM9aFxWKB9RvsKEMPQKmyOlIlNK0kOF+KfRSGCtwxhL6R0h9FBDDAE/jKPfRpFvo/SdnqGU4i9XIbrQ4yRCvAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;03.png&quot;
        title=&quot;03.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/e156efa7f2b09acfc9f81533403a5d5d/a6d36/03.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/e156efa7f2b09acfc9f81533403a5d5d/222b7/03.png 163w,
https://hfai-static.high-flyer.cn/static/e156efa7f2b09acfc9f81533403a5d5d/ff46a/03.png 325w,
https://hfai-static.high-flyer.cn/static/e156efa7f2b09acfc9f81533403a5d5d/a6d36/03.png 650w,
https://hfai-static.high-flyer.cn/static/e156efa7f2b09acfc9f81533403a5d5d/e548f/03.png 975w,
https://hfai-static.high-flyer.cn/static/e156efa7f2b09acfc9f81533403a5d5d/0d98f/03.png 1276w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;除了在studio页面上可以控制任务的启停、日志查看，您也可以在本地电脑 terminal 当中，通过 hfai 一系列套件工具进行操作。此外，与 &lt;code class=&quot;language-text&quot;&gt;hfai python&lt;/code&gt; 类似，幻方AI提供了 &lt;code class=&quot;language-text&quot;&gt;hfai bash&lt;/code&gt; 套件，可以满足用户用bash脚本精细化管理训练任务的需求。有关更多内容可以查阅&lt;a href=&quot;https://doc.hfai.high-flyer.cn/cli/task.html&quot;&gt;官方文档&lt;/a&gt;。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[在减少网络拥塞上，我们的一点实践（一）]]></title><description><![CDATA[对于深度学习开发者和研究者们来说，高性能的算力是助力其研究成功的重要武器。对于影响深度学习训练快慢的因素，人们常常容易忽略网络传输在训练提速中的重要作用。特别是在大规模集群，分布式训练的场景中，网络的拥塞可能直接导致GPU算力的失效,就像空有一段段双向…]]></description><link>https://www.high-flyer.cn/blog/network-1/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/network-1/</guid><dc:creator><![CDATA[Qiao]]></dc:creator><pubDate>Fri, 12 Aug 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;对于深度学习开发者和研究者们来说，高性能的算力是助力其研究成功的重要武器。对于影响深度学习训练快慢的因素，人们常常容易忽略网络传输在训练提速中的重要作用。特别是在大规模集群，分布式训练的场景中，网络的拥塞可能直接导致GPU算力的失效,就像空有一段段双向8车道的快速路，但如果道路规划凌乱，高速路也只能沦为大型停车场。&lt;/p&gt;
&lt;p&gt;本期文章针对网络这个话题，分享一点幻方 AI 就这个方向上的思考和优化。&lt;/p&gt;
&lt;h2 id=&quot;先聊聊网络拓扑&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%85%88%E8%81%8A%E8%81%8A%E7%BD%91%E7%BB%9C%E6%8B%93%E6%89%91&quot; aria-label=&quot;先聊聊网络拓扑 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;先聊聊网络拓扑&lt;/h2&gt;
&lt;p&gt;在幻方萤火集群中，大规模机器学习训练任务对通信和数据读取的性能要求非常高，所以我们使用了目前高性能计算中常用的高速网络来构建节点之间的互联。高速网络的网线和交换机如何排布，这就是我们需要考虑的第一个问题——网络拓扑。&lt;/p&gt;
&lt;p&gt;网络拓扑的构建有点像修路，不但要保证任意两个节点之间都能互相访问，还要让从各个节点发出的数据包都能尽可能&lt;strong&gt;畅通无阻&lt;/strong&gt;地到达目的地。&lt;/p&gt;
&lt;p&gt;与&lt;strong&gt;畅通无阻&lt;/strong&gt;相反的概念就是&lt;strong&gt;拥塞&lt;/strong&gt;。这里用一个生活中塞车的例子来理解拥塞，假设现在所有车辆都具有相同的最高时速，并且会按照能跑到的最大速度去开。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;某个路口有三条车道，源源不断地有车进来但只有一条车道可以出去。如果三条车道的车都遵守交替通行的规则，那么这三条车道的通行效率就只有 1/3。这就是发生了拥塞；&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/3a31b7d24a59a1659adcbd223925e377/302a4/01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 43.558282208588956%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAABXElEQVQoz5XS3W7bMAyGYd//xXRxhizNT+PEsmVJpKTUdmrsat4iSgesGzZsBw9E8ICgwK966oTP9IPwpRPqXlj3j/dfVJcgnL1wEcWI0AaPkVDqJihrq6z+Z+AyblnGmpseycHQ+JFjL8x6YUkGiZ6Ni9T2B/2p/l01xwNz3DFpQw4t3g941/MqLaO2vKWOKVlEBzQ6gvpCo//U8+KQGKgaq2xNRl3LVS6ckvIiA6NcmGPHLRnsYDn0CdudWfKGt7wiuD3765W9t9zihmVcMYYNlfOO3nly6IihpU2Rs4Sy4aSmbChhwHhlGAxTOjDlPRIabBI6sbzGE1M+ctUT1ZK3LLlmlhdmafh+3bDEr0xy5qZt+W6rys7fRb65XDz7xM49eluX2LpcVJpPaD4gaghiSOMJSTtE+3KQZx9LjFadPPR/V9V94m5tY7Hq7tfKpa4/IrP+g18jc4/YO/LTUz3SNEXIAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;01&quot;
        title=&quot;01&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/3a31b7d24a59a1659adcbd223925e377/a6d36/01.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/3a31b7d24a59a1659adcbd223925e377/222b7/01.png 163w,
https://hfai-static.high-flyer.cn/static/3a31b7d24a59a1659adcbd223925e377/ff46a/01.png 325w,
https://hfai-static.high-flyer.cn/static/3a31b7d24a59a1659adcbd223925e377/a6d36/01.png 650w,
https://hfai-static.high-flyer.cn/static/3a31b7d24a59a1659adcbd223925e377/e548f/01.png 975w,
https://hfai-static.high-flyer.cn/static/3a31b7d24a59a1659adcbd223925e377/302a4/01.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果三条车道的某一条车道前面有个丁字路口，直行和右转在同一个车道。直行的车辆会通往拥堵的车道，而右转的车辆会前往另一条畅通的车道，但由于右转的车会被直行的车堵住，假设右转和直行的车辆刚好是交替的，那么这条车道的通行效率也只有 2/3。这就是拥塞扩散。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/15fa3efb4265cfd9228440546fbdcbbc/302a4/02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 43.558282208588956%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAABqElEQVQoz32ObU/aYBSG+5P3EoPiEMFkTiaMifHT5uJoecmA8rQFrKUUsBTaUgTn4s+5Ft6WbMF9uHI/uc95rhzJCqbY4QPdYIYVRNjRnHU3W2H503U3CWlZDm17QNvq0e72N2y63nCV0mPkYfYajMd3LHwHq3TNInBxhgbOQONpPsFpKAzqRTqpOPreK/RUAj32Gj2+h/4uhn7wBpE9Q0/EkG5HP+nYdzzNVJ4ffuCYKubokVavT28ypLN4xu53+eXVCJs5GucnNEwbpVBAfJGplzSq2QJC7VL9kENywxAv9AkiDz8aMY58lp0b+JgjC/W+RsOtYJjX1FL7lBL7lNPHyIlDyskkpeMkylGCSjqFchhH0rwpmhchVsxWqY8jVDcg37whY6Q4ar7lo/GeolJFlivIxRKyXF5TLKH8eZeRxChki7ZNb4p67/NZfCfXznCmnXJhfsII5xjhAn2DsYOXha5PvvmNi9srvtqCS/MK4U4Qbohwgxf5Syj+ES4vPG+fkhYH5M0smrecT9n1Z8t/hXlxQ76VIVs/4bKTR3gB2g7hcn8r/A36nTCLNnmXxAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;02&quot;
        title=&quot;02&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/15fa3efb4265cfd9228440546fbdcbbc/a6d36/02.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/15fa3efb4265cfd9228440546fbdcbbc/222b7/02.png 163w,
https://hfai-static.high-flyer.cn/static/15fa3efb4265cfd9228440546fbdcbbc/ff46a/02.png 325w,
https://hfai-static.high-flyer.cn/static/15fa3efb4265cfd9228440546fbdcbbc/a6d36/02.png 650w,
https://hfai-static.high-flyer.cn/static/15fa3efb4265cfd9228440546fbdcbbc/e548f/02.png 975w,
https://hfai-static.high-flyer.cn/static/15fa3efb4265cfd9228440546fbdcbbc/302a4/02.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;为了尽可能避免塞车的出现，就得有一个好的道路规划。网络拓扑也是同理。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/4444cb85ffd16f4a2f5482c593f2cc74/33e10/03.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 50.306748466257666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABlklEQVQoz3VT32+bMBDm//8z2tep7V6mTVr7UC15iNauSxqSkJQVCAESjAkGzC/zTTENuKp6kn34zvfdd3dGw5u0bdvr0xKtOLtgkxxT59ifT77zPTX2JNp7MLn3zrKuYB/WGBkmbvUtNp4OxhkG+QiqqQYhswI0q2EfLMysJ/jU65PEKcXcmeHFM0AYR9V0oELBUBi+BWUcFyMbS9dSShyCThKxPS7Ha+ju0IYPDIu6lRcII+BVg7RgWHoUJK3f9XbppQhiiqJukPIEm4DApeXA8Ay4T3JcP7goujok4x8zD4tdovS0xtc/O7g0620Tk+CXEfYzkCXfryJMzEgabx59yeLqwUPdNJL13SKE4Wf49teXiX7O93iyE3yfHeDSHHFW4MtvH1UjOsDgWIKklQR0Io5jXmF37M5pKUALAVY0CPOOfcQForTCjhbIS4G6aWGFXPZZU9+Q+h2TBGvDw/PUwmS8AgkTTB9NjEcrGIstPhNNbbicqOh0EMRw7BDulkCfO2CMw3wJoD87eP2376c//Aid/g9PQgGNVaUAPgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;03&quot;
        title=&quot;03&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/4444cb85ffd16f4a2f5482c593f2cc74/a6d36/03.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/4444cb85ffd16f4a2f5482c593f2cc74/222b7/03.png 163w,
https://hfai-static.high-flyer.cn/static/4444cb85ffd16f4a2f5482c593f2cc74/ff46a/03.png 325w,
https://hfai-static.high-flyer.cn/static/4444cb85ffd16f4a2f5482c593f2cc74/a6d36/03.png 650w,
https://hfai-static.high-flyer.cn/static/4444cb85ffd16f4a2f5482c593f2cc74/33e10/03.png 844w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Fattree 是如今大型 AI 集群常用的一种网络拓扑，如英伟达的 Super Pod 等。&lt;/p&gt;
&lt;p&gt;Fattree 的原型，如上图所示。&lt;strong&gt;多个交换机用一棵树的形式相连，不同的层有不同的交换机数量，不同层之间的线缆的带宽也等比例变化，但每一层的总带宽都相等&lt;/strong&gt;。这就是一个无阻塞的网络拓扑。我们还是用塞车的问题来理解这个拓扑，每个交换机可以理解成一个路口。我只要把市中心的路口的车道数加得特别多，就不容易堵车。&lt;/p&gt;
&lt;p&gt;这个拓扑的路由规则也很简单，因为树的任意两个结点之间都只存在一条最短路径。从 a 点到 b 点的路径直接使用最短路径就可以了。&lt;/p&gt;
&lt;p&gt;然而这样的拓扑显然是不实用的，它对网线和交换机的要求太过苛刻。既然没有带宽这么大的网线，我们可以用多根网线组合起来当成一根大的网线用；既然没有这么大的交换机，我们可以把大交换机也拆成多个小的交换机。于是就演化为了下图所示的 Fattree。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 632px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/1642db801aa48488c8e81c18a954666b/84f0d/04.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 63.190184049079754%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMBAgf/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAAB1ErFjBAf/8QAGhAAAgMBAQAAAAAAAAAAAAAAABEBAiEDMv/aAAgBAQABBQKGaQyrfTzTY//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABgQAQADAQAAAAAAAAAAAAAAAAABITEQ/9oACAEBAAY/Alcm2tf/xAAZEAADAQEBAAAAAAAAAAAAAAAAAREhMUH/2gAIAQEAAT8h12QaTW0x1IorwUqoqldP/9oADAMBAAIAAwAAABCUz//EABYRAQEBAAAAAAAAAAAAAAAAAAARQf/aAAgBAwEBPxDFf//EABYRAQEBAAAAAAAAAAAAAAAAAAABQf/aAAgBAgEBPxDVj//EABwQAAIDAQADAAAAAAAAAAAAAAEhABExcUFRYf/aAAgBAQABPxAsf0B3kvLDI+oflnYRMi5st2AeQT6DBuf/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;04&quot;
        title=&quot;04&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/1642db801aa48488c8e81c18a954666b/84f0d/04.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/1642db801aa48488c8e81c18a954666b/d2f63/04.jpg 163w,
https://hfai-static.high-flyer.cn/static/1642db801aa48488c8e81c18a954666b/c989d/04.jpg 325w,
https://hfai-static.high-flyer.cn/static/1642db801aa48488c8e81c18a954666b/84f0d/04.jpg 632w&quot;
        sizes=&quot;(max-width: 632px) 100vw, 632px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;相比于 Fattree 的原型，上图所示的 Fattree 引入了一个新的问题：当一个数据包要从其中一个交换机发送到另一个交换机的时候，往往存在很多种可能的路径，如何判断该走那一条呢？&lt;strong&gt;如果大量数据包都同时需要通过同一条线路（链路复用），那还是会产生拥塞&lt;/strong&gt;。根据幻方萤火的经验，链路复用可能会把集群的整体流量降到正常情况的一半，甚至更低。&lt;strong&gt;如何通过合理规划流量的路径，减少拥塞的发生和影响范围，这就是路由算法需要解决的问题&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&quot;mlnxsm的路由算法&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#mlnxsm%E7%9A%84%E8%B7%AF%E7%94%B1%E7%AE%97%E6%B3%95&quot; aria-label=&quot;mlnxsm的路由算法 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;MLNXSM的路由算法&lt;/h2&gt;
&lt;p&gt;现在的高速网络基本都是用 Mellanox 提供的 MLNXSM 来管理，MLNXSM 提供了针对 Fattree 拓扑结构的路由算法，虽然它的文档中并没有详细介绍，而且代码也没有开源，但众所周知 MLNXSM 是 OpenSM 的魔改版，有兴趣的读者可以通过 OpenSM 的源码来了解其细节。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心思路&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;高速网络交换机的路由规则是，每个交换机上都有一个端口转发表，&lt;strong&gt;会根据每个数据包的目的地将数据包转发到对应的端口&lt;/strong&gt;。而路由算法就是要为每个交换机生成这个端口转发表。&lt;/p&gt;
&lt;p&gt;OpenSM 的 Fattree 会为每个叶子节点，也就是每张网卡，在 Fattree 的每一层分配一个下行链路，所有到达这一层的去往该目标网卡的流量都经由这个下行链路往下。同时，对这些下行链路做负载均衡，使得每条下行链路上分配到的目标网卡数量尽可能相等。从而减少从上层到下层的流量之间的链路复用。最理想的情况下，如果 Fattree 各层之间的带宽相等，也就是横截面流量之比为 1:1 时，可以完全避免从上到下的链路复用。这样，拥塞就只会在从下到上的流量中发生，拥塞扩散的范围也会变小。&lt;/p&gt;
&lt;p&gt;这听起来很不错，但在实际应用 MLNXSM 的 Fattree 算法过程中，我们还是遇到了一些问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实际使用遇到的问题&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;萤火二号实际的网络拓扑并不是一个标准的 Fattree。除去计算机器和存储机器之外，我们还有一部分测试机器、开发机器和用于管理集群的机器等。它们对于网络带宽的要求相对低很多，因此我们使用更低带宽的网卡或是其他方式将它们接入核心网络。但 MLNXSM 的 Fattree 算法并不能很好地处理这一点，它并不会根据机器的应用类型来计算路由。&lt;strong&gt;结果就是，由于我们的机器网卡总带宽比 Fattree 的横截面带宽更大，所以 MLNXSM 算出来的路由表常常会把两个以上的网卡分配到同一个链路上，如果这两张网卡恰巧都是负载比较重的网卡，就会产生拥塞。&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MLNXSM 的 Fattree 算法产生的路由表会有比较严重的负载不均衡的现象，标号靠前的几个交换机会分到更多的负载。猜测是因为枚举交换机的顺序导致。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mellanox 交换机有一个很先进的功能叫 sharp，可以把一部分计算在交换机内完成。在实践中我们目前不打开 sharp，但路由算法仍然会给 sharp 节点计算负载。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果有几个 Fattree 需要互相连接，路由算法的行为将会很难控制。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;我们的一些实践&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%88%91%E4%BB%AC%E7%9A%84%E4%B8%80%E4%BA%9B%E5%AE%9E%E8%B7%B5&quot; aria-label=&quot;我们的一些实践 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;我们的一些实践&lt;/h2&gt;
&lt;p&gt;为了解决上述的这些问题，&lt;strong&gt;幻方AI自研了一套适配萤火二号的特性的路由算法&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;主要思路如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;将整体的网络在逻辑上切分成标准Fattree的部分和其他部分。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于网络拓扑中标准 Fattree 的部分，采用上述的 Opensm Fattree 算法类似的思路，给每个叶子交换机上的端口分配一条独立的从上到下的链路，&lt;strong&gt;使得从上到下的流量完全没有链路复用&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于其他部分，使用最短路等图论算法计算转发路径，但同时需要考虑链路的&lt;strong&gt;负载均衡&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于 Fattree 与其他网络之间互联的部分，同样需要在互联线之间做负载均衡，使得每条互联线分配到的目的节点数量相等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;负载均衡的同时，需要根据目标机器类型把单个应用的流量分散到各个链路&lt;/strong&gt;，最大化单个应用的峰值带宽。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于不同带宽的网卡，在负载均衡时采用与带宽等比例的权重。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于 sharp 节点，仅保证其连通性，而不考虑其负载。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;类似于互联线和带宽较低的网卡，比较容易成为拥塞的源头。&lt;strong&gt;把经过它们的流量集中到部分交换机上&lt;/strong&gt;，一旦发生拥塞，也能减小拥塞的影响范围。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;发生网络故障时，需要把故障交换机上的负载转移到别的交换机上。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在萤火二号上经过长期的生产环境验证，幻方 AI 自研的这套路由算法很好地解决了原来 MLNXSM 路由算法在幻方集群上水土不服的问题，明显提升了集群的网络使用效率。&lt;/p&gt;
&lt;p&gt;更优更灵活的路由方案，幻方AI继续持续探索，欢迎各方同行学者一起讨论，加入共建。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[JupyterLab TensorBoard Pro：功能完备的 TensorBoard 插件]]></title><description><![CDATA[对于深度学习开发者和研究者们来说，TensorBoard 是帮助理解深度学习运行机理，训练可视化和调试的重要工具。 最近，幻方 AI 开发并集成了 JupyterLab TensorBoard 插件（JupyterLab TensorBoard Pro…]]></description><link>https://www.high-flyer.cn/blog/jupyterlab_tensorboard/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/jupyterlab_tensorboard/</guid><dc:creator><![CDATA[Aircloud]]></dc:creator><pubDate>Mon, 01 Aug 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;对于深度学习开发者和研究者们来说，TensorBoard 是帮助理解深度学习运行机理，训练可视化和调试的重要工具。&lt;/p&gt;
&lt;p&gt;最近，幻方 AI 开发并集成了 &lt;a href=&quot;https://github.com/jupyterlab/jupyterlab&quot;&gt;JupyterLab&lt;/a&gt; TensorBoard 插件（JupyterLab TensorBoard Pro），帮助大家在使用幻方萤火集群训练模型的同时，也可以方便快捷的使用 Tensorboard 工具进行深度学习训练的调试。&lt;/p&gt;
&lt;p&gt;该插件更新修复了社区里原插件的若干问题，并对性能进行了提升。我们对该插件进行了开源，方便用户在没有幻方萤火集群的 JupyterLab 环境的情况下，仍然可以下载和使用。下载安装方式如下&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;pip install jupyterlab-tensorboard-pro&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;开源地址&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/jupyterlab_tensorboard_pro&quot;&gt;https://github.com/HFAiLab/jupyterlab_tensorboard_pro&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;研发背景&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E7%A0%94%E5%8F%91%E8%83%8C%E6%99%AF&quot; aria-label=&quot;研发背景 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;研发背景&lt;/h2&gt;
&lt;p&gt;目前深度学习社区里面已经有了 &lt;a href=&quot;https://github.com/chaoleili/jupyterlab_tensorboard&quot;&gt;jupyterlab_tensorboard&lt;/a&gt;（前端插件）和 &lt;a href=&quot;https://github.com/lspvic/jupyter_tensorboard&quot;&gt;jupyter_tensorboard&lt;/a&gt;（对应的后端插件）两个开源插件，然而这两个仓库已经很久没有更新迭代，对于一些外部提交的PR也没有及时合入（&lt;em&gt;实际上，当我们发布 jupyterlab_tensorboard_pro 之后，jupyterlab_tensorboard 合入了一些社区 PR，但 jupyter_tensorboard 仍然存在无法配合较新的 tensorboard 版本使用的问题&lt;/em&gt;），基于此我们判断该项目作者已经不在积极地维护对应的仓库。&lt;/p&gt;
&lt;p&gt;同时，现有社区的 TensorBoard 插件存在一定的体验问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;需要同时安装两个 Python 包，并且需要版本对应，增加了使用和维护的成本；&lt;/li&gt;
&lt;li&gt;社区版本插件启动 TensorBoard 后端会持续 reload（从磁盘读取文件并更新），这会对 JupyterLab 的体验产生副作用，如果使用了分布式文件系统或者公用集群，甚至还会影响到其他用户。目前社区版本插件无法通过配置来禁用。&lt;/li&gt;
&lt;li&gt;功能体验不够完善，例如点击 &lt;code class=&quot;language-text&quot;&gt;TensorBoard&lt;/code&gt; 按钮之后会阻塞请求导致 JupyterLab 没有响应，并且没有任何提示，同时也对已经创建的 TensorBoard 实例的可视化管理功能也比较缺乏。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;基于以上原因，幻方AI基于现有的社区版本二次开发了 TensorBoard 插件，以解决上述问题。在内部使用一段时间后，插件运行稳定并持续获得正向反馈，因此我们将插件开源以帮助更多的开发者和研究者们。&lt;/p&gt;
&lt;h2 id=&quot;在萤火-jupyterlab-中使用&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%9C%A8%E8%90%A4%E7%81%AB-jupyterlab-%E4%B8%AD%E4%BD%BF%E7%94%A8&quot; aria-label=&quot;在萤火 jupyterlab 中使用 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;在萤火 JupyterLab 中使用&lt;/h2&gt;
&lt;h3 id=&quot;创建实例&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%88%9B%E5%BB%BA%E5%AE%9E%E4%BE%8B&quot; aria-label=&quot;创建实例 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;创建实例&lt;/h3&gt;
&lt;h4 id=&quot;1-从-launcher-面板创建&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-%E4%BB%8E-launcher-%E9%9D%A2%E6%9D%BF%E5%88%9B%E5%BB%BA&quot; aria-label=&quot;1 从 launcher 面板创建 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. 从 launcher 面板创建&lt;/h4&gt;
&lt;p&gt;您可以登录进入&lt;a href=&quot;https://yinghuo.high-flyer.cn/&quot;&gt;萤火 JupyterLab&lt;/a&gt;，从 Launcher 面板点击 TensorBoard 图标。首次点击会进入到一个初始化面板，您可以在该面板内创建 TensorBoard 实例。非首次进入则会直接进入到第一个活跃的 TensorBoard 实例。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/78d2e01a084425a5b9b1f5d272a9dae3/2a333/tensorboard.step1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 26.380368098159508%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAIAAADKYVtkAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA10lEQVQY012OwWqEQBBE/W2/JZ+QP8hBFgTJKUcXQlY0slmcuHFndWbsnumuoOSQ5BU0VTQFlVlri6KYpinGiH+ogtbfSfXPP2PmYRi89yklEYkx/piVk0KaV/F3UU4p6VZVEdkNRCQDUNd1nufOOSKqqir4AODt6TxfFgXW5wc6HQAcXs6PRQOg7bqyLFNKW9kYU5Yl7/R9z7Tp8/262DkqbHucxwuA7uPr2BhAx/Hati0zZ6rKzHGHiEII2/XBztb5bYtd3H1emHgNjoIj4tttMsY4574ByEAbonTU8B8AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;tensorboard step1&quot;
        title=&quot;tensorboard step1&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/78d2e01a084425a5b9b1f5d272a9dae3/a6d36/tensorboard.step1.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/78d2e01a084425a5b9b1f5d272a9dae3/222b7/tensorboard.step1.png 163w,
https://hfai-static.high-flyer.cn/static/78d2e01a084425a5b9b1f5d272a9dae3/ff46a/tensorboard.step1.png 325w,
https://hfai-static.high-flyer.cn/static/78d2e01a084425a5b9b1f5d272a9dae3/a6d36/tensorboard.step1.png 650w,
https://hfai-static.high-flyer.cn/static/78d2e01a084425a5b9b1f5d272a9dae3/e548f/tensorboard.step1.png 975w,
https://hfai-static.high-flyer.cn/static/78d2e01a084425a5b9b1f5d272a9dae3/3c492/tensorboard.step1.png 1300w,
https://hfai-static.high-flyer.cn/static/78d2e01a084425a5b9b1f5d272a9dae3/2a333/tensorboard.step1.png 1484w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;2-通过快捷命令创建&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%E9%80%9A%E8%BF%87%E5%BF%AB%E6%8D%B7%E5%91%BD%E4%BB%A4%E5%88%9B%E5%BB%BA&quot; aria-label=&quot;2 通过快捷命令创建 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. 通过快捷命令创建&lt;/h4&gt;
&lt;p&gt;您也可以打开 JupyterLab 快捷指令面板（&lt;code class=&quot;language-text&quot;&gt;ctrl + shift + c&lt;/code&gt; 唤起），输入 &lt;code class=&quot;language-text&quot;&gt;Open TensorBoard&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/5c1ee3443708a529f50bd1c1c49a749e/1c181/tensorboard.step2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 19.631901840490798%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAIAAAABPYjBAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAoklEQVQI112MyQ6CMBRF+//fYiIu/ARXmqAsXBCnipRBKKW0dIC+GhNikJOzusm5SGtttKqq6oZfNROUyzgpcdFeM3Yhzdw4bXbn/P7ATzyBnAMYrZKdA++NEIytD1mwz9YhDY4sOE1uIrYK2TZqjLE/kLVG9b0UAr4nQ16m9ZsUJBmN9B78kr8FiY77QSkpHIADTynhvOVcKK2NHRZaO8zjD/Q24Jbl+nR/AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;tensorboard step2&quot;
        title=&quot;tensorboard step2&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/5c1ee3443708a529f50bd1c1c49a749e/a6d36/tensorboard.step2.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/5c1ee3443708a529f50bd1c1c49a749e/222b7/tensorboard.step2.png 163w,
https://hfai-static.high-flyer.cn/static/5c1ee3443708a529f50bd1c1c49a749e/ff46a/tensorboard.step2.png 325w,
https://hfai-static.high-flyer.cn/static/5c1ee3443708a529f50bd1c1c49a749e/a6d36/tensorboard.step2.png 650w,
https://hfai-static.high-flyer.cn/static/5c1ee3443708a529f50bd1c1c49a749e/e548f/tensorboard.step2.png 975w,
https://hfai-static.high-flyer.cn/static/5c1ee3443708a529f50bd1c1c49a749e/3c492/tensorboard.step2.png 1300w,
https://hfai-static.high-flyer.cn/static/5c1ee3443708a529f50bd1c1c49a749e/1c181/tensorboard.step2.png 2696w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;设置参数&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AE%BE%E7%BD%AE%E5%8F%82%E6%95%B0&quot; aria-label=&quot;设置参数 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;设置参数&lt;/h3&gt;
&lt;p&gt;这里，在初始化面板中，提供了两个参数可以进行设置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Log Dir&lt;/strong&gt;：日志目录地址，默认是点击 TensorBoard 时当前侧边栏的目录。您也可以手动填写对应目录。这里建议目录尽可能的细化，因为目录内容少会提高初始化的速度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reload Interval&lt;/strong&gt;：TensorBoard 多久对对应目录进行一次重新扫描，默认是 120s。如果您不需要扫描建议及时关闭，日常使用手动 Reload 即可。这里要注意的是：设置 Reload Interval 之后，TensorBoard 后端持续扫描目录会对 JupyterLab 的稳定性和文件系统都产生一定的影响。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;选择好参数点击 &lt;code class=&quot;language-text&quot;&gt;Create TensorBoard&lt;/code&gt;，会同步创建 TensorBoard 实例，这个时候 JupyterLab 后端是&lt;strong&gt;阻塞&lt;/strong&gt;的，请等待实例创建好之后再进行其他操作。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/6ff6c60a93a96470c02198e8a2982747/e3815/tensorboard.step3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 6.134969325153374%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAABCAIAAABR8BlyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAO0lEQVQI12O4dPnykydP3717d+fewzPnL924def2vUeXTx26uH3+xUNbLl++chkDXLly5fSZMydPngQA+MExeP7F3/QAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;tensorboard step3&quot;
        title=&quot;tensorboard step3&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/6ff6c60a93a96470c02198e8a2982747/a6d36/tensorboard.step3.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/6ff6c60a93a96470c02198e8a2982747/222b7/tensorboard.step3.png 163w,
https://hfai-static.high-flyer.cn/static/6ff6c60a93a96470c02198e8a2982747/ff46a/tensorboard.step3.png 325w,
https://hfai-static.high-flyer.cn/static/6ff6c60a93a96470c02198e8a2982747/a6d36/tensorboard.step3.png 650w,
https://hfai-static.high-flyer.cn/static/6ff6c60a93a96470c02198e8a2982747/e548f/tensorboard.step3.png 975w,
https://hfai-static.high-flyer.cn/static/6ff6c60a93a96470c02198e8a2982747/3c492/tensorboard.step3.png 1300w,
https://hfai-static.high-flyer.cn/static/6ff6c60a93a96470c02198e8a2982747/e3815/tensorboard.step3.png 2730w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;管理实例&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E7%AE%A1%E7%90%86%E5%AE%9E%E4%BE%8B&quot; aria-label=&quot;管理实例 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;管理实例&lt;/h3&gt;
&lt;p&gt;创建好实例后，您可以对 TensorBoard 的实例进行管理。目前提供了以下几个功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;刷新和列表切换&lt;/strong&gt;：可以切换成其他的实例的 TensorBoard 后端，这个时候不会销毁实例。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;独立页面中打开&lt;/strong&gt;：可以以独立网页 Tab 的形式打开 TensorBoard。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reload&lt;/strong&gt;：即重新初始化 TensorBoard 后端，当文件内容有更新时，可以通过此功能载入新的内容（注：TensorBoard 内部的刷新，不会造成 Reload）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Destroy&lt;/strong&gt;：销毁实例，会连同前端面板一起关掉。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Duplicate&lt;/strong&gt;：重新打开一个完全一样的前端面板，此操作会复用 TensorBoard 后端。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New&lt;/strong&gt;：额外新建一个 TensorBoard 后端，注意事项可以参考上文。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;另外，对于我们创建的 TensorBoard 实例，可以在 JupyterLab 的 Kernel 管理面板一同管理，提供跳转至对应实例和删除等功能。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/c64d01038607b40c14e6271d9f4ce5df/e7dd1/tensorboard.step4.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 15.337423312883436%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA3klEQVQI1yXMvU7CUACA0T6Xj+Cig7hYHX0Hn8OBSSPGJsawGQYXwWLEQIkh2NvbXihWIKmF2tv6hyb6GXQ46zGSJOFjsQC+SaKI0AuYhg9EvkK6AZEfoLotVK/HwJUo1/t3LxgKj6tml7vaBf2OQ7/dwViGhc74+oH57SnZ0Sbv1V3S4y3G5TXi8ip6fwV9uI4+MdGVDXSlRG5tk1sms7MdMsskOSgxqe5hPClJNhrwGU+YeW3GzjmPTo25qFMom9RrkEqbVNR5FpcUfoN8KbD/vIVNXkY3vA6viWWLXyEuyycmM8W0AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;tensorboard step4&quot;
        title=&quot;tensorboard step4&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/c64d01038607b40c14e6271d9f4ce5df/a6d36/tensorboard.step4.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/c64d01038607b40c14e6271d9f4ce5df/222b7/tensorboard.step4.png 163w,
https://hfai-static.high-flyer.cn/static/c64d01038607b40c14e6271d9f4ce5df/ff46a/tensorboard.step4.png 325w,
https://hfai-static.high-flyer.cn/static/c64d01038607b40c14e6271d9f4ce5df/a6d36/tensorboard.step4.png 650w,
https://hfai-static.high-flyer.cn/static/c64d01038607b40c14e6271d9f4ce5df/e548f/tensorboard.step4.png 975w,
https://hfai-static.high-flyer.cn/static/c64d01038607b40c14e6271d9f4ce5df/3c492/tensorboard.step4.png 1300w,
https://hfai-static.high-flyer.cn/static/c64d01038607b40c14e6271d9f4ce5df/e7dd1/tensorboard.step4.png 3354w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;在本地安装使用&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%9C%A8%E6%9C%AC%E5%9C%B0%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8&quot; aria-label=&quot;在本地安装使用 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;在本地安装使用&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;JupyterLab-TensorBoard-Pro&lt;/code&gt; 支持的最低 Python 版本为 Python 3.6，不过由于幻方 AI 套件建议的 Python 版本为 3.8，因此建议您在 &lt;strong&gt;Python 3.8&lt;/strong&gt; 的环境中使用该插件，从而方便安装其他幻方 AI 套件。&lt;/p&gt;
&lt;p&gt;为了兼容多版本的 TensorBoard 和 JupyterLab，插件本身未指定强制依赖版本，需要提前确认本地环境已经安装如下第三方库:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;jupyterlab（V3+）&lt;/li&gt;
&lt;li&gt;tensorflow（建议 V2+）&lt;/li&gt;
&lt;li&gt;tensorboard（建议 V2+）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果是一个全新的 Python 环境，可以直接 &lt;code class=&quot;language-text&quot;&gt;pip install jupyterlab tensorflow tensorboard&lt;/code&gt; 安装当前默认版本即可。&lt;/p&gt;
&lt;p&gt;通过 &lt;code class=&quot;language-text&quot;&gt;pip install jupyterlab-tensorboard-pro&lt;/code&gt; 下载安装之后，会默认安装到当前 Python 环境的 JupyterLab 插件列表中，直接启动 JupyterLab 即可使用，使用方式和注意事项与在萤火 JupyterLab 中使用相同。&lt;/p&gt;
&lt;h2 id=&quot;总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%80%BB%E7%BB%93&quot; aria-label=&quot;总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;总结&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;JupyterLab-TensorBoard-Pro&lt;/code&gt; 旨在提供高性能的 TensorBoard 插件服务，帮助您更方便地在萤火集群中调优深度学习训练。我们欢迎大家来试用，并提出&lt;a href=&quot;https://github.com/HFAiLab/jupyterlab_tensorboard_pro/issues&quot;&gt;反馈&lt;/a&gt;。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[haienv | 运行环境的影分身术]]></title><description><![CDATA[最近，幻方 AI 发布了其沉淀多年的深度学习套件 hfai ，吸引了众多同行研究员和开发者们咨询试用。其中，不少用户朋友对 hfai 中一些功能不太熟悉，使用上存在疑惑，或者仅仅使用了其中非常少的一部分功能。 为此，我们专门创建了 “hfai…]]></description><link>https://www.high-flyer.cn/blog/hfai_venv/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/hfai_venv/</guid><dc:creator><![CDATA[High-Flyer]]></dc:creator><pubDate>Fri, 29 Jul 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近，幻方 AI 发布了其沉淀多年的&lt;a href=&quot;/blog/hfai_usage&quot;&gt;深度学习套件 hfai&lt;/a&gt; ，吸引了众多同行研究员和开发者们咨询试用。其中，不少用户朋友对 hfai 中一些功能不太熟悉，使用上存在疑惑，或者仅仅使用了其中非常少的一部分功能。&lt;/p&gt;
&lt;p&gt;为此，我们专门创建了 “hfai 使用心法”系列专辑，陆续为大家介绍 hfai 一些功能的设计思路和原理，帮助大家更好更快地习得心法，带着 hfai 这套“神功”游刃有余的应对深度学习作业的各项挑战，举重若轻、例不虚发。&lt;/p&gt;
&lt;p&gt;上次文章为大家介绍了 &lt;a href=&quot;/blog/hfai_workspace&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hfai workspace&lt;/code&gt;&lt;/a&gt;，其可以帮助用户快速同步本地工程目录代码到远程萤火集群中。但是在实际的作业中，我们还会碰到另外一个问题——如何构建运行环境？这跟上一招式讲到的“本地-萤火，数据通路”其实是一套组合拳，那么本次“心法”就为大家介绍 &lt;code class=&quot;language-text&quot;&gt;haienv&lt;/code&gt;，“本地-萤火，环境共享”——快速实现运行环境的集群部署。&lt;/p&gt;
&lt;h2 id=&quot;使用场景&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF&quot; aria-label=&quot;使用场景 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;使用场景&lt;/h2&gt;
&lt;p&gt;如&lt;a href=&quot;/blog/hfai_workspace&quot;&gt;上一期文章所介绍&lt;/a&gt;的，用户将本地的数据、代码传到远程萤火集群之后，任务代码还需要依赖一些必要的环境才能实际跑起来。然而，集群为了安全起见，采用的是一个封闭的内网系统。&lt;/p&gt;
&lt;p&gt;幻方AI经过多年的积累，&lt;a href=&quot;https://doc.hfai.high-flyer.cn/start/hfai_intro.html#id8&quot;&gt;内部环境&lt;/a&gt;已经可以满足很多深度学习训练的需求。使用方式如下，在运行代码的开头加入：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; haienv
haienv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_env&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;202111&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;之后，提交任务到萤火集群上运行即可。&lt;/p&gt;
&lt;p&gt;然而就特定场景而言，用户难免会依赖一些特殊的环境。那么，用户如何方便地将自定义的环境从本地（个人电脑，个人集群）推到远程集群中部署呢？&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;haienv create&lt;/code&gt; 应运而生，您可以以此构建您自己的运行环境。&lt;/p&gt;
&lt;h2 id=&quot;命令结构&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%91%BD%E4%BB%A4%E7%BB%93%E6%9E%84&quot; aria-label=&quot;命令结构 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;命令结构&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;haienv create &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;venv_name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;--py &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;py&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;--no_extend&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以上就是 &lt;code class=&quot;language-text&quot;&gt;haienv&lt;/code&gt; 命令的格式，其与 conda 创建环境类似， 会生成一个名为 &lt;code class=&quot;language-text&quot;&gt;venv_name&lt;/code&gt; 的虚拟环境，python 版本号为 &lt;code class=&quot;language-text&quot;&gt;&amp;lt;py&gt;&lt;/code&gt;（默认为本地电脑里的 python 版本）。&lt;/p&gt;
&lt;p&gt;这里要注意的有两点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;--no_extend&lt;/code&gt; 表示不扩展本地环境生成新环境，&lt;strong&gt;默认是扩展的&lt;/strong&gt;。如果不指定 &lt;code class=&quot;language-text&quot;&gt;--no_extend&lt;/code&gt; 那么新创建的环境只可以在本地使用，不能推送到远程。这是因为依赖的基础环境不能被 &lt;code class=&quot;language-text&quot;&gt;haienv&lt;/code&gt; 所捕获。&lt;/li&gt;
&lt;li&gt;在本地使用 &lt;code class=&quot;language-text&quot;&gt;hfai init&lt;/code&gt; 初始化用户账户信息时，命令里包含了 &lt;code class=&quot;language-text&quot;&gt;--venv_path&lt;/code&gt; 参数，这个参数在萤火集群中是 &lt;code class=&quot;language-text&quot;&gt;/hf_shared/hfai_envs/&lt;/code&gt; 这个路径，在很多用户的本地电脑里基本不会存在。这里如果不指定 &lt;code class=&quot;language-text&quot;&gt;--venv_path&lt;/code&gt;，可能在&lt;strong&gt;venv创建环境时抛出权限问题&lt;/strong&gt;。这里建议用户在初始化的过程中指定一个存放自己环境的路径，如下所示：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;hfai init &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;token&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; --venv_path &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;local_path&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;之后，您就可以顺利创建虚拟环境，并通过 &lt;code class=&quot;language-text&quot;&gt;haienv list&lt;/code&gt; 命令来查看您所创建的虚拟环境了。&lt;/p&gt;
&lt;h2 id=&quot;环境使用&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E7%8E%AF%E5%A2%83%E4%BD%BF%E7%94%A8&quot; aria-label=&quot;环境使用 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;环境使用&lt;/h2&gt;
&lt;p&gt;虚拟环境安装好之后，打开您本地电脑的 ternimal，可以通过如下命令进入该虚拟环境：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;source&lt;/span&gt; haienv &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;venv_name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;进入该虚拟环境后，您可以用 &lt;code class=&quot;language-text&quot;&gt;pip install&lt;/code&gt; 或者 &lt;code class=&quot;language-text&quot;&gt;conda install&lt;/code&gt; 的方式安装您所需要的依赖。 同时，您也可以人工找到 &lt;code class=&quot;language-text&quot;&gt;site-package&lt;/code&gt; 的目录并手动导入自己想要的包。以上过程和 python 的流行使用方式一致。&lt;/p&gt;
&lt;p&gt;当执行代码时，除了在当前激活的环境下运行，您也可以在项目代码中指定这个虚拟环境。使用非常简单，只需要在主函数代码的最开始引入：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; haienv
haienv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_env&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;venv_name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;后续的依赖都会在您所指定的这个虚拟环境中加载。&lt;/p&gt;
&lt;h2 id=&quot;环境部署&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E7%8E%AF%E5%A2%83%E9%83%A8%E7%BD%B2&quot; aria-label=&quot;环境部署 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;环境部署&lt;/h2&gt;
&lt;p&gt;如果您在 hfai Studio 中开发容器里执行的 &lt;code class=&quot;language-text&quot;&gt;haienv&lt;/code&gt; 创建的虚拟环境，该环境则&lt;strong&gt;默认已经部署在集群中&lt;/strong&gt;。如果您在本地电脑执行的，则需要将环境推送到远程萤火集群进行部署。命令如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;haienv push &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;venv_name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;执行该命令时，本地和后台会发生如下交互：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/19957a02a734cdfb511fefe9d40a7c01/5a3c9/01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.25766871165644%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABcRAAAXEQHKJvM/AAAD3klEQVQ4y12Re0wTBxzHf0Xog7BhNnVbTMnIUKcQtsjDwnS82uLoIGsmFLclwJZBm5NHe3RAyXq1hYo8YnCARpfICGxzOE226Mggi304schERVDAtte73vXuIOXhxh/Lcgu4mLhv8sn3v0++v/yAIIhOn8/XzXFcMsdxwPM81BxDpBr1+6mVeuy1WM2oBOJvCT80DmzTaEreKisre/27b85ETXrG4eCBQwL1uxXCpsbmBAzDkmx2KwBJEse9Xq99cXFx39ra6taVtSe7H8/eT5xxXk3BSfrNcDj8RohbScADwb2jHu/bs4/JRF8gtGd1dS2BZbntPEBEr6kq1oS1vCzNZQHwANnr9/vOrK+vJ88vLMASz0fw51SCBUQqUgHAjd9cAnjpBKiM13dkKorjcj9qjS+13RWDbAog5Sew19jB2HAKdNZLIEc9sBHBxpnFpZ9IWmxW0fddzUAAwEQBCMdsGtA5echEnJFyvSPuQIldml1+dlee3rVt73E+MhudlOSYSLHCNC9O6+Wj5PUTEtitu7G1zd6602KxJJvN5lfaGhA496VOfKU6O9bQ83NkqmEG5AaXNB91pb1T55Hl1nv256OOFBUymHe47lpGIdKvLKgeziqq+kqdrx9LB3GJM1pVfR5OtdTDwODQ5mRt5edJpUfUMqO2Yh9/DIRVSHdCce2lg4qyzkJl1UDWe/qRdPVnLWUF1T8cUle2lxZp+1RHyo1N+XUj6SDROKIhj4Cjhh4BamyAnpNWOHGyQ2ju7IuytnaJZLV/gMLgjDtc75YlVoylZiDu/araK1mF2rNFBdXDOSpkUJFfN5KpQgaUCtSdtimUVX0LQx06aGy2ABTchwunMejrbYfLPXo4anJDrvG2SFo4FG3vH0+1Xpja+WKRQ6xqvBmjQH+PUaDuGKXB8QyILHa/YMHMu8xm856mZiwCIBF4/pGA50nB0/57i2f+L8B9C40PZ2f4B9P37j4Yv7qjq98JkHQP5Og4KFA3yOs9oDQ4AUQlLsmvpz+O+KLZGjV83r758af8Azz/5D94uDg6/apzYkbz4zVnBsD2LQB+uHjZBWna66BEXc8AYYkrevzr8gispSPqzvQceAn2U5xkugmKacMJugMnQ+0ExbYHgozNT9AmkuYwH8HaHvmZmBkvAzjFwfP5YFJoxrB4i8WSsLGEZZnuYJAkg8HgbADH5wMBfI6mqIckScwFcNxLEAE/TVO3VleWY/9cW4Glxf8L1R6oQSohJzcP7kxNAcdxdoZhbjMM46Bo2k1RlJtlWVcoFHJRNL3RNxmW/SUcXo4NLy/D0tLSc75/AUhY9jWl+3zVAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;01.png&quot;
        title=&quot;01.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/19957a02a734cdfb511fefe9d40a7c01/a6d36/01.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/19957a02a734cdfb511fefe9d40a7c01/222b7/01.png 163w,
https://hfai-static.high-flyer.cn/static/19957a02a734cdfb511fefe9d40a7c01/ff46a/01.png 325w,
https://hfai-static.high-flyer.cn/static/19957a02a734cdfb511fefe9d40a7c01/a6d36/01.png 650w,
https://hfai-static.high-flyer.cn/static/19957a02a734cdfb511fefe9d40a7c01/e548f/01.png 975w,
https://hfai-static.high-flyer.cn/static/19957a02a734cdfb511fefe9d40a7c01/5a3c9/01.png 1169w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;与 &lt;code class=&quot;language-text&quot;&gt;hfai workspace&lt;/code&gt; 类似，本地与萤火服务层通过 VPN 进行控制交互后，本地环境会先打包发送给OSS，再通过专线导入到萤火集群中。在训练时，模型代码会去搜索加载集群中的这个环境，弹性计算于多个节点中。&lt;/p&gt;
&lt;p&gt;这里需要注意的是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;与 workspace 不同在于，haienv 只有 push 动作，没有 pull，环境只能单向上传到集群里；&lt;/li&gt;
&lt;li&gt;在本地执行 &lt;code class=&quot;language-text&quot;&gt;haienv&lt;/code&gt;，必须指定 &lt;code class=&quot;language-text&quot;&gt;--no_extend&lt;/code&gt; 参数，环境从零构建；在 Studio 开发容器中执行，则可以不加，从集群默认环境中增量安装&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;为了您的安装方便，我们建议您在 Studio 开发容器中创建您的虚拟环境。&lt;/strong&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[萤火跑模型 | CLIP-GEN 无需文本训练即可文字生成图像]]></title><description><![CDATA[随着Transformer模型的发展，近些年多模态模型获得了长足的发展，使得不同任务不同领域可以实现特征的打通，变换出很多新奇好玩的场景。其中非常热门的就是让AI学会看文作图，即文字生成图像，如OpenAI的CLIP…]]></description><link>https://www.high-flyer.cn/blog/clip_gen/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/clip_gen/</guid><dc:creator><![CDATA[小杞]]></dc:creator><pubDate>Fri, 22 Jul 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;随着Transformer模型的发展，近些年多模态模型获得了长足的发展，使得不同任务不同领域可以实现特征的打通，变换出很多新奇好玩的场景。其中非常热门的就是让AI学会看文作图，即文字生成图像，如OpenAI的CLIP模型，其基于带文字的图像数据集上，训练出很惊艳的效果。&lt;/p&gt;
&lt;p&gt;然而，收集这些带文字的图像数据集成本非常高。最近字节在Arxiv上发表了一项文本生成图像 (text2img) 的工作，其利用对抗网络GAN改造CLIP模型，使得 CLIP-GEN 可以不依赖带文字描述的图片数据集，直接使用无文本图像数据集进行训练，通过预训练好的 CLIP 模型建立起文本和图像的映射关系。在很多实验数据中表明，它的效果比VQGAN-CLIP要真实，尤其是泛化能力还比不少用大量“文本-图像”数据对训练出来的模型要好很多。&lt;/p&gt;
&lt;p&gt;幻方AI最近复现了该项工作，并通过幻方自研的 &lt;a href=&quot;/blog/3fs&quot;&gt;3FS&lt;/a&gt;、&lt;a href=&quot;/blog/hf-reduce&quot;&gt;hfreduce&lt;/a&gt;、&lt;a href=&quot;/blog/hfnn&quot;&gt;算子&lt;/a&gt;，对模型训练和推导进行优化。我们在hfai数据仓库中开源了训练数据，模型代码，旨在帮助研究者和开发者们降低研究门槛。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文标题&lt;/strong&gt;：CLIP-GEN: Language-Free Training of a Text-to-Image Generator with CLIP&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文地址&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/abs/2203.00386&quot;&gt;https://arxiv.org/abs/2203.00386&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型仓库&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/clip-gen&quot;&gt;https://github.com/HFAiLab/clip-gen&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;模型介绍&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E4%BB%8B%E7%BB%8D&quot; aria-label=&quot;模型介绍 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型介绍&lt;/h2&gt;
&lt;p&gt;下图是 CLIP-GEN 模型的整体结构：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/4d8b13d7ab8a14111a037d8ceb9c5656/0f586/model.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 59.50920245398773%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAACVElEQVQoz1WTy2/TQBDG8y8DRwQC1HIAJNRDDxwQIApqiyqVFhD0hniUtin0pahqHo3zcmwnXtuJ4+f6h3aTBrrSyDvz7X7e+WamBJDnOWmazL4pRVFoU0vFkyTi/3WFd9od6g0DOTurYiW12dzc4N79u7RaTTzPpygkUkp9aHl5icXFBVzfxvLbhFGAup9nGbefHXJnaYc8ja8THhzs825tFce2EMLTgMynhNtb71l7+4YgFPRFhzidaDyKEx6+OOLlxiEyS64T5iOXUbcKMtOAzHOKWXqpsIgHrWlcQiELjWs/MAmty7kUKqtSLiWecBlYPTqOz9cTAyeYkI/G9I0K1WqZ8+Mz6vVzktFUS5HE1HoGlb1TLvd/0mrWiJJUY6UkSaicnXFUPsAeCrqOTxinFFmK6P2hb/yib/zGtc5IJ2P98jhLcO0KZr2MWd2l29zjqH5Kp3pMKUlzuhcnNH58ZBz4KicKKXXl4omHzCakocP3Tyu4Q1O/Is9SkGOyeMg4sAiDPo5wmIw8SnEcE/genZaBEALlKy2URdFUbOF5vH7+FHfQ036WTbXO8oJYZaMrwr+UVau4QqD2ypTwURpSNytIQqIcdso1ugN/WqgZ4WBk0naqc7Z5lXd3v7Gy8orhcKCDqsFlkTMQFp+/bLP1YZtG29TaqssalxJ/LLDdvvZ1szMjXF9f5dbNGwgxnE1HOtMq48njRywuPGASBvPWUASe52E0DcyeieM480EoZVmKaZrUqhf4vj+/dKVVt9PhslGf/+Rq7JRv27a2KIrmKf8F0+SIBTGDY1UAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;arch&quot;
        title=&quot;arch&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/4d8b13d7ab8a14111a037d8ceb9c5656/a6d36/model.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/4d8b13d7ab8a14111a037d8ceb9c5656/222b7/model.png 163w,
https://hfai-static.high-flyer.cn/static/4d8b13d7ab8a14111a037d8ceb9c5656/ff46a/model.png 325w,
https://hfai-static.high-flyer.cn/static/4d8b13d7ab8a14111a037d8ceb9c5656/a6d36/model.png 650w,
https://hfai-static.high-flyer.cn/static/4d8b13d7ab8a14111a037d8ceb9c5656/e548f/model.png 975w,
https://hfai-static.high-flyer.cn/static/4d8b13d7ab8a14111a037d8ceb9c5656/3c492/model.png 1300w,
https://hfai-static.high-flyer.cn/static/4d8b13d7ab8a14111a037d8ceb9c5656/0f586/model.png 1498w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;CLIP-GEN 模型主要由两部分组成，第一部分是一个 VQGAN 模型，用来学习如何把图像编码成一系列的图像标记（image tokens），通过这些图像标记解码还原成一张图片；第二部分是一个 condition transformer 模型，用来学习如何把文字的 CLIP embedding 映射到图像标记（image tokens）中。&lt;/p&gt;
&lt;p&gt;训练、推理的过程分为三步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;预训练 VQGAN&lt;/strong&gt;：输入图像，把图像编码到码本空间，然后再从码本空间解码为图像。经过预训练之后我们就能够把图像表示成一个图像标记（image tokens) 下的离散序列。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;训练 condition transformer&lt;/strong&gt;：通过第一步的预训练，我们已经能够通过图像标记（image tokens) 来生成图片了，在此基础上，我们训练一个 condition transformer，其旨在学习如何把图像的 CLIP embedding 映射到图像标记。训练的过程中 VQGAN 的参数保持不变。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文字生成图片&lt;/strong&gt;：由于在 CLIP 中，文字和图像共享同一个嵌入空间，我们可以直接把文字的 CLIP embedding 作为 condition transformer 的输入映射到图像标记上，然后通过 VQGAN 的 decoder 来生成图片&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;数据集&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E9%9B%86&quot; aria-label=&quot;数据集 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;数据集&lt;/h2&gt;
&lt;p&gt;对于 CLIP-GEN 的训练，我们采用了 COCO Caption 数据集，包含 20 万张图文对（训练的过程中没有使用文本）。我们把 COCO Caption 数据集转换成 ffrecord 格式，整合到了 hfai 数据仓库中，可以直接通过以下方式直接使用：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; hfai

dataset &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;datasets&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;CocoCaption&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;split&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;train&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; transform&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;transform&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;有关更多内容，可以访问 hfai 官方文档：&lt;a href=&quot;https://doc.hfai.high-flyer.cn/index.html&quot;&gt;https://doc.hfai.high-flyer.cn/index.html&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;模型训练与优化加速&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E8%AE%AD%E7%BB%83%E4%B8%8E%E4%BC%98%E5%8C%96%E5%8A%A0%E9%80%9F&quot; aria-label=&quot;模型训练与优化加速 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型训练与优化加速&lt;/h2&gt;
&lt;p&gt;幻方AI复现了GLIP-GEN模型，并验证其效果。通过幻方自研的 &lt;a href=&quot;/blog/3fs&quot;&gt;3FS&lt;/a&gt;、&lt;a href=&quot;/blog/hf-reduce&quot;&gt;hfreduce&lt;/a&gt;、&lt;a href=&quot;/blog/hfnn&quot;&gt;算子&lt;/a&gt;等优化工具，对模型训练和推导进行优化和加速，具体的包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;hfai ddp：采用 hfreduce 优化多机多卡通信&lt;/li&gt;
&lt;li&gt;hfai nn: 重构深度学习算子，提升性能&lt;/li&gt;
&lt;li&gt;hfai datasets: 采用高效数据样本格式 ffrecord，充分发挥 3FS 存储带宽性能&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面进行详细描述。&lt;/p&gt;
&lt;h3 id=&quot;hfai-ddp-通信加速&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hfai-ddp-%E9%80%9A%E4%BF%A1%E5%8A%A0%E9%80%9F&quot; aria-label=&quot;hfai ddp 通信加速 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;hfai DDP 通信加速&lt;/h3&gt;
&lt;p&gt;hfai DDP 内部采用了幻方自研的 hfreduce 高性能通讯框架，能有效提升模型的训练速度，使用方法只需要修改一行代码：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# from torch.nn.parallel import DistributedDataParallel&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parallel &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; DistributedDataParallel

&lt;span class=&quot;token comment&quot;&gt;# ...... initialize model&lt;/span&gt;

model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DistributedDataParallel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; device_ids&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;local_rank&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;hfai-nn-算子加速&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hfai-nn-%E7%AE%97%E5%AD%90%E5%8A%A0%E9%80%9F&quot; aria-label=&quot;hfai nn 算子加速 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;hfai nn 算子加速&lt;/h3&gt;
&lt;p&gt;为了进一步提升模型训练速度，我们可以使用 hfai.nn 里的高性能算子，相比于 PyTorch 能带来明显的提升，使用方法只需要增加一行代码：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; hfai

model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to_hfai&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 自动替换为 hfai 高性能算子&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;使用说明&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E&quot; aria-label=&quot;使用说明 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;使用说明&lt;/h2&gt;
&lt;p&gt;幻方AI将所复现的模型和优化的方法都进行了开源，统一归集到 hfai 模型仓库 (&lt;a href=&quot;https://github.com/HFAiLab/hfai-models&quot;&gt;https://github.com/HFAiLab/hfai-models&lt;/a&gt;) 中，欢迎大家来 star。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;下载 CLIP 预训练模型&lt;/strong&gt;：下载 CLIP 后放至 &lt;code class=&quot;language-text&quot;&gt;pretrained/clip_vit_b32.pt&lt;/code&gt;，该预训练模型来自 OpenAI.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;在 COCO 上训练 VQGAN&lt;/strong&gt;：通过 &lt;code class=&quot;language-text&quot;&gt;hfai python&lt;/code&gt; 提交任务至萤火集群&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hfai python train_vqgan.py --ds coco -- -n 1 -p 30&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;在 COCO 上训练 Conditional GPT&lt;/strong&gt;：通过 &lt;code class=&quot;language-text&quot;&gt;hfai python&lt;/code&gt; 提交任务至萤火集群&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hfai python train_gpt.py --ds coco --vqgan_ckpt /path/to/vqgan/ckpt -- -n 4 -p 30&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;训练结果&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AE%AD%E7%BB%83%E7%BB%93%E6%9E%9C&quot; aria-label=&quot;训练结果 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;训练结果&lt;/h2&gt;
&lt;p&gt;我们来看看训练完成后，一些文本生成图像的效果。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 515px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/bc486bb79ba778c0f311b4ffb327bf0d/f1bff/tower.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.44171779141104%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAED/9oADAMBAAIQAxAAAAHQnH1k8qE//8QAGxABAAICAwAAAAAAAAAAAAAAAwECBBIRITH/2gAIAQEAAQUCfLTimS1zJW1bu4+jEa//xAAWEQEBAQAAAAAAAAAAAAAAAAAAEgH/2gAIAQMBAT8BnUP/xAAWEQEBAQAAAAAAAAAAAAAAAAAAEgL/2gAIAQIBAT8BrK3/xAAhEAABAgQHAAAAAAAAAAAAAAAAAQMCERKBISIjM0Fykf/aAAgBAQAGPwKLM6izkmJVrpc33PRzuRJwXP/EABsQAAICAwEAAAAAAAAAAAAAAAERACExQZGx/9oACAEBAAE/IXwsgIBWosIb7CLZ9lKItKPYZDJTAj2tp//aAAwDAQACAAMAAAAQGB//xAAXEQEBAQEAAAAAAAAAAAAAAAABAEHw/9oACAEDAQE/EF+YRt//xAAaEQACAgMAAAAAAAAAAAAAAAAAEQEhMYHR/9oACAECAQE/EKsS9cEm0f/EABwQAQEAAwEAAwAAAAAAAAAAAAERACExUWGRsf/aAAgBAQABPxCHXdVO7osLz4ypOspAa09Hd47fCLjRrKerQWa0n1gA4aNCu/zFWr0c/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;tower&quot;
        title=&quot;tower&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/bc486bb79ba778c0f311b4ffb327bf0d/f1bff/tower.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/bc486bb79ba778c0f311b4ffb327bf0d/d2f63/tower.jpg 163w,
https://hfai-static.high-flyer.cn/static/bc486bb79ba778c0f311b4ffb327bf0d/c989d/tower.jpg 325w,
https://hfai-static.high-flyer.cn/static/bc486bb79ba778c0f311b4ffb327bf0d/f1bff/tower.jpg 515w&quot;
        sizes=&quot;(max-width: 515px) 100vw, 515px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 515px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/9b76838d5e23c99c8949f3c10f659ed2/f1bff/bus.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.44171779141104%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIFAwT/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAehNWZtEoX//xAAaEAADAQADAAAAAAAAAAAAAAACAwQBAAUU/9oACAEBAAEFAhfaaQrqZzr22bOE6so8aMxCFgH/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAfEAABBAICAwAAAAAAAAAAAAABAAIRIQMSBDEyQVH/2gAIAQEABj8C5EZJDXeW1hP1eIDLvpXo++y+VlGtHu0Yx+lDWwJ+r//EABoQAQADAQEBAAAAAAAAAAAAAAEAITERQVH/2gAIAQEAAT8h4wGo+bGo1fpfw1CFc9GJIYNvHV3KfHEa+xpqGp//2gAMAwEAAgADAAAAEFzf/8QAFhEBAQEAAAAAAAAAAAAAAAAAARBB/9oACAEDAQE/EFyf/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERQf/aAAgBAgEBPxBLSn//xAAbEAEBAAMBAQEAAAAAAAAAAAABEQAhMWFRQf/aAAgBAQABPxASkxM8++MCeZNWvEQIpunabzqgCcQlfv7Pc0FEKpseLrfzAPCeXg3u5VYJB0h7n//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;bus&quot;
        title=&quot;bus&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/9b76838d5e23c99c8949f3c10f659ed2/f1bff/bus.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/9b76838d5e23c99c8949f3c10f659ed2/d2f63/bus.jpg 163w,
https://hfai-static.high-flyer.cn/static/9b76838d5e23c99c8949f3c10f659ed2/c989d/bus.jpg 325w,
https://hfai-static.high-flyer.cn/static/9b76838d5e23c99c8949f3c10f659ed2/f1bff/bus.jpg 515w&quot;
        sizes=&quot;(max-width: 515px) 100vw, 515px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 515px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/d1522175e2ded2f79f2e2c625e0c877c/f1bff/train.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.44171779141104%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAALABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEAwX/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAL/2gAMAwEAAhADEAAAAaYH6GHIcb//xAAaEAADAAMBAAAAAAAAAAAAAAACAwQAARQS/9oACAEBAAEFAmOrHHXudZ11O2CVlVxz+J51aD//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAgEAACAgIABwAAAAAAAAAAAAABAgARAyETFCIjMkFR/9oACAEBAAY/AsbFmyIXNdyrjHDlOLfgTqE8xXroOo9r9jHhi5pBP//EAB0QAAICAgMBAAAAAAAAAAAAAAEhABExUUFxocH/2gAIAQEAAT8hV46FgNFoKB9oBOlADrMuEKlKfBjynyO4d3rsyn5fyf/aAAwDAQACAAMAAAAQTN//xAAVEQEBAAAAAAAAAAAAAAAAAAABEP/aAAgBAwEBPxAJ/8QAFxEAAwEAAAAAAAAAAAAAAAAAAAERMf/aAAgBAgEBPxB2Gn//xAAdEAEAAgICAwAAAAAAAAAAAAABESEAMVFxQWGh/9oACAEBAAE/EHXChQiDWC2jvWBOdGnQ9xkvI4u9cUQXCHneAYSZq+XFPTofV1j0IZtTcM//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;train&quot;
        title=&quot;train&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/d1522175e2ded2f79f2e2c625e0c877c/f1bff/train.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/d1522175e2ded2f79f2e2c625e0c877c/d2f63/train.jpg 163w,
https://hfai-static.high-flyer.cn/static/d1522175e2ded2f79f2e2c625e0c877c/c989d/train.jpg 325w,
https://hfai-static.high-flyer.cn/static/d1522175e2ded2f79f2e2c625e0c877c/f1bff/train.jpg 515w&quot;
        sizes=&quot;(max-width: 515px) 100vw, 515px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;可以看到，不利用带文本的图像数据集，CLIP-GEN 所生成的效果还是非常逼真的。&lt;/p&gt;
&lt;h2 id=&quot;体验总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%93%E9%AA%8C%E6%80%BB%E7%BB%93&quot; aria-label=&quot;体验总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;体验总结&lt;/h2&gt;
&lt;p&gt;CLIP-GEN 将对抗网络 GAN 用于改造 CLIP 模型，使得 CLIP-GEN 可以不依赖带文字描述的图片数据集，直接使用无文本图像数据集进行训练，这极大降低了数据收集的成本，推动了该领域研究的发展。通过预训练好的 CLIP 模型建立起文本和图像的映射关系，在很多实验数据中表明，CLIP-GEN 的效果比 VQGAN-CLIP 要真实，尤其是泛化能力还比不少用大量“文本-图像”数据对训练出来的模型要好很多。&lt;/p&gt;
&lt;p&gt;综合体验打分如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;研究指数：★★★★&lt;/p&gt;
&lt;p&gt;该模型是多模态领域的最新研究成果，降低了数据收集的成本，推动了该领域的发展。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开源指数：★★★&lt;/p&gt;
&lt;p&gt;代码没有开源，但所依赖的方法有其他开源版本，容易复现。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;门槛指数：★★★&lt;/p&gt;
&lt;p&gt;数据规模大，模型适中，适合多级多卡数据并行训练。一般单卡训练难度比较大。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通用指数：★★★★&lt;/p&gt;
&lt;p&gt;该方法适用于多模态研究场景，能在很多类似场景下应用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;适配指数：★★★★★&lt;/p&gt;
&lt;p&gt;依赖简单，很容易与幻方AI的训练优化工具结合，提效明显。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;幻方 AI 紧跟 AI 研究的前沿浪潮，致力于用领先算力助力AI落地与价值创造，欢迎各方数据研究者与开发者们一同共建。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[萤火跑模型 | 可变形的 Attention 助力 ViT 优化]]></title><description><![CDATA[Vision Transformer (ViT) 模型在各类视觉任务上都展现出了强⼤的性能。因其具有较⼤甚⾄增⼤到全局的感受野，ViT 相⽐卷积神经⽹络（CNN）能更好地对⻓距离依赖关系建模，特别是在⼤量训练数据的情况下，ViT 可以轻易扩展参数以达得 SOTA…]]></description><link>https://www.high-flyer.cn/blog/vit-dat/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/vit-dat/</guid><dc:creator><![CDATA[Gao Huang]]></dc:creator><pubDate>Mon, 11 Jul 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Vision Transformer (ViT) 模型在各类视觉任务上都展现出了强⼤的性能。因其具有较⼤甚⾄增⼤到全局的感受野，ViT 相⽐卷积神经⽹络（CNN）能更好地对⻓距离依赖关系建模，特别是在⼤量训练数据的情况下，ViT 可以轻易扩展参数以达得 SOTA 的实验结果。但是，ViT 里的 Attention 机制也是⼀把双刃剑，⼤量的 key/value 增加了不少计算量，使模型难于收敛，也增加了过拟合的⻛险。&lt;/p&gt;
&lt;p&gt;最近来自清华黄高课题组的研究者们对 ViT 模型中的 Attention 机制进行改进，提出了可变形的 attention 机制。研究者们让所有 query 都跟同⼀组 key 和 value 交互，通过对每个输⼊图像学习⼀组偏移量，移动 key 和 value 到重要的位置。这种设计不仅增强了 sparse attention 的表征能⼒，同时具有线性空间复杂度。&lt;/p&gt;
&lt;p&gt;该项目利用了幻方AI深度学习训练平台的算力及加速性能，在大量的场景下进行了实验对比，验证了所提方法的优异性能。在前不久闭幕的 CVPR 2022 视觉领域顶级学术会议上，该项工作进入了 Best Paper 奖项的候选角逐。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文标题&lt;/strong&gt;：Vision Transformer with Deformable Attention&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文地址&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/pdf/2201.00520.pdf&quot;&gt;https://arxiv.org/pdf/2201.00520.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型仓库&lt;/strong&gt;：&lt;a href=&quot;https://github.com/LeapLabTHU/DAT&quot;&gt;https://github.com/LeapLabTHU/DAT&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;模型介绍&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E4%BB%8B%E7%BB%8D&quot; aria-label=&quot;模型介绍 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型介绍&lt;/h2&gt;
&lt;h3 id=&quot;1-概述&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-%E6%A6%82%E8%BF%B0&quot; aria-label=&quot;1 概述 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. 概述&lt;/h3&gt;
&lt;p&gt;为了避免过量的 attention，现有工作采取了很多的稀疏化 Attention 的办法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Swin Transformer 设计了滑动窗口机制，每次在窗口内部计算 Attention；&lt;/li&gt;
&lt;li&gt;PVT 将 key/value 进行降采样来节约计算的开销&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;虽然这些方法十分有效，但是它们手工设计的 Attention 模式容易将与任务相关的 key 和 value 信息丢弃。例如 PVT 降采样会损失特征的细节，而 Swin Transformer 则丢弃了单个窗口之外的内容，不同窗口的交互仅依靠滑动窗口间接实现。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/3a9972c28c0d5f09b31e7bacbc257492/84ee5/1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 30.061349693251532%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABtklEQVQY0wXBW09SAQDAcT5Xn6Cn3vTRNqsHWS2l25ZTl2sjMZHpkKmAh7gEHO7COUBcBBROGAkaCZQYS2ZhJOa0p/bv91P1z0741evQ+9nmtNtkMPjBRafLYe0Lp98/c3xUpdVu0j5u0j35RqPZYq+u0O60uP57yeX1gPM/Z/R/dxlc9VElxQckXcPsBMZQQvdJRZ5TzwdQbFOkgjrCJSOBgp7MvgubbxxF1CEVlvHmtORqHkzRh0jhx+wnXmIOqlFtvhlF8au5qogcpXUkAhqqCSdl8yy9DxVqX/cQ5BlCWyYiG5P8S2UoFhUscR3R7VW8TjXnO2+5KHmwOEZQhWx32HaN04ivIQn3SAefsfluFat1mqicYzkcwRJ3E0yvsCFMk5DyGKX3rEvrRLJGZIeGXtZJQdQyJ4ygci4N45m/hWP+JvaFGyTcE1jDep7M3UXzepIXPhFLOoPZr0OjHWXi1RiPVmZYcE1hjyziXLqN3TDCrGGIp8YhVEpWJCebiQcXUTIWGrUk5WoJk6DHHhKwx2IUPx3w8aCMX3bjja0h511UDreo1XfJhE04fAZCWQeZ3QD/AUogbyFfnBNQAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;1&quot;
        title=&quot;1&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/3a9972c28c0d5f09b31e7bacbc257492/a6d36/1.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/3a9972c28c0d5f09b31e7bacbc257492/222b7/1.png 163w,
https://hfai-static.high-flyer.cn/static/3a9972c28c0d5f09b31e7bacbc257492/ff46a/1.png 325w,
https://hfai-static.high-flyer.cn/static/3a9972c28c0d5f09b31e7bacbc257492/a6d36/1.png 650w,
https://hfai-static.high-flyer.cn/static/3a9972c28c0d5f09b31e7bacbc257492/e548f/1.png 975w,
https://hfai-static.high-flyer.cn/static/3a9972c28c0d5f09b31e7bacbc257492/84ee5/1.png 1076w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;理想情况下，Attention 关注的位置应该根据输入变化，key 和 value 应该关注到输入图像中重要的部分，比如目标检测中的目标物体上。在 CNN 的工作中，可变形卷积（DCN）学习偏移的感受野已经表明非常有效。受此启发研究者们尝试探索 Attention 机制中的可变形结构的设计。&lt;/p&gt;
&lt;p&gt;然而，直接将 DCN 的机制实现到 ViT 的主干网络中并不是一个简单的问题，因为 Attention 需要计算每个 query 和其对应感受野内所有 key 的相似度，所以这种方案需要缓存每个 query 的 key 和 value。这样一来 Attention 的空间复杂度变为了平方量级，大部分的计算设备都无法接受这样的复杂度。研究者们巧妙地提出让所有 query 都跟同一组 key 和 value 交互，而通过对每个输入图像学习一组偏移量，移动 key 和 value 到重要的位置，最终实现可变形的 attention 机制。如上图 (d) 所示，研究者们提出的可变形 Attention 增强了 Sparse Attention 的表征能力，同时具有线性空间复杂度。&lt;/p&gt;
&lt;h3 id=&quot;2-方法&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%E6%96%B9%E6%B3%95&quot; aria-label=&quot;2 方法 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. 方法&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/f242546765871403669a7d1f1e2a2250/8ae78/2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 33.74233128834356%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAABjElEQVQoz02R0W/TMBCH+/8/8sIzEoKnItROUCWd1EI3NhDd2krbNGjpunZJaOIkbpo4sZNvipGAk06yzj//7vxdpyxLoigiyzKuzsb0T7p8mgwxWiOlJJUp2+UKp/uSgfOKwPdpoygKwjDE9zziOLa1pmnoGKMpq5K6rrkYjRgPXBy3j8ykbVRpzWa1pPfiNcN+j/ntjMMhIwgCdrsdfhBwzIt/hvwXm+UD08kF15dfKPKMKBJWdEglX0cLBoMz9t4WrQ1lqdDGcJSCaLekbhrr0bmaXnK9mCLTxBbsxIWmKmvq2tDKojBkMfvO5tGnKiuLoshzauD3wy1PM8c2tobv3r7hw8l77u5vkPKA1orlKsF1PYTIrCiOBOcfe3T7n9n5AWmSWObaNISP9zzNTxFC0O6j8218zsR1WP/6YR8rleN5Ket1ilJ/2LYLiIQgiQVKKfI8J8+PVKZmv7nDmw8thlbb2fsByT6k0cYathdKFRhTWk5FoWznqqpstmebqmVYs9/+xL+Z/P3yM4pGCuCH0YyVAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;2&quot;
        title=&quot;2&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/f242546765871403669a7d1f1e2a2250/a6d36/2.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/f242546765871403669a7d1f1e2a2250/222b7/2.png 163w,
https://hfai-static.high-flyer.cn/static/f242546765871403669a7d1f1e2a2250/ff46a/2.png 325w,
https://hfai-static.high-flyer.cn/static/f242546765871403669a7d1f1e2a2250/a6d36/2.png 650w,
https://hfai-static.high-flyer.cn/static/f242546765871403669a7d1f1e2a2250/e548f/2.png 975w,
https://hfai-static.high-flyer.cn/static/f242546765871403669a7d1f1e2a2250/8ae78/2.png 1096w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，可变形注意力（Deformable Attention）首先将输入的特征图 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;x&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.4306em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 线性映射为 query：&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;msub&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;q=xW_q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.625em;vertical-align:-0.1944em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.9694em;vertical-align:-0.2861em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.13889em;&quot;&gt;W&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1514em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.03588em;&quot;&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2861em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;。接下来，初始化一组均匀网格作为采样点的参考点 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;p&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.625em;vertical-align:-0.1944em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，偏移量由 query 通过子网络 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;mtext&gt;offset&lt;/mtext&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\theta_\text{offset}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8444em;vertical-align:-0.15em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.02778em;&quot;&gt;θ&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;offset&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 产生：&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;Δ&lt;/mi&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;tanh&lt;/mi&gt;&lt;mo&gt;⁡&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;θ&lt;/mi&gt;&lt;mtext&gt;offset&lt;/mtext&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\Delta{}p=s\tanh(\theta_\text{offset}(q))&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8778em;vertical-align:-0.1944em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;Δ&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mop&quot;&gt;tanh&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.02778em;&quot;&gt;θ&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;offset&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，&lt;/p&gt;
&lt;p&gt;其中 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;s&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.4306em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 为控制偏移量幅度的超参数。接下来，将偏移量加到参考点上得到采样点坐标，使用双线性插值对原特征图进行采样：&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent=&quot;true&quot;&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;~&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;ϕ&lt;/mi&gt;&lt;mtext&gt;bilinear&lt;/mtext&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo separator=&quot;true&quot;&gt;;&lt;/mo&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;Δ&lt;/mi&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\tilde{x}=\phi_\text{bilinear}(x;p+\Delta{}p)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.6679em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord accent&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.6679em;&quot;&gt;&lt;span style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.35em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;accent-body&quot; style=&quot;left:-0.2222em;&quot;&gt;&lt;span class=&quot;mord&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;ϕ&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;bilinear&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;Δ&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，&lt;/p&gt;
&lt;p&gt;其中 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;ϕ&lt;/mi&gt;&lt;mtext&gt;bilinear&lt;/mtext&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mo separator=&quot;true&quot;&gt;;&lt;/mo&gt;&lt;mo&gt;⋅&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\phi_\text{bilinear}(\cdot;\cdot)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;ϕ&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;bilinear&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;⋅&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 表示双线性采样操作，第一个操作数为特征图，第二个操作数为采样点坐标。具体来说，双线性插值的实现如下图所示。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/64e89c978e6fb0895b827950e69b7c9c/84ee5/3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 29.447852760736193%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA7klEQVQY052QUU+DMBSF+f9/zfii0c242S1QSsso0ALboOUzYKbRxAc9N19ubm5ycnISozWbh0es0Thn2e+2HA6CECKL5nnmL0rOw8D+/g75+oQu3lDpM66tv5nFGFdCCMzLzF/EuGw+76QfeqRPOVrNUdWkpsX5njBNZFlGWZacTie01iilideGppLIXGF0gXUdRd2TS0kmJcn5cubFbNGDI6+vCO1pfb8mG8dx5ZZwnAKTb2lNQa4UpSlpLx7ZGbQqPgx959mXO2RToeoru6zCNo7/KqmqCiEE1lq6rkOIA2marX3devyNn//F8B1nws9GtempHwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;3&quot;
        title=&quot;3&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/64e89c978e6fb0895b827950e69b7c9c/a6d36/3.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/64e89c978e6fb0895b827950e69b7c9c/222b7/3.png 163w,
https://hfai-static.high-flyer.cn/static/64e89c978e6fb0895b827950e69b7c9c/ff46a/3.png 325w,
https://hfai-static.high-flyer.cn/static/64e89c978e6fb0895b827950e69b7c9c/a6d36/3.png 650w,
https://hfai-static.high-flyer.cn/static/64e89c978e6fb0895b827950e69b7c9c/e548f/3.png 975w,
https://hfai-static.high-flyer.cn/static/64e89c978e6fb0895b827950e69b7c9c/84ee5/3.png 1076w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;在此基础上，变形后的 key 和 value 分别通过 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent=&quot;true&quot;&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mo&gt;~&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mover accent=&quot;true&quot;&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;~&lt;/mo&gt;&lt;/mover&gt;&lt;msub&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\tilde{k}=\tilde{x}W_k&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.9313em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord accent&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.9313em;&quot;&gt;&lt;span style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03148em;&quot;&gt;k&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.6134em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;accent-body&quot; style=&quot;left:-0.25em;&quot;&gt;&lt;span class=&quot;mord&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8333em;vertical-align:-0.15em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord accent&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.6679em;&quot;&gt;&lt;span style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.35em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;accent-body&quot; style=&quot;left:-0.2222em;&quot;&gt;&lt;span class=&quot;mord&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.13889em;&quot;&gt;W&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.03148em;&quot;&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 和 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mover accent=&quot;true&quot;&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mo&gt;~&lt;/mo&gt;&lt;/mover&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mover accent=&quot;true&quot;&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;~&lt;/mo&gt;&lt;/mover&gt;&lt;msub&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\tilde{v}=\tilde{x}W_v&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.6679em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord accent&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.6679em;&quot;&gt;&lt;span style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;v&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.35em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;accent-body&quot; style=&quot;left:-0.2222em;&quot;&gt;&lt;span class=&quot;mord&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8333em;vertical-align:-0.15em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord accent&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.6679em;&quot;&gt;&lt;span style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;x&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.35em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;accent-body&quot; style=&quot;left:-0.2222em;&quot;&gt;&lt;span class=&quot;mord&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.13889em;&quot;&gt;W&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1514em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.03588em;&quot;&gt;v&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 得到。常见于 ViT 中的位置编码则通过采样一张相对位置编码表 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mover accent=&quot;true&quot;&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo&gt;^&lt;/mo&gt;&lt;/mover&gt;&lt;mtext&gt;rpb&lt;/mtext&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\hat{B}_\text{rpb}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.2329em;vertical-align:-0.2861em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord accent&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.9468em;&quot;&gt;&lt;span style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.05017em;&quot;&gt;B&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.2523em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;accent-body&quot; style=&quot;left:-0.1667em;&quot;&gt;&lt;span class=&quot;mord&quot;&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;rpb&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2861em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 得到，&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mover accent=&quot;true&quot;&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo&gt;~&lt;/mo&gt;&lt;/mover&gt;&lt;mtext&gt;rpb&lt;/mtext&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;ϕ&lt;/mi&gt;&lt;mtext&gt;bilinear&lt;/mtext&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mover accent=&quot;true&quot;&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo&gt;^&lt;/mo&gt;&lt;/mover&gt;&lt;mtext&gt;rpb&lt;/mtext&gt;&lt;/msub&gt;&lt;mo separator=&quot;true&quot;&gt;;&lt;/mo&gt;&lt;mi&gt;R&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/msub&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mover accent=&quot;true&quot;&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mo&gt;~&lt;/mo&gt;&lt;/mover&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;\tilde{B}_\text{rpb}=\phi_\text{bilinear}(\hat{B}_\text{rpb};R(p_q,p_{\tilde{k}}))&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.2063em;vertical-align:-0.2861em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord accent&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.9202em;&quot;&gt;&lt;span style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.05017em;&quot;&gt;B&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.6023em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;accent-body&quot; style=&quot;left:-0.1667em;&quot;&gt;&lt;span class=&quot;mord&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;rpb&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2861em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.2539em;vertical-align:-0.3071em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;ϕ&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;bilinear&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord accent&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.9468em;&quot;&gt;&lt;span style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.05017em;&quot;&gt;B&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.2523em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;accent-body&quot; style=&quot;left:-0.1667em;&quot;&gt;&lt;span class=&quot;mord&quot;&gt;^&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;rpb&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2861em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.00773em;&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1514em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.03588em;&quot;&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2861em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3448em;&quot;&gt;&lt;span style=&quot;top:-2.3929em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord accent mtight&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.9313em;&quot;&gt;&lt;span style=&quot;top:-2.7em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.03148em;&quot;&gt;k&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.3134em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;accent-body&quot; style=&quot;left:-0.25em;&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3071em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，&lt;/p&gt;
&lt;p&gt;其中 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;R&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/msub&gt;&lt;mo separator=&quot;true&quot;&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mover accent=&quot;true&quot;&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mo&gt;~&lt;/mo&gt;&lt;/mover&gt;&lt;/msub&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;R(p_q,p_{\tilde{k}})&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.0571em;vertical-align:-0.3071em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.00773em;&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1514em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.03588em;&quot;&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2861em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mpunct&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3448em;&quot;&gt;&lt;span style=&quot;top:-2.3929em;margin-left:0em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord accent mtight&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.9313em;&quot;&gt;&lt;span style=&quot;top:-2.7em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.03148em;&quot;&gt;k&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.3134em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;accent-body&quot; style=&quot;left:-0.25em;&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3071em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 表示计算 query 和变形后的 key 的相对位置。最后多头注意力中的每个头的输出 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;z&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;z^{(m)}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.888em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.04398em;&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.888em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 如下式计算：&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;z&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mtext&gt;softmax&lt;/mtext&gt;&lt;mrow&gt;&lt;mo fence=&quot;true&quot;&gt;(&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;msup&gt;&lt;mover accent=&quot;true&quot;&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mo&gt;~&lt;/mo&gt;&lt;/mover&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;⊤&lt;/mi&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;msqrt&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/msqrt&gt;&lt;/mfrac&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msub&gt;&lt;mover accent=&quot;true&quot;&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;mo&gt;~&lt;/mo&gt;&lt;/mover&gt;&lt;mtext&gt;rpb&lt;/mtext&gt;&lt;/msub&gt;&lt;mo fence=&quot;true&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;msup&gt;&lt;mover accent=&quot;true&quot;&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mo&gt;~&lt;/mo&gt;&lt;/mover&gt;&lt;mrow&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;z^{(m)}=\text{softmax}\left(\frac{q^{(m)}\tilde{k}^{(m)^\top}}{\sqrt{d}}+\tilde{B}_\text{rpb}\right)\tilde{v}^{(m)}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.888em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.04398em;&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.888em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:2.4em;vertical-align:-0.95em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord text&quot;&gt;&lt;span class=&quot;mord&quot;&gt;softmax&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;minner&quot;&gt;&lt;span class=&quot;mopen delimcenter&quot; style=&quot;top:0em;&quot;&gt;&lt;span class=&quot;delimsizing size3&quot;&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mopen nulldelimiter&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mfrac&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.297em;&quot;&gt;&lt;span style=&quot;top:-2.5335em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord sqrt mtight&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.9378em;&quot;&gt;&lt;span class=&quot;svg-align&quot; style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mtight&quot; style=&quot;padding-left:0.833em;&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-2.8978em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;hide-tail mtight&quot; style=&quot;min-width:0.853em;height:1.08em;&quot;&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;400em&quot; height=&quot;1.08em&quot; viewBox=&quot;0 0 400000 1080&quot; preserveAspectRatio=&quot;xMinYMin slice&quot;&gt;&lt;path d=&quot;M95,702
c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14
c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54
c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10
s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429
c69,-144,104.5,-217.7,106.5,-221
l0 -0
c5.3,-9.3,12,-14,20,-14
H400000v40H845.2724
s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7
c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z
M834 80h400000v40h-400000z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.1022em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.23em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;frac-line&quot; style=&quot;border-bottom-width:0.04em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.4461em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.03588em;&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.9667em;&quot;&gt;&lt;span style=&quot;top:-2.9667em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.5357em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord accent mtight&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.9313em;&quot;&gt;&lt;span style=&quot;top:-2.7em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.03148em;&quot;&gt;k&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.3134em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;accent-body&quot; style=&quot;left:-0.25em;&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.2156em;&quot;&gt;&lt;span style=&quot;top:-3.2156em;margin-right:0.0714em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7846em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size3 size1 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:1.0984em;&quot;&gt;&lt;span style=&quot;top:-3.0984em;margin-right:0.1em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.6944em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mtight&quot;&gt;⊤&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.538em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose nulldelimiter&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord accent&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.9202em;&quot;&gt;&lt;span style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.05017em;&quot;&gt;B&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.6023em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;accent-body&quot; style=&quot;left:-0.1667em;&quot;&gt;&lt;span class=&quot;mord&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord text mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;rpb&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.2861em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mclose delimcenter&quot; style=&quot;top:0em;&quot;&gt;&lt;span class=&quot;delimsizing size3&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.1667em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord accent&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.6679em;&quot;&gt;&lt;span style=&quot;top:-3em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.03588em;&quot;&gt;v&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;top:-3.35em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:3em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;accent-body&quot; style=&quot;left:-0.2222em;&quot;&gt;&lt;span class=&quot;mord&quot;&gt;~&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.888em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mopen mtight&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;mclose mtight&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，&lt;/p&gt;
&lt;p&gt;其中 &lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;d&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.6944em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot;&gt;d&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 为每个头的特征维度，与常规 Transformer 中相同。&lt;/p&gt;
&lt;p&gt;与 DCN 类似，将设计好的可变形注意力模块加入到 ViT 模型的最后两个阶段，得到 Deformable Attention Transformer，如下图所示。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/0c00ecefd7c380deb9fecc1fdca3d891/84ee5/4.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 19.018404907975462%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAAsTAAALEwEAmpwYAAABB0lEQVQY0x3MSU7CYABAYS7rGVx7AfduTDyDJiYujGGoFsKgQKW/gp1oa0dKZwp9RpYv+fI6qjEiTh1ocooix/djsjTndMg51gVBlBCHOw5VcTZxkhH9ehRZdu48Lwg8n30UcWpbOo/DOx5eb0hED9MykUeCjTAI1jKxpTBRbJZTgW+qJN8SKyNE9CV8UyMWXSzHZS5/4Cpzmv/h5fUFt/dXpF8DNF1DeluhLtd4YkCoz5HfdWZDBednQSx6LDYeny9dtmuVaPWMZm6ZSROM6Ziyaej0x084gQZVQlmVbG2PZJfSlDuOdU4YZ9iWS11mtNWOfV7j6gZFlnIqI6q6xrFs0jCkBf4AJrQksSwQw7EAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;4&quot;
        title=&quot;4&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/0c00ecefd7c380deb9fecc1fdca3d891/a6d36/4.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/0c00ecefd7c380deb9fecc1fdca3d891/222b7/4.png 163w,
https://hfai-static.high-flyer.cn/static/0c00ecefd7c380deb9fecc1fdca3d891/ff46a/4.png 325w,
https://hfai-static.high-flyer.cn/static/0c00ecefd7c380deb9fecc1fdca3d891/a6d36/4.png 650w,
https://hfai-static.high-flyer.cn/static/0c00ecefd7c380deb9fecc1fdca3d891/e548f/4.png 975w,
https://hfai-static.high-flyer.cn/static/0c00ecefd7c380deb9fecc1fdca3d891/84ee5/4.png 1076w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;实验&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%AE%9E%E9%AA%8C&quot; aria-label=&quot;实验 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;实验&lt;/h2&gt;
&lt;p&gt;研究者们在 ImageNet-1K 图像分类、MS-COCO 目标检测和实例分割、ADE20K 语义分割三个重要的视觉任务上进行实验，数据集皆使用幻方 AI 整理提供的数据集仓库 &lt;code class=&quot;language-text&quot;&gt;hfai.datasets&lt;/code&gt;，详情可以参考：&lt;a href=&quot;https://doc.hfai.high-flyer.cn/api/datasets.html&quot;&gt;https://doc.hfai.high-flyer.cn/api/datasets.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;运行以上实验需要大量计算资源。研究者们与幻方 AI 合作，采用一系列幻方 AI 自研的&lt;a href=&quot;https://doc.hfai.high-flyer.cn/index.html&quot;&gt;深度学习套件&lt;/a&gt;，优化模型提升训练速度，在幻方萤火集群上获得了快速的训练迭代。接下来的几个表格展示了最终的实验结果：&lt;/p&gt;
&lt;p&gt;ImageNet-1K 图像分类&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 569px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/c023efac1e17d0a2f65f8331a31b1cab/854dc/5.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 113.49693251533743%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAXCAYAAAALHW+jAAAACXBIWXMAAAsTAAALEwEAmpwYAAADsElEQVQ4y12V6U4qWxCFef/X8J/GIeaoMQ6JB+KEAoIKLXRDNw0yHebJRlg3X5nmnns72emhaletWrVqd6LRaCgMQ9Xrdbs/Pz9rd3dXR0dHOj4+1tXVlfb29nR+fq7Dw0OzHRwc6OTkRK7rqtlsKggC299qtZTwfV+VSkUE5ppNZ7q/v9fLy4stNnmep0KhoFKppGKxqEwmY3cAYJtMJvY8m82UeH9/V+4lJ6fkyOt7anab6vf6cj1X2MbjsXq9ngUk6XA4tO8fHx/qdruGjHfu0+lUCdBhbHVaKowKGkwG0kZWRow6iiLzIfB6vdbb25vZvr+/bZXLZUPJlYCDarUqr+qpPC5rOB5qFa1U82uq1WrmtFwubROIVquVlQ6ir68vLRYLS0YlFhAOHMdRxasoHIWaz+aKVpFtACXXfD43HwKCKA4IcpBho9xtQM/11Gw11Rg0tIyW5hh3jytG0el0tNlsrGQCgpZG4DcajX4CUhYNqFaqcheu/D++VsuV6P7fCOOSSUaDsEHFYDAwX3xIlkBfZ2dnpj9DVQvM4fHxUel02rQFx6lUahvo5uZG2WzWSkWrd3d3ur29NdQmm0w2o8xTRs7AkRM6Gv4Zms6wkbndbuvp6ck0ByKSwWO/3zf9kYhgpsPPz09DgNFZOOpNetqsN2p32ub0N4cEQzY8Uw0NImEsIeMQHZLBrbryhp4m44nxBLcxh2QGLUixgR4bskEuIN/KBshkcMuu/Jmv7qir9fdaQT34T1NARRV09vX11UoFLY2hQpJaQOb14eFBpWJJ/sRX0A40Ho2NcIKAggmhaTQL3cEnXTeaHMdkRAISJy4vL+0kwSlshD8SqlbtACARXEFLMplULpezoNfX15aA0nmm48nfv60iEzbZim9FlWdl1Xt1RcvINrK4mAJ8eKdEAvAMn7FGt7NMVBaw/aGv6WRqPP1f2JRP1+EtlgkBaQZH3Hb0MFBi8bWoyrKioB9oHa3lB/8GjBHG4wbvcIZUQEyVcG0BOZF/nfxSKpky7dWCmjnDFzwybkiISeEdG3vy+bxxy6QgdA5lbAnI5UPmOaNypyw3cNVpd2wDi6EnIGMYa5HgUMRQxCc4PnQ9gQaZV3ToRq7CYSitpXpYtw7HwqYsAnAAoMPYxjuUwa2VDArgMsvNeVNhN9RsMrNZpRHwxLGFX9xN/GkEowhC0AKKEU3Ef7LT01Pls3mlH9NGAdq8uLj40VgyaX9B3rGxBx75vrOzY3v39/et9H8AV2aHUU0erzgAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;5&quot;
        title=&quot;5&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/c023efac1e17d0a2f65f8331a31b1cab/854dc/5.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/c023efac1e17d0a2f65f8331a31b1cab/222b7/5.png 163w,
https://hfai-static.high-flyer.cn/static/c023efac1e17d0a2f65f8331a31b1cab/ff46a/5.png 325w,
https://hfai-static.high-flyer.cn/static/c023efac1e17d0a2f65f8331a31b1cab/854dc/5.png 569w&quot;
        sizes=&quot;(max-width: 569px) 100vw, 569px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;COCO 目标检测：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 543px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/a780a4b996bdd7ea8f576ac5c6b83afe/29579/6.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.4601226993865%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsTAAALEwEAmpwYAAACEUlEQVQ4y1WU12pDQQxE9/+/x2CwcS/XvffeezfGjxOOYEPyoFyvdiTNjJa45/Mp4nQ6KRqNWsTjcaXTaSUSCcViMWWzWYXDYctxrlarCoJAkUhEpVJJ1+tVt9tNr9dLbr/f63A4aLVaaTabaTweq9frab1ea7FYqN/v63K52P1ut/v9Ho9HLZdLu6PZ4/HQ/X6Xo6BWq2k0Gllxp9PRdDpVu91Wt9u1poPBQMPhUPP53AZOJhPDMpgcd5wh55hEMAmGgLGApgC+368xgRVxPp9NIjjw1KIG5rB0XiZgmsCG5kwEiByK8ZizbwwzmvhmKAHrvOHIrtfrKpfLJiWXy6nZbFqzSqViiyDAYAe5fD6vRqNhNSwH2xz6W62WTQAIgKk0A7Ddbs1XVHBGEVgI+DruCLAOT6BKkADwfr9NEv58Ph+TiA188YkafPW+4TV3eO9gUigUbFMw8QyR5r0ljw2EZ0odPvuNg4G9wyseMg38g+WSR8yZJRWLRfOJMzKRSw4fIcAXPAMdMmHE495sNrZp5MGYO+RjA0yRCQ57+A078tRzNsnJZFKhUMgYEJlMxpYDaxghj23CikAqjLAJdZ4ttQxw/MEX/+KR67dMHsOR7bcJnmDo3zx1sHf8YAJSuQCIdNiRY9OYjiQ8ogm/Ye6X9q8hD5v/GjRFBmdkpFIpe6wwZVFI4kswDLyX7OsY/ANJQyW2zdwwUQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;6&quot;
        title=&quot;6&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/a780a4b996bdd7ea8f576ac5c6b83afe/29579/6.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/a780a4b996bdd7ea8f576ac5c6b83afe/222b7/6.png 163w,
https://hfai-static.high-flyer.cn/static/a780a4b996bdd7ea8f576ac5c6b83afe/ff46a/6.png 325w,
https://hfai-static.high-flyer.cn/static/a780a4b996bdd7ea8f576ac5c6b83afe/29579/6.png 543w&quot;
        sizes=&quot;(max-width: 543px) 100vw, 543px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 601px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/a15b12788fb6f210f131a2a02a8793c3/d8f62/7.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 65.03067484662577%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAABuklEQVQ4y22T2dKiQAyFef/XUhllfkUEZGtEVFzxwifI1BcIY03Nxamk0+nkZGnv9XrJ7XaT+/0uzjlZr9cSRZFst1vZhKHqYRjKbreTOI5VxydJErXleS7EeDwe0vdv8aqqkrIsFXVdS9M0GvxyuSg4H49HRdu2k346nfRsOLWtXLpOvP1+r1kIDMPD4SCv51OdqjEJybCbji+62ewdbzyoExQUxRAYhjArikKKopQ8z9ROYvyGoE4l99wBDTgEKhTG5DkyJKhz9cS+ck79jJ0zpk2jklZ4NJgB0HzLDsNDXSsjAmRZNrIZdEuODv5WWAxDIXqapuL7C1kul/L750flYrEQ3/fVvloF8sv31Tafz2U2m8kqCNQvTRMdEvD6vtcSu66T8/msk71erwpWAckdEuas2G28ww5Ym/f7LZ/PR7wo2iq7JE2VPoxJQP/KshiGkWXaQ8qkDVRkduu/bYr33R8bCkwYCkG+1wIdv3/tJEfqUBiIbn0cT02mLBxs4Wn499rYYJDY7KwMcUjHCVlWSqbBw69opXZOdVtsY2j+dp7WJggC2WzW03+lBDLTW4Dd/q75/A+szR/jjp0VzmI0rwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;7&quot;
        title=&quot;7&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/a15b12788fb6f210f131a2a02a8793c3/d8f62/7.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/a15b12788fb6f210f131a2a02a8793c3/222b7/7.png 163w,
https://hfai-static.high-flyer.cn/static/a15b12788fb6f210f131a2a02a8793c3/ff46a/7.png 325w,
https://hfai-static.high-flyer.cn/static/a15b12788fb6f210f131a2a02a8793c3/d8f62/7.png 601w&quot;
        sizes=&quot;(max-width: 601px) 100vw, 601px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;ADE20K 语义分割：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 614px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/c5ee85d2b61fc2d81a218a9aada9d4c0/e9131/8.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 87.11656441717791%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsTAAALEwEAmpwYAAACR0lEQVQ4y02UVw/CMAyE8///Dw8UkNhQ9t57iw0PiCUZfZZcUSlKmp5953NS9/l8hMFzuVyk0WhIr9eTfr8vrVZLqtWqdDodqdVqMpvNZLlcymg0kna7rVhieF6vl3y/X3HT6VSKxaI0m01NMhwOdc3MGI/HslgsNCmDdxJtNhshFky321XC0+kk7v1+y2Aw0I+wAbQABkqez6dst1tVTtBkMtFvqCXhbrfTvePxKI7NaDQq+XxeFZKANcGUnEwmNRAV5XJZMZFIRHzfV2KqAce3+XwuDmbkMlCJP1hAaXhWqVSUmX0wBDGjjD0SQo4QVLvD4RAkxCuSGBtrmoIVrFFCEOpQbP5RLv5SugMQDocll8tpOZSRyWQUwDqVSmly3kulks6e5ykG9ShkZLNZrco9Hg+VDMvtdlO/ULterzVRvV4XMKgHR0WUCo4YVK5WK22sNoVSMJnGoAgFsFlTUG7lopASwYPBDsiJA6dNOZ/PKhm5bJAIAOXDip/X61VVoRaLSG4HHDyExKDeYSR+ACYpyWFFCWA7sBBYl9PptHYVQpLbzIlxeGXySYLRhUIhOGOcSRRYU/CMRpHcyMHSeXDufr8HZ4lyjM2uHgGUgvF2K0iOUppig3is0ZtixwYmVMCGBahFPeVCyoGn1FAopFXgL3iw2AahI6s1gOQWzDvM/wpJhkWo2e/3wY/DfhL6cwDAkYnH48FvCnaS8m63BgLUkCwWi6m3WPN/lyF1NCKRSGhplMrMIIDB2mzAFsqmKYZnj9lu1w+N6q4Szfn6IgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;8&quot;
        title=&quot;8&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/c5ee85d2b61fc2d81a218a9aada9d4c0/e9131/8.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/c5ee85d2b61fc2d81a218a9aada9d4c0/222b7/8.png 163w,
https://hfai-static.high-flyer.cn/static/c5ee85d2b61fc2d81a218a9aada9d4c0/ff46a/8.png 325w,
https://hfai-static.high-flyer.cn/static/c5ee85d2b61fc2d81a218a9aada9d4c0/e9131/8.png 614w&quot;
        sizes=&quot;(max-width: 614px) 100vw, 614px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;可以看到研究者们提出的 DAT 在不同大小的模型上均有很好的表现。&lt;/p&gt;
&lt;h2 id=&quot;可视化&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%8F%AF%E8%A7%86%E5%8C%96&quot; aria-label=&quot;可视化 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;可视化&lt;/h2&gt;
&lt;p&gt;为了验证 DAT 的有效性，研究者们展示了一些来自 MS-COCO 验证集的样例。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/9ae545e6e34925e457099f214d452e80/0012b/9.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 94.47852760736197%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFV0lEQVQ4yx3M+VvThwHA4W9FJByBECVATDgCtBVEFI9OR1GhAaQCclMEiihByAUmHDk4JChUSEVQUSzrNI9Aebrh0ynP7CxOWxTq1IJzSmdbaZ3bmJ3b7A8+z3747Hn2/gGvMP27CeYfPuY/C9f5bqKEfz6+xfOf/svi4iKzcw+5P/8DDx895dG3T1l48oyZ6VmGTxxj4ZMyvvrDPW5cn+XKlRmuzzxg8otZhBfPf+TlS5i72sHtkZ/z7O//4Pm/X/K3xX8xc2uW+a+/ZWHhCU9++At//maBu7fnmZu+yedn4pkctzJz5xumrn3JxKefMzx2CeHli5+YvjGB60Q6L76f4tnjO9z9tJUfv/8j03e+5sGDR9y795C5uT9x/8F33P3iMvc/c3LjylH6+/I5NXaJ3/76IiPDH3H27ChCT28r9jNmTnxo4NrNWT4ZsfLVRDl/fbrItclJRkfH+aVrnM+uTnNtao4rE5e4+ftJrk/N0HS0GktfH2OuC3xw9mMGTrsQ9N1amoeMJKatp7Qkjct9a+i2pdLe1Y1OU8zusgrqLYc5fWqIgUEXg4MjnD//G+zHu6l3WjF1NXPYcYw2Rw/Nrd0ITaN9aG25xK9VYq6KZnwwkTR1BBUVBby1q4TMwj3oa5tobenB1uKky9FHh6MHV18JLc0d9Dp2ckBbja6ujf3aBoTu8zZ6m1LprI7nyKl3sR+vpUufxpCzgZRdhSRlFKLbV8DFTjVHDWl0GjSMOTW4OrOp2WvGad9Lc6MZg6kdnd6CcGZEx7neIk67qjGMdtL+CwtDrVl8cOQASekFJL1dQH52FrqyYrRluRh3p3BSH4uzZjP2qgqqNRYq92p5Z3cNeUX7Ec4NFND/Xh5NJ+uwHK/h2PuFdJozcDq05OTnkZ2bTXrObjLyS0nPLSVpZxGJqbvYkbmDzNxM3s7JprQ0j6yCEhqqdyK8GhGKIjSQsAg5qzYoid8aSsgaOa8mhxK+RcGKiADk64KJSFWiUisIS1BhbkmlyrwCvS0MQ3MIhmYF++qX8+EhGYLIxwtBEHCXeBAUvxwfhSeS132JylASECdh6fIlBK7xR7rJC8kGEeJYX8xtCWgsHlRallJlE9Da3Kg5IMZq9keQBktZ6uOONNKf6MRwVHHBRCeo2JQTizJORtmOIHa+GU7yZiUxsSt4LTGcxve2/j8yOHxp7JGht0txOmSc65YhKFbJWebjgTJmJfHboliXGIEiRob/SjHyKClVeSqG+9OZHslgY8J6oqKDsXWlYmz3Q2eWUK4VcfyQwOXTHtS2+CJExofjF+yLPCqQhLTXUK0ORCRehqdkGQHBYpRyCe/kxjA+dYK9re1IfbyoP6jG1OaB3uSF9YDAlyc96G57hT11bghhq0OJ3BhO5NqVbH4rkiCVlCXuS5AE+SCTeVOULKNSn8XZsXpcw82kvbGSxo7taBrdONLhx4WxVE71hlBr9cbeIkLwl0nwC/ImKELK6g1hRMcp8PYVIfbzQh7gS3HSCrLyNmIxJNNvWsvFvhRa+grIqxI42q/m1s3DmKzuGJs8abR5IEgD/PHxFyHy9kAZLGbN64HIFRJiYgLYoY5EkxOGtWYtB9sKGThZTtdgEw3OYjLeFegdSGH+qgZjo5hKnRulOncET09PhFcEAgJERESIWb9ehlotJz8/jHr9OgpzVGRuk5L5MynFGZG8uXUDxoZEcioEDh0MYer2APbOWCr3C+zRuSFs374JdWocxSVbqNEmYa5XYzKlYDQm0VCXTJ0xmX2V2ygv20J50Trydr3Boa4iKg0qHNYYbkwP8asLdkzGEDS1q/gfHhxMduY47/IAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;9&quot;
        title=&quot;9&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/9ae545e6e34925e457099f214d452e80/a6d36/9.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/9ae545e6e34925e457099f214d452e80/222b7/9.png 163w,
https://hfai-static.high-flyer.cn/static/9ae545e6e34925e457099f214d452e80/ff46a/9.png 325w,
https://hfai-static.high-flyer.cn/static/9ae545e6e34925e457099f214d452e80/a6d36/9.png 650w,
https://hfai-static.high-flyer.cn/static/9ae545e6e34925e457099f214d452e80/0012b/9.png 661w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，图中橙色圆形表示移动后的部分具有较高 Attention Score 的 key，圆形大小表示累积的 Attention 分数大小，该分数越大，圆形越大。该结果表明 DAT 学习关注到了输入图像中的重要部分。&lt;/p&gt;
&lt;h2 id=&quot;总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%80%BB%E7%BB%93&quot; aria-label=&quot;总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;总结&lt;/h2&gt;
&lt;p&gt;DAT 方法的提出，进一步推动了 ViT 模型的落地实践。研究者们创造性提出的可变形 Attention 方案，极大降低了 ViT 的训练成本，提升模型的效果。同时，研究者采用幻方 AI 的一系列深度学习自研套件，极大加速了模型的训练过程，获得了大量的实验结果。我们欢迎更多优秀的课题与幻方合作，一道推动 AI 技术的发展与落地。&lt;/p&gt;
&lt;p&gt;综合体验打分如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;研究指数：★★★★&lt;/p&gt;
&lt;p&gt;该模型是 ViT 模型的改进研究，推动了视觉 AI 技术的落地实践。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开源指数：★★★★★&lt;/p&gt;
&lt;p&gt;数据和代码都进行了完整且规整的开源。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;门槛指数：★★★&lt;/p&gt;
&lt;p&gt;数据规模大，模型适中，适合多级多卡数据并行训练。一般单卡训练难度比较大。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通用指数：★★★★&lt;/p&gt;
&lt;p&gt;该方法能适用于很多视觉场景。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;适配指数：★★★★★&lt;/p&gt;
&lt;p&gt;依赖简单，很容易与幻方 AI 的训练优化工具结合，提效明显。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;幻方 AI 紧跟 AI 研究的前沿浪潮，致力于用领先算力助力 AI 落地与价值创造，欢迎各方数据研究者与开发者们一同共建。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[hfai workspace | 打通本地与萤火之间的任督二脉]]></title><description><![CDATA[最近，幻方 AI 发布了其沉淀多年的深度学习套件 hfai ，吸引了众多同行研究员和开发者们咨询试用。其中，不少用户朋友对 hfai 中一些功能不太熟悉，使用上存在疑惑，或者仅仅使用了其中非常少的一部分功能。如果说我们把 hfai…]]></description><link>https://www.high-flyer.cn/blog/hfai_workspace/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/hfai_workspace/</guid><dc:creator><![CDATA[High-Flyer]]></dc:creator><pubDate>Mon, 04 Jul 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近，幻方 AI 发布了其沉淀多年的&lt;a href=&quot;/blog/hfai_usage&quot;&gt;深度学习套件 hfai&lt;/a&gt; ，吸引了众多同行研究员和开发者们咨询试用。其中，不少用户朋友对 hfai 中一些功能不太熟悉，使用上存在疑惑，或者仅仅使用了其中非常少的一部分功能。如果说我们把 hfai 深度学习套件认为是一部武功秘籍，而您作为使用者若是习得了当中的心法要义，那么您将带着 hfai 这套“神功”游刃有余的应对深度学习作业的各项挑战，举重若轻、例不虚发。&lt;/p&gt;
&lt;p&gt;为此，我们专门创建了 “hfai 使用心法” 系列专辑，从本期文章开始，我们会陆续为大家介绍 hfai 一些功能的设计思路和原理，帮助大家更好更快地习得心法。&lt;/p&gt;
&lt;p&gt;本次文章为大家介绍 &lt;code class=&quot;language-text&quot;&gt;hfai workspace&lt;/code&gt;，其旨在同步本地工程目录代码到远程萤火集群中，更丝滑地利用萤火的算力运行您的项目工程。&lt;/p&gt;
&lt;h2 id=&quot;使用场景&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF&quot; aria-label=&quot;使用场景 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;使用场景&lt;/h2&gt;
&lt;p&gt;在介绍 &lt;code class=&quot;language-text&quot;&gt;hfai worksapce&lt;/code&gt; 之前，我们先简单描述其使用的场景。&lt;/p&gt;
&lt;p&gt;幻方萤火是一个远程的服务集群。对于 hfai 的用户，他们需要将本地的数据、代码传到这个远程集群中，才可以训练其模型。之前，幻方 AI 提供了 Jupyter 控制台，让用户&lt;strong&gt;通过网页手动上传下载&lt;/strong&gt;，这种方式有诸多不便。&lt;/p&gt;
&lt;p&gt;为了解决这个问题，&lt;code class=&quot;language-text&quot;&gt;hfai workspace&lt;/code&gt; 应运而生，其可以让用户&lt;strong&gt;摆脱 Jupyter 操作&lt;/strong&gt;的不方便，直接连通本地工程目录和远程萤火集群。您可以在您自己环境，如个人电脑、个人集群等，编写代码，调试模型，然后&lt;strong&gt;通过一行命令&lt;/strong&gt;直接将调试好的代码上传远程萤火集群，利用算力来训练您的模型。实现这个过程，只需要您在自己环境里安装 &lt;a href=&quot;/blog/hfai_usage&quot;&gt;hfai 深度学习套件&lt;/a&gt;，通过 VPN 连通集群，即可开始使用。&lt;/p&gt;
&lt;p&gt;下面将为大家详细介绍 &lt;code class=&quot;language-text&quot;&gt;hfai workspace&lt;/code&gt; 的背后原理，使用可以参考&lt;a href=&quot;https://doc.hfai.high-flyer.cn/cli/env.html&quot;&gt;官方文档&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&quot;整理架构&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%95%B4%E7%90%86%E6%9E%B6%E6%9E%84&quot; aria-label=&quot;整理架构 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;整理架构&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/26460f892e960223c174f5c813812813/302a4/01.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 65.6441717791411%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABcRAAAXEQHKJvM/AAAD0UlEQVQ4y11SfUxbdRS9LZMWSMUOYercBmxjqTM6mcwRYCgbhZZRQR3DOShYEBnQ9ROdo6Wl2xhOYV9qqgYy4kdGBiwwmQEGLRvUTIQEAhkfMmjfe32vfS2WMoLR+DNPogme5OTenD9Ozsm94HA4FPPz8yqPx7OVpmnwuinIz89/JjP9kCBNaggHaAgEuMhKyqvdKJFk7s499k7UyNgUuNxeYBAmbg2u/Mi43VCt32UyVgHgOH7Obref93q9O/x+/xM+/6PoX2x3X7C0Ne8fnZwTPHS4oqcdi9FTM3O7vu0cesU6NPwiTXsil/z+KJqw8xFAwEWdgn+6uibMcFYPgGFYk91ub1pZWRF0WwZhafXPEEROBv3R/wUPIRSIVr1BCCGO3jz8bEG5bme56UZUywAdipCPi9DvG5ablHBKUwWas9cgQTEGUN82/aRjdjz0u+s3uAghmLL1/FPlqwgIXJ3oAUZjuK+456mYpILNe480RG06/oDrd9gAgGDlfo9Y4jO/sQEhOKj5mQ2wvyOkUi0Pr6rSCYwGA/8TTREsmvMCkOk5zk0AeK+oDl7T3N8q1A7FxmsmYlO0I3vS1ZZYkaIrLl3x48viipaE9JO39mWUNScLVdY9ECa1BcG2K/BBzSV2AKyhvKQoRpqTtdcgl21blgGnsOLrmDcU7QkHpQ0ZqaXXE0UnO+OzZGcKMsq+SckurjsmKbmc9WZB5ak05Z04CD5q5QIgyFaYwdq3VlGl1oRKi09sNGnljyMegETRtUOi7UtIKr2VnKrsi8+Qt72aWfJZtkjennz4RKNYJL954HBpozhVfS8OODkDXJm2HupqPoSnd6cACD4GdXkh5OQeAbNSDFcrKiBRPcKDnS28iKzWSDjQzU8ss4SJVL2bhMr+CKHKEiFUWSOEKmYfCAdebj/PWK2L1Ourt9QY9ExCFkILbITm2Ag52AihgMu3fYAtzGknJ8aXx8dG2/+aauSUneuC5wstIFR0g1BlgTRlL6Sq7wKEHLUE15u03NM6Y9CVWu1/V/0/e22T8cNjMxc6ugePr2kyMH7ez0p8/wcQKvsgTXF7zZCpDC8xL8AHyEbwYJ7KJkhXCUG638WdlIyZBOmWOSk656GDfN3tWXxrxu7Oa7nnfKzzvgtGp12wDtwcK7fGWL1Fp9Nt/rK5FWjafc1JEDhFUdMEjs/hOD5Lks5ZiiR/JXB8AccxgqLIAYTQBibpo+Wl9Yahb9+B2nozW15Wwvr0wnmgKNdVHMdHSZIcxDDsJ4YEQdicTucQhmE2DMNGnE6y419Dn8+3zvBvww0CRnvOTxAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;01&quot;
        title=&quot;01&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/26460f892e960223c174f5c813812813/a6d36/01.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/26460f892e960223c174f5c813812813/222b7/01.png 163w,
https://hfai-static.high-flyer.cn/static/26460f892e960223c174f5c813812813/ff46a/01.png 325w,
https://hfai-static.high-flyer.cn/static/26460f892e960223c174f5c813812813/a6d36/01.png 650w,
https://hfai-static.high-flyer.cn/static/26460f892e960223c174f5c813812813/e548f/01.png 975w,
https://hfai-static.high-flyer.cn/static/26460f892e960223c174f5c813812813/302a4/01.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图简图所示，hfai workspace 分为 &lt;strong&gt;数据流&lt;/strong&gt; 和 &lt;strong&gt;控制流&lt;/strong&gt;，控制流主要是发送本地的请求到萤火服务器（Server）中，通过同步服务（Sync）进行本地文件和远程文件的同步控制。数据流使用外部 OSS 储服务，进行数据和代码上传和下载。这里，外部 OSS 存储通过内部代理（Proxy），实现数据的高速传输和安全保障。&lt;/p&gt;
&lt;p&gt;为了保障您以及集群整体的隐私和安全，对于不同的用户来说，无论是在 OSS 外部存储，还是幻方集群存储（Weka），数据目录都彼此隔离。当前，幻方萤火集群仅支持从外部指定的 OSS 存储服务中拉取数据，我们配有专线联通以提升传输的速度、稳定和安全。&lt;/p&gt;
&lt;h2 id=&quot;推送工作区&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%8E%A8%E9%80%81%E5%B7%A5%E4%BD%9C%E5%8C%BA&quot; aria-label=&quot;推送工作区 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;推送工作区&lt;/h2&gt;
&lt;p&gt;当您发起 &lt;code class=&quot;language-text&quot;&gt;hfai workspace push&lt;/code&gt; 命令，推送您的本地目录代码时，在您本地和远程萤火集群之间，会发生如下操作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;请求萤火，验证文件&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/a1aa31e9289ab49cf96ba38e9877ea6f/302a4/02.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 48.46625766871166%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABcRAAAXEQHKJvM/AAADKUlEQVQozy2Re0yTZxjFT7mINAwckAmSopAagpdNNJlilFjEYRopdLI5RVgVFChgP75CL0rfrxWToWLQP9i8UOdcUpENNQuSiZcNWkBtRaEBZuPCikRldrZf0XXTmNeUeJKT5yRPnif55WBiYoL1eDzp09PToJRiT3lFtHRz7jLF18Ui+vYNpqYeI0GIkIKCApFMJvtYUVIU5bDb8fjvAMLXnQrLLD4zz0C4lUaOxHEcASYnJ1s8Hs/K/wIBoc/Hi8fHRtOvW77LujNgzfDy/kX/vpxJdv05mTb84P6ygX7bitGxh0v8vH+hzz+T7O+oi5iSYa6JNIgaOFMU4TjA7XZ3eL3e9fzMK8wEXkf9/8Ql9LVr4yilEc9f8MLgbOl6Eb/3gHlpJaNbzJ4cT6GUzn0WoJG3KBXQVKCVzQUdBeSaywD/z9OPgkdD94fhc4/PYl/6BMFHsxmUoiq/JHqbTJG4c8WHcV8VNSZSQDDr93upmSK+pB+ZjA0oVRTN0+n0aSajMfGoejdom1QwoUqNjgUAJUVTRVVsHntN/KWuT7TNMJQkV/ekbFHbRDv0v4rPX324tvHUQFblwS7J4orB1dm1fam4+r0pjDMditTrtOGfxgAalTKpZocsQ1WlFPvKEMmUmxJzNI5VG8stEknp2U1S5pcsaenxz7caByW9zudtph+Hf95+xH4xqWzQvI6xfoblpZ0wN1XjWHPzLGIty8YWbFck7FfuSnq7G3N2KVvjZXU318hV7dl51Zac/NrLks2Ko4XMiXsSy6Ubbd091ovmcxc6GX1zdbbGuRxfMN+i5VA9qmtUQUjsUzHI3VoEw145jrD7scUwJEwruy2KStXPR0RnTHi+Y/4G7WhyodEu/uYHR+bpcz0buONdWXK2IyNHPZiCwwd1HzQQLsZAiECr1UJTX4+dJQqQGgXudv8kcPMUgcDL2Du237S9v99qcjkdGUESbzFCrcFSAFy53os6tRZrDvCAgXALOEJEhHChhBAEHdQmtg9O54hgZPgB7Hb7kr/c7kcul4v226xlPKUY7z4ferOxOOR2S0XIBUu7oLL+MCSaP/AOwbl7TlwvQqEAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;02&quot;
        title=&quot;02&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/a1aa31e9289ab49cf96ba38e9877ea6f/a6d36/02.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/a1aa31e9289ab49cf96ba38e9877ea6f/222b7/02.png 163w,
https://hfai-static.high-flyer.cn/static/a1aa31e9289ab49cf96ba38e9877ea6f/ff46a/02.png 325w,
https://hfai-static.high-flyer.cn/static/a1aa31e9289ab49cf96ba38e9877ea6f/a6d36/02.png 650w,
https://hfai-static.high-flyer.cn/static/a1aa31e9289ab49cf96ba38e9877ea6f/e548f/02.png 975w,
https://hfai-static.high-flyer.cn/static/a1aa31e9289ab49cf96ba38e9877ea6f/302a4/02.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，当发起 push 请求时，本地请求会发送到远程萤火服务（Server），转交给同步服务（Sync），同步服务校验当前的请求，查询集群存储（Weka）中是否存在该工程目录，获取校验和（checksum），将信息返回给本地，与本地目录进行比对。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;请求 OSS，准备上传&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/636217d3e98d8049928a91cf71e1b41f/302a4/03.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 48.46625766871166%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABcRAAAXEQHKJvM/AAADDklEQVQoz1XPa0hTcRjH8d/SsKaZF7BsaRe7YCWm6yZdwNqONW3ajSi7TM1Mc7md485Utv+ZUZJpBBFKaHR5EZVlUNmbpJrT0lZaSpmGzQ1aqSvPrFxFdWKjNz3w4Xnx8Lz4wmaz0S6XK3ZoaAiCICA371CwYmPKEtX+vVHCn18YtDuwcLHUL33Ltihlenrc/qzcwM7nVjiGPZi45px/0t66ECPhEk0cCec4AjgcjtMulyvxu8cj5nn3vN7Xr2LvX6ld1/HYksC7x2aPud2zeDc/p/N+o/TBnRurXnU/XzQ+Ph7Nj32N/naTDXBuxqRyYphp5ExBRs4E2O3266Ojo2vdX77hi+dn0A9nv5i/qg8XBCHg0+iYWBD4yTV3neHnzpyXNJygJaUVl2LfOd2BwyOfxbVvBJFwFKgiBbhQsRM72UYR3J8+RHifO7tegrf3+rIb4yH2bq9Tt10IVHYEJKVp569aJp0bn/0goqzmCa61ebD1eD8S6NdYoHZhtaYLKYwZyFFlhpSUlC4sN5kiq5hsCPUKka0oJhgALm5PRFyl4LeC7Z1mKK6NrDReDkulmyWU7nHYBuP7YBnbGULRj0LljCVUzrT4oOlCuT9XfmxyaYl+4oqpAFtUIFHvViZoDufP8+RhEnPQEJmpvZ6kyK1bn5FVlaqgH0plxe2JyryzGWkFFymZzrqUos3LKMbig7icmzh/ohCnqqt9iVqaDsvYpZpeVpAl+Z2NgPxDJyO2M02r0zS3khWFV+Wb2NaVMuaJdHN+fapC3ZAsK26XUnTLcoqx+GCHpganj+lQqC7yVuJIkQYp2zJhOLgFJ+kyrOcGxIsPtEbD3xwMvAgKVTZHKlhLTDLbEy3TWWdTtDlGzljmUv+g8mjJFAPhphoJEen1erA6HfbsU4GoVXh6r0FkG/mOr/xQeEdHu9ZsflTxtq83vqtvBIKgx0rjD6RomyFnWiGnW3xgJNwMjpAoQjg/Qgi8vOM99vR0i7q7X8JqfbZocHBwoK+/X2hra8sZ/ujEgGN4goo0Qc60/OcvNjNxYTDV+I4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;03&quot;
        title=&quot;03&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/636217d3e98d8049928a91cf71e1b41f/a6d36/03.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/636217d3e98d8049928a91cf71e1b41f/222b7/03.png 163w,
https://hfai-static.high-flyer.cn/static/636217d3e98d8049928a91cf71e1b41f/ff46a/03.png 325w,
https://hfai-static.high-flyer.cn/static/636217d3e98d8049928a91cf71e1b41f/a6d36/03.png 650w,
https://hfai-static.high-flyer.cn/static/636217d3e98d8049928a91cf71e1b41f/e548f/03.png 975w,
https://hfai-static.high-flyer.cn/static/636217d3e98d8049928a91cf71e1b41f/302a4/03.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，当完成远程目录和本地目录的校验之后，本地再一次发请求给萤火服务，由集群通过内部代理（Proxy）请求外部 OSS，获取安全的上传链接和校验（STS）。当获取到 OSS 的上传许可后，您的本地工程目录便可以上传了。&lt;/p&gt;
&lt;p&gt;这里值得注意的是，待同步的本地工程目录原则上限制为不超过 200G，为更流畅的使用萤火平台，强烈推荐调用幻方的数据集仓库 hfai.datasets。若您所用数据集未被收录，或是私有大规模数据集，您可以联系幻方管理员，hfai 数据集详情请参考 &lt;a href=&quot;https://doc.hfai.high-flyer.cn/api/datasets.html&quot;&gt;hfai 官方文档&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数据上传&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/81be058de81a7e4d2feefa523b89e01f/302a4/04.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 49.079754601226995%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABcRAAAXEQHKJvM/AAADNUlEQVQozwEqA9X8AOXl5Urs7Owh6+vrAPr5+ABvbm4MUFJTJWFlahgySWgXOEZZJypSixNXW2AaWVhWJmNmawvLy8kA5/D/AAA8pgNHZZYQfn5+LX9/fgx/fn4AAN/f357p6elG////AO3s7BjM0NIfoJOLNa+qpi3U4fEY3en7FMnR3B2rrbAokpigM9/Z0Bv4+PkT8vX2EqR0YQiQXkcQf39+J35+fwt/f30AAODg4KLr6+tI4eHiAvHw7xn///8P/+rVFP/06hT5+vkT//zyE8XR6Byhss8jmK7NIrLD4yHq7O8W6uzvFP///wGcclwAhH1yAKGEUwBbd6kAAOfm5Db///8Vtra2AOPl5gDU1tcmzsO7JP///wD///gAoLnlAABGxQgvR3EjKjNAIyxdtheat+sAorjhAP///wD//+wAdJemAf///wBAbr8AAAAAAAdubW0ihISEHcHGyQDo7O8U8tnIE4WswwBAGywATn7NCEh1wyVEetggO3jeIEV1yiFnluonWYLMLAAEkxIOQ6sTRWe3EnCJxhVDccIfAKiekgeEhYYNeXp6CAAAAABPUlQMUklDGHRubBv/iAABTW6xEUl0wzRDaKlBPmWoRFBxrUJRZYppiKXTab7Q6595odmZSYHPoBZewYJRecQyAD5powCPhHUAh4eHADIwMAB4d3cXW1xeKW5qaCX+cAAGXWmYE090vjZLbKZDS2mgRU1vqUNNXHhqY4nJQYym0GNjgKx4Snm/ZSpoxU9KdcIzAFVwlgCLgncAc3R1AAAAAAA8OTgAAAAAABIAAACAc4kARnrQCzdqwSUAPMsWADHSEypixR5Kft0hOWnBIxhLrR4uXK4pQ2q5IFV6xCBEcsInAIiBeQp9fn8PfX5+AnZ2dgAhIB8AAAAAAAAAAADSsp4A6PL8AOvp5gvCwsFbv7/AbqW40yMAAIsFJGnGCSFrzggKX9AMJYr+AQA8rAA8bL0AAHt9gBl/fn4hfX5/BX5+fgCAgIAAioqKAIqKiQDU1NQC1NTUAM7OzjPi4uLz2dna/8HDxWv/+OcAk7HbBBFZvQESVrIBAGH/AP+XAABIf+YAuyNwJ0VqLxUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;04&quot;
        title=&quot;04&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/81be058de81a7e4d2feefa523b89e01f/a6d36/04.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/81be058de81a7e4d2feefa523b89e01f/222b7/04.png 163w,
https://hfai-static.high-flyer.cn/static/81be058de81a7e4d2feefa523b89e01f/ff46a/04.png 325w,
https://hfai-static.high-flyer.cn/static/81be058de81a7e4d2feefa523b89e01f/a6d36/04.png 650w,
https://hfai-static.high-flyer.cn/static/81be058de81a7e4d2feefa523b89e01f/e548f/04.png 975w,
https://hfai-static.high-flyer.cn/static/81be058de81a7e4d2feefa523b89e01f/302a4/04.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，本地目录代码和数据开始上传。这里，hfai 会对当前的目录自动进行整体打包，您可以将您的数据和代码整理好，都放在当前这个目录下。注意，数据的上传是增量的，只会对校验后有改动的文件进行打包上传。&lt;/p&gt;
&lt;p&gt;目录包上传到 OSS 之后，会通过内部代理（Proxy）下载到萤火集群的存储（Weka）中，这里同步服务（Sync）会负责将包解开，并在集群存储中恢复本地目录设置。&lt;/p&gt;
&lt;p&gt;数据传输的进度会通过萤火服务（Server）发送到本地。您可以实时获取到当前推送操作的进度详情。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;拉取工作区&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%8B%89%E5%8F%96%E5%B7%A5%E4%BD%9C%E5%8C%BA&quot; aria-label=&quot;拉取工作区 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;拉取工作区&lt;/h2&gt;
&lt;p&gt;除了推送本地目录到远程萤火集群，您也可以通过 &lt;code class=&quot;language-text&quot;&gt;hfai workspace pull&lt;/code&gt; 命令从远程萤火中拉取您的训练代码，模型保存的 checkpoint，中间数据等信息。该过程与推送基本一致，在进行了文件校验，OSS 请求之后，数据链路如下所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/f34500a9255c3e7881aefb6426ee3685/302a4/05.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 49.079754601226995%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABcRAAAXEQHKJvM/AAADNUlEQVQozwEqA9X8AOXl5Urs7Owh6+vrAPr5+ABubm4NUVJSJF1lbRkuSnEaPUlZLzJSfhFaW1wZWlhVJmJmbAvLyskA5/D/AAA8pgNHZZYQfn5+LX9/fgx/fn4AAN/f357p6elG////AO3s7BjM0NIfoJSLNa2ppy3K2u4Z4/D/FNfa3xuoq7ApiZSiN+Tc0Bv29/gT8vX2EqR0YQiQXkcQf39+J35+fwt/f30AAODg4KLr6+tI4eHiAvHw7xn///8P/+rVFP/06xT9/PoT//vwE8HO5x2ktM8jo7TOILDC4yHr7fAW6uzvFP///wGZcV0Agn1zAJyDVgBad6kAAOfm5Db///8Vtra2AOPl5gDU1tcmzsO7JP///wD///kAobrlAABFxgguR3MkKTVHJS1ethabt+wAoLjiAP//AAD//zsA//9/Af//AABKdMAAAAAAAAdubW0ihISEHcHGyQDo7O8U8tnIE4WswwBAGywATn7NCEh1wyVDetggOnjdIUR0yiBmleomXITOLgBH2RIAPc0TADPGEhtj4xVGc8IfAKiekgeEhYYNeXp6CAAAAABPUlQMUklDGHRubBv/iAABTW6xEUl0wzVEaKk/QWanQk1vq0FPZIpokqfObJaerJ+fp7aapq67n3+JnIpBcMMzAD5powCPhHUAh4eHADIwMAB4d3cXW1xeKW5qaCX+cAAGXWmYE090vjZLbKZDSmmgRU5vqUNNXXlqaYrFQHiKqmR2hZ91gZO0ZGqCrVNEccIzAFVwlgCLgncAc3R1AAAAAAA8OTgAAAAAABIAAACAc4kARnrQCzdqwSUAPMsWADHSEylhxR5KftwhN2nDIyhhxx4eWrwrHVnCIDJr0R9Gc8InAIiBeQp9fn8PfX5+AnZ2dgAhIB8AAAAAAAAAAADSsp4A6PL8AOzp5gvCwsFbwMDAbbLA0yIAAI8FJmrECRtiwggTYMkMwMzRAf/TMABPd74AAHt9gBl/fn4hfX5/BX5+fgCAgIAAioqKAIqKiQDU1NQC1NTUAM7OzjPi4uLz2tra/8PExWv/++gAlLLbBBFZvQEPVrYBAGT/AN6AGQBLf+EApWpwodFclDIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;05&quot;
        title=&quot;05&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/f34500a9255c3e7881aefb6426ee3685/a6d36/05.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/f34500a9255c3e7881aefb6426ee3685/222b7/05.png 163w,
https://hfai-static.high-flyer.cn/static/f34500a9255c3e7881aefb6426ee3685/ff46a/05.png 325w,
https://hfai-static.high-flyer.cn/static/f34500a9255c3e7881aefb6426ee3685/a6d36/05.png 650w,
https://hfai-static.high-flyer.cn/static/f34500a9255c3e7881aefb6426ee3685/e548f/05.png 975w,
https://hfai-static.high-flyer.cn/static/f34500a9255c3e7881aefb6426ee3685/302a4/05.png 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;数据过程与推送相反，从萤火存储（Weka）的工作区中拉取新增的文件，通过 OSS 传递到本地工程目录中。进度信息会通过萤火服务（Server）实时反馈。&lt;/p&gt;
&lt;p&gt;此外，hfai workspace 还提供了 diff, list, download, remove 等命令，它们的执行过程都是上述描述流程的子流程，详细信息可以参考 &lt;a href=&quot;https://doc.hfai.high-flyer.cn/cli/env.html&quot;&gt;hfai 官方文档&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;案例说明&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A1%88%E4%BE%8B%E8%AF%B4%E6%98%8E&quot; aria-label=&quot;案例说明 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;案例说明&lt;/h2&gt;
&lt;p&gt;我们以本地一个新的项目工程 &lt;code class=&quot;language-text&quot;&gt;WeatherBench&lt;/code&gt; 为例子，展示 hfai workspace 的使用。&lt;/p&gt;
&lt;p&gt;初始化成 hfai 工作区：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/a21331bcb54a75722b8dbb30ca4d9418/f1452/06.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 7.361963190184048%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAABABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAECB//EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHPqCQF/8QAFxABAAMAAAAAAAAAAAAAAAAAAAECMf/aAAgBAQABBQK+pf/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAABD/2gAIAQEABj8Cf//EABYQAAMAAAAAAAAAAAAAAAAAAAAQMf/aAAgBAQABPyFNn//aAAwDAQACAAMAAAAQ/A//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAWEQADAAAAAAAAAAAAAAAAAAABEDH/2gAIAQIBAT8QEX//xAAYEAACAwAAAAAAAAAAAAAAAAAAcQExQf/aAAgBAQABPxAoxlCP/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;06&quot;
        title=&quot;06&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/a21331bcb54a75722b8dbb30ca4d9418/6aca1/06.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/a21331bcb54a75722b8dbb30ca4d9418/d2f63/06.jpg 163w,
https://hfai-static.high-flyer.cn/static/a21331bcb54a75722b8dbb30ca4d9418/c989d/06.jpg 325w,
https://hfai-static.high-flyer.cn/static/a21331bcb54a75722b8dbb30ca4d9418/6aca1/06.jpg 650w,
https://hfai-static.high-flyer.cn/static/a21331bcb54a75722b8dbb30ca4d9418/7c09c/06.jpg 975w,
https://hfai-static.high-flyer.cn/static/a21331bcb54a75722b8dbb30ca4d9418/f1452/06.jpg 1103w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;初次推送到远程萤火集群，文件校验后在集群生成工作区 &lt;code class=&quot;language-text&quot;&gt;weatherbench&lt;/code&gt; ，通过 OSS 将本地工作区打包上传：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/6bfcc91caa04cb17bf5ef7990c200409/f6dd8/07.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 13.496932515337424%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAADABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAEEB//EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHPawkBf//EABYQAQEBAAAAAAAAAAAAAAAAAAEAEf/aAAgBAQABBQJlbW//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAVEQEBAAAAAAAAAAAAAAAAAAABEP/aAAgBAgEBPwEn/8QAFBABAAAAAAAAAAAAAAAAAAAAEP/aAAgBAQAGPwJ//8QAGhAAAgIDAAAAAAAAAAAAAAAAAAEhMVFhkf/aAAgBAQABPyF5dcM43M//2gAMAwEAAgADAAAAEPQP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxAf/8QAGBABAQEBAQAAAAAAAAAAAAAAAREAMYH/2gAIAQEAAT8QVqJFBjASR4a/df/Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;07&quot;
        title=&quot;07&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/6bfcc91caa04cb17bf5ef7990c200409/6aca1/07.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/6bfcc91caa04cb17bf5ef7990c200409/d2f63/07.jpg 163w,
https://hfai-static.high-flyer.cn/static/6bfcc91caa04cb17bf5ef7990c200409/c989d/07.jpg 325w,
https://hfai-static.high-flyer.cn/static/6bfcc91caa04cb17bf5ef7990c200409/6aca1/07.jpg 650w,
https://hfai-static.high-flyer.cn/static/6bfcc91caa04cb17bf5ef7990c200409/7c09c/07.jpg 975w,
https://hfai-static.high-flyer.cn/static/6bfcc91caa04cb17bf5ef7990c200409/f6dd8/07.jpg 981w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;您可以在 &lt;a href=&quot;https://studio.yinghuo.high-flyer.cn&quot;&gt;hfai studio&lt;/a&gt; 中看到您的工作区在远程萤火集群中的位置：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/13028b49a35947a78f208e80d174fa66/64175/11.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 17.791411042944784%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAAEABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAEG/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAcNCpgT/xAAUEAEAAAAAAAAAAAAAAAAAAAAQ/9oACAEBAAEFAn//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAXEAADAQAAAAAAAAAAAAAAAAAAATEQ/9oACAEBAAY/AoRZ/8QAGBABAQADAAAAAAAAAAAAAAAAAQAhUYH/2gAIAQEAAT8hxpKRwv/aAAwDAQACAAMAAAAQD/8A/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFREBAQAAAAAAAAAAAAAAAAAAAAH/2gAIAQIBAT8QR//EABwQAAEEAwEAAAAAAAAAAAAAAAEAESExQXGR0f/aAAgBAQABPxB454z20ECKt+oEGWtBf//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;11&quot;
        title=&quot;11&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/13028b49a35947a78f208e80d174fa66/6aca1/11.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/13028b49a35947a78f208e80d174fa66/d2f63/11.jpg 163w,
https://hfai-static.high-flyer.cn/static/13028b49a35947a78f208e80d174fa66/c989d/11.jpg 325w,
https://hfai-static.high-flyer.cn/static/13028b49a35947a78f208e80d174fa66/6aca1/11.jpg 650w,
https://hfai-static.high-flyer.cn/static/13028b49a35947a78f208e80d174fa66/7c09c/11.jpg 975w,
https://hfai-static.high-flyer.cn/static/13028b49a35947a78f208e80d174fa66/64175/11.jpg 1025w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;当前目录会放置在集群中 &lt;code class=&quot;language-text&quot;&gt;hfai/{username}/&lt;/code&gt; 中，按账号进行隔离。当对本地文件 &lt;code class=&quot;language-text&quot;&gt;/src/download_era5.py&lt;/code&gt; 进行修改，在推送时会展现文件校验结果：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/b865737a95f63420224ba36b56c5fe95/fbf08/08.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 15.950920245398773%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAIAAAAcOLh5AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAg0lEQVQI103CUQ6DIAwAUD83W4R00DJBRDeGSrL7H2+JyRJfXhfnaDKp96Aickw+fkgy8UyyEi/GJm2TfkzGztpmcklEnidm7sioYIbJaIGBiWIcvTgvHEbPzvb9DeB+3f8BQNf2Y3+V73581rWU0lqrtYYQcl7qtjnHAIioLlGdEPEHjn8PIW6unk4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;08&quot;
        title=&quot;08&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/b865737a95f63420224ba36b56c5fe95/a6d36/08.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/b865737a95f63420224ba36b56c5fe95/222b7/08.png 163w,
https://hfai-static.high-flyer.cn/static/b865737a95f63420224ba36b56c5fe95/ff46a/08.png 325w,
https://hfai-static.high-flyer.cn/static/b865737a95f63420224ba36b56c5fe95/a6d36/08.png 650w,
https://hfai-static.high-flyer.cn/static/b865737a95f63420224ba36b56c5fe95/fbf08/08.png 962w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;当远程萤火集群完成训练，保存了训练好的模型，可以获取到：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/6bb238273fb6ff69777ac2c6e8b33e90/7b1dc/09.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 15.950920245398773%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAIAAAAcOLh5AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAe0lEQVQI10XGWw7CMAxE0f42jh07TycuTYH97xGlCHE0uppND5UH8wzUqKq1PiUPyT2VQ7KhVJJGq0qiIbaUUikl5ywimxmdJ9og8qitvV/P0dWsX/OMkcHtHpwHB2v7XXA3ANg08ES+iAdSzaWUikhh4RCCX/DX7/n7ANn6DExmI5hTAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;09&quot;
        title=&quot;09&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/6bb238273fb6ff69777ac2c6e8b33e90/a6d36/09.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/6bb238273fb6ff69777ac2c6e8b33e90/222b7/09.png 163w,
https://hfai-static.high-flyer.cn/static/6bb238273fb6ff69777ac2c6e8b33e90/ff46a/09.png 325w,
https://hfai-static.high-flyer.cn/static/6bb238273fb6ff69777ac2c6e8b33e90/a6d36/09.png 650w,
https://hfai-static.high-flyer.cn/static/6bb238273fb6ff69777ac2c6e8b33e90/7b1dc/09.png 956w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;通过 &lt;code class=&quot;language-text&quot;&gt;hfai workspace pull&lt;/code&gt; 拉取到本地：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/7335aa0987ba0f8c4a6f2a28ad27c696/eb2af/10.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 16.56441717791411%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAqElEQVQI12XLQW+CMABAYY6uMBiWAsI6S20LVG0Mxv3/f/aWcDM7fHmnl3nvMc7gbhdsnOjHka7/5jT87FSnKSvFZ9VSVC15KfeWdU9ZdxylpGmanZSSbNuevH5fPLbEvAasN8xXx3oP+MWizcCgelQ30o6aVjUc6y+EOJDnHwgh3mQpJR4pMU+W1Xn8eSK6wC0sxIvHWYs9W8wUcEvkGiNa630uiuKfPzEuTqgl6J41AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;10&quot;
        title=&quot;10&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/7335aa0987ba0f8c4a6f2a28ad27c696/a6d36/10.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/7335aa0987ba0f8c4a6f2a28ad27c696/222b7/10.png 163w,
https://hfai-static.high-flyer.cn/static/7335aa0987ba0f8c4a6f2a28ad27c696/ff46a/10.png 325w,
https://hfai-static.high-flyer.cn/static/7335aa0987ba0f8c4a6f2a28ad27c696/a6d36/10.png 650w,
https://hfai-static.high-flyer.cn/static/7335aa0987ba0f8c4a6f2a28ad27c696/eb2af/10.png 954w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[萤火跑模型 | AI 驱动的全球精准气象预报]]></title><description><![CDATA[现代数值天气预报（numerical weather prediction, NWP）可以追溯到 1920 年，其基于物理原理，整合了几代气象学者的成果经验，是各国气象部门所采用的主流的天气预报方法。这其中，来自欧洲中期天气预报中心（ECMWF）的高分辨率综合预测系统（IFS…]]></description><link>https://www.high-flyer.cn/blog/fourcastnet/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/fourcastnet/</guid><dc:creator><![CDATA[Vachel]]></dc:creator><pubDate>Fri, 10 Jun 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;现代&lt;strong&gt;数值天气预报&lt;/strong&gt;（numerical weather prediction, NWP）可以追溯到 1920 年，其基于物理原理，整合了几代气象学者的成果经验，是各国气象部门所采用的主流的天气预报方法。这其中，来自欧洲中期天气预报中心（ECMWF）的高分辨率综合预测系统（IFS）模型，在历年的全球天气预报中表现最佳。&lt;/p&gt;
&lt;p&gt;最近，在刚刚闭幕不久的 Nvdia GTC 技术年会上，来自英伟达、劳伦斯伯克利国家实验室、密歇根大学安娜堡分校、莱斯大学等机构的研究者研发了&lt;strong&gt;一种基于傅里叶神经网络的预测模型 FourCastNet&lt;/strong&gt;，它能以 0.25° 的分辨率生成全球关键天气指标的预测，这相当于赤道附近大约 30×30 km 的空间分辨率和 720×1440 像素的全球网格大小，与 IFS 系统一致。&lt;strong&gt;这项成果使得 AI 气象模型首次能够与传统物理模型 IFS 进行直接比较&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;FourCastNet 采用 GPU 训练计算，&lt;strong&gt;比传统的 NWP 模型快约 45000 倍，能量节约 12000 倍&lt;/strong&gt;，使得它能够&lt;strong&gt;以很低的成本生成大量的子模型，进行集合预测&lt;/strong&gt;。实验表明 FourCastNet 极大地改善了概率天气预报的效果，可以在几秒钟内生成对飓风、大气层河流和极端降水等事件的大规模集合预报。&lt;/p&gt;
&lt;p&gt;幻方 AI 最近复现了该项工作，并通过幻方自研的 &lt;a href=&quot;/blog/3fs&quot;&gt;3FS&lt;/a&gt;、&lt;a href=&quot;/blog/hf-reduce&quot;&gt;hfreduce&lt;/a&gt;、&lt;a href=&quot;/blog/hfnn&quot;&gt;算子&lt;/a&gt;，对模型训练和推导进行优化。我们在 hfai 数据仓库中开源了训练数据，模型代码，旨在帮助研究者和开发者们降低研究门槛。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文标题&lt;/strong&gt;：FourCastNet: A Global Data-driven High-resolution Weather Model using Adaptive Fourier Neural Operators&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文地址&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/abs/2202.11214&quot;&gt;https://arxiv.org/abs/2202.11214&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型仓库&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/FourCastNet&quot;&gt;https://github.com/HFAiLab/FourCastNet&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;演示Demo&lt;/strong&gt;：&lt;a href=&quot;https://www.high-flyer.cn/hf-earth/&quot;&gt;https://www.high-flyer.cn/hf-earth/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;数据集&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E9%9B%86&quot; aria-label=&quot;数据集 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;数据集&lt;/h2&gt;
&lt;p&gt;欧洲中期天气预报中心（ECMWF）提供了一个公开可用的综合数据集 ERA5。作为第五代全球气候再分析结果，ERA5 将其物理模型数据与来自世界各地的观测数据结合起来，形成一个全球完整的、一致的数据集，以小时级到天级不等，提供包括温度、风量、降水、水文、气压等多项全球气象指标数据，供各种气象预报模型学习。官方地址如下：&lt;a href=&quot;https://www.ecmwf.int/en/forecasts/datasets/reanalysis-datasets/era5&quot;&gt;https://www.ecmwf.int/en/forecasts/datasets/reanalysis-datasets/era5&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;FourCastNet 使用 ERA5 来训练，专注于预报两大气象变量：&lt;strong&gt;距离地球表面 10m 处的风速&lt;/strong&gt;和&lt;strong&gt;6 小时总降水量&lt;/strong&gt;，以对极端天气、自然灾害的预警。该两项指标的预测也被认为是气象领域比较难准确预测的问题之一。&lt;/p&gt;
&lt;p&gt;为此，FourCastNet 选择了 20 个相关气象指标，包括几个不同垂直高度的位势高度、温度、风速和相对湿度，一些近地表变量，如地面气压和平均海平面气压以等，作为模型的输入，以挖掘出变量间彼此的关系对风速与降水的影响。具体变量如下：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 426px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/401bd68488bcafdc7263ea36e2e1e2f0/531e1/0.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 47.852760736196316%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAABn0lEQVQoz4VSa4+iQBDk//8sE7MuKowwcMv7KQ/veCqoiVqXnkWy7n7YTioNzNDdVV2SZVkIgkDA8zxEUSye4ziev/m+D9d1EYYR0jRFkiQ/EEURmqaBxLkO0zBg/vmA7zr4sB1wXcc4nnE69lAZw44xyO8r+GGE30JaLBZYrd6wXC6x32fo+150Oh6PSJMYOjfheS44N8QUiqKITEw452J6VVWg7jScz2dIpsHB2A6maQpKt/t97ta3DfKiRFEUOBwOyPMct9tNNKPcti0ul4t4p0HEhFzXoHMO27aFbtfrdS5YVRXyfCqWZWjaDuM4YhiGz+JfmlM8Ho9PDS3LhuM4KIpyPqA4nU5I0wR1XaOu/qGqG2T7vZDiXV5jGMb5/vMfSVW24IYJ2naW5y8F27aB73koyxJlWaA8/EUSx0jiCPJ6g2EcX+5PlHWEYYggCHGfKDxz33Wo6+aFEmlHuE9TfYfE1O1E2YVj2+i6fi5QV5XwYZKmwn+k3a+2YUyFLK+haRq2m43YdNd1YoNElQxNIJOTxnRGtvoO0pkW9h8Zwe0EFC6wAgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;0.png&quot;
        title=&quot;0.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/401bd68488bcafdc7263ea36e2e1e2f0/531e1/0.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/401bd68488bcafdc7263ea36e2e1e2f0/222b7/0.png 163w,
https://hfai-static.high-flyer.cn/static/401bd68488bcafdc7263ea36e2e1e2f0/ff46a/0.png 325w,
https://hfai-static.high-flyer.cn/static/401bd68488bcafdc7263ea36e2e1e2f0/531e1/0.png 426w&quot;
        sizes=&quot;(max-width: 426px) 100vw, 426px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;模型介绍&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E4%BB%8B%E7%BB%8D&quot; aria-label=&quot;模型介绍 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型介绍&lt;/h2&gt;
&lt;p&gt;为了进行 0.25° 分辨率下的全球气象预测，FourCastNet 采用&lt;strong&gt;自适应傅里叶神经算子 AFNO&lt;/strong&gt;，这种神经网络架构是对 Vision Transformer(ViT) 模型地改进，它将混合操作步骤构建成连续的全局卷积，在傅里叶域中通过 FFT 有效实现。通过这样的设计，将空间混合复杂度降低到 O(N log N)，这允许灵活且可扩展地建模跨空间和通道维度的依赖关系。AFNO 的结构如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/1ceb2f2853bd867d12b892e7d0161329/f8067/1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 42.94478527607362%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAACMElEQVQoz02OS1PaYABF+cHddduN0+n42HbTVjtd1FraodJN7UPRIgISwPAISb6E8BkIEaFEQB4aC6cDbnpnzuLexZ0TGY9uuB0GsHhgOhkR3k0I76c8hFPu78arPpvOmNwFBCOLwVhyH84YjKbcTmaEs79MJzPm8znLRA6OVVIFh7Locl6S5CouubJLUfe5MDoUax5u8xrpf6GoPUVcPqM3auJk4/StDDk/w+V1nfnD4vHwS8pjyd6RzU5cYTueZzuuED12iKU8PiVsTNvF9TPkCu8xrA/IToNhNU6g/WRfi2K0yrASXBDxepu0+1tcdjZQa2uUjDUq4jnN6038YAvHW8e/qiO9NKXqZ6rGLq5XJZ9XkVLSbLZpNCRhGD4aCnGKZaXwWgVqtd/YdhphppDynIbMIsQZruvQaDrousQwKtQ9j3ElStg44Z22zokVW8qxWBreaN+w0zHszD5aYhcjGV1RPd6jqewz1L/j6WmcpkrdKWJaCZyWRVdk6DlFEnqcgplkHs5ZLOZESkqCs19fqVfSCF3B1vOIapZi5ohyWUUrJFab0ThEKbyhpG3TaGmouTR6ReFMr6PaFt2bId1gQKSkZjnYeEIy9hpRPsKsKdQuTnj78gXbOzuYloqoJrju+8hWlXbHoDscM1ReEcpDPtqCpFMmZv7h9LJPZDTs0zMKeHaNthR0rlq0fR9hGtQqKre3AYObLv/n7v4B1yojRYUfBYWUmqfX69EPAv4BE8p5xCu7UrsAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;1.png&quot;
        title=&quot;1.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/1ceb2f2853bd867d12b892e7d0161329/a6d36/1.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/1ceb2f2853bd867d12b892e7d0161329/222b7/1.png 163w,
https://hfai-static.high-flyer.cn/static/1ceb2f2853bd867d12b892e7d0161329/ff46a/1.png 325w,
https://hfai-static.high-flyer.cn/static/1ceb2f2853bd867d12b892e7d0161329/a6d36/1.png 650w,
https://hfai-static.high-flyer.cn/static/1ceb2f2853bd867d12b892e7d0161329/f8067/1.png 726w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;在空间混合步骤中，GFNet 使用跨通道的逐元素矩阵乘法，FNO 采用混合所有通道的全矩阵乘法，而 AFNO 结合 MLP 和软阈值进行逐块矩阵乘法。&lt;/p&gt;
&lt;p&gt;对于气象数据，该研究将多种气象变脸按时间整合成 &lt;code class=&quot;language-text&quot;&gt;[time, variable, latitude, longitide]&lt;/code&gt;格式，进行 AFNO。具体的：FourCastNet 首先将 720 × 1440 lat-lon 网格上的输入变量投影到 2D patch 网格 (h × w)（patch 大小为 p × p，例如 p = 8），每个 patch 表示为一个 d 维 token。然后，将 patch 序列连同位置编码一起馈送到一系列 AFNO 层。如下所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/23b5f4fd8f635b1396a12564f98cecd8/91f10/2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 65.6441717791411%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAACHElEQVQ4y21Ty24TMRTNB/EBbPgDFnwBFRt27PgCJCR2bBArFmwgbEAgJIQKFeFRIVCrROKlEgVC2kSZmc7D4xmPE4990HHqAA2WbubGPvf43Ic7UkqUZelNaw3nLAoh0et/wfbgM/rjI3DxTAgB4pfLJaqqQtM0fj/Etm2LDg+dc7DWwjrng6NG4+a7S7j98QK6u1tI8vdwFrD8ATx+sVigKAqkaQqlFMLqGGNwerUO2Bvdw4OX5/Hk9Vk82r8MqRRUXSPNUsznc9R1jTiOvU/CwOMV/n0r04B1aAEM4318mj3DKP2ARv9JL89zjyMRv4xjuhuErAvT8IGsl1CQuYauDOqq9vvEn86KpDTu/5My68gDBhWiQJ5nOE4TVFXpL+M+jZiADQpDszoEsh6Uzy5Op9MVUGnkmUAcJSiFhJQ1GqXWdWPa9NkUxq1TDiNDQqqaTCbeT7IpZvMRjuIxptFP5OlsNQFR5AmphiTBqHijy9a2Xq1tDb6nA/wQPYyOtzE4fIEo2wNjpFwJ+N9iHzwhb2MNTsYQtnX4dVji6zDFLNawBtAL4+sYBLgAPvHDf09IuVTmO+4sxnGK68+v4FrvIu68uYpCHgCOpBpK1evGBQtka4V0fKp8La2BUAY7/Ru4+/Qc7j88g+6rLZT1ZlNYzyRJvPK1wjCU4S2a1vjBrkyL3YPH2Pl2C2+HXQhZYqG1VxnecDByhPn8DXsP3ezjTNmEAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;2.png&quot;
        title=&quot;2.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/23b5f4fd8f635b1396a12564f98cecd8/a6d36/2.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/23b5f4fd8f635b1396a12564f98cecd8/222b7/2.png 163w,
https://hfai-static.high-flyer.cn/static/23b5f4fd8f635b1396a12564f98cecd8/ff46a/2.png 325w,
https://hfai-static.high-flyer.cn/static/23b5f4fd8f635b1396a12564f98cecd8/a6d36/2.png 650w,
https://hfai-static.high-flyer.cn/static/23b5f4fd8f635b1396a12564f98cecd8/e548f/2.png 975w,
https://hfai-static.high-flyer.cn/static/23b5f4fd8f635b1396a12564f98cecd8/91f10/2.png 992w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;FourCastNet 的训练采用递进式，即以 &lt;code class=&quot;language-text&quot;&gt;X(t)&lt;/code&gt; 作为输入，预测下一步&lt;code class=&quot;language-text&quot;&gt;X(t+1)&lt;/code&gt;。一次训练输出多步，与真值对比计算 loss。这里论文里采用 RMSE 作为 loss 的评价指标。&lt;/p&gt;
&lt;p&gt;对于降水模型，如上图(c)所示，每一步降水的预测实在主干 AFNO 输出的基础上套接一个降水专有 AFNO 进行综合判断，其基于主干网络的预训练结果。这是因为降水这一指标与其他气象指标的概率分布不同，呈现比较鲜明的长尾特征，使得特征空间非常稀疏。对于降水专有的 AFNO，其与主干 AFNO 基本一致，不同在于输出侧，使用 Relu 进行激活，以防止非负输出。&lt;/p&gt;
&lt;h2 id=&quot;模型复现&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E5%A4%8D%E7%8E%B0&quot; aria-label=&quot;模型复现 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型复现&lt;/h2&gt;
&lt;p&gt;幻方 AI 基于 AFNO 和 FourcastNet 两篇论文的描述，复现了 FourCastNet，并采用幻方一系列优化工具进行提速升级，包括&lt;a href=&quot;/blog/ffrecord&quot;&gt;ffrecord&lt;/a&gt;、&lt;a href=&quot;/blog/hf-reduce&quot;&gt;hfreduce&lt;/a&gt;、&lt;a href=&quot;https://doc.hfai.high-flyer.cn/api/datasets.html&quot;&gt;hfai.datasets&lt;/a&gt;、&lt;a href=&quot;/blog/checkpoint&quot;&gt;hfai.checkpoints&lt;/a&gt;等功能。&lt;/p&gt;
&lt;h3 id=&quot;训练样本集&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AE%AD%E7%BB%83%E6%A0%B7%E6%9C%AC%E9%9B%86&quot; aria-label=&quot;训练样本集 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;训练样本集&lt;/h3&gt;
&lt;p&gt;如前面所述，FourCastNet 模型的训练包括&lt;code class=&quot;language-text&quot;&gt;pretrian&lt;/code&gt;、&lt;code class=&quot;language-text&quot;&gt;finetune&lt;/code&gt; 和 &lt;code class=&quot;language-text&quot;&gt;precipitation&lt;/code&gt; 三个部分，对应的数据输入各有不同。因此，我们将原始的 ERA5 数据进行清洗，构建如下样本数据集：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; xt&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; xt1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; xt2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pt1 &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;datasets&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ERA5&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loader&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    out1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; backbone_model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    out2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; backbone_model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;out1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    out3 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; precip_model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;out1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    loss_pretrain &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; criterion&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xt1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; out1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    loss_finetune &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; criterion&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xt2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; out2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; loss_pretrain
    loss_precip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; criterion&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pt1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; out3&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;其中&lt;code class=&quot;language-text&quot;&gt;xt&lt;/code&gt;代表当前&lt;code class=&quot;language-text&quot;&gt;t&lt;/code&gt;时刻的全球 20 各气象指标数据，&lt;code class=&quot;language-text&quot;&gt;xt1&lt;/code&gt;代表&lt;code class=&quot;language-text&quot;&gt;t+1&lt;/code&gt;时刻，&lt;code class=&quot;language-text&quot;&gt;xt2&lt;/code&gt;代表&lt;code class=&quot;language-text&quot;&gt;t+2&lt;/code&gt;时刻，&lt;code class=&quot;language-text&quot;&gt;pt1&lt;/code&gt;代表&lt;code class=&quot;language-text&quot;&gt;t+1&lt;/code&gt;时刻的降水指标数据。依次进行 pretrian、finetune 和 precipitation 的训练。&lt;/p&gt;
&lt;p&gt;目前该样本数据集已整合进幻方数据集仓库中，可以通过&lt;code class=&quot;language-text&quot;&gt;hfai.datasets.ERA5&lt;/code&gt;调取使用。更多参考&lt;a href=&quot;https://doc.hfai.high-flyer.cn/index.html&quot;&gt;hfai 文档&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id=&quot;模型训练&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E8%AE%AD%E7%BB%83&quot; aria-label=&quot;模型训练 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型训练&lt;/h3&gt;
&lt;p&gt;训练分为 pretrian、finetune 和 precipitation 三个部分，每个部分的输入输出各有不同。&lt;/p&gt;
&lt;p&gt;pretrain 部分，以 &lt;code class=&quot;language-text&quot;&gt;X(t)&lt;/code&gt; 作为输入，预测下一步&lt;code class=&quot;language-text&quot;&gt;X(t+1)&lt;/code&gt;，旨在缩小预测的误差。训练 80 个轮次。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; xt&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; xt1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _ &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;datasets&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ERA5&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loader&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    out &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; backbone_model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    loss_pretrain &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; criterion&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xt1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; out&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;finetune 部分，在原有主干模型（backbone）的基础上，多预测一步&lt;code class=&quot;language-text&quot;&gt;X(t+2)&lt;/code&gt;，进一步提升模型预报的精度。训练 50 个轮次。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; xt&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; xt1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; xt2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _ &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;datasets&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ERA5&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loader&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    out1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; backbone_model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    out2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; backbone_model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;out1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    loss_finetune &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; criterion&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xt1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; out1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; criterion&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xt2&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; out2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;preciptation 部分，原有的主干模型训练完毕，以&lt;code class=&quot;language-text&quot;&gt;X(t+1)&lt;/code&gt;的信息，预测同时刻的降水&lt;code class=&quot;language-text&quot;&gt;P(t+1)&lt;/code&gt;。训练 25 个轮次。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; xt&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pt1 &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;datasets&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ERA5&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loader&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    out &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; backbone_model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xt&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    out_p &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; precip_model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;out&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    loss_precip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; criterion&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;pt1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; out_p&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;我们采用&lt;code class=&quot;language-text&quot;&gt;hfai.ddp&lt;/code&gt;调用 hfreduce 加速训练，使用 64 张 A100 进行数据并行加速，数据和模型采用半精度，最终整体训练耗时在 13~14 小时左右。&lt;/p&gt;
&lt;p&gt;更多内容可以阅读我们模型仓库中的开源：&lt;a href=&quot;https://github.com/HFAiLab/FourCastNet&quot;&gt;https://github.com/HFAiLab/FourCastNet&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;训练结果&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AE%AD%E7%BB%83%E7%BB%93%E6%9E%9C&quot; aria-label=&quot;训练结果 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;训练结果&lt;/h2&gt;
&lt;p&gt;我们以 2018 年 9 月的特大型台风“山竹”为例，展示我们复现的效果：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;台风路径&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://hfai-static.high-flyer.cn/743336453bb820eec8c26a9e36973073/3.gif&quot; alt=&quot;3.gif&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;总水汽浓度（Total column water vapour)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://hfai-static.high-flyer.cn/7e29c02ec6acd51fde6fe2a0ab366613/4.gif&quot; alt=&quot;4.gif&quot;&gt;&lt;/p&gt;
&lt;p&gt;可以看到，模型准确预测了未来 3 天的台风行踪路径，风力和降水范围，强度。&lt;/p&gt;
&lt;h2 id=&quot;体验总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%93%E9%AA%8C%E6%80%BB%E7%BB%93&quot; aria-label=&quot;体验总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;体验总结&lt;/h2&gt;
&lt;p&gt;FourCastNet 将 AFNO 应用于气象领域，首次将 AI 气象的分辨率提升至与物理模型同等水平，使得 AI 气象模型应用于真实场景中可能性大幅提高。FourCastNet 在大风、极端暴雨的预测表现，为进一步提升天气预报的准确度，预防极端自然灾害提供了新的方案。幻方 AI 对 FourCastNet 的复现与优化，使得该项研究成果切实落地，为环境治理、灾害预警贡献一份力量。&lt;/p&gt;
&lt;p&gt;综合体验打分如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;研究指数：★★★★★&lt;/p&gt;
&lt;p&gt;该模型首次将 AI 气象分辨率和准确度提升至物理模型水平，促进了 AI 气象模型的落地。同时，与气象领域知识的融合让该方向有更多研究空间。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开源指数：★&lt;/p&gt;
&lt;p&gt;代码没有开源，ERA5 数据下载比较繁琐。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;门槛指数：★★★★&lt;/p&gt;
&lt;p&gt;数据规模大，模型适中，适合多级多卡数据并行训练。一般单卡训练难度比较大。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通用指数：★★★&lt;/p&gt;
&lt;p&gt;该方法是基于 AFNO 的应用，在高分辨率数据场景中皆可以使用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;适配指数：★★★★★&lt;/p&gt;
&lt;p&gt;依赖简单，很容易与幻方 AI 的训练优化工具结合，提效明显。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;幻方 AI 紧跟 AI 研究的前沿浪潮，致力于用领先算力助力 AI 落地与价值创造，欢迎各方数据研究者与开发者们一同共建。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[hfai.checkpoint | 并行训练中的快速保存与加载]]></title><description><![CDATA[分布式训练中模型的保存，特别是大模型，常常需要耗费很多的时间，降低了整体的 GPU 利用率。针对这类问题，幻方 AI 进行了攻关，优化过往深度学习模型单机训练保存的方法，研发出分布式 checkpoint 方案，大幅度降低模型保存与加载上的开销。 分布式 checkpoint…]]></description><link>https://www.high-flyer.cn/blog/checkpoint/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/checkpoint/</guid><dc:creator><![CDATA[小杞]]></dc:creator><pubDate>Mon, 23 May 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;分布式训练中模型的保存，特别是大模型，常常需要耗费很多的时间，降低了整体的 GPU 利用率。针对这类问题，幻方 AI 进行了攻关，优化过往深度学习模型单机训练保存的方法，研发出分布式 checkpoint 方案，大幅度降低模型保存与加载上的开销。&lt;/p&gt;
&lt;h3 id=&quot;分布式-checkpoint&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%88%86%E5%B8%83%E5%BC%8F-checkpoint&quot; aria-label=&quot;分布式 checkpoint permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;分布式 checkpoint&lt;/h3&gt;
&lt;p&gt;当我们进行分布式模型训练，特别是在训练大模型时，保存 checkpoint 需要较长的时间，这不仅浪费集群的计算资源，并且给集群整体的任务调度带来管理成本。为此幻方 AI 提供了一个分布式保存 checkpoint 的功能。&lt;/p&gt;
&lt;p&gt;该功能的基本原理是：假设有 N 块 GPU，我们把模型参数和优化器参数切分成 N 个部分，然后每个分布 rank 把对应的部分写入文件系统；在读取的时候我们从文件系统中读出所有 checkpoint 拼接出完整的模型参数和优化器参数。除了模型参数和优化器参数，其他的信息会由 rank 0 进行保存。&lt;/p&gt;
&lt;p&gt;使用方法：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;checkpoint &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; save&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; load

model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; MyModel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
optimizer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;optim&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Adam&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parameters&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; lr&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.01&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
others &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;epoch&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; epoch&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;step&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; step&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
save&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;latest.pt&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; optimizer&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; others&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;others&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

state &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; load&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;latest.pt&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; map_location&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;cpu&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
epoch&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; step &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; state&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;epoch&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; state&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;step&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;load_state_dict&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ckpt&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;model&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
optimizer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;load_state_dict&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ckpt&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;optimizer&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;集群上实际测试性能如下：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 472px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/6dfa0d810e1e4b12191a3864a47e6712/3c5de/0.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 78.52760736196319%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAAACXBIWXMAAAsTAAALEwEAmpwYAAABnklEQVQoz42SW2/jIBCF8/9/3751pTjJRmljLsbYzAWGqTBpukkq7R6dF8N8MD7DTlVFqpRSSr7rcDj8fnvb7/dmHIdhOB6PIsLM94Jaq6ruSinOmOOH83ElIkAExGVZ59i0rGlZm/o6ICJRjAsRNVhVM7MPM8xW0StsxkkpNOO0+Wt92yJI2OFSihlHJPIrqVat/7IqESHi7WYAYOYAOUvbe1Wj9OYHWETGcSwlRyyJiv6HvmHv/bIsmbmIuta5Pt5eE8sKCCkBQItw0y2w0+nknGNmVfUrSa2PDVfr3HA4/tp0uVyu16sxptfvrLUxRto+ppUwyxOsknNmJGLmPl7c1OBaawihn4QsIfE9oZ+Se0z7b1hqfQ/w1HlnvqTPcIyxw6pqIn4EmIFXymWbXH0562FU1to73JWlrlROLk2Jp5Qj5sTSLQ3m70dCRO31bkrbSABSyZkIiVvdvCYzzS4sLsQ/Zj68m5L5Bou0QGOMrW6eicg5b4w9n8/e+/0wIKJ3DgG8swBgre0N7n58Q6UUa633PoTgvX/97Q5/ArCspdKiEgPRAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;0.png&quot;
        title=&quot;0.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/6dfa0d810e1e4b12191a3864a47e6712/3c5de/0.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/6dfa0d810e1e4b12191a3864a47e6712/222b7/0.png 163w,
https://hfai-static.high-flyer.cn/static/6dfa0d810e1e4b12191a3864a47e6712/ff46a/0.png 325w,
https://hfai-static.high-flyer.cn/static/6dfa0d810e1e4b12191a3864a47e6712/3c5de/0.png 472w&quot;
        sizes=&quot;(max-width: 472px) 100vw, 472px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;可以看到，随着并行程度的增加，使用&lt;code class=&quot;language-text&quot;&gt;hfai.checkpoint&lt;/code&gt;进行模型保存加载的耗时越来越少。&lt;/p&gt;
&lt;h3 id=&quot;自动断点训练&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%87%AA%E5%8A%A8%E6%96%AD%E7%82%B9%E8%AE%AD%E7%BB%83&quot; aria-label=&quot;自动断点训练 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;自动断点训练&lt;/h3&gt;
&lt;p&gt;对于幻方萤火集群上的训练，需要接收集群统一的调度信号进行训练任务的管理。这里幻方 AI 提供了一个 &lt;code class=&quot;language-text&quot;&gt;hfai.checkpoint.init&lt;/code&gt; 函数帮助用户进行断点训练，该函数会自动加载上次保存的模型、优化器等状态，返回上次训练的 epoch 和 step，我们可以通过 epoch 和 step 进行优雅断点训练。同时，我们会向 model 注册一个成员函数 &lt;code class=&quot;language-text&quot;&gt;try_save&lt;/code&gt; ，通过这个函数可以在打断训练之前保存训练的状态。&lt;/p&gt;
&lt;p&gt;使用方法：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; MyModel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
optimizer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;optim&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Adam&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parameters&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; lr&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.01&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

start_epoch&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; start_step&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; others &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;checkpoint&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;init&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; optimizer&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ckpt_path&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;latest.pt&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; epoch &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;start_epoch&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; epochs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; step&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;enumerate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dataloader&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; step &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; start_step&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;

        output &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        loss_fn&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; output&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;backward&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;try_save&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;epoch&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; step&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; others&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;通过上述封装，您可以在代码中省去很多断点操作，简单方便地将代码适配幻方萤火系统，进一步降低门槛。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[萤火跑模型 | 高精地图构建模型 HDMapNet 助力更精准的自动驾驶]]></title><description><![CDATA[高精地图是自动驾驶系统的关键模块，可以有效提升自动驾驶汽车的行驶安全度，强化自动驾驶系统的整体感知能力和决策能力。然而传统的高精地图构建流程复杂，需要消耗大量的资源和人力，导致其扩展性和实时性无法满足自动驾驶的使用需求。 CVPR 2021 Workshop…]]></description><link>https://www.high-flyer.cn/blog/hfmapnet/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/hfmapnet/</guid><dc:creator><![CDATA[Freja]]></dc:creator><pubDate>Mon, 09 May 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;高精地图是自动驾驶系统的关键模块，可以有效提升自动驾驶汽车的行驶安全度，强化自动驾驶系统的整体感知能力和决策能力。然而传统的高精地图构建流程复杂，需要消耗大量的资源和人力，导致其扩展性和实时性无法满足自动驾驶的使用需求。&lt;/p&gt;
&lt;p&gt;CVPR 2021 Workshop 最佳论文提名的一篇文章 HDMapNet，来自清华大学交叉信息院 MARS Lab，提出了一个使用深度神经网络实时构建局部高精地图的思路，该方法是从传统的高精地图构建流程转向端到端方法的关键工作。&lt;/p&gt;
&lt;p&gt;幻方AI最近对这项工作进行了整理和优化，在幻方萤火二号上复现了实验。通过幻方自研的 &lt;a href=&quot;/blog/3fs&quot;&gt;3FS&lt;/a&gt;、&lt;a href=&quot;/blog/hf-redcue&quot;&gt;hfreduce&lt;/a&gt;、&lt;a href=&quot;/blog/hfnn&quot;&gt;算子&lt;/a&gt;，对模型训练进行提速，整合代码、简化接口，融入hfai数据仓库和模型仓库中，帮助研究者和开发者们降低使用门槛。本期文章将为大家详细描述。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文标题&lt;/strong&gt;：HDMapNet: An Online HD Map Construction and Evaluation Framework&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原文地址&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/abs/2107.06307&quot;&gt;https://arxiv.org/abs/2107.06307&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;项目主页&lt;/strong&gt;：&lt;a href=&quot;https://tsinghua-mars-lab.github.io/HDMapNet&quot;&gt;https://tsinghua-mars-lab.github.io/HDMapNet&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型仓库&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/hdmapnet&quot;&gt;https://github.com/HFAiLab/hdmapnet&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;模型介绍&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E4%BB%8B%E7%BB%8D&quot; aria-label=&quot;模型介绍 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型介绍&lt;/h2&gt;
&lt;h3 id=&quot;高精地图&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E9%AB%98%E7%B2%BE%E5%9C%B0%E5%9B%BE&quot; aria-label=&quot;高精地图 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;高精地图&lt;/h3&gt;
&lt;p&gt;高精地图分为影像地图和语义地图，自动驾驶使用的通常是高精地图的语义地图部分，因此本文的高精地图特指高精语义地图。高精地图是车道级别、厘米精度的道路网络和交通信息地图，包括且不限于如下标注信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;厘米级车道边线和中心线几何信息&lt;/li&gt;
&lt;li&gt;车道线类型（白虚线/白实线/黄虚线/黄实线）&lt;/li&gt;
&lt;li&gt;车道线类（高速/城市道路/自行车道）&lt;/li&gt;
&lt;li&gt;交通信息（红绿灯/限速）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/3d89d3d66a371ee3db3d6a591d1b333f/5a190/banner.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 50.920245398773%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAACb0lEQVQoz0WSa08aexDG90s0OUfASnoa2AW01QXcy393ua6US3WLICi4yE0WUWztqe2J5vRFm77od/41YJO+ePLMTOaZeZIZKaTYbMQFG7IgrFis8rBiE0k8xS+SGaq1Ip3RgozhEJF1nicEYVkQ+q2JJGzCKygW0lbSQN61iL22iCZXzRqhuM6mohPbydBqZJl/CBjPTtjTTZ7FHP6OW2vx81RubeSvmLE2tVog5esVzv0mna7H25pD97hErmhQKml4dcHdh2tuPn2k2W7gujbZ/TR58Yq661AuOqhqFrvgsqvZyLsakj87Zzj3GV71GM773P475u4xYLSYcDa6ZLK8I7hZcj5d0h+MCGZdFjOX816JQ8+hVnepVAvU62UOGlWk5qnHxazFdN5meX/Bw4+P3P93j38ZMLgOGMyuuFwGPD6+5+e3z/z/8MjX73OWny+Z3FzQn3QYLfp8eZgynbWRUmqaVFpH1bPkywccnRzjVFscdcb0pwHeyQVVr09v0GfoH3M1OuZ2UWHgV+j0PLp+i9Nhl2Hg0x+fIkViabZklXhKRd7ewylYFGtNFl8eGIxv2S80MHIVhK2hZlQcJ4twMuj6KzKGRkaYHB7WeNc6otpwkdL5JnvOES92HP5JpcnlTbyzMybvr2m0OtilCruqzssdg+i2tb7+lrJPNKmxETcIxU02FUEophGO60gHtTZutYkhCgjTwBYWHX/Em9aq3sDWdeLbGvt5D6tySnQ7R1g2iSgmYdlaI7Ti1f/KFtLLlEFaL1JyXUzTpvb2HV67R0qUeVMtk3wtiCYEsb0ycrrCZsJ+GrCGeGLlD34B+y1rRRnMGtwAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;banner&quot;
        title=&quot;banner&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/3d89d3d66a371ee3db3d6a591d1b333f/a6d36/banner.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/3d89d3d66a371ee3db3d6a591d1b333f/222b7/banner.png 163w,
https://hfai-static.high-flyer.cn/static/3d89d3d66a371ee3db3d6a591d1b333f/ff46a/banner.png 325w,
https://hfai-static.high-flyer.cn/static/3d89d3d66a371ee3db3d6a591d1b333f/a6d36/banner.png 650w,
https://hfai-static.high-flyer.cn/static/3d89d3d66a371ee3db3d6a591d1b333f/5a190/banner.png 800w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;高精地图作为自动驾驶汽车的高精度“记忆”模块，是自动驾驶决策的关键依据，离开了“记忆”，无论眼睛（摄像头和雷达）和思考（控制决策系统）有多么发达，都无法对事件有全局的把控。高精地图为自动驾驶系统提供了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;厘米精度的定位&lt;/li&gt;
&lt;li&gt;超过相机视野的地图记忆&lt;/li&gt;
&lt;li&gt;反应当前路况的实时信息&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;传统高精地图构建流程&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BC%A0%E7%BB%9F%E9%AB%98%E7%B2%BE%E5%9C%B0%E5%9B%BE%E6%9E%84%E5%BB%BA%E6%B5%81%E7%A8%8B&quot; aria-label=&quot;传统高精地图构建流程 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;传统高精地图构建流程&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/59fbf016677773fc92a73d65063eb2cc/69243/1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 41.717791411042946%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABzElEQVQoz22SvWsTcRjHT6qjnfpPODoVuopD6dDBF3ByERQFaQs6OevSDhK6RIyDboKNJYOTQ2J66RAbUimmmECaNne55noX7+X3u/vd5SOeEmLxCw88z8Pz+n0erW8MqNaa9I57mIZJr9fD932mMR6PJzLl5X/QfCHQvzYJw5A0STFNE2swIAwkozOfMJT/JIg4YeSHqBSGto1pWcQiQgYBkQjQXNdhd6dCohRCiCzpxUaOhesL3Lq/yPKNJSxrmPnLX6pcW1xi+eZt7j54ROfbPmZzD9tJsKw+ge+gBZHg8PiQSMpJwXsP7zB39TLzz59xZX6WH60Oo5FLoVBA0zRmL13kwswM3XYbRIB1FmP8baoNHYfPlQq2bWdrK5VSqX7i5eu3bL6v8eZdHhVHWfBJ/4Riscj2x21KpRJC/KHj1I45ah9lcVq/b3Bw8J1Wq0W3251Mef4oaoqS8/D8CMdz8ISLZlkWuc0c6xvr5F/l0Ws6cRQx/OnhhB5KRVkxz/Mol8voup7pUkqUilEqQaURp46DjCVap9PmydM1VlYes7q2ytbWB5IkZceAPVuSjmVmu65LvV6n0Whkb5UkSdbo92cEQYBhGBltvwAqKzdVErcJSgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;1&quot;
        title=&quot;1&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/59fbf016677773fc92a73d65063eb2cc/a6d36/1.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/59fbf016677773fc92a73d65063eb2cc/222b7/1.png 163w,
https://hfai-static.high-flyer.cn/static/59fbf016677773fc92a73d65063eb2cc/ff46a/1.png 325w,
https://hfai-static.high-flyer.cn/static/59fbf016677773fc92a73d65063eb2cc/a6d36/1.png 650w,
https://hfai-static.high-flyer.cn/static/59fbf016677773fc92a73d65063eb2cc/e548f/1.png 975w,
https://hfai-static.high-flyer.cn/static/59fbf016677773fc92a73d65063eb2cc/3c492/1.png 1300w,
https://hfai-static.high-flyer.cn/static/59fbf016677773fc92a73d65063eb2cc/69243/1.png 3758w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;构建传统的高精地图需要经过一系列流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用车辆到道路上采集信息，需要大量的人力和车辆资源。&lt;/li&gt;
&lt;li&gt;将收集到的数据进行处理，包括点云拼接、地图生产等。&lt;/li&gt;
&lt;li&gt;对点云中的信息进行识别，例如道路、车速牌等。&lt;/li&gt;
&lt;li&gt;人工验证识别结果的准确性，确定最终的标注。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;构建完成后还需要定时进行更新维护，以适应不断变化的路况信息，这样繁杂的流程需要消耗大量的资源和人力，导致其扩展性和实时性无法满足自动驾驶系统的使用需求。&lt;/p&gt;
&lt;h3 id=&quot;hdmapnet&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hdmapnet&quot; aria-label=&quot;hdmapnet permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;HDMapNet&lt;/h3&gt;
&lt;p&gt;HDMapNet 提出了一种使用车载传感器（相机、雷达）来动态构建局部高精地图的方法，主要创新点如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将高精地图使用向量化的方法进行表示，包括：
&lt;ul&gt;
&lt;li&gt;语义分割向量化：使用三个类别表示道路边缘、道路分割线、斑马线三类线段&lt;/li&gt;
&lt;li&gt;实例分割向量化：使用不同的编号标识不同的线段&lt;/li&gt;
&lt;li&gt;方向识别向量化：使用 36 个集合表示 360 度的道路方向&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;使用深度神经网络学习从相机前视图到鸟瞰视图的转换&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/8b8eb9092a12a54133330b25dd53739d/82e9f/2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 34.355828220858896%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAABhUlEQVQoz12RzW7TQBSF/ZzQN0BiBYpUCbHrglfoukJiBwuWZVFogCaVIqpSmjglSuLYGTueyYz/Zsb+kExVFY50da6udH/OucFsesvNzU/CMMR7R+ernl2V4W2Ft4auo4cymqvpLfNwjrO2r3Vd908Eg8FLnh48YXD4iiy+xq5PUMkl6++HGDFhfXl039hSFiUyl2ySiG0m8N7zP4LR6ILTT6cMh0Ok3JGKCKMluzQmDGfsVYqtLb5xiEIynk34+nnE9McvGmspC0NtNKVSvbLg8fT+7NbRtX81NlXdsxwtKL5FjOMLnr95xuuDF7w9OkbpPUkSU+gdMo6otCaoXYuqa+g8tW2ZiRZTeVJVUTWOldBso5hkFZNLwfDLOWdnQ6bhvF9snUMXhixLydOUYG3g48phqNjkDe/Gjt/xnvfnC+42kuMPExrb4Lyjrhp0rjFS92rs/WOcdX3u25YgV4rNNkMbw96U3C0TurbFGE2aCsqyfLDEOUcqBMvFEiXVg02Pn/IHQJILJA+lf3IAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;2&quot;
        title=&quot;2&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/8b8eb9092a12a54133330b25dd53739d/a6d36/2.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/8b8eb9092a12a54133330b25dd53739d/222b7/2.png 163w,
https://hfai-static.high-flyer.cn/static/8b8eb9092a12a54133330b25dd53739d/ff46a/2.png 325w,
https://hfai-static.high-flyer.cn/static/8b8eb9092a12a54133330b25dd53739d/a6d36/2.png 650w,
https://hfai-static.high-flyer.cn/static/8b8eb9092a12a54133330b25dd53739d/e548f/2.png 975w,
https://hfai-static.high-flyer.cn/static/8b8eb9092a12a54133330b25dd53739d/3c492/2.png 1300w,
https://hfai-static.high-flyer.cn/static/8b8eb9092a12a54133330b25dd53739d/82e9f/2.png 3658w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;HDMapNet的整体网络结构如上，输入为 RGB 图片或者雷达点云，两种输入可以单独使用，也可以同时使用，实验结果表示，RGB 图片和雷达点云同时使用时能达到最佳性能。&lt;/p&gt;
&lt;p&gt;RGB 图片通过基于 &lt;a href=&quot;https://github.com/lukemelas/EfficientNet-PyTorch&quot;&gt;EfficientNet&lt;/a&gt; 的图像编码器进行编码，如下面图中所示，本车周围六个方向均匀放置了六个相机，在每一个时刻，将六个相机获得的 RGB 图片编码成六个前视图的隐含表征。视角变换步骤（Neural view transformation）利用相机外参，将前视图的隐含表征转换到鸟瞰图的隐含表征，如下面图片的中间步骤到右边步骤的对应关系。最后使用鸟瞰图解码器从鸟瞰图的隐含表征中解码得到最终的鸟瞰图表示。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/76be7fadc7ea9291d0d1fa0e3a18f815/7a1fb/3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 41.104294478527606%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB/ElEQVQoz3WSTU8TcRDG92vxHbwQEi8cSryYEEtptLwcpFAuBpM2JhqIpCGoQWpIGimUUqUEmoa0CWp50SpIu0v6Ymltl6V1t+z+f6arHDz4XGbmmcwzyTwj8ReGrqM2mzTVyxsKIQSWZWLZUdi1ECZCWHBdRegF9r/GyJfTIMpAC6nTucbodEi8j+F2DuIcdlO7qFKrXfA/mCak92PsZV6wEB8gsj1CYm4W5egQaXPzHa57d5l4OEYoHOZ5MIjLOcjQsIsTOceRnOKsUuZA1rhqt6GZQasdEozvM/06yXJyhvmZR0z1zrG9vIeUTCbxeifY2t2GQh2jrhKOrPImFCay9xL3Yg9ToRC3/cd8PM6i7/TQyLgoFlLEMytUtxY5eRskMf8Us32GtLO7g883zVo0CppB+byI/0kAh+MOa6klHq86mN2I4V74Qu40Rzvdz88DP2gLYPTTzvmor3uorwxglNJIG9EI4+MeJie9jIyP4RkdsXOnawjlXKZYUag3mpzmFUzzmmq5gKZWQH+Aqfbx6/gW9fU+lGe9NDNLSDeHzmY/MTZ6n0DA/48BQoBlmoiu25aFZf3hTDWOXplH+zBI69sUWu4VVktG6nZ1XafRaKDrBq1WC1VV7WH7TRCUSiVkRUFRFDodw17UFa6UfyDnP5P/nuPy6srmfwMU1SLQx9G7yQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;3&quot;
        title=&quot;3&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/76be7fadc7ea9291d0d1fa0e3a18f815/a6d36/3.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/76be7fadc7ea9291d0d1fa0e3a18f815/222b7/3.png 163w,
https://hfai-static.high-flyer.cn/static/76be7fadc7ea9291d0d1fa0e3a18f815/ff46a/3.png 325w,
https://hfai-static.high-flyer.cn/static/76be7fadc7ea9291d0d1fa0e3a18f815/a6d36/3.png 650w,
https://hfai-static.high-flyer.cn/static/76be7fadc7ea9291d0d1fa0e3a18f815/e548f/3.png 975w,
https://hfai-static.high-flyer.cn/static/76be7fadc7ea9291d0d1fa0e3a18f815/7a1fb/3.png 1030w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;雷达点云先进行像素化，再通过点云网络得到鸟瞰图的隐含表征，最后通过鸟瞰图解码器解码得到最终的鸟瞰图表示。&lt;/p&gt;
&lt;p&gt;将 RGB 输入和雷达点云输入处理得到鸟瞰图表示后，HDMapNet 使用三个分支：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;语义分割预测：预测鸟瞰视角下，道路边缘、道路分割线、斑马线三个类别，使用二元交叉熵作为损失函数。&lt;/li&gt;
&lt;li&gt;实例分割预测：用不同编号标识不同线段，使用 &lt;a href=&quot;https://github.com/nyoki-mtl/pytorch-discriminative-loss&quot;&gt;DiscriminativeLoss&lt;/a&gt; 作为损失函数。&lt;/li&gt;
&lt;li&gt;道路方向预测：用 36 类分别代表 360 度的道路方向，使用二元交叉熵作为损失函数。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;模型实践&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E5%AE%9E%E8%B7%B5&quot; aria-label=&quot;模型实践 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型实践&lt;/h2&gt;
&lt;p&gt;幻方 AI 基于 &lt;a href=&quot;https://github.com/nv-tlabs/lift-splat-shoot&quot;&gt;lift-splat-shoot&lt;/a&gt; 复现了 HDMapNet，再基于 &lt;a href=&quot;https://github.com/Tsinghua-MARS-Lab/HDMapNet&quot;&gt;HDMapNet 开源代码&lt;/a&gt; 进行修正，采用幻方一系列优化工具进行提速升级，包括 hfreduce 并行训练、hfai 数据集接入、hfai 集群训练断点挂起等功能。&lt;/p&gt;
&lt;h3 id=&quot;数据集&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E9%9B%86&quot; aria-label=&quot;数据集 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;数据集&lt;/h3&gt;
&lt;p&gt;HDMapNet 使用 &lt;a href=&quot;https://www.nuscenes.org&quot;&gt;NuScenes&lt;/a&gt; 数据集进行试验，NuScenes 数据集是第一个提供自动汽车全套传感器数据的大型数据集，包括了6个相机、1个激光雷达、5个毫米波雷达、以及GPS 和 IMU。 与另一个常用的自动驾驶领域 KITTI 数据集相比，其包含的对象注释多了7倍多。&lt;/p&gt;
&lt;p&gt;这里幻方 AI 将 NuScenes 数据集进行处理，将原始数据集转换成 ffrecord 的格式，用户调用简单的接口便可以加载高性能的 dataloader 进行模型训练。具体如下示例：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;datasets &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; NuScenes

dataset &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; NuScenes&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;split&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;train&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
loader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dataset&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loader&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;batch_size&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; num_workers&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; data_dict &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; loader&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# training model ...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;仅仅需要上述 4 行代码，我们便可以获得如下格式的 NuScenes 数据集：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/515a2081aa6b842ef4412dd0f607ecfc/09e48/4.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 25.766871165644172%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA00lEQVQY032QyYqEUAxF/f/vciUIKqLigCNa5Vyl4vIW5zVd9KoXl+RlOEmetSyLns+nHo+H+r7XMAwqikJlWSrLMuV5rq7rTI7a67r+lTXPs9q2NQJSVZWCIFCSJArDUJ7nmTiDqH2/39r3Xa/Xy/h/dRzHD5AGgHVdG5umqRzHke/7sm1bURSZQWy5bZu5iD7AvyK+rqsszuBEzkJN0xiw67qK49jAsAwlztfQA3wcx+9X4d/3LQsqWxEkyWn4gIDzRuSmafrWsSU+vWxP7Xme+gBTe3EH0NLE9QAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;4&quot;
        title=&quot;4&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/515a2081aa6b842ef4412dd0f607ecfc/a6d36/4.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/515a2081aa6b842ef4412dd0f607ecfc/222b7/4.png 163w,
https://hfai-static.high-flyer.cn/static/515a2081aa6b842ef4412dd0f607ecfc/ff46a/4.png 325w,
https://hfai-static.high-flyer.cn/static/515a2081aa6b842ef4412dd0f607ecfc/a6d36/4.png 650w,
https://hfai-static.high-flyer.cn/static/515a2081aa6b842ef4412dd0f607ecfc/09e48/4.png 974w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;模型训练&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E8%AE%AD%E7%BB%83&quot; aria-label=&quot;模型训练 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型训练&lt;/h3&gt;
&lt;p&gt;萤火提供了统一的训练管理平台，可以将大量的训练任务依据优先级负载均衡到不同的GPU上执行，充分利用起计算算力。我们只需加入如下几行代码，便可以把训练任务提交给萤火集群运行。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;登录幻方萤火二号，引入 hfai&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/cf10302625c824db74466c92ebab0cb9/a8979/5.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 42.331288343558285%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABbUlEQVQoz3WQ62rcMBCF/f7vVWgL/dOwKQS8SeRd62JLo9t4Y5XoBGm32wv0x2E0MPr4ZgYhpjyJ6ee62KKkKkrqsixrcURFaipSrcUYXbz3xXsqPsQSIhdPVAJzSd++lvjl01sOAcz8fXDO7lrNSCn1xBiQUuxx5KG1gTEaWikopSCVhjYWUko4InCMyCFUZgbn/Dgsy/ImxCuIqMYYawjhXol8NcZcs7herbWVyNU2n1KqvG01M7/nnJFzPgyL0buS3bBB0BJjMwyQJuJFKJzPJ4S4gbxvn7BtW0+zaj3n/H57HwYxnfbjcfxliBB8B5K3mGaH07xCKwnmhMvlgpvJPTdQBzLzYRCz3KfXEZ5cjSnBe+rQVvUSMT5PGMcR4mwxS93v2G59t7uCfgNnZfZJCNjV1uuqqQ9at8KHCKIGD/Ahw99W/gf2N/Dp+LQfHj7j+PyjzvqE0/wCs0iY1YCC62u24a3lz7v9x/ADK4tckYyb4MsAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;5&quot;
        title=&quot;5&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/cf10302625c824db74466c92ebab0cb9/a6d36/5.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/cf10302625c824db74466c92ebab0cb9/222b7/5.png 163w,
https://hfai-static.high-flyer.cn/static/cf10302625c824db74466c92ebab0cb9/ff46a/5.png 325w,
https://hfai-static.high-flyer.cn/static/cf10302625c824db74466c92ebab0cb9/a6d36/5.png 650w,
https://hfai-static.high-flyer.cn/static/cf10302625c824db74466c92ebab0cb9/e548f/5.png 975w,
https://hfai-static.high-flyer.cn/static/cf10302625c824db74466c92ebab0cb9/3c492/5.png 1300w,
https://hfai-static.high-flyer.cn/static/cf10302625c824db74466c92ebab0cb9/a8979/5.png 1828w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;初始化 hfreduce 分布式参数&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/4a888d09a6d50883d84739c9a6094bc3/d9716/6.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 36.809815950920246%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAADLAAAAywAEoZFrbAAAA90lEQVQoz42Qy27FIAxE8//f13aRXqm3gMLLvJMd8lTQsmvULkZgGewzs+nj6METSq5ccuaYCj+lY2MM51I458ytNa61zvO6Lj7P81eN3uac7UQe358Kaq1wPsJYB+s8iAg5Z8SYZu+6LpzneavNGNNDoPGYyw+R1sckVEoxEc3NS4vkTpvSpsvnAykGrjGi7Dus1qAQYIyBtRYhBMQYJ2lKaWrUS6turWET6uhSKQy6Uso4QRThnIP3NG0Mm8vqut9pe3289f3jBcoI1nYMzjM3KSWEEJNybP9PfjNDoWTX6hNlZDiyfN+RQphWvfdz0LCy6P6i/ALwSBPtBHmhtQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;6&quot;
        title=&quot;6&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/4a888d09a6d50883d84739c9a6094bc3/a6d36/6.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/4a888d09a6d50883d84739c9a6094bc3/222b7/6.png 163w,
https://hfai-static.high-flyer.cn/static/4a888d09a6d50883d84739c9a6094bc3/ff46a/6.png 325w,
https://hfai-static.high-flyer.cn/static/4a888d09a6d50883d84739c9a6094bc3/a6d36/6.png 650w,
https://hfai-static.high-flyer.cn/static/4a888d09a6d50883d84739c9a6094bc3/e548f/6.png 975w,
https://hfai-static.high-flyer.cn/static/4a888d09a6d50883d84739c9a6094bc3/3c492/6.png 1300w,
https://hfai-static.high-flyer.cn/static/4a888d09a6d50883d84739c9a6094bc3/d9716/6.png 2736w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;对于每一轮训练，加入接收集群调度的逻辑代码，并做好模型 checkpoint 的保存&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/a639ea42d21a38f5d9d89edc47c6763d/0de5f/7.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46.62576687116564%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAADLAAAAywAEoZFrbAAABh0lEQVQoz4WRW48UIRCF+///O1djfHBnugdoaO5VwGQ2tFUGdCe6MfHhS3Gr1DmHRau9RR9/QIITMpyHd2eI8QTAEwFOSOnMOZ/pd4VxBjDXg1LKWWt9shi9v1l7cKmFMUWOnz9xwcJq17xdV5a3lW9iY6Ukp5QYADjnPBn7Wiu31p4s1h6PcYFYCBHJOUulVnIu0LZtJKQkrQ1ZISg6T4e1FEKYb1trk1rrk0Uo+VBiZciJADJ7Z7kgMpbCl8uFxU2wlJKd8+x9YGPM5F3dRxapzUPcVk5xTmXvHZdSuNbGPjoWdmW1K9b7zvf7ffKnxY8sr9v62OTKaShE4BDDnDRydM7x4QxLJZ+q3nMczf9U+O316+P7+oWFXkmZG3lvZxYjIyEEKaVIa03OObLW0nEc5L2nnPOsg5HpqABAy7pd37S4MgCOHDk4y7WU+YtDlbWWseAvS7X91/YSo285hRMQO8bQ48tLB8CeAbsxpu/73kMIPeXYU04959xTSh0Re2ut11r/4ie8m6g18qJ3oAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;7&quot;
        title=&quot;7&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/a639ea42d21a38f5d9d89edc47c6763d/a6d36/7.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/a639ea42d21a38f5d9d89edc47c6763d/222b7/7.png 163w,
https://hfai-static.high-flyer.cn/static/a639ea42d21a38f5d9d89edc47c6763d/ff46a/7.png 325w,
https://hfai-static.high-flyer.cn/static/a639ea42d21a38f5d9d89edc47c6763d/a6d36/7.png 650w,
https://hfai-static.high-flyer.cn/static/a639ea42d21a38f5d9d89edc47c6763d/e548f/7.png 975w,
https://hfai-static.high-flyer.cn/static/a639ea42d21a38f5d9d89edc47c6763d/3c492/7.png 1300w,
https://hfai-static.high-flyer.cn/static/a639ea42d21a38f5d9d89edc47c6763d/0de5f/7.png 2511w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;训练结果&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AE%AD%E7%BB%83%E7%BB%93%E6%9E%9C&quot; aria-label=&quot;训练结果 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;训练结果&lt;/h3&gt;
&lt;p&gt;我们申请 4 个节点，32 张 A100 显卡进行并行训练。通过hfai命令行工具提交任务，训练效果如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 494px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/56bd60cf7dedee4d1180a98066a8613b/d72d4/9.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 42.331288343558285%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABaElEQVQoz1WS2U7DMBBF+//fhQCBxKYChbIoqCSN19iTSolj+4KnBsFT7ES+PudOVpvHR9q+v+PT+ZxTgjEGvRDwKUFbiyUEfufHES4lLDnDag3jPfQ0wccIFQIoJeydw+r05ISu1mu8OseBUkrs2hamrLVGCAFaKQ4wMSLmDCkEtHMQ04QhRog58LMtgc9PT/TSNNh54kBrLYSUGHMGHQ5YlgXDMMAfDkydCqG1GIig5xkUE+yyHAm9x+ry4oLuNht8+KOy1hrdfg/7h9BozQFFuRCaSqwqYVEulzHh7c0N3W+3+KQjoVKKA4uyGYbfDjkwHjv8qUDWwH6e+VvrPFb36zU9v72hq4HlsBCSaazzrGyNgRtH1iqEZW89wVRlXYciivL52RldPzz8KhfCtut4AFKpf8qFhgml5KH00wS7RHTzDBsjdkW5aRoqUxVEOVXCfd9zJ2Ud/ij7nw7rb2Mroawddt+EX+HEYhSjY/a+AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;9&quot;
        title=&quot;9&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/56bd60cf7dedee4d1180a98066a8613b/d72d4/9.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/56bd60cf7dedee4d1180a98066a8613b/222b7/9.png 163w,
https://hfai-static.high-flyer.cn/static/56bd60cf7dedee4d1180a98066a8613b/ff46a/9.png 325w,
https://hfai-static.high-flyer.cn/static/56bd60cf7dedee4d1180a98066a8613b/d72d4/9.png 494w&quot;
        sizes=&quot;(max-width: 494px) 100vw, 494px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;在萤火二号上训练 HDMapNet，每个 Epoch 耗时仅 5 分钟左右，相比单卡性能提升了 32 倍以上。GPU 利用率在 95% 左右，充分利用其了显卡的计算性能。模型在第 24 轮基本达到了收敛状态。&lt;/p&gt;
&lt;p&gt;训练效果可视化如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;可视化效果1：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/eca58da129b1997c7589faf090547080/fd84e/10.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 57.668711656441715%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAADMElEQVQozx2OTVMTBwCG92+000Mvdrz10B6cVqyCY1t7oFhS1FBQUBRaoPkgH5AghSgozKgzpdPWGcbf0IOeenDGmgICBhiSDSHkY5PNJtlsFpLNF+Zx5J15Ds/Mc3gFcUsimlKJyDWCy2Fir8NEUjXSYojk9g5xMYqSkEgkgmzvSqRTWRKZHFJGQTqskasfEchWCBar5OsNBF0rsZkPsaqsIesyzUoTuVRETO5SNYpsLL9h5YUfRUrztt4gU9RZSRkc1OFlsMy/m2VSWgNoImsNhOBqmG1FZkuOEMuVkDIQVnLEiiK7ikJYSiHGIihGmQpV5OYBG1qV7YO3vEk3WE3UkCtQBoLZI4T1jSj1gyMaNZAjKlI4g6qBJsUIbe3RqNR4P+0wSyyrUTVKZJMK0YgE1UOoV9ALMnJNodI0EKJhjc1knOVYgv1QAjWaYSteYn3lFYVoiB3/Gjv+18hRkXhUIR6NEd5dobK/R3wvRTIcR8kmUZBJGhJCPpzEL+/wSvazp2rkCqBVaoh5EfVIYz0QYNn/Hxld5YgmBnX25ASqVmRtPYM/kENPa6DqlLU6wrN/gqgFg7xWIpsrsZ8osy02UNKb/B8QKRpV6s0Gh1WDjJ5BKufI+wMoL15SKWgYRZ1SXkXfj6GHRIR7bid3J8fxjDsZd9qY9DiwWgcZ6OlieKAPm2WE58+ec3dmml7zFXrM3TiGBvFaRvA47Tz5exHL6CCdP3Zw6vQpBI/TyohtjFG7g3HvJKM2O11mMxe+/YYvzrTwVWsrtjEHv9rtXO42Y77Wj/POzLHPzs3y6PFDJrxervX3HfeC125n/v4c0z4fk79N4XA5sbnduKwWhm8NMH1vjqkZH9f7+2k738bpli/pNpmw3r7No/kH/P7HIi6XE+uYncHhXxB++O4CjqF+hoduMeGw4HHY8E64GbjRQ1/vZdwuJ06HjfNtZ/nkxMd8/tmn3Ljey9DNPmZ9Uyw88NHRfpGTJ0/w4UcfILx/NL8wj2/uPqar3XzdfonOqz9xqfN7TKZ2rnR10N5+8ZjWtjOcPdeCZ+oOi3/9ydLTpzxZWmLh4WMcnklu/jzMO07/5hIgambLAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;10&quot;
        title=&quot;10&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/eca58da129b1997c7589faf090547080/a6d36/10.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/eca58da129b1997c7589faf090547080/222b7/10.png 163w,
https://hfai-static.high-flyer.cn/static/eca58da129b1997c7589faf090547080/ff46a/10.png 325w,
https://hfai-static.high-flyer.cn/static/eca58da129b1997c7589faf090547080/a6d36/10.png 650w,
https://hfai-static.high-flyer.cn/static/eca58da129b1997c7589faf090547080/e548f/10.png 975w,
https://hfai-static.high-flyer.cn/static/eca58da129b1997c7589faf090547080/fd84e/10.png 1056w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可视化效果2：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/28261200b8683cc52f5a976603ed9d93/fd84e/11.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 57.668711656441715%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAADMUlEQVQozyXD209bBQDA4fPv+CBb4mVPZsqD3MGF2tIWKJRrYR1QtgGjCDMsmbwaY3zQRLKHmagzPvhgZhyLD4N0DLpe1vvl9PSctqctvZ7Sdv2Z6Jd8gtcdI5osE5TyhFKF/0bECmIgQszrQZFSpHIK6ayMlJVJSiqprEpcyaJoTRLVJmLt/5nLFoJYF8lpOV5XTvBVzvBUXORqKpVqnXT9gmwuw3nIhz8WwhsPUiiVKGgdEuU2sWyTv9x1/vFrPPfVUastBHc6gTelcJo5x6Wcc6ycIqpF8m9bpMgTkyXO33g483s4872meFkm0+rgLbVxZ9ochZs8Czc4Cl+iaB2EoDeH11ekUARV7ZBXO8iZFqqSIZOKIqsK2tsm9aZGvdUgX6pQUhQUKY1aLNBpV2k3q7RbNbRKDSGSKOIXZY4TAVyJEGdinNNAHikiIkfjxCJhPGE//liQYDKCxydSjovUEkly8SjxqB8xEiAdi1D0xhEuGhpSTcZVfsar+nM8jRfIlwmqNNAAKatw4nmJy/MKb+QNhXaFRr2K1tBIlTO4lAQnWRF3PodUaiK8PCtw9CJPNFnD7c9y7lcIRMqkiypiPkkwI1PjEvkiRyIrIRWzFMNBcqfHqJ5TyskQhYiHXMjLRSiAYBzuwzDcg3FMx+HhDxw+eoRtYYapz3UYb9xg5eYSfz99ysad2wwN9DLS38vcxAS2cRPzU2bMlnG2d5zc3dzAZJlA6B/qwzymw2Q28/jnJzz540+mZxcYHTOhN5kZGzNgt9uxTE3zSXc3V650Mdg/yLjBwJf7D/ju+x/55bffefzTr6w41hF2V+04HA4WbAtYrJMs3Vpi8eYShuEBxkdHcG5v8cXefaanp9DrdXR3f4xxZBCL7jOWF+e4t7PF7KyV3ft7bDm3EAZ7PuX69Y/44P2rdL37DvPWSWask1z78CrX3uti3jrF2uoKQwM99PX2YDab2XU6caytM7+wyObmJs6tbUwmM0ajCcG+dpvdvX2WbzlYXb/DvZ091je26envZVQ3wrJthrm5aRZtc+gNeixWKw8efoVp0srMvI1l+yp7+w/5+ptvOTg44F9nWuCnyFSHqQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;11&quot;
        title=&quot;11&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/28261200b8683cc52f5a976603ed9d93/a6d36/11.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/28261200b8683cc52f5a976603ed9d93/222b7/11.png 163w,
https://hfai-static.high-flyer.cn/static/28261200b8683cc52f5a976603ed9d93/ff46a/11.png 325w,
https://hfai-static.high-flyer.cn/static/28261200b8683cc52f5a976603ed9d93/a6d36/11.png 650w,
https://hfai-static.high-flyer.cn/static/28261200b8683cc52f5a976603ed9d93/e548f/11.png 975w,
https://hfai-static.high-flyer.cn/static/28261200b8683cc52f5a976603ed9d93/fd84e/11.png 1056w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;体验总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%93%E9%AA%8C%E6%80%BB%E7%BB%93&quot; aria-label=&quot;体验总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;体验总结&lt;/h2&gt;
&lt;p&gt;HDMapNet 新颖的提出了使用深度神经网络构建局部高精地图的方法，减少了传统构建方法耗费大量人力和资源的问题、增加了高精地图的可扩展性和实时性，有助于构建更加智能的自动驾驶系统。幻方 AI 对 HDMapNet 的实验进行了复现，借助萤火平台对 HDMapNet 的训练进行了优化，最终达到了超过单卡 32 倍的训练速度。&lt;/p&gt;
&lt;p&gt;综合体验打分如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;研究指数：★★★★&lt;/p&gt;
&lt;p&gt;该模型以低成本、端到端的方法实时构建局部高精地图，是自动驾驶领域的重要课题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开源指数：★★★★★&lt;/p&gt;
&lt;p&gt;数据处理和代码都已经开源，代码逻辑清晰、可读性高。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;门槛指数：★★★&lt;/p&gt;
&lt;p&gt;数据量、模型大小中等，普通高性能单卡即可运行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通用指数：★★&lt;/p&gt;
&lt;p&gt;该方法是基于神经网络构建高精地图方法的早期工作，地图丰富度、定位精度、预测性能有待提升。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;适配指数：★★★★★&lt;/p&gt;
&lt;p&gt;依赖简单，很容易与幻方AI的训练优化工具结合，提效明显。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;幻方 AI 紧跟 AI 研究的前沿浪潮，致力于用领先算力助力AI落地与价值创造，欢迎各方数据研究者与开发者们一同共建。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[开始使用 hfai]]></title><description><![CDATA[幻方萤火 AI 训练平台 hfai 可以为您提供简单易用的深度学习训练服务。使用 hfai，您可以在幻方萤火二号上自由部署训练大规模深度学习网络，使用幻方萤火的优化工具为您的模型训练加速。 观看以下视频快速了解如何通过控制台使用 hfai。 官方文档：https://doc…]]></description><link>https://www.high-flyer.cn/blog/hfai_usage/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/hfai_usage/</guid><dc:creator><![CDATA[High-Flyer]]></dc:creator><pubDate>Tue, 26 Apr 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;幻方萤火 AI 训练平台 hfai 可以为您提供简单易用的深度学习训练服务。使用 hfai，您可以在幻方萤火二号上自由部署训练大规模深度学习网络，使用幻方萤火的优化工具为您的模型训练加速。&lt;/p&gt;
&lt;p&gt;观看以下视频快速了解如何通过控制台使用 hfai。&lt;/p&gt;
&lt;video controls poster=&quot;https://hfai-static.high-flyer.cn/resource/hfai_usage_poster_v3.jpg&quot;&gt;
    &lt;source id=&quot;mp4&quot; src=&quot;https://hfai-static.high-flyer.cn/resource/hfai_usage_v4.mp4?raw=1&quot; type=&quot;video/mp4&quot;&gt;
&lt;/video&gt;
&lt;br/&gt;
&lt;p&gt;&lt;strong&gt;官方文档&lt;/strong&gt;：&lt;a href=&quot;https://doc.hfai.high-flyer.cn/index.html&quot;&gt;https://doc.hfai.high-flyer.cn/index.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;宣传推文&lt;/strong&gt;：&lt;a href=&quot;https://mp.weixin.qq.com/s/qslsTUeq06bu09IVJ5TwBA&quot;&gt;https://mp.weixin.qq.com/s/qslsTUeq06bu09IVJ5TwBA&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;案例代码&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/hfai-models/tree/main/resnet&quot;&gt;https://github.com/HFAiLab/hfai-models/tree/main/resnet&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;使用说明&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E&quot; aria-label=&quot;使用说明 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;使用说明&lt;/h2&gt;
&lt;p&gt;您可以&lt;a href=&quot;https://docs.qq.com/form/page/DR1FaSEZ1a0VDaUZT?_w_tencentdocx_form=1#/fill&quot;&gt;申请使用&lt;/a&gt;，审批通过后就可以获得 hfai 专属账号和资源。您通过 VPN 接入幻方萤火的网络，浏览器访问 &lt;a href=&quot;https://studio.yinghuo.high-flyer.cn%EF%BC%8C%E9%80%9A%E8%BF%87%E9%A2%84%E8%AE%BE%E8%B4%A6%E5%8F%B7%E7%99%BB%E5%BD%95%E5%8D%B3%E5%8F%AF%E4%BD%BF%E7%94%A8%E3%80%82&quot;&gt;https://studio.yinghuo.high-flyer.cn，通过预设账号登录即可使用。&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;使用样本数据格式-ffrecord&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%BF%E7%94%A8%E6%A0%B7%E6%9C%AC%E6%95%B0%E6%8D%AE%E6%A0%BC%E5%BC%8F-ffrecord&quot; aria-label=&quot;使用样本数据格式 ffrecord permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;使用样本数据格式 ffrecord&lt;/h2&gt;
&lt;p&gt;ffrecord 是 hfai 提供的适用于模型训练场景的样本数据格式，其与幻方萤火集群的结构相适应，能提供高性能的批次数据读取。更多信息，请参见&lt;a href=&quot;/blog/ffrecord&quot;&gt;《幻方萤火 | 高性能数据格式 ffrecord》&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&quot;使用并行训练工具-hfreduce&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%BF%E7%94%A8%E5%B9%B6%E8%A1%8C%E8%AE%AD%E7%BB%83%E5%B7%A5%E5%85%B7-hfreduce&quot; aria-label=&quot;使用并行训练工具 hfreduce permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;使用并行训练工具 hfreduce&lt;/h2&gt;
&lt;p&gt;hfreduce 是 hfai 提供的高速模型并行训练工具，根据幻方萤火集群的特性专为计算节点设计的 All Reduce 工具。其使用 CPU 做加法运算以计算总梯度。更多信息，请参见&lt;a href=&quot;/blog/hf-reduce&quot;&gt;《幻方萤火 | 模型并行训练工具 hfreduce》&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&quot;使用深度学习算子-hfainn&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%BF%E7%94%A8%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E7%AE%97%E5%AD%90-hfainn&quot; aria-label=&quot;使用深度学习算子 hfainn permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;使用深度学习算子 hfai.nn&lt;/h2&gt;
&lt;p&gt;hfai.nn 是 hfai 中的算子模块，其提供了比 Pytorch 原生算子性能更优异的优化算子，助力一些常见场景下的模型训练加速。更多信息，请参见&lt;a href=&quot;/blog/hfnn&quot;&gt;《幻方萤火 | 性能卓越的深度学习算子 hfai.nn》&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[萤火跑模型 | 气象预测之时空图神经网络]]></title><description><![CDATA[气象预测直接关乎人类社会的生产生活，一直以来是人类重点研究的科学领域之一。传统的天气预报采用非常复杂的数值气象模型，近年来越来越多的机器学习，深度学习方法被应用到这一领域，他们将气象预测抽象成一个时空预测问题，尝试通过多维时间序列、图神经网络（GNN）等方法来解决。
​
AAAI…]]></description><link>https://www.high-flyer.cn/blog/meteoro/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/meteoro/</guid><dc:creator><![CDATA[Vachel]]></dc:creator><pubDate>Wed, 09 Mar 2022 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;气象预测直接关乎人类社会的生产生活，一直以来是人类重点研究的科学领域之一。传统的天气预报采用非常复杂的数值气象模型，近年来越来越多的机器学习，深度学习方法被应用到这一领域，他们将气象预测&lt;strong&gt;抽象成一个时空预测问题&lt;/strong&gt;，尝试通过多维时间序列、图神经网络（GNN）等方法来解决。
​
AAAI 2022前不久公布了今年的 Accept Paper List，其中来自西湖大学的几位研究者联合发表了一项科研成果。他们针对近年来交通流预测任务下的图神经网络模型，认为其架构不能直接照搬进气象预测领域并进行了证明。提出了一系列改进方法，最终模型取得了SOTA的效果。&lt;/p&gt;
&lt;p&gt;幻方AI团队最近复现优化了该项研究成果，来看看最近火热的GNN是否可以有效提升气象预测的精度，缩短预测时间。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文标题&lt;/strong&gt;：Conditional Local Convolution for Spatio-temporal Meteorological Forecasting&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文地址&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/abs/2101.01000&quot;&gt;https://arxiv.org/abs/2101.01000&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文源码&lt;/strong&gt;：&lt;a href=&quot;https://github.com/BIRD-TAO/CLCRN&quot;&gt;https://github.com/BIRD-TAO/CLCRN&lt;/a&gt;
​&lt;/p&gt;
&lt;h2 id=&quot;模型介绍&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E4%BB%8B%E7%BB%8D&quot; aria-label=&quot;模型介绍 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型介绍&lt;/h2&gt;
&lt;p&gt;在交通流预测领域中，“GNN+RNN”的方法近年来获得了许多成功，其静态切片空间的图结构抽象，到动态时间上的embedding累积，有效解决了&lt;strong&gt;时空预测场景下的图动态问题&lt;/strong&gt;。与交通流预测类似，气象预测也可以抽象为一个时空预测问题。然而，只是简单的套用交通流预测的方法，往往不能取得很好的效果。&lt;/p&gt;
&lt;p&gt;气象预测领域的特殊性有：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;数据的不规则性&lt;/strong&gt;：分布世界各地、太空卫星的各种气象传感器所捕捉的气象数据往往是不规则的，使得经典的CNN无法适用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;非平面的数据信号&lt;/strong&gt;：气象数据通常是立体的球形信号，而非平面信号；陆地和海洋的温度传感器各有不同，不在固定的网格结构中，但气象预测往往无法将其割裂开来单独做分析。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高度的时空依赖&lt;/strong&gt;：不同地形表现出完全不同的风流或温度转移模型，而极端气候事件往往使得数据不符合平稳性条件&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 471px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/be334fee3bdf8a2e525e6ccd26cc75fe/1f09d/p0.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 68.09815950920245%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAACNElEQVQ4y3WTy27TQBSG83rs2LCFDRJLeAM2ILHmCdh0wQ4hhFqpi1ZUEEBBqrhEKUmdOE5sx3Y8TmzP+PqhjOtcqHqk0cw5888/5z9npgNQ1zXtPBoOWK2ird+Ofb9xcuoqvxXv7IOFiPh0dozrOjpWVRWtbck362KN8EYU2Xq3dzN36ro5ZE0nnJ68Q6qccBkQ+P6tLNvLs3iGPb2iLIsG0wAPM0ySmPlsqte9bpdvFxe35OxmKAvJKnAQM2OjRcduMtyrCzA1x/S+f0ap7IDkMNtGlUwi1oEBldxJ5j+zrAm/f/04iP1/aWtVHraCd00pioIoEgTLpW5KnMREqwghQoJgSRzHW4IGG+F7HkIIUpnh+b6OtaQdpSSu42A7LknsEy0C7OkSx14wNU0cx90SZlmG5y2Y2zYz28F1bMbjMQvP2xHuSzj9EvL0z0vO5Qtdl7sk52lCHAniNCVNkgNcp6oaoOE4PHjW4+hnl+HwIbL7ikKDyh1hXVMC4dkx6eVXpMr0J2jL0hDWpXYulxe8dh+xefzV2zfI54/R/6CuDjIsypLIX5CKEBn4rOPkkLBNt6wzjsonfIzvk324h+qdc5fFSrE+fY80R0RpSpHn271OnudIJclViVitMLwThOiTFhVSSj2KopGtlCLPMqRShOYYbz4jTlLdrCRJ9Fft2LaDOZkwur7m79UV7lxgWS7XwyGmaTIYDNhgqqrEsizm8zljw8DYnDEm2Latcf1+XxP/A8FTMUAyyRbHAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/be334fee3bdf8a2e525e6ccd26cc75fe/1f09d/p0.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/be334fee3bdf8a2e525e6ccd26cc75fe/222b7/p0.png 163w,
https://hfai-static.high-flyer.cn/static/be334fee3bdf8a2e525e6ccd26cc75fe/ff46a/p0.png 325w,
https://hfai-static.high-flyer.cn/static/be334fee3bdf8a2e525e6ccd26cc75fe/1f09d/p0.png 471w&quot;
        sizes=&quot;(max-width: 471px) 100vw, 471px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，气候预测任务与交通流预测任务的不同在于，&lt;strong&gt;每一个局部点受其四面八方的因素影响&lt;/strong&gt;，局部空间下模式应该基本类似，因为气象学中，热和风是自由扩散的。而交通流预测任务中，两个靠近的交通枢纽之间模式因为交通流向会存在很大差异。
​&lt;/p&gt;
&lt;p&gt;因此，研究者们需要找到一种方法，来抽象气象预测场景下的问题。具体的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将分布地球表面的各种气象信号抽象为一个&lt;strong&gt;球&lt;/strong&gt;数据结构，给予&lt;strong&gt;坐标&lt;/strong&gt;，球体上要区分若干个&lt;strong&gt;局部空间&lt;/strong&gt;（local space），他们与实际地理测地线、欧氏距离相关；&lt;/li&gt;
&lt;li&gt;通过&lt;strong&gt;单位速度测地线&lt;/strong&gt;（unit-speed geodesics）定义出每个局部空间的邻居，进而构建起&lt;strong&gt;等轴映射&lt;/strong&gt;（isometric map），将球体数据结构转化成图数据结构，以描述不同局部空间之间的关系；&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/bb7ca411101d34c74dece7c88cdf77ff/6295b/p1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 32.515337423312886%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAABUUlEQVQoz02Ry47UMBRE8+18Si/Y8Q1sRogdCMFIMLTozjtxnJeT+JHYB3Wi7p6SvLgq3XId3SgXI7UcgEAIgZus22i6hbrX5FWH6DVqXh6+9x5jDPM8Y61F64V1XXcv+vYrI8nLfbgvTHrjz6Xldzzw+rfmnA3M2nHXum1YPWGmlk1LrB45VgNRUo17+i3sHjgulnM2cakMsTC8XXsGtTwD1xWjBEZJvOlx9tk+KqXacZ4NA8GDGCWDGRknQ6UqtLXvkMM+z4vG2BVtHM4dBNGPt5q6afcg/0CG05ePuJ8nPr9eeHn5AOUZf3yLWhzXoiURC7HQXHNJVgvWDaIbzmQ87+WC53v3iS39Suz+cUlPoLqHL3tFXEjK3lH2hmtSUrbz0TAtKkQjkfJ4t8s56yiykkK2tEKS5MVOIWWzX1XNhrRoKOqWvJKkhaAUHV3X8R+2JhiObTjtNwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/bb7ca411101d34c74dece7c88cdf77ff/a6d36/p1.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/bb7ca411101d34c74dece7c88cdf77ff/222b7/p1.png 163w,
https://hfai-static.high-flyer.cn/static/bb7ca411101d34c74dece7c88cdf77ff/ff46a/p1.png 325w,
https://hfai-static.high-flyer.cn/static/bb7ca411101d34c74dece7c88cdf77ff/a6d36/p1.png 650w,
https://hfai-static.high-flyer.cn/static/bb7ca411101d34c74dece7c88cdf77ff/6295b/p1.png 919w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
​&lt;/p&gt;
&lt;p&gt;针对上述问题抽象，该文研究者们提出了**因地制宜的图卷积核（location-characterized kernel）**来改良DCRNN（一种用于交通流预测的图神经网络，ICLR 2018）中的图卷积部分。具体的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;如上图a，为了能更好的保留地球表面地理标线的相对方位，作者采用&lt;strong&gt;圆柱切线空间&lt;/strong&gt;（cylindrical-tangent space）和&lt;strong&gt;水平映射&lt;/strong&gt;（horizon map）方法构建起局部空间并映射其邻居，构建起等轴映射；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;为了更好了模拟气象学中的局部一致性，作者重新设计了&lt;strong&gt;条件局部卷积核&lt;/strong&gt;，以满足&lt;strong&gt;因地制宜的卷积特征&lt;/strong&gt;，&lt;strong&gt;邻近局部特征相似&lt;/strong&gt;和&lt;strong&gt;地理特性不同下的相邻卷积核共享&lt;/strong&gt;三个条件。如上图b，来自东方的xp对西边的两个局部空间 i 和 j 的影响应该是一样的，不会因为xp离 j 近就在图卷积中被赋予更大的信息量；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如上图c，两个相邻空间各自拥有不同的地理分布，这时不能简单的采用平滑方法以满足邻近特征相似。作者提出&lt;strong&gt;结合其距离和角度来重新计算卷积核的权重&lt;/strong&gt;。具体的，在计算测地线距离的基础上，使用&lt;strong&gt;极坐标&lt;/strong&gt;重新刻画数据，计算相邻点的角平分线。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最后，模型整体的结构如下图：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/18f1843b101596c1ef0adef2f79d6547/efc66/p2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 34.96932515337423%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAABk0lEQVQoz22Si27aYAyF8/7v0cumThva1K1cuo5CuAwVtWqzAiGXlmQQAj8kQP5cv4lUmjRpR7LkY8v2kW2lKAr+Gv9HnueYlonv+yX3lh6GaZR+ZyI4/zHl3a3JV22H8m9pSpLskVGIlCF5HgFZmXm1R5jGMy+mjm0+47zq5SB1uqczCrh5Epz1PJTFYo7juMgoIHZbOA8VXrQvWA8VxPgS6Q85eBaeesW4/gm9/RH9uoLoNyjEjIa24X3L5qIz46Q9QzlK16cGcbQhcptszRqEAzJfRUwuSdZ3pCsbv3+FHHXAG7LXWqx+VslXJj0rpjsJudEEp6qLctzNeDJiFyyJ500CqwbbHonXIjC+kW2GZGsbMaiWjYpZn91jEzGowdoqFZ43TS46DidtByVJErZBSJ5Jot9dhN5grjdYTOps9TpLq8ts/IjXu8a/a+Le13F7DbbDW1LhohoRLW3F9yfBaXfxdpQ0TcmyjCSJ2e93SBlxOByI5OEtnqbA8Qsy4lhSFFnJjxiYIR9Um88Dl+qvkD+uHAHPCzbu4QAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/18f1843b101596c1ef0adef2f79d6547/a6d36/p2.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/18f1843b101596c1ef0adef2f79d6547/222b7/p2.png 163w,
https://hfai-static.high-flyer.cn/static/18f1843b101596c1ef0adef2f79d6547/ff46a/p2.png 325w,
https://hfai-static.high-flyer.cn/static/18f1843b101596c1ef0adef2f79d6547/a6d36/p2.png 650w,
https://hfai-static.high-flyer.cn/static/18f1843b101596c1ef0adef2f79d6547/efc66/p2.png 885w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
​&lt;/p&gt;
&lt;h2 id=&quot;模型实践&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E5%AE%9E%E8%B7%B5&quot; aria-label=&quot;模型实践 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型实践&lt;/h2&gt;
&lt;p&gt;作者开源了实验代码，包括baseline，其主要采用图神经网络库&lt;code class=&quot;language-text&quot;&gt;torch-geometric&lt;/code&gt;进行进一步的封装实现。代码由于是刚刚开源，需要一定改造方可运行起来。&lt;strong&gt;目前数据和代码已整合进幻方AI的数据仓库与模型仓库当中，供后续研究者们调用&lt;/strong&gt;。
​&lt;/p&gt;
&lt;h3 id=&quot;1-数据集&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-%E6%95%B0%E6%8D%AE%E9%9B%86&quot; aria-label=&quot;1 数据集 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. 数据集&lt;/h3&gt;
&lt;p&gt;该研究采用的是全球天气预报基准数据集 &lt;strong&gt;WeatherBench&lt;/strong&gt;，由大数据地球研究社区 &lt;strong&gt;Pangeo &lt;strong&gt;于2020年开源。其一共由&lt;/strong&gt;2048&lt;/strong&gt;个分布在地球各个重要位置上的统计节点。作者选取温度、湿度、云量、地表风分量四个天气预报项进行试验，以小时为单位划分数据，以过去12小时数据进行分析，对未来12小时进行预报。&lt;/p&gt;
&lt;p&gt;值得注意的是，在开源的代码中，作者是将这四个预报项单独进行预测，分别测试准确度，而不是综合多个因素进行分析。例如，对温度的预测只考虑过去温度的变化，不会将过去湿度，云量，风量等因素综合考虑其中。
​&lt;/p&gt;
&lt;p&gt;除了时序化的指标数据，作者还抽析出了每个指标每个时刻的&lt;strong&gt;地理位置信息&lt;/strong&gt;，以构建一个球体结构。如上一章所介绍的，这个结构将被解析成一个动态图，进行时空分析并预测。所抽析的地理指标包括：&lt;strong&gt;经度、纬度、海拔、陆地标记&lt;/strong&gt;。最终，组成的输入输出形式为：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 373px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/9c5f8989b25b58bde3b858df93844d71/67a5d/p3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 23.926380368098158%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAyElEQVQY021QSQqEQBCbf7iioqLiDu6K4EH0IP7/MRlSoOgwh9Bp0kmn6jMMA6qqQl3XaJoGuq5DURQYhiH8CVVVRSOnrmma8OskPvM8w/M8Ceu6DtM0oe97FEWBMAwRBIGcruuKPo4jyrJElmWvoDuQ5nVd4fs+oijCeZ5o21YC4zjGcRxiJrcsS5oRpmn+D2SzbdskkCZyNiDyPMe+70iSRO62bd/G57ivkTki98gwNqXRcRwsywKuI01T0cj5js35+bXL34ZfRuKW6NF9miAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/9c5f8989b25b58bde3b858df93844d71/67a5d/p3.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/9c5f8989b25b58bde3b858df93844d71/222b7/p3.png 163w,
https://hfai-static.high-flyer.cn/static/9c5f8989b25b58bde3b858df93844d71/ff46a/p3.png 325w,
https://hfai-static.high-flyer.cn/static/9c5f8989b25b58bde3b858df93844d71/67a5d/p3.png 373w&quot;
        sizes=&quot;(max-width: 373px) 100vw, 373px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;2-模型训练&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%E6%A8%A1%E5%9E%8B%E8%AE%AD%E7%BB%83&quot; aria-label=&quot;2 模型训练 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. 模型训练&lt;/h3&gt;
&lt;p&gt;作者开源的代码采用的单机单卡训练模式，提供了预处理好的训练样本与测试样本，可以通过pickle直接加载使用。在幻方萤火二号上，用户可以获得更多的高性能显卡，因此可以进行并行训练以获取更好的性能，相关内容可以参考之前的文章&lt;a href=&quot;/blog/pytorch&quot;&gt;《PyTorch分布式训练方法》&lt;/a&gt;。
​&lt;/p&gt;
&lt;p&gt;这里，我们采用分布式数据并行（DDP）的方式改造代码，提高训练性能。具体的&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用 &lt;code class=&quot;language-text&quot;&gt;DistributedDataParallel&lt;/code&gt;封装原始模型&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parallel &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; DistributedDataParallel

self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DistributedDataParallel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;clcrn_model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; device_ids&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;local_rank&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;用&lt;code class=&quot;language-text&quot;&gt;DistributedSampler&lt;/code&gt;封装原始数据集，使其自由分散在多张显卡中&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;utils&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;distributed &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; DistributedSampler

train_datasampler &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DistributedSampler&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;trainset&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;trainloader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;utils&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;DataLoader&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;trainset&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; batch_size&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sampler&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;train_datasampler&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; num_workers&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pin_memory&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;加入&lt;code class=&quot;language-text&quot;&gt;hfai&lt;/code&gt;监听集群中的统一调度信号，做好checkpoint保存&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; hfai

&lt;span class=&quot;token comment&quot;&gt;# the first node gets the suspend signal, save checkpoint&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; rank &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;receive_suspend_command&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;save_model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;checkpoint.m&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sleep&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;go_suspend&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;通过&lt;code class=&quot;language-text&quot;&gt;Process&lt;/code&gt;托管多进程，管理多张显卡上的训练&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; torch

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;__main__&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;multiprocessing&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;spawn&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; args&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; nprocs&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;device_count&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;改造完成后，运行的效果如下：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 585px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/be285fad02de629699db9cad3e9b1ae8/78a22/p4.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 53.987730061349694%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB8UlEQVQoz1WSWVIjMRAFOQgEYbs37bvU3V4wMXP/K+WEZQKYfykrX9V7ybkQQ0DHnZMMBOeIMSGlYrGFSRhi8BgXOUyaQThGoTktmsU1FptQSjKOI6+vr7x8fNxptRD2v0xuY62FbduJKRHbFRsq18uZUDYGUxAus5jIqBO+3QntipCiA9/e3nhprRG8Q8WNQSWi9+ScMcZgYkNqT8kJbT3H2TApxygtp8WgQ8OEwjxPHI+nJ/B2+6CVjN/+PA1bZds2QoyE9d4/7NuKT62vRPi1x5xMwq+f+HpBa/VjuK7bl+HOqEvf18NQG4vyhUVqSslYH7vhbHK3HGRAhvWZQkqGYXgCz+cLtWTc+sloW4/X2orzHlevKBtZ14qLlZOKLDYzm8RoMqZccXlHiF87fABziphyYzT1P6BNK8oGtm3FxcJJfgF1YJAek8+4vCHEwvA7coqhTxvNM3JKGWNdB0rtqLWgXeQo3LNKyjOo2IH9jRQ/ka/XGzVnXLsz2fZdmxBCn/4AbWsj5MagSwc+LCeTseWKL3vv4Tdw3889sq03RlspKVFrw1jbqyS074b+EVklZlufPVQBlS6YuKK1ZhynJzCEiJKi7+VxRa0k5nFhpbA+IITCe8e4GI6zZZoXTsJxnBVKG6zzHA4H3t/fO/Afis1Txjy+2KIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/be285fad02de629699db9cad3e9b1ae8/78a22/p4.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/be285fad02de629699db9cad3e9b1ae8/222b7/p4.png 163w,
https://hfai-static.high-flyer.cn/static/be285fad02de629699db9cad3e9b1ae8/ff46a/p4.png 325w,
https://hfai-static.high-flyer.cn/static/be285fad02de629699db9cad3e9b1ae8/78a22/p4.png 585w&quot;
        sizes=&quot;(max-width: 585px) 100vw, 585px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;主节点Epoch平均耗时48s左右，相比单机单卡训练提升速度6-7倍。完整的改造代码已集成进幻方AI的模型仓库中，感兴趣的研究者们可以滑至文末申请体验，了解更多的技术细节。
​&lt;/p&gt;
&lt;p&gt;类似WeatherBench中展示的可视化案例，可以将预测出的天气信息映射到地图中，对比出天气的变化情况,。如下图所展示的温度变化案例：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/06c209c7bd01314e899d0b4e30a8aeae/44e73/p5.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 49.69325153374233%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAAKABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMFBAb/xAAWAQEBAQAAAAAAAAAAAAAAAAACAAH/2gAMAwEAAhADEAAAAe+VSzzSVQ5//8QAGxAAAgIDAQAAAAAAAAAAAAAAAAECAxEUMTL/2gAIAQEAAQUCdKg3VBGomWe8Ijz/xAAWEQEBAQAAAAAAAAAAAAAAAAAAARH/2gAIAQMBAT8BjX//xAAWEQADAAAAAAAAAAAAAAAAAAAAARL/2gAIAQIBAT8BhEo//8QAGxAAAgIDAQAAAAAAAAAAAAAAAAECERIhMUL/2gAIAQEABj8CVyZWUtquF5sic8iP/8QAHBAAAgEFAQAAAAAAAAAAAAAAAAERITFBUWGB/9oACAEBAAE/IX9LrZMqZyyGy1QPgqcywzk8lEWj/9oADAMBAAIAAwAAABAD7//EABYRAQEBAAAAAAAAAAAAAAAAAAEAIf/aAAgBAwEBPxDUsv/EABURAQEAAAAAAAAAAAAAAAAAAAEQ/9oACAECAQE/ECB//8QAHRABAAIBBQEAAAAAAAAAAAAAAQARMSFBUWFxwf/aAAgBAQABPxC2oKpRqJ9gTguOBTcxj3eUCkBLV1KCHnPJo9Jw5YAQAAAeT//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;weather_aaai2022.jpg&quot;
        title=&quot;weather_aaai2022.jpg&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/06c209c7bd01314e899d0b4e30a8aeae/6aca1/p5.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/06c209c7bd01314e899d0b4e30a8aeae/d2f63/p5.jpg 163w,
https://hfai-static.high-flyer.cn/static/06c209c7bd01314e899d0b4e30a8aeae/c989d/p5.jpg 325w,
https://hfai-static.high-flyer.cn/static/06c209c7bd01314e899d0b4e30a8aeae/6aca1/p5.jpg 650w,
https://hfai-static.high-flyer.cn/static/06c209c7bd01314e899d0b4e30a8aeae/7c09c/p5.jpg 975w,
https://hfai-static.high-flyer.cn/static/06c209c7bd01314e899d0b4e30a8aeae/01ab0/p5.jpg 1300w,
https://hfai-static.high-flyer.cn/static/06c209c7bd01314e899d0b4e30a8aeae/44e73/p5.jpg 1517w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
​&lt;/p&gt;
&lt;h2 id=&quot;体验总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%93%E9%AA%8C%E6%80%BB%E7%BB%93&quot; aria-label=&quot;体验总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;体验总结&lt;/h2&gt;
&lt;p&gt;​
气象预测与人类生产生活息息相关。AAAI 2022这篇研究工作将近年来火热的时空图神经网络应用到了气象预测当中，将这一问题具体抽象成了图数据结构并予以解决。该工作进一步推进了&lt;strong&gt;AI+环境科学&lt;/strong&gt;的发展。同时，无论是模型还是该场景中的问题，还有许多能进一步研究的空间。比如，是否可以结合更多源的数据对某一预报项进行预测、不同因素之间彼此是否有关联、扩大数据规模增加算力能提升多少精度等等。我们欢迎感兴趣的学者加入我们，继续在幻方AI团队的萤火平台上对该课题进行进一步探索。
​&lt;/p&gt;
&lt;p&gt;综合体验打分如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;研究指数：★★★★&lt;/p&gt;
&lt;p&gt;气象预测是重要的研究课题，结合AI方法有很多的创新空间。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开源指数：★★★★&lt;/p&gt;
&lt;p&gt;数据和代码都进行了完整开源，代码部分修改后可以运行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;门槛指数：★★★&lt;/p&gt;
&lt;p&gt;作者开源的数据规模不大，对算力的需求较小。但随着数据规模的提升和多指标的整合分析，算力的需求会逐渐增大。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通用指数：★★&lt;/p&gt;
&lt;p&gt;模型针对气象预测领域的特性进行模型设计，通用性比较差。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;适配指数：★★&lt;/p&gt;
&lt;p&gt;模型采用单机单卡方式实现，需要进行多机并行训练改良方可适配幻方萤火二号。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;幻方 AI 紧跟 AI 研究的前沿浪潮，致力于用领先算力助力AI落地与价值创造，欢迎各方数据研究者与开发者们一同共建。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Alphafold 训练优化 03 | 踩坑日记]]></title><description><![CDATA[前两期文章展示了幻方AI对Alphafold的优化，采用特征预处理和特征裁切两种方式提高了Alphafold数据处理性能，通过并行训练加速神器进一步提高模型的训练速度，将Alphafold深度融合进幻方AI…]]></description><link>https://www.high-flyer.cn/blog/alphafold-3/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/alphafold-3/</guid><dc:creator><![CDATA[Daylight]]></dc:creator><pubDate>Tue, 01 Feb 2022 15:00:00 GMT</pubDate><content:encoded>&lt;p&gt;前两期文章展示了幻方AI对Alphafold的优化，采用特征预处理和特征裁切两种方式提高了Alphafold数据处理性能，通过并行训练加速神器进一步提高模型的训练速度，将Alphafold深度融合进幻方AI的集群特点中，发挥最大的计算效能。&lt;/p&gt;
&lt;p&gt;那么从整体上看，在幻方萤火二号上训练Alphafold还有哪些需要我们注意的，以及未来同类型深度学习模型该如何优化？就这些话题，本期文章将和大家聊聊幻方AI的一些思考。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型仓库&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/alphafold-optimized&quot;&gt;https://github.com/HFAiLab/alphafold-optimized&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;总体优化效果&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%80%BB%E4%BD%93%E4%BC%98%E5%8C%96%E6%95%88%E6%9E%9C&quot; aria-label=&quot;总体优化效果 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;总体优化效果&lt;/h2&gt;
&lt;p&gt;首先，我们看一下在进行了前两期优化后，最终Alphafold在幻方萤火二号上的训练效果。我们使用16个节点共128张A100显卡，对将近7万条蛋白质序列进行了比较完整的Alphafold训练，得到了如下的实验结果：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;平均GPU利用率&lt;/th&gt;
&lt;th&gt;90.14%&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;平均每Epoch时间（min）&lt;/td&gt;
&lt;td&gt;84.15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;平均每次迭代时间 （s）&lt;/td&gt;
&lt;td&gt;11.32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;每Epoch开始时数据加载时间（s）&lt;/td&gt;
&lt;td&gt;197&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;总迭代数&lt;/td&gt;
&lt;td&gt;35680&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;总训练时长（h）&lt;/td&gt;
&lt;td&gt;112&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;训练时的GPU利用率曲线如下：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/85dd2f33b7620655fb52d8ef3e0468a0/4cdc7/image-20220218102611314.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 48.46625766871166%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAIAAAA7N+mxAAAACXBIWXMAAAsTAAALEwEAmpwYAAABmklEQVQoz21S2W7bMBDU/39OjxxFijh10r7YcewYcer4SnQUsERZpCgee1AFlby1i8FgZjhYvmzS/zNE1KpWKiWlUqqVUhpj+/9NguDRCXAVumpgEeHrqP2Q+xrh9F5ALyJsiT5uTMg2cLiE/QXszvz26yDOYfsZXq9gdwbbL3D4FrE/h7fvcLjAdOQ3n0xxr1qToGmoGFPxk9JrzG4wHVFxS69XlI8x+0H5mLIRpteY31JxF+2fX5jduOpJdzYh6Ki8p+qBjxOq5nycsJhzOY3hccr1I5dTrmYftpyxeOBy4k/bRrYJg2GxoNMTiwXXSxJzblaxXS+pmkUtFnFdvWTxGLlZkZiDPHTGJei7INes9yzXrDasXqJuVkPyHPSe5O/QbrndsFqz3nG3Z/XidSHjz+R6k/YuDzYLLu9tFuw7Z6E79DYP3VtwRf9hh1eTkqs6YxNmBm+c1YQWvQFvECyhI3TgO/SG0AXy3moCi2DBG+868NY5l8SrYEbiEPoQAjNr3RGhNVqqFolUq0+nBomGQs8ciDgMR/IX9EIx+RfE87MAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image-20220218102611314.png&quot;
        title=&quot;image-20220218102611314.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/85dd2f33b7620655fb52d8ef3e0468a0/a6d36/image-20220218102611314.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/85dd2f33b7620655fb52d8ef3e0468a0/222b7/image-20220218102611314.png 163w,
https://hfai-static.high-flyer.cn/static/85dd2f33b7620655fb52d8ef3e0468a0/ff46a/image-20220218102611314.png 325w,
https://hfai-static.high-flyer.cn/static/85dd2f33b7620655fb52d8ef3e0468a0/a6d36/image-20220218102611314.png 650w,
https://hfai-static.high-flyer.cn/static/85dd2f33b7620655fb52d8ef3e0468a0/e548f/image-20220218102611314.png 975w,
https://hfai-static.high-flyer.cn/static/85dd2f33b7620655fb52d8ef3e0468a0/3c492/image-20220218102611314.png 1300w,
https://hfai-static.high-flyer.cn/static/85dd2f33b7620655fb52d8ef3e0468a0/4cdc7/image-20220218102611314.png 1327w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;训练时的GPU利用率大多数时候在90%左右。可见经过上述的多种优化后，Alphafold 已经能够在幻方AI平台上高效进行训练，而有中间偶尔出现的利用率骤降则是训练开始时的数据加载耗时。&lt;/p&gt;
&lt;p&gt;另外，从CPU利用率图可以看出，整个训练过程中CPU的利用率长期保持在大于50%（35/64核）的情况，说明Alphafold训练时确实对CPU算力有非常大的需求。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/67d87b837c01a7209504735880b4dfe4/c4842/image-20220218155706866.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 33.74233128834356%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsTAAALEwEAmpwYAAABL0lEQVQY02VQ2W6DMBDk/z8slUjaqFIFBEg4gu3EmNvrA3xUtFVVqSuNdmZ35mUC55z3fof/2c45AFjmeeF8WRYA+Pb8n2DT3GvsJLYSeUW82rnXxP1w5OXXVyAriRPIALKiMSs31gWS97R6q9JTnb2y8tjV57Y4PspzV4asPOHbuclDnB5YGT6u4T15QcV7czksU7uHh3FAuCAoI3WE6ktLS0wKjHJSR5RkmNzq6oKqD4Rv9ypqqgg1aVNFEsY9DHyYuqR9Jm2bMRpPfcpoTHeZz8O1o/HzGTOaDCzv2GMameDTPDYCemNssK5Syx6gmzlTclj1qOQgxH5Z1aDVyHmn1SihZ6zjAM77bRNag7Uu+Nue1iuANMYqqYyxUq1Kr9tmhNJKqoUvWmvn7G/bn2z5iVzyUnrJAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image-20220218155706866.png&quot;
        title=&quot;image-20220218155706866.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/67d87b837c01a7209504735880b4dfe4/a6d36/image-20220218155706866.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/67d87b837c01a7209504735880b4dfe4/222b7/image-20220218155706866.png 163w,
https://hfai-static.high-flyer.cn/static/67d87b837c01a7209504735880b4dfe4/ff46a/image-20220218155706866.png 325w,
https://hfai-static.high-flyer.cn/static/67d87b837c01a7209504735880b4dfe4/a6d36/image-20220218155706866.png 650w,
https://hfai-static.high-flyer.cn/static/67d87b837c01a7209504735880b4dfe4/e548f/image-20220218155706866.png 975w,
https://hfai-static.high-flyer.cn/static/67d87b837c01a7209504735880b4dfe4/3c492/image-20220218155706866.png 1300w,
https://hfai-static.high-flyer.cn/static/67d87b837c01a7209504735880b4dfe4/c4842/image-20220218155706866.png 1634w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;多卡训练中的一些踩坑&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%A4%9A%E5%8D%A1%E8%AE%AD%E7%BB%83%E4%B8%AD%E7%9A%84%E4%B8%80%E4%BA%9B%E8%B8%A9%E5%9D%91&quot; aria-label=&quot;多卡训练中的一些踩坑 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;多卡训练中的一些踩坑&lt;/h2&gt;
&lt;p&gt;在优化Alphafold模型的过程中，特别是将单机单卡拓展至多机多卡时，我们遇到了不少的问题。&lt;/p&gt;
&lt;h4 id=&quot;1-openfold代码问题&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-openfold%E4%BB%A3%E7%A0%81%E9%97%AE%E9%A2%98&quot; aria-label=&quot;1 openfold代码问题 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. OpenFold代码问题&lt;/h4&gt;
&lt;p&gt;Deepmind没有开源Alphafold训练代码，现在github主流的Alphafold训练代码是由其他三方实现的，比如OpenFold（&lt;a href=&quot;https://github.com/aqlaboratory/openfold&quot;&gt;https://github.com/aqlaboratory/openfold&lt;/a&gt;），其通过PyTorch比较完整地复现了Deepmind开源的Alphafold 2（&lt;a href=&quot;https://github.com/deepmind/alphafold&quot;&gt;https://github.com/deepmind/alphafold&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;OpenFold的复现使用了比较复杂的代码构造模型结构，其中不同蛋白质序列数据在训练时可能会有不完全一样的前向传播路径，这导致在多卡训练时，一些机器上有一部分参数没有参与梯度计算，而Pytorch DDP提供的&lt;code class=&quot;language-text&quot;&gt;find_unused_parameters&lt;/code&gt;方法并不能正确的找到这部分参数，因此会时不时报错，无法正常进行多卡训练。&lt;/p&gt;
&lt;p&gt;经我们一段时间问题排查发现，是Loss Function部分中存在部分不参与计算的Loss，需要将其手动注释掉后方能正常进行多卡训练。&lt;/p&gt;
&lt;h4 id=&quot;2-环境问题&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%E7%8E%AF%E5%A2%83%E9%97%AE%E9%A2%98&quot; aria-label=&quot;2 环境问题 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. 环境问题&lt;/h4&gt;
&lt;p&gt;另外一个比较容易踩坑的就是环境问题。幻方AI平台内置了PyTorch等环境，适配了常见的深度学习机器学习。而Alphafold本身作为一个深度学习领域的新方向，所依赖的环境必然与常规环境不同。&lt;/p&gt;
&lt;p&gt;因为幻方AI训练平台采用的是计算存储分离的方式，环境统一配置，不托管镜像，所以Alphafold的运行环境需要一步步重头安装，这里不可避免地会发生与原有环境版本冲突，需要补充系统库等一系列问题。&lt;/p&gt;
&lt;p&gt;因此，我们通过 haienv 完全创建一个全新的虚拟环境，并安装了 Alphafold 的依赖项。然而，在进行多机多卡训练时会出现NCCL Error的问题。经过排查后发现：由于 haienv 创建了全新的环境，使用了与原先不同的全新Python bin文件，而新建的Python并没有获得IPC Lock，因此在多机多卡训练时NCCL会出现问题。需要在sudo权限下使用setcap指令&lt;code class=&quot;language-text&quot;&gt;setcap cap_ipc_lock+iep /venv/openfold38_0/bin/python&lt;/code&gt;来解决问题。&lt;/p&gt;
&lt;p&gt;最后，我们将Alphafold所依赖的环境单独列出来，供用户调用。&lt;/p&gt;
&lt;h2 id=&quot;局限与展望&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%B1%80%E9%99%90%E4%B8%8E%E5%B1%95%E6%9C%9B&quot; aria-label=&quot;局限与展望 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;局限与展望&lt;/h2&gt;
&lt;p&gt;虽然经过我们的优化后模型本身训练的效率已经很高，GPU利用率达到90%以上，但我们仍然对模型性能做出了一定的取舍，并且模型内部仍然存在不少优化的空间。一方面来说我们已经完成的优化都基于不修改模型内部结构的前提，因此对模型内不同部分的差异造成的额外开销难以处理；另一方面来说训练时显存的利用还不够理想：A100 40GB的显存只能使用到21GB而有接近一半的空余，但batch_size只能设置为1，这造成了大量浪费。&lt;/p&gt;
&lt;p&gt;从以上两个角度入手，后续Alphafold模型还可以进行的优化有以下三个方向：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;结构简化&lt;/strong&gt;：Alphafold 2本身虽然达到了很好的蛋白质预测准确率，但其复杂的模型结构和极高的资源占用使得复现和部署模型推理都有很高的门槛。因此，仍然可以考虑对模型内部进行细致的Profile，寻求对模型结构进行一定程度的简化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;算子优化&lt;/strong&gt;：幻方AI在算子优化，尤其是Transformer类模型的算子优化方面有很多的积累，而Alphafold作为一个同样基于Transformer结构的模型，还没有用到这些算子优化技术。因此，在这里也有进一步优化的空间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型并行&lt;/strong&gt;：Alphafold目前训练时的显存占用率仍然不高，单卡batch_size也只能设置为1。可以考虑尝试在Alphafold上应用更多的模型并行方式，例如和Pipeline结合来增大训练时的单卡batch_size，提升显存使用效率。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;欢迎各方数据科学家与开发者们一同共研共建。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Alphafold 训练优化 02 | 多卡训练提速]]></title><description><![CDATA[上一期文章讲到，幻方AI通过优化数据处理，采用特征预处理和特征裁切两种方式提高了Alphafold整体的训练性能。众所周知，幻方AI有很多并行训练加速神器，比如hfreduce，3FS，hfai.nn算子库等，它们是否能对Alphafold…]]></description><link>https://www.high-flyer.cn/blog/alphafold-2/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/alphafold-2/</guid><dc:creator><![CDATA[Daylight]]></dc:creator><pubDate>Fri, 07 Jan 2022 15:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上一期文章讲到，幻方AI通过优化数据处理，采用特征预处理和特征裁切两种方式提高了Alphafold整体的训练性能。众所周知，幻方AI有很多并行训练加速神器，比如&lt;a href=&quot;/blog/hf-reduce&quot;&gt;hfreduce&lt;/a&gt;，&lt;a href=&quot;/blog/3fs&quot;&gt;3FS&lt;/a&gt;，&lt;a href=&quot;/blog/hfnn&quot;&gt;hfai.nn算子库&lt;/a&gt;等，它们是否能对Alphafold整体的训练进一步加速呢？本期文章将就这些问题进行试验。&lt;/p&gt;
&lt;h2 id=&quot;hfreduce&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hfreduce&quot; aria-label=&quot;hfreduce permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;hfreduce&lt;/h2&gt;
&lt;p&gt;之前的文章&lt;a href=&quot;/blog/hf-reduce&quot;&gt;《幻方力量 | 模型并行训练工具：hfreduce》&lt;/a&gt;提到过，由于幻方AI架构的特点，Nvidia官方提供的NCCL工具并不能充分发挥萤火二号集群的通信带宽，因此幻方AI自研了hfreduce工具优化显卡间的通信，提高多机多卡的并行训练效率。使用方式非常简单，只需要将pytorch DDP替换为hfai DDP即可：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parallel&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;DistributedDataParallel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; device_ids&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;local_rank&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;对于Alphafold模型，其本身的特点是前向传播路径比较长，而反向传播路径较短，具有比较鲜明的“参数规模不大，但计算量大的特点”。我们采用数据并行将数据分散到不同的显卡上进行并行加速，以加快训练效率。因此我们为Alphafold的训练引入了hfreduce，利用&lt;code class=&quot;language-text&quot;&gt;hfai.ddp&lt;/code&gt;工具进行数据并行，尝试进一步推高Alphafold在萤火二号集群上的计算效率。&lt;/p&gt;
&lt;p&gt;然而在实践中我们发现，hfreduce给Alphafold训练带来的训练提升在绝对值上并不大。这是什么原因呢？在随后的实验部分中我们结合实验结果来分析这一问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型仓库&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/alphafold-optimized&quot;&gt;https://github.com/HFAiLab/alphafold-optimized&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;实验设定&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%AE%9E%E9%AA%8C%E8%AE%BE%E5%AE%9A&quot; aria-label=&quot;实验设定 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;实验设定&lt;/h3&gt;
&lt;p&gt;我们设计并进行了三组实验，以对比使用hfreduce后的加速效果。实验的设定如下表所示&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;序号&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;GPU数&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;DDP Backend&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;迭代次数&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;耗时统计对象&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;特征裁切&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;loss.backward()&lt;/td&gt;
&lt;td&gt;最大&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;128&lt;/td&gt;
&lt;td&gt;NCCL&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;loss.backward()&lt;/td&gt;
&lt;td&gt;最大&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;128&lt;/td&gt;
&lt;td&gt;hfreduce&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;loss.backward() + model.sync_grad()&lt;/td&gt;
&lt;td&gt;最大&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;我们希望通过多卡和单卡训练的耗时对比，来直接看到多卡通信带来的额外开销。因此，我们对3种训练方式测试了其200次迭代的平均backward耗时。&lt;/p&gt;
&lt;p&gt;其中，&lt;strong&gt;“特征裁切：最大”&lt;/strong&gt; 代表了对特征进行了尽可能大的裁切，目的是避免因特征处理导致多卡训练时部分GPU上的梯度同步长期处于等待状态，影响结果的准确性。使用hfreduce时由于梯度同步被单独拆出，因此需要将两个函数合并统计梯度计算+梯度同步的总时间。&lt;/p&gt;
&lt;p&gt;此外，训练的基本参数还包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;训练样本数量：73472&lt;/li&gt;
&lt;li&gt;Batch Size: 1&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;实验结果&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%AE%9E%E9%AA%8C%E7%BB%93%E6%9E%9C&quot; aria-label=&quot;实验结果 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;实验结果&lt;/h3&gt;
&lt;p&gt;根据上文中的实验设定，我们测试NCCL并行加速和hfreduce并行加速的完整训练结果如下表所示：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;NCCL&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;hfreduce&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;每个step平均时长（s）&lt;/td&gt;
&lt;td&gt;11.27&lt;/td&gt;
&lt;td&gt;11.26&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;直接对比单次迭代的总耗时，从结果来看在Alphafold的训练场景下HFReduce和NCCL的不同选择并不会带来显著的效率差异。理论上来说，HFReduce比NCCL更加适合萤火二号的集群架构，一定能带来比DDP更快速的梯度同步。但在Alphafold的实验结果中，两次实验中每个Step的迭代速度几乎完全相同，这是为什么呢？&lt;/p&gt;
&lt;p&gt;对于这种现象，最主要的原因可能是Alphafold独特的模型结构和蛋白质数据的特点使得模型虽然需要很大量的GPU运算，却只需要传输很少的梯度数据。Alphafold的模型参数大小只有&lt;strong&gt;93.2M&lt;/strong&gt;，模型的参数量不到1亿，使用FP32单精度的情况下&lt;strong&gt;占用显存372.8MB&lt;/strong&gt;。在前向传播时Alphafold会将模型中的主要部分（Evoformer）复制4次，这会带来一个很长的前向传播通路，使得时间复杂度大大增加。然而，最终模型需要更新的参数依然只有原先的数量，因此显得梯度同步的开销在整个迭代中显得微不足道了。&lt;/p&gt;
&lt;p&gt;那么，既然梯度同步的耗时不显著，我们是否可以通过一些profile方法拆分出每个部分的耗时，进行定量优化呢？我们对backward部分进行更细致的测试，最终测试结果如下表所示：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;序号&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;GPU数&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;DDP Backend&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Backward平均耗时（s）&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;通信开销（s）&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;td&gt;5.63&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;128&lt;/td&gt;
&lt;td&gt;NCCL&lt;/td&gt;
&lt;td&gt;6.03&lt;/td&gt;
&lt;td&gt;0.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;128&lt;/td&gt;
&lt;td&gt;hfreduce&lt;/td&gt;
&lt;td&gt;5.91&lt;/td&gt;
&lt;td&gt;0.28&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这里，不考虑多卡时因数据处理进度不同产生的等待，那么多卡训练时的backward时间减去单卡训练的backward时间既可以认为是多机多卡带来的额外通信开销。&lt;/p&gt;
&lt;p&gt;上表的结果中可以看到，在萤火二号上使用DDP训练时，选择hfreduce能够比NCCL节省30%的通信开销，这是一个非常可观的数字，说明hfreduce确实更适合在幻方萤火二号上进行多机多卡训练的加速。同时，90%以上的耗时在forward的计算上，特别是layer_norm和attention的算子计算开销比较大，这里需要进一步使用hfai的优化算子进行进一步提升。&lt;/p&gt;
&lt;h2 id=&quot;hfainn&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hfainn&quot; aria-label=&quot;hfainn permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;hfai.nn&lt;/h2&gt;
&lt;p&gt;如前文&lt;a href=&quot;/blog/hfnn&quot;&gt;《幻方萤火 | 性能卓越的深度学习算子 hfai.nn》&lt;/a&gt;所提到的，幻方AI针对Pytorch框架进行了深度优化，结合萤火二号的集群特点，对一些常用的AI算子重新设计研发，进一步提升了模型整体的训练效率。其使用非常简单，只需要在原有的任意模型训练代码中加入一行：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;to_hfai&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;hfai会自动扫描您的代码，替换为优化后的算子。hfai.nn提供了当前主流深度学习模型中常用的MultiHeadAttention，LayerNorm，LSTM等结构的优化算子，能够大幅加速模型中这些算子的运算。我们尝试在Alphafold中引入hfai.nn算子库，测试其能够对模型训练产生多大的增益效果。&lt;/p&gt;
&lt;h3 id=&quot;alphafold-gpu开销分析&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#alphafold-gpu%E5%BC%80%E9%94%80%E5%88%86%E6%9E%90&quot; aria-label=&quot;alphafold gpu开销分析 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Alphafold GPU开销分析&lt;/h3&gt;
&lt;p&gt;由于hfai.nn的算子加速取决于模型中各类型运算占总GPU开销的比重情况，因此我们首先尝试使用Pyorch Profiler工具对Alphafold模型使用标准torch算子时的GPU运算时间进行一些分析。在一次总耗时为12.6s的迭代中，主要开销情况如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;CUDA Time&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;CUDA %&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;aten::native_layer_norm&lt;/td&gt;
&lt;td&gt;2.105s&lt;/td&gt;
&lt;td&gt;16.81%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;void at::native::(anonymous namespace)::RowwiseMomen…&lt;/td&gt;
&lt;td&gt;1.866s&lt;/td&gt;
&lt;td&gt;14.90%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;aten::mm&lt;/td&gt;
&lt;td&gt;1.716s&lt;/td&gt;
&lt;td&gt;13.70%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;aten::native_layer_norm_backward&lt;/td&gt;
&lt;td&gt;1.642s&lt;/td&gt;
&lt;td&gt;13.11%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;atten::add_&lt;/td&gt;
&lt;td&gt;1.454s&lt;/td&gt;
&lt;td&gt;11.61%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;仅前5类运算占了Alphafold训练开销的70%，而其中LayerNorm与Attention中的矩阵运算又是最主要的耗时来源：仅LayerNorm运算就占了总耗时的30%左右。Alphafold相对一般的BERT等Transformer类模型更为复杂，使用了自己实现的Attention，因此在注意力运算上无法获得hfia.nn的加速。但同样占据耗时大头的LayerNorm却能够使用到hfai算子加速，因此可以预期hfai.nn能给alphafold带来较好的加速效果。&lt;/p&gt;
&lt;p&gt;为了探究具体加速效果，我们首先尝试对Alphafold中LayerNorm的使用情况进行一些分析。一般来说输入Tensor的形状往往会对算子加速的效果产生较大的影响，因此在这里我们首先尝试对输入模型中的LayerNorm层的不同的Tensor形状进行一些理论上的分析。在一个典型Transformer类模型中，LayerNorm的输入形状往往是[BatchSize, SeqLen, EmbDim]。在Alphafold中由于其模型结构与简单的Transformer模型有较大差异，输入的张量形状会更为特殊一些。模型中LayerNorm层的不同Input Shape对应的出现频率可见下表：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input Shape&lt;/th&gt;
&lt;th&gt;Run%&lt;/th&gt;
&lt;th&gt;Relative Perf%&lt;/th&gt;
&lt;th&gt;Torch Run Time(s)&lt;/th&gt;
&lt;th&gt;Hfai Run Time(s)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;[1,256,256,128]&lt;/td&gt;
&lt;td&gt;59.96%&lt;/td&gt;
&lt;td&gt;364.07%&lt;/td&gt;
&lt;td&gt;0.003&lt;/td&gt;
&lt;td&gt;0.0008&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[1,132,256,256]&lt;/td&gt;
&lt;td&gt;13.2%&lt;/td&gt;
&lt;td&gt;267.02%&lt;/td&gt;
&lt;td&gt;0.0017&lt;/td&gt;
&lt;td&gt;0.0007&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[1,1,256,256,64]&lt;/td&gt;
&lt;td&gt;8.03%&lt;/td&gt;
&lt;td&gt;379.80%&lt;/td&gt;
&lt;td&gt;0.0028&lt;/td&gt;
&lt;td&gt;0.0007&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[1,128,256,256]&lt;/td&gt;
&lt;td&gt;7.92%&lt;/td&gt;
&lt;td&gt;276.52%&lt;/td&gt;
&lt;td&gt;0.0017&lt;/td&gt;
&lt;td&gt;0.0006&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[1,256,132,256]&lt;/td&gt;
&lt;td&gt;4.4%&lt;/td&gt;
&lt;td&gt;276.13%&lt;/td&gt;
&lt;td&gt;0.0017&lt;/td&gt;
&lt;td&gt;0.0006&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[1,256,128,256]&lt;/td&gt;
&lt;td&gt;2.64%&lt;/td&gt;
&lt;td&gt;272.92%&lt;/td&gt;
&lt;td&gt;0.0017&lt;/td&gt;
&lt;td&gt;0.0006&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[1,256,384]&lt;/td&gt;
&lt;td&gt;1.87%&lt;/td&gt;
&lt;td&gt;80.50%&lt;/td&gt;
&lt;td&gt;0.0002&lt;/td&gt;
&lt;td&gt;0.0003&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[1,1024,256,64]&lt;/td&gt;
&lt;td&gt;1.32%&lt;/td&gt;
&lt;td&gt;471.77%&lt;/td&gt;
&lt;td&gt;0.0111&lt;/td&gt;
&lt;td&gt;0.0024&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[1,256,1024,64]&lt;/td&gt;
&lt;td&gt;0.44%&lt;/td&gt;
&lt;td&gt;474.66%&lt;/td&gt;
&lt;td&gt;0.0111&lt;/td&gt;
&lt;td&gt;0.0024&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[1,4,256,256,64]&lt;/td&gt;
&lt;td&gt;0.11%&lt;/td&gt;
&lt;td&gt;474.41%&lt;/td&gt;
&lt;td&gt;0.0111&lt;/td&gt;
&lt;td&gt;0.0024&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[1,256,256]&lt;/td&gt;
&lt;td&gt;0.11%&lt;/td&gt;
&lt;td&gt;93.81%&lt;/td&gt;
&lt;td&gt;0.0003&lt;/td&gt;
&lt;td&gt;0.0003&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;可见在大多数输入时，hfai.nn提供的LayerNorm算子都能取得相比torch.nn数倍的大幅性能提升，只在极少数形状下性能可能会稍差于torch。另外根据上表中不同输入Tensor形状的占比可以计算得，使用hfai.nn在Alphafold中可以在LayerNorm的GPU开销上取得总计350%的加速。由于Alphafold中的LayerNorm使用频率很高，且在模型的不同部分都有使用，因此可以预计对模型整体也能有较明显的加速效果。&lt;/p&gt;
&lt;h3 id=&quot;实际训练加速结果&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%AE%9E%E9%99%85%E8%AE%AD%E7%BB%83%E5%8A%A0%E9%80%9F%E7%BB%93%E6%9E%9C&quot; aria-label=&quot;实际训练加速结果 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;实际训练加速结果&lt;/h3&gt;
&lt;p&gt;在理论分析了hfai.nn能给Alphafold带来的加速幅度后，我们也希望能了解在实际训练时Alphafold能够从hfai.nn中获得的收益。因此我们在与Alphafold预训练时相同设定的真实场景下使用128卡进行了并行训练，分别测试了使用torch算子和hfai算子进行Alphafold训练时的训练耗时情况，结果如下表：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;算子&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;GPU数&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;迭代次数&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;平均时长&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;torch.nn&lt;/td&gt;
&lt;td&gt;128&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;11.26s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hfai.nn&lt;/td&gt;
&lt;td&gt;128&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.64s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;相比于使用torch.nn算子进行训练，使用hfai.nn时模型整体训练中单次迭代的平均时长能够从11.26秒减少到8.64秒。可见在Alphafold训练时只需要添加一行代码引入hfai.nn，就足足能够获得30%的训练性能提升。值得注意的是，由于Alphafold中自定义了Attention实现没有使用标准的nn.MultiHeadAttention，在这里能够获得的hfai.nn算子加速效果其实只来自于LayerNorm运算减少的耗时。由此可见在常见的标准Transformer类模型中，使用hfai.nn将更加容易获得大幅的性能提升。&lt;/p&gt;
&lt;h2 id=&quot;总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%80%BB%E7%BB%93&quot; aria-label=&quot;总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;总结&lt;/h2&gt;
&lt;p&gt;通过上述两个实验，我们验证了 hfreduce 和 hfai.nn算子对alphafold模型的加速效果。他们分别表现出了不同的加速能力，说明在模型优化的过程中我们需要根据模型的结构特性选择合适的加速方案。这里，幻方AI将持续加大研发，提供更多的优化方案和工具。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[萤火跑模型 | CLIP 模型]]></title><description><![CDATA[CLIP（Contrastive Language-Image Pre-Training，以下简称 CLIP）模型是 OpenAI 在 202…]]></description><link>https://www.high-flyer.cn/blog/clip/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/clip/</guid><dc:creator><![CDATA[小杞]]></dc:creator><pubDate>Tue, 28 Dec 2021 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;CLIP（Contrastive Language-Image Pre-Training，以下简称 CLIP）模型是 OpenAI 在 2021 年初发布的用于匹配图像和文本的预训练神经网络模型，可以说是近年来在多模态研究领域的经典之作。该模型直接使用大量的互联网数据进行预训练，在很多任务表现上达到了目前最佳表现（SOTA）。&lt;/p&gt;
&lt;p&gt;本次我们尝试使用 Google 开源的 Conceptual Captions 数据集来训练 CLIP 模型，并对其效果进行一定的验证。&lt;/p&gt;
&lt;p&gt;本次体验接入的系统是幻方AI团队研发的幻方萤火二号：自研智能分时调度、高效存储与网络通信，可以实现任务级别的弹性算力支持；配合API或者 JupyterLab 交互就可以轻松接入，利用起澎湃算力进行大规模深度学习训练。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;源码地址&lt;/strong&gt;：&lt;a href=&quot;https://github.com/openai/CLIP&quot;&gt;https://github.com/openai/CLIP&lt;/a&gt; | &lt;a href=&quot;https://github.com/mlfoundations/open_clip&quot;&gt;https://github.com/mlfoundations/open_clip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据集&lt;/strong&gt;：&lt;a href=&quot;https://ai.google.com/research/ConceptualCaptions/download&quot;&gt;https://ai.google.com/research/ConceptualCaptions/download&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型仓库&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/clip-gen&quot;&gt;https://github.com/HFAiLab/clip-gen&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;clip-模型简介&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#clip-%E6%A8%A1%E5%9E%8B%E7%AE%80%E4%BB%8B&quot; aria-label=&quot;clip 模型简介 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;CLIP 模型简介&lt;/h2&gt;
&lt;p&gt;在目前图像分类领域中，我们训练的模型通常会遇到以下问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;模型需要用到大量的格式化标注数据，这些标注数据获取通常成本高昂。&lt;/li&gt;
&lt;li&gt;模型在当前数据集的效果比较好，但是可能模型的泛化能力较差，同时迁移到新的训练任务也比较困难&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;与此同时，互联网上面已经存在了大量的图像文本对（在网页中，开发者一般都会为图片添加一段文字备注），实际上这些素材可以作为已经标注好的数据集，利用这些数据集进行训练，既能解决获取标注数据成本高昂的问题，同时也因为互联网上的数据量比较大和数据本身差异较大，更容易让我们获得泛化能力较强的模型。&lt;/p&gt;
&lt;p&gt;CLIP 模型就是基于上述概念，使用 OpenAI 收集到的 4 亿对图像文本对，分别将文本和图像进行编码，之后使用 metric learning 进行训练，通过计算 cosine similarities 计算图像和文本的匹配，通过最大化匹配的图像文本对的 cosine similarity 和最小化不匹配的文本对的 cosine similarity 来优化目标函数，它的核心流程比较容易理解，可以直接参考下述伪代码：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# image_encoder - ResNet or Vision Transformer
# text_encoder  - CBOW or Text Transformer
# I[n, h, w, c] - minibatch of aligned images
# T[n, l]       - minibatch of aligned texts
# W_i[d_i, d_e] - learned proj of image to embed
# W_t[d_t, d_e] - learned proj of text to embed
# t             - learned temperature parameter
# extract feature representations of each modality
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T)  #[n, d_t]
# joint multimodal embedding [n, d_e]
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
T_e = l2_normalize(np.dot(T_f, W_t), axis=1)
# scaled pairwise cosine similarities [n, n]
logits = np.dot(I_e, T_e.T) * np.exp(t)
# symmetric loss function
labels = np.arange(n)
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss   = (loss_i + loss_t)/2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;在预测阶段，也是通过一系列生成的文本对和目标图像，计算 cosine similarities 从而获取预测值：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/6760807db8622802057c7570cba3be2f/da18d/p0.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 49.079754601226995%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB5UlEQVQoz22S3Y7TMBCF82g8Bo/APRJ3PBwXLAjEpts2XQS7bH+SbeI2jpM4ieP8fMjediUkRhqNPT4+M2OfoCgKnJdlyavNMM+zd2dd1yGEQErpsS5WVfUCvWCuFrRtyzAMxL9T0t3pv6BxGNG1xhjDYC1dazj8StGq9efTNL02EOR5TtM2PKx2PG0OHtCUDcdthohzRJJjWoPte9+VrmsqVbO8+YmIz1jb0/e9b8oRB9cuJju9kPU1u0SwfcgQhxPp/oSuNF3bMk2j73YeZwYzMo6TJxvH0ZO58+B79ImmqxF1htQ58XnPQ7ZjmzWUuqHvO3TTUBSKNBXExwOZSn3xqtBs7xOSR+GfrKlbgrfv3nAbfiFKIhZ/fpAWzyT5HlloHo8aqWp/udQV7z9+4Cb8zLfHryTygJAZ55PiKVYoWdKbnuAkMnpjqPsKYzvS8shzkfhcqTv2J4MdZmYmnrMYWZ3JqpRhtL6QG7lQpR/b/7Kb3cnCsZvOIEtJXpy9jHRdcZYV6vKGwzB6rDWWrjM4hbiPUoXy0ZEGYXjL3d0dYRiyXC7ZbDZE68iv1+s19/duv2a1Wvmciw5/xTpMFEUsFguUUgRpmuKk48TqKlhr/3EnB2uHS3zJuTGvUnHu1i7vZPMXf1D2CNMK1qQAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;cosine similarities&quot;
        title=&quot;cosine similarities&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/6760807db8622802057c7570cba3be2f/a6d36/p0.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/6760807db8622802057c7570cba3be2f/222b7/p0.png 163w,
https://hfai-static.high-flyer.cn/static/6760807db8622802057c7570cba3be2f/ff46a/p0.png 325w,
https://hfai-static.high-flyer.cn/static/6760807db8622802057c7570cba3be2f/a6d36/p0.png 650w,
https://hfai-static.high-flyer.cn/static/6760807db8622802057c7570cba3be2f/e548f/p0.png 975w,
https://hfai-static.high-flyer.cn/static/6760807db8622802057c7570cba3be2f/3c492/p0.png 1300w,
https://hfai-static.high-flyer.cn/static/6760807db8622802057c7570cba3be2f/da18d/p0.png 2924w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;CLIP 通过以上过程，取得的效果还是比较惊艳的。&lt;/p&gt;
&lt;p&gt;OpenAI 官方开源了 CLIP 模型部分的代码，不过如果想完整的的复现训练，还需要写不少训练相关的代码，这里我们基于 github 上的另外一个&lt;a href=&quot;https://github.com/mlfoundations/open_clip&quot;&gt;开源实现&lt;/a&gt;，通过一定的修改，来完成在萤火平台上训练的整个过程。&lt;/p&gt;
&lt;h2 id=&quot;数据预处理&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E9%A2%84%E5%A4%84%E7%90%86&quot; aria-label=&quot;数据预处理 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;数据预处理&lt;/h2&gt;
&lt;h3 id=&quot;下载和清洗&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%B8%8B%E8%BD%BD%E5%92%8C%E6%B8%85%E6%B4%97&quot; aria-label=&quot;下载和清洗 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;下载和清洗&lt;/h3&gt;
&lt;p&gt;Conceptual Captions 数据集是 Google 从数十亿互联网网页提取的图像文本信息数据，并进行了若干种类型的过滤，使得数据集具有较高的质量和准确度，总共约 300 万个测试数据和 8000 多个验证数据。&lt;/p&gt;
&lt;p&gt;它提供的是描述和图片的下载地址对，其数据格式如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;title	filepath
a man on a scooter , taking part in the rally	http://l7.alamy.com/zooms/5e84d0b73a544fe8a8e5ac0d20052685/a-man-on-a-lambretta-scooter-taking-part-in-the-daily-express-rally-ddmmff.jpg
the dentist drill the tooth with a turbine	http://l7.alamy.com/zooms/da764b930a6e477da792ddb8b83b1ecb/the-dentist-drill-the-tooth-with-a-turbine-hn3aph.jpg
...&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;我们可以将该数据集通过 python 脚本下载和统一存放，下载完之后，我们需要将该数据集进行清洗，将下载的空图片或者不完整的图片数据过滤，之后才可以使用。&lt;/p&gt;
&lt;p&gt;这部分下载和清洗，我们简单编写 python 脚本即可完成，我们完全下载清洗后得到的 csv 文件格式为：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;title	filepath
a man on a scooter , taking part in the rally	/demo/path/clip/cc_data_1/val/29/29.jpg
the dentist drill the tooth with a turbine	/demo/path/clip/cc_data_1/val/19/19.jpg
...&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;实际上，这个数据集由于比较大，而且都是分散在各个 URL 而不是一个完整的压缩包， 我们下载会花费不少时间，累计接近 100G 的解压大小也会对我们的数据存放造成一定负担，不过幻方AI团队目前正在基于自研的高性能平行文件系统进行数据集仓库的建设，也就是说，对于一些常用的数据集和已经在集群上训练过的公开数据集，包括以上 Conceptual Captions 数据集，我们会经过处理后放在可访问的公开文件目录，后续在萤火使用相同的数据集进行训练或模型开发，就无需重复下载和预处理数据集了，直接使用即可，从而能极大减轻我们的数据负担。&lt;/p&gt;
&lt;p&gt;在分布式训练开始之前，虽然我们已经可以使用清洗好的图像数据进行训练了，但如果我们频繁打开小文件，对训练自身的性能和整个集群的影响都会比较大，我们可以使用幻方AI自研的 FFRecord 来将多个小文件进行合并处理，从而减少训练时打开大量小文件的开销，同时对存储后端更加友好，我们会在下文对其进行介绍。&lt;/p&gt;
&lt;h3 id=&quot;ffrecord-数据格式转换&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ffrecord-%E6%95%B0%E6%8D%AE%E6%A0%BC%E5%BC%8F%E8%BD%AC%E6%8D%A2&quot; aria-label=&quot;ffrecord 数据格式转换 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;FFRecord 数据格式转换&lt;/h3&gt;
&lt;p&gt;FFRecord（FireFlyer Record）是幻方AI自研的简单高效的存储二进制记录的文件格式，它的一些特点包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;合并多个文件，减少了训练时打开大量小文件的开销，对存储后端更加友好。&lt;/li&gt;
&lt;li&gt;支持随机读取，可以适应不同的样本读取模式。&lt;/li&gt;
&lt;li&gt;包含数据校验，保证读取的数据完整可靠。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;同时，为了方便训练，我们还提供了专为 PyTorch 和 FFDataset（FireFlyer Dataset） 和 FFDataLoader（FireFlyer DataLoader），优势包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;高效读取，使用 Linux Asynchronous I/O 的接口，充分利用了自研存储系统的随机读取性能优势。&lt;/li&gt;
&lt;li&gt;简单易用，只需要对使用原有 PyTorch DataLoader 的代码进行简单的修改即可切换为 FFDataLoader。&lt;/li&gt;
&lt;li&gt;使用灵活，完全兼容 PyTorch Dataset 和 DataLoader 的相关接口，如 Sampler 等。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;数据预处理和 FFRecord 转换部分的代码，均可在萤火二号访问。&lt;/p&gt;
&lt;p&gt;在转换为 FFRecord 之后，我们就可以开始调整开源代码，进行训练了。&lt;/p&gt;
&lt;h2 id=&quot;开源代码调整&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%BC%80%E6%BA%90%E4%BB%A3%E7%A0%81%E8%B0%83%E6%95%B4&quot; aria-label=&quot;开源代码调整 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;开源代码调整&lt;/h2&gt;
&lt;p&gt;这里我们针对开源代码进行调整，这里的主要调整的内容包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;参数调整，包括超参数、文件路径等&lt;/li&gt;
&lt;li&gt;入口文件微调，引入 haienv、hfai&lt;/li&gt;
&lt;li&gt;使用 FFDataset 代替原有的 Dataset&lt;/li&gt;
&lt;li&gt;适配集群打断逻辑&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;step1: 参数调整部分比较简单，我们可以根据自己的需要调整数据集和验证集的文件路径，以及 batch-size 和 epoches 等参数。&lt;/p&gt;
&lt;p&gt;这里我们增加了两个参数，分别用于表示训练集和验证集的 FFRecord 文件地址：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&apos;--train-ddr-perfix&apos;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&apos;/3fs-jd/prod/private/nxt/clip/cc_data_1_proc/train&apos;&lt;/span&gt;,
&lt;span class=&quot;token string&quot;&gt;&apos;--val-ddr-perfix&apos;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&apos;/3fs-jd/prod/private/nxt/clip/cc_data_1_proc/val&apos;&lt;/span&gt;,&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;step2: 引入 haienv、hfai 的代码和我们的上一篇 informer 模型的调整比较类似，这里我们直接给出代码&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; haienv
haienv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_env&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;202111&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; os
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; sys
sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&apos;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;getcwd&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/src&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;step3: 为了提高训练性能，我们使用上文提到的 FFDataset 代替 torch 的 Dataset，这里我们给出一个实现代码：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;FFDataset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fftorch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Dataset&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; input_filename&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; transforms&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; img_key&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; caption_key&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sep&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;\t&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ddr_perfix&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        logging&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;info&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&apos;[FFDataset] Loading csv data from &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;input_filename&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;. use ffrecord: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;ddr_perfix&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        df &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read_csv&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;input_filename&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sep&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;sep&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;images &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; df&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;img_key&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tolist&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;captions &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; df&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;caption_key&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;tolist&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;transforms &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; transforms
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ddr_perfix &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ddr_perfix
        &lt;span class=&quot;token builtin&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;__init__&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ddr_perfix&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; check_data&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        logging&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;info&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;[FFDataset] Done loading data.&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__len__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;captions&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; indexes&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&apos;&apos;&apos;
        在每次读取样本数据的时候，
        FFDataset 先从 FFRecord 文件中读取样本的二进制数据，
        然后将原始二进制数据传递给 process 函数。
        用户需要继承 ffrecord.torch.Dataset 并自定义 process 函数以对原始二进制数据进行处理。
        &apos;&apos;&apos;&lt;/span&gt;
        samples &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; bytes_ &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                sample &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; deserialize&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;bytes_&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                image_from_bytes &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sample&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;image_bytes&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
                images &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;transforms&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;image_from_bytes&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                texts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tokenize&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sample&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;caption&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        
                samples&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;images&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; texts&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;raise&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; samples&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;step4: 由于萤火的任务调度规则为分时分优先级调度，也就是说任务提交以后，有可能会被集群打断暂停，任务打断实际上会强行结束当前进程，后续再启动的时候就又会再次执行初始化逻辑，为了能够在打断后恢复继续训练，我们需要及时保存我们的 checkpoint，并且在任务恢复的情况下加载之前的历史记录继续训练，同时，我们应该在整个训练结束之后对模型进行保存。&lt;/p&gt;
&lt;p&gt;这里笔者提供一个比较简单的方式，我们利用 whole_life_state 来进行标记，第一次 whole_life_state 是 0，如果是打断恢复的场景，这个时候 whole_life_state 就是 1，因此我们加载最新的 checkpoint 进行继续训练，这里给出关键的代码：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# main 函数里面处理 whole_life_state:&lt;/span&gt;
whole_life_state &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_whole_life_state&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;whole_life_state:&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; whole_life_state&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; whole_life_state &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# 只要不是第一次运行，我们就尝试加载最近的 checkpoint：&lt;/span&gt;
    args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;resume &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;checkpoint_path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;epoch_latest.pt&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_whole_life_state&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 加载 checkpoint:&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;resume &lt;span class=&quot;token keyword&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;isfile&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;resume&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        checkpoint &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;load&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;resume&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; map_location&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;loc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        start_epoch &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; checkpoint&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;epoch&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        sd &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; checkpoint&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;state_dict&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;load_state_dict&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sd&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; optimizer &lt;span class=&quot;token keyword&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            optimizer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;load_state_dict&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;checkpoint&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;optimizer&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        logging&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;info&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;=&gt; loaded checkpoint resume:&apos;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;resume&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos; (epoch &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;checkpoint&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;epoch&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;)&quot;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# ...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;经过以上处理，我们就可以验证和运行我们的任务了。&lt;/p&gt;
&lt;h2 id=&quot;测试运行并提交训练&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%B5%8B%E8%AF%95%E8%BF%90%E8%A1%8C%E5%B9%B6%E6%8F%90%E4%BA%A4%E8%AE%AD%E7%BB%83&quot; aria-label=&quot;测试运行并提交训练 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;测试运行并提交训练&lt;/h2&gt;
&lt;p&gt;幻方萤火提供的 hfai 命令行工具提供了测试运行的接口，我们可以通过 &lt;code class=&quot;language-text&quot;&gt;hfai python src/training/main.py&lt;/code&gt; 来进行测试运行（一般来说，我们建议测试运行没有明显问题之后再提交训练）&lt;/p&gt;
&lt;p&gt;测试运行会在当前终端直接打印运行信息：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;shell&quot;&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token number&quot;&gt;2021&lt;/span&gt;-12-22,22:34:14 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; INFO &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Rank &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Use GPU: &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; training
&lt;span class=&quot;token number&quot;&gt;2021&lt;/span&gt;-12-22,22:34:14 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; INFO &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Rank &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Use GPU: &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; training
&lt;span class=&quot;token number&quot;&gt;2021&lt;/span&gt;-12-22,22:34:14 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; INFO &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Rank &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Use GPU: &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; training
&lt;span class=&quot;token number&quot;&gt;2021&lt;/span&gt;-12-22,22:34:14 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; INFO &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Rank &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Use GPU: &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; training
&lt;span class=&quot;token number&quot;&gt;2021&lt;/span&gt;-12-22,22:34:14 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; INFO &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Rank &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Use GPU: &lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; training
&lt;span class=&quot;token number&quot;&gt;2021&lt;/span&gt;-12-22,22:34:14 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; INFO &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Rank &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Use GPU: &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; training
&lt;span class=&quot;token number&quot;&gt;2021&lt;/span&gt;-12-22,22:34:14 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; INFO &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Rank &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Use GPU: &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; training
&lt;span class=&quot;token number&quot;&gt;2021&lt;/span&gt;-12-22,22:34:14 &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; INFO &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Rank &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; Use GPU: &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; training
&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;. &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
Train Epoch: &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;/2850879 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;	Loss: &lt;span class=&quot;token number&quot;&gt;8.067907&lt;/span&gt;	Data &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;42.464&lt;/span&gt;	Batch &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;72.875&lt;/span&gt;	LR: &lt;span class=&quot;token number&quot;&gt;0.000000&lt;/span&gt;	logit_scale &lt;span class=&quot;token number&quot;&gt;2.659&lt;/span&gt;
Train Epoch: &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3840&lt;/span&gt;/2850879 &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;	Loss: &lt;span class=&quot;token number&quot;&gt;8.055143&lt;/span&gt;	Data &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.008&lt;/span&gt;	Batch &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;t&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.356&lt;/span&gt;	LR: &lt;span class=&quot;token number&quot;&gt;0.000001&lt;/span&gt;	logit_scale &lt;span class=&quot;token number&quot;&gt;2.659&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;我们可以看到，我们的代码已经可以在单机8卡的场景下测试运行了，不过，我们会发现由于数据集比较多，这个训练还是比较慢的，此时我们可以利用萤火的多机多卡进行并行训练。&lt;/p&gt;
&lt;p&gt;我们在幻方萤火的管理页面提交任务运行，选择 6 个节点：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/21df78914902291789485cd80a838629/d69c4/p1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 74.23312883435584%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC0ElEQVQ4y4XTyW7bZhSGYd5A040dW6ImzpPEmZRIStZESx7iKY7VOrHdBAG6am+gbtACXbVpF7nityAFFE2RpIsHh/+Hw8X5B8GLR4xnK7JJSXZQkk9XTGbrOivma0bjBbabYH1RjOWm6JaL4MVDxtMlWTEnnywZTRaMD8paVuXjGYYToNt+rfo2+yFmP/hHlVmDCMN2EdrtFqIoUtVWS6TZ2Kex/xRVkdFVBanXxdBUTEPDMg3kXodOS6TTbtFpi3Sr/8QG/b5DFCcIhm5gGgaS1ENWVAbxiGBYEOUTomxCnB/Qj4bYQYITpFh+jOnFWP9iuhGDOMPxIwTf84mikG63g6KbjI5esNq8pry+Z351x3rzhuH6Of78jHBxvrW8+EgwPyM9uiGcHCKEUcRwlCLLErKs0PdiJNVG1fsoNQfNHKCbLnpd/8tF1R3c4RQ3myG4rkcQBEi9amSNYnVOfvgMN1vgFeVWXll+WlHWvcnynHC8RHA9jyiKkCUJWTOYXdzWwsUZYdVU1f8RzJ+RrJ7j54tqDz3iNCHLcuz+gPzoisXlt4TzE9zxmmB6gj89/oIT/INjksNLgnyO4LkucZygqgo9RWN2+ZLl9T3lzXfMr14RlduNjz6nvCCYnZKsr/GLEiEMQ4o8pzpty3ZIJ0vS6YqoWBLmC5xojBN/nh0VeOMVyfyEaFggeGFImg4J4pQoTbEGAbaXoloeWvU6qlfyKbaPaXkY5gA72N7dalLBt3VGfY3UUdDEHYz2HoHRw5GbtHa+orP7hN7Trz+2+4RuY4e9bof9bod2c5/m3i4tsYmgHr9Fv/sN/fYdyuYRefOItHnEevmO5PUvWLc/I91s89rNT0i3v6IsX3GtqJyqOoNsSr46x69Gbp3+QPPNB5p3vyM+vEd8+JPG/Xu0t38x+vFDXat1ldfu/6j7u0ff86BpvNAN3HHJ9OwbwnzK32WI6iUkPHUtAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Select Nodes&quot;
        title=&quot;Select Nodes&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/21df78914902291789485cd80a838629/a6d36/p1.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/21df78914902291789485cd80a838629/222b7/p1.png 163w,
https://hfai-static.high-flyer.cn/static/21df78914902291789485cd80a838629/ff46a/p1.png 325w,
https://hfai-static.high-flyer.cn/static/21df78914902291789485cd80a838629/a6d36/p1.png 650w,
https://hfai-static.high-flyer.cn/static/21df78914902291789485cd80a838629/e548f/p1.png 975w,
https://hfai-static.high-flyer.cn/static/21df78914902291789485cd80a838629/d69c4/p1.png 1002w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;任务提交后，我们在幻方萤火的管理页面，可以比较方便地看到任务的日志和状态：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/76bf1130dae3a79e8c37551ca2529276/497e9/p2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 38.65030674846626%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABgElEQVQoz2WR226bQBRF+Q3XxsbhNgMYGG7DJGDsxNhyWlWt1Jf+/4esClxHifywn86Zvfc6Y50OFeNrzflNMx4rLt8vnH7+oe9K9s8Jpha86OirGklvEo694u3YMJ4M79eB7scvLD/wEUIgpCCKIlSpSNKcKE5I84IgDHGcDbZtP2ht23xbLFBKYV46npw1VihuRnEcEycJdduQlw3JLqXWBlemrNdrHMd50Ha7nY2VKhgORzzPxwrDECkFUkqiOKKoS9K8JBSSqqpRRUmWpTPBFB4EAdObiSoMAjzPo6oqxvOFLMvuhvLWMokpm5q8rAlCQWsMxrTsdru55XK5ZLVafWhqt/iPPJ7P5Hl+R74bJlRNTaaq+YZatxRFge/7N8ztdja+a7PZzCFTw2EYyPMM6zOCiCSqKtjNnyHnxSl1mrmui/PksVrZDw2LsuQ4XolThTXV1bqh0RrdtuwPA8/dnka3dH1PVpQkcTzfLgj8OfyzPNfFdD3j77+Y1yv/ABtd8yU6gOs/AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Log&quot;
        title=&quot;Log&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/76bf1130dae3a79e8c37551ca2529276/a6d36/p2.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/76bf1130dae3a79e8c37551ca2529276/222b7/p2.png 163w,
https://hfai-static.high-flyer.cn/static/76bf1130dae3a79e8c37551ca2529276/ff46a/p2.png 325w,
https://hfai-static.high-flyer.cn/static/76bf1130dae3a79e8c37551ca2529276/a6d36/p2.png 650w,
https://hfai-static.high-flyer.cn/static/76bf1130dae3a79e8c37551ca2529276/e548f/p2.png 975w,
https://hfai-static.high-flyer.cn/static/76bf1130dae3a79e8c37551ca2529276/3c492/p2.png 1300w,
https://hfai-static.high-flyer.cn/static/76bf1130dae3a79e8c37551ca2529276/497e9/p2.png 2064w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;我们可以发现，在 6 节点（48 张显卡）并行训练的过程中，单个 epoch 训练大约 6 分钟，我们如果训练 30 个 epoch，加上初始化时间，大约 3 个多小时:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/de31202c4287641edb3617073dc745b4/d74fe/p3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 25.153374233128833%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAlUlEQVQY05WOQQ7DMAgE/ZLGBgNOsN2mueT/H9sqjtRDL0kPoxUSDBtEFb111FZhm2NdV9RakVJCjHHkPwQigoggS0YyhplBVU/hz/KdB6H3jn3fB9t7g7tjekzj+MsUv7IrachFYD6j1AW6FBwzKYM0g4SRhEGWkZjuNaRFQC6gpme6gpuBnwVcFeyK/JqH9Gh6JfwAtWqNf/mBxDUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Success&quot;
        title=&quot;Success&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/de31202c4287641edb3617073dc745b4/a6d36/p3.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/de31202c4287641edb3617073dc745b4/222b7/p3.png 163w,
https://hfai-static.high-flyer.cn/static/de31202c4287641edb3617073dc745b4/ff46a/p3.png 325w,
https://hfai-static.high-flyer.cn/static/de31202c4287641edb3617073dc745b4/a6d36/p3.png 650w,
https://hfai-static.high-flyer.cn/static/de31202c4287641edb3617073dc745b4/e548f/p3.png 975w,
https://hfai-static.high-flyer.cn/static/de31202c4287641edb3617073dc745b4/d74fe/p3.png 1164w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;验证&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E9%AA%8C%E8%AF%81&quot; aria-label=&quot;验证 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;验证&lt;/h2&gt;
&lt;p&gt;针对 CLIP 模型的验证测试，openAI 提供了多种方式，我们可以比较方便地在萤火上对此进行复现，这里为了便于我们理解模型，我们展示一种比较可视化的方式对它进行简单的验证:&lt;/p&gt;
&lt;p&gt;我们使用 skimage 的一些图片和文本信息，使用我们训练好的模型计算相似度，然后通过二维矩阵的方式打印出来：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/3fcd9558cffdbd05a320aabb9446c5f8/a6d66/banner.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 69.93865030674846%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAADP0lEQVQ4y2WTXUxbdRjG/7KJwjZRw4W6yIVebMvU4YSNuTmh5cNRSr9sA0VhjF4wyRA3qVGaFZYAArIi+8iYerVxoRtVxlw0MUaXLDHGC+P1sguX0iKu7TmlQFvan/n3rGLmmzw5yUnOL8/zPu8RAJlM5n+Sk06ns894XGU+ECAYXCAwH2J+YZHg3/dQogqLfy0yHwwRCi2wllpD5D5+cHLv79y5y5lzl3B2DzLoPsrcoIvf+u3cOuvl4sVJPvtiiulhD1MTw/wZDCByTlKp1ANKIpmhwC1ufv8RnY4THKtpZrL5MP2793Neb8Lxqo0u+7t4m7s5ZnTxw9WfNODq6iqRSARVVYlGoyiKgqpGUFRgxYfyh6BjaxPmh49g2dRKY6GLhkfbsRe0Y3ukFWthO2+IJnoPetcjJ5PJLFAqFouhKirJdJJvp67StWMvoV/y6dfvpUy0YsyzUC+sHBJODHkdNAgbNaKOvrK+daCMvbKykoUtLS0RU2NkWOOrkRvUiEYun9bjH9vFJ7ZyqiVI2DDmt2EsPkF9SQ/bd3XS7J7UgP91KeP+6zCTZPbT6+iFlZeLfMx9Xs7t77bgLDbRuNmB4TEXDSVu6g6MUdQ9wv7ZL7Ud5ka6jMfj2g4VlQxp/L45dMKIpeBNquWe9lXBgqDJ9QG7S05izrNifL6Pgzu89HRNIxKJBFLSnSxHAqVDLXIG/+lr6IQJ0zM91Is2nI/bOHXcyc/fvMSZ3joqNvZhesKFbuPb9BrGENKNbFYqHA5n3UlFwhESmQRXxvxUCgu6iiEq9nVTXtbJK9vOMv1jKVdulNJrOYy5wE6lMOA+4NEiyzJy7cpCpLTIGb4ev8ZrwspOyygF506x5YKH2sohxMcTtN00kfpd0PK0hdeFGXeVVwPKQ845leCs06hCihQz47NUiUZqnmxHV9xC6Z5O8gcmEKM+tre8j+fFWu7+WsRw1Qv0bBvQgLJlubvcHWZjR5Vs5Jn7OzQKByZhRb/5LZ6rPc6GkyM8ZR3CVtjFjGcnjiM6bJ7x9TtcXl6+/4do0cP3wlmg33cdnbDQsKGJQw85MAg7NmFm03sDbH1nFMuzH1It2ig82sGe2xf4B5XXK7KLIo0RAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Result&quot;
        title=&quot;Result&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/3fcd9558cffdbd05a320aabb9446c5f8/a6d36/banner.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/3fcd9558cffdbd05a320aabb9446c5f8/222b7/banner.png 163w,
https://hfai-static.high-flyer.cn/static/3fcd9558cffdbd05a320aabb9446c5f8/ff46a/banner.png 325w,
https://hfai-static.high-flyer.cn/static/3fcd9558cffdbd05a320aabb9446c5f8/a6d36/banner.png 650w,
https://hfai-static.high-flyer.cn/static/3fcd9558cffdbd05a320aabb9446c5f8/e548f/banner.png 975w,
https://hfai-static.high-flyer.cn/static/3fcd9558cffdbd05a320aabb9446c5f8/3c492/banner.png 1300w,
https://hfai-static.high-flyer.cn/static/3fcd9558cffdbd05a320aabb9446c5f8/a6d66/banner.png 2070w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;我们把相似度最高的，标记成了黄色，我们可以从上图看出，我们训练的模型在该情况下表现尚可。&lt;/p&gt;
&lt;h2 id=&quot;总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%80%BB%E7%BB%93&quot; aria-label=&quot;总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;总结&lt;/h2&gt;
&lt;p&gt;CLIP 模型思路新颖同时比较简单，借助萤火集群和自研文件系统，我们可以比较高效地训练该模型，在训练的过程中，GPU 的平均使用率达到 80%+, GPU Memory 使用率持续在 10GB+。&lt;/p&gt;
&lt;p&gt;基于目前的数据和模型，我们后续还可以进行进一步的探索。&lt;/p&gt;
&lt;p&gt;综合体验打分如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;研究新颖度: ★★&lt;/p&gt;
&lt;p&gt;该模型对图像文本分类领域提出了一个较为新颖的方法，有一定的技术推进性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开源指数: ★★★★&lt;/p&gt;
&lt;p&gt;官方开源了模型代码，并且 github 上有一些更加通用的开源代码参考，代码逻辑清晰可读性高。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;算力需求: ★★★&lt;/p&gt;
&lt;p&gt;解压后训练数据大小为 84 G，近 300 万条训练数据，6 节点 48 张 A100 大约需要 3 小时&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通用指数: ★★★&lt;/p&gt;
&lt;p&gt;该模型虽然比较容易理解，但是在多模态领域还是比较有启发的，有可能会在一定程度上成为后续深入研究的 baseline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;模型适配度: ★★★★&lt;/p&gt;
&lt;p&gt;额外依赖不多，在使用下载好的数据集的情况下我们只需要简单改一下 DataSet 等代码即可运行&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;幻方 AI 紧跟 AI 研究的前沿浪潮，致力于用领先算力助力AI落地与价值创造，欢迎各方数据研究者与开发者们一同共建。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Alphafold 训练优化 01 | 数据处理优化]]></title><description><![CDATA[若说2021年人工智能学术界最令人振奋的成果，那么Alphafold可谓当之无愧。Alphafold2在CASP14 蛋白质预测挑战上取得了远远超出同类模型的准确率，并首次将蛋白质结构预测的精度提高到了原子级别——已经接近了实验测量的水准。 幻方AI团队在Alphafold…]]></description><link>https://www.high-flyer.cn/blog/alphafold-1/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/alphafold-1/</guid><dc:creator><![CDATA[Daylight]]></dc:creator><pubDate>Sat, 25 Dec 2021 15:00:00 GMT</pubDate><content:encoded>&lt;p&gt;若说2021年人工智能学术界最令人振奋的成果，那么Alphafold可谓当之无愧。Alphafold2在CASP14 蛋白质预测挑战上取得了远远超出同类模型的准确率，并首次将蛋白质结构预测的精度提高到了原子级别——已经接近了实验测量的水准。&lt;/p&gt;
&lt;p&gt;幻方AI团队在Alphafold2推出不久就在萤火二号平台成功将Alphafold2训练运行了起来，详情如我们上一期文章&lt;a href=&quot;/blog/alphafold&quot;&gt;《萤火跑模型 | Alphafold 蛋白质结构预测》&lt;/a&gt;。然而，由于Alphafold2本身模型的复杂性和开源代码的缺陷，并且幻方AI的训练平台也比较特殊，使得一开始复现资源利用效率非常底下，训练成本不可接受。&lt;/p&gt;
&lt;p&gt;为了提高Alphafold的训练效率，帮助科研人员与开发者们降低研究门槛，幻方AI团队对Alphafold2模型进行了大量优化，大幅提高了模型训练的效率。我们的工作可以被概括为以下三点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;重构代码，解决开源版本中无法多机多卡训练的问题，利用数据并行大幅提高Alphafold2训练效率，降低复现门槛；&lt;/li&gt;
&lt;li&gt;优化数据处理逻辑，大幅增加GPU的利用率，从40%左右提升到了90%以上；&lt;/li&gt;
&lt;li&gt;利用hfai高性能工具改造模型，将Alphafold2深度融合进幻方AI的训练平台中，大幅提高训练性能。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本次文章先和大家聊聊，如何优化蛋白质数据的处理，以获得高效的训练性能。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型仓库&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/alphafold-optimized&quot;&gt;https://github.com/HFAiLab/alphafold-optimized&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;输入优化&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%BE%93%E5%85%A5%E4%BC%98%E5%8C%96&quot; aria-label=&quot;输入优化 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;输入优化&lt;/h2&gt;
&lt;p&gt;Alphafold的输入特征可以分为这样三类：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;蛋白质序列本身&lt;/li&gt;
&lt;li&gt;Multi-Sequence Alignment(MSA)多序列对齐特征&lt;/li&gt;
&lt;li&gt;Template蛋白质模板特征&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;它们在不同的蛋白质序列长度之间差异非常大，处理所需时间可以从几秒到上千秒不等，这会极大的影响模型训练的效率。例如在一次20分钟的训练过程中，单个长样本的处理就可能阻塞整体训练10几分钟。而在多机多卡大批次场景下，每个批次内有部分数据的处理时间极长几乎成了必然事件。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/0c64838849f04b5cb2cbfdbfc4846ee4/84ee5/image.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 30.061349693251532%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAAsTAAALEwEAmpwYAAABT0lEQVQY0zXM60vCYBwF4P3dBRWYoFkR+SWkzVspK2mZNS/Dqdur6WQbqcPNu5C6ZpJ0Ualtv9DofDsHnoNVOT+fdEvFoGHMnsevE322XCyNiQEAuqap9IOapMea+v75MR6NVouvZnuYQa00ainaEJNKYZQ+EEtR7SnRFY/6tVCunCHiXrocZyOX/KEn73bJqeTCNKfz+Q/YYqN/HCh48AJXUbASi7MJJ8oGmzLVFlxdmWAQHc2c33JXOeqmHAwIoaCYzyGSrPkJJXLB85KfEn3kY1FoYCLvK9zv1MvEavW9WFrLlQkAtmUBgJxKxre36L3dXOw6S+CM01E6PWFZ4YyseMMoy0lYR2F6yl1PzZrmmq2lbVsbPOA55HCgfUeTYQDAMtdje2gEqCoeE8RaB4P/2P/5KwDwput9WRrI8vxF3+D1u9qb+uMKTjXq2uQXKCwkhkRd5EEAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/0c64838849f04b5cb2cbfdbfc4846ee4/a6d36/image.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/0c64838849f04b5cb2cbfdbfc4846ee4/222b7/image.png 163w,
https://hfai-static.high-flyer.cn/static/0c64838849f04b5cb2cbfdbfc4846ee4/ff46a/image.png 325w,
https://hfai-static.high-flyer.cn/static/0c64838849f04b5cb2cbfdbfc4846ee4/a6d36/image.png 650w,
https://hfai-static.high-flyer.cn/static/0c64838849f04b5cb2cbfdbfc4846ee4/e548f/image.png 975w,
https://hfai-static.high-flyer.cn/static/0c64838849f04b5cb2cbfdbfc4846ee4/84ee5/image.png 1076w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，在训练Alphafold的初始阶段，输入的特征是通过序列数据库搜索，生物学工具（JackHmmer/HHSearch/…）计算而得出，需要依赖大量的CPU计算能力支持。在整个Alphafold模型训练的过程中，CPU算力往往成为了阻碍Alphafold训练性能提升的重要瓶颈。&lt;/p&gt;
&lt;p&gt;针对上述问题，幻方AI采用&lt;strong&gt;特征预处理&lt;/strong&gt;与&lt;strong&gt;特征裁切&lt;/strong&gt;两种方案对输入进行优化。简单来说，特征预处理利用专门的CPU集群，将大量数据库搜索任务，生物学工具计算任务预先做掉，得到特征集和候选集；在模型训练阶段，模型直接拉取特征集和候选集，筛选特征，适当裁切长蛋白质序列特征。通过该方法我们实现了alphafold训练性能4-5倍的提升，在接下来的章节中我们会为大家详细描述。&lt;/p&gt;
&lt;h3 id=&quot;1-特征预处理&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-%E7%89%B9%E5%BE%81%E9%A2%84%E5%A4%84%E7%90%86&quot; aria-label=&quot;1 特征预处理 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. 特征预处理&lt;/h3&gt;
&lt;p&gt;在一般的模型训练任务中，耗时的大头都在于GPU的前向推理和反向传播的计算，数据处理可以通过异步Dataloader载入的方式来掩盖时间开销。然而在Alphafold的训练中，模型对处理好的数据进行一次迭代需要大约11秒（基于A100 GPU），而对于这一个数据的预处理则需要花费大约150秒（一整颗EPYC 64核处理器），其是GPU运算时间的13倍，根本无法被GPU计算时所隐藏。 在这种情况下，&lt;strong&gt;GPU利用率的理论上限也仅有7.3%，效率是非常低下的&lt;/strong&gt;。 同时，萤火二号集群上每个机器配备的是8张GPU和一张CPU，按照原有的多卡并行训练方式，CPU资源会更加紧缺，因此在训练时对特征处理进行优化已经毫无意义，我们需要寻找其他替代方案。&lt;/p&gt;
&lt;p&gt;我们选择&lt;strong&gt;将特征处理单独分离出来，使用CPU集群算力预先完成一部分任务，将得到的候选样本数据进行保存&lt;/strong&gt;。为了提高处效率，最大化CPU的利用率，我们使用Python多进程对特征预处理进行了并行加速。然而，特征处理涉及到多个不同的生物学工具，且每种工具对CPU的利用率各不相同，因此直接并行化很容易导致进程过多，从而产生大量的CPU调度抢占开销。根据统计，在对几个不同类型的特征进行处理时的CPU资源占用情况如下表所示：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;蛋白质数据集&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;处理工具&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;耗时（秒）&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;CPU占用核数&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;总算力需求（分钟/核）&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Uniref90&lt;/td&gt;
&lt;td&gt;JackHmmer&lt;/td&gt;
&lt;td&gt;567&lt;/td&gt;
&lt;td&gt;4核&lt;/td&gt;
&lt;td&gt;37.80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Magnify&lt;/td&gt;
&lt;td&gt;JackHmmer&lt;/td&gt;
&lt;td&gt;851&lt;/td&gt;
&lt;td&gt;4核&lt;/td&gt;
&lt;td&gt;56.73&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bfd-small&lt;/td&gt;
&lt;td&gt;JackHmmer&lt;/td&gt;
&lt;td&gt;308&lt;/td&gt;
&lt;td&gt;4核&lt;/td&gt;
&lt;td&gt;20.53&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pdb70&lt;/td&gt;
&lt;td&gt;HHSearch&lt;/td&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;64核&lt;/td&gt;
&lt;td&gt;66.13&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;从上表可以观察到：前三个数据集使用JackHmmer，其基本只能使用4核的CPU资源；而Pdb70使用HHSearch，其能够使用CPU上的所有资源。因此我们&lt;strong&gt;需要针对不同的处理工具建立不同的进程池进行调度分配&lt;/strong&gt;。我们采用的优化策略是：同时发起多个JackHmmer任务，并每隔一段时间发起一个HHSearch任务。&lt;/p&gt;
&lt;p&gt;在128核的CPU节点上，经过优化后的特征预处理的CPU占用率如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/d53fe9592b919173ac7baa7697c37468/5b6ee/image-20220216130915301.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 37.423312883435585%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsTAAALEwEAmpwYAAABEElEQVQY0y2QC4+DMAiA/f//75Jza7t76Oatzr60FGjrpbrkCyHwkQDdvu9UK5b9oJ5Ezi6C3aLboo+QcsW6vzlMKrWW0jHTEOCqjbCb9CgCSY/SJWmj8CgcSJ+uLgm7iZcTS5AOrjbeA5TMHRJ9G/8x3PtJ99PcP01D216b/vmSk/6ZzfCyanat+DQXbT+neVhsZuqIaQxw0UbZqBxIB9JGaTa1svT4WKxb5pqzTkUEUgci0LRRZu6YeQwgDlsFlm/e0q+Lf261yGNk4UmtZ50fkZioDd/XduHN482nFkPjK6DySXlUxxeOVlJHlB6nFdvapRTOBTkjZ8oFkFaAmFID8cw3gAgpEZ9aMznXUv8B3x2MFuvmIegAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image-20220216130915301.png&quot;
        title=&quot;image-20220216130915301.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/d53fe9592b919173ac7baa7697c37468/a6d36/image-20220216130915301.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/d53fe9592b919173ac7baa7697c37468/222b7/image-20220216130915301.png 163w,
https://hfai-static.high-flyer.cn/static/d53fe9592b919173ac7baa7697c37468/ff46a/image-20220216130915301.png 325w,
https://hfai-static.high-flyer.cn/static/d53fe9592b919173ac7baa7697c37468/a6d36/image-20220216130915301.png 650w,
https://hfai-static.high-flyer.cn/static/d53fe9592b919173ac7baa7697c37468/e548f/image-20220216130915301.png 975w,
https://hfai-static.high-flyer.cn/static/d53fe9592b919173ac7baa7697c37468/3c492/image-20220216130915301.png 1300w,
https://hfai-static.high-flyer.cn/static/d53fe9592b919173ac7baa7697c37468/5b6ee/image-20220216130915301.png 1672w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;可见此时已经可以基本以比较稳定的100%利用率使用CPU资源。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;值得注意的是&lt;/strong&gt;，特征预处理可以预先将蛋白质本身特征提取出来（序列信息、空间结构信息等），而对于MSA特征和Template特征，Alphafold的论文中提到，训练中是一个搜索过程，随机选取最合适的4个特征进行输入，因此预处理能提供适合适的候选集，而最终模型训练时选哪4个特征作为输入，预处理部分无法替代。&lt;/p&gt;
&lt;p&gt;上述特征预处理出来的中间结果可以通过幻方AI自研的&lt;a href=&quot;/blog/ffrecord&quot;&gt;FFRecord&lt;/a&gt;格式进行存储，以充分利用萤火集群的高速文件系统3FS，详情可以参考之前的文章&lt;a href=&quot;/blog/3fs&quot;&gt;《幻方力量 | 高速文件系统：3FS》&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id=&quot;2-特征裁切&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%E7%89%B9%E5%BE%81%E8%A3%81%E5%88%87&quot; aria-label=&quot;2 特征裁切 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. 特征裁切&lt;/h3&gt;
&lt;p&gt;前面提到，不同长度的蛋白质序列处理可能会导致训练被阻塞，除了将运行时处理转为预处理，我们还可以&lt;strong&gt;对较长的特征进行裁切&lt;/strong&gt;。但需要注意的是，对特征进行特征裁切必然会影响模型训练的效果，因此需要在模型性能和训练效率二者间调节平衡。&lt;/p&gt;
&lt;p&gt;特征裁切仅针对MSA特征和Template特征的处理，因为其主要目标是找到更多相似特征（序列、结构）以增强模型的表达能力。特征裁切可以有效减少对复杂蛋白质的特征处理开销，提高整个训练效率。蛋白质序列本身特征是不适用特征裁切的。&lt;/p&gt;
&lt;h4 id=&quot;21-msa特征裁切&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#21-msa%E7%89%B9%E5%BE%81%E8%A3%81%E5%88%87&quot; aria-label=&quot;21 msa特征裁切 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2.1 MSA特征裁切&lt;/h4&gt;
&lt;p&gt;MSA特征是一组与输入的人类蛋白质序列相似的其他生物蛋白质序列的集合，用于帮助模型Encoder部分形成蛋白质的特征向量。若输入的蛋白质序列长度为N个氨基酸，在预处理阶段中找到的同源蛋白质数量为M，则需要进行预处理的MSA特征的大小就为NxM。可见在蛋白质序列不能被裁切的前提下，只能通过对同源蛋白质数量进行裁切，即丢弃部分之前查找到的同源序列来减少这部分的耗时。&lt;/p&gt;
&lt;p&gt;蛋白质序列长度N，MSA特征序列数M，最终处理时长T，他们满足如下线性关系：
&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mi&gt;M&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;T=C \times N \times M&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.6833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.13889em;&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.7667em;vertical-align:-0.0833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.07153em;&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;×&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.7667em;vertical-align:-0.0833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10903em;&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;×&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.6833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.10903em;&quot;&gt;M&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;C是一个固定常数，和机器的处理能力有关。我们实验中发现，使训练不被阻塞的最大时长为150秒，因此我们可以根据上面的公式推得每个输入蛋白质序列的最大MSA特征数量。实际在实验中，只有不到10%的序列需要裁切MSA特征，因此这能够在尽可能不损害性能的情况下极大的提升训练的效率。&lt;/p&gt;
&lt;h4 id=&quot;22-template特征裁切&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#22-template%E7%89%B9%E5%BE%81%E8%A3%81%E5%88%87&quot; aria-label=&quot;22 template特征裁切 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2.2 Template特征裁切&lt;/h4&gt;
&lt;p&gt;Template特征旨在抽取与要预测的蛋白质在空间结构上相似的蛋白质序列，用于帮助模型的Structure Module部分形成特征表达，输出蛋白质的空间结构。同样地，单个蛋白质可能有上百个模板，虽然在Alphafold的训练中最终只有4个模板需要被送入模型参与训练，但未必所有模板都与蛋白质真正匹配。因此一旦遇到大量模板都不符合要求的情况，在检查模板序列的过程中就可能要花费十几分钟的时间。&lt;/p&gt;
&lt;p&gt;对于Template特征的处理可以进行并行加速，但受限于PyTorch Dataloader守护进程的问题和CPU资源量的限制，在实际训练中这种方法不太适用。因此我们同样考虑对Template特征进行裁切，以减少这步骤消耗的时间。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;特征预处理获得Template特征候选集，按照匹配度进行排序；&lt;/li&gt;
&lt;li&gt;训练时尽量使用与原蛋白质更匹配的模板；&lt;/li&gt;
&lt;li&gt;对于模板匹配过程设有一个固定的时间限制，超时做裁切。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;后面实验会展示上述方法在实际训练中的效果。&lt;/p&gt;
&lt;h2 id=&quot;实验&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%AE%9E%E9%AA%8C&quot; aria-label=&quot;实验 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;实验&lt;/h2&gt;
&lt;p&gt;首先，我们先测试Alphafold在单张A100显卡上进行训练时每一个Step的时间开销，作为基准：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Stage&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Mean duration (s)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Percentage (%)&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Training Step&lt;/td&gt;
&lt;td&gt;12.65&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Get Training Batch&lt;/td&gt;
&lt;td&gt;1.87&lt;/td&gt;
&lt;td&gt;14.78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forward&lt;/td&gt;
&lt;td&gt;4.24&lt;/td&gt;
&lt;td&gt;33.52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero Grad&lt;/td&gt;
&lt;td&gt;0.17&lt;/td&gt;
&lt;td&gt;1.31&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exponential Moving Average&lt;/td&gt;
&lt;td&gt;0.14&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optimizer Step&lt;/td&gt;
&lt;td&gt;0.45&lt;/td&gt;
&lt;td&gt;3.42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backward&lt;/td&gt;
&lt;td&gt;5.93&lt;/td&gt;
&lt;td&gt;46.88&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;从表格中可以看到，训练一个Step就要花费12.65秒，其中最主要的时间开销在于Backward，Forward和Get Training Batch三步。由于使用的数据很少，并且没有使用多卡并行，此时特征处理带来的性能瓶颈和DDP的开销还没有能体现出来。&lt;/p&gt;
&lt;p&gt;而当训练数据较多时，不同训练数据间的处理时间差异就会显得尤为突出。如下图所示，大多数输入的数据只需要数秒即可完成处理，然而少部分蛋白质在极端情况下会需要上百秒的预处理时间。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/7aeafee22349939603c87fefa3d2f8fe/e751c/image-20220218171358180.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 79.14110429447852%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAu0lEQVQoz6WTuw7CMAxF+/n8DCNiZUcMndgQCBZaQZLSpkls36CCEOW1mKM7eDmJfJUUuJEf3GfvfVVV1lpjjHOOiPI3ChEhZrwiI/CbQY6JoKIAEEmyij9vFvFRKxOlNiSlbIxpe61srfWRlYU5Z7ug35n0MoB/ZDFdFJ2cgcO5l8ffAF6Tn/lSWM55sT7NyjoQE3++05H+fjAGudw3k/luuqqW22ZT+2MTTUeXntvAfZJAQyILCcZh4Ap8J7L4G2j52AAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image-20220218171358180.png&quot;
        title=&quot;image-20220218171358180.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/7aeafee22349939603c87fefa3d2f8fe/a6d36/image-20220218171358180.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/7aeafee22349939603c87fefa3d2f8fe/222b7/image-20220218171358180.png 163w,
https://hfai-static.high-flyer.cn/static/7aeafee22349939603c87fefa3d2f8fe/ff46a/image-20220218171358180.png 325w,
https://hfai-static.high-flyer.cn/static/7aeafee22349939603c87fefa3d2f8fe/a6d36/image-20220218171358180.png 650w,
https://hfai-static.high-flyer.cn/static/7aeafee22349939603c87fefa3d2f8fe/e548f/image-20220218171358180.png 975w,
https://hfai-static.high-flyer.cn/static/7aeafee22349939603c87fefa3d2f8fe/e751c/image-20220218171358180.png 1123w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;因此一旦遇到一条这样的输入数据，就会导致整个训练阻塞。而假设所有训练数据中只有5%会导致训练阻塞，那么在使用128的batch_size训练Alphafold（原论文参数）时，每个batch被阻塞的概率就为:&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;math math-inline&quot;&gt;&lt;span class=&quot;katex&quot;&gt;&lt;span class=&quot;katex-mathml&quot;&gt;&lt;math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mo stretchy=&quot;false&quot;&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;0.05&lt;/mn&gt;&lt;msup&gt;&lt;mo stretchy=&quot;false&quot;&gt;)&lt;/mo&gt;&lt;mn&gt;128&lt;/mn&gt;&lt;/msup&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;99.86&lt;/mn&gt;&lt;mi mathvariant=&quot;normal&quot;&gt;%&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&quot;application/x-tex&quot;&gt;P_{stuck} = 1-(1-0.05)^{128}=99.86\%&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&quot;katex-html&quot; aria-hidden=&quot;true&quot;&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8333em;vertical-align:-0.15em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;&lt;span class=&quot;mord mathnormal&quot; style=&quot;margin-right:0.13889em;&quot;&gt;P&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t vlist-t2&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.3361em;&quot;&gt;&lt;span style=&quot;top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;mord mathnormal mtight&quot; style=&quot;margin-right:0.03148em;&quot;&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-s&quot;&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.15em;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.7278em;vertical-align:-0.0833em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mopen&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mbin&quot;&gt;−&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2222em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:1.0641em;vertical-align:-0.25em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;0.05&lt;/span&gt;&lt;span class=&quot;mclose&quot;&gt;&lt;span class=&quot;mclose&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;msupsub&quot;&gt;&lt;span class=&quot;vlist-t&quot;&gt;&lt;span class=&quot;vlist-r&quot;&gt;&lt;span class=&quot;vlist&quot; style=&quot;height:0.8141em;&quot;&gt;&lt;span style=&quot;top:-3.063em;margin-right:0.05em;&quot;&gt;&lt;span class=&quot;pstrut&quot; style=&quot;height:2.7em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sizing reset-size6 size3 mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;&lt;span class=&quot;mord mtight&quot;&gt;128&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mrel&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mspace&quot; style=&quot;margin-right:0.2778em;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;base&quot;&gt;&lt;span class=&quot;strut&quot; style=&quot;height:0.8056em;vertical-align:-0.0556em;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mord&quot;&gt;99.86%&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;这几乎在每个step的训练中都会遇到阻塞的情况。此时整个训练的GPU利用率会很极端的下滑到20%以 下，其中大部分时间都花费在了等待batch中的某一个数据处理完成上。&lt;/p&gt;
&lt;p&gt;例如在没有进行优化时使用16个节点，128张A100进行训练，那么前4个step的花费时间就为：413s, 177s, 100s, 101s, 每个step中的GPU利用率不到10%。可见此时若是不对数据处理进行优化，那么很难正常进行训练。&lt;/p&gt;
&lt;h3 id=&quot;1-特征预处理测试&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-%E7%89%B9%E5%BE%81%E9%A2%84%E5%A4%84%E7%90%86%E6%B5%8B%E8%AF%95&quot; aria-label=&quot;1 特征预处理测试 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. 特征预处理测试&lt;/h3&gt;
&lt;p&gt;我们在总共11万条的蛋白质序列训练数据中，随机抽取了3.5万条蛋白质序列进行解析，并统计了这些序列分别使用直接训练时处理和特征预处理方式的耗时：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;蛋白质&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;原处理时间（s）&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;使用特征预处理后的时间（s）&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3j3q&lt;/td&gt;
&lt;td&gt;145.9&lt;/td&gt;
&lt;td&gt;46.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3j3y&lt;/td&gt;
&lt;td&gt;129.8&lt;/td&gt;
&lt;td&gt;41.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6u42&lt;/td&gt;
&lt;td&gt;78.9&lt;/td&gt;
&lt;td&gt;27.5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如上表所示，对于处理时长大于10秒的序列，原来需要150秒的特征解析过程在优化后仅仅需要50秒左右，这大大抑制了超长序列对整个训练的阻塞影响。即使是小序列，也能得到将近3倍的速度提升。&lt;/p&gt;
&lt;p&gt;接着，我们再看看使用特征预处理结果对训练时的GPU利用率和总训练时间能带来多大的收益。这里，我们先不进行特征裁切，先比较特征预处理方法后的性能提升。结果如下表所示：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;不进行特征预处理&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;进行特征预处理&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;每轮开始时的数据处理时长（s）&lt;/td&gt;
&lt;td&gt;451&lt;/td&gt;
&lt;td&gt;393&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;平均每个step时长（s）&lt;/td&gt;
&lt;td&gt;50.3&lt;/td&gt;
&lt;td&gt;23.57&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;训练被阻塞的次数&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU利用率&lt;/td&gt;
&lt;td&gt;19.58%&lt;/td&gt;
&lt;td&gt;42.37%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;可以看到，进行特征预处理能够获得非常明显的性能提升，GPU利用率提升了一倍。但同时，过多的训练阻塞导致整体的GPU利用率依然不够理想。&lt;/p&gt;
&lt;h3 id=&quot;2-msa特征裁切测试&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-msa%E7%89%B9%E5%BE%81%E8%A3%81%E5%88%87%E6%B5%8B%E8%AF%95&quot; aria-label=&quot;2 msa特征裁切测试 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. MSA特征裁切测试&lt;/h3&gt;
&lt;p&gt;接着，我们测试使用MSA特征裁切对训练时的GPU利用率和总训练时间的收益。这里MSA特征裁切时间常数为 2e-6，不进行Template特征裁切，都使用特征预处理。结果如下表所示：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;不进行MSA裁切&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;裁切MSA特征&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;每轮开始时的数据处理时长（s）&lt;/td&gt;
&lt;td&gt;393&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;平均每个step时长（s）&lt;/td&gt;
&lt;td&gt;23.57&lt;/td&gt;
&lt;td&gt;10.87&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;训练被阻塞的次数&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU利用率&lt;/td&gt;
&lt;td&gt;42.37%&lt;/td&gt;
&lt;td&gt;90.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;可以看到，使用MSA特征裁切后GPU利用率能再提升一倍以上，训练阻塞也只发生一次。该方法能有效提升训练效率。&lt;/p&gt;
&lt;h3 id=&quot;3-template特征裁切测试&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-template%E7%89%B9%E5%BE%81%E8%A3%81%E5%88%87%E6%B5%8B%E8%AF%95&quot; aria-label=&quot;3 template特征裁切测试 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. Template特征裁切测试&lt;/h3&gt;
&lt;p&gt;之后，我们再测试下Template特征裁切对训练效率的提升效果。时间限制为150秒，都使用特征预处理，不进行MSA特征处理。结果如下表所示：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;不进行Template裁切&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;裁切Template特征&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;每轮开始时的数据处理时长（s）&lt;/td&gt;
&lt;td&gt;393&lt;/td&gt;
&lt;td&gt;201&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;平均每个step时长（s）&lt;/td&gt;
&lt;td&gt;23.57&lt;/td&gt;
&lt;td&gt;11.65&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;训练被阻塞的次数&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU利用率&lt;/td&gt;
&lt;td&gt;42.37%&lt;/td&gt;
&lt;td&gt;90.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;使用Template特征裁切后GPU利用率同样能够提升一倍以上。&lt;/p&gt;
&lt;h2 id=&quot;小结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%B0%8F%E7%BB%93&quot; aria-label=&quot;小结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;小结&lt;/h2&gt;
&lt;p&gt;作为2021年AI领域最具影响力的工作之一，Alphafold的复现无疑是有意义的，能帮助更多研究者和开发者们去探索这个方向的前景。通过优化数据输入，我们可以实现90%以上的GPU使用率，高效利用起了集群计算资源。同时，幻方AI也很多高效的训练工具，比如hfreduce，3FS，算子等等，它们是否能使得Alphafold的训练进一步加速？下一期技术分享将为大家呈现。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[hfai.nn | 性能卓越的深度学习算子]]></title><description><![CDATA[深度学习框架的流行（如PyTorch，Tensorflow等）极大方便了我们研发设计各种各样的AI模型，而在实际落地的环节中，孵化于实验室里的模型代码往往在生产环境上面临着性能、准确度、资源等各种各样的问题。随着AI…]]></description><link>https://www.high-flyer.cn/blog/hfnn/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/hfnn/</guid><dc:creator><![CDATA[High-Flyer]]></dc:creator><pubDate>Thu, 23 Dec 2021 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;深度学习框架的流行（如PyTorch，Tensorflow等）极大方便了我们研发设计各种各样的AI模型，而在实际落地的环节中，孵化于实验室里的模型代码往往在生产环境上面临着性能、准确度、资源等各种各样的问题。随着AI与现实世界的业务结合愈加密切，高性能且易使用的深度学习算子愈发受到AI研究者和开发者们的青睐。&lt;/p&gt;
&lt;p&gt;幻方AI依托萤火二号集群，自研了一系列AI基础设施：3FS，hfreduce，ffrecord等。如之前系列文章中介绍的，他们极大地提升了模型训练中数据读取的性能，充分利用GPU的算力。而对于计算环节，幻方AI同样对Pytorch框架进行了深度优化，结合萤火二号的集群特点，对一些常用的AI算子重新研发，提升效率，进一步提升了模型整体的训练效率。&lt;/p&gt;
&lt;p&gt;本期文章将为大家介绍，幻方AI的深度学习算子，&lt;strong&gt;hfai.nn&lt;/strong&gt;，供大家使用。&lt;/p&gt;
&lt;h2 id=&quot;hfainnparallel&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hfainnparallel&quot; aria-label=&quot;hfainnparallel permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;hfai.nn.parallel&lt;/h2&gt;
&lt;p&gt;在之前的文章&lt;a href=&quot;/blog/hf-reduce&quot;&gt;《幻方萤火 | 模型并行训练工具 hfreduce》&lt;/a&gt;中介绍了幻方AI自研的并行训练工具，设计的全新的通讯模式替代NCCL，在幻方萤火集群上取得非常好的加速效果。这里，我们对接口按照PyTorch框架风格进一步封装，降低大家的使用门槛。&lt;/p&gt;
&lt;h3 id=&quot;hfai-ddp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hfai-ddp&quot; aria-label=&quot;hfai ddp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;hfai DDP&lt;/h3&gt;
&lt;p&gt;我们提供了 &lt;code class=&quot;language-text&quot;&gt;hfai.nn.parallel.DistributedDataParallel&lt;/code&gt; 接口，其在 hfreduce 的基础上进行封装，使用方法和 PyTorch 的 DDP 基本相同。在萤火二号集群的环境下，hfai DDP 多机并行的性能比 PyTorch DDP 更好。&lt;/p&gt;
&lt;p&gt;使用案例：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parallel &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; DistributedDataParallel

&lt;span class=&quot;token comment&quot;&gt;# init dist&lt;/span&gt;
ip &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;environ&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;MASTER_ADDR&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
port &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;environ&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;MASTER_PORT&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
hosts &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;environ&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;WORLD_SIZE&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# number of nodes&lt;/span&gt;
rank &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;environ&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;RANK&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# node id&lt;/span&gt;
gpus &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;device_count&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# gpus per node&lt;/span&gt;

dist&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;init_process_group&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    backend&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;nccl&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    init_method&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;tcp://&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;ip&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;port&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    world_size&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;hosts &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; gpus&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    rank&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;rank &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; gpus &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; local_rank
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_device&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;local_rank&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; MyModel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; DistributedDataParallel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; device_ids&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;local_rank&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;hfainnto_hfaito_torch&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#hfainnto_hfaito_torch&quot; aria-label=&quot;hfainnto_hfaito_torch permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;hfai.nn.to_hfai/to_torch&lt;/h2&gt;
&lt;p&gt;有了上述分布式训练管理工具，接下来就是具体的优化算子了。为了让模型计算的更快，我们优化CUDA kernel，融合多运算，优化模型结构，使得深度学习算子计算更加的高效。&lt;/p&gt;
&lt;p&gt;具体优化的算子包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;torch.nn.lstm - hfai.nn.lstm&lt;/li&gt;
&lt;li&gt;torch.nn.MultiheadAttention - hfai.nn.MultiheadAttention&lt;/li&gt;
&lt;li&gt;torch.nn.LayerNorm- hfai.nn.LayerNorm&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;使用方法非常简单，幻方AI提供了工具可以一行代码进行算子的切换，即&lt;code class=&quot;language-text&quot;&gt;to_hfai&lt;/code&gt;和&lt;code class=&quot;language-text&quot;&gt;to_torch&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&quot;to_hfai&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#to_hfai&quot; aria-label=&quot;to_hfai permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;to_hfai&lt;/h3&gt;
&lt;p&gt;to_hfai是方便一键使用hfai算子的工具，会对你的model进行一次深度遍历，将其中能做转化Module替换成hfai的。转化后的算子在training以及inference的时候都会有可观的性能提升。&lt;/p&gt;
&lt;h3 id=&quot;to_torch&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#to_torch&quot; aria-label=&quot;to_torch permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;to_torch&lt;/h3&gt;
&lt;p&gt;to_torch是将使用hfai算子的model转化回使用torch算子的工具，以便在非 hfai 下使用训练出来的模型。设计思路同to_hfai。&lt;/p&gt;
&lt;p&gt;使用案例：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nn &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; to_hfai&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;to_torch

&lt;span class=&quot;token comment&quot;&gt;# get model from hfai &amp;amp;&amp;amp; to_hfai&lt;/span&gt;
model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;models&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;bert_large_MLM&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;vocab_size&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;vocab_size&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; max_length&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;max_length&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; to_hfai&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;性能测试&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95&quot; aria-label=&quot;性能测试 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;性能测试&lt;/h2&gt;
&lt;p&gt;那么，幻方AI优化的算子具体能达到多少的加速效果呢？这里，我们把性能测试数据给出：&lt;/p&gt;
&lt;h3 id=&quot;lstm&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#lstm&quot; aria-label=&quot;lstm permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;LSTM&lt;/h3&gt;
&lt;p&gt;参数配置：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;input_size&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;985&lt;/span&gt;
hidden_size&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;985&lt;/span&gt;
bias&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;
num_layers&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
batch_first&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;
dropout&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
bidirectional&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;
batch_size&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
seq_len&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1000&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;连续测试10轮，统计整体每轮的耗时，测试结果如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;torch.nn.LSTM&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;forward: 31.78 ms/epoch&lt;/li&gt;
&lt;li&gt;backard: 93.60 ms/epoch&lt;/li&gt;
&lt;li&gt;all: 125.38 ms/epoch&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;hfai.nn.LSTM&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;forward: 4.82 ms/epoch&lt;/li&gt;
&lt;li&gt;backard: 9.25 ms/epoch&lt;/li&gt;
&lt;li&gt;all: 14.07 ms/epoch&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;forward 提升6倍，backward 提升了10倍，整体训练提升了8倍！&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;attention&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#attention&quot; aria-label=&quot;attention permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Attention&lt;/h3&gt;
&lt;p&gt;参数配置：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;batch_size&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;
seq_len&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;256&lt;/span&gt;
embed_dim&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt;
attn_heads&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;连续测试10轮，统计forward，backward，还有inference的耗时，测试结果如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;torch.nn.MultiheadAttention
&lt;ul&gt;
&lt;li&gt;forward: 17.581 ms/epoch&lt;/li&gt;
&lt;li&gt;backard: 21.986 ms/epoch&lt;/li&gt;
&lt;li&gt;all: 39.567 ms/epoch&lt;/li&gt;
&lt;li&gt;inference: 17.372 ms&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;hfai.nn.MultiheadAttention
&lt;ul&gt;
&lt;li&gt;forward: 12.165 ms/epoch&lt;/li&gt;
&lt;li&gt;backard: 16.515 ms/epoch&lt;/li&gt;
&lt;li&gt;all: 28.680 ms/epoch&lt;/li&gt;
&lt;li&gt;inference: 12.112 ms&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;forward 提升44%，backward 提升了33%，整体训练提升了37%，inference也提升43%！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;同时，当batch_size比较大，seq_len比较小，以及输入qkv一样的情况下，hfai.nn.MultiheadAttention 同样具备优异性能。&lt;/p&gt;
&lt;p&gt;参数配置：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;batch_size&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5000&lt;/span&gt;
seq_len&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;64&lt;/span&gt;
embed_dim&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;512&lt;/span&gt;
attn_heads&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;连续测试10轮，统计forward，backward，还有inference的耗时，测试结果如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;torch.nn.MultiheadAttention
&lt;ul&gt;
&lt;li&gt;forward: 22.713 ms/epoch&lt;/li&gt;
&lt;li&gt;backard: 41.831 ms/epoch&lt;/li&gt;
&lt;li&gt;all: 64.543 ms/epoch&lt;/li&gt;
&lt;li&gt;inference: 22.925 ms&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;hfai.nn.MultiheadAttention
&lt;ul&gt;
&lt;li&gt;forward: 19.599 ms/epoch&lt;/li&gt;
&lt;li&gt;backard: 24.379 ms/epoch&lt;/li&gt;
&lt;li&gt;all: 43.978 ms/epoch&lt;/li&gt;
&lt;li&gt;inference: 19.037 ms&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;forward 提升15%，backward 提升了71%，整体训练提升了46%，inference也提升20%！&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;layernorm&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#layernorm&quot; aria-label=&quot;layernorm permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;LayerNorm&lt;/h3&gt;
&lt;p&gt;参数配置&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;batch_size &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;
seq_len &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;128&lt;/span&gt;
hidden_size &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1024&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;连续测试10轮，统计forward，backward，还有inference的耗时，测试结果如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;torch.nn.LayerNorm
&lt;ul&gt;
&lt;li&gt;forward: 0.514 ms/epoch&lt;/li&gt;
&lt;li&gt;backard: 0.217 ms/epoch&lt;/li&gt;
&lt;li&gt;all: 2.467 ms/epoch&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;hfai.nn.LayerNorm
&lt;ul&gt;
&lt;li&gt;forward: 0.217 ms/epoch&lt;/li&gt;
&lt;li&gt;backard: 0.121 ms/epoch&lt;/li&gt;
&lt;li&gt;all: 1.306 ms/epoch&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;forward 提升137%，backward 提升了79%，整体训练提升了88%！&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%80%BB%E7%BB%93&quot; aria-label=&quot;总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;总结&lt;/h2&gt;
&lt;p&gt;通过优化CUDA kernel和模型结构，融合多运算操作，幻方AI优化的深度学习算子在实际测试中表现出惊人的加速效果，优化的算子与幻方AI基础设施结合，让模型训练高效迅速，计算资源充分利用，加速更多场景的探索与研究。算子优化一直持续中，非常欢迎更多优秀同行加入我们一同共建。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[萤火跑模型 | Alphafold 蛋白质结构预测]]></title><description><![CDATA[2021年刚刚走过，要说去年一年AI领域的最重大进展，DeepMind在Nature上发表的“AlphaFold”无出其右，其旨在根据一个蛋白质的氨基酸序列来确定它的3D结构，是生物学领域中的几个重大挑战课题之一。在“蛋白质结构预测关键评估”（CASP…]]></description><link>https://www.high-flyer.cn/blog/alphafold/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/alphafold/</guid><dc:creator><![CDATA[Vachel]]></dc:creator><pubDate>Fri, 05 Nov 2021 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;2021年刚刚走过，要说去年一年AI领域的最重大进展，DeepMind在Nature上发表的“AlphaFold”无出其右，其旨在&lt;strong&gt;根据一个蛋白质的氨基酸序列来确定它的3D结构&lt;/strong&gt;，是生物学领域中的几个重大挑战课题之一。在“蛋白质结构预测关键评估”（CASP）的蛋白质结构预测年赛上，AlphaFold击败了其他百来支团队并取得了惊人的效果，有些时候，AlphaFold预测的结构与利用X射线晶体学和近几年的冷冻电镜（cryo-EM）等“金标准”实验方法所确定的结构几乎一样。科学家说，目前看来，AlphaFold暂时还不能取代这些费力又昂贵的实验方法，但它将带来全新的研究生命的方式。
​&lt;/p&gt;
&lt;p&gt;作为一个计算机专业的算法从业人员，本期笔者带着浓厚的兴趣来尝试一下 DeepMind 开源的 Alphafold 模型并验证效果，试跑的平台是幻方AI团队研发的“萤火二号”。我们复现了 Alphafold 的训练与预测过程，为大家带来第一手的测试体验。
​&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文标题&lt;/strong&gt;：Improved protein structure prediction using potentials from deep learning&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原文地址&lt;/strong&gt;：&lt;a href=&quot;https://www.nature.com/articles/s41586-019-1923-7&quot;&gt;https://www.nature.com/articles/s41586-019-1923-7&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;源码地址&lt;/strong&gt;：&lt;a href=&quot;https://github.com/aqlaboratory/openfold&quot;&gt;https://github.com/aqlaboratory/openfold&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型仓库&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/alphafold-optimized&quot;&gt;https://github.com/HFAiLab/alphafold-optimized&lt;/a&gt;
​&lt;/p&gt;
&lt;h2 id=&quot;模型介绍&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E4%BB%8B%E7%BB%8D&quot; aria-label=&quot;模型介绍 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型介绍&lt;/h2&gt;
&lt;p&gt;AlphaFold 解决的问题是蛋白质折叠问题。输入是一个氨基酸序列，每一个位置代表一个元素，输出是一个拓扑结构，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/8401cc7c57640f20127c5041beab277f/47311/p1.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 78.52760736196319%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAAQABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAEDBAUH/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAB6PJW0BjD/8QAGhAAAgIDAAAAAAAAAAAAAAAAAQMAEQIEE//aAAgBAQABBQJjceixYqbbFIgFCf/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EACAQAAIABQUBAAAAAAAAAAAAAAECAAMQESESEzJBYYH/2gAIAQEABj8CEoMu5y0+R18NFmPgkhLhYwLU/8QAGxABAAMBAAMAAAAAAAAAAAAAAQARIUEQMXH/2gAIAQEAAT8hYko0d3rBvccs9QAZK207cW+fIQAA4eP/2gAMAwEAAgADAAAAENAP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFREBAQAAAAAAAAAAAAAAAAAAECH/2gAIAQIBAT8Qh//EAB0QAQEAAgEFAAAAAAAAAAAAAAERACFhEDFBUXH/2gAIAQEAAT8Q21hiIRoyAWlbx6ee+SVT6uFnbsjWWbNHjACBAIBx0//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;v2-a193761b43227c41aa34b40a763958a1_720w.jpg&quot;
        title=&quot;v2-a193761b43227c41aa34b40a763958a1_720w.jpg&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/8401cc7c57640f20127c5041beab277f/6aca1/p1.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/8401cc7c57640f20127c5041beab277f/d2f63/p1.jpg 163w,
https://hfai-static.high-flyer.cn/static/8401cc7c57640f20127c5041beab277f/c989d/p1.jpg 325w,
https://hfai-static.high-flyer.cn/static/8401cc7c57640f20127c5041beab277f/6aca1/p1.jpg 650w,
https://hfai-static.high-flyer.cn/static/8401cc7c57640f20127c5041beab277f/7c09c/p1.jpg 975w,
https://hfai-static.high-flyer.cn/static/8401cc7c57640f20127c5041beab277f/47311/p1.jpg 1080w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;直接输出一个拓扑结构对于深度学习来说比较困难，一般需要输出结构化的数据。DeepMind 将该问题转化为预测氨基酸链的一些性质。准确的来说，深度模型输出的是每一个氨基酸单元和其下一个氨基酸单元在空间中的&lt;strong&gt;夹角与距离&lt;/strong&gt;，再组合成拓扑结构。
​
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/11d5c4b38352ec18a47f09df1e8d8443/84ee5/p3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 30.061349693251532%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABdElEQVQY012N30/aAACE+2+7B33oTDA6TfTBRFMrmPlbQRYQiwVtC6lIZUwqFQRm1CqI0WhA41q+Rd2y6Zfcw10ud8K+JqNtBrAyQZqtG87dNu5Vm27nkeurNi80q1XKsRhOPI7rONw/POBeXPDU7VCunKIYFbaMCrbzE+EgE8JIDJHPLHBcjFKzvtAohkiZCtLGODEzgjr/FX1kmPRQgEJik67n0bq94xc+1mGDUXmXYWkHzbQRsikJNTqIoQYpF8JUcgFqhRmSRpwFZZqItkw6vIY5O0suFMTaSaMvLVGUZyjNz6HrFvJ6nqnFLJlcCcHSp9j91s+hKfP87NHpejw+efzP960EkU99xAf6Sa+usC1JKJ9FsuNjqKk9Jhf3mJgz2NYshKqtULej1Msqvv9vyO/5+N6bb2gahiiiiyJHyeRr9rdZP7tBXttHWsmRL54g8IFer/dOL9xeXtIoHLzqrtl8O/xz5tRayBs2UrjEj2OX3zDcm9FBVFWXAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/11d5c4b38352ec18a47f09df1e8d8443/a6d36/p3.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/11d5c4b38352ec18a47f09df1e8d8443/222b7/p3.png 163w,
https://hfai-static.high-flyer.cn/static/11d5c4b38352ec18a47f09df1e8d8443/ff46a/p3.png 325w,
https://hfai-static.high-flyer.cn/static/11d5c4b38352ec18a47f09df1e8d8443/a6d36/p3.png 650w,
https://hfai-static.high-flyer.cn/static/11d5c4b38352ec18a47f09df1e8d8443/e548f/p3.png 975w,
https://hfai-static.high-flyer.cn/static/11d5c4b38352ec18a47f09df1e8d8443/84ee5/p3.png 1076w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，AlphaFold算法大致分为以下几个部分：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;特征工程&lt;/strong&gt;：序列和MSA特征抽取，结合专家经验数据库，把氨基酸链的输入转换到特征空间；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;深度神经网络结构预测&lt;/strong&gt;：依据1中的特征预测氨基酸链的一些性质，比如氨基酸之间两两的&lt;strong&gt;距离分布&lt;/strong&gt;，氨基酸链的&lt;strong&gt;夹角分布&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Potential Construction&lt;/strong&gt;：结合专家经验构造一个评估函数，来评估2中神经网络输出解的合理程度；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结构生成&lt;/strong&gt;：对于2中预测的距离分布、夹角分布，使用3中的评估函数评估Loss，然后使用梯度下降法优化，直到收敛。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;可以看到，Alphafold 核心贡献在于：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;深度学习模型融入专家经验&lt;/strong&gt;：特征构建阶段，尽可能结合领域知识构建特征，以提高模型表现；评估阶段，将专家知识（氨基酸链的物理特性）结合到损失函数中，进行更精准的判断。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全新的蛋白质折叠问题的建模方式&lt;/strong&gt;：DeepMind不是直接去预测蛋白质的结构，而是将该问题转化为预测氨基酸折叠后的一些性质，再将这些性质转化为可微的约束，并求解。这种思路可以应用在很多复杂的求解问题上。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对于梯度下降算法的优化&lt;/strong&gt;：DeepMind提出通过类似进化/退火算法，解决梯度下降中的局部最优问题，以求解真正的“最优解”。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;模型实践&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E5%AE%9E%E8%B7%B5&quot; aria-label=&quot;模型实践 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型实践&lt;/h2&gt;
&lt;p&gt;DeepMind 仅开源了 Alphafold 的预测代码和预训练好的模型参数，而对于训练部分，OpenFold 与 UniFold 分别开源了 Pytorch 和 Tensorflow 的版本。我们选择 OpenFold 进行改造，因为其复现完整度比较高，且使用 Pytorch 框架更适配萤火集群的运行环境。项目地址：
&lt;a href=&quot;https://github.com/aqlaboratory/openfold&quot;&gt;https://github.com/aqlaboratory/openfold&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;1-数据集&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-%E6%95%B0%E6%8D%AE%E9%9B%86&quot; aria-label=&quot;1 数据集 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. 数据集&lt;/h3&gt;
&lt;p&gt;从上文可以知道，Alphafold 数据集包含两个部分：氨基酸序列数据、专家经验数据。具体的，数据说明如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;bfd / small_bfd&lt;/strong&gt;：Big Fantastic Database，由论文作者 Martin Steinegger 构建的蛋白质序列数据库，包含65,983,866个蛋白质家族（MSAs）和2,204,359,010个蛋白质序列（HMMs），总计7个文件1.8T数据量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mgnify&lt;/strong&gt;：一个微生物基因组数据库，使用JackerHammer工具进行检索，总计一个文件64G数据量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pdb70&lt;/strong&gt;：一个蛋白质结构数据库，总计9个文件56G数据量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pdb_mmcif&lt;/strong&gt;：一个蛋白质结构数据库，包含超过55,000种不同蛋白质的180,000多个3D结构，总计约18万个文件206G数据量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;uniclust30&lt;/strong&gt;：1.3亿条氨基酸序列，使用hhsuite中的HHblits工具进行快速msa检索，总计13个文件86G数据量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;uniref90&lt;/strong&gt;：1.3亿条氨基酸序列，是msa检索所需要的库，使用JackerHammer工具进行检索，总计1个文件58G数据量。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在萤火集群上，这些数据如果以独立文件形式直接用于训练，小文件的高频读写会给集群的存储系统造成不小压力。对应的，我们需要将&lt;strong&gt;数据转化成 FFRecord 数据格式&lt;/strong&gt;，合并多个小文件以减小磁盘 IO 的开销。FFRecord (FireFlyer Record) 数据格式是幻方AI自研的简单高效的存储二进制记录的文件格式。为了方便研究者的使用，我们将以上的多个数据集进行整合，加入&lt;strong&gt;hfai 高性能数据集仓库&lt;/strong&gt;，对外提供 &lt;a href=&quot;https://doc.hfai.high-flyer.cn/api/datasets.html#hfai.datasets.AlphafoldData&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hfai.datasets.AlphafoldData&lt;/code&gt;&lt;/a&gt; 接口。具体的使用案例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;datasets &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; AlphafoldData

&lt;span class=&quot;token comment&quot;&gt;# 将数据转为Alphafold训练的格式&lt;/span&gt;
transform &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; AlphafoldDataTransform&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
dataset &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; AlphafoldData&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;transform&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
dataloader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dataset&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loader&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;batch_size&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; num_worker&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; data &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; dataloader&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# training iter&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;AlphafoldData&lt;/code&gt; 数据集接口返回的数据是一个元组，其中包含了蛋白质本身的信息 pdb_code， mmcif_string 和在蛋白质数据库中匹配得到的结果 bfd_hits，mgnify_hits，pdb70_hits，uniref90_hits。这些数据在训练中需要被 &lt;code class=&quot;language-text&quot;&gt;AlphafoldDataTransform&lt;/code&gt; 进一步处理，具体的使用案例可以访问我们开源在模型仓库中的 &lt;a href=&quot;https://github.com/HFAiLab/alphafold-optimized&quot;&gt;Alphafold-optimzied&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;除了以上整合的数据，&lt;code class=&quot;language-text&quot;&gt;pdb_mmcif&lt;/code&gt; 数据在 Alphafold 训练后期指导着模型生成合适的蛋白质结构，其具有将近 18w 个小文件，同样需要将其转化成 FFRecord 数据格式。&lt;/p&gt;
&lt;p&gt;原始数据转 FFRecord：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; ffrecord &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; FileWriter

out_file &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mmcif_path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mmcifs.ffr&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
writer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; FileWriter&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;outfile&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;184929&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
num&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; mapids &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;file&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;listdir&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mmcif_path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mmcif_files&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mmcif_path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mmcif_files&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;r&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; fp&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        mmcif_string &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; fp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        ms &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pickle&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dumps&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mmcif_string&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        writer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;write_one&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ms&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        mapids&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; num
        num &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mmcif_path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mmcifs_index.pk&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;wb&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; fp&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    pickle&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dump&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mapids&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fp&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;读取 FFRecord 文件：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; ffrecord &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; FileReader

mmcif_reader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; FileReader&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mmcif_dir&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mmcifs.ffr&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; check_data&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;mmcif_path&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;mmcifs_index.pk&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rb&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; fp&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    mmcif_index &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pickle&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;load&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fp&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; hit_pdb_code &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; mmcif_index&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    idx &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;mmcif_index&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;hit_pdb_code&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; mmcif_reader&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;idx&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    cif_string &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pickle&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loads&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;以上数据皆已集成进&lt;strong&gt;hfai 数据集仓库&lt;/strong&gt;，如果需要利用该数据集进行科研的朋友可以直接拉取。
​&lt;/p&gt;
&lt;h3 id=&quot;2-预处理&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-%E9%A2%84%E5%A4%84%E7%90%86&quot; aria-label=&quot;2 预处理 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. 预处理&lt;/h3&gt;
&lt;p&gt;从上文我们知道，Alphafold 需要与专家经验库进行交互，抽取 MSA 特征。这里用到了多个生物学工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;openmm&lt;/strong&gt;：用于分析模拟的高性能工具包，是 Omnia（预测生物分子模拟的工具套件）的一部分。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;kalign&lt;/strong&gt;：一款针对大规模基因组序列的多序列对比工具，运行速度与准确度都比较高。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;jackhmmer&lt;/strong&gt;：一款高效的蛋白质搜索工具，用于从序列数据库中，找到同源的序列。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pdbfixer&lt;/strong&gt;：用于修复PDB数据，对其中蛋白质结构进行基本的准备或者修复。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HHsuite&lt;/strong&gt;：一款蛋白质研究软件，快速搜索分析蛋白质的功能特性。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上工具都只能使用CPU多核进行加速计算，对CPU的算力比较依赖。对应的，在幻方萤火的系统结构中，GPU算力池与CPU算力池是分离开的。因此，数据预处理与模型计算要拆分成两个模块单独进行。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; precompute_alignments
&lt;span class=&quot;token key atrule&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
	&lt;span class=&quot;token key atrule&quot;&gt;directory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /ceph&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;jd/prod/jupyter/hwj/notebooks/openfold
  &lt;span class=&quot;token key atrule&quot;&gt;entrypoint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; scripts/precompute_alignmnets.py
  &lt;span class=&quot;token key atrule&quot;&gt;parameters&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; mmcif/ alignments/ &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;cpus 250
&lt;span class=&quot;token key atrule&quot;&gt;resource&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cuda_11
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;node_count&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;group&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; jd_dev_alpha
&lt;span class=&quot;token key atrule&quot;&gt;priority&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这里，&lt;code class=&quot;language-text&quot;&gt;jd_dev_alpha&lt;/code&gt; 是CPU计算池。通过 &lt;code class=&quot;language-text&quot;&gt;hfai run&lt;/code&gt;提交上述yaml 文件便可以发起对于目标蛋白质结构的预处理任务。&lt;/p&gt;
&lt;h3 id=&quot;3-模型训练&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-%E6%A8%A1%E5%9E%8B%E8%AE%AD%E7%BB%83&quot; aria-label=&quot;3 模型训练 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. 模型训练&lt;/h3&gt;
&lt;p&gt;openfold 采用了 Pytorch_lightning 来构建整个训练代码，其自动封装了 dataloader、多机多卡训练、checkpoint 保存与打断自恢复等诸多逻辑，可以直接适配萤火二号的智能分时调度系统。这里我们通过 &lt;code class=&quot;language-text&quot;&gt;hfai run&lt;/code&gt;运行下述Yaml文件：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; precompute_alignments
&lt;span class=&quot;token key atrule&quot;&gt;code&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
	&lt;span class=&quot;token key atrule&quot;&gt;directory&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; /ceph&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;jd/prod/jupyter/hwj/notebooks/openfold
  &lt;span class=&quot;token key atrule&quot;&gt;entrypoint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; train_openfold.py
  &lt;span class=&quot;token key atrule&quot;&gt;parameters&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; mmcif/ alignments/ data/pdb_mmcif output 2021&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;10&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;10 &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;gpus 1 &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;resume_from_ckpt output/resume_checkpoint.ckpt
&lt;span class=&quot;token key atrule&quot;&gt;resource&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
	&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; cuda_11
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;node_count&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;group&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; jd_a100
&lt;span class=&quot;token key atrule&quot;&gt;priority&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这里，&lt;code class=&quot;language-text&quot;&gt;jd_a100&lt;/code&gt;是GPU计算池。由于目标预测的样本不多，这里使用一个计算卡进行训练，过程如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/80da46cc0d8bece13834f56d89eeacf7/0ff56/p4.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 44.171779141104295%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAAJABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAUCAwQH/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAB55Q6UEDeH//EABsQAAEEAwAAAAAAAAAAAAAAAAEAAgMQITFE/9oACAEBAAEFAicVwtUev//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABYQAQEBAAAAAAAAAAAAAAAAABACcv/aAAgBAQAGPwJrT//EABsQAAEEAwAAAAAAAAAAAAAAAAABEDFxIVHw/9oACAEBAAE/IVtMv0skpPZ//9oADAMBAAIAAwAAABCgD//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABwQAAICAgMAAAAAAAAAAAAAAAABEWFR8CExof/aAAgBAQABPxBTvghcyOyVlD00PGblI//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;绘图1.jpg&quot;
        title=&quot;绘图1.jpg&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/80da46cc0d8bece13834f56d89eeacf7/6aca1/p4.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/80da46cc0d8bece13834f56d89eeacf7/d2f63/p4.jpg 163w,
https://hfai-static.high-flyer.cn/static/80da46cc0d8bece13834f56d89eeacf7/c989d/p4.jpg 325w,
https://hfai-static.high-flyer.cn/static/80da46cc0d8bece13834f56d89eeacf7/6aca1/p4.jpg 650w,
https://hfai-static.high-flyer.cn/static/80da46cc0d8bece13834f56d89eeacf7/0ff56/p4.jpg 925w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;训练结束后，我们加载输出的训练模型，预测蛋白质的结构，得到PDB文件。通过PyMol3d 工具，可以将PDB中的蛋白质结构数据可视化出来，最终效果如下：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/2ac85a3436f9f2f9ca44bcb5789930ca/dad04/p5.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 61.34969325153374%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAAMABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAQFBgf/xAAVAQEBAAAAAAAAAAAAAAAAAAABAP/aAAwDAQACEAMQAAAB6DFXmtjR0H//xAAbEAADAAMBAQAAAAAAAAAAAAACAwQAAQURE//aAAgBAQABBQKkQBPacqeAHs8LptyuwqU/LWs//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAIhAAAAUDBAMAAAAAAAAAAAAAAAECERIDEzEhIjJBYXKR/9oACAEBAAY/ApQQ/qJIpEdzaRpLHkczDQp/BbqIQ3TPoMmP/8QAGxABAAIDAQEAAAAAAAAAAAAAAQARITGh0UH/2gAIAQEAAT8hqjVLoxOjucLJHpcqqU1lezFTnxPU1jhP/9oADAMBAAIAAwAAABBzL//EABYRAQEBAAAAAAAAAAAAAAAAAAARMf/aAAgBAwEBPxDFf//EABYRAQEBAAAAAAAAAAAAAAAAABEAAf/aAAgBAgEBPxBwJv/EABwQAQEBAQACAwAAAAAAAAAAAAERMQAhUWFx0f/aAAgBAQABPxB0dQOK7p98NOk2ZTGCct1Yw9fBzS/sL8Tqk9ig5JSTjiJ8cIRDc/Hf/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;绘图1.jpg&quot;
        title=&quot;绘图1.jpg&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/2ac85a3436f9f2f9ca44bcb5789930ca/6aca1/p5.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/2ac85a3436f9f2f9ca44bcb5789930ca/d2f63/p5.jpg 163w,
https://hfai-static.high-flyer.cn/static/2ac85a3436f9f2f9ca44bcb5789930ca/c989d/p5.jpg 325w,
https://hfai-static.high-flyer.cn/static/2ac85a3436f9f2f9ca44bcb5789930ca/6aca1/p5.jpg 650w,
https://hfai-static.high-flyer.cn/static/2ac85a3436f9f2f9ca44bcb5789930ca/7c09c/p5.jpg 975w,
https://hfai-static.high-flyer.cn/static/2ac85a3436f9f2f9ca44bcb5789930ca/dad04/p5.jpg 1039w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;体验总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%93%E9%AA%8C%E6%80%BB%E7%BB%93&quot; aria-label=&quot;体验总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;体验总结&lt;/h2&gt;
&lt;p&gt;​
Alphafold作为今年火爆全球的人工智能领域重点突破之一，开启了AI+生物医药领域的新时代。借助萤火二号和自研文件系统，我们可以比较高效地训练该模型。同时，该模型不同于以往深度学习训练场景，其特征抽取与训练，对CPU与GPU的计算需求都比较高。在我们的测试中，GPU整体使用率不高，在20%~30%左右，训练的时间瓶颈是在CPU的计算上。我们欢迎感兴趣的学者们加入我们，继续在幻方AI团队的萤火平台上对该课题进行进一步探索。
​
综合体验打分如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;研究指数：★★★★★&lt;/p&gt;
&lt;p&gt;该模型开创了AI+生物的新课题，引领了一个新的AI时代。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开源指数：★★★&lt;/p&gt;
&lt;p&gt;数据已开源，代码开源了预测部分，训练代码开源需要依赖第三方实现。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;门槛指数：★★★★★&lt;/p&gt;
&lt;p&gt;数据量大，需要CPU与GPU双重算力支持，对算力的需求比较大。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通用指数：★★&lt;/p&gt;
&lt;p&gt;模型专注于蛋白质结构预测，有大量的专家经验结合，通用性比较差。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;适配指数：★★&lt;/p&gt;
&lt;p&gt;需要CPU与GPU的双重算力，整体GPU利用率不高。同时代码和数据都有一定改造工作。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;幻方 AI 紧跟 AI 研究的前沿浪潮，致力于用领先算力助力AI落地与价值创造，欢迎各方数据研究者与开发者们一同共建。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[萤火跑模型 | Autoformer 长时序预测]]></title><description><![CDATA[长时间序列预测（Long-Term Series Forecasting，以下称为 LTSF）在现实世界中有非常广阔的应用场景，例如电力资源预估、疾病传播与扩散、经济发展预测等实际问题。前不久分享的《萤火跑模型 | Informer 上手实践》介绍了获得AAAI 202…]]></description><link>https://www.high-flyer.cn/blog/auto-former/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/auto-former/</guid><dc:creator><![CDATA[Vachel]]></dc:creator><pubDate>Mon, 11 Oct 2021 15:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;长时间序列预测&lt;/strong&gt;（Long-Term Series Forecasting，以下称为 LTSF）在现实世界中有非常广阔的应用场景，例如电力资源预估、疾病传播与扩散、经济发展预测等实际问题。前不久分享的&lt;a href=&quot;/blog/informer&quot;&gt;《萤火跑模型 | Informer 上手实践》&lt;/a&gt;介绍了获得AAAI 2021最佳论文奖的Informer模型，以及其在幻方萤火二号上的试跑和优化。该工作改造Transformer模型来解决LTSF领域下的问题，取得优异的效果，带动起了该方向的研究热情。不久之后的NeurIPS 2021，来自清华的几位学者结合之前和工作和Informer的模型设计，提出了Autoformer模型，在相同预测任务上大幅超越了之前的模型，实现了 &lt;strong&gt;38%&lt;/strong&gt; 的相对效果提升。&lt;/p&gt;
&lt;p&gt;幻方AI最近对这项工作进行了整理和优化，在幻方萤火二号上复现了Autoformer的实验。通过幻方自研的&lt;a href=&quot;/blog/3fs&quot;&gt;3FS&lt;/a&gt;、&lt;a href=&quot;/blog/hf-reduce&quot;&gt;hfreduce&lt;/a&gt;、&lt;a href=&quot;/blog/hfnn&quot;&gt;算子&lt;/a&gt;等，对模型训练进行提速，整合代码简化接口，融入hfai数据仓库和模型仓库中，帮助研究者和开发者们降低使用门槛。本期文章将为大家详细描述。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文标题&lt;/strong&gt;：Autoformer: Decomposition Transformers with Auto-Correlation for Long-Term Series Forecasting&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原文地址&lt;/strong&gt;：&lt;a href=&quot;https://arxiv.org/abs/2106.13008&quot;&gt;https://arxiv.org/abs/2106.13008&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;源码地址&lt;/strong&gt;：&lt;a href=&quot;https://github.com/thuml/Autoformer&quot;&gt;https://github.com/thuml/Autoformer&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型仓库&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/ltsf-former&quot;&gt;https://github.com/HFAiLab/ltsf-former&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;模型介绍&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E4%BB%8B%E7%BB%8D&quot; aria-label=&quot;模型介绍 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型介绍&lt;/h2&gt;
&lt;p&gt;我们知道，Transformer是通过自注意力机制（self-attention）来捕捉时刻间的依赖，在NLP领域上取得了显著效果。但是在长期序列预测中，仍存在不足：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;长序列中的复杂时间模式使得&lt;strong&gt;注意力机制难以发现可靠的时序依赖&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;基于Transformer的模型不得不使用&lt;strong&gt;稀疏形式的注意力机制&lt;/strong&gt;来应对二次复杂度的问题，但造成了信息利用的瓶颈。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/befb5123342773bd3ad6300ac689a0e1/37523/image_1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 37.423312883435585%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAABfklEQVQozx2R2W7iQBBF/f8/M5qHWKAhCgkgTV5ABLzgxis2AWy8gEHEMJxRdUulkqqrus+9Zdzvdx6PB3LyPOdyuVDXNbPZjMFggGmaTCYTXZO7/X7PT9eRfu8Iohg/jtkXR7qu43a7YRRFQRzHJEmC53lUVaWHV6sVrusyn8+xLIumaSjLkjTLuJ5PFIFPvc2owoAyjjjVFee2xdhut5qk1+uxXC41qQxKbTgc6uj3+6zXa3j+o2oagpXLYtBn8THk8/cv5q9/KPMD8MQ4HA6aREIpRdu2mkZopRaGoc6BUuRhQJwkWLaNF0as/ICZZfPlOIRRRJHEGOKL/G7bNlmWaenj8VjLFNmSp9Op9nSTZex2O57PJ0flsf+aU7gWla/ofjqu4qEQiqzRaKRJpHmz2ehFSHy8v/NimoS+z7U80pxO2ppUKYLlgr9vr3wO3/CU4t6eMWQh8pBQ6sY01RQiWSyQENI0SQiE2vNwHAc/DImSDa5SLG1bK4yVx3/pHPgFaH8zXgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/befb5123342773bd3ad6300ac689a0e1/a6d36/image_1.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/befb5123342773bd3ad6300ac689a0e1/222b7/image_1.png 163w,
https://hfai-static.high-flyer.cn/static/befb5123342773bd3ad6300ac689a0e1/ff46a/image_1.png 325w,
https://hfai-static.high-flyer.cn/static/befb5123342773bd3ad6300ac689a0e1/a6d36/image_1.png 650w,
https://hfai-static.high-flyer.cn/static/befb5123342773bd3ad6300ac689a0e1/37523/image_1.png 720w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;为突破上述问题，Autoformer主要做了以下创新：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;突破将序列分解作为预处理的传统方法，提出&lt;strong&gt;深度分解架构&lt;/strong&gt;（Decomposition Architecture），能够从复杂时间模式中分解出可预测性更强的组分；&lt;/li&gt;
&lt;li&gt;基于随机过程理论，提出&lt;strong&gt;自相关机制&lt;/strong&gt;（Auto-Correlation），代替点向连接的注意力机制，实现序列级连接和较低复杂度，打破信息利用瓶颈。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;相比与Informer，他们都提出了要改变注意力机制，提升序列级连接和降低运算复杂度。不同的是，Autoformer进一步提出，将时序进行分解，从复杂模式中抽取出可预测性更强的成分。具体是如何做的呢？下面的章节会为大家简单介绍。&lt;/p&gt;
&lt;h3 id=&quot;深度分解架构&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%B7%B1%E5%BA%A6%E5%88%86%E8%A7%A3%E6%9E%B6%E6%9E%84&quot; aria-label=&quot;深度分解架构 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;深度分解架构&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/288c559db3101be138660da6d12adf9d/37523/image_2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 39.877300613496935%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsTAAALEwEAmpwYAAABfElEQVQY0x3E3W6bMBgAUN7/eXYxqal2265SojVVV1CCwcZgfxjjXwjGNlMnHZ0i5xxjTCn1fd8iTElPcLutfvXeee/WdfE+LIuA0XvPAXrG+4GPQhzHUSilGGPAgVJa9e8lvbBZfbKZ28VwJtpWGleOikxqnmfaNYKjiSMBXQihmKbJGqO1xgS/lM+v1elG+5/X29cwDuVXczkjOvz4U57vBBjrOjKrWWnFODfGFinlbdv2PYYQYshxy491zXtw1hjjnFu01quz1uhZK6WNsc77RWvlvS+snQEGOXHUotf6+Q2d7hxOFb3i4Vz/+o2esIDnqvscJlnX4nZDXDxVpBzgSLEwRvrFKsk6Ssr+4y+5gDYfHTQwVd312ryB1lcKzSgF7QBjUOadQkX6qqoKIWbcsZYMfJxiOraQH2Gz1oS4p3ykdOw5WWu2EEI+tpz3GL13QohxHIvHYzN2MXZpW3yv7w1ua4RGKbV3yppvzkrzvbb/OQdSMuBHzv8AIAC4vU9HRp0AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/288c559db3101be138660da6d12adf9d/a6d36/image_2.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/288c559db3101be138660da6d12adf9d/222b7/image_2.png 163w,
https://hfai-static.high-flyer.cn/static/288c559db3101be138660da6d12adf9d/ff46a/image_2.png 325w,
https://hfai-static.high-flyer.cn/static/288c559db3101be138660da6d12adf9d/a6d36/image_2.png 650w,
https://hfai-static.high-flyer.cn/static/288c559db3101be138660da6d12adf9d/37523/image_2.png 720w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;时间序列分解是指将时间序列分解为几个组分，每个组分表示一类潜在的时间模式，如周期项（seasonal），趋势项（trend-cyclical）。由于预测问题中未来的不可知性，通常先对过去序列进行分解，再分别预测。但这会造成预测结果受限于分解效果，并且忽视了未来各个组分之间的相互作用。&lt;/p&gt;
&lt;p&gt;Autoformer是将序列分解作为一个内部单元，嵌入到编码-解码器中。在预测过程中，模型交替进行&lt;strong&gt;预测结果优化&lt;/strong&gt;和&lt;strong&gt;序列分解&lt;/strong&gt;，即从隐变量中逐步分离趋势项与周期项，实现&lt;strong&gt;渐进式分解&lt;/strong&gt;。在编码器中，基于滑动平均思想逐步分解出各成分，在解码器中，对各个部分分别建模。基于这种渐进式分解架构，模型可以在预测过程中逐步分解隐变量，并通过自相关机制、累积的方式分别得到周期、趋势组分的预测结果，实现分解、预测结果优化的交替进行、相互促进。&lt;/p&gt;
&lt;h3 id=&quot;自相关机制&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%87%AA%E7%9B%B8%E5%85%B3%E6%9C%BA%E5%88%B6&quot; aria-label=&quot;自相关机制 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;自相关机制&lt;/h3&gt;
&lt;p&gt;Autoformer的自相关机制用来实现高效的序列级连接，从而扩展信息效用。一般不同周期的相似相位之间通常表现出相似的子过程，Autoformer利用这种序列固有的周期性来设计自相关机制，其中，包含&lt;strong&gt;基于周期的依赖发现&lt;/strong&gt;（Period-based dependencies）和&lt;strong&gt;时延信息聚合&lt;/strong&gt;（Time delay aggregation）。&lt;/p&gt;
&lt;p&gt;基于周期的依赖发现采用的是随机过程理论，计算相关性作为未归一化的周期估计的置信度。而时延信息聚合是将相似的子序列信息根据计算出的周期长度进行聚合，以实现序列级的连接。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/d93654ba8607d91ac070d4cb0964b534/37523/image_3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 119.01840490797547%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAYCAIAAAB1KUohAAAACXBIWXMAAAsTAAALEwEAmpwYAAAED0lEQVQ4yzWUaY+kNhCG+///nSifokSbTbJzT09fQzcYaBqwjTGHDcbgM6Jnt2TZpZJKLtdTrzfee2utVsrfzWhFce69c84Yo7Ve42Jg1tqu5865nnHnfcdH7/3Ge6+UYnxUixzHQcoxA8dJsIE3WoksDaeBlmA7sxLH76ZL22xv6Rkfn6z3G+fsNIka3cr0VMQ7yQkpwfX4T5289Pm2ub526WMb/+C3V3L6A25/Q7vfZf6Dgo81WeslOr2i6yfMY0bz+PjYUYTyuEZZen7vUFgmp64lVREz1mRZynta5GnTD2pZNs45uRhlrVRGO08aNs2Gi3ma1aKd9Z52g1w0JaWYpn4Qznm5qOXepo3Vy0SiqU4mAgQBHJ4FAUt7lTSWNLnvqaTx3Gai/ookAgOZgrVhepEYvJF0V8XbKv2o0x0C77fgsTg/l+FbHjyV4Vt5eSHJDicfVbKrko8q2p6//TnP81q2cd46b5xTxnrva0r3x89zCEKQHD/Ph1OQZrmxzjpnrNXWGu8RqYUQmy/Oyzx/cXbOkar6cqy1Uq7xrmfOuZpS6xzj3HvPhtEYsyYbY3rGl3mqK+i9v11T3rfDwKzRtzSaRY/yWIm2yiPJUFNcLMvJ8VEpvXIeR4GKFGbBDexHRprqlpweEHirsz0jaV8lHY4Zych1nwf/ldEzp3mP82VR681ZdqtxURY3MU0RAOM4EkJIhcuyYIxDiLuek7oZhjEv4DwvuKq7nkkp1+R5npVx86KNdZyxYRjkvAxCWrvOtxBCSsk5WxbVs8E5v068seubnbUQV6wMxvyjQ+BWlBghgQOJDhSmCN+LqKqK0K4MJnhoiwChim2f3Dok1pQQ1SVoinNVXkuIQBSB02sZ77MkjEAM7pbdclLETRmSIkYIXx7+7bt285OQ98Z5Y1fOaZoeT8HhGFwuYRLHx+PhHARf/Fba1q3wxMT5cEdlrfql57tu+1++U1p77xelldZtv6q6bakzhmP4U8+8xRQXglPOWt5WRXruaNlWN8nry+5B9Bgmu7HJrp8PgoQw+G5JjN8frXVrcg52OA+z4BkmBwReYbyNtn9V4AWHDzD4XkU/ytM3+Pk3jp6rZH+9vKmWUBCsejbGxuGpa5skPMxSgPDEWJ8ll5pUGJXTNEBYcN5DBIeBo4rcgTFKqdb66xvSxth5Wbz3Fam11uM4zr+mfRgGa4yUs5RSCGGtc84tSq1lW6Or7NSUIU73DYpgsp9Y3SIwtHARvfP+62/ktOAtbGC47rdzl11Ynmy0UjAHuExRDlAO+q6hdY0xbNazbtuWUto0Tde1nLO+7/gwtDU+H146Alc9a2ONtsZYfV8xiA+H4+FwiKLoeDzu9/v3tzcIoTErUaWU1gahapqm/wGuaDPfdNys7QAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/d93654ba8607d91ac070d4cb0964b534/a6d36/image_3.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/d93654ba8607d91ac070d4cb0964b534/222b7/image_3.png 163w,
https://hfai-static.high-flyer.cn/static/d93654ba8607d91ac070d4cb0964b534/ff46a/image_3.png 325w,
https://hfai-static.high-flyer.cn/static/d93654ba8607d91ac070d4cb0964b534/a6d36/image_3.png 650w,
https://hfai-static.high-flyer.cn/static/d93654ba8607d91ac070d4cb0964b534/37523/image_3.png 720w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Autoformer的作者们在文中给出了使用该方法后的效果。如上图所示，相比于之前的注意力机制或者稀疏注意力机制，自注意力机制（Auto-Correlation）实现了序列级的高效连接，从而可以更好的进行信息聚合，打破了信息利用瓶颈。&lt;/p&gt;
&lt;h2 id=&quot;模型实践&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E5%AE%9E%E8%B7%B5&quot; aria-label=&quot;模型实践 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型实践&lt;/h2&gt;
&lt;p&gt;Autoformer的作者对模型进行了完整的开源，幻方AI的研究者们对其进行了试跑复现和优化。&lt;/p&gt;
&lt;h3 id=&quot;数据集&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E9%9B%86&quot; aria-label=&quot;数据集 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;数据集&lt;/h3&gt;
&lt;p&gt;Informer和Autoformer基于相同的数据集进行试验，包括电力，经济，交通，医疗等若干个长时序数据集。历史分析长度，预测长度，预测范围作为参数可以动态调整。这里，幻方AI将这些能通用的数据集进行整合，将原始数据转化成FFRecord格式，用户调用简单的接口便可以加载高性能的dataloader进行模型训练。具体的，如下例所示：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;datasets &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; LTSF

dataset &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; LTSF&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data_name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;ETTh1&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; split&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;train&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; seq_len&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;96&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; label_len&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; pred_len&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; features&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;S&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; target&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;OT&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; timeenc&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; freq&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;h&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
loader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; dataset&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loader&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;batch_size&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; num_workers&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; x_mark&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y_mark &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; loader&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# training model ...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;如上例代码，我们加载hfai数据仓库中的&lt;code class=&quot;language-text&quot;&gt;ETTh1.csv&lt;/code&gt;数据，hfai数据仓库会自动切分好数据集，进行特征工程，并返回高性能的dataloader。&lt;/p&gt;
&lt;h3 id=&quot;模型训练&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E8%AE%AD%E7%BB%83&quot; aria-label=&quot;模型训练 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型训练&lt;/h3&gt;
&lt;p&gt;幻方AI对作者开源的模型源码进行了优化，以hfreduce代替NCCL，以自研的高性能算子替代模型中的LayerNorm，Attention等算子，实现Autoformer在萤火二号上的高性能并行训练。用户可以直接在hfai模型仓库中直接调用到我们优化后的模型：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;models &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Autoformer
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; hfreduce&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;torch &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; hfr

model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Autoformer&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;enc_in&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dec_in&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; c_out&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; seq_len&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;96&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; label_len&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; out_len&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; e_layers&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; d_layers&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; dropout&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.05&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; embed&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;timeF&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
loss &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Loss&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
optimizer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Optimizer&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

reducer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hfr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;AsyncReduceFloat&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;registry_host&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; port&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; proc_rank&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; procs_per_node&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; node_rank&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; node_cnt&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# each epoch&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; x_mark&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y_mark &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; loader&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    reducer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;zero_grad&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 
    
    model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; x_mark&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; y_mark&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    loss&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;backward&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    
    reducer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;synchronize&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;由于开源数据不算很大，我们试跑时只申请一个节点，8张A100显卡并行训练。通过优化后训练效果很高，很快便可以完成试验：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 563px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/3c25bcf6c2869ac3aa3341ab5583f52c/7cb89/image_4.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 54.601226993865026%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAsTAAALEwEAmpwYAAABpUlEQVQoz0WSWbLcIBAE5yZvJOgGBA3NrgXN3P9WNrLD/uGDICOriHpJgHHuavPSUCml1sIcha2ST/K+907OSeoyXEQ+cuy9O+eu69JavwBxjMEph1xSivd9pxjf0qzaA6K1FhEWtG90iKiU2rYNEMg5sa4T/twjphxSqaXcY8QYf4ReFCmlrLUKcUG7KKeUMsY45wCAOUgpXwA4rtNzJM45pfM8I/NbmgUtPjD+h7XRE0ZE5iiFeOBxcUohlZTTNQYz/whcwACAMfNcYHvDBoCIuD03zrl1XV8S4DMutQVhfGu11hJTEtQEdR943w8OXoZT8ggcc87neXjvxxhG6wnf16ktg+VWa+8txiS2vNpCPuz74YkkdeEP7znGuO/Pb49La/XA4zSO5RZaa623aXZFUPOBj7/wLsLpA6eYjmMnonGNCcMT29gAT+zW6oRtkc/rve/ek/SHnObwD77HPWMD4IQdwxb6FE/zXAVf3odp9n8639Oc0nEcRPT9fo0xLynldex6o2dhOefMgYXNwlVHVGslcsLV2TkEDrOadfZzf34v7Bfpf3d2RajIJwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/3c25bcf6c2869ac3aa3341ab5583f52c/7cb89/image_4.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/3c25bcf6c2869ac3aa3341ab5583f52c/222b7/image_4.png 163w,
https://hfai-static.high-flyer.cn/static/3c25bcf6c2869ac3aa3341ab5583f52c/ff46a/image_4.png 325w,
https://hfai-static.high-flyer.cn/static/3c25bcf6c2869ac3aa3341ab5583f52c/7cb89/image_4.png 563w&quot;
        sizes=&quot;(max-width: 563px) 100vw, 563px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;可以看到，每Epoch耗时仅2s左右，相比单卡性能提升了8倍以上。GPU利用率在95%左右，充分利用其了A100的计算性能。模型在第16轮基本达到了收敛状态。&lt;/p&gt;
&lt;h2 id=&quot;体验总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%93%E9%AA%8C%E6%80%BB%E7%BB%93&quot; aria-label=&quot;体验总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;体验总结&lt;/h2&gt;
&lt;p&gt;Autoformer进行了完整的开源，代码结构清晰，比较容易与幻方的训练优化工具结合，获得效果和性能的双提升。同时，该模型承接Informer，继续推动了“transformer+时序预测”这个方向的研究走向深入，助力更多真实场景的提效与进步。&lt;/p&gt;
&lt;p&gt;综合体验打分如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;研究指数：★★&lt;/p&gt;
&lt;p&gt;该模型着眼于长时间序列的预测问题，是一个广泛研究的基础课题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开源指数：★★★★★&lt;/p&gt;
&lt;p&gt;数据和代码都已开源，代码逻辑清晰可读性高。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;门槛指数：★★★&lt;/p&gt;
&lt;p&gt;数据量小，模型计算、内存和体系结构均已优化，普通高性能PC即可运行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通用指数：★★★★&lt;/p&gt;
&lt;p&gt;模型是对Transformer的优化，将时序分解融入，在很多场景下验证了其效果。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;适配指数：★★★★★&lt;/p&gt;
&lt;p&gt;依赖简单，很容易与幻方AI的训练优化工具结合，提效明显。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;幻方 AI 紧跟 AI 研究的前沿浪潮，致力于用领先算力助力AI落地与价值创造，欢迎各方数据研究者与开发者们一同共建。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[PyTorch 分布式训练方法]]></title><description><![CDATA[2018年，将近3亿参数的Bert模型横空出世，将NLP领域推向了新的高度。近年来人工智能领域的发展愈来愈趋向于对大模型的研究，各大AI巨头都纷纷发布了其拥有数千亿参数的大模型，诞生出了很多新的AI应用场景。
​
另一方面，多种因素继续推动大模型的长足发展：…]]></description><link>https://www.high-flyer.cn/blog/pytorch/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/pytorch/</guid><dc:creator><![CDATA[Vachel]]></dc:creator><pubDate>Fri, 18 Jun 2021 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/9ac28a620ade131f0826acbd7d76181e/99f37/p0.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 65.03067484662577%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAACfUlEQVQ4y2WTz27bRhDG+Wa5FOgxfZdefS8QIOipL9BTYVtxDqlk+xagNiIjkmXKTWrVdmxLoqj9Q5GUtBSXpH4FV5btIgMM5tvdmdmZb2c9HmW9Xj/ZLc6yjPZZm8vLS3zfp9Pp0G636XY7BMH4O//aeryQ7UFZlRRFgbUWqSRTMSVJE4ScIsSUSRgwi2fOr9aXsd7LZNtNLTXXV7fcDG4Z3Y+dJlHqztJ4jhYRSkSMhwGxTqjDtvHeFmy0ggo6Nyd86P1B82KXP3u7tC72aPn7bq/Gh/0GR/0GTX+XZm8XOZt+3/K2OtZwNviLVm/f6bF/wHH/Pa3zBod+g2P/Pc3zfY4uDjjqH9Ds7jGRz3y6Cquq2rSqBXGsiVRMGqXky+yJ3/ksecLLZO4udlJBpDXWmv9zWMtUGMIwwZgFSWpReuVurdYgZIYtNlmUzjFZnbNyulqVKJVTluBFkUapGcZMEfI3hGiQ56DUHkHwK8akxHGX0fgX4thntUoZjd46v8fGSBKfcfAGrU/wPn8+o90+Jwx7KP0TSu0wn9fV/oyOXpOmAqXeIeUroqjJYhkyCX9Eqh3SNGO5hNmshVI/oNTveNbmWFuQ50vCyTmRvnZjoOSVW5dlQWY0D/enZFlEVZVMgi5KDijLirJcY4xm+NAmy+Tz2NTybagI5Yb82t4+SIdr7v4ejMjto99IMxHxE/e5Lfny75i8AE9Hmru7b2R5welA0n+I3OxcDiNOBpJVbhHxko//SAK9cL/n07WiP4wxZklhc1Rq+Ph1yr1I8ar6Fcv6C1UM1QKZbEZFpplb1yNl8oI7OWexsq6bkd741XQV1rKyJXdiTmpy/gO8jM5rJoPD0QAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/9ac28a620ade131f0826acbd7d76181e/a6d36/p0.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/9ac28a620ade131f0826acbd7d76181e/222b7/p0.png 163w,
https://hfai-static.high-flyer.cn/static/9ac28a620ade131f0826acbd7d76181e/ff46a/p0.png 325w,
https://hfai-static.high-flyer.cn/static/9ac28a620ade131f0826acbd7d76181e/a6d36/p0.png 650w,
https://hfai-static.high-flyer.cn/static/9ac28a620ade131f0826acbd7d76181e/e548f/p0.png 975w,
https://hfai-static.high-flyer.cn/static/9ac28a620ade131f0826acbd7d76181e/99f37/p0.png 1100w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;2018年，将近3亿参数的Bert模型横空出世，将NLP领域推向了新的高度。近年来人工智能领域的发展愈来愈趋向于对大模型的研究，各大AI巨头都纷纷发布了其拥有数千亿参数的大模型，诞生出了很多新的AI应用场景。
​
另一方面，多种因素继续推动大模型的长足发展：1) 社会正经历着深度的数字化转型，大量的数据逐渐融合，催生出许多人工智能的应用场景和需求；2) 硬件技术不断进步：英伟达 A100 GPU，Google的 TPU，阿里的含光800等，推动着AI算力的不断提升。可以这么说，“大数据+大模型+大算力”的组合，是迈入 AI 2.0 的基石。
​
然而，对于大多数AI从业者们来说，受限于一些因素，平常很难接触到大数据或者大算力，很多高校研究生们往往都&lt;strong&gt;习惯于用一张显卡（个人PC）来加速训练&lt;/strong&gt;，这不仅训练缓慢，甚至会因此限制住了想象，禁锢了创造力。
​
幻方AI根据自身业务需求，构建了“萤火二号”，其旨在提供澎湃如海的深度学习算力服务。团队自研了智能分时调度系统、高效存储系统与网络通信系统，可以将集群当成一台普通计算机来使用，根据任务需求弹性扩展GPU算力；自研了hfai数据仓库、模型仓库，优化AI框架与算子，集成落地了许多前沿的应用场景；通过Client接口或者Jupyter就可以轻松接入，加速训练起AI大模型。&lt;/p&gt;
&lt;p&gt;本期文章分享的，是&lt;strong&gt;如何使用起多张显卡，来加速你的AI模型&lt;/strong&gt;。分布式训练技术逐渐成为AI从业者必备技能之一，这是从“小模型”走向“大模型”的必由之路。我们以 PyTorch 编写的ResNet训练为例，为大家展示不同的分布式训练方法及其效果。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;训练任务&lt;/strong&gt;：ResNet + ImageNet&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;训练框架&lt;/strong&gt;：PyTorch 1.8.0&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;训练平台&lt;/strong&gt;：幻方萤火二号&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;训练代码&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/pytorch_distributed&quot;&gt;https://github.com/HFAiLab/pytorch_distributed&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;训练准备&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%AE%AD%E7%BB%83%E5%87%86%E5%A4%87&quot; aria-label=&quot;训练准备 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;训练准备&lt;/h3&gt;
&lt;p&gt;萤火二号当前完整支持了PyTorch的并行训练环境。笔者先使用1个节点8张卡，测试不同的分布式训练方法所需要的时间、显卡利用效率；之后采用多个节点，来验证并行加速的效果。测试的方法如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;nn.DataParallel&lt;/li&gt;
&lt;li&gt;torch.distributed + torch.multiprocessing&lt;/li&gt;
&lt;li&gt;apex 半精度&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;为充分利用显存，这里&lt;code class=&quot;language-text&quot;&gt;batch_size&lt;/code&gt;设为400，记录每Epoch的耗时来进行对比。我们先采用单机单卡测试作为baseline，每Epoch耗时1786秒上下。
​&lt;/p&gt;
&lt;p&gt;测试结果发现，&lt;strong&gt;有半精度加持的并行加速效果最好&lt;/strong&gt;；&lt;strong&gt;DataParallel较慢，且显卡资源利用度不高，不推荐使用&lt;/strong&gt;；&lt;strong&gt;多机多卡带来的加速效果非常显著&lt;/strong&gt;。整体结果如下：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/2b8b7b8b386810d429647d93028deece/d9ed0/p1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 38.65030674846626%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB+klEQVQoz02S70sTcRzH76/rQX9A0IMgiIJ6oFFQDzKbKKGU4pbodCzzB9F0hWI6EqzRmBVT04psa79czprucp67+97d9+5esZPEN7yffOD9+vzgowgh6Lrdw42LbbRdusXl81cItHcj9CZfshVG42kmFzKMz38iPJtmu1DFtm36p9LcDyfpirzn3vA7xl6tY5kmimVZ9F7vov3cVXqudfJsaJLF2SU81yFb3COWyDC3ssly+jupjQI1VUPaFjMTMSaGnzI9Osn4UJTFl6+xpY1iCIPYnRAjFzpYDsU4q9q+yua3PF+3S9RqB6d1aQkK8QEKU50Un3dTnH7A7psopmWjNBtHbI7Moh02cB3XtyMdP2iapu9WZ+lIpLQRukFT6PStRLi71E9HYpCbLzoJLkewTAtFHB9TjscxdN2HeJ7nuyWtXqeW/YFaLHCQ/4laLvkhyxQsRIPMDASYG3vMx2yGXK2I6zgotjD4nUygN5u47gnMc10fqFYq5JNJyh9WKaVS7G5tYUuJNE0yoVFWA32sD4ZxdPP0HIoQBn/3/+Cdud1/4M7aGm8f9rD6JEjqUR+Vzxt+XRgmkZEV+nsTRMNJNK2Jx8kwiuM4/gqqqlKv1323XqklQ9M4rFap5vP8yuXQj45wPY9Wpr7fYKe4Rz5XptFoIKX0gf8AzfIutTgqfRYAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;result.png&quot;
        title=&quot;result.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/2b8b7b8b386810d429647d93028deece/a6d36/p1.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/2b8b7b8b386810d429647d93028deece/222b7/p1.png 163w,
https://hfai-static.high-flyer.cn/static/2b8b7b8b386810d429647d93028deece/ff46a/p1.png 325w,
https://hfai-static.high-flyer.cn/static/2b8b7b8b386810d429647d93028deece/a6d36/p1.png 650w,
https://hfai-static.high-flyer.cn/static/2b8b7b8b386810d429647d93028deece/e548f/p1.png 975w,
https://hfai-static.high-flyer.cn/static/2b8b7b8b386810d429647d93028deece/3c492/p1.png 1300w,
https://hfai-static.high-flyer.cn/static/2b8b7b8b386810d429647d93028deece/d9ed0/p1.png 1415w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;nndataparallel&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#nndataparallel&quot; aria-label=&quot;nndataparallel permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;nn.DataParallel&lt;/h3&gt;
&lt;p&gt;DataParallel 是PyTorch早期提出的数据并行训练方法，其使用单进程控制，将模型和数据加载到多个GPU中，控制数据在 GPU 之间的流动，协同不同 GPU 上的模型进行并行训练。
​&lt;/p&gt;
&lt;p&gt;使用起来非常方便，我们只需要用 &lt;code class=&quot;language-text&quot;&gt;nn.DataParallel&lt;/code&gt; 包装模型，再设置一些参数即可。需要定义的参数包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;参与训练的 GPU 有哪些，device_ids=gpus；&lt;/li&gt;
&lt;li&gt;用于汇总梯度的 GPU 是哪个，output_device=gpus[0] 。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DataParallel 会自动帮我们将数据切分 load 到相应 GPU，将模型复制到相应 GPU，进行正向传播计算梯度并汇总：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/93576e68226a3bcf0b52a87376ab932d/f058b/p2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 20.858895705521473%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAr0lEQVQY033OS27EIBCEYZ8j+DEyNhCDjaEhnkXuf60/MhllEyWLT2q1VKXqnHNYY7FuxTqDeZnnmWEYGMfxl7/+t24xGp8cNqy43fAeLcauTI8Hfd83SimUeqNXqpX9p/PeUz8qKWdqLe2+rot87Gi9YKwlhND44NFaf6+Zph/TS1u4bRsigveBUoTnXZYzVymcMZJFyFJIz0+CVJIU7ozZT1wU7JE44klKkWVd+AIlYnObzb6wDQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/93576e68226a3bcf0b52a87376ab932d/f058b/p2.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/93576e68226a3bcf0b52a87376ab932d/222b7/p2.png 163w,
https://hfai-static.high-flyer.cn/static/93576e68226a3bcf0b52a87376ab932d/ff46a/p2.png 325w,
https://hfai-static.high-flyer.cn/static/93576e68226a3bcf0b52a87376ab932d/f058b/p2.png 630w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;值得注意的是，&lt;strong&gt;这里因为有8张显卡，&lt;/strong&gt;&lt;code class=&quot;language-text&quot;&gt;**batch_size**&lt;/code&gt;&lt;strong&gt;要设为3200&lt;/strong&gt;，由DataParallel均分到不同的显卡里。模型和数据都要先 load 进 GPU中，DataParallel 的 module 才能对其进行处理，否则会报错。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/0e4685b5f245ff537f3b322b8724df2e/63ec5/p3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 30.061349693251532%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA80lEQVQY03WPWW6EMBBEOcjYBpv2wuZhSEzC/e/1IswkUqLJx3OrlyqVm84J8zIy5BUZJlwYsBLo40AfIjIsOPFImurMhVi59gnnY70/tdb1NNY63h5vfHwebFthWTLrYyFOI2leCDGhjcF0FtN1mPai/e6fs9ZajDE0Wmu00kSJLGkmiNA5S7aWXQTVtmhtMFpfGINWCqVuqFqf3K6+OR/vA3sp5Jx5bBvrunIfJ4Y40qcZKwlxQm97Ukq0bVvFNcwffgxLKWzbxnEclPKOeI8PAa3V7yRPTvEr02oo4tn3nbLv3HOuizNFV7+rUS+S/JfwC+4YqoJK3C27AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/0e4685b5f245ff537f3b322b8724df2e/a6d36/p3.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/0e4685b5f245ff537f3b322b8724df2e/222b7/p3.png 163w,
https://hfai-static.high-flyer.cn/static/0e4685b5f245ff537f3b322b8724df2e/ff46a/p3.png 325w,
https://hfai-static.high-flyer.cn/static/0e4685b5f245ff537f3b322b8724df2e/a6d36/p3.png 650w,
https://hfai-static.high-flyer.cn/static/0e4685b5f245ff537f3b322b8724df2e/63ec5/p3.png 812w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;发起训练。从下图我们可以看到，在显存几乎占满的情况下，8张显卡平均GPU利用率不高（36.5%）。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/606dcf947bf33e727f91a0c771c451a2/67fe0/p4.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 16.56441717791411%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAuUlEQVQI10WL3U6DQBhEeRPdsmVhv4WlVEvVpEpbWBCTxb/E93+RY+TGi5NJ5swktjCEzvN6qfmYW976huG5JIY94aVi6iqW6Uh7X3I8lLSHknDeE4eG4eToT4443lHXjiwzJGIN36MnXh1fo2fuLMvV8TPv1u69F6auxvsdzjnURnN+EuJFVr/0js9Q8fjQUFgh0WmKKzZIobD57Yrk6j/NDWK3eF8jImitMZla93+s31xhzJY01fwC9z5gNhP5lQUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/606dcf947bf33e727f91a0c771c451a2/a6d36/p4.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/606dcf947bf33e727f91a0c771c451a2/222b7/p4.png 163w,
https://hfai-static.high-flyer.cn/static/606dcf947bf33e727f91a0c771c451a2/ff46a/p4.png 325w,
https://hfai-static.high-flyer.cn/static/606dcf947bf33e727f91a0c771c451a2/a6d36/p4.png 650w,
https://hfai-static.high-flyer.cn/static/606dcf947bf33e727f91a0c771c451a2/e548f/p4.png 975w,
https://hfai-static.high-flyer.cn/static/606dcf947bf33e727f91a0c771c451a2/67fe0/p4.png 1101w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
​
单独查看每一张显卡的利用情况，可以发现资源使用不平均。其中0号显卡作为梯度汇总，资源利用度相比其他显卡要高一点，整体利用率不到50%。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/7f6c45154108bd9094fff7ba70ec8c6f/7798c/p5.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 19.631901840490798%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA80lEQVQY0y2L207CQABE+yES2213u7YV2AKtSIFCW8CI0QfkZlQSJMH//4BjqDxMZjJnxopCTdJ26LYcekaQGI/UuNfOpndll3zRoKfpmADT9DEtXe87V2buBVa7GbJ7G/K5GnHYTDntZpz3Fb/7ivNHxXFf8rWe8LOdctoWfK9K4jgmiiJs22Hzmtebw7rgfZlhSelR5g/MxgmLScoiT1lM+jyXGU/lsM5FzfrM85RxltA2BiklN40G+WOXl/mIZTkgzxKsMAwRrodSCk8qhCf/XbhIqbCFh9J32MLFlT5K+XTjmCAI0NpH+RrhiPpzazv8Aad9glyPpr4oAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/7f6c45154108bd9094fff7ba70ec8c6f/a6d36/p5.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/7f6c45154108bd9094fff7ba70ec8c6f/222b7/p5.png 163w,
https://hfai-static.high-flyer.cn/static/7f6c45154108bd9094fff7ba70ec8c6f/ff46a/p5.png 325w,
https://hfai-static.high-flyer.cn/static/7f6c45154108bd9094fff7ba70ec8c6f/a6d36/p5.png 650w,
https://hfai-static.high-flyer.cn/static/7f6c45154108bd9094fff7ba70ec8c6f/e548f/p5.png 975w,
https://hfai-static.high-flyer.cn/static/7f6c45154108bd9094fff7ba70ec8c6f/7798c/p5.png 1183w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;最终，&lt;code class=&quot;language-text&quot;&gt;nn.DataParrallel&lt;/code&gt;方法下，ResNet平均每Epoch&lt;strong&gt;耗时984s&lt;/strong&gt;左右，相比单机单卡加速&lt;strong&gt;大约两倍效果&lt;/strong&gt;。
​&lt;/p&gt;
&lt;h3 id=&quot;torchdistributed&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#torchdistributed&quot; aria-label=&quot;torchdistributed permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;torch.distributed&lt;/h3&gt;
&lt;p&gt;在 pytorch 1.0 之后，PyTorch官方对分布式的常用方法进行了封装，支持 all-reduce，broadcast，send 和 receive 等等。通过 MPI 实现 CPU 通信，通过 NCCL 实现 GPU 通信，解决了 DataParallel 速度慢，GPU 负载不均衡的问题。
​&lt;/p&gt;
&lt;p&gt;与 DataParallel 的单进程控制多 GPU 不同，在 distributed 的帮助下，我们只需要编写一份代码，torch 就会自动将其分配给 n 个进程，分别在 n 个 GPU 上运行。
​&lt;/p&gt;
&lt;p&gt;具体的，首先使用 &lt;code class=&quot;language-text&quot;&gt;init_process_group&lt;/code&gt; 设置GPU之间通信使用的后端和端口：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/38fe459308837d43f8e467cc7c32b7fe/024d6/p6.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 22.085889570552148%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAAsTAAALEwEAmpwYAAAApUlEQVQY042NUY7CMAxEe5EmobETN2kD24K0FRL3v9VDWVaITz6eZsYjjQctM6mtlPXCOSslCcEHxnHEOffWbxmW2x3dLiz3B8dx8NhXajXqnrGz4vxr9FuGaJlogtSElUQyJc2CNUWLEE4B37/7gPP+n4Dv2b2y/+iGaTXqT2O/NrbbRr3+UltBsqBlIYoSp4mYC6fukxHzjM6VmDJi3S9/t949ARvDcYwi0Ma0AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/38fe459308837d43f8e467cc7c32b7fe/a6d36/p6.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/38fe459308837d43f8e467cc7c32b7fe/222b7/p6.png 163w,
https://hfai-static.high-flyer.cn/static/38fe459308837d43f8e467cc7c32b7fe/ff46a/p6.png 325w,
https://hfai-static.high-flyer.cn/static/38fe459308837d43f8e467cc7c32b7fe/a6d36/p6.png 650w,
https://hfai-static.high-flyer.cn/static/38fe459308837d43f8e467cc7c32b7fe/024d6/p6.png 961w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
​&lt;/p&gt;
&lt;p&gt;然后，使用 &lt;code class=&quot;language-text&quot;&gt;DistributedDataParallel&lt;/code&gt; 包装模型，它能帮助我们为不同 GPU 上求得的梯度进行 all reduce（即汇总不同 GPU 计算所得的梯度，并同步计算结果）。all reduce 后不同 GPU 中模型的梯度均为 all reduce 之前各 GPU 梯度的均值：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; torch&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;nn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parallel&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;DistributedDataParallel&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; device_ids&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;local_rank&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;p&gt;最后，因为是采用了多进程管理，需要使用 &lt;code class=&quot;language-text&quot;&gt;DistributedSampler&lt;/code&gt; 对数据集进行划分，它能帮助我们将每个 batch 划分成几个 partition，在当前进程中只需要获取和 rank 对应的那个 partition 进行训练：
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 471px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/f31c5d3b7c1a02c10fb68e7500c64dfa/1f09d/p7.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 30.061349693251532%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABIElEQVQY04WQzW7CMBAGeYy2ie04cYzj/BFSoAmUEFQhxKF9/6eZKkDLpVIPI+1hd3a/nUVxTJqVGOdJfYktamxeo+MYOU+RmUU6S5Q7ojIjcpY085isIM0r5sUC6wuUkgghmCXWUe8+qPuR5XBiffqkGU4479nstjR9x2rfU++25MOI77Ys349U3f5+wILUeZS8C5VS6DhBJ+bBdJ2UpMZcMVrjq5a6G8mXbxSvPTpJEGFA8PxEGARIqZA3oURK8UAIpiXyvlFISRgG12jteKHcbCnXPXU/UHUH2vHM6vSFq5ofoeIvJuFvLUJc3dIczrTHC4t+oNgMlJs9rmqZVw2R1rfI0+C/CEFsLMblpL5g+ruKLTo2hMHLNcEkm3q/Ac1srzoQMPn0AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/f31c5d3b7c1a02c10fb68e7500c64dfa/1f09d/p7.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/f31c5d3b7c1a02c10fb68e7500c64dfa/222b7/p7.png 163w,
https://hfai-static.high-flyer.cn/static/f31c5d3b7c1a02c10fb68e7500c64dfa/ff46a/p7.png 325w,
https://hfai-static.high-flyer.cn/static/f31c5d3b7c1a02c10fb68e7500c64dfa/1f09d/p7.png 471w&quot;
        sizes=&quot;(max-width: 471px) 100vw, 471px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;值得注意的是**，与**&lt;code class=&quot;language-text&quot;&gt;**nn.DataParrallel**&lt;/code&gt;&lt;strong&gt;不同，这里&lt;/strong&gt;&lt;code class=&quot;language-text&quot;&gt;**batch_size**&lt;/code&gt;&lt;strong&gt;应该为400&lt;/strong&gt;，因为其只负责当前rank下对应的partition，8张卡一共组成3200个样本的batch_size。
​&lt;/p&gt;
&lt;p&gt;至于 API 层面，PyTorch 为我们提供了 &lt;code class=&quot;language-text&quot;&gt;torch.distributed.launch&lt;/code&gt; 启动器，用于在命令行分布式地执行 python 文件。在执行过程中，启动器会将当前进程的（其实就是 GPU的）index 通过参数传递给 python，我们可以这样获得当前进程的 index：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;parser &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; argparse&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ArgumentParser&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
parser&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;add_argument&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;--local_rank&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; default&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;node rank for distributed training&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
args &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; parser&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;parse_args&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;local_rank&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;启动8个命令行，执行如下命令：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;CUDA_VISIBLE_DEVICES&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0,1&lt;/span&gt;,2,3,4,5,6,7 python -m torch.distributed.launch --nproc_per_node&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt; train.py&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;torch.multiprocessing&lt;/strong&gt;
​&lt;/p&gt;
&lt;p&gt;手动启动命令行比较麻烦，这里有一种更简单的方法：&lt;code class=&quot;language-text&quot;&gt;torch.multiprocessing&lt;/code&gt; 会帮助自动创建进程，绕开 &lt;code class=&quot;language-text&quot;&gt;torch.distributed.launch&lt;/code&gt; 自动控制开启和退出进程的一些小毛病。
​&lt;/p&gt;
&lt;p&gt;如下面的代码所示，将原本需要 &lt;code class=&quot;language-text&quot;&gt;torch.distributed.launch&lt;/code&gt; 管理的执行内容封装进 &lt;code class=&quot;language-text&quot;&gt;main&lt;/code&gt; 函数中，通过 &lt;code class=&quot;language-text&quot;&gt;torch.multiprocessing.spawn&lt;/code&gt; 开启了 nprocs=8 个进程，每个进程执行 &lt;code class=&quot;language-text&quot;&gt;main&lt;/code&gt; 并向其中传入 local_rank（当前进程 index）。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 501px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/886058f74182b0d6828dd04c7ddf4f04/55811/p8.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 29.447852760736193%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABBklEQVQY05WN226CQBgGeQyRPSB7YpcFQalobRvt+7/TNMWk9a7pxeSffBfzF3XosSkT8oBJI00csN1E02aUCSjT/ouiySf6+YXxZaGdPwiHV9Jyw/Uz2nVon9Eu/94/KLSoqMoSUVWI7QaxLRHlBlVtESsVQlSrS1GhpFh59uetaE0g9BPj9RPrA8Y7UvAch0T0Fmcbaq1pzI66rh9xIZBS/vjjqUAqRSGFIJ2v9O833DhgLjPuNGHPR6a3mcPlwLhM3O8L+32PiRkfAo0xuNRjfIvvBmyI6O+gkhLZ1CjXUEdP3Tp069HeotqwsusiXRewzuD7iZgS1jlcHnGxIx1O+JTX4BcnIqvoZfRGvAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/886058f74182b0d6828dd04c7ddf4f04/55811/p8.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/886058f74182b0d6828dd04c7ddf4f04/222b7/p8.png 163w,
https://hfai-static.high-flyer.cn/static/886058f74182b0d6828dd04c7ddf4f04/ff46a/p8.png 325w,
https://hfai-static.high-flyer.cn/static/886058f74182b0d6828dd04c7ddf4f04/55811/p8.png 501w&quot;
        sizes=&quot;(max-width: 501px) 100vw, 501px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;发起训练。从下图我们可以看到，显存几乎占满，8张显卡平均利用率高（95.8%）。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/034771139e2213367410e5b97647fb52/84ee5/p9.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 17.177914110429448%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAAAsTAAALEwEAmpwYAAAApklEQVQI1y2NW3KDMBRDs5TEF2M7PGxwYhNCXNrkp/tf0OkU+NBoNEcjnbSuCZ1QJsP6bHhNdvdnZH5EYuzJyfOztLxfLZ/Ssc5XpiikQTGNQh4VXWOw1nEyxpLHijVfKFnxtUlI9wHvA/+HlZwpWQ6meC81v98Nn8VsuaQLfVvvg0op2qsQfcXY7xo6IYQe7z3OObSWg8nB1dafU8Mt6K3vrEak4g9i4lzm/d7evgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/034771139e2213367410e5b97647fb52/a6d36/p9.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/034771139e2213367410e5b97647fb52/222b7/p9.png 163w,
https://hfai-static.high-flyer.cn/static/034771139e2213367410e5b97647fb52/ff46a/p9.png 325w,
https://hfai-static.high-flyer.cn/static/034771139e2213367410e5b97647fb52/a6d36/p9.png 650w,
https://hfai-static.high-flyer.cn/static/034771139e2213367410e5b97647fb52/e548f/p9.png 975w,
https://hfai-static.high-flyer.cn/static/034771139e2213367410e5b97647fb52/84ee5/p9.png 1076w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
​&lt;/p&gt;
&lt;p&gt;同时，每张显卡利用都比较充分，利用率都在80%以上：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/882794889232274d41529dd36abe3f95/d073d/p10.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 20.245398773006134%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA1ElEQVQY0zWObW6DMBBEuUiqgovXX8ROTCAOoLZJc/8jvQo3/bF6Mzva0TYimhw7yigsk2WdLNtsWSZPGR3T2VCysM2O9TXLbLlmzeWkuKSOS1LMJ0VwHY3oD7ZJcb/13G+ar9JzXzRlPhFTQovU4+cqNX/cND/Ln39ulscifF4V30VxHjoarfsq9i/zsSUfd74z5oRznsPhDW9axthxfuX/3Hcla8aoqg5O0fR9j/cB7ywhBKxztSjFSEoRMQYfBsTYSmsMQwiICD4EjAjB797Qti2/bHt612hsQbMAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/882794889232274d41529dd36abe3f95/a6d36/p10.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/882794889232274d41529dd36abe3f95/222b7/p10.png 163w,
https://hfai-static.high-flyer.cn/static/882794889232274d41529dd36abe3f95/ff46a/p10.png 325w,
https://hfai-static.high-flyer.cn/static/882794889232274d41529dd36abe3f95/a6d36/p10.png 650w,
https://hfai-static.high-flyer.cn/static/882794889232274d41529dd36abe3f95/e548f/p10.png 975w,
https://hfai-static.high-flyer.cn/static/882794889232274d41529dd36abe3f95/d073d/p10.png 1297w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
​&lt;/p&gt;
&lt;p&gt;最终，&lt;code class=&quot;language-text&quot;&gt;torch.distributed&lt;/code&gt;方法下，ResNet平均每Epoch&lt;strong&gt;耗时239s&lt;/strong&gt;左右，相比单机单卡加速&lt;strong&gt;大约八倍效果&lt;/strong&gt;。
​&lt;/p&gt;
&lt;h3 id=&quot;apex&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#apex&quot; aria-label=&quot;apex permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;apex&lt;/h3&gt;
&lt;p&gt;Apex 是 NVIDIA 开源的用于混合精度训练和分布式训练库。Apex 对混合精度训练的过程进行了封装，改两三行配置就可以进行混合精度的训练，从而大幅度降低显存占用，节约运算时间。此外，Apex 也提供了对分布式训练的封装，针对 NVIDIA 的 NCCL 通信库进行了优化。PyTorch 1.6版本之后，开始原生支持，即&lt;code class=&quot;language-text&quot;&gt;torch.cuda.amp&lt;/code&gt;。
​&lt;/p&gt;
&lt;p&gt;直接使用 &lt;code class=&quot;language-text&quot;&gt;amp.initialize&lt;/code&gt; 包装模型和优化器，apex 就会自动帮助我们管理模型参数和优化器的精度了，根据精度需求不同可以传入其他配置参数。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/b7a7aa514937fe1a8035b4cf71f9ed59/d44c9/p11.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 31.901840490797547%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA90lEQVQY04WQwU6EMABE+Q03UARa2tKW0kJddI0xevX/f+eZZRNP6h5eJplkJpOpVKcocWPLiRITKS4YadBGY63FOXeoMYZWCMQdqq7r8MEQoj6wViHbgaHvkVKilPqhbdv7hcp5wnlHpoBaHEsJTMnjc0CbkaF/pKlrTqcH6rqmaZp/qdQUWD++MHNCloX5/ZP0+sJ6eSKVjXzesSEQ9jfmcmZKBWU9ek7ocCViYkaHBTkaql4ZTNwY3Yz0Hu08fk5Mk8OG5Ra6etszo9EIcVsi/lzoIlN6IiyZZS3kvFLKxpozeb9gY6YbJP2ojw+PMiFomt8//AYmma4BO0570QAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/b7a7aa514937fe1a8035b4cf71f9ed59/a6d36/p11.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/b7a7aa514937fe1a8035b4cf71f9ed59/222b7/p11.png 163w,
https://hfai-static.high-flyer.cn/static/b7a7aa514937fe1a8035b4cf71f9ed59/ff46a/p11.png 325w,
https://hfai-static.high-flyer.cn/static/b7a7aa514937fe1a8035b4cf71f9ed59/a6d36/p11.png 650w,
https://hfai-static.high-flyer.cn/static/b7a7aa514937fe1a8035b4cf71f9ed59/d44c9/p11.png 722w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;在分布式训练的封装上，Apex 的改动并不大，主要是优化了 NCCL 的通信。因此，大部分代码仍与 &lt;code class=&quot;language-text&quot;&gt;torch.distributed&lt;/code&gt; 保持一致。使用的时候只需要将 &lt;code class=&quot;language-text&quot;&gt;torch.nn.parallel.DistributedDataParallel&lt;/code&gt; 替换为 &lt;code class=&quot;language-text&quot;&gt;apex.parallel.DistributedDataParallel&lt;/code&gt; 用于包装模型。
​&lt;/p&gt;
&lt;p&gt;在正向传播计算 loss 时，Apex 需要使用 &lt;code class=&quot;language-text&quot;&gt;amp.scale_loss&lt;/code&gt; 包装，用于根据 loss 值自动对精度进行缩放：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 484px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/e13ffa82cd72bc92c84b7cc54408adc5/ff42b/p12.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 35.58282208588957%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAABWklEQVQoz12RSY7bMBQFfYt0S5QskhIpkpJMa/YEOMOigV7k/qepwDLcSLIoPOAvHh7q71Rl6U53bNNR+YYwnSmNxdSOpm3phwHTHqmPM2FYCccJ7SLGBoJpqMoa71rqfsE3HTsTDky/ftMMM6GfGX9+cjzdGO4fDLcf+BAoXUPlGlRlUGXFXpYUUqEKRVFIpFTI0iCVYqerGhs6lNbYrqeOEz6OhOmCH9ZtrR8WQuzJswwhBFmW/YcgEymZEOyKssIcjuhHaVnirMFaQ3A1eZqQJO8kb99I3t8QIkVk4plp+pVZlpPnT3bOtoxxZb3d6ceJ9XxhPZ24XG/E5YLxYfMaxjOui9TaYn23rXdxxDaRfZ5vS7dCJTXWtfTX78T1Sr/eiMPEMs/My8ohRqSuniiN3BebP6lLCqU38r8Lde0I02n70mNN3w945zdX+cvRw9uLL2f/3l6lfwAIl8ysbjZ3rQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/e13ffa82cd72bc92c84b7cc54408adc5/ff42b/p12.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/e13ffa82cd72bc92c84b7cc54408adc5/222b7/p12.png 163w,
https://hfai-static.high-flyer.cn/static/e13ffa82cd72bc92c84b7cc54408adc5/ff46a/p12.png 325w,
https://hfai-static.high-flyer.cn/static/e13ffa82cd72bc92c84b7cc54408adc5/ff42b/p12.png 484w&quot;
        sizes=&quot;(max-width: 484px) 100vw, 484px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;发起训练。从下图我们可以看到，在同等&lt;code class=&quot;language-text&quot;&gt;batch_szie&lt;/code&gt;条件下，显存只占用了60%，而8张显卡平均利用率高（95.8%）。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/828d9008cfdd642b61515577bd904dbf/87488/p13.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 15.337423312883436%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAqklEQVQI1yWM7Y7CIAAE+yp8F0orVSktniXmjO//RnOR+zHJbjK7g5SS20VxHp5WA616nnWm7omSZ0qOnLunZkvdHEe2bKsiJ0FZVc/7VXKJGmMsgzGGelO0Ijk3SdsEx92R1ivj6HFG8Do074fl92F5/zg+zfM5ffefWdKK4J4MYYoMQgjCqIhBM33xijg5lmXBh4AxisnrTpodc9CdtIz/G696d1by/foD+ztb8aNyPSoAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/828d9008cfdd642b61515577bd904dbf/a6d36/p13.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/828d9008cfdd642b61515577bd904dbf/222b7/p13.png 163w,
https://hfai-static.high-flyer.cn/static/828d9008cfdd642b61515577bd904dbf/ff46a/p13.png 325w,
https://hfai-static.high-flyer.cn/static/828d9008cfdd642b61515577bd904dbf/a6d36/p13.png 650w,
https://hfai-static.high-flyer.cn/static/828d9008cfdd642b61515577bd904dbf/e548f/p13.png 975w,
https://hfai-static.high-flyer.cn/static/828d9008cfdd642b61515577bd904dbf/87488/p13.png 1282w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
​&lt;/p&gt;
&lt;p&gt;同时，每张显卡利用都比较充分，利用率都在80%以上：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/eb8903f9aa4abecd5b1d2c54b3253fbc/21b4d/p14.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 17.791411042944784%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA1klEQVQY0x2PW26DQBAEuYlj1uxzgGUXzCvYTizn/jeqiP0oqTWqlnqqKdbsk+a4G56L57V69jkwJcs4GJZseSyO77thyzfWk6RK/p4029gwJ1VYsqI67jV/D1d475r3dmObO4YhYZ3D24bf3fA5nWfgczg+hy2c/mu98ZxV4WdVVFEUQ6uIbU3qFFGujKmj7yOXyxeqvpK7hrFvGKNmzp48GFLU5YPcN8TSV6VfaWNpRfBBMNYRpEVEmMaE9x7nA0E6Ts+FFmvP1Q6RFq0NIQjW+XI78z8hIXvT7tSWIAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/eb8903f9aa4abecd5b1d2c54b3253fbc/a6d36/p14.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/eb8903f9aa4abecd5b1d2c54b3253fbc/222b7/p14.png 163w,
https://hfai-static.high-flyer.cn/static/eb8903f9aa4abecd5b1d2c54b3253fbc/ff46a/p14.png 325w,
https://hfai-static.high-flyer.cn/static/eb8903f9aa4abecd5b1d2c54b3253fbc/a6d36/p14.png 650w,
https://hfai-static.high-flyer.cn/static/eb8903f9aa4abecd5b1d2c54b3253fbc/e548f/p14.png 975w,
https://hfai-static.high-flyer.cn/static/eb8903f9aa4abecd5b1d2c54b3253fbc/21b4d/p14.png 1280w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;最终，&lt;code class=&quot;language-text&quot;&gt;apex&lt;/code&gt;方法下，ResNet平均每Epoch&lt;strong&gt;耗时230s&lt;/strong&gt;左右，相比&lt;code class=&quot;language-text&quot;&gt;torch.distributed&lt;/code&gt;加速了一点。同时，&lt;strong&gt;apex也节约了GPU的算力资源，对应的可以设置更大的batch_size，获取更快的速度&lt;/strong&gt;。我们极限测试下，能在&lt;code class=&quot;language-text&quot;&gt;torch.distributed&lt;/code&gt;基础上再提升50%的性能左右。
​&lt;/p&gt;
&lt;h3 id=&quot;多机多卡训练加速&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%A4%9A%E6%9C%BA%E5%A4%9A%E5%8D%A1%E8%AE%AD%E7%BB%83%E5%8A%A0%E9%80%9F&quot; aria-label=&quot;多机多卡训练加速 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;多机多卡训练加速&lt;/h3&gt;
&lt;p&gt;从上面的试验可以看到，8张卡带来的加速效果近似8倍。如果我们使用更多的机器，是否会有更快的提速效果呢？这里，我们对 &lt;code class=&quot;language-text&quot;&gt;apex&lt;/code&gt;的代码，配置4个节点，一共32张A100 GPU来进行试验，获得了惊人的效果。
​
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/ea59d00d6bf86822a0d2abceef8462ed/218a4/p15.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 68.71165644171779%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAACyUlEQVQ4y1WT23KbSBRF9R0exUJchISgm6a5NBcJS/JYliOwHY8z5cpkZqrylP//gDUFijOVh82pfmCxavdhUjZbttsdVb1FJTkPH594enql7584dz1998jHrud07sY8dD2maijKLabakptmjNIFiyBiIsoDW3NHW92zaV/Z1D25OZJnLSIxY1Zxji0zbJHiJ4ZQSBaLBUJpdG4QKmUtFKmpmcT1gcLcUpV78uqILnbo4oY037BMDI4q8BLD4keWuqQoKzzXJdIl5e5E1hyQ5Z6q3TOR1QDcY8rfycojcd6is5I8b8iyejR6B3qqwNcGU9UEqxVpvaO56xHmhmRzR1FvmcTVBZYXLbI4kJhb0mJLmjdEafXT7H9DQ1k3RGFEdXvm/vUfdufPVPcvF2BUtETpjiDbs0r3hGlLmDYsVMFcDt3lOHGOIy89espQmIJMCdbrNasgxAsEq0ih05SJ2d9Q7g80xxP7rud4uGPXHqg3t5TtkbRu0dUWXd+g6h3KVJi7F8zzd/T5G/HNC8Z1kWlBVpRM3r60/PWl4t+/W76+lfT9Aw/dJ17evtI9f+b00NE9vtA9/cGpe+b86U+S+hbRnJD1ETcqEK7LKhToNGOyDBVhnBEN6zCUrio8WSKzmiDW+IFgHWvc5ZpQpcRmg85yRBjg2nNsa8a1ZTGdThFCMHFdh1hK0lSjlGIRJsx9gWVZ2HMLx7FxHYfp9De0TnjsOyIh8YNotPIWS+aWxWw2I45jJsOCyjgeC1WJxg8VlhdgOy6ue4njulxfXyNkTLs7sPT98WxZs/HD8/l8BEopL8CBrJKEWCX4g+EixPUWeJ43/hFDnMHywwfmc5vlcslsdgG95ydwMPjFUORYvsT+YTdAhzm8dHV1Nc4L8GL3bjgYj8DhMZSZJMloGcqEIIoJguCXrFYrfN8nDMNx/2zbHq3fM0CHO/gPPde9eeZM96gAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/ea59d00d6bf86822a0d2abceef8462ed/a6d36/p15.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/ea59d00d6bf86822a0d2abceef8462ed/222b7/p15.png 163w,
https://hfai-static.high-flyer.cn/static/ea59d00d6bf86822a0d2abceef8462ed/ff46a/p15.png 325w,
https://hfai-static.high-flyer.cn/static/ea59d00d6bf86822a0d2abceef8462ed/a6d36/p15.png 650w,
https://hfai-static.high-flyer.cn/static/ea59d00d6bf86822a0d2abceef8462ed/e548f/p15.png 975w,
https://hfai-static.high-flyer.cn/static/ea59d00d6bf86822a0d2abceef8462ed/218a4/p15.png 1052w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
​
可以看到，&lt;strong&gt;每Epoch总耗时52秒左右&lt;/strong&gt;，相比单机单卡速度&lt;strong&gt;提升30多倍&lt;/strong&gt;，几乎和显卡数量保持一致。
​&lt;/p&gt;
&lt;h3 id=&quot;分布式评价&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%88%86%E5%B8%83%E5%BC%8F%E8%AF%84%E4%BB%B7&quot; aria-label=&quot;分布式评价 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;分布式评价&lt;/h3&gt;
&lt;p&gt;以上展示了分布式训练的过程。然而，如何对训练的结果进行快速的推理与测试，也是非常重要的问题，例如：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;训练样本被切分成了若干个部分，被若干个进程分别控制运行在若干个 GPU 上，如何在进程间进行通信汇总这些（GPU 上的）信息？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用一张卡进行推理、测试太慢了，如何使用 Distributed 进行分布式地推理和测试，并将结果汇总在一起？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;要解决这些问题，我们需要一个更为基础的 API，&lt;strong&gt;汇总记录不同 GPU 上生成的准确率、损失函数等指标信息&lt;/strong&gt;。这个 API 就是 torch.distributed.reduce。&lt;/p&gt;
&lt;p&gt;reduce等 API 是 &lt;code class=&quot;language-text&quot;&gt;torch.distributed&lt;/code&gt; 中更为基础和底层的 API。这些 API 可以帮助我们控制进程之间的交互，控制 GPU 数据的传输。在自定义 GPU 协作逻辑，汇总 GPU 间少量的统计信息时，大有用处。熟练掌握这些 API 也可以帮助我们自己设计、优化分布式训练、测试流程。
​
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 569px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/296becc7cfe080c8de524b9cf43e4ba7/854dc/p16.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46.62576687116564%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAABaklEQVQoz22Q3U7bQBBG/f4vUqkXrURVLqrSFopAKiqlUIFKCGATJyGOYzuON/t/0FqN5dB80kirmW/OzkzkgGIwJE8nrI3DWov1UMwSikXGWhnwUIqKq+yaRiiUsQStGkF5W7PIK5QxeO+J8lry4fsl7w7O+PRzSFYJnkvB+2/n7B394vBPylIo4lnF288/2Du64OvvmNVa8fBc8+Ui5uB8yNndHKkMUSMNj9OSv/GUwWhOIzUhNxwvuI2nJFmN1Jal0G09+AJcW0exktxPCpLZkvGiwVhHRF/eoZXCWbtJ4K3pyq73Nsa03tDTVxT27iIgvEdrjZSyvaeUCuc9xliU0hhrWUvZAr2n69lEC6SX7KZxDq0V5lWEz3b1dMBu2x2mMFk6r7kaJNw8TsjKZsvT7+lW5pX6xnD405uUN/vHfDy55vJh9s+zDdm64S5gUF4UZE9PNMmIpsoZlykjMUHcC5RU/022Ab4AB1m2vkUglkAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/296becc7cfe080c8de524b9cf43e4ba7/854dc/p16.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/296becc7cfe080c8de524b9cf43e4ba7/222b7/p16.png 163w,
https://hfai-static.high-flyer.cn/static/296becc7cfe080c8de524b9cf43e4ba7/ff46a/p16.png 325w,
https://hfai-static.high-flyer.cn/static/296becc7cfe080c8de524b9cf43e4ba7/854dc/p16.png 569w&quot;
        sizes=&quot;(max-width: 569px) 100vw, 569px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，它的工作过程包含以下两步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在调用 reduce(tensor, op=…)后，当前进程接受其他进程发来的 tensor。&lt;/li&gt;
&lt;li&gt;在全部接收完成后，当前进程（例如rank 0）会对当前进程的和接收到的 tensor 进行 op 操作。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;通过上述步骤，我们就能够对不同 GPU 上的训练数据的损失函数进行求和了：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/755f130d5fa29aeee931ae3051fe5921/97655/p17.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 57.668711656441715%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAAB30lEQVQoz32SWXLbMBBEdY6IJPaV4CJosSSXneT+h3opIo4dq5x8dGHwgYeentn5GJimTJwOhE1lxZe5yZWJOM3EMpGXA9YH+r5jGAb6vm/no3bj4UK9PTOfLw3gc8GGjHYBYQ0+OmIKpByRUtJ1+0/Qvn8AOuVIaSLUI/lyJcSMiI4wFdJyIi4VqS3DIJFCoYxFafNvh9tvUhnm2w82t+v9J4f7d9bLjTjXJmU9WluU1GjrUda9uxyGz+CdGAaEkOR6YVyP5PONen+hPt2JZSaMCzZNOOew1qC1amqAL1zuNutCKqanF8alYteFej1yvD7jUiHPK/X8xKFWjseVUsYG/qrdBlRSYYwn5IJL4+9p54JPCe082lj6/Z6u697UN/3J8DHL3ZaLSYl5KYzzhHaOQaiW6zYMqXQDbQ8bcL//7+rstDKk9URYjviUCcFjjEZYjXca7zXOWazR+BixqaC3obx98qjdIAby4cx6OjDVynx95XJ/pp4q8+XO/fWVui4oJdtiGx/RestQMAiJEAIhZaubQykEYxkZx8wYPGFblVwYQ8DlBZ8ngjFo41AuYrTBa4newC5ijcXl0uoNvrPK4oxH+YSPCe9s27uQMs4a9vtvdO8t/d1m93HvPupfYNhWj0dDyMkAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/755f130d5fa29aeee931ae3051fe5921/a6d36/p17.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/755f130d5fa29aeee931ae3051fe5921/222b7/p17.png 163w,
https://hfai-static.high-flyer.cn/static/755f130d5fa29aeee931ae3051fe5921/ff46a/p17.png 325w,
https://hfai-static.high-flyer.cn/static/755f130d5fa29aeee931ae3051fe5921/a6d36/p17.png 650w,
https://hfai-static.high-flyer.cn/static/755f130d5fa29aeee931ae3051fe5921/97655/p17.png 819w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;除了&lt;code class=&quot;language-text&quot;&gt;reduce&lt;/code&gt;，PyTorch官网提供了诸如 &lt;code class=&quot;language-text&quot;&gt;scatter&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;gather&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;all-reduce&lt;/code&gt;等6种集合通信方案，具体的参考官方文档：
&lt;a href=&quot;https://ptorch.com/docs/1/distributed&quot;&gt;https://ptorch.com/docs/1/distributed&lt;/a&gt;
​&lt;/p&gt;
&lt;h3 id=&quot;总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%80%BB%E7%BB%93&quot; aria-label=&quot;总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;总结&lt;/h3&gt;
&lt;p&gt;本文介绍了不同的PyTorch并行训练方法，并在幻方萤火二号上进行了测试。从测试结果中我们能够得出，多机多卡并行训练能有效提升我们效率，apex 方法结合torch.distributed 能最大限度的发挥显卡的算力，让加速效果与显卡数量一致。同时，我们也发现，随着显卡数量的增多，受限于梯度汇合中的reduce计算，单个显卡的利用率会逐渐降低。如何高效优化reduce算法，尽可能提高gpu算力，从而加速整体训练效率，是接下来值得大家继续研究的课题。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[萤火跑模型 | Informer 上手实践]]></title><description><![CDATA[长时间序列预测（Long Sequence Time-Series Forecasting，以下称为 LTSF）在现实世界中是比较基础但又十分重要的研究场景，例如商品销量及库存的预测、电力消耗的规划、股票价格、疾病传播与扩散等实际问题。然而LTSF…]]></description><link>https://www.high-flyer.cn/blog/informer/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/informer/</guid><dc:creator><![CDATA[Vachel]]></dc:creator><pubDate>Sun, 18 Apr 2021 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;长时间序列预测&lt;/strong&gt;（Long Sequence Time-Series Forecasting，以下称为 LTSF）在现实世界中是比较基础但又十分重要的研究场景，例如商品销量及库存的预测、电力消耗的规划、股票价格、疾病传播与扩散等实际问题。然而LTSF因为其历史数据量大、计算复杂性高、预测精度要求高，一直以来并没有取得太好的效果。
​&lt;/p&gt;
&lt;p&gt;今年人工智能顶级大会AAAI的最佳论文奖项中有一篇来自北京航空航天大学的工作：&lt;strong&gt;Informer&lt;/strong&gt;，其主要的工作是改造 Transfomer 算法来实现LTSF，并开源了代码与数据。笔者最近在幻方AI的萤火平台上尝试复现了该论文的实验，为大家带来第一手的测试体验。
​&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文标题&lt;/strong&gt;：Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原文地址&lt;/strong&gt;：&lt;a href=&quot;https://ojs.aaai.org/index.php/AAAI/article/view/17325&quot;&gt;https://ojs.aaai.org/index.php/AAAI/article/view/17325&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;源码地址&lt;/strong&gt;：&lt;a href=&quot;https://github.com/zhouhaoyi/Informer2020&quot;&gt;https://github.com/zhouhaoyi/Informer2020&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型仓库&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/ltsf-former&quot;&gt;https://github.com/HFAiLab/ltsf-former&lt;/a&gt;
​
​&lt;/p&gt;
&lt;h2 id=&quot;模型介绍&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E4%BB%8B%E7%BB%8D&quot; aria-label=&quot;模型介绍 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型介绍&lt;/h2&gt;
&lt;p&gt;近年来的研究表明，Transformer具有提高预测能力的潜力。然而，Transformer也存在几个问题，使其不能直接适用于LTSF问题，例如时间复杂度、高内存使用和“编码-解码”体系结构的固有局限性。为了解决这些问题，作者基于Transformer设计了一种适用于LTSF问题的模型，即Informer模型，该模型具有三个显著特征:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ProbSpare self-attention机制，有效降低了时间复杂度和内存使用量。&lt;/li&gt;
&lt;li&gt;通过将级联层输入减半来突出Self-attention中的主导因子，有效地处理过长的输入序列。&lt;/li&gt;
&lt;li&gt;对长时间序列进行一次预测而不是一步步方式进行预测，极大提高了长序列预测的推理速度。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Informer模型的整体框架如下图所示，可以看出该模型仍然保存了Encoder-Decoder的架构：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/ac38f9f122b3e08f9a2d6659f79059d2/1fbe8/p0.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 79.14110429447852%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAADH0lEQVQ4y22USY/kRBBG61fDHRgJgeDIBY5Ig8QiMUcOwAjBTC+0u8u1di1eyvu+l5eyH3K6e/pCSCGnrcjnLyIycgYwDAPP1jQNdV1TVZXwsixp25b/s6aHtIBzN70PQ8/sGXa5XMiyDM/zCaNIgPu+F88RPJrv+wSBjx/EhPYa899XSL99zOr3j8jttyJmxhOwbRo26zXL5YLVasmlm1SN0BGYZzmaqqMcFVTVQNvPOT18h7X4Hv3+W5zDX7QdzPp+IC5b4qojOV/ws4q07omevnWXC3mec9xqmIrDVt6zlNZc/S3xIGks5wbqMUHb+7iWxywsWroBsUmWF8xlmTvpnrbtqC8DQV5Tn6eUx5+M7mc1iuXhJTlx1RAWNVUzFXI2qmjalr1pc7vacDJM0iQRBe4HBLBtagHPm0E06PrmVvgff77Fdb0prphKNBvTLIqSxWrNYrMhSdMPXbw8Acs8I6sanCAmz1LSNEXTNFzXFeuxcaMwGCag6wcCJskLLMelOp/ZnUziLCepOqEwK2t02yOJY/KiQJIkdrsdRVFwrmvi6vICPDkui4OKvFfQbAcvCDmaNpYfktW9UHvuBsp2IEsTHMfBsiyhcPTzuX5R6GVnkiRhu16zkOekSYw5bggiDMcTTRitanvivBIN8jyP3eOjSLsqS6HyOW42SvXDlNVqzXq9RVF1dN3AMiyyoiYquw8KnaigqRviJENRNPTTSZQnzQu8vJmAbddxCkMOtsPesriayxzF2sYcJ6abgP3QY8cxmudjhBH32x2aE2H4KScvoajqCag4C16//4Q38tf8dPM5P7x/xS93X/Dr/Ctev/sU3d+IwLLO+Pn2S34cY64+4831NyyXMg/zO+6kaw7H3QT0QpuH3TtUd8VKvWV5vGGrS+zNOfeP/xDG3jSaXcNWv2elvMQozoqNKrE83uIEpwlYNzVxGqJoBxT1gOWY6IZGnIRESUjTTKlkecbjfovr2ai6ghc46IaKdlIwTA3bsZ4uhycLw4gwDOm6jsAPPtwwzzZeY+NxGSclTTNxMsZxHfclSUocxeIa/A9E0K4vMdUgpQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/ac38f9f122b3e08f9a2d6659f79059d2/a6d36/p0.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/ac38f9f122b3e08f9a2d6659f79059d2/222b7/p0.png 163w,
https://hfai-static.high-flyer.cn/static/ac38f9f122b3e08f9a2d6659f79059d2/ff46a/p0.png 325w,
https://hfai-static.high-flyer.cn/static/ac38f9f122b3e08f9a2d6659f79059d2/a6d36/p0.png 650w,
https://hfai-static.high-flyer.cn/static/ac38f9f122b3e08f9a2d6659f79059d2/1fbe8/p0.png 757w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;编码过程（左）：编码器接收长序列输入（绿色部分），通过ProbSparse自注意力模块和自注意力蒸馏模块，得到特征表示。ProbSparse自注意力机制利用稀疏矩阵来替代原来的注意力矩阵，大幅减少算力需求的同时并保持的良好的性能。&lt;/p&gt;
&lt;p&gt;解码过程（右）：解码器接收长序列输入（预测目标部分设置为0），通过多头注意力与编码特征进行交互，最后直接预测输出目标部分（橙黄色部分）。这里作者采用的是一次生成式预测方式，并说明该方式相比step-by-step方式推理速度更快且效果相当。&lt;/p&gt;
&lt;p&gt;至于特征输入，在 LTSF 问题中，时序建模不仅需要局部时序信息还需要层次时序信息，如星期、月和年等，以及突发事件或某些节假日等。经典自注意力机制很难直接适配，因此Informer提出了三层特征输入形式，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 498px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/689c7c77a9cadda03db4e8dfb48e277e/79e1b/p1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 79.75460122699387%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAADYklEQVQ4y0WT627jNhCF/f4PUqA/iraLFm2x3XSzWccbJ3bim2xJvuhqSaQulCxbku3ka2UHWwIDDs8ZDGeGh51IeNiuTlWXlHuFymOyPCZVkkxd96svv2Ot/z0mf+cygSoSOnkeI2VAGAbEsUAmktvhiBfT5GP/iaFu0pto3I9nvJgrbvoDBtqC7lijP5vT1xb0RhP62pwkC+kk6Za8SAhCHykjUpWibdasPIfpasnG99AtC8NxWHsu05XJyrXRbYul62DYFqZtYzrWNWHdVBwOJXV9uFjrb32XJBX4vk2SRASBS3i5MMD3HdJU4nkWcRwRbF2ECAgCn+OpoVPVO/aVYl+l7GtFWWWIOOB0PnGoao6nE1XdUDcNzfHIoao4nc/sD4cL155bvOXhjU6+i4gzD9szccMVMrFY6n8hQ43QHZBKHbEdEQdTkmhxweJoQRKNENspmZgReWPSSKNqdnTe3hqEEEzGUzRNJ00inMXfeOsH9OffCDZP2IsbHOMzwaaPMf4Dx+xhLz7iLLu45i324hZv2b223Jz2FGXKbq8uUsh3KZmKyItWCiHFrpVJiMqvWPaOKRVSFJK8jVWCPI84nio6p/OR8+uJ8+uR17czb7wSiYiqrknTjKqqUSpntyspyz1ZpmiaI0mirlyq2Jd7irygXZ1E+TjhHJE6+MJApi7GZogfrtiVOeU+Jy9SiiK9CL/toHi3liveuV2ZcTrXdNoy22os20HGCfXhQKRr6L0u3uQF6azZDB9YP31D2iv8+YTF/Rf82ZhwY+KOB+i9OxJ7xaEp6dTHkkgKdMNgvdkQBQHO+Jnp3WfWg0dcXcN87GH0e9izCevREK17h/UyxNImrJ8fmXW/sDV16tOBTnPckynFeDLBsmwKlbOdzUkWBnJhEM91xFwnMZY8ffqE1u2Rmasrpv8fEy3XVG2F7SunKmNjWWyDkEREhNM+29kQf9Qj0IYE0z7e6IHNcw932CXUnpHTR9xRH3/0gD24x5sNaNoZtgkjKXkcDFnoS3IZYn39CWd0y/zTD3gvNzgPv2N8/QXv+Qbznx+xhje4335l9fAn6/sPGHc/Y95/4LX9KXWzI1XiYjIJLtoTW5NY2ASeTiwsRLAkFmtSaRN6OkmLbc3LnkQb4taERfPfDP8Fv6OZXXe5IIEAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/689c7c77a9cadda03db4e8dfb48e277e/79e1b/p1.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/689c7c77a9cadda03db4e8dfb48e277e/222b7/p1.png 163w,
https://hfai-static.high-flyer.cn/static/689c7c77a9cadda03db4e8dfb48e277e/ff46a/p1.png 325w,
https://hfai-static.high-flyer.cn/static/689c7c77a9cadda03db4e8dfb48e277e/79e1b/p1.png 498w&quot;
        sizes=&quot;(max-width: 498px) 100vw, 498px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Informer的输入分为了三种位置嵌入表示：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;局部时间戳，即Transformer中的固定位置嵌入。&lt;/li&gt;
&lt;li&gt;全局时间戳。对于层次时间信息，构建一个词汇表，通过Embedding特征表示每一个词汇。&lt;/li&gt;
&lt;li&gt;对齐维度，使用一维卷积将输入的序列标量转化为向量。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;模型实践&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A8%A1%E5%9E%8B%E5%AE%9E%E8%B7%B5&quot; aria-label=&quot;模型实践 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;模型实践&lt;/h2&gt;
&lt;p&gt;看完上述的介绍，是否有想一试算法的冲动了呢？笔者也是带着好奇，在幻方萤火集群上尝试复现论文中的实验效果。
​&lt;/p&gt;
&lt;p&gt;作者的开源比较完备，包含ETT（变压器温度）、ECL（耗电量）和WTH（气象）3个数据集，采用PyTorch实现且没有特殊包依赖的模型代码。作者提供了执行的脚本 &lt;code class=&quot;language-text&quot;&gt;scripts/*.sh&lt;/code&gt;，包括了不同的实验参数：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;### M&lt;/span&gt;

python -u main_informer.py --model informer --data ETTh1 --features M --seq_len &lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt; --label_len &lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt; --pred_len &lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt; --e_layers &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; --d_layers &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; --attn prob --des &lt;span class=&quot;token string&quot;&gt;&apos;Exp&apos;&lt;/span&gt; --itr &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; --factor &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;

python -u main_informer.py --model informer --data ETTh1 --features M --seq_len &lt;span class=&quot;token number&quot;&gt;96&lt;/span&gt; --label_len &lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt; --pred_len &lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt; --e_layers &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; --d_layers &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; --attn prob --des &lt;span class=&quot;token string&quot;&gt;&apos;Exp&apos;&lt;/span&gt; --itr &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;

python -u main_informer.py --model informer --data ETTh1 --features M --seq_len &lt;span class=&quot;token number&quot;&gt;168&lt;/span&gt; --label_len &lt;span class=&quot;token number&quot;&gt;168&lt;/span&gt; --pred_len &lt;span class=&quot;token number&quot;&gt;168&lt;/span&gt; --e_layers &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; --d_layers &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; --attn prob --des &lt;span class=&quot;token string&quot;&gt;&apos;Exp&apos;&lt;/span&gt; --itr &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;### S&lt;/span&gt;

python -u main_informer.py --model informer --data ETTh1 --features S --seq_len &lt;span class=&quot;token number&quot;&gt;720&lt;/span&gt; --label_len &lt;span class=&quot;token number&quot;&gt;168&lt;/span&gt; --pred_len &lt;span class=&quot;token number&quot;&gt;24&lt;/span&gt; --e_layers &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; --d_layers &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; --attn prob --des &lt;span class=&quot;token string&quot;&gt;&apos;Exp&apos;&lt;/span&gt; --itr &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;

python -u main_informer.py --model informer --data ETTh1 --features S --seq_len &lt;span class=&quot;token number&quot;&gt;720&lt;/span&gt; --label_len &lt;span class=&quot;token number&quot;&gt;168&lt;/span&gt; --pred_len &lt;span class=&quot;token number&quot;&gt;48&lt;/span&gt; --e_layers &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; --d_layers &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; --attn prob --des &lt;span class=&quot;token string&quot;&gt;&apos;Exp&apos;&lt;/span&gt; --itr &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;

python -u main_informer.py --model informer --data ETTh1 --features S --seq_len &lt;span class=&quot;token number&quot;&gt;720&lt;/span&gt; --label_len &lt;span class=&quot;token number&quot;&gt;336&lt;/span&gt; --pred_len &lt;span class=&quot;token number&quot;&gt;168&lt;/span&gt; --e_layers &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; --d_layers &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; --attn prob --des &lt;span class=&quot;token string&quot;&gt;&apos;Exp&apos;&lt;/span&gt; --itr &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;一共有60组不同的实验，我们用幻方萤火平台快速运行一下。
​&lt;/p&gt;
&lt;p&gt;萤火提供了统一的训练管理平台，可以将大量的训练任务依据优先级负载均衡到不同的GPU上执行，充分利用起计算算力，节省模型训练的时间。我们只需加入几行代码，便可以把训练任务提交给集群，喝杯咖啡的功夫就能拿到结果啦。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录萤火平台，引入&lt;code class=&quot;language-text&quot;&gt;haienv&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;hfai&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# ./main_informer.py&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; haienv
haienv&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_env&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;202111&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# ./exp/exp_informer.py&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; hfai&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;对于每一轮训练，加入接收集群调度的逻辑代码，并做好模型checkpoint的保存&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 获取当前训练的进度&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; epoch &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_whole_life_state&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;train_loader&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;train_epochs&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;train_epochs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
    
    &lt;span class=&quot;token comment&quot;&gt;# 对于之前已经训练过的轮次，直接跳过&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; epoch&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;train_loader&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_whole_life_state&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
    
    &lt;span class=&quot;token comment&quot;&gt;# 状态更新&lt;/span&gt;
    steps &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
    
    &lt;span class=&quot;token comment&quot;&gt;# 收到调度信号，保存模型，设置当前执行的状态信息&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;receive_suspend_command&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;
        hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_whole_life_state&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;steps&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        hfai&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;go_suspend&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/008a12530e8b4a1d4286ff9cf5c92288/0c1c2/p2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 49.079754601226995%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAABq0lEQVQoz32S2W7bMBBF/SOB49bWYstaKYockpZkGVmQlwYt2v//klNIToIgafpwMQQGc3DvDFfb/hfZYU+WHSmKgqcnw89n4eFRId7hfPiPPBJO/L6f+PPjGTfds8p1IEliNre37A8HOtGIbZHeocNE0Q0UZqCUE7UJlG6kNCOFHSjs9R23jrQVxrtHVnmeE0URm80GsUKiA1lpsXKHDRfqLlCbnkr3VLan7DyHRohqs2hXGXalJm4s43RhtYsSttst6/WaLMs4dJ64bGk6j/QXlFzdlPpM3g0cjSfXjlwJh05eoB2JEk7DyOrm5mZxd7tes4si9q3wvTI0rcP7C9bfcex6MmWvaoSssRyVkKn3QEs/nlnNzmbgXOM4Jm0dx7JdohUSSLUh1ZZE26W3V460MUtNlFtgC7CxnD4CowUoxKWm1AFlL1R6JFX+bfCjXh2mShjO02fgHPlb1VG0nhAeqc2wDGzfIObtIK+ae/vWXY/y2eE1ct16tEy0/p5Kzhy1J20s8Yuj98BXh/2/Iu+1Y1tqauU490/Y8EDnJqr5OylL8gVw3uEM/AvA8z351h3qhAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/008a12530e8b4a1d4286ff9cf5c92288/a6d36/p2.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/008a12530e8b4a1d4286ff9cf5c92288/222b7/p2.png 163w,
https://hfai-static.high-flyer.cn/static/008a12530e8b4a1d4286ff9cf5c92288/ff46a/p2.png 325w,
https://hfai-static.high-flyer.cn/static/008a12530e8b4a1d4286ff9cf5c92288/a6d36/p2.png 650w,
https://hfai-static.high-flyer.cn/static/008a12530e8b4a1d4286ff9cf5c92288/e548f/p2.png 975w,
https://hfai-static.high-flyer.cn/static/008a12530e8b4a1d4286ff9cf5c92288/3c492/p2.png 1300w,
https://hfai-static.high-flyer.cn/static/008a12530e8b4a1d4286ff9cf5c92288/0c1c2/p2.png 1542w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;提交任务，等待执行结果&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/be4fcd141eba87c49a6d265d196c5b05/c2d9c/p3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 52.14723926380368%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAABhUlEQVQoz42S626cMBSEeY/lZhuWm40vmASWqNu+/0N9la0mTatKzY/RHI05ozkjihgjx3Gw7zvneWbWWjPPM9M0MY4jwzDQdR1CiAwp5cf8t1ZYawkhkDgZbduGcy6bJU7o+56yLKmq6r8o0sLj8eC6rpz0+XzmNLfbjbquaZqGtm3z/BUU6RxjTE6XzFPSpCmlPs58/zgl+Mz/NEwmW4x477Np3PdcQeowaWlOPdbVFxMavWDXFWtXVmNyorK8fUJJVVeUVfkHqupzp7/nYravzFvgHg7i6xuvx4lzAe83tHHMi2GZNMto0NPKdJ9RjUK0iraViFZmfkexxp3h8CzXwXWdfPvu2c8FHwfsi8ZtE6sbibHHu4HZzyxmYnN3TBjxQbGlt9Az6o7Cv1j0Y2G9POcZcMfI3Xb40KLtxGJHXEzLXV4Osce4O36T6NgTNkFwinkUKFVRDP4HdXDI88m6vdENGiUVUg0I2SOFRAqVTxO/OGl1K2haQdsImib9CS1lWfETykwjHCNPUiMAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/be4fcd141eba87c49a6d265d196c5b05/a6d36/p3.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/be4fcd141eba87c49a6d265d196c5b05/222b7/p3.png 163w,
https://hfai-static.high-flyer.cn/static/be4fcd141eba87c49a6d265d196c5b05/ff46a/p3.png 325w,
https://hfai-static.high-flyer.cn/static/be4fcd141eba87c49a6d265d196c5b05/a6d36/p3.png 650w,
https://hfai-static.high-flyer.cn/static/be4fcd141eba87c49a6d265d196c5b05/e548f/p3.png 975w,
https://hfai-static.high-flyer.cn/static/be4fcd141eba87c49a6d265d196c5b05/3c492/p3.png 1300w,
https://hfai-static.high-flyer.cn/static/be4fcd141eba87c49a6d265d196c5b05/c2d9c/p3.png 1326w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;完成&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/f7f9927af01950010a53a206b8ca2a78/71b12/p4.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 17.177914110429448%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAk0lEQVQI132OQQ6CMBQFuUgr6u//FEEltmBBjPe/1BiNcWVcTN7bzVR2KuyuGSsraZwpZSalTBxmYj+w2QX2ItR7xW+2OOfw3r/3F5X2Cz5n6qmQpjtpnLC2o2l71CJqhqqi1mDWvL9oYKuChICIfHmJqnhe0Lmg5UZeHgzXB11eOU43DpeV2HYEkU+Zw/2pexU+AcjLV7e5oIImAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/f7f9927af01950010a53a206b8ca2a78/a6d36/p4.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/f7f9927af01950010a53a206b8ca2a78/222b7/p4.png 163w,
https://hfai-static.high-flyer.cn/static/f7f9927af01950010a53a206b8ca2a78/ff46a/p4.png 325w,
https://hfai-static.high-flyer.cn/static/f7f9927af01950010a53a206b8ca2a78/a6d36/p4.png 650w,
https://hfai-static.high-flyer.cn/static/f7f9927af01950010a53a206b8ca2a78/e548f/p4.png 975w,
https://hfai-static.high-flyer.cn/static/f7f9927af01950010a53a206b8ca2a78/3c492/p4.png 1300w,
https://hfai-static.high-flyer.cn/static/f7f9927af01950010a53a206b8ca2a78/71b12/p4.png 1308w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;
​
Informer开源的测试数据不大（10MB以内），集群测试中单个Epoch执行花费6-7s左右。对每组实验配一块A100卡，我们很快就可以完成60组实验。在长时序单变量预测和长时序多变量预测这两个任务上，测试结果基本与论文所公布的MSE和MAE结果吻合，在某些参数上甚至跑出了更好的成绩。
​&lt;/p&gt;
&lt;h2 id=&quot;体验总结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%93%E9%AA%8C%E6%80%BB%E7%BB%93&quot; aria-label=&quot;体验总结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;体验总结&lt;/h2&gt;
&lt;p&gt;​
Informer作为今年AAAI的Best Paper之一，对Transformer模型进行了很多切实有效的改进，使其计算、内存和体系结构更加高效。同时，作者也做了完整的开源，代码结构清晰，笔者能够很流畅的对其进行复现。借助萤火平台，我们很快就拿到了全部的实验数据。
​
综合体验打分如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;研究指数：★★&lt;/p&gt;
&lt;p&gt;该模型着眼于长时间序列的预测问题，是一个广泛研究的基础课题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开源指数：★★★★★&lt;/p&gt;
&lt;p&gt;数据和代码都已开源，代码逻辑清晰可读性高。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;门槛指数：★★★★&lt;/p&gt;
&lt;p&gt;数据量小，模型计算、内存和体系结构均已优化，普通高性能PC即可运行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通用指数：★★★&lt;/p&gt;
&lt;p&gt;模型是对Transformer的优化，深入改进了自注意力机制，能适用于长序列预测场景，其他场景待验证。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;适配指数：★★★★★&lt;/p&gt;
&lt;p&gt;依赖简单，PyTorch框架构建的模型，只需要修改几行代码就能在萤火集群上执行。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;幻方 AI 紧跟 AI 研究的前沿浪潮，致力于用领先算力助力AI落地与价值创造，欢迎各方数据研究者与开发者们一同共建。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[3FS优化 03 | 数据读取模式适配]]></title><description><![CDATA[如文章《幻方力量 | 高速文件系列 3FS》中所介绍的，幻方AI设计了一套非常适合深度学习训练的样本读取文件系统，3FS，其采用Direct IO和RDMA Read的读取方式，让模型训练在样本读取部分只用极小的CPU…]]></description><link>https://www.high-flyer.cn/blog/3fs-4/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/3fs-4/</guid><dc:creator><![CDATA[Qiao]]></dc:creator><pubDate>Tue, 15 Sep 2020 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如文章&lt;a href=&quot;/blog/3fs&quot;&gt;《幻方力量 | 高速文件系列 3FS》&lt;/a&gt;中所介绍的，幻方AI设计了一套非常适合深度学习训练的样本读取文件系统，3FS，其采用Direct IO和RDMA Read的读取方式，让模型训练在样本读取部分只用极小的CPU和内存开销，就可以获得超高的读取带宽，从而无需再训练过程中等待加载数据，更充分地利用起GPU的计算性能。&lt;/p&gt;
&lt;p&gt;然而，实际应用中会有很多我们之前没有预料到的问题，比如任务间互相影响的问题，主要由任务不同的数据读取模式引起。本文将详细描述该问题的来龙去脉，以及我们的解决思路。&lt;/p&gt;
&lt;p&gt;我们知道，幻方AI的深度学习平台提供的是分时调度的深度学习训练服务，用户可以自由地在平台上配置资源，提交任务。对于集群来说，同一时间会有多个任务在计算集群中训练，从存储集群中拉取数据。不同任务的读取模式，处理方式彼此之间会造成一些影响。&lt;/p&gt;
&lt;p&gt;我们发现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果系统里只有一种任务，即使使用的存储节点再多，每个节点都能读到不错的性能；&lt;/li&gt;
&lt;li&gt;如果有不同读取模式的其他任务调度上去跑，即使3FS的总带宽并没有跑满，之前那些任务的读取带宽也会剧烈下降。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/dada3fe56ebd6e39094b98d7030b2c03/2813e/3fs_rdma.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 82.20858895705521%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAAQABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAUCAwYH/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAemxR1RqBIL/AP/EABoQAQEAAgMAAAAAAAAAAAAAAAECAxIAERP/2gAIAQEAAQUCpFqjsThhrbwpxmF3/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQMBAT8BR//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EACMQAAECBAYDAAAAAAAAAAAAAAEAAgMRITIQEiMxM0FCUWH/2gAIAQEABj8CATSCDL7gNI7v8W9qkI8bW2t9qKchq6doX//EAB8QAAEFAAEFAAAAAAAAAAAAAAEAESExQXFRgbHh8f/aAAgBAQABPyE4CGd3cYu1oFHUVoi5pBH1+Jzv1OYIrC8Uv10T2CdA3VMHzK//2gAMAwEAAgADAAAAEGcv/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAh/9oACAEDAQE/EDIF/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQIBAT8QV//EAB0QAQACAwADAQAAAAAAAAAAAAERMQAhQVFhcYH/2gAIAQEAAT8QDBES3WSL1nbWIeAPie4CxMoAGXhxvlEyohHUvxt9cbVeFprykNxT2yJ7eNNLJGr4fM//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;3fs_rdma.jpg&quot;
        title=&quot;3fs_rdma.jpg&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/dada3fe56ebd6e39094b98d7030b2c03/6aca1/3fs_rdma.jpg&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/dada3fe56ebd6e39094b98d7030b2c03/d2f63/3fs_rdma.jpg 163w,
https://hfai-static.high-flyer.cn/static/dada3fe56ebd6e39094b98d7030b2c03/c989d/3fs_rdma.jpg 325w,
https://hfai-static.high-flyer.cn/static/dada3fe56ebd6e39094b98d7030b2c03/6aca1/3fs_rdma.jpg 650w,
https://hfai-static.high-flyer.cn/static/dada3fe56ebd6e39094b98d7030b2c03/2813e/3fs_rdma.jpg 669w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，计算集群侧有两个计算任务同时从3FS中读取批次数据，训练模型。计算任务1的读取模式只能从3FS存储集群中一部分节点上读取数据，因为集群是负载均衡的，分散到每个节点上读数据大概占其带宽的2/3。计算任务2的读取模式可以从3FS存储集群中大部分节点上读取数据，负载均衡到每个节点上，那些支持了计算任务1的节点只剩下1/3的带宽给计算任务2用，导致那些没有支持计算任务1的节点就算带宽有富余也无法被利用起来。&lt;/p&gt;
&lt;p&gt;我们分析了受影响的计算任务1的读取模式，发现它读到的每个样本都很长，大约是 24MB 左右，而且每个 batch 都只从少量文件中读取数据。我们默认的块大小（chunk size）是 2MB，这个任务一个 batch 大约只从40个左右的存储服务节点中同时读取数据，而其他的类似计算任务2的任务几乎都能从接近60个，甚至是所有64个存储服务节点中同时读取数据。在单台存储服务节点总带宽有限的情况下，一个任务连接的存储服务节点少，则分到每单台存储节点的带宽需求就多。当多个任务在请求3FS读取数据时，满负荷下会造成部分任务的需求带宽无法满足的情况，进而影响了计算节点侧的数据读取性能。&lt;/p&gt;
&lt;p&gt;因此，对于任何任务从3FS上读取数据，要尽可能让64个存储服务节点能同时读取数据，进而降低单存储节点的带宽需求。我们把块大小缩小到 512KB，并且增加了一个文件分布到的服务器数目的控制，最终成功解决了这个问题。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[FFRecord | 高性能训练数据格式]]></title><description><![CDATA[在之前的文章《幻方萤火 | 高速文件系统 3FS》中提到，幻方AI自研了一套适合深度学习模型训练场景的文件读写系统，3FS，能提供高性能的批次数据读取，提高模型的训练效率。对于用户而言，使用3FS非常简单，只需要掌握我们封装设计的高性能数据格式，FFRecord…]]></description><link>https://www.high-flyer.cn/blog/ffrecord/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/ffrecord/</guid><dc:creator><![CDATA[小杞]]></dc:creator><pubDate>Mon, 27 Jul 2020 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在之前的文章&lt;a href=&quot;/blog/3fs&quot;&gt;《幻方萤火 | 高速文件系统 3FS》&lt;/a&gt;中提到，幻方AI自研了一套适合深度学习模型训练场景的文件读写系统，3FS，能提供高性能的批次数据读取，提高模型的训练效率。对于用户而言，使用3FS非常简单，只需要掌握我们封装设计的高性能数据格式，FFRecord，将数据存入萤火集群中即可。&lt;/p&gt;
&lt;p&gt;那么FFRecord和一般的数据格式有什么不同？它应该要有哪些设计要求呢？本期文章将为大家分享FFRecord设计背后的故事，讲述幻方AI设计FFrecord的理念，展现FFRecord的高性能和便捷。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;项目地址&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/ffrecord&quot;&gt;https://github.com/HFAiLab/ffrecord&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;转换指引&lt;/strong&gt;：&lt;a href=&quot;https://github.com/HFAiLab/ffrecord_converters&quot;&gt;https://github.com/HFAiLab/ffrecord_converters&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;概述&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A6%82%E8%BF%B0&quot; aria-label=&quot;概述 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;概述&lt;/h2&gt;
&lt;p&gt;我们知道，3FS专门针对&lt;strong&gt;模型批量读取样本数据&lt;/strong&gt;这个场景进行了深度的优化，和一般的文件系统不同，3FS 文件系统有如下的一些特点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;大量打开、关闭小文件的开销比较大；&lt;/li&gt;
&lt;li&gt;支持高吞吐的随机批量读取。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果要充分利用 3FS 文件系统的高效读取性能，我们希望读取的样本数据格式应该满足以下两个条件：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;能够知道每一条样本的文件偏移量，方便做随机批量读取；&lt;/li&gt;
&lt;li&gt;避免大量的小文件，所有的样本数据在一个或多个大文件里。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;然而，目前网上的开源文件格式，比如 TFRecord 等并不完全满足上面的两个条件。TFRecord 能够避免大量的小文件，但是只支持顺序读，而且每次只能读取一条样本。它在不需要随机访问样本的情况下能够获得优秀的性能；但在很多机器学习的场景下，用户训练模型时每一步需要随机采样多个样本。&lt;/p&gt;
&lt;p&gt;为此，我们专门设计了 FFRecord (Fire Flyer Record) 文件格式，其能够充分利用 3FS 文件系统的高效读取性能，其包括如下优势：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;合并多个小文件，减少了训练时打开大量小文件的开销，对存储后端更加友好；&lt;/li&gt;
&lt;li&gt;支持随机批量读取，提升读取速度；&lt;/li&gt;
&lt;li&gt;包含数据校验，保证读取的数据完整可靠。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以下是 FFRecord 文件格式的存储 layout:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;+-----------------------------------+---------------------------------------+
|         checksum                  |             N                         |
+-----------------------------------+---------------------------------------+
|         checksums                 |           offsets                     |
+---------------------+---------------------+--------+----------------------+
|      sample 1       |      sample 2       | ....   |      sample N        |
+---------------------+---------------------+--------+----------------------+&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;在 FFRecord 文件格式中，我们会把每一条样本的数据做序列化按顺序写入，同时我们会存储每一条样本在文件中的偏移量和对应的 crc32 校验和，方便我们做随机读取和校验数据。相比于 TFRecord 等格式，我们没有直接给用户提供序列化和反序列化的接口，而是把这一步交给用户，用户可以用自己喜欢的方式 (比如 &lt;code class=&quot;language-text&quot;&gt;pickle&lt;/code&gt;)去做序列化或者反序列化。&lt;/p&gt;
&lt;h2 id=&quot;ffrecord-转换规则&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ffrecord-%E8%BD%AC%E6%8D%A2%E8%A7%84%E5%88%99&quot; aria-label=&quot;ffrecord 转换规则 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;FFRecord 转换规则&lt;/h2&gt;
&lt;h3 id=&quot;转换文件数量和大小&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%BD%AC%E6%8D%A2%E6%96%87%E4%BB%B6%E6%95%B0%E9%87%8F%E5%92%8C%E5%A4%A7%E5%B0%8F&quot; aria-label=&quot;转换文件数量和大小 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;转换文件数量和大小&lt;/h3&gt;
&lt;p&gt;为满足最佳性能，FFRecord 的转换需要满足如下两个要求：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;每个文件不小于 256MB （512 x 512KB）&lt;/li&gt;
&lt;li&gt;满足条件1的情况下，文件数量尽可能大于100，小于200&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;转换方式对比&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%BD%AC%E6%8D%A2%E6%96%B9%E5%BC%8F%E5%AF%B9%E6%AF%94&quot; aria-label=&quot;转换方式对比 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;转换方式对比&lt;/h3&gt;
&lt;p&gt;FFRecord 中的数据通过二进制格式进行存储，有如下两种将图片数据转换为二进制数据的方法：&lt;/p&gt;
&lt;p&gt;方法 1：通过 pickle 转换为二进制&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;image = Image.open(fname)
data = pickle.dumps(image)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;方法 2：使用二进制格式读取文件&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;with open(img_file, &quot;rb&quot;) as fp:
    img_bytes = fp.read()&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;两种方法的性能性能对比：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;速度对比：方法 1 (pickle) 比方法 2 (二进制文件) 读取速度更快
&lt;ul&gt;
&lt;li&gt;方法 1 读取速度大约为 10 GB/s，方法 2 读取速度大约为 1GB/s&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;存储大小对比：方法 2 (二进制文件) 转换后文件体积更小
&lt;ul&gt;
&lt;li&gt;方法 1 的存储体积约为方法 2 的 5 倍&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;数据封装&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E5%B0%81%E8%A3%85&quot; aria-label=&quot;数据封装 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;数据封装&lt;/h3&gt;
&lt;p&gt;接下来我们介绍一下 FFRecord 的封装方式。FFRecord 文件的读写分别可以通过 &lt;code class=&quot;language-text&quot;&gt;FileReader&lt;/code&gt; 和 &lt;code class=&quot;language-text&quot;&gt;FileWriter&lt;/code&gt; 对象来完成。以下是一个简单的使用示例：&lt;/p&gt;
&lt;h4 id=&quot;数据写入&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E5%86%99%E5%85%A5&quot; aria-label=&quot;数据写入 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;数据写入&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; ffrecord &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; FileWriter

samples &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; i &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 准备写入的样本&lt;/span&gt;
fname &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;test.ffr&apos;&lt;/span&gt;
n &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;samples&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;                   &lt;span class=&quot;token comment&quot;&gt;# 样本的数量&lt;/span&gt;
writer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; FileWriter&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fname&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; i &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pickle&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dumps&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;samples&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 序列化&lt;/span&gt;
    writer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;write_one&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

writer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;close&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;FileWriter.write_one&lt;/code&gt; 方法会把传入的数据写到文件的末尾，然后在文件的头部写入这条数据在文件中的偏移量和对应的 crc32 校验和&lt;/p&gt;
&lt;h4 id=&quot;数据读取&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%95%B0%E6%8D%AE%E8%AF%BB%E5%8F%96&quot; aria-label=&quot;数据读取 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;数据读取&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; ffrecord &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; FileReader

fname &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;test.ffr&apos;&lt;/span&gt;
reader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; FileReader&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fname&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; check_data&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&apos;Number of samples: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;reader&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

indices &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;      &lt;span class=&quot;token comment&quot;&gt;# 样本的索引&lt;/span&gt;
data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; reader&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;indices&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 返回样本的原始数据&lt;/span&gt;
samples &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;pickle&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loads&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; x &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# 反序列化&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;FileReader.read&lt;/code&gt; 方法会先根据传入的索引找到每条样本在文件中的偏移量并计算出占用的字节数，然后调用 Linux Asynchronize I/O (AIO) 的接口同时处理多个样本的读取请求，把结果返回给用户。&lt;/p&gt;
&lt;h2 id=&quot;dataset-和-dataloader&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dataset-%E5%92%8C-dataloader&quot; aria-label=&quot;dataset 和 dataloader permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Dataset 和 DataLoader&lt;/h2&gt;
&lt;p&gt;PyTorch 本身提供了 map style 的 Dataset 和 DataLoader 的接口，然而它们的接口对需要批量读取的场景不是很友好，PyTorch Dataset 需要实现 &lt;code class=&quot;language-text&quot;&gt;__getitem__&lt;/code&gt; 方法，该方法传入一个样本的索引并返回一条样本，这样如果我们希望批量读取多个样本就会比较困难。为了让 PyTorch 用户更加方便的使用 FFRecord 读取训练样本，我们提供了&lt;strong&gt;定制的 FFDataset 和 FFDataLoader&lt;/strong&gt;。FFDataset 同样需要实现一个 &lt;code class=&quot;language-text&quot;&gt;__getitem__&lt;/code&gt; 方法，但这个方法接受一个 batch 的样本索引作为输入，返回一整个 batch 的样本。FFDataset 可以搭配 FFDataLoader 一起使用，实现多进程异步加载数据。&lt;/p&gt;
&lt;p&gt;以下是一个简单的使用示例：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; ffrecord&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;torch &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Dataset &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; FFDataset
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; ffrecord&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;torch &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; DataLoader &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; FFDataLoader

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ImageNet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;FFDataset&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fname&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; transform&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; FileReader&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fname&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; check_data&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;transform &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; transform

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__len__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reader&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;n

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__getitem__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; indices&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;reader&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;indices&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        samples &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; bytes_ &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            img&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; label &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pickle&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loads&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;bytes_&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;transform&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                img &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;transform&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            samples&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;append&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;img&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; label&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; samples

dataset &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ImageNet&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fname&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; transform&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
loader &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; FFDataLoader&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dataset&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; batch_size&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; shuffle&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; num_workers&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;性能测试&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95&quot; aria-label=&quot;性能测试 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;性能测试&lt;/h2&gt;
&lt;p&gt;我们在 3FS 存储集群上进行了性能测试，以读取 ImageNet 数据集为例，比较如下两种数据读取方式的性能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大量小文件 + PyTorch DataLoader；&lt;/li&gt;
&lt;li&gt;FFRecord + FFDataLoader。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为了模拟在分布式训练模型时候的读取模式，我们会起 8 个互相独立的进程，每个进程有自己的 DataLoader，然后每个 DataLoader 会再开 16 个子进程 (num_workers = 16)，batch size 设为128，然后我们统计每个 DataLoader 读取 1000 个 batch 的时间并取平均。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/0ab0e137ffd20cedc5dee4a2f3640c32/ef3e1/image.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 33.74233128834356%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAAA80lEQVQoz22RTU/DMAyG+///CkfEAY4cuYyPaUM7tgxpSBS6tflwbL/ISVutopFe6Y3j2E+cioggImDmrJTS7NdEAiTRRczu21JVVFbQjAWnwpNfiBkKwDdbxO+P7EWWBW1VIYSZzGQNrveTmCKSUWxvIc0me06Uz6wZVNcIddQaYYJxyP4B8vlWPCewAnr5wu+pQXfuUcUYR3RBDB79ucv+3/wSgY1qfw8+vhaf6TkXphhzXiE0AntOW0Ofb+bua4TY3QHHlzGHi65nOAwDvPfwkdCdarS7RwwhwTtX4rMcek9oD0/4qd/hAuWYcy6TTb/8B5qJIz2v33hCAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/0ab0e137ffd20cedc5dee4a2f3640c32/a6d36/image.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/0ab0e137ffd20cedc5dee4a2f3640c32/222b7/image.png 163w,
https://hfai-static.high-flyer.cn/static/0ab0e137ffd20cedc5dee4a2f3640c32/ff46a/image.png 325w,
https://hfai-static.high-flyer.cn/static/0ab0e137ffd20cedc5dee4a2f3640c32/a6d36/image.png 650w,
https://hfai-static.high-flyer.cn/static/0ab0e137ffd20cedc5dee4a2f3640c32/ef3e1/image.png 759w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;上图展现了我们实验得到的结果，从图中我们可以看到使用了 FFRecord + FFDataLoder 后速度能够得到明显的提升。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[hfreduce | 高性能的多卡并行通信工具]]></title><description><![CDATA[hfreduce 是幻方AI自研的高性能的多卡并行通信工具，是幻方“萤火二号”计算存储分离后，计算服务中的重要一环，根据萤火二号的集群特性专为计算节点设计的 allreduce 工具。
​
本质上 hfreduce 相当于 PyTorch…]]></description><link>https://www.high-flyer.cn/blog/hf-reduce/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/hf-reduce/</guid><dc:creator><![CDATA[High-Flyer]]></dc:creator><pubDate>Wed, 04 Mar 2020 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;hfreduce 是&lt;strong&gt;幻方AI自研的高性能的多卡并行通信工具&lt;/strong&gt;，是幻方“萤火二号”计算存储分离后，计算服务中的重要一环，根据萤火二号的集群特性专为计算节点设计的 allreduce 工具。
​
本质上 hfreduce 相当于 PyTorch 中的 DistributedDataParallel（DDP），只不过&lt;strong&gt;使用 CPU 做加法运算以计算总梯度&lt;/strong&gt;，而不是调用其他的集体通信库（CCL），比如说 NCCL，传递梯度到不同的显卡上，再各自计算总梯度。&lt;/p&gt;
&lt;p&gt;为什么要这么设计呢？本期文章将为大家解密，详细介绍幻方AI设计 hfreduce 的背景与理念。文章会阐明 hfreduce 对模型训练整体加速的效果以及具体适用的场景。
​&lt;/p&gt;
&lt;h2 id=&quot;背景&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%83%8C%E6%99%AF&quot; aria-label=&quot;背景 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;背景&lt;/h2&gt;
&lt;p&gt;幻方AI之所以采用 CPU 来做加法运算，计算总梯度，是因为萤火二号上的计算节点配置比较特殊。&lt;/p&gt;
&lt;p&gt;幻方的主要AI场景是金融行为分析、自然语言处理、生物分子结构预测等。在这些场景中，基本是&lt;strong&gt;数据规模大而模型大小适中&lt;/strong&gt;。换句话说，在A100显卡40G的显存中，完全可以装得下一个完整的模型和批次样本数据。因此，模型的加速主要是依赖大量的数据并行，让尽可能多的显卡参与训练，再同步梯度。&lt;/p&gt;
&lt;!-- 以萤火二号中部署的机器来说，每个节点（机器）配备了8张A100显卡。幻方AI一般一个训练任务可以用到10个以上的节点进行多机多卡并行训练加速。 --&gt;
&lt;!-- 正是因为上述**数据并行的应用场景**，我们并没有让萤火二号中的机器上配备NVLink，而是安装了 PCIe 版本的 GPU。NVLink 的带宽比 PCIe 高了一个数量级，可以有效提升 GPU 之间通讯的效率，其非常**适合一张显卡放不下的超大参数模型在多卡上做模型并行**，而对于我们而言，NVLink的用处并不是很大。对于NCCL来说，尤其是比较新的版本，英伟达针对 NVLink 和多 IB 卡的部署做了不少优化，在 DGX A100 上可以如鱼得水地进行飞速地运算，但是对于萤火二号集群部署的机器而言则显得有些水土不服。 --&gt;
&lt;p&gt;正是因为上述数据并行的应用场景，随着集群规模不断变大，我们发现使用 NCCL 进行多 GPU 之间的集体通信，梯度信息多次在 PCIe 上遍历就会成为一个性能瓶颈。
​
此外，我们无法使用在交换机上做加法运算计算梯度的方法，因为萤火二号集群中会同时运行大量的训练任务，它们各自需要做reduce以计算总梯度，而交换机之前并不支持在同一个网络内进行如此多路的reduce计算。
​&lt;/p&gt;
&lt;h2 id=&quot;框架设计&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1&quot; aria-label=&quot;框架设计 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;框架设计&lt;/h2&gt;
&lt;p&gt;近些年深度学习模型逐渐尝试更大的参数空间来处理大规模的数据，使用多个GPU一同加速训练成为很多AI从业者的必然选择。NCCL是英伟达发布的用于实现多GPU之间集体通信的工具，在PCIe，NVLink上可以实现较高的通信速度。NCCL借助CPU，可以传播，计算不同显卡上的梯度信息，对并行训练中的多个显卡进行梯度信息的同步。在有NVLink的条件下，在同节点不同显卡内做reduce计算对 NCCL 来说轻而易举，但如果没有NVLink，梯度信息多次在 PCIe 上遍历就会成为一个性能瓶颈。&lt;/p&gt;
&lt;p&gt;既然我们是因为没有 NVLink 而放弃了 NCCL，那么把梯度数据都先拷贝到主内存里然后在 CPU 上做加法运算计算总梯度也就是很自然的事了，因为这样可以避免梯度数据在多个 GPU 之间进行多次拷贝。hfreduce 首先从所有并行的GPU里一次性收集梯度信息，然后在CPU里进行reduce计算，完成后将计算出来的梯度一次性广播到所有 GPU，从而将 PCIe 流量减半。 此外，CPU 只用于将所有梯度信息相加汇总，与 NCCL 不同，免去了在 GPU 上再计算梯度的开销。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 551px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/cb0458c47e58e82ab1729da050b7d9f4/db783/p0.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 73.00613496932516%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC/klEQVQ4y2WTi08bRxDG/d9XqlArNU2LKpHQpE1KE0oDeeCGEhww+M3Z2L7zvX1vv87G79rYv8oXmSTwSaPdnf3mm53Z3Rh3sFwuI1uh0XVJqse0+y79UZOU6aE2ApaL+S33LmJr51roS0HNL7N19j2KV8Nu2mynRFKawvJmyvJOzFoj9mWmz4RP2USjzL/pLM/iCo/f1DlMZikqecbT8b1q1mPsruMTFpFJuoflWfhNBy8ym7JiM5/NVhFften2hOvF4mZB3jyn6mYpOS2ypoffajCeXt8GTmcjvGZA0fEp2E3koEhKP2H23/S+4M18zv7lcxLSHu8lnd2CRCJnYjVsFoubiNO5DjjO6LzMyLwua6S1OH9mHzGZDO8LjsYDRCND1cyTLmfYPSqyuWeRl9RVuohjeCY/7Zq8eF/htJDmSisgmik6vcbXl7LCfD6n0wuouy6279PuBrRCj14/vC15MOrT6rgRz2v66LZLu+sxmU4+P5vBuMfK+qMeN4shZ8KAkjJgsRgynAwYTfqMJgPG09X6OprP5kPsxoDj3Gp/yGhyzWDUpT/qEgtCC6ej4ocmbqjy90nAcd7F78n4YR27rRD2m/QGHeqtWuTzuwo5yWbnnwaar+N3dbzQxOsYxM7kI35NPeRcPeJx+gGdtobi5thMbnBpJfkx8Q1uxyS8brF5ukFa/8Cjix8Q6qeELY1dYZt45S/2hKccFHeImYHIlZamVhco1ZL8dlFhPy9QlpPUrBKCck6z60R9K6oXyFaJsnpB4qrAz4kKJTlF1chTMXJI9QIxwTgnLuySVRK8y+9wIkl8qOZ4k3+GoCd5XfgDp6XRDN1ontc+cnj5glMxSbwic1R8xZkYJ1F9G42xE/GA3zMPOZFe8ST9ALdVpGJ/ZOv8Oy7UQ345+zb6017LYCu5wal8EPEy2iFBu8TLwhZvr56zJ2yzf/mUmOWrmK6E4YhYXg3FKqPaFSxPRndEDKdK0HZohwGGXcVwRepeDd2pIltl6q4Uxa81/geSz0POXEZ0pQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/cb0458c47e58e82ab1729da050b7d9f4/db783/p0.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/cb0458c47e58e82ab1729da050b7d9f4/222b7/p0.png 163w,
https://hfai-static.high-flyer.cn/static/cb0458c47e58e82ab1729da050b7d9f4/ff46a/p0.png 325w,
https://hfai-static.high-flyer.cn/static/cb0458c47e58e82ab1729da050b7d9f4/db783/p0.png 551w&quot;
        sizes=&quot;(max-width: 551px) 100vw, 551px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，与 NCCL 一样，我们也采用两棵树的拓扑结构进行节点间的通信。 对于节点比较多的情况，它能比环形拓扑更好，因为节点之间的对数距离会更短。 我们设计让树结构更加平衡一些，所以理论上它能比 NCCL 的树结构稍微快一些。&lt;/p&gt;
&lt;p&gt;在CPU 上的加法运算也进行了精心设计。 所有加载到内存中的梯度信息都在 NUMA 节点之间进行交互，绑定到 CPU 内核的线程从同一个 NUMA 节点中挑选出梯度数据并将它们相加。 AUX 256 指令优于 AUX 512 指令，因为 AMD CPU 不支持后者，如果所有内核都在执行指令，则会导致 CPU 频率受限。&lt;/p&gt;
&lt;p&gt;由于所有的加法运算都是在 CPU 内核上执行的，我们观察到内存带宽是瓶颈，而不是CPU的算力。 因此，建议使用更大的样本批次，因为读取它们可能会减少内存带宽的竞争。 PCIe 的宽松排序可能会提高Reduce的性能，但实际上更快的Reduce可能会减慢样本读取的速度，从而减慢整个训练的速度。 Reduce的性能很重要，但就目前来说，该方案仍然只是一个局部最优解。
​&lt;/p&gt;
&lt;h2 id=&quot;使用案例&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E4%BD%BF%E7%94%A8%E6%A1%88%E4%BE%8B&quot; aria-label=&quot;使用案例 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;使用案例&lt;/h2&gt;
&lt;p&gt;我们给hfreduce设计了Python的接口，使其可以轻松地加入 PyTorch 的训练中。 该库能自动处理节点地址交换、梯度归零和梯度的最终平均。 更重要的是，该库能在模型代码中直接嵌入，以便在计算梯度后立即开始Reduce计算。 hfreduce的使用基本上就像创建一个 Reducer 实例一样简单。​&lt;/p&gt;
&lt;p&gt;具体的，在萤火二号上训练模型时，可以参考如下案例代码：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; hfreduce&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;torch &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; hfr

model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;cuda&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
loss &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Loss&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
optimizer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Optimizer&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

reducer &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; hfr&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;AsyncReduceFloat&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;registry_host&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; port&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; proc_rank&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; procs_per_node&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; node_rank&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; node_cnt&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; sample &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; sampels&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    reducer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;zero_grad&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# instead of optimizer.zero_grad(), call reducer.zero_grad()&lt;/span&gt;
    
    model&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sample&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    loss&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;backward&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    
    reducer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;synchronize&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    
    optimizer&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;step&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;性能测试&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95&quot; aria-label=&quot;性能测试 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;性能测试&lt;/h2&gt;
&lt;p&gt;我们使用 PyTorch 内嵌的 VGG16 模型进行实验，测试hfreduce的性能。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 641px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/3f591064daedf3efbe88a50c54db1ca2/c7dcc/p1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 60.73619631901841%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAACUUlEQVQoz1WTWU8UQRSF53/65gsiChoTwCVigvhgxvAgRoMsDtHBQURRkEEkjpiwKEjEAFGCKAkRZmN6mV6mq+ozVc0Q6KS6zz331qnTVbcSUkp830cphcZSRPFXx0IgpYhxnZMxVmBGnTexUiT0SwiBOlGkuVOxxpozI+al7yCD6lFeINyyqTOCQRAgAWEX8VffGle6MNj4SG13zWA9wc12I0Mf/VRz/XhLIwYLp4T1tAUZuCSiKCIMApOI9rewhy6YFfXjjN/GX8zEuco+1pNGVOibBdzZh/gLaZOr2SWswYZY0HEcfM+LV8r/xhlpNw6Ni2w3/vJrg3EL2M8uIYK4Npp7THV+OM7VKtip87Gg67p4XtXwwb9t7OetxqHeAmcySbDyCi2/92eXylAzqJCfJVhPd6NWMoTAwtdtygPnUEGVhDkQUWPvUNLTN4s13GrEXyw6fEheh823FCNou5ejMHhRe2MgZzF0qwPWRzmUcCU5x0FvA4RVEvrIQfC3KLiZnMLKtBvB3pky411X4dfksWAx1WJq0/MumTudsD6GBXQ8mCff1wg17VC3hAjYKQjau95QSTUZwZ5smZc3mmFjjHwETZ0z5B+dNQ77czapa23wPc2hgst3P3Fw/wyELol4VxVlVzCd28BbfWeYpa0qa+8nIL+JK2Ait4X9RR+Q5NuOz/J0FvZ/4CuY+rxNZWEURC0WVOa369IgT8R1VkYBnjjNyuMZdUzc2HVRfa3qPRgJRals4do2urUKxRKuXcG3yoSR0BP0FTm6fgpkzP0HiL91j82sNMAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/3f591064daedf3efbe88a50c54db1ca2/c7dcc/p1.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/3f591064daedf3efbe88a50c54db1ca2/222b7/p1.png 163w,
https://hfai-static.high-flyer.cn/static/3f591064daedf3efbe88a50c54db1ca2/ff46a/p1.png 325w,
https://hfai-static.high-flyer.cn/static/3f591064daedf3efbe88a50c54db1ca2/c7dcc/p1.png 641w&quot;
        sizes=&quot;(max-width: 641px) 100vw, 641px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如上图所示，hfreduce整体耗时更少，明显比没有NVLink的NCCL更快。 使用 PyTorch 进行模型训练，即使在后台使用 PyTorch DDP 调用 NCCL 进行 allreduce，hfreduce 仍然胜过 NCCL。
​&lt;/p&gt;</content:encoded></item><item><title><![CDATA[3FS优化 02 | 客户端内存使用优化]]></title><description><![CDATA[如文章《幻方力量 | 高速文件系列 3FS》中所介绍的，幻方AI设计了一套非常适合深度学习训练的样本读取文件系统，3FS，其采用 Direct IO 和 RDMA Read 的读取方式，让模型训练在样本读取部分只用极小的CPU…]]></description><link>https://www.high-flyer.cn/blog/3fs-2/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/3fs-2/</guid><dc:creator><![CDATA[Qiao]]></dc:creator><pubDate>Wed, 04 Dec 2019 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如文章&lt;a href=&quot;/blog/3fs&quot;&gt;《幻方力量 | 高速文件系列 3FS》&lt;/a&gt;中所介绍的，幻方AI设计了一套非常适合深度学习训练的样本读取文件系统，3FS，其采用 Direct IO 和 RDMA Read 的读取方式，让模型训练在样本读取部分只用极小的CPU和内存开销，就可以获得超高的读取带宽，从而无需再训练过程中等待加载数据，更充分地利用GPU的计算性能。&lt;/p&gt;
&lt;p&gt;我们知道，文件系统一般分为客户端与服务端。在3FS文件系统中，客户端部署在计算节点侧，通过网络访问部署在存储节点侧的3FS服务端。这个过程中有很多问题值得优化。本期文章将和大家聊聊，客户端的&lt;strong&gt;内存使用优化&lt;/strong&gt;的问题。&lt;/p&gt;
&lt;p&gt;幻方AI的深度学习平台是计算存储分离的，计算集群只负责计算，无论是数据读取、模型加载还是梯度 reduce 等都需要通过网卡传入内存再传入显存，中间需要进行多次内存拷贝，对内存带宽的使用非常严重。如果能有效优化内存的使用，将对模型训练的性能带来极大的提升。&lt;/p&gt;
&lt;h2 id=&quot;概述&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E6%A6%82%E8%BF%B0&quot; aria-label=&quot;概述 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;概述&lt;/h2&gt;
&lt;p&gt;3FS的客户端是指部署在计算节点侧的3FS，其作用是与服务端的3FS通过网络联通，从服务端请求数据并解析。对于幻方萤火二号集群来说，集群里的每台机器上有一张高速网卡，对于一般的文件系统，我们来看一下每秒钟读取23.5GB数据所需的内存开销：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;从网卡读到内核态内存：一次内存写入&lt;/li&gt;
&lt;li&gt;从内核态读到 Page Cache，一次内存读取一次内存写入&lt;/li&gt;
&lt;li&gt;从 Page Cache 读到用户态内存：一次内存读取和一次内存写入&lt;/li&gt;
&lt;li&gt;另外，由于内核里面不支持Non-temporal store的寄存器指令，写入时还需要多出一到两倍的内存读取。详情参见&lt;a href=&quot;http://sites.utexas.edu/jdm4372/2018/01/01/notes-on-non-temporal-aka-streaming-stores/&quot;&gt;这里&lt;/a&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如上所述，如果我们想要达到23.5 GBps的读取性能，需要消耗每秒 &lt;code class=&quot;language-text&quot;&gt;23.5 * 6~7 = 141~165GBps&lt;/code&gt; 的内存带宽。&lt;/p&gt;
&lt;p&gt;而现在市面上最先进的训练平台，比如双路AMD Epyc Rome/Milan的总内存带宽在&lt;code class=&quot;language-text&quot;&gt;270GBps~330GBps&lt;/code&gt;之间，双路Intel Cascade Lake平台的总内存带宽更是只有220GBps左右，也就是说，对于一般的文件系统，光是读取数据所消耗的内存带宽就要占掉机器总内存带宽的&lt;code class=&quot;language-text&quot;&gt;50%~70%&lt;/code&gt;！而我们在使用这些机器的时候，显然只有数据是不够的，如果IO占了这么多带宽，那么留给计算和通信的资源就少了。&lt;/p&gt;
&lt;p&gt;因此减少内存拷贝操作、降低内存开销，是我们优化3FS客户端性能的重点方向。我们采用&lt;strong&gt;RDMA Read&lt;/strong&gt;的技术来解决该类问题。&lt;/p&gt;
&lt;h2 id=&quot;rdma-read&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#rdma-read&quot; aria-label=&quot;rdma read permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;RDMA Read&lt;/h2&gt;
&lt;p&gt;我们&lt;strong&gt;通过 RDMA Read 到用户态内存的方式&lt;/strong&gt;来进一步避免内核态到用户态的内存拷贝。如前文给出的例子，使用 RDMA Read 之后，读数据的操作变为一步：从网卡直接读到用户态内存，也就是说，读满 23.5GBps 的网卡，只需要消耗 23.5GBps 的内存带宽，占总内存带宽的 10% 不到。&lt;/p&gt;
&lt;p&gt;我们选择了计算节点侧发起 RDMA Read ，而不是从存储节点侧做 RDMA Write。这是因为3FS的批量读取导致同一网络上的读取请求可能对应了很多应用的 Buffer，而 RDMA Write 不支持分发到接收方的多个地址，这意味着在单个读取长度很小的时候，会产生很多很小的 RDMA 请求，以至于显著影响读取的带宽。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/9ce94dbce3caaf40da101fd4b29597a8/07108/image.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 110.42944785276075%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAYAAADAQbwGAAAACXBIWXMAAAsTAAALEwEAmpwYAAAENUlEQVQ4y42Uy28bVRSH8wewZMMGIbFjyaYsWPIPAEIgwaZiUdruESpigSAVKJSKKLQBWjVxk7Zpk/oRN3HiRxu7zsPxI/aMPbYz9vgx9viRxMFOYsdp/KGZlqihDXCl3z33zsz5dO+Zc05fr9fD0OHhkW3F1mhGY+xIEm1VZS+Xo53Psely0YxEaIbD7G826AGHf/s9Ux8vGdt2Mw37LA2bje05Jxu3xtmauovaf5HGtJ2m+xG9rcYLfgZQn6rVKuVyGU3TqFQqVLQyJXkdrVikUtYMWy4UKKZSqLJMMZVGlbNUazXDp1QqUavVDGhfp9Nhfn6ebDZLMpkkEomwtrZGWFckQigcNhSNRpEkESkuICVEEnGBcDhEPB43fJ1OJ/v7+/Tt7e0hCIJBbzabpFJJBFEkpyjGh5lM1lhHYiIz3gCzviAz3lXciyEkKWncSB86o91u06dP4XDYeFivb+B0zHDp0gBDV64yOPgrQlyinE1x+hcbr33p5FT/AqcuennlnJnrZhcVNW/46jc7AuobfWhamVgsRmh1GZvNxtzcPEk9XtkUX4/M8d6Ah/d/dvHh4ALvfjfLhMNLWS2cDKxvbJOQ1knLeTJKETlbQEplkFJZpESSTDrF4OVLTN69QzadIBEXKRReBlyLQnebzlaarVKUjUKQen7VkL7eKISMdWd3E5f7IbIs0z04oNVq0e12XwTqf6sq3CQwfYFN8Rpb63Y25Vm2Mg4aWQebsoO6dI/DqofHfr+RYs/n3nFgp0NwNUAjeYuEp598dAJBTGK12LFYppmYuI912okkSbQKbnzeBVS1ZED0KtF1DKjn4crKMpStoJpoyWYEMYHP68Pz8BFu90Me+1eQ4jF2ih58Pu8RUD/dCcAVeqqZnjLCE2WcljzJrmJhL2ehnbeyq1hppW9zWJnH6/UalfHfwJKFnjIK+THImyA/+pxMoFwHA+j7P8BlKE1BbgTyNznMmXiSGz2Svu8pN+hpsyws6DFUT46hPgVDIbolJx3ZRFe5A8X7oOoxtRzZtmzioL6Ef2mFslZ5odMcA+rNAHq0/qyhFbN4wm7Gl6aYWDYztjjJTMBBtbgO+y1sU3cRQiv09nep12vs7Oy8rFKe1nK1vkEiGuftsbO8MXuatx6c4U3HGV4f/QjzvJerVj/nv7/ChaHb/Gb1shQIkssp/1LLFY2kmOC8/Sc+dn3L5+4f+cTVz7npb/jgh0le/crLOwOrnBoI0nfGxvCUi7qmngwslcqIosA90xjXhv5gZPgGvw8O89jhYuj+Ap8NOjg77OSLYRefXn6A3eOnmP/HCfV++DSGGPHIZDKEwiGWA8v4FxcJBFcR4gkqpQJaPkP5mWpFhUJOoVavG746wwDqxa0nayqVMjq2KIokJMkoNSn51OpdORqLEY0Jx6S3Ov19Op3G5/NxcHDAXzHmC0HzlRNyAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/9ce94dbce3caaf40da101fd4b29597a8/a6d36/image.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/9ce94dbce3caaf40da101fd4b29597a8/222b7/image.png 163w,
https://hfai-static.high-flyer.cn/static/9ce94dbce3caaf40da101fd4b29597a8/ff46a/image.png 325w,
https://hfai-static.high-flyer.cn/static/9ce94dbce3caaf40da101fd4b29597a8/a6d36/image.png 650w,
https://hfai-static.high-flyer.cn/static/9ce94dbce3caaf40da101fd4b29597a8/e548f/image.png 975w,
https://hfai-static.high-flyer.cn/static/9ce94dbce3caaf40da101fd4b29597a8/3c492/image.png 1300w,
https://hfai-static.high-flyer.cn/static/9ce94dbce3caaf40da101fd4b29597a8/07108/image.png 1619w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;然而需要注意的是，读取的数据要做对齐，RDMA Read 并不是简单地把读到的数据填到用户的 Buffer 里，而是需要把存储节点侧对齐用的数据读到内核中分配的 padding buffer 里，在计算节点侧对齐后再丢弃掉。在测试性能的过程中我们发现，不同大小的 RDMA Read 请求会互相影响：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个请求过小，比如只读几个 KB，效率不高；&lt;/li&gt;
&lt;li&gt;每个请求太大，一次读取几个 MB，在网络繁忙的时候效果也并不算好。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们把小的请求合并起来，把大的请求拆开，最后定在每个 RDMA 读64KB 左右，收获了不错的效果。&lt;/p&gt;
&lt;h2 id=&quot;小结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%B0%8F%E7%BB%93&quot; aria-label=&quot;小结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;小结&lt;/h2&gt;
&lt;p&gt;本文介绍了幻方AI在设计3FS文件系统时，针对客户端内存使用优化的一些思考。我们采用 Direct IO 和 RDMA Read 的读取方式，让服务端的数据通过网卡直接加载到用户态内存中，减少内存带宽的占用，让模型训练在样本读取部分只用极小的CPU和内存开销，就可以获得超高的读取带宽，从而无需再训练过程中等待加载数据，更充分地利用GPU的计算性能。&lt;/p&gt;
&lt;p&gt;3FS能跑出这样的性能也不是一蹴而就的，幻方AI在长期实践中对其不断优化，遇到了不少挑战。本系列文章将陆续为大家分享一些有关3FS性能优化的小故事，作为抛砖引玉，其中还不乏我们踩过的坑。欢迎业界的学者专家们一起探讨。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[3FS优化 01 | 服务端优化]]></title><description><![CDATA[如文章《幻方力量 | 高速文件系列 3FS》中所介绍的，幻方AI设计了一套非常适合深度学习训练的样本读取文件系统，3FS，其采用 Direct IO 和 RDMA Read 的读取方式，让模型训练在样本读取部分只用极小的 CPU…]]></description><link>https://www.high-flyer.cn/blog/3fs-1/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/3fs-1/</guid><dc:creator><![CDATA[Qiao]]></dc:creator><pubDate>Sun, 17 Nov 2019 11:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如文章&lt;a href=&quot;/blog/3fs&quot;&gt;《幻方力量 | 高速文件系列 3FS》&lt;/a&gt;中所介绍的，幻方AI设计了一套非常适合深度学习训练的样本读取文件系统，3FS，其采用 Direct IO 和 RDMA Read 的读取方式，让模型训练在样本读取部分只用极小的 CPU 和内存开销，就可以获得超高的读取带宽，从而无需再训练过程中等待加载数据，更充分地利用起 GPU 的计算性能。&lt;/p&gt;
&lt;p&gt;我们知道，文件系统一般分为客户端与服务端。在 3FS 文件系统中，客户端部署在计算节点侧，通过网络访问部署在存储节点侧的 3FS 服务端。这个过程中有很多值得优化的问题。本期文章将和大家聊聊，服务端的优化问题。&lt;/p&gt;
&lt;p&gt;为了减少内存拷贝，提高读取吞吐，3FS 服务端的主要操作是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用 Direct IO 来做读取，减少了磁盘到 Page Cache 的拷贝&lt;/li&gt;
&lt;li&gt;使用 AIO 接口提高读取吞吐&lt;/li&gt;
&lt;li&gt;在客户端进行数据对齐，简化接口使用&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;direct-io&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#direct-io&quot; aria-label=&quot;direct io permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Direct IO&lt;/h2&gt;
&lt;p&gt;Linux 提供两种文件 IO 模式，分别是 Buffered IO 和 Direct IO。Buffered IO 使用内核提供的 Page Cache 缓存磁盘上的数据，可以为多次访问的数据带来显着的性能优势。但对深度学习训练来说，每一次迭代读取的都是新数据，缓存失去意义，Page Cache 反而成为了负担。所以 3FS 服务端会默认使用 Direct IO 进行数据读取，绕开 Page Cache 以减少一次数据拷贝，直接从磁盘读数据到用户态内存，同时也规避了 Page Cache 的高内存占用。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 650px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/cadd2efa3bf4afae8b819de766cc92d2/a4c31/image.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 80.3680981595092%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB/ElEQVQ4y41Ui46jMAzs//9gW1oeXWApfQAhvEOY07hND2510iJFuPZ44rFxdwCwLAumaYIxZvOe5xkuzuP87rjfjDncjgaduq7lPY6jHNqN1rhcIiRJgiSO0bTtT0zTwEzTltBYC1Vr9OMIrTXatkXf93g+n/C8I76SBJc4RlUp8dd1Dd00gq+1hlkp2Y15hiEKMCYxhmuGMAxFCp+269BpDTzumPMrrH0lVkqhTGKMaYw+S2GIcYR2GDBpDXW/QReFELKK8V1trRQwjjBNg2WxkqhYYVUBw4C577G8C/hInpcFWZ4jiCLp2eFwgNa1SKN8Ab8ThFCpjR+rmBBSStd1Upnv+2jbRmSXZYk8zzeT5rO5aOX/W+E8y7QICoLgM5jH44Esy+Sy6T3JXxESTMBiLaIoxOl8RhgG8ANfQK6nvya01mIYBjmUSpk8L//rm6PtEln1/X7f9G7TQ0rmra6Pt9tNCNl8pSqUZSFxHsYZI4YF0Gf+nbJsitZCzGqcjJPn4XTyEMdfMiw/CCR5vYrte3v+K5mklHS9XgXEJDvbz94Sm6apxIllxfRtV88YmTIJWSE/F5JyrSibK1hVldiMF0UhGNqskHk/JBPMt7vxO02x3+9lc87+GUfviDCKZEtctSQk2XriO2e4fw8HpBwSu7ezSbbGujY4wj+yitnJlJkByQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/cadd2efa3bf4afae8b819de766cc92d2/a6d36/image.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/cadd2efa3bf4afae8b819de766cc92d2/222b7/image.png 163w,
https://hfai-static.high-flyer.cn/static/cadd2efa3bf4afae8b819de766cc92d2/ff46a/image.png 325w,
https://hfai-static.high-flyer.cn/static/cadd2efa3bf4afae8b819de766cc92d2/a6d36/image.png 650w,
https://hfai-static.high-flyer.cn/static/cadd2efa3bf4afae8b819de766cc92d2/e548f/image.png 975w,
https://hfai-static.high-flyer.cn/static/cadd2efa3bf4afae8b819de766cc92d2/3c492/image.png 1300w,
https://hfai-static.high-flyer.cn/static/cadd2efa3bf4afae8b819de766cc92d2/a4c31/image.png 2073w&quot;
        sizes=&quot;(max-width: 650px) 100vw, 650px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;aio&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#aio&quot; aria-label=&quot;aio permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;AIO&lt;/h2&gt;
&lt;p&gt;AIO 是 Linux 提供的异步 IO 接口，它支持应用提交多个异步 IO 操作在后台并发执行，并在前端同步地等待操作完成。AIO 目前仅支持以 Direct IO 方式打开的文件。相较于传统的同步 IO 接口，AIO 可以在更低的 CPU 占用下提供更高的读写吞吐。幻方 AI 的深度学习训练框架中默认使用 AIO 接口进行训练样本数据的读取。此外，对于读取大小超过阈值的同步读取操作（阈值默认 1MB），3FS 的客户端会将其转为 AIO 操作以提高读取性能。同时我们也正在适配内核新提供的 io_uring 接口，相信可以带来进一步的性能提升。&lt;/p&gt;
&lt;h2 id=&quot;对齐&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%AF%B9%E9%BD%90&quot; aria-label=&quot;对齐 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;对齐&lt;/h2&gt;
&lt;p&gt;Direct IO 在使用上有一个很大的限制，它需要 buffer 的内存地址、每次读取的 size 以及 offset 均与底层设备的逻辑块大小对齐，一般是 512 字节对齐。为了提高接口的易用性，3FS 的客户端会对 AIO 读取操作进行必要的对齐，它会在 buffer 的头部和尾部增加额外缓存以实现 512 字节对齐，并在 RDMA Read 接收数据时忽略掉头部和尾部。这样就实现了以下两种效果：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用户的 AIO 操作不再需要对齐，使用上更简单&lt;/li&gt;
&lt;li&gt;用户的同步 IO 操作可以在客户端直接转为 AIO 操作而不需要考虑对齐和 O_Direct，提高性能&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;小结&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%B0%8F%E7%BB%93&quot; aria-label=&quot;小结 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;小结&lt;/h2&gt;
&lt;p&gt;本文介绍了幻方AI在设计3FS文件系统时，针对服务端优化的一些思考。我们采用 Direct IO 和异步对齐的读取方式，让服务端的数据加载更符合模型训练的使用场景，从而获得更好的读取性能。&lt;/p&gt;
&lt;p&gt;3FS能跑出这样的性能也不是一蹴而就的，幻方AI在长期实践中对其不断优化，遇到了不少挑战。本系列文章将陆续为大家分享一些有关3FS性能优化的小故事，作为抛砖引玉，其中还不乏我们踩过的坑。欢迎业界的学者专家们一起探讨。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[幻方力量 | 高速文件系统 3FS]]></title><description><![CDATA[3FS是幻方AI自研的高速文件系统，是幻方“萤火二号”计算存储分离后，存储服务中的重要一环，全称是萤火文件系统（Fire-Flyer File System），因为有三个连续的 F，念起来不是很容易，因此被简称为 3FS。 ​
3FS…]]></description><link>https://www.high-flyer.cn/blog/3fs/</link><guid isPermaLink="false">https://www.high-flyer.cn/blog/3fs/</guid><dc:creator><![CDATA[High-Flyer]]></dc:creator><pubDate>Thu, 13 Jun 2019 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;3FS是&lt;strong&gt;幻方AI自研的高速文件系统&lt;/strong&gt;，是幻方“萤火二号”计算存储分离后，存储服务中的重要一环，全称是萤火文件系统（Fire-Flyer File System），因为有三个连续的 F，念起来不是很容易，因此被简称为 3FS。&lt;/p&gt;
&lt;p&gt;​
3FS 是一个比较特殊的文件系统，因为它几乎只用在AI训练时&lt;strong&gt;计算节点中的模型批量读取样本数据这个场景上&lt;/strong&gt;，通过高速的计算存储交互加快模型训练。这是一个大规模的随机读取任务，而且读上来的数据不会在短时间内再次被用到，因此我们无法使用“&lt;strong&gt;读取缓存&lt;/strong&gt;”这一最重要的工具来优化文件读取，即使是&lt;strong&gt;超前读取&lt;/strong&gt;也是毫无用武之地。 因此，3FS的实现也和其他文件系统有着比较大的区别。&lt;/p&gt;
&lt;p&gt;​
本期文章将为大家解密幻方AI是如何设计与实现3FS的，以及最终能实现的模型训练加速效果。&lt;/p&gt;
&lt;h2 id=&quot;硬件设计&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E7%A1%AC%E4%BB%B6%E8%AE%BE%E8%AE%A1&quot; aria-label=&quot;硬件设计 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;硬件设计&lt;/h2&gt;
&lt;p&gt;3FS文件系统整体的硬件设计如下图展示：&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 594px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/ed76696a40254f828c34737fa07398b6/5fd3e/p0.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.576687116564415%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAACaUlEQVQoz0WS20vcQBSH8/+/9bFg31rF0lb3kmz2GrNJZjKTuc9kJonrrpdVrFK0q6VeQEqUtvB7+PjBORw4n9cFbETMmJX/Q//mlUfUDAoVEj0gZlDomXATYsakBa8PaD8jAaRhzkPEh0RPmJ1yO2knzYzbMS17UAywHBTax2om3BBxH5Apt54P+VyUsbQjoifUQFPPhB1RE0uX6XrKyrDQexn1kfCxDLCaMGuPVsZWw0J6UJZPDw/X19cjSJZn65fnZ+2aqBCbzeZ+8zNjMsByLyG9XPhI+UhFwhG3yLWbMuPNuRG2yqiYUVWUNdNlhNlcWm6bnMmY6mGhtme5j+Qe4F9TlpomkS6iKpbWi4VlzZI2q/ZOU6ujE2gXsXSkOhKL48w0I6LeD5KtMfwwRd8AT0zdrI5L52bMeKysnh8eri4vI0RP1ucvT4/aVilX95vN3e0tEnpM9PYsfxdkH2M6JCYtD1mzzE2VqtoDpoZCxwVPpIO6ypiICpnpJlc2xiyVbkL1VpjszMlOQnfnBFdLWi2gMMDUXipdc3puj9cRM9geri4uC7eImCmXp4fri0w7P+efprALeIBVH8lEN0cnZ65uImY8KMzv+7v12ekgQYvjk8df91TqCWK3Nzc/rr7HmHYB+3yAOoD7qH1VqptMVVOqD3jp9QAd5zRIcR/yEIkRJP2s8HMxRnyQYR+yLmBfYtzLRYDVmyTE1pCrEAnv27zYT2kX8h7kXcA6gPVeuQNYW+Ztud9KIoNCB1gNiTGLlbCuB6i3G8G9lHQyup/RThv2Dzpv8LouwDIsdEj0iJZ+Lrqgde4PYBJtE8NxSagAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/ed76696a40254f828c34737fa07398b6/5fd3e/p0.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/ed76696a40254f828c34737fa07398b6/222b7/p0.png 163w,
https://hfai-static.high-flyer.cn/static/ed76696a40254f828c34737fa07398b6/ff46a/p0.png 325w,
https://hfai-static.high-flyer.cn/static/ed76696a40254f828c34737fa07398b6/5fd3e/p0.png 594w&quot;
        sizes=&quot;(max-width: 594px) 100vw, 594px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;可以看到，3FS文件系统包含两大部分：&lt;strong&gt;数据存储服务&lt;/strong&gt;与&lt;strong&gt;高速交换机&lt;/strong&gt;。数据存储服务与计算节点分离，专门用于存储模型训练需要用到的样本数据。每个存储服务节点有16张各15TB的SSD硬盘和2张高速网卡，读取性能强劲，网络宽带强大。&lt;/p&gt;
&lt;p&gt;​
3FS节点与计算节点（Clients）通过800口高速交换机进行连接。值得注意的是，因为一台交换机要连接 600 台左右的计算节点，每个计算节点就只能使用一张网卡，这样，从3FS上读取样本数据的流量和训练产生的其他数据流量（梯度信息、数据并行信息等）就不得不分享这一张网卡的带宽，这对3FS整体读取性能带来了一些挑战。&lt;/p&gt;
&lt;h2 id=&quot;软件实现&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E8%BD%AF%E4%BB%B6%E5%AE%9E%E7%8E%B0&quot; aria-label=&quot;软件实现 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;软件实现&lt;/h2&gt;
&lt;p&gt;​
前文中提到，3FS解决的是模型训练中样本数据读取这个特定的使用场景。与常见的文件读取方式不同，训练需要读取的样本是随机的，而且往往一个batch里用到的是互不相关的样本。注意到这一点后，我们决定设计&lt;strong&gt;异步的文件读取方式&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://hfai-static.high-flyer.cn/1d5d9ee387fab4bc680d85f9489ca1b7/p1.gif&quot; alt=&quot;0_13237011429S5X.gif&quot;&gt;
​&lt;/p&gt;
&lt;p&gt;具体的，如上图所示，3FS使用基于Linux的 AIO 和 io_uring 接口来完成样本的读取，因为在3FS的场景下，File Cache 完全没有作用，反而会以一种用户很难控制的方式消耗系统的内存，影响后续任务的运行，因此我们&lt;strong&gt;关闭了 File Cache，只用 Direct I/O 模式做数据的读取&lt;/strong&gt;。但要注意的是，用这种方式读取，buffer 指针，offset 和长度都是需要对齐的，如果让用户来做这个对齐，就会产生额外的内存拷贝，因此我们在文件系统内部把对齐做掉了，既优化了性能又方便了用户。&lt;/p&gt;
&lt;p&gt;用户使用3FS非常简单，只需要将&lt;strong&gt;样本数据转化成FFRecord格式&lt;/strong&gt;，存入3FS中即可。FFRecord格式是幻方AI开发的一种适用于3FS性能的二进制序列存储格式，适配了 PyTorch 的 Dataset 和 Dataloader 接口，可以非常方便的加载发起训练。具体项目地址：
&lt;a href=&quot;https://github.com/HFAiLab/ffrecord&quot;&gt;https://github.com/HFAiLab/ffrecord&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在使用幻方萤火进行模型训练时，只需要将原始数据做完特征工程，转化成输入模型的样本数据，通过3FS加载，你就可以享受到极致的存储性能体验。&lt;/p&gt;
&lt;h2 id=&quot;压力测试&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95&quot; aria-label=&quot;压力测试 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;压力测试&lt;/h2&gt;
&lt;p&gt;幻方萤火二号目前有64台存储服务器构成3FS文件系统。想象一下，训练一个 ResNet，读取 ImageNet 数据，ImageNet 压缩文件大小148G，解压整理成 FFRecord 格式的二进制训练样本数据有700G+，假设 batch_size 为400读满单个A100 40G显存，使用3FS读取数据在最优性能下每 Epoch 读取 ImageNet 数据只需耗时0.29s~0.10s左右。这极大降低数据加载的开销，充分利用GPU的计算时间，提高GPU利用率。&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 516px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;https://hfai-static.high-flyer.cn/static/02db090409778f231bff0d6a794e2c00/75dcb/p3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 34.355828220858896%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsTAAALEwEAmpwYAAABI0lEQVQY0yWPW3bDIAwFvY/EDjg1MuItJMBpne5/Vz1O58z/3DsZgNcxnE/WZ67VumiCYP328uPkbXwRllIySzvGUWvlWmOKIqLUY4Ld9os2eo8pne+zN9kBYgwOcQcIIXrvrUUAg4ghBPV43O/3ZVmmfbe/79OFANblnKwLll7asbZl9aKMR2vhAxEhOrRoDIjwtm1XWdrFGKMQjWMIcynUWqeSnfO1MlVKKXvnci4iorWe5/lTtvh7nikX9JFKxpBK+1n3qIzTENTXDgDbtoExMSUAMOYypfR8PifY9+M4KnFlYWZuI1IL1Hmc1A4MpffOwkS1t1Yr996Nuc6v6zoBWGYmolIyOuRKo7fnqlZ9qdRDf1BaL8uilPrffLvd5nn+A+FDSWP9eLGyAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;image.png&quot;
        title=&quot;image.png&quot;
        src=&quot;https://hfai-static.high-flyer.cn/static/02db090409778f231bff0d6a794e2c00/75dcb/p3.png&quot;
        srcset=&quot;https://hfai-static.high-flyer.cn/static/02db090409778f231bff0d6a794e2c00/222b7/p3.png 163w,
https://hfai-static.high-flyer.cn/static/02db090409778f231bff0d6a794e2c00/ff46a/p3.png 325w,
https://hfai-static.high-flyer.cn/static/02db090409778f231bff0d6a794e2c00/75dcb/p3.png 516w&quot;
        sizes=&quot;(max-width: 516px) 100vw, 516px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;上图展示了分布式训练 ResNet 实际每轮 Epoch 耗时情况。可以看到，即使在集群满负荷状态下，读取数据的耗时仅占总耗时的1.8%左右，具有相当不错的数据读取性能。&lt;/p&gt;</content:encoded></item></channel></rss>