跳转到主要内容

ML的简单网格搜索。

项目描述

Dora The Explorer,一个友好的实验管理器

tests badge linter badge

Dora logo, picturing a schematic Dora in front of a computer.

A demo of a Dora grid search

目录

安装

# For bleeding edge
pip install -U git+https://github.com/facebookincubator/submitit@main#egg=submitit
pip install -U git+https://git@github.com/facebookresearch/dora#egg=dora-search

# For stable release
pip install -U dora-search

有什么新鲜事?

有关发布详情,请参阅变更日志

  • 2022-06-09:版本0.1.10:添加HiPlot支持!更新PL支持,许多小修复。
  • 2022-02-28:版本0.1.9
  • 2021-12-10:版本0.1.8:请参阅变更日志,许多小改动。
  • 2021-11-08:版本0.1.7:添加对作业数组的支持。
  • 2021-10-20:版本0.1.6发布,修复错误。
  • 2021-09-29:版本0.1.5发布。
  • 2021-09-07:添加对git_save选项的支持。这将确保项目git是干净的,并从其中创建一个用于运行实验的克隆。这不适用于dora run以简化调试(但您可以使用--git_save强制执行)。
  • 2021-06-21:添加对Hydra 1.1的支持。如果您更新到Hydra 1.1,请务必小心,因为组配置的解析方式中存在一些不向后兼容的更改,有关更多信息,请参阅Hydra发布说明

(仅FB)如果您正在使用Dora并希望接收有关错误修复和新版本的更新,请在Workchat上联系我(@defossez)。

简介

Dora是一个实验启动工具,它提供了以下功能

  • 网格搜索管理:自动调度和取消任务,以匹配网格搜索文件中指定的内容。网格搜索文件是纯Python编写,可以包含任意循环、条件等。
  • 去重:实验根据其参数分配一个签名。如果你两次请求运行相同的实验,它不会重复调度,而是合并到同一个运行中。如果你的代码正确处理了检查点,任何之前的运行都将自动恢复。
  • 监控: Dora支持从终端内部进行基本监控。你可以自定义监控表中显示的指标,并轻松跟踪进度,比较网格搜索中的运行。

一些Dora概念

  • 网格 是一个包含 explorer 函数的Python文件,该函数被 dora.Explorer 包装。explorer函数接受一个 dora.Launcher 作为参数。通过重复调用带有超参数集的 dora.Launcher 来安排不同的实验。
  • XP 是一个特定的实验。每个实验由传递给底层实验代码的参数定义,并基于这些参数分配一个签名,以便于去重。
  • 签名 是独特的XP标识符,由其参数推导而来。你可以使用签名在运行中唯一标识XP,并轻松访问日志、检查点等。
  • Sheep 是Slurm/Submitit作业与XP的关联。给定一个XP,总是可以检索到最后与其关联的Slurm作业。

使您的代码与Dora兼容

为了推导出XP签名,Dora必须了解你的项目遵循的配置架构,以及一个运行的解析参数。Dora为此支持两个后端:argparsehydra。此外,Dora为使用Pytorch Lightning的项目提供流畅的集成。

在所有情况下,你必须有一个特定的Python包(我们在这里将其称为 myproj),其中包含一个 train 模块(即 myproj.train 模块,存储在 myproj/train.py 文件中。)

train.py 文件必须包含一个正确装饰的 main 函数,如下所述。

Argparse支持

以下是 train.py 文件的模板

import argparse
from dora import argparse_main, get_xp

parser = argparse.ArgumentParser("mycode.train")
...


