1. 项目概述:为什么我们需要一个实验追踪工具?

如果你在机器学习或数据科学领域工作过一段时间,大概率经历过这样的场景:为了优化一个模型,你尝试了十几种不同的超参数组合,把结果记录在一个混乱的Excel表格里。一周后,当你想复现那个“看起来不错”的模型时,却发现忘了记录当时用的具体学习率,或者那个关键的随机种子。又或者,你的团队有五个成员在并行实验,每个人都在自己的本地机器上跑代码,结果文件散落在各处,沟通成本高得吓人。这种“实验管理混乱”的问题,几乎是每个从业者成长路上的必经之痛。

neptune-ai/neptune-client 就是为了解决这个核心痛点而生的。它是一个开源的元数据存储库,专门为机器学习实验的生命周期管理而设计。简单来说,它就像你所有实验的“黑匣子”和“中央控制台”。无论你是在调试一个简单的线性回归,还是在训练一个耗资巨大的百亿参数大模型,Neptune都能帮你自动、系统地记录每一次实验的完整上下文:代码版本、超参数、训练过程中的损失和指标曲线、输出的图表、甚至是大到几个G的模型文件。它的价值不在于替代你的训练代码,而在于为你的科研或工程工作流注入“可观测性”和“可复现性”,把一次性的、黑盒的试错过程,变成可追溯、可分析、可协作的标准化流程。

我最初接触Neptune是在一个多模态项目的攻坚期,团队里算法工程师和研究员各自为战,实验记录全靠自觉和每周例会上的“记忆回溯”,效率极其低下。引入Neptune后,最直接的感受是“心里有底了”。任何一次实验的完整状态都被固化下来,比较不同思路的优劣变得有据可依,新人接手项目也能快速理解之前的探索路径。它不是一个炫技的工具,而是一个能切实提升团队研发效能和工程成熟度的基础设施。

2. 核心架构与设计哲学解析

2.1 元数据存储的核心:日志、获取、查询与可视化

Neptune的架构设计清晰地反映了其作为“实验追踪平台”的定位,而非一个简单的日志库。它的核心可以概括为四个动词: Log(记录)、Fetch(获取)、Query(查询)、Visualize(可视化) 。这构成了一个完整的数据闭环。

Log(记录) 是起点。Neptune Client提供了极其灵活的API,允许你将几乎任何东西记录为一个“Run”(一次实验运行)。这不仅仅是标量值(如准确率),更包括:

  • 参数(Parameters) : 记录实验配置,如学习率、批大小、模型结构名。
  • 指标(Metrics) : 记录训练过程中的损失、准确率等时序数据。
  • 文件(Files) : 记录模型检查点(.pth, .h5)、配置文件、可视化图表(如图像、Matplotlib/Plotly图表)。
  • 文本(Text) : 记录实验描述、观察结论、错误信息。
  • 媒体(Media) : 直接记录图像、音频样本用于模型输出可视化。

关键在于,所有这些记录都是 异步和非阻塞 的。当你调用 run[“train/loss”].log(loss_value) 时,数据会被放入后台队列,由单独的线程上传到Neptune服务器(或你自托管的实例),而不会阻塞你的训练循环。这对于长时间训练任务至关重要。

Fetch(获取)与 Query(查询) 是分析的基础。所有记录的数据都被结构化和索引化。你可以通过Python API或Web UI,轻松获取某次实验的所有信息,或者更强大的是, 跨实验查询 。例如:“找出所有使用 ResNet50 作为主干网络,且最终验证准确率大于92%的实验”。这种查询能力,将分散的实验记录变成了一个可挖掘的知识库。

Visualize(可视化) 是价值呈现。Neptune的Web Dashboard自动将记录的时序指标绘制成交互式图表,并列展示不同实验的对比。你可以自定义仪表板,将关键的指标、参数、结果图表并排显示,一目了然地看出哪种配置更优。

设计哲学启示 :Neptune没有试图接管你的训练流程(像某些AutoML平台那样),而是选择了“非侵入式”的集成路径。它通过一个轻量级客户端库,嵌入到你现有的代码中,扮演“观察者”和“记录员”的角色。这种设计最大限度地降低了使用门槛和迁移成本,让你可以继续使用熟悉的PyTorch、TensorFlow、JAX等框架,只需添加几行记录代码即可获得强大的管理能力。

2.2 核心概念:Run、Project、Namespace与Field

