想象一个老档案馆:几十万份实验手稿堆满了房间,但管理员没有为任何一份手稿填写档案卡。没有日期,没有作者,没有仪器型号。三个月后,你想找回“那次把学习率降到万分之一后准确率明显提升”的实验——手稿还在,但你不知道它在哪儿,也不知道当时用的代码和参数是什么。机器学习团队每天都在生产这样的手稿。训练结束后,模型权重还躺在磁盘上,但“当时用了哪份代码、哪组超参、哪个数据集版本”却很快被遗忘。实验元数据(Experiment Metadata)就是防遗忘的档案卡。它是描述实验的数据:代码版本是仪器型号,超参数是试剂配比,环境依赖是温湿度,评估指标是观察结果。本文将从概念、模型设计、自动采集、存储、检索到追踪实践,讲清楚如何为每一次实验建立一份数字档案。

岗位关联

掌握实验元数据设计与追踪,是 AI 工程师从“会跑模型”走向“管好实验”的关键技能,能直接提升团队复现效率与工程质量。

目录
  1. 可视化演示
  2. 实验元数据概念
  3. 元数据模型设计
  4. 自动采集机制
  5. 元数据存储方案
  6. 检索与查询
  7. 实验追踪实践
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

动态演示实验元数据的核心机制,通过入门/进阶/实战/优化四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

实验元数据:实验元数 实验元数据模型与核心字段设计 代码版本与参数配置的绑定机制 核心机制可视化 实验元数据整体架构与关键组件

实验元数据概念

想象你走进一座巨大的档案馆,里面堆着几万份手稿。管理员没有给任何一份手稿贴标签——没有作者、没有日期、没有仪器说明。三个月后,你想找到那份“调低学习率后效果变好”的实验,只能翻遍全馆,最终放弃。机器学习团队每天都在生产这样的手稿:每次训练跑完,模型权重还在,但“当时用了什么代码、什么参数、什么数据”却常常随着时间蒸发。档案馆里那张丢失的标签,就是实验元数据。

实验元数据是“描述实验的数据”(data about data)。它不复现模型本身,而是回答五个核心问题:这次实验用了哪份代码?用了哪些超参数?用了哪个数据集版本?在什么环境下运行?最后得到了什么指标?它位于项目研发的“档案区”,是 MLOps 工程中实验追踪的第一块基石,也是最容易被新人忽略、却决定复现成败的一环。

典型实验元数据包括:代码版本(git commit hash)、启动命令与参数配置、数据版本或数据指纹、运行环境(Python 版本、依赖包、CUDA 版本)、模型结构标识、评估指标(loss、accuracy)、实验开始与结束时间等。这些字段共同构成一次实验的“档案身份”。有了它,团队才能对成百上千次实验进行筛选、对比和追溯,而不是靠记忆“猜”。

有了档案卡,三个月后你只需在检索目录里输入“学习率=1e-4”,就能锁定那次实验。没有元数据,实验等于从未存在过;有了元数据,每一次尝试都沉淀为团队资产。

C=FrecordedFrequired×100%C = \frac{F_{\text{recorded}}}{F_{\text{required}}} \times 100\%
这个公式衡量一次实验元数据的“完整度”。完整度越高,实验档案越可信,复现时踩坑的概率越低。
  1. 已记录字段数 \(F_{\text{recorded}}\)一次实验中实际采集到并成功写入元数据仓库的字段数量,例如代码版本、超参数、数据版本等。
    FrecordedF_{\text{recorded}}
  2. 必填字段总数 \(F_{\text{required}}\)团队根据自己的项目规范定义的一组必填字段,缺少它们,实验就无法被完整复现。
    FrequiredF_{\text{required}}
  3. 计算完整比例两者相除后乘以 100%,得到完整度百分比。数值越接近 100%,说明这次实验的“档案卡”越完整。
    FrecordedFrequired×100%\frac{F_{\text{recorded}}}{F_{\text{required}}} \times 100\%

元数据模型设计

档案馆里最怕两种卡片:一种栏目太多,管理员填得痛苦,最后留一大片空白;一种栏目太少,关键信息没地方写,复现时四处抓瞎。元数据模型就是那张档案卡的“版式设计”——它决定了一次实验要记录哪些字段、字段类型、是否必填,以及这些字段如何组织。好的版式,让填写者省力,让查询者省心。