@argparse_main(
    dir="./where_to_store_logs_and_checkpoints",
    parser=parser,
    exclude=["list_of_args_to_ignore_in_signature, e.g.", "num_workers",
             "can_be_pattern_*", "log_*"],
    use_underscore=True,  # flags are --batch_size vs. --batch-size
    git_save=False,  # if True, scheduled experiments will run from a separate clone of the repo.
)
def main():
    # No need to reparse args, you can directly access them from the current XP
    # object.
    xp = get_xp()
    xp.cfg # parsed arguments
    xp.sig  # signature for the current run
    xp.folder  # folder for the current run, please put your checkpoint relative
               # to this folder, so that it is automatically resumed!
    xp.link  # link object, can send back metrics to Dora

    # If you load a previous checkpoint, you should always make sure
    # That the Dora Link is consistent with what is in the checkpoint with
    # history = checkpoint['history']
    # xp.link.update_history(history)

    for t in range(10):
        xp.link.push_metrics({"loss": 1/(t + 1)})
    ...

Hydra支持

train.py 的模板

from dora import hydra_main, get_xp


@hydra_main(
    config_path="./conf",  # path where the config is stored, relative to the parent of `mycode`.
    config_name="config"  # a file `config.yaml` should exist there.
)
def main(cfg):
    xp = get_xp()
    xp.cfg # parsed configuration
    xp.sig  # signature for the current run
    # Hydra run folder will automatically be set to xp.folder!

    xp.link  # link object, can send back metrics to Dora
    # If you load a previous checkpoint, you should always make sure
    # That the Dora Link is consistent with what is in the checkpoint with
    # history = checkpoint['history']
    # xp.link.update_history(history)

    for t in range(10):
        xp.link.push_metrics({"loss": 1/(t + 1)})
    ...

你可以从 config.yaml 文件中自定义 dora 的行为,例如。

my_config: plop
num_workers: 40
logs:
    interval: 10
    level: info

dora:
    exclude: ["num_workers", "logs.*"]
    dir: "./outputs"
    git_save: true  # set git_save option for the project.

PyTorch Lightning支持

Dora默认支持PyTorch Lightning(PL)。Dora将自动捕获记录的指标(请确保使用 per_epoch=True),并处理分布(你不应将 gpus=...num_nodes=... 传递给PL)。

import dora.lightning


@dora.argparse_main(...)
def main():
    xp = dora.get_xp()
    args = xp.cfg
    # Replace Pytorch lightning `Trainer(...)` with the following:
    trainer = dora.lightning.get_trainer(...)
    # Or when using argparse parsing:
    trainer = dora.lightning.trainer_from_argparse_args(args)

请参阅 examples/pl/train.py 以获取包括自动重新加载最后一个检查点、记录等在内的完整示例。

重要: Dora禁用了PL的默认行为,在抢占时导出中间epoch的检查点,因为这会导致非确定性行为(因为PL在重启时会跳过此epoch)。Dora假设你时不时地保存检查点(例如,每个epoch)。要恢复旧的行为,请将 no_unfinished_epochs=False 传递给 get_trainer。请参阅 examples/pl/train.py 了解如何以可靠的方式实现检查点。

分布式训练支持(非PyTorch Lightning)

Dora支持分布式训练,并为你做了一些假设。你应该通过在 main 函数中调用初始化分布式训练。

import dora.distrib
dora.distrib.init()

注意: 这对于Pytorch Lightning用户不是必需的,请参阅下面的PL部分,一切都将为你自动设置:)

Git保存

您可以在项目中设置git_save选项,有关如何为argparse或Hydra项目进行设置的详细信息,请参阅以下内容。当此选项被设置时,Dora将为每个计划中的实验独立克隆您的项目仓库。作业将从这个干净的克隆开始运行。这既可以帮助追踪用于实验的确切代码,又可以防止代码更改影响挂起的或重新排队的作业。如果您重新安排失败的或已取消的作业,克隆将使用当前代码进行更新。

为了使用此选项,您的代码应能够从一个全新的仓库克隆中运行。如果您需要访问相对于原始仓库的路径指定的资源,请使用dora.to_absolute_path()。请注意,这与hydra.utils.to_absolute_path()类似。实际上,您可以用这个版本安全地替换Hydra版本,因为即使在git_save未设置的情况下,Dora版本也会自动回退到Hydra版本(如果使用Hydra)。

