LLM System: 训练框架随笔 06 - Megatron Dataset
mcore dataset构造协议 不同模型对于“sample”的定义不同,也就是说每一类模型拿来训练的输入是不一样的,哪怕底层数据是一样的。所以就有必要在之上抽象一层dataset类。 主流这三类: GPT 数据-标签形态: tokens = x[0 : L] labels = x[1 : L+1] 任务: 预测下一个tk BERT 数据-标签形态 input = corrupt(x) labels = x only at masked positions 任务: 挖空填词,看到左右的tk预测中间的tk T5 数据-标签形态 encoder_input = corrupt_span(x) decoder_label = removed_spans 任务: encoder看残缺文本,decoder输出删掉的整个片段 mcore dataset涉及到的系统级优化 用mmap映射token mmap是把一个文件映射到了进程的虚拟地址空间,但是不会把整个文件load到进程的内存。真正的读取行为是lazy的,用哪块读哪块。(实际上os做的事情就是读va-查询页表-pagefault触发-os做一次read SSD到mem,信息是mmap给-更新页表)为什么不用read()而是使用mmap()呢,按理说rea也可以做到这种lazy的行为。因为read()在读的时候不是0拷贝。 llm训练数据量大,连续存储,每次只用一块mb,适合用mmap。 mmap存在的代价是A。容易缺页,(读取没有时空局部性会这样)B。warmup慢,C。多rank同时缺页的时候os的fs开销大(为什么,因为)。 对A问题,mgt做的优化: document_index sample_index shuffle_index cache 访问密度判断 对C问题,mgt做的优化: cache 预建 defer mmap fast cache load object storage block cache 先不展开。让ai总结了一下这几个优化所在的位置。方便后续索引。 具体位置在索引AAA这一节。 nv文档提了几个这部分优化的点: ...