理解Neptune的四个核心概念是高效使用它的关键:

  1. Run :这是最核心的概念,代表 一次实验执行 。一次训练、一次推理测试、一次数据预处理流水线,都可以是一个Run。每个Run有唯一的ID,包含了一次实验的所有元数据。在代码中,它通常通过 neptune.init_run() 初始化。

  2. Project 项目的容器 。一个Project包含一组相关的Runs。通常,一个机器学习项目(如“商品推荐模型v2”)对应一个Neptune Project。团队所有成员都在同一个Project下创建Run,实现了实验的集中管理。

  3. Namespace(命名空间) :这是Neptune组织Run内部数据的 逻辑文件夹结构 。它通过斜杠( / )来定义层级,例如 train/loss , validation/accuracy , images/samples 。命名空间使得海量的记录数据变得井井有条,而不是一个扁平的大列表。清晰的命名空间规划是良好使用习惯的体现。

  4. Field :放置在Namespace下的 具体数据字段 。例如, train/loss 是一个Field,用于记录训练损失值; parameters/model_name 也是一个Field,用于记录模型名称这个参数。Field的类型决定了Neptune如何存储和展示它(如图表、文本、文件预览)。

它们之间的关系 :一个用户属于一个组织(Org),一个组织下有多个项目(Project),一个项目下包含多次实验运行(Run),一个Run内部通过命名空间(Namespace)来组织各种各样的数据字段(Field)。这种层次结构完美映射了真实的研发管理场景。

2.3 客户端-服务器模式与部署选项

Neptune采用经典的客户端-服务器(C/S)架构。

  • 客户端(Client) : 即 neptune-client 这个Python库。它被安装在你的训练环境(本地笔记本、训练服务器或云上VM)中,负责收集元数据并发送到服务器。
  • 服务器(Server) : 负责接收、存储、索引和提供查询与可视化服务。这里给了用户两个选择,这也是Neptune的一大优势:

1. Neptune Cloud(托管服务) : 这是最快捷的入门方式。你只需要注册一个免费账户,获取一个API令牌,就可以开始使用。服务器由Neptune.ai公司托管和维护,你无需关心基础设施、扩容、备份等问题。免费套餐通常提供足够的存储和运行次数供个人和小团队使用。对于大多数用户,尤其是刚开始接触或团队资源有限时,这是推荐的选择。

2. Neptune Server(自托管) : 对于数据敏感、需要完全内部控制、或实验量极大的企业和研究机构,Neptune提供了自托管的解决方案。你可以将其部署在自己的数据中心或私有云(如AWS VPC、GCP项目内)的Kubernetes集群上。这提供了最高的安全性和定制化能力,但需要相应的运维投入。

实操心得:如何选择? 对于个人学习、初创团队或对外部托管没有合规顾虑的项目,直接使用Cloud版,省心省力。如果你的训练数据涉及用户隐私、商业机密,或者公司IT政策要求所有数据不出域,那么自托管是必须的。自托管的安装过程基于Helm Chart,对于有K8s经验的团队来说部署并不复杂,但需要为其分配持久化存储和计算资源。

3. 从零开始:安装、配置与第一个实验

3.1 环境安装与基础配置

首先,通过pip安装客户端库。建议使用虚拟环境(如conda或venv)以隔离依赖。

pip install neptune

安装完成后,配置的核心是 认证令牌(API Token) 。这是你的客户端与Neptune服务器(无论是Cloud还是自托管)通信的凭证。

对于Neptune Cloud用户

  1. 登录 app.neptune.ai
  2. 点击右上角头像,选择 “Get your API token”
  3. 复制弹出的令牌字符串(一长串字母数字组合)。

接下来,有几种方式配置令牌,安全性从高到低推荐

  • 最佳实践(环境变量) :在运行实验的终端或服务器上,设置环境变量。这避免了将令牌硬编码在代码中。
    export NEPTUNE_API_TOKEN=你的长令牌
    
    在你的Python代码中,Neptune会自动读取这个环境变量。
  • 本地配置文件 :可以运行 neptune account login 命令,按提示输入API令牌,它会安全地存储在你的用户目录下。适合本地开发。
  • 代码中初始化(不推荐用于生产) :直接在 init_run init_project 时传入 api_token 参数。这种方法最不安全,因为令牌可能随代码被意外提交到版本库。