元数据模型的核心设计思路是分层。常见的三层结构是:实验层、运行层、指标层。实验层记录“为什么做”,包括任务目标、实验名、负责人;运行层记录“怎么做”,包括代码版本、超参数、数据版本、环境快照;指标层记录“做得怎样”,包括损失函数值、准确率、训练吞吐量。每层通过唯一的 experiment_id 关联,一个实验可以对应多次运行(run_id),从而支持同一配置下的多次重复实验比较。

除了分层,还需约定命名规范:字段名统一用蛇形命名(例如 learning_rate 而不是 lr 或 学习率),时间统一用 ISO 8601 格式,布尔值统一用 true/false。版本关联是另一个关键点——元数据应该记录“当前代码版本对应的数据版本”,因为代码、数据、环境三者是联合决定结果的“铁三角”。模型设计上还要为未来扩展留好余地,新增字段不影响已有记录读取。

设计良好的档案卡,让归档者不用思考“该填什么”,也让检索者不用猜测“字段叫什么”。版式即规范,规范即生产力。

score=w1⋅I(code matches)+w2⋅(1−∣pq−ps∣pmax⁡−pmin⁡)+w3⋅(1−∣mq−ms∣mmax⁡−mmin⁡)\text{score} = w_1 \cdot \mathbb{I}(\text{code matches}) + w_2 \cdot \left(1 - \frac{|p_q - p_s|}{p_{\max} - p_{\min}}\right) + w_3 \cdot \left(1 - \frac{|m_q - m_s|}{m_{\max} - m_{\min}}\right)
这条公式展示了一个元数据检索评分模型:把代码匹配、超参数接近度、指标接近度加权求和,用来给历史实验排序,找出与当前目标最相似的档案。
  1. 代码匹配指示项当检索要求的代码版本与历史实验完全一致时取 1,否则取 0,用于保证复现时代码同源。
    w1⋅I(code matches)w_1 \cdot \mathbb{I}(\text{code matches})
  2. 超参数相似度用归一化距离把超参数差异映射到 0~1,差异越小越接近目标,避免量纲影响。
    w2⋅(1−∣pq−ps∣pmax⁡−pmin⁡)w_2 \cdot \left(1 - \frac{|p_q - p_s|}{p_{\max} - p_{\min}}\right)
  3. 指标接近度评估指标差距同样归一化,用于筛选效果相近的历史实验,适合做效果对比。
    w3⋅(1−∣mq−ms∣mmax⁡−mmin⁡)w_3 \cdot \left(1 - \frac{|m_q - m_s|}{m_{\max} - m_{\min}}\right)

自动采集机制

手写档案卡总会漏字、写错字。档案馆后来引进了自动打印系统,仪器一启动,标签就自动生成,温度、湿度、仪器编号分毫不差。实验元数据的采集也应该这样:不依赖研究员的记忆和自觉,而是让工具在实验运行的边界处自动捕获信息。

自动采集的核心原则是“在信息产生的那一刻就钉住它”。代码版本应从版本控制系统中读取,例如在训练脚本启动时调用 git rev-parse HEAD 拿到当前 commit;超参数应从配置中心或启动命令中注入,将解析后的参数对象直接序列化进元数据;环境信息靠 pip freeze 或 platform 模块获取,保证若干个月后还能重建相同的运行环境;训练过程中的指标则由训练框架的回调函数(如 epoch 结束回调)自动记录,写入档案。

一条完整的自动采集链路通常长这样:训练入口读取配置 → 生成 experiment_id → 采集代码版本与环境信息 → 启动训练 → 回调记录每个 epoch 的指标 → 训练结束时统一归档。整个过程无需人工干预。它最大的价值是消除了“忘记记录”和“记录不准确”这两类人为错误,让档案卡从源头就真实可信。

自动打印的档案卡,既快又准。把采集动作交给代码,研究员才能把精力留给真正需要判断力的工作——分析实验、设计下一步。

A=FautoFtotal×100%A = \frac{F_{\text{auto}}}{F_{\text{total}}} \times 100\%
采集覆盖率是衡量自动化程度的关键指标,数值越高,说明越少依赖人工补录。
  1. 自动采集字段数 \(F_{\text{auto}}\)系统在训练过程中无需人工操作就能自动写入的元数据字段数量。
    FautoF_{\text{auto}}
  2. 应采字段总数 \(F_{\text{total}}\)按照元数据模型规定,一次实验应当记录的全部字段数量。
    FtotalF_{\text{total}}
  3. 覆盖率计算两者相除得到百分比,覆盖率在 80% 以下时,通常说明还有不少字段在靠人工补录。
    FautoFtotal×100%\frac{F_{\text{auto}}}{F_{\text{total}}} \times 100\%