在安排远程作业之前,仓库必须完全干净,所有文件都应该被跟踪或git忽略。这非常受限,但这使得实现此功能更加简单和安全。此外,这也强制执行了良好的做法 :) 只有dora run命令可以在脏仓库上使用,以允许轻松调试。对于dora launchdora grid命令,您还可以使用--no_git_save选项暂时禁用此功能。

每个实验的克隆位于XP文件夹(您可以使用例如dora info命令获取)内部的code/子文件夹中。

dora 命令

Dora将安装一个dora命令,这是与之交互的主要方式。dora命令定义了4个子命令,以下各节将详细介绍。

  • dora run:在本地运行训练代码(例如用于调试)。
  • dora launch:启动远程作业,适用于一次性实验。
  • dora info:获取有关特定作业/XP的信息,日志等。
  • dora grid:启动在网格文件中定义的整个网格搜索。只有缺少的XP将被安排。还会报告状态和最新指标。

为了让Dora找到您的代码,您必须将您的训练包(即mycode)作为dora -P mycode [run|launch|grid|info]传递。如果mycode位于当前工作目录中,并且是唯一的包含train.py文件的文件夹,则可以省略此标志,此时Dora会自动找到它。您还可以导出DORA_PACKAGE=mycode以避免显式地提供-P标志。

您可以使用与train.py不同的脚本名,使用-M, --main_module或设置DORA_MAIN_MODULE环境变量。

注意:这些标志应在run | launch |info |grid部分之前指定:dora -P mycode run,而不是dora run -P mycode

示例

请参阅示例文件夹中的几个示例,使用argparse,Hydra和PyTorch Lightning来测试此处描述的命令。要使用它们,首先安装Dora(从仓库顶层使用pip install .),然后cd examples,并使用dora -P example_name ...让Dora知道要使用哪个示例!

dora run:在本地运行XP

您可以使用以下命令在本地运行一个XP:

dora run [TRAINING_ARGS ...]

警告:对于argparse后端,必须在dora参数和您的自己的训练参数之间插入--,即

dora run -- [TRAINING_ARGS ...]

dora run支持两个标志

  • -d:使用所有可用的gpus进行分布式训练。主工作员的输出将到shell,其他工作员将重定向到XP文件夹中的日志文件。
  • -f sig:这将从具有给定 sig 的 XP 中注入超参数,并覆盖命令行提供的参数。这对于恢复失败的远程作业非常有用。
  • --git_save:在 XP 文件夹内克隆仓库并从那里执行。这主要用于调试,通常不需要。

dora launch:远程启动XP

Dora 支持在 Slurm 上调度实验。如果您需要调度许多实验,那么使用网格文件将更好。

dora launch [--dev] [-g NUMBER_OF_GPUS] [TRAINING_ARGS ...]

Dora 将根据所需的 GPU 数量以及所需的内存量自动选择适当数量的节点和每个节点的任务数。例如,如果 -g 16,Dora 将在 2 个节点上安排,每个节点有 8 个 GPU。

此命令将启动命令,并立即查看其日志并监视其进度,就像它在本地运行一样。如果您想杀死本地进程时也杀死命令,请添加 -a--attach 标志。要避免查看日志,只需传递 --no_tail

如果已经为给定的 XP 安排了作业,Dora 不会安排第二个,而是重用现有的作业。

如果之前的运行失败或被取消,Dora 不会自动启动新的运行,以便您有机会检查日志。如果您想重新安排运行,请使用 -r, --retry 标志。

其他标志

  • -f SIG:从与该签名匹配的 XP 注入参数,覆盖命令行提供的参数。
  • -R, --replace:替换任何正在运行的作业(即取消,并安排新的作业)。
  • -D, --replace_done:即使在之前的作业成功完成的情况下,也会重新安排作业。
  • -p, --partition PARTITION:要使用的分区。
  • -c, --comment COMMENT:作业的注释(例如,如果使用了优先级)。
  • --clear:取消任何之前的作业,清除 XP 文件夹(即删除检查点)并重新安排。