对于自托管用户 :除了令牌,你还需要在初始化时指定服务器的地址( api_url ),例如 api_url=”http://your-neptune-server.com”

3.2 创建你的第一个追踪实验

让我们用一个最简单的PyTorch MNIST训练示例,看看如何集成Neptune。假设你已经有一个基础的训练脚本。

步骤1:初始化一个Run 在训练脚本的开头,初始化一个Run对象。 project 参数的格式是 ”workspace-name/project-name” ,你需要在Neptune UI中先创建好对应的项目。

import neptune

run = neptune.init_run(
    project=”your-workspace/your-project-name”, # 例如 “ml-team/mnist-classification”
    name=”cnn-experiment-01″, # 为这次运行起个易懂的名字
    tags=[“cnn”, “pytorch”, “baseline”], # 打上标签,方便后续筛选
)

这行代码执行后,在Neptune的Web UI上,你会立刻看到一个新的Run被创建出来,状态是“运行中”。

步骤2:记录超参数 在定义模型和优化器之前,将你的配置记录下来。建议使用一个配置字典。

params = {
    “lr”: 0.001,
    “batch_size”: 64,
    “epochs”: 10,
    “model_arch”: “SimpleCNN”,
}
run[“config/parameters”] = params # 将整个字典记录到 config/parameters 命名空间下

在UI上,这些参数会以整洁的键值对形式展示。

步骤3:在训练循环中记录指标 这是最常用的部分。在每个epoch结束后,记录损失和准确率。

for epoch in range(params[“epochs”]):
    # … 训练一个epoch …
    train_loss, train_acc = train_one_epoch(model, train_loader, optimizer)
    val_loss, val_acc = validate(model, val_loader)

    # 记录标量指标
    run[“train/loss”].append(train_loss)
    run[“train/accuracy”].append(train_acc)
    run[“val/loss”].append(val_loss)
    run[“val/accuracy”].append(val_acc)

    # 记录一个随时间变化的图表(例如,学习率调度器的值)
    current_lr = scheduler.get_last_lr()[0]
    run[“metrics/learning_rate”].append(current_lr)

    print(f”Epoch {epoch}: Train Loss={train_loss:.4f}, Val Acc={val_acc:.4f}”)

.append() 方法会将数值作为时序数据记录,Neptune会自动将其绘制成曲线图。

步骤4:记录模型检查点和图表 在验证集准确率提升时,保存模型,并记录模型文件和一些可视化结果。

if val_acc > best_acc:
    best_acc = val_acc
    torch.save(model.state_dict(), “best_model.pth”)
    # 将模型文件记录到Neptune
    run[“model/checkpoints/best_model”].upload(“best_model.pth”)

    # 记录一个混淆矩阵图像
    fig, ax = plt.subplots()
    # … 绘制混淆矩阵到ax …
    run[“images/confusion_matrix”].upload(neptune.types.File.as_image(fig))
    plt.close(fig)

步骤5:优雅地结束Run 训练结束后,确保停止Run。 stop() 方法会确保所有在后台队列中的数据都被上传完毕。

run.stop()

你也可以使用上下文管理器,这是更推荐的方式,它能确保即使在发生异常时Run也能被正确停止。

with neptune.init_run(project=…, name=…) as run:
    # 你的所有训练和记录代码在这里
    # …
    # 退出with块时,run会自动停止

完成这五步后,刷新Neptune UI,你就能看到一个完整的实验记录,包含了所有参数、动态更新的指标图表、保存的模型文件和上传的图片。你可以点击任何一次Run,深入查看所有细节,也可以在一个表格视图中并列比较多次实验的关键结果。

4. 高级功能与集成生态

4.1 与主流ML框架的深度集成

Neptune的优势之一在于其“框架无关性”和“框架友好性”。它不需要你改变原有的训练范式,而是提供了各种“钩子(Hooks)”和“回调(Callbacks)”来无缝集成。

1. 与PyTorch Lightning集成 : 如果你使用PyTorch Lightning,集成简单到只需两行代码。Lightning的 Logger 接口原生支持Neptune。

from pytorch_lightning.loggers import NeptuneLogger

# 创建Logger
neptune_logger = NeptuneLogger(
    api_key=os.environ[“NEPTUNE_API_TOKEN”],
    project=”workspace/project”,
    tags=[“pl”, “resnet”],
    log_model_checkpoints=True, # 自动记录模型检查点
)