元数据存储方案

档案卡设计好了,不能随便塞进抽屉。如果散落在个人电脑的 Excel 表格里,和没有档案卡几乎没有区别。元数据存储需要一个“档案库”:结构清晰、写入可靠、历史可追溯。

存储选型要结合团队规模和查询需求。小团队或早期项目,直接用 JSONL 文件或 SQLite 就能起步,成本低、迁移容易;当实验数量上万、需要频繁检索时,可以引入 PostgreSQL 或 MongoDB 这类通用数据库,给字段建索引;更成熟的企业则使用 MLflow、Weights & Biases 等 MLOps 平台的元数据服务,把存储、检索、可视化一并托管。

写入策略上,最重要的原则是“不可变记录”:一条元数据一旦写入,就不再修改或覆盖,只允许追加新版本。例如某次实验的指标记录有误,不是去改旧记录,而是新增一条修正记录。这样任何时候回看,都能看到历史原貌,便于审计和复盘。配合定期归档、多副本冗余和访问控制,档案库才真正可靠。

摆放整齐的档案库,让“找东西”变成一件低成本的事,也让“证明东西没被动过”成为可能。存储不是终点,而是检索和复现的地基。

checksum=SHA256(JSON.stringify(record))\text{checksum} = \text{SHA256}\big(\text{JSON.stringify}(record)\big)
这条公式为每条元数据记录生成唯一校验和,用来检测记录是否被篡改,是“不可变档案”的技术保障。
  1. 序列化记录将元数据记录按固定字段顺序序列化成字符串,确保同一条记录永远只有一种序列化结果。
    JSON.stringify(record)\text{JSON.stringify}(record)
  2. SHA256 哈希把任意长度的字符串映射为固定 256 位指纹;哪怕只改一个字符,指纹也会完全不同。
    SHA256(⋅)\text{SHA256}(\cdot)
  3. 校验值防篡改将指纹随记录一起存储,后续比对指纹即可判断记录是否被修改过。
    checksum\text{checksum}

检索与查询

档案本身不会说话,检索员要能从上千张卡片里快速抽出目标。元数据只有被查询才有价值。当团队积累了大量实验记录后,最需要的能力就是:按条件过滤、按相关性排序、按差异对比。

检索的常见维度包括:实验名、代码版本、数据集标签、超参数取值范围、指标阈值。例如,“找到所有 batch_size 在 32 到 64 之间、且准确率大于 0.9 的历史实验”——这就是一个典型的结构化查询,可以用 SQL、JSON 过滤器或平台 API 完成。结果通常按时间倒序排列,也可以按某个指标排序,以便快速锁定最优实验。

更高级的查询是“相似实验搜索”:给定一组目标超参数,系统按元数据字段计算距离,返回最接近的历史实验及其结果。这能帮助团队回答两个高价值问题:这个参数组合是不是已经试过了?上次类似的实验是怎么配置的?在超参数搜索中,先查档案再开新实验,往往能省下大量算力。

好的查询,让历史经验从“死档案”变成“活情报”。检索不是找一份记录,而是帮团队回答“接下来怎么办”。

d(pq,ps)=∣pq−ps∣pmax⁡−pmin⁡d(p_q, p_s) = \frac{|p_q - p_s|}{p_{\max} - p_{\min}}
这是超参数归一化距离公式,用于量化“目标参数”与“历史参数”之间的差异,是所有相似检索的基础。
  1. 目标值 \(p_q\)你在检索时输入的目标超参数值,例如期望的学习率。
    pqp_q
  2. 历史值 \(p_s\)历史实验中记录的同一超参数的实际值。
    psp_s
  3. 归一化距离差值除以该参数的取值范围,得到一个 0~1 的相对差异,便于在不同量纲参数之间统一比较。
    ∣pq−ps∣pmax⁡−pmin⁡\frac{|p_q - p_s|}{p_{\max} - p_{\min}}

实验追踪实践

档案不是死躺在库里的,它要跟着实验的整个生命流程流转。从实验设计、启动、运行、结束、分析到复现,元数据在每个阶段被写入、读取、更新。这才是元数据系统的真正闭环——实验追踪(Experiment Tracking)。

