news 2026/8/19 21:56:07

8. 理解 Dataset

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
8. 理解 Dataset

理解 LLM 的数据加载流水线

模型结构决定能力上限,数据流水线决定训练效率和最终效果。

在工业界,大模型训练中花时间最多的往往不是模型,而是数据。

可以把整个训练过程想象成一家大型食品工厂:

原始数据 ↓ 清洗 ↓ 切块(Tokenize) ↓ 装箱(Padding) ↓ 打包(Batch) ↓ 送入模型 ↓ 计算Loss ↓ 反向传播

一、数据是怎么进入模型的?

假设你有一条训练数据:

"我喜欢学习人工智能"

模型根本看不懂中文。

它只能看数字。

所以第一步:

文本 ↓ Tokenizer ↓ Token ID

例如:

我 喜 欢 学 习 人 工 智 能 ↓ [35, 88, 29, 63, 91, 17, 45, 73, 12]

这时模型终于能处理了。


二、Dataset:仓库管理员

Dataset 本质上就是:

告诉 PyTorch 去哪里拿数据。

例如:

classMyDataset(Dataset):def__getitem__(self,idx):returnself.data[idx]def__len__(self):returnlen(self.data)

作用:

数据文件 ↓ Dataset ↓ 一条一条样本

像仓库管理员:

用户: 给我第100条数据 Dataset: 好的,拿去

例如:

dataset[0]

返回:

{"text":"我喜欢AI"}

三、DataLoader:流水线工人

Dataset 一次只能取一个样本。

训练时需要:

一次喂几十条 甚至几百条

所以需要:

DataLoader

负责:

Dataset ↓ 组装 Batch ↓ 送给 GPU

例如:

loader=DataLoader(dataset,batch_size=32,shuffle=True)

含义:

每次拿32条数据 随机打乱顺序 送入模型

流程:

Dataset 样本1 样本2 样本3 ... 样本10000 ↓ DataLoader Batch1: 样本1~32 Batch2: 样本33~64 Batch3: 样本65~96

四、为什么需要 Padding?

这是很多新人第一次接触训练时最困惑的地方。

假设:

样本1: 我喜欢AI 长度=4
样本2: 今天天气不错 长度=5
样本3: 深度学习改变世界 长度=8

GPU 最喜欢:

矩形矩阵

例如:

3 × 8

而不是:

4 5 8

这种参差不齐的长度。

所以需要补齐。


Padding 之前

[我 喜 欢 AI] [今 天 天 气 不 错] [深 度 学 习 改 变 世 界]

Padding 之后

PAD = 特殊填充符

[我 喜 欢 AI PAD PAD PAD PAD] [今 天 天 气 不 错 PAD PAD] [深 度 学 习 改 变 世 界]

这样长度统一:

8 8 8

GPU 就能并行计算。


五、为什么需要 Truncation?

有些文章特别长。

例如:

长度 = 5000 Token

而模型最大长度:

max_seq_len = 2048

怎么办?

只能砍掉。

tokens=tokens[:2048]

变成:

前2048个保留 后2952个丢弃

这就叫:

Truncation(截断)

六、max_seq_len 到底是什么?

很多人误解:

max_seq_len = 训练时随便设置的数字

其实不是。

它决定:

模型一次最多能看到多少Token

例如:

max_seq_len = 4096

表示:

模型视野长度 ≈ 4096 Token

类似人眼视野:

太短: 看不见上下文 太长: 显存爆炸

因为 Attention:

O(n2) O(n^2)O(n2)

长度翻倍:

4096 → 8192 计算量 ≈ 4倍

七、真正重要的:Loss Mask

这是 SFT 和预训练最大的区别之一。

很多面试都会问。


预训练

数据:

我 喜 欢 学 习 AI

训练目标:

预测下一个词

例如:

我 → 喜 我 喜 → 欢 我 喜 欢 → 学

因此:

每个Token都有价值

Loss Mask:

[1 1 1 1 1]

除了 PAD:

[1 1 1 1 1 0 0]

SFT 为什么不同?

假设训练样本:

User: 什么是AI? Assistant: AI是人工智能。

拼接后:

<User> 什么是AI? <Assistant> AI是人工智能。

模型输入:

全部输入进去

但是监督目标不是全部。


我们只关心什么?

只关心:

Assistant 怎么回答

不关心:

User 怎么提问

所以:

User部分 不计算Loss

Loss Mask

<User> 什么是AI? <Assistant> AI是人工智能。

对应:

0 0 0 0 0 0 1 1 1 1 1 1

图示:

Prompt ↓↓↓↓↓↓↓ 什么是AI? 000000000 Assistant回答 ↓↓↓↓↓↓↓ AI是人工智能 111111111

为什么必须这样做?

假设不 Mask。

模型会同时学习:

如何提问 + 如何回答

梯度目标混在一起。

结果可能变成:

用户:什么是AI? 模型: 什么是AI?

因为模型发现:

