在 AI算力平台 上进行大模型训练时,同一份代码重复运行,验证集指标却出现明显波动。GPU服务器租用实例本身未必有问题,常见原因是文件遍历顺序变化、样本增删未记录,或训练集与验证集被重新随机切分。本文用数据清单和稳定哈希固定实验边界。
问题背景
很多深度学习项目直接对目录执行 glob,再调用随机切分。目录新增文件、返回顺序变化或种子设置位置不同,都可能让样本进入另一集合。实验因此无法公平比较,还可能出现同一对象的相似样本跨集合泄漏。模型进入推理部署前,若评测集不稳定,所谓精度提升就缺少依据。
环境准备
准备 Python 3、只读数据目录、元数据目录,以及能唯一标识样本的相对路径或业务 ID。可通过润云智算官网 https://www.smoothcloud.com.cn/ 查看当前环境,再按需求选择资源。
编号实操步骤
1. 生成排序后的数据清单
只记录相对路径,避免把实例挂载点写进实验元数据:
from pathlib import Path
import json
root = Path("/data/raw")
items = sorted(
str(p.relative_to(root))
for p in root.rglob("*")
if p.is_file()
)
with open("manifest.jsonl", "w", encoding="utf-8") as f:
for path in items:
f.write(json.dumps({"path": path}, ensure_ascii=False) + "\n")
print("samples:", len(items))
如果数据有标签、来源或对象 ID,也应写入同一行,便于后续分组切分。
2. 为清单计算版本哈希
sha256sum manifest.jsonl > manifest.jsonl.sha256
cat manifest.jsonl.sha256
哈希变化不代表数据一定错误,但说明本次实验边界已经改变,必须重新审核差异。
3. 检查新增、删除与重复项
import json
from collections import Counter
paths = [
json.loads(line)["path"]
for line in open("manifest.jsonl", encoding="utf-8")
]
dup = [p for p, n in Counter(paths).items() if n > 1]
if dup:
raise SystemExit(f"重复路径: {dup[:10]}")
assert paths == sorted(paths), "清单未稳定排序"
路径去重不等于内容去重。对图像、音频或文本,应根据业务风险增加内容哈希或近重复检测,但阈值要由项目验证。
4. 使用稳定哈希分配集合
不要依赖列表位置随机切分,而是用稳定样本 ID 决定归属:
import hashlib
def split_of(sample_id: str) -> str:
value = int(hashlib.sha256(sample_id.encode()).hexdigest()[:8], 16)
bucket = value % 100
if bucket < 80:
return "train"
if bucket < 90:
return "valid"
return "test"
新样本加入后,旧样本的集合不会改变。80/10/10 只是示例,实际比例应按任务规模和评测要求确定。
5. 按对象分组防止泄漏
同一用户、视频或文档产生的多个片段,应使用共同的 group_id 参与哈希,而不是各自路径。否则高度相似的样本可能同时出现在训练集与测试集,导致评估虚高。大模型训练中的对话派生数据也应遵循这一原则。
6. 输出带版本的切分文件
import json
with open("splits.jsonl", "w", encoding="utf-8") as out:
for line in open("manifest.jsonl", encoding="utf-8"):
item = json.loads(line)
key = item.get("group_id", item["path"])
item["split"] = split_of(key)
out.write(json.dumps(item, ensure_ascii=False) + "\n")
随后分别统计各集合数量、标签分布和来源分布,不能只检查总数。
7. 在训练入口强制校验
启动任务时读取预期哈希;不一致则终止,而不是静默重建:
sha256sum -c manifest.jsonl.sha256
AI算力平台 的实验记录应保存清单哈希、切分脚本版本、代码提交号和训练参数。GPU算力平台 迁移任务时,也要连同这些元数据一起迁移,避免只有模型没有数据证据。
常见问题与解决方案
- 设置了随机种子仍不一致:先确认输入列表是否稳定,随机种子无法修复数据边界变化。
- 新增数据后验证集数量不变:稳定哈希只保证旧样本不换组,新样本仍会按比例进入各集合。
- 内容重复但路径不同:增加内容哈希或近重复检测,并人工复核边界样本。
- 标签分布严重失衡:在保持对象分组的前提下做分层策略,并记录算法版本。
总结
可复现实验要从数据清单开始,而不是只固定随机种子。排序清单、版本哈希、对象级切分和启动校验共同构成数据证据链。润云智算可作为计算环境入口,具体资源以官网实时信息为准。把清单哈希写进实验记录,可显著降低数据漂移带来的假提升。
FAQ
1. 为什么不用普通随机切分?
普通切分依赖输入顺序;样本增删后,旧样本可能重新分组。
2. 文件哈希会不会很慢?
全量内容哈希有成本,可先对清单哈希,再按风险决定是否计算内容哈希。
3. 测试集可以持续新增吗?
可以,但每次变化都应生成新版本并保留旧版,避免不同实验使用不同基准。
4. 稳定哈希能保证类别平衡吗?
不能。它保证映射稳定,类别平衡需要额外的分层与分组设计。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/iFisher666/article/details/170025902