dora info:检查XP

您可以使用 dora info 命令获取 XP 的信息

dora info [TRAINING_ARGS ...]
dora info -f SIGNATURE
dora info -j SLURM_ID

您可以通过列出所有训练参数,通过传递其签名,甚至通过传递与其关联的最新 Slurm ID 来指定 XP。info 命令支持多个标志

  • -l:打印主任务的整个日志(这仅适用于远程作业,不适用于使用 dora run 运行的本地 XP)
  • -t:查看主任务的日志。

dora grid:管理网格搜索

Dora 的主要优势是能够处理任意复杂的网格搜索。每个 grid 由一个网格文件定义,位于 grids 包内(例如 mycode.grids.my_grid)。网格文件定义了一个 explorer 函数,由一个 Explorer 类装饰。Explorer 类定义了各种元数据,特别是当调用网格命令时要显示哪些指标。explorer 函数接受一个 dora.Launcher 参数,并应反复调用它来安排实验。

以下是一个网格搜索文件的示例,例如 mycode.grids.mygrid

from itertools import product
from dora import Explorer, Launcher

@Explorer
def explorer(launcher: Launcher):
    launcher(batch_size=128)  # Schedule an experiments with the given batch size.
    # For an argparse based project, this will get converted to the `--batch_size=128` flag
    # You can pass `use_underscore=False` to `argparse_main` to get instead `--batch-size=128`.

    sub = launcher.bind(lr=0.01)  # bind some parameter value, in a new launcher
    sub.slurm_(gpus=8)  # all jobs scheduled with `sub` will use 8 gpus.

    sub()  # Job with lr=0.01 and 8 gpus.
    sub.bind_(epochs=40)  # in-place version of bind()
    sub.slurm(partition="dev")(batch_size=64)  # lr=0.01, 8 gpus, dev, bs=64 and epochs=40.

    launcher.slurm_(gpus=16)  # Now using 16 gpus per job, i.e. 2 full nodes.
    # Nice thing of native python, you can define arbitrary set of XP!
    for lr, bs in product([0.1, 0.01, 0.001], [16, 32, 64]):
        if bs > 32 and lr < 0.01:
            # this is just too extreme, let's skip
            continue
        launcher(lr=lr, batch_size=bs)

    # Job arrays are also supported.
    # The only limitation is that all jobs in an array must use exactly
    # the same slurm config.
    with launcher.job_array():
        for seed in range(1, 100):
            launcher(seed=seed)

然后您可以调用

dora grid mygrid

这将做三件事

  • explorer 函数中定义的任何 XP 都将被安排,如果尚未运行或完成。
  • 任何在网格文件中先前定义但现在不再引用的 XP 将被取消。如果只是注释了网格文件中的一行,相应的作业将自动被终止。
  • 每 5 分钟打印一次包含作业状态和元数据以及最新指标的表格。

Launcher API

以下是 Launcher 对象可以执行的功能的更详细描述。

  • launcher.bind_(...):记住给定的参数(基于 argparse 的项目命令行选项或基于 Hydra 的覆盖)以供将来安排,即所有后来使用该启动器安排的实验都将设置这些参数。
  • sub = launcher.bind(...):与bind相同,但返回一个新的"sub"启动器,即launcher对象本身不会改变,只有使用sub安排的实验会使用给定的参数。sub还会继承其父启动器已绑定的所有参数(即对launcher.bind_的先前调用)。在循环内部创建子启动器特别推荐,以避免参数泄漏到下一个循环迭代。
  • launcher(...):使用给定的参数安排一个实验,加上通过调用bind_bind的各个调用所聚合的所有参数。这相当于launcher.bind(...)()
  • launcher.slurm_(key=value, ...)launcher.slurm(key=value, ...):与bind_bind相同,但针对slurm配置(GPU数量等)。有关可能选项的列表,请参阅SlurmConf