训练数据里 用户说的话也算Loss

于是它会模仿用户。

这显然不是我们想要的。


八、Loss 是怎么计算的?

假设:

Loss = [2.1, 1.5, 3.0, 0.8]

对应 Mask:

[0, 0, 1, 1]

那么实际计算:

0×2.1 + 0×1.5 + 1×3.0 + 1×0.8

只保留:

3.0 + 0.8

最后平均:

(3.0 + 0.8) / 2

九、Batch Size 是什么?

假设:

10万条训练数据

不可能:

一次全塞GPU

所以:

分批

例如:

batch_size = 32

表示:

一次训练32条数据

流程:

Batch1 → 更新参数 Batch2 → 更新参数 Batch3 → 更新参数

十、为什么还要梯度累积?

假设你希望:

batch_size = 256

训练更稳定。

但是显存只能放:

32

怎么办?

拆开。


原本:

256条 一起算

变成:

32 32 32 32 32 32 32 32

共:

8次

每次:

loss.backward()

只累计梯度。

不更新参数。

最后一次:

optimizer.step()

更新一次。

效果近似:

真正 batch_size=256

公式:

Effective Batch Size=batch size×gradient accumulation×GPU 数 \text{Effective Batch Size}= \text{batch size} \times \text{gradient accumulation} \times \text{GPU 数}Effective Batch Size=batch size×gradient accumulation×GPU

例如:

batch_size = 32 grad_acc = 8 gpu = 4

则:

有效Batch = 32 × 8 × 4 = 1024

十一、完整训练流水线

把所有东西串起来:

如果只记住一句话:

Dataset 负责“取数据”,Tokenizer 负责“切词变数字”,Padding 负责“补齐长度”,Loss Mask 负责“告诉模型哪些地方该学习”,DataLoader 负责“打包成 Batch 送进 GPU”。这五个环节组成了 LLM 训练的数据处理流水线。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/19 21:54:12

STM32F7+FreeRTOS+FatFs嵌入式存储方案:SD卡驱动适配与性能优化实战

1. 项目背景与核心价值 最近在做一个数据采集的项目&#xff0c;需要把传感器数据实时存储到SD卡里&#xff0c;同时还得处理一些网络通信和用户交互。手头正好有块STM32F7的开发板&#xff0c;性能足够&#xff0c;但怎么把SD卡驱动、文件系统和实时操作系统这三样东西高效、稳…

作者头像 李华
网站建设 2026/8/19 21:50:34

智能汽车磁性传感器选型实战:从原理到应用的全方位指南

1. 从一颗“小磁铁”到智能汽车的神经末梢如果你拆开一辆现代智能汽车&#xff0c;从车门、座椅到电机、底盘&#xff0c;再到方向盘后面&#xff0c;你会发现无数个不起眼的“小黑点”或“小方块”。它们不像激光雷达那样引人注目&#xff0c;也不像大屏芯片那样算力惊人&…

作者头像 李华
网站建设 2026/8/19 21:48:42

基于Arduino/ESP32与BLE的手机遥控机械臂:从硬件选型到代码实现

1. 项目概述&#xff1a;从零打造一部手机遥控的机械臂 如果你对机器人、自动化或者DIY电子项目感兴趣&#xff0c;那么自己动手做一部能用手机遥控的机械臂&#xff0c;绝对是一个能让你成就感爆棚的“毕业级”项目。它不像简单的流水灯或者温湿度计&#xff0c;而是将机械结构…

作者头像 李华
网站建设 2026/8/19 21:47:30

Broadcom网站下载、安装storcli(ESXI)

概述 storcli 是一款用于基于 LSI 的 HBA 和 RAID 控制器的控制器管理工具 说明&#xff1a; 1.输出结果含义参见DELL安装PERCCLI工具&#xff08;ESXI&#xff09; 2.StorCLI 命令与MegaCLI命令 对比如下&#xff1a; 功能分类MegaCLI 命令 (旧工具)StorCLI 命令 (新工具)…

作者头像 李华
网站建设 2026/8/19 21:47:25

成都新能源汽车推广6.9万辆背后的政策、产业与生态构建

1. 从数字到场景&#xff1a;成都新能源汽车推广的深层解读看到“四川成都累计推广新能源汽车6.9万辆”这个标题&#xff0c;很多人的第一反应可能只是一个冷冰冰的统计数字。但作为一个长期关注城市交通与能源转型的从业者&#xff0c;我看到的远不止于此。这个数字背后&#…

作者头像 李华
网站建设 2026/8/19 21:45:08

二刷hot100-347.前k个高频元素

用到了小顶堆&#xff0c;始终在堆里保持k个当前高频的元素&#xff0c;堆口是元素中最低频的&#xff0c;用于随时切换&#xff1b;注意一下堆存二维数组&#xff0c;以及map的迭代方式&#xff1a;Map.Entry<Integer,Integer> entry : map.entrySet()class Solution {p…

作者头像 李华