<?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>Dataset on Echo的技术博客</title><link>https://cybersecurityerial.github.io/echo_blog/tags/dataset/</link><description>Recent content in Dataset 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/dataset/index.xml" rel="self" type="application/rss+xml"/><item><title>LLM System: 训练框架随笔 06 - Megatron Dataset</title><link>https://cybersecurityerial.github.io/echo_blog/posts/llm-system-training-framework-notes-06-megatron-dataset/</link><pubDate>Thu, 18 Jun 2026 00:00:00 +0800</pubDate><guid>https://cybersecurityerial.github.io/echo_blog/posts/llm-system-training-framework-notes-06-megatron-dataset/</guid><description>&lt;h2 id="mcore-dataset构造协议"&gt;mcore dataset构造协议&lt;/h2&gt;
&lt;p&gt;不同模型对于“sample”的定义不同，也就是说每一类模型拿来训练的输入是不一样的，哪怕底层数据是一样的。所以就有必要在之上抽象一层dataset类。&lt;/p&gt;
&lt;p&gt;主流这三类：&lt;/p&gt;
&lt;h4 id="gpt"&gt;GPT&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;数据-标签形态：
&lt;ul&gt;
&lt;li&gt;tokens = x[0 : L]&lt;/li&gt;
&lt;li&gt;labels = x[1 : L+1]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;任务：
&lt;ul&gt;
&lt;li&gt;预测下一个tk&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="bert"&gt;BERT&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;数据-标签形态
&lt;ul&gt;
&lt;li&gt;input = corrupt(x)&lt;/li&gt;
&lt;li&gt;labels = x only at masked positions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;任务：
&lt;ul&gt;
&lt;li&gt;挖空填词，看到左右的tk预测中间的tk&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="t5"&gt;T5&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;数据-标签形态
&lt;ul&gt;
&lt;li&gt;encoder_input = corrupt_span(x)&lt;/li&gt;
&lt;li&gt;decoder_label = removed_spans&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;任务：
&lt;ul&gt;
&lt;li&gt;encoder看残缺文本，decoder输出删掉的整个片段&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mcore-dataset涉及到的系统级优化"&gt;mcore dataset涉及到的系统级优化&lt;/h2&gt;
&lt;h3 id="用mmap映射token"&gt;用mmap映射token&lt;/h3&gt;
&lt;p&gt;mmap是把一个文件映射到了进程的虚拟地址空间，但是不会把整个文件load到进程的内存。真正的读取行为是lazy的，用哪块读哪块。（实际上os做的事情就是读va-查询页表-pagefault触发-os做一次read SSD到mem，信息是mmap给-更新页表）为什么不用read()而是使用mmap()呢，按理说rea也可以做到这种lazy的行为。因为read()在读的时候不是0拷贝。&lt;/p&gt;
&lt;p&gt;llm训练数据量大，连续存储，每次只用一块mb，适合用mmap。&lt;/p&gt;
&lt;p&gt;mmap存在的代价是A。容易缺页，（读取没有时空局部性会这样）B。warmup慢，C。多rank同时缺页的时候os的fs开销大（为什么，因为）。&lt;/p&gt;
&lt;p&gt;对A问题，mgt做的优化：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;document_index&lt;/li&gt;
&lt;li&gt;sample_index&lt;/li&gt;
&lt;li&gt;shuffle_index&lt;/li&gt;
&lt;li&gt;cache&lt;/li&gt;
&lt;li&gt;访问密度判断&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对C问题，mgt做的优化：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cache 预建&lt;/li&gt;
&lt;li&gt;defer mmap&lt;/li&gt;
&lt;li&gt;fast cache load&lt;/li&gt;
&lt;li&gt;object storage block cache&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先不展开。让ai总结了一下这几个优化所在的位置。方便后续索引。
具体位置在索引AAA这一节。&lt;/p&gt;
&lt;p&gt;nv文档提了几个这部分优化的点：&lt;/p&gt;</description></item></channel></rss>