全流程追踪要求团队建立规范:每次实验必须走“创建 → 记录 → 归档”的闭环。创建时生成 experiment_id 和 run_id;运行中自动采集代码、参数、环境与指标;结束后标记状态(成功/失败/已废弃);需要复现时,按档案卡上的信息重建环境、切到对应代码版本、填入参数,一键重跑。这个过程把“那次实验怎么做的”从个人记忆变成组织记忆。

在团队协作中,追踪实践还意味着责任明确:谁创建实验、谁修改参数、谁归档结果,都有迹可循。成熟的 MLOps 工具链会把元数据与模型注册、CI/CD 流水线打通:模型从实验晋升到发布时,自动携带完整的元数据档案,供后续审计和监控。这样一来,实验追踪就不再是一个孤立功能,而是整个 AI 工程质量的支柱。

流动的档案让团队协作顺畅无阻:新人能复现旧实验,审计能查到完整链路,算法工程师能站在历史经验上往前走。档案不封存,才是它最大的价值。

T=NtrackedNtotal×100%T = \frac{N_{\text{tracked}}}{N_{\text{total}}} \times 100\%
追踪完整度计算的是“有完整元数据记录的实验”占全部实验的比例,它是衡量团队工程化水平的一个直观指标。
  1. 已追踪实验数 \(N_{\text{tracked}}\)走完了元数据采集与归档闭环的实验数量。
    NtrackedN_{\text{tracked}}
  2. 实验总数 \(N_{\text{total}}\)团队在统计周期内执行的实验总数,包括中间放弃的、没记录的。
    NtotalN_{\text{total}}
  3. 完整度计算两者相除得到追踪完整度,长期低于 80% 说明有大量实验处于“黑箱”状态。
    NtrackedNtotal×100%\frac{N_{\text{tracked}}}{N_{\text{total}}} \times 100\%

AI 应用场景

深度学习训练平台自动归档

阶段:实验追踪

解决的问题:训练任务分散在多个 GPU 集群上,实验代码、参数和环境各不相同,靠研究员手动整理根本来不及,导致大量实验无法复现。

具体案例:某自动驾驶团队每天启动上百次训练任务。平台在每次任务启动时自动采集 git commit、超参数配置、CUDA 版本、数据版本,训练结束时由回调记录评估指标,所有数据进入统一实验档案库。算法工程师调出任意一天的历史,一键即可复现当时的实验环境,大大减少“哎呀之前那个效果怎么跑出来的”的困惑。

模型发布合规审计

阶段:模型治理与发布

解决的问题:金融、医疗等强监管场景要求说明模型训练全过程,人工整理材料繁琐且容易漏项。

具体案例:某金融风控团队上线反欺诈模型前,需要向审计部门提交训练档案。元数据系统自动生成可读报告:代码版本、数据版本、超参数、训练环境、评测指标、发布审批链一应俱全,审计材料准备时间从两周缩短到两天。

超参数搜索避免重复算力

阶段:超参数优化

解决的问题:团队经常重复搜索相同或相似的参数区间,浪费大量 GPU 算力。

具体案例:某推荐系统团队在做超参搜索前,先查询元数据仓库,发现三个月前已有类似区间的完整实验记录。他们直接复用历史结论,只在小范围做增量搜索,节省约 40% 的搜索预算。

Python 演示