现在让我们描述如何将参数覆盖或命令行标志传递给launcher.bind_()launcher.bind()launcher()

  • 简单的参数(即非嵌套的)可以作为kwargs传递,例如,如果您有一个--batch_size标志,则可以这样做:launcher.bind(batch_size=64)
  • 命令行标志可以显式地作为字符串列表传递,例如:launcher.bind(['--lr=1e-4'])
  • 可以传递一个覆盖字典,例如:launcher.bind({'batch_size': 64})。请注意,这也允许Hydra中的嵌套键:launcher.bind({'model.channels': 256})。使用Hydra,您还可以使用{'+model.activation': 'relu'}定义新键。但是,您必须保留键。
  • 最后,您可以将所有这些结合起来(对于Hydra项目)
launcher.bind(['optim.lr=1e-4'], {'model.channels': 256, 'seed': 42}, {'+model.activation': 'relu'}, batch_size=64)

标志

dora grid命令支持以下标志

  • -r, --retry:如果一个网格文件中的实验失败或取消,将重新安排。

  • -R, --replace:任何正在运行的实验将被新的工作替换。

  • -D, --replace_done:任何之前完成的网格中的实验将被重新安排。

  • -C, --cancel:取消网格中的所有实验。

  • --clear:取消任何以前的作业,清除所有实验文件夹(即删除检查点)并重新安排。这将首先请求确认,因为这相当危险。

  • -i, --interval INTERVAL:所有作业的监控表将在每INTERVAL分钟更新一次,直到所有作业完成或失败。

  • -T, --trim IDX:将所有度量指标修剪到网格中给定索引的实验的epoch数量,即假装所有实验最多有给定索引的实验那么多epoch。

  • -L, --trim_last:将所有实验修剪到最不先进的实验,即如果最不先进的实验只有3个epoch,则显示所有实验的epoch 3的指标。

  • -f, --folder IDX:仅打印具有给定索引的实验的文件夹。

  • -l, --log IDX:打印具有给定索引的实验的完整日志。

  • -t, --tail IDX:尾随具有给定索引的实验的日志。

  • --no_monitoring:仅显示一次表格并返回。

  • --dry_run:仅模拟操作。

模式

您还可以将模式传递给grid命令,例如

dora grid mygrid bs=64

将仅显示名称中包含bs=64的实验。您可以通过正常启动网格来查看名称。名称被大大缩短,以避免空间不足,特别是嵌套结构将缩短其所有组件但叶子。您可以使用!否定查询,例如:dora grid mygrid '!bs=64'(使用引号,因为否则!将被shell解释)。多个模式被视为它们之间的逻辑AND。

请注意,在最新版本中(请确保更新),--clear-C, --cancel标志仅适用于匹配模式的实验。同样,只有匹配这些模式的实验才会被安排。

探索器类

Explorer类允许自定义要报告的度量指标以及精度。它还给您机会重新组织指标或进一步后处理它们(例如,提取最大值、最小值等)。有关更多解释,请参阅下文的自定义显示的指标

按照惯例,在grids文件夹中以_开头文件被Dora忽略,这是放置诸如您自定义的Explorer类等实用代码的好地方。有关带有详细注释的示例,请查看BrainMagick的Explorer类

HiPlot支持

Dora自带支持HiPlot。确保已安装(pip install hiplot),然后您可以运行

python -m hiplot dora.hiplot.load --port=XXXX

在提示符中,您可以输入任意数量的网格名称或XP sig,用空格分隔。您可以通过在yourproject.grids._hiplot中的类中继承dora.hiplot.HiPlotExplorer来自定义显示的指标。然后,使用命令explorer=MyExplorer在HiPlot提示符中选择您的探索器(在网格名称和XP sig旁边,顺序不限)。

