<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Jian Wang</title>
    <description>The latest articles on Forem by Jian Wang (@jian_wang_71470b9158918d8).</description>
    <link>https://forem.com/jian_wang_71470b9158918d8</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3518067%2F1a6c3dac-e454-4933-9123-2ee213de5eea.png</url>
      <title>Forem: Jian Wang</title>
      <link>https://forem.com/jian_wang_71470b9158918d8</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jian_wang_71470b9158918d8"/>
    <language>en</language>
    <item>
      <title>PyMOL 画小分子的静电势 (ESP)</title>
      <dc:creator>Jian Wang</dc:creator>
      <pubDate>Fri, 19 Dec 2025 22:33:30 +0000</pubDate>
      <link>https://forem.com/jian_wang_71470b9158918d8/pymol-hua-xiao-fen-zi-de-jing-dian-shi-esp-15ec</link>
      <guid>https://forem.com/jian_wang_71470b9158918d8/pymol-hua-xiao-fen-zi-de-jing-dian-shi-esp-15ec</guid>
      <description>&lt;p&gt;本文档记录了从原始 &lt;code&gt;.mol2&lt;/code&gt; 文件出发，通过密度泛函理论 (DFT) 计算并生成用于 PyMOL 绘图的 ESP Cube 文件的完整步骤。&lt;/p&gt;




&lt;h2&gt;
  
  
  1. 分子预处理
&lt;/h2&gt;

&lt;p&gt;为了保证量子化学计算的准确性，必须确保分子的原子价态和氢原子完整。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;工具&lt;/strong&gt;: Open Babel&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;操作&lt;/strong&gt;: 将 &lt;code&gt;.mol2&lt;/code&gt; 转换为 &lt;code&gt;.xyz&lt;/code&gt; 格式，并根据需要补全氢原子（补氢对 ESP 计算至关重要）。&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;命令&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 补氢并转换为 xyz&lt;/span&gt;
obabel input.mol2 &lt;span class="nt"&gt;-h&lt;/span&gt; &lt;span class="nt"&gt;-oxyz&lt;/span&gt; &lt;span class="nt"&gt;-O&lt;/span&gt; molecule.xyz
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. ORCA 计算配置
&lt;/h2&gt;

&lt;p&gt;使用 ORCA 6.1.1 运行单点能计算，并保存电子密度信息以备后处理。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;输入文件 (&lt;code&gt;molecule.inp&lt;/code&gt;) 核心部分&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;! B3LYP def2-SVP TightSCF KeepDens PAL8
* xyz 0 1
[原子坐标]
*
&lt;/code&gt;&lt;/pre&gt;


&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;KeepDens&lt;/code&gt;: &lt;strong&gt;关键参数&lt;/strong&gt;，告诉 ORCA 保留电子密度文件（.scfp），否则后处理无法生成 ESP。&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;PAL8&lt;/code&gt;: 使用 8 核并行。在集群 SLURM 环境下，建议配合 &lt;code&gt;--ntasks-per-node=8&lt;/code&gt; 使用。&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. 生成 Cube 文件 (后处理)
&lt;/h2&gt;

