<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Pytorch on Ganko Space</title><link>https://ganko.asia/tags/pytorch/</link><description>Recent content in Pytorch on Ganko Space</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 07 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://ganko.asia/tags/pytorch/index.xml" rel="self" type="application/rss+xml"/><item><title>Pytorch-Tricks</title><link>https://ganko.asia/posts/pytorch-tricks/</link><pubDate>Tue, 07 Apr 2026 00:00:00 +0000</pubDate><guid>https://ganko.asia/posts/pytorch-tricks/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>写在前面&lt;/strong>：Pytorch 内容繁杂，实验中用到的技巧与机制若不及时记录，容易遗忘并导致重复造轮子。本文档用于记录 Pytorch 的相关技巧与机制，将持续更新，方便后续查阅。&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="动态计算图">动态计算图&lt;/h2>
&lt;h3 id="缘起">缘起&lt;/h3>
&lt;p>在一次实验日志中，发现一个固定的 CNN 模块推理时间存在较大波动。排查后发现是数据流水线卡顿或 GPU 内存管理抖动所致，但也因此注意到了 Pytorch 的&lt;strong>动态计算图&lt;/strong>机制。&lt;/p>
&lt;blockquote>
&lt;p>Pytorch 在每次前向传播时都会重新构建计算图，这意味着每次前向传播都会产生额外开销，尤其在模型结构复杂或输入数据变化较大时，可能导致推理时间波动。&lt;/p>&lt;/blockquote>
&lt;p>具体而言：&lt;/p>
&lt;ul>
&lt;li>每次前向传播，即便模型结构未变，Pytorch 仍会依据当前输入数据和模型结构重建计算图。&lt;/li>
&lt;li>若输入数据形状或模型结构发生变化，计算图会重新构建，进而引发性能波动。&lt;/li>
&lt;/ul>
&lt;h3 id="可能导致性能波动的情况">可能导致性能波动的情况&lt;/h3>
&lt;h4 id="1-条件分支结构">1. 条件分支结构&lt;/h4>
&lt;p>模型中包含数据依赖的条件分支（如 &lt;code>if&lt;/code> 语句）时，不同前向传播可能执行不同计算路径，导致计算图结构变化。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">BadEncoder&lt;/span>(nn&lt;span style="color:#f92672">.&lt;/span>Module):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">forward&lt;/span>(self, x):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> x&lt;span style="color:#f92672">.&lt;/span>sum() &lt;span style="color:#f92672">&amp;gt;&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>: &lt;span style="color:#75715e"># 数据依赖的条件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> x &lt;span style="color:#f92672">=&lt;/span> self&lt;span style="color:#f92672">.&lt;/span>heavy_conv(x)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> x &lt;span style="color:#f92672">=&lt;/span> self&lt;span style="color:#f92672">.&lt;/span>light_conv(x)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> x
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="2-变长序列">2. 变长序列&lt;/h4>
&lt;p>处理变长序列（如 RNN 或 Transformer）时，每次输入长度可能不同，导致计算图结构变化。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">BadRNN&lt;/span>(nn&lt;span style="color:#f92672">.&lt;/span>Module):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">forward&lt;/span>(self, x):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> i &lt;span style="color:#f92672">in&lt;/span> range(x&lt;span style="color:#f92672">.&lt;/span>size(&lt;span style="color:#ae81ff">1&lt;/span>)): &lt;span style="color:#75715e"># 依赖输入序列长度&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> x &lt;span style="color:#f92672">=&lt;/span> self&lt;span style="color:#f92672">.&lt;/span>rnn_cell(x[:, i, :], x)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> x
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="3-其他情况">3. 其他情况&lt;/h4>
&lt;ul>
&lt;li>动态形状&lt;/li>
&lt;li>随机性操作&lt;/li>
&lt;li>稀疏操作&lt;/li>
&lt;/ul>
&lt;h3 id="解决方案">解决方案&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>使用静态计算图&lt;/strong>：若模型结构固定，可借助 TorchScript 或 ONNX 转换为静态计算图，避免每次前向传播都重新构建。&lt;/li>
&lt;li>&lt;strong>Padding + Mask&lt;/strong>：对于变长序列，采用填充至统一长度，并利用 mask 标识有效部分，保持计算图结构一致。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="模型训练推理速度分析与优化">模型训练/推理速度分析与优化&lt;/h2>
&lt;h3 id="背景">背景&lt;/h3>
&lt;p>修改模型与训练代码后发现速度明显下降。排查发现数据加载耗时过长，遂将 DataLoader 的在线预处理改为离线处理。但模型推理速度仍慢于基线，后续需进一步优化。&lt;/p></description></item></channel></rss>