# 将logger传递给Trainer
trainer = pl.Trainer(
    logger=neptune_logger,
    max_epochs=10,
)
trainer.fit(model, train_loader, val_loader)

这样,Lightning会自动将训练进度、指标、甚至计算图记录到Neptune。 log_model_checkpoints 参数能让你选择是否自动上传模型文件。

2. 与TensorFlow/Keras集成 : 对于Keras,可以使用 NeptuneCallback

from neptune.integrations.tensorflow_keras import NeptuneCallback

neptune_callback = NeptuneCallback(run=run, log_model_diagram=True)

model.fit(
    x_train, y_train,
    validation_data=(x_val, y_val),
    epochs=10,
    callbacks=[neptune_callback], # 加入回调
)

这个回调会自动记录每个epoch后的损失和指标,如果设置 log_model_diagram=True ,还会上传模型的结构图。

3. 与scikit-learn、XGBoost/LightGBM等集成 : 对于更传统的机器学习流程,Neptune提供了 run[“model”] 的序列化支持,可以直接记录pickle格式的模型。同时,其灵活的API可以轻松嵌入到交叉验证、网格搜索等循环中,记录每一折或每一组参数的结果。

4. 与Hydra、Weights & Biases、MLflow的配合

  • Hydra :一个强大的配置管理库。你可以用Hydra管理复杂的配置层次,然后用Neptune记录最终使用的配置和结果,两者互补。
  • Weights & Biases (W&B) :W&B是Neptune的直接竞争对手,功能高度重叠。选择往往取决于个人偏好、团队习惯或对特定功能(如模型注册表、数据集版本管理)的侧重。有些团队甚至会同时试用两者。
  • MLflow :MLflow是一个更广义的ML生命周期管理平台,包含追踪、项目、模型、注册表四大模块。Neptune在实验追踪和可视化的深度和用户体验上通常更受好评,而MLflow提供了一个更全面的、可自托管的开源套件。它们也可以结合使用,例如用MLflow管理模型部署,用Neptune做实验分析。

4.2 自动化与CI/CD流水线集成

实验追踪不应只局限于交互式开发。在成熟的MLOps流水线中,自动化训练任务产生的实验数据更需要被系统化地记录。

场景:在GitLab CI/CD中运行训练任务 你可以在 .gitlab-ci.yml 中定义一个训练任务,并将Neptune API令牌设置为CI/CD的环境变量(在GitLab项目的Settings -> CI/CD -> Variables中设置,并勾选Masked保护)。

train_job:
  image: pytorch/pytorch:latest
  script:
    – export NEPTUNE_API_TOKEN=$NEPTUNE_API_TOKEN # 从CI变量注入
    – python train.py –config configs/experiment_12.yaml
  artifacts:
    paths:
      – outputs/ # 可以同时将本地产出物作为CI的artifacts保存

这样,每次代码推送触发CI训练时,都会在Neptune中创建一个新的Run,Run的名字可以包含CI的流水线ID和作业ID,实现实验与代码变更的精确关联。

场景:参数化扫描与超参数优化 当使用Optuna、Ray Tune、或自定义循环进行超参数搜索时,可以为每一组参数创建一个独立的Neptune Run。

import optuna

def objective(trial):
    lr = trial.suggest_loguniform(‘lr’, 1e-5, 1e-2)
    batch_size = trial.suggest_categorical(‘batch_size’, [32, 64, 128])

    # 为Optuna的每次trial创建一个有独立ID的Run
    with neptune.init_run(
        project=”my/project”,
        name=f”optuna-trial-{trial.number}”,
        tags=[“optuna”, “hpo”],
    ) as run:
        run[“parameters”] = {“lr”: lr, “batch_size”: batch_size}
        # … 使用这组参数训练模型 …
        final_accuracy = train_and_evaluate(lr, batch_size, run)
        run[“final/accuracy”] = final_accuracy
        return final_accuracy

study = optuna.create_study(direction=”maximize”)
study.optimize(objective, n_trials=50)

训练结束后,你可以在Neptune UI中,根据 final/accuracy 字段排序,快速找到最佳试验,并查看其对应的所有参数和训练曲线。

4.3 团队协作与知识管理功能

对于团队而言,Neptune的价值从个人生产力工具升级为团队知识库。