python79 行
import hashlibimport jsonimport platformimport timefrom dataclasses import dataclass, fieldfrom typing import List, Dict  @dataclassclass ExperimentMetadata:    name: str    params: dict    code_version: str = ""    environment: str = ""    metrics: dict = field(default_factory=dict)    timestamp: float = field(default_factory=time.time)     def capture_code_version(self) -> None:        """模拟捕获当前代码版本的指纹。"""        self.code_version = hashlib.sha256(            open(__file__, "rb").read()        ).hexdigest()[:12]     def capture_environment(self) -> None:        """记录运行环境的基本信息。"""        self.environment = "Python {} on {}".format(            platform.python_version(), platform.platform()        )     def to_json(self) -> dict:        """将元数据对象转成字典,便于序列化。"""        return {            "name": self.name,            "params": self.params,            "code_version": self.code_version,            "environment": self.environment,            "metrics": self.metrics,            "timestamp": self.timestamp,        }  def save_record(record: dict, path: str = "experiments.jsonl") -> None:    """将一条实验元数据以 JSON 行格式追加保存。"""    with open(path, "a", encoding="utf-8") as f:        f.write(json.dumps(record) + "\n")  def load_records(path: str = "experiments.jsonl") -> List[dict]:    """读取全部实验元数据记录。"""    records = []    try:        with open(path, "r", encoding="utf-8") as f:            for line in f:                if line.strip():                    records.append(json.loads(line))    except FileNotFoundError:        pass    return records  def search_records(records: List[dict], key: str, value: str) -> List[dict]:    """按字段值检索实验记录。"""    return [r for r in records if r.get(key) == value]  if __name__ == "__main__":    exp = ExperimentMetadata(        name="lr-benchmark",        params={"lr": 1e-4, "batch_size": 64}    )    exp.capture_code_version()    exp.capture_environment()    exp.metrics = {"accuracy": 0.912, "loss": 0.231}    save_record(exp.to_json())     hist = load_records()    print("实验档案总数:", len(hist))    for r in search_records(hist, "name", "lr-benchmark"):        print("命中:", r["name"], r["code_version"], r["metrics"])
目的:演示实验元数据的自动采集、追加存储与按字段检索,展示一个最小可用的实验档案系统。
  1. self.code_version = hashlib.sha256(open(__file__, "rb").read()).hexdigest()[:12]用代码文件指纹模拟 git commit hash,实现代码版本自动捕获。
  2. self.environment = "Python {} on {}".format(...)自动记录 Python 与操作系统信息,复现时重建环境。
  3. with open(path, "a", encoding="utf-8") as f:以追加写模式打开档案文件,保证历史记录不被覆盖。
  4. f.write(json.dumps(record) + "\n")使用 JSONL 格式存储,每行一条独立记录,方便增量读取。
  5. records.append(json.loads(line))从 JSONL 中解析历史记录,还原为结构化字典。
  6. return [r for r in records if r.get(key) == value]按字段值过滤检索,类似档案卡查询。

常见误区

误区很多初学者认为训练完把 `.pt` 或 `.h5` 权重文件存下来,实验就完整了,后面随时可以加载继续用。

正解模型权重只是实验的产物之一。没有代码版本、超参数、数据版本和环境信息,权重就像一个没有图纸的零件——你知道它能跑,却不知道它是怎么做出来的,也无法复现训练过程。

为何常见:因为权重文件是训练结束后最显眼、最“重”的东西,而元数据是隐形的,容易被忽略。

误区有人认为把训练日志(print 输出、loss 曲线)保存下来就等于记录了元数据。

正解日志是运行事件流,通常是非结构化文本;元数据是描述实验身份的结构化字段,如代码版本、参数配置、数据集指纹。两者应该分开采集,日志用于排查问题,元数据用于复现和检索。

为何常见:两者都在训练时产生,并且都包含时间和数值,很容易被混为一谈。

误区实验少的时候,觉得用 Excel 手动记录实验配置和结果完全够用。

正解手动记录高度依赖自觉,真实场景中经常出现漏记、错记、格式不统一。可靠方案是自动化采集,在代码版本、超参注入、环境探测、训练回调处自动打点。

为何常见:初期实验次数少,手动负担低,看不到自动化的必要性。

误区为了不遗漏,把原始日志、整个参数对象、各种环境变量全部塞进一个字段,认为存得越多越安全。

正解不设计字段结构会导致严重的信息污染——数据无法查询、无法对比、冗余膨胀。正确的做法是分层建模:区分必填与可选,定义字段类型和命名规范,保证数据可用性。

为何常见:怕遗漏的心理促使“全存”,但忽略了存储系统是为“检索”服务的。

误区实验指标记录错了,直接在数据库里 update 那条记录,认为改过来就好。

正解元数据是历史档案,覆盖更新会破坏审计链路,让复现和追责无从谈起。正确做法是追加修正记录,或者标记旧记录为“已废弃”,保留完整时间线。

为何常见:受业务系统“以最新为准”的习惯影响,忽略了实验档案的不可变需求。

面试题

Q1. 实验元数据主要描述的是什么?

单选题 · easy

  • A.实验产生的模型权重文件
  • B.实验本身的全过程信息和配置← 正确答案
  • C.训练数据的原始采集地点
  • D.用户的个人身份信息

