<?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>Checkpoint on Echo的技术博客</title><link>https://cybersecurityerial.github.io/echo_blog/tags/checkpoint/</link><description>Recent content in Checkpoint on Echo的技术博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 18 Jun 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://cybersecurityerial.github.io/echo_blog/tags/checkpoint/index.xml" rel="self" type="application/rss+xml"/><item><title>LLM System: 训练框架随笔 05 - Megatron Checkpoint</title><link>https://cybersecurityerial.github.io/echo_blog/posts/llm-system-training-framework-notes-05-megatron-checkpoint/</link><pubDate>Thu, 18 Jun 2026 00:00:00 +0800</pubDate><guid>https://cybersecurityerial.github.io/echo_blog/posts/llm-system-training-framework-notes-05-megatron-checkpoint/</guid><description>&lt;blockquote&gt;
&lt;p&gt;本篇目标：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="megatron-checkpoint"&gt;megatron Checkpoint&lt;/h2&gt;
&lt;p&gt;checkpoint包含如下四类：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;rng state/rerun state/dalaloader state/model&amp;amp;optim state&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;rngstate是一些伪随机数的序列，因为伪随机数的采样本身就是很好的分布，但如果ckpt没有记录他们的状态，会破坏这种分布，进而给训练带来一些不可预估的问题。
rerun state是用于做容错的。
dataloader state是数据的ckpt，表示训到哪里。
model/optim state是模型权重，优化器状态，学习率衰减程度等算法层直接可见的东西。&lt;/p&gt;
&lt;h2 id="rngstate详解"&gt;RNGstate详解&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rng_state &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;random_rng_state&amp;#34;&lt;/span&gt;: random&lt;span style="color:#f92672"&gt;.&lt;/span&gt;getstate(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;np_rng_state&amp;#34;&lt;/span&gt;: np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;random&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_state(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;torch_rng_state&amp;#34;&lt;/span&gt;: torch&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_rng_state(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;cuda_rng_state&amp;#34;&lt;/span&gt;: torch&lt;span style="color:#f92672"&gt;.&lt;/span&gt;cuda&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_rng_state(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;rng_tracker_states&amp;#34;&lt;/span&gt;: get_cuda_rng_tracker()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_states(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;random_rng_state： python的random模块 如random.random() .shuffle() .sample() .randint()&lt;/li&gt;
&lt;li&gt;np_rng_state： np的random。如np.random.random() np.random.shffle() np.random.randint()&lt;/li&gt;
&lt;li&gt;torch_rng_state：torch的random，如torch.rand(), torch.randn(), torch.randint() 前提是device=cpu&lt;/li&gt;
&lt;li&gt;cuda_rng_state： torch.rand(cuda) torch.randn(cuda) F.dropout(cuda_tensor) cuda_tensor.normal()&lt;/li&gt;
&lt;li&gt;rng_tracker_states： gpu cuda有随机数的流，默认情况下所有gpu的random公用这一个流，但是这个不够好。所以会以类似于上下文的方式，去管理随机流。这个state记录的就是各个随机数流推进到了哪个位置。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="如何发现rngstate出问题了"&gt;如何发现rngstate出问题了？&lt;/h3&gt;
&lt;p&gt;既然框架设计了这个功能，就要思考这个功能如果没做或者没做好，带来什么问题。如果是rngstate没同步好，那么是否启动save/load ckpt就是最先需要判断的标准。所以一开始可以先单卡+是否saveload。&lt;/p&gt;
&lt;h2 id="rerunstate详解"&gt;rerunstate详解&lt;/h2&gt;
&lt;h2 id="megatron-checkpoint-backend---mcore-dist-checkpoint"&gt;megatron checkpoint backend - mcore dist checkpoint&lt;/h2&gt;
&lt;p&gt;ckpt前端其实只是决定要存哪些状态。后端决定了怎么在多rank存储。&lt;/p&gt;
&lt;p&gt;ckpt的后端是distckpt，distckpt这一层看到的是一个全局的共享文件。&lt;/p&gt;
&lt;p&gt;distckpt只需要提供每个rank的shard在全局的位置，以及告诉本rank其他rank的一些shard信息。本rank就可以读取各种shard，这一层是屏蔽掉各种近端远端读写逻辑的。&lt;/p&gt;
&lt;p&gt;训练框架这一层就只看见一个共享目录，调用的话就是系统调用，非常简单。其他的底层细节让xxFS去处理。&lt;/p&gt;
&lt;p&gt;具体怎么shard由训练参数决定策略。策略指定的是谁保存shard，谁读取shard，是否需要在rank之间重分配io（比如由其他rank代读取），同步还是异步write让，是否缓存metadata和plan。&lt;/p&gt;</description></item></channel></rss>