1. 项目仪表板(Dashboard) : 你可以为项目创建自定义仪表板。将最重要的指标(如“最佳验证准确率”)、参数(如“使用模型”)和图表(如“损失曲线对比”)以小组件的形式拖拽到仪表板上。这个仪表板可以作为团队每日站会或项目评审的“统一数据视图”,所有人看到的信息是一致的。

2. 对比视图(Compare Runs) : 这是Neptune最强大的功能之一。你可以勾选多个Runs,一键进入对比模式。系统会并排展示这些Runs的所有参数和指标图表。你可以清晰地看到,当学习率从0.01变为0.001时,损失曲线是如何变化的;或者不同的数据增强方法对验证准确率的影响。这极大地加速了分析决策过程。

3. 命名空间与标签系统

  • 统一的命名空间规范 :团队应约定一套命名空间规范,例如所有模型检查点都放在 model/ 下,所有训练指标都放在 train/ 下,所有验证指标都放在 val/ 下。这保证了不同成员记录的实验结构一致,便于对比和理解。
  • 标签(Tags)的妙用 :标签是轻量级的分类工具。你可以为Run打上多个标签,如 ”baseline” , ”data-augmentation” , ”bug-fix” , ”production-candidate” 。之后,你可以通过筛选标签,快速找到所有“使用了数据增强的候选生产模型”实验。

4. 共享与通知 : 你可以将整个项目或单个Run的链接分享给同事,他们无需配置即可查看。你还可以在代码中设置关键事件的记录(如达到某个准确率阈值),虽然Neptune本身不直接发邮件,但你可以结合其API和你的通知系统(如Slack Webhook)来实现自动化警报。

5. 性能调优、问题排查与最佳实践

5.1 性能考量与高级配置

当实验规模变大(如高频记录图像、大型模型文件)或Run数量极多时,合理的配置能提升稳定性和效率。

1. 控制上传频率与批量大小 : 默认情况下,Neptune客户端会频繁地将数据发送到服务器。对于高频日志(如每个batch都记录损失),这可能会产生大量网络请求。

run = neptune.init_run(
    flush_period=10, # 将缓存的数据刷写到服务器的周期(秒),默认是5秒。
    proxies={ # 如果训练环境需要通过代理访问外网
        “http”: “http://your-proxy:port”,
        “https”: “https://your-proxy:port”,
    },
)

对于指标,可以考虑在代码层面进行聚合,每N个batch或每个epoch记录一次平均值,而不是每个batch都记录。

2. 处理大文件(模型、数据集) : Neptune适合存储元数据和中小型产出文件。对于非常大的文件(如数GB的预训练模型或完整数据集),直接上传到Neptune可能低效且占用存储配额。

  • 最佳实践 :将大文件存储在专用的对象存储(如AWS S3、Google Cloud Storage、MinIO)中,然后在Neptune中只记录文件的 存储路径(URI) 哈希值(如MD5)
    # 假设已将模型上传到S3
    model_s3_uri = “s3://my-bucket/models/experiment-12/model_final.pth”
    run[“model/checkpoint/uri”] = model_s3_uri
    run[“model/checkpoint/md5”] = “a1b2c3d4e5f6…”
    
    这样既保留了可追溯性,又保持了Neptune的轻量。Neptune也支持直接连接到S3等存储,进行文件浏览。

3. 离线模式与异步处理 : 在网络不稳定或完全离线的环境中(如某些隔离的研究集群),你可以启用离线模式。数据会先记录到本地磁盘,待网络恢复后再同步。

run = neptune.init_run(mode=”offline”) # 离线模式
# … 进行实验记录 …
run.sync() # 网络恢复后,手动同步到服务器

或者,使用 mode=”async” ,它不会阻塞主线程,即使上传失败也不会导致训练崩溃,适合对数据完整性要求不是100%实时、但要求训练进程稳定的场景。

5.2 常见问题与排查指南

即使工具设计得再完善,在实际使用中也会遇到各种问题。以下是一些典型场景及解决方法。

问题1:训练脚本结束后,Neptune UI上看不到数据或数据不完整。

  • 可能原因A :Run没有被正确停止。如果脚本因异常崩溃或直接被终止(如Ctrl+C), run.stop() 可能没有被调用,导致缓冲区中的数据未上传。
  • 解决方案 始终使用上下文管理器( with 语句) 来初始化Run。这是最健壮的方式。如果因代码结构无法使用,确保在 try…finally 块中调用 run.stop()
  • 可能原因B :网络问题或服务器暂时不可用。
  • 解决方案 :检查客户端日志(默认会打印到控制台)。Neptune客户端有重试机制,短暂的网络波动通常会自动恢复。如果是长时间离线,考虑使用离线模式。