Dora API

Dora提供了一些API,包括直接从IPython笔记本运行网格搜索的可能性。请参阅Dora API

DecoratedMain

最有用的类是DecoratedMain,这是您项目中装饰的主函数。您可以使用它从argv列表或签名中检索一个XP对象

from myproj.train import main

xp = main.get_xp_from_sig('ae43f645')
xp2 = main.get_xp_from_argv(xp.argv + ['batch_size=32'])
xp2_name = main.get_name(xp2)  # See API in dora.names.NameMixin
with xp2.enter():
    # You can pretend to be in an XP with this.
    ...

高级自定义

如果您想对DecoratedMain的行为进行一些高级自定义(例如,自定义XP的命名或标志的奇怪解析),请随意继承dora.main.ArgparseMaindora.hydra.HydraMain并使用您自定义的类。

网格API

您可以通过Dora API而不是命令行来安排和管理网格。这对于从笔记本管理XPs非常有用!请参阅dora.grid.run_grid。标志作为dora.grid.RunGridArgs的实例传递。提交规则(例如,取消、重试等)作为dora.conf.SubmitRules传递。

import dora
import dora.grid

from myproj.train import main


@dora.Explorer
def explorer(launcher):
    launcher.slurm_(gpus=2, partition='learnlab')
    launcher.bind_({
        'epochs': 200,
        'model.depth': 10,
        'batch_size': 128
    })
    launcher()
    for p in [0.005, 0.01, 0.05, 0.1]:
        sub = launcher.bind({'task.penalty': p})
        sub()
        sub(lr=1e-4)


args = dora.grid.RunGridArgs(jupyter=True, monitor=False, interval=1)
rules = dora.conf.SubmitRules(retry=True)  # Should we reschedule failed jobs?
# The run_grid function returns a list of sheeps
# each sheep as 2 attributues: sheep.xp and sheep.job_id.
sheeps = dora.grid.run_grid(main, explorer, grid_name='jupy', rules=rules, args=args)
args.monitor = True
args.jupyter = True
# The jupyter flag will make the grid API use the display API to clear the cell
# output and update it regularly. This one will not return until all jobs
# are done or failed.
# In the following, `grid_name` should be unique. It will be used
# to determine which experiments were previously scheduled with that grid
# and should potentially be cancelled if no longer needed.
dora.grid.run_grid(main, explorer, grid_name='jupy', rules=rules, args=args)
# You can retrieve the short names by using `main.get_names()`
short_names, ref_name = main.get_names([sheep.xp for sheep in sheeps])

共享XP

目前,检查点和指标不能直接共享(您始终可以手动复制到其他人的XP文件夹)。但是,现在有两种方法可以轻松地使用其签名共享XP超参数。如果您想让人快速复制您的XP,这很有用!

Dora 导入/导出命令

给定一个签名列表,您可以使用dora export将其超参数导出到紧凑的文本格式。

dora export SIG1 [OTHER_SIG ...]

复制粘贴给定的字符串,您的同事可以导入它

dora import
# now paste to stdin

该命令将显示导入的XP列表。一旦导入了一个XP,您就可以简单地运行它或使用dora run -f SIGdora info -f SIG等查询超参数。从一个网格文件中,您可以程序性地从该XP检索超参数,例如。

from myproject.train import main

xp = main.get_xp_from_sig(SIG)
launcher.bind_(xp.argv)

次要共享XP存储库

您现在可以配置一个次要共享XP存储库,其中只存储SIG -> 超参数的映射。使用Hydra,您可以添加

dora:
    dir: outputs
    shared: /shared_folder/shared_xps

然后其他同事可以在Dora命令中引用由其他团队成员启动的任何SIG。

高级配置

设置SLURM默认参数