&lt;p&gt;ORCA 6.1.1 使用 &lt;code&gt;orca_plot&lt;/code&gt; 交互工具从计算结果 (&lt;code&gt;.gbw&lt;/code&gt;) 中提取 ESP。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;工具&lt;/strong&gt;: &lt;code&gt;orca_plot&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;交互序列&lt;/strong&gt; (可通过重定向执行):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; 输入 &lt;code&gt;1&lt;/code&gt; (选择绘图类型)&lt;/li&gt;
&lt;li&gt; 输入 &lt;code&gt;43&lt;/code&gt; (选择 Electrostatic Potential)&lt;/li&gt;
&lt;li&gt; 输入 &lt;code&gt;4&lt;/code&gt; (设置网格间距/分辨率，建议输入 &lt;code&gt;100 100 100&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt; 输入 &lt;code&gt;11&lt;/code&gt; (执行生成任务)&lt;/li&gt;
&lt;li&gt; 输入 &lt;code&gt;12&lt;/code&gt; (退出)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;产物&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;molecule.eldens.cube&lt;/code&gt;: 电子密度文件（定义分子形状）。&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;molecule.vpot.cube&lt;/code&gt; (或重命名为 &lt;code&gt;_ESP.cube&lt;/code&gt;): 静电势数值文件。&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. PyMOL 可视化命令
&lt;/h2&gt;

&lt;p&gt;在 PyMOL 中将 ESP 数值映射到分子表面。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1. 载入所有文件
&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt; &lt;span class="n"&gt;molecule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mol2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mol&lt;/span&gt;
&lt;span class="n"&gt;load&lt;/span&gt; &lt;span class="n"&gt;molecule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eldens&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cube&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;den&lt;/span&gt;
&lt;span class="n"&gt;load&lt;/span&gt; &lt;span class="n"&gt;molecule_ESP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cube&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;esp&lt;/span&gt;

&lt;span class="c1"&gt;# 2. 生成基于电子密度的分子表面 (等值面取 0.002 a.u.)
&lt;/span&gt;&lt;span class="n"&gt;isosurface&lt;/span&gt; &lt;span class="n"&gt;surf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;den&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.002&lt;/span&gt;

&lt;span class="c1"&gt;# 3. 创建颜色映射渐变 (单位为原子单位 a.u.)
# [-0.1, 0, 0.1] 对应红-白-蓝映射
# 负电位 (红色) = 富电子区; 正电位 (蓝色) = 欠电子区
&lt;/span&gt;&lt;span class="n"&gt;ramp_new&lt;/span&gt; &lt;span class="n"&gt;ramp_esp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;esp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;white&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# 4. 将颜色映射到表面
&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;surface_color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ramp_esp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;surf&lt;/span&gt;

&lt;span class="c1"&gt;# 5. 美化调整
&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;surface_quality&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;transparency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;surf&lt;/span&gt;  &lt;span class="c1"&gt;# 可选：设置表面半透明以观察内部原子
&lt;/span&gt;&lt;span class="n"&gt;rebuild&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  注意事项
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;单位&lt;/strong&gt;: ORCA 输出的 ESP 单位为 &lt;strong&gt;a.u.&lt;/strong&gt; (1 a.u. ≈ 27.21 V)。PyMOL 中的刻度应根据分子极性适当调整（常用范围 $\pm 0.05$ 到 $\pm 0.2$）。&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;文件保持&lt;/strong&gt;: 确保 &lt;code&gt;.gbw&lt;/code&gt; 和 &lt;code&gt;.scfp&lt;/code&gt; 文件在同一目录下，&lt;code&gt;orca_plot&lt;/code&gt; 才能正常运行。&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;并行槽位&lt;/strong&gt;: 在使用 MPI 并行时，确保 SLURM 分配的 &lt;code&gt;ntasks&lt;/code&gt; 与 ORCA &lt;code&gt;PALn&lt;/code&gt; 关键字一致。&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>learning</category>
      <category>science</category>
      <category>tools</category>
    </item>
    <item>
      <title>pytorch register_buffer的一些思考</title>
      <dc:creator>Jian Wang</dc:creator>
      <pubDate>Wed, 24 Sep 2025 15:53:08 +0000</pubDate>
      <link>https://forem.com/jian_wang_71470b9158918d8/pytorch-registerbufferde-xie-si-kao-4aip</link>
      <guid>https://forem.com/jian_wang_71470b9158918d8/pytorch-registerbufferde-xie-si-kao-4aip</guid>
      <description>&lt;p&gt;在 PyTorch 中，当我们需要在模型中存储一些不需要梯度的张量时，经常会遇到这样的选择：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 方案1：直接赋值
self.position_encoding = position_encoding

# 方案2：使用 register_buffer
self.register_buffer("position_encoding", position_encoding)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;很多人可能会问：既然都可以存储张量，为什么还要用 &lt;code&gt;register_buffer&lt;/code&gt;？&lt;/p&gt;

&lt;h2&gt;
  
  
  直接赋值的潜在问题
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 设备不匹配问题
&lt;/h3&gt;

&lt;p&gt;最直接的问题就是设备管理。当你将模型移动到 GPU 时：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 使用直接赋值
&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;position_encoding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;position_encoding&lt;/span&gt;  &lt;span class="c1"&gt;# 在CPU上
&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cuda&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# 模型参数移动到GPU
# 但是 position_encoding 仍然在CPU上！
&lt;/span&gt;
&lt;span class="c1"&gt;# 在forward中使用时会出现设备不匹配错误
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;some_operation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;position_encoding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gpu_tensor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 错误！
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. 梯度计算混乱
&lt;/h3&gt;

&lt;p&gt;PyTorch 可能会误认为这些张量是需要梯度的参数，在反向传播时尝试计算梯度，浪费计算资源。&lt;/p&gt;

&lt;h2&gt;
  
  
  register_buffer 的优势
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 自动设备管理
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register_buffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;position_encoding&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;position_encoding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cuda&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# 缓冲区自动移动到GPU
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;   &lt;span class="c1"&gt;# 缓冲区自动移动回CPU
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. 明确的模型结构
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 查看模型的所有缓冲区
&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;buffers&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;named_buffers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# 区分参数和缓冲区
&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;  &lt;span class="c1"&gt;# 需要梯度的参数
&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;buffers&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;     &lt;span class="c1"&gt;# 不需要梯度的张量
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  实际案例：位置编码模型
&lt;/h2&gt;

&lt;p&gt;让我们看一个具体的例子。假设我们有一个需要位置编码的模型：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PositionalEncodingModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vocab_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_seq_len&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;# 计算位置编码矩阵
&lt;/span&gt;        &lt;span class="n"&gt;position_encoding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_seq_len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;position&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_seq_len&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;unsqueeze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;div_term&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; 
                           &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;10000.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

        &lt;span class="n"&gt;position_encoding&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;div_term&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;position_encoding&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;div_term&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 注册为缓冲区
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register_buffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;position_encoding&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;position_encoding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 可训练参数
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vocab_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transformer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Transformer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input_ids&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;seq_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;input_ids&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 位置编码自动在正确的设备上
&lt;/span&gt;        &lt;span class="n"&gt;pos_embeddings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;position_encoding&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;seq_len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:]&lt;/span&gt;

        &lt;span class="c1"&gt;# 词嵌入 + 位置编码