问题2:记录图片或模型文件时,速度很慢,拖累了训练速度。

  • 可能原因 :文件较大,且上传是同步进行的。
  • 解决方案
    1. 压缩文件 :对于图片,可以考虑降低分辨率或使用更高效的格式(如 .webp )。
    2. 异步上传 run[“images/sample”].upload(file_path) 本身是异步的。但如果是在一个紧密的循环中频繁调用,创建上传任务本身也有开销。可以考虑将文件路径收集到一个列表,在epoch结束后统一上传。
    3. 评估必要性 :是否每一轮都需要保存模型或图片?可以改为在验证指标提升时或训练结束时再保存。

问题3:在分布式训练(如PyTorch DDP)中,多个进程同时记录导致数据混乱或重复。

  • 解决方案 :Neptune为分布式训练提供了专门的支持。基本原则是: 只允许排名为0的主进程(rank 0)进行记录
    import torch.distributed as dist
    run = None
    if dist.get_rank() == 0: # 仅主进程初始化Run
        run = neptune.init_run(project=”…”)
    # 在需要记录的地方
    if run is not None: # 仅主进程记录
        run[“train/loss”].append(loss.item())
    
    对于需要从所有进程聚合的指标(如平均损失),先用 dist.all_reduce 进行进程间通信,得到全局平均值,再由主进程记录。

问题4:Neptune客户端报错,提示API令牌无效或项目不存在。

  • 排查步骤
    1. 检查令牌 :确保 NEPTUNE_API_TOKEN 环境变量设置正确,且没有多余的空格。可以通过 echo $NEPTUNE_API_TOKEN 验证。对于自托管,还要检查 api_url 是否正确。
    2. 检查项目标识 project 参数必须是 ”workspace-name/project-name” 的格式。确保workspace和project名称完全匹配,包括大小写。项目必须在UI中已创建。
    3. 检查网络连通性 :尝试在终端用 curl 命令测试是否能访问Neptune服务器(Cloud或自托管)。

5.3 提炼自实战的最佳实践清单

根据在多个项目中应用Neptune的经验,我总结出以下“该做”与“不该做”,能帮你避开很多坑。

该做(DOs)

  • DO 为Run起描述性的名字 :使用如 ”effnetb0-lr1e4-augmentation-v2” 而非 ”experiment-5″ 。名字是你在表格视图中的第一线索。
  • DO 充分利用标签系统 :用标签标记实验的阶段( ”exploratory” , ”ablation” )、状态( ”failed” , ”succeeded” )、使用的关键技术( ”mixup” , ”transfer-learning” )。
  • DO 建立团队命名规范 :在项目启动时,团队就 config/ metrics/ model/ 等一级命名空间达成一致。这比后期整理要省力得多。
  • DO 记录随机种子 :这是可复现性的生命线。务必记录 seed 到参数中。
  • DO 记录代码版本 :Neptune可以自动关联Git提交(需安装 neptune[git] 并初始化)。或者,手动记录 git commit hash
  • DO 使用上下文管理器 :这是保证Run被正确清理的最安全方式,没有之一。

不该做(DON‘Ts)

  • DON’T 在代码中硬编码API令牌 :永远使用环境变量或安全的配置管理工具(如Vault)。
  • DON‘T 记录过于高频的指标 :除非在调试,否则每个epoch记录一次通常足够了。每个batch都记录会产生海量数据点,影响UI性能,且对分析帮助不大。
  • DON’T 把Neptune当作主要的数据存储或模型仓库 :它用于存储 元数据 关键产出 。原始数据集、完整的日志文件应放在对象存储或文件系统中,只在Neptune里记录路径。
  • DON‘T 忽视离线模式 :如果你在计算集群上作业,作业系统可能会在任务结束后立即清理环境。如果网络上传慢,可能导致数据丢失。在任务结束前,可以调用 run.wait() 等待所有异步操作完成,或者使用离线模式配合最终同步。
  • DON’T 创建完Run就忘了 :定期回顾和整理你的Neptune项目。将失败的实验标记为 failed ,给有希望的实验加上 ”review-later” 标签。实验追踪系统的价值在于被“回顾”和“分析”,而不仅仅是“记录”。

更多推荐