Slurm配置在dora/conf.py中详细说明。它与常规Slurm配置略有不同,因为它试图使更改GPU数量尽可能容易,而无需手动计算节点数、每个节点的任务数等。

Slurm配置标志

  • gpus (int):要调度的GPU数量。节点和每个节点上的任务数量将自动推断。
  • mem_per_gpu (float):每个GPU调度的内存量(以GB为单位)。
  • time (int):作业的最大持续时间(以分钟为单位)。
  • cpus_per_gpu (int):每个GPU的CPU数量,这将自动设置cpus_per_task,基于GPU数量和one_task_per_node,除非显式提供cpus_per_task
  • cpus_per_task (int or None):每个任务的CPU数量。
  • partition (str):分区名称。
  • comment (str):作业注释。
  • setup (List[str]):在执行实际命令之前要执行的shell命令列表。用于module load
  • max_num_timeout (int):最大重排队次数。
  • one_task_per_node (bool):如果为True,则在每个节点上调度单个任务,否则将在每个GPU上调度一个任务(默认为False)。

默认Slurm配置

您可以将SlurmConfig的实例传递给argparse_main,该实例将用作所有dora launch命令和网格文件的默认配置。网格文件可以使用launcher.slurm(返回新启动器)和launcher.slurm_(就地)方法覆盖在SlurmConfig上定义的任何字段。

对于Hydra,默认的Slurm配置来自yaml文件中的slurm条目,例如,您可以拥有它们的

my_param: whatever
batch_size: 42

dora:
    dir: outputs

slurm:
    partition: devlab
    mem_per_gpu: 30  # this is in GB

自定义在资源管理器中显示的指标

指标使用treetable格式化,它没有过多的文档,但应该足够容易通过这个示例了解其工作原理

from dora import Explorer
import treetable as tt


class MyExplorer(Explorer):
    test_metrics = ['sisnr', 'pesq']

    def get_grid_metrics(self):
        """Return the structure of the metrics that should be displayed in the tracking table.
        """
        # This will return a list of `tt.group`, each group will
        # be in separate parts of the table.
        return [
            tt.group("train", [
                tt.leaf("epoch"),
                tt.leaf("loss", ".3f"),  # The second argument of tt.leaf is a formatting string.
             ], align=">"),  # Align can be left (<) or right (>) and will apply on all
                             # leaves inside the group.
            tt.group("valid", [
                tt.leaf("best", ".3f"),
                tt.leaf("loss", ".3f"),
             ], align=">"),
            tt.group("test", [
                tt.leaf(name, ".3f")
                for name in self.test_metrics
             ], align=">")
        ]
        # In practice you can even have deeply nested groups etc. but honestly
        # you probably don't need that.

    def process_history(self, history):
        """This process the history obtained from the Dora Link
        into the right format for the `get_grid_metrics()` layout.
        This should return a dictionary, with one key per group, each
        being a sub-dict with one key per metric.

        It is fine for a key to be absent, things won't crash, and it will
        just not show anything there in the table.
        """
        train = {
            'epoch': len(history),
        }
        valid = {}
        test = {}
        best = float('inf')
        for metrics in history:
            train.update(metrics['train'])
            valid.update(metrics['valid'])
            # Let say you forgot to compute best valid loss, you can
            # fill in it here on the fly.
            best = min(valid['loss'], best)
            valid['best'] = best

            # The reason for having this for loop is also if some metrics
            # are not defined with every epoch. Let say you compute test metrics
            # only every 10 epochs, then this will automatically fill the
            # test metrics of the last epoch which evaluated them.
            if 'test' in metrics:
                test.update(metrics['test'])
        return {"train": train, "valid": valid, "test": test}

许可证

Dora遵循MIT许可协议,如LICENSE文件中所述。

贡献

在提交任何更改之前,请运行make来运行单元测试和代码格式化。

项目详细信息


下载文件

下载您平台的文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。

源分发

dora_search-0.1.12.tar.gz (87.1 KB 查看哈希值

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面