&lt;/span&gt;        &lt;span class="n"&gt;embeddings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;pos_embeddings&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transformer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;)&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;/li&gt;
&lt;li&gt;需要与模型一起保存和加载&lt;/li&gt;
&lt;li&gt;需要与模型参数在同一设备上&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  使用场景
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 模型在GPU上运行
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cuda&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;input_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;input_ids&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cuda&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# 位置编码自动在GPU上，不会出现设备不匹配错误
&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 正常工作
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  关于重新计算的思考
&lt;/h2&gt;

&lt;p&gt;有人可能会问：既然 &lt;code&gt;register_buffer&lt;/code&gt; 保存了张量，为什么在 &lt;code&gt;__init__&lt;/code&gt; 中还要计算一遍？&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...):&lt;/span&gt;
    &lt;span class="c1"&gt;# 1. 计算一遍
&lt;/span&gt;    &lt;span class="n"&gt;position_encoding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;compute_position_encoding&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# 2. 注册缓冲区
&lt;/span&gt;    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register_buffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;position_encoding&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;position_encoding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 加载时：
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_state_dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;model.pth&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# 3. 又从state_dict恢复
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这确实看起来有重复计算，但实际上：&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;：避免复杂的延迟加载逻辑&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;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...,&lt;/span&gt; &lt;span class="n"&gt;compute_encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;compute_encoding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# 正常计算
&lt;/span&gt;        &lt;span class="n"&gt;position_encoding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;compute_position_encoding&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register_buffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;position_encoding&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;position_encoding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# 延迟计算
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register_buffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;position_encoding&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  随机数一致性
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;register_buffer&lt;/code&gt; 还有一个重要优势：随机数一致性。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 如果缓冲区包含随机初始化的张量
&lt;/span&gt;&lt;span class="n"&gt;random_buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register_buffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;random_buffer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;random_buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 每次加载模型时，随机数是完全一致的
# 这确保了模型行为的可重现性
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  最佳实践
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;何时使用 register_buffer&lt;/strong&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;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;何时直接赋值&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;临时计算结果的存储&lt;/li&gt;
&lt;li&gt;不需要保存的中间变量&lt;/li&gt;
&lt;li&gt;纯 Python 对象（非张量）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;命名规范&lt;/strong&gt;：&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;   &lt;span class="c1"&gt;# 好的命名
&lt;/span&gt;   &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register_buffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;position_embeddings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pos_emb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register_buffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;attention_mask&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

   &lt;span class="c1"&gt;# 避免的命名
&lt;/span&gt;   &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register_buffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;temp_tensor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  总结
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;register_buffer&lt;/code&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;：自动保存和加载&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;虽然在某些情况下看起来有重复计算，但考虑到代码简洁性和可靠性，这种设计是合理的。在 PyTorch 开发中，正确使用 &lt;code&gt;register_buffer&lt;/code&gt; 是写出健壮模型的重要技能。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>服务器 tmux 持久化问题</title>
      <dc:creator>Jian Wang</dc:creator>
      <pubDate>Sat, 20 Sep 2025 14:14:33 +0000</pubDate>
      <link>https://forem.com/jian_wang_71470b9158918d8/fu-wu-qi-tmux-chi-jiu-hua-wen-ti-2ngo</link>
      <guid>https://forem.com/jian_wang_71470b9158918d8/fu-wu-qi-tmux-chi-jiu-hua-wen-ti-2ngo</guid>
      <description>&lt;p&gt;之前我都是通过 ssh 连接到学校的 HPC 上，然后运行 tmux&lt;br&gt;
这样断开 ssh 之后 tmux 也还是会运行，方便我下次连接 ssh 的时候继续上次的工作&lt;br&gt;
今天我发现断开 ssh 之后 tmux 也断了&lt;br&gt;
可能是 ssh 断开之后服务器会自动杀死在 ssh 运行期间的后台任务&lt;br&gt;
经过查询 chatgpt 找到如下解决方案&lt;br&gt;
创建一个新的文件：&lt;code&gt;~/.config/systemd/user/tmux@.service&lt;/code&gt;&lt;br&gt;
输入如下内容：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Unit]
Description=Tmux session %i
After=default.target

[Service]
Type=forking
ExecStart=/usr/bin/tmux new-session -d -s %i
ExecStop=/usr/bin/tmux kill-session -t %i
Restart=always
WorkingDirectory=%h

[Install]
WantedBy=default.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;然后输入如下命令：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;systemctl --user enable tmux@main
systemctl --user start tmux@main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这样每次登录之后只需要运行 &lt;code&gt;tmux attach -t main&lt;/code&gt;就可以连接到 tmux 了&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