答案:B。实验元数据是“描述实验的数据”,关注实验过程和信息配置,而不是模型权重、数据来源或个人身份。它回答的是“这次实验怎么跑的”,而非“跑出来的东西是什么”。

Q2. 下列哪项属于典型实验元数据?

单选题 · easy

  • A.训练后的模型参数量
  • B.代码版本号和超参数配置← 正确答案
  • C.推理时的用户反馈语料
  • D.模型在云端运行的账单

答案:B。代码版本号和超参数配置是典型元数据,它们是复现实验的关键输入。模型参数量属于模型结构信息,用户反馈和账单不属于实验配置本身。

Q3. 为什么代码版本是实验元数据的核心字段?

单选题 · mid

  • A.因为代码版权需要特别保护
  • B.因为代码版本决定实验是否可复现← 正确答案
  • C.因为代码版本号必须由管理员审批
  • D.因为代码版本能替代模型权重

答案:B。同一份代码的不同版本可能产生完全不同的实验结果。记录 git commit hash 能精确定位训练时运行的代码,是复现实验的关键。代码版本与版权、审批、模型权重无关。

Q4. 元数据模型中的“分层设计”主要指什么?

单选题 · mid

  • A.将字段按实验、运行、指标分层组织← 正确答案
  • B.将数据库分成多个物理磁盘
  • C.将团队按资历分成不同等级
  • D.将训练数据按难度分层抽样

答案:A。分层设计是把元数据字段分为实验层(为什么做)、运行层(怎么做)、指标层(做得怎样),既保持清晰又便于扩展。它和数据库物理存储、团队层级、数据抽样都无关。

Q5. 自动采集实验元数据可以借助哪些手段?

多选题 · mid

  • A.git 命令或 CI 流水线捕获代码版本← 正确答案
  • B.训练框架回调函数捕获超参数和指标← 正确答案
  • C.pip freeze 或环境探测记录依赖版本← 正确答案
  • D.实验结束后请工程师手写实验报告

答案:ABC。自动采集依赖工具链:git 提供版本、训练回调捕获运行时信息、环境探测记录依赖。手写报告属于人工采集,违背自动化原则。

Q6. 为什么元数据记录通常设计为“不可变”?

单选题 · mid

  • A.因为数据库磁盘是只读的
  • B.因为要保留原始快照便于审计和复现← 正确答案
  • C.因为实验团队不想维护数据库
  • D.因为训练代码本身被加密了

答案:B。元数据是历史档案,覆盖更新会破坏时间线,导致无法追溯真实过程。不可变追加记录保证每个历史状态都可信,是审计和复现的基础。

Q7. 实验检索中常见的过滤查询维度有哪些?

多选题 · hard

  • A.超参数取值范围← 正确答案
  • B.评估指标阈值← 正确答案
  • C.数据集版本标签← 正确答案
  • D.训练时所在的咖啡馆位置

答案:ABC。检索维度必须是结构化且有意义的字段:超参数、指标、数据集版本都是复现和对比的有效条件。咖啡馆位置不是实验配置信息,不进入检索维度。

Q8. 实验追踪的最终目的是什么?

单选题 · easy

  • A.让实验可以被复现和比较← 正确答案
  • B.让模型训练速度变快
  • C.让 GPU 使用率更高
  • D.让代码仓库体积变大

答案:A。追踪元数据的根本目的是让实验结果可复现、可比较,从而沉淀团队经验。它不直接加速训练、提升显存利用率或增加代码量。

Q9. 某团队共执行 100 场实验,其中 60 场记录了全部必填字段,其余 40 场缺少关键配置,该团队的实验元数据完整度是?

单选题 · hard

  • A.60%← 正确答案
  • B.0.6%
  • C.40%
  • D.160%

答案:A。完整度 = 已记录必填字段的实验数 / 实验总数 × 100% = 60 / 100 = 60%。缺少关键配置的记录不能计入完整记录,因此不是 40% 或 160%。

Q10. 关于实验元数据与日志的区别,正确的是?

多选题 · hard

  • A.日志面向运行事件,元数据面向实验身份← 正确答案
  • B.日志通常非结构化,元数据常为结构化字段← 正确答案
  • C.日志可以完全替代元数据进行实验复现
  • D.元数据包含代码版本、超参等描述信息← 正确答案

答案:ABD。日志记录运行过程中的事件流,适合排查问题;元数据描述实验身份和配置,结构清晰,适合检索复现。二者用途不同,日志不能替代元数据。