目录

跟踪

概述和用法

注意

实验性,使用风险自负,API 可能会发生变化

在 TorchX 应用程序中,有二进制文件(可执行文件)、 因此,没有内置的方法可以从应用程序“返回”结果。 该模块允许应用程序 返回 simple 结果(请注意关键字 “simple”)。返回类型 被有意约束。例如 尝试返回经过训练的模型权重,其大小可能为数百 GB, 是不允许的。此模块并非旨在或调整为传递大型 数据或二进制 blob 的数量。torchx.runtime.tracking

当应用程序作为更高级别协调工作的一部分启动时 (例如工作流、管道、超参数优化)经常, 应用程序的结果需要可供协调器访问,或者 工作流程中的其他应用程序。

假设 App1 和 App2 使用 App1 的输出按顺序启动 feeding 作为 App2 的输入。由于这些是二进制文件,因此 在应用程序之间链接输入/输出是通过传递输出文件路径 作为 App2 的输入文件路径:

$ app1 --output-file s3://foo/out/app1.out
$ app2 --input-file s3://foo/out/app1.out

尽管这看起来很简单,但有几件事需要担心:

  1. 文件的格式(app1 需要以 app2 理解的格式写入)app1.out

  2. 实际解析 url 并写入/读取输出文件

因此,应用程序的 main 最终如下所示(用于演示目的的伪代码):

# in app1.py
if __name__ == "__main__":
   accuracy = do_something()
   s3client = ...
   out = {"accuracy": accuracy}

   with open("/tmp/out", "w") as f:
       f = json.dumps(out).encode("utf-8")

   s3client.put(args.output_file, f)

# in app2.py
if __name__ == "__main__":
   s3client = ...
   with open("/tmp/out", "w") as f:
       s3client.get(args.input_file, f)

   with open("/tmp/out", "r") as f:
       in = json.loads(f.read().decode("utf-8"))

   do_something_else(in["accuracy"])

相反,使用跟踪链接,可以跨 app 使用具有相同功能的跟踪链接,以获得一个 app 的返回值 可供另一个用户使用,而无需链接 一个应用程序具有另一个应用程序的输入文件路径,并处理自定义 序列化和文件写入。tracker_base

# in app1.py
if __name__ == "__main__":
   accuracy = do_something()
   tracker = FsspecResultTracker(args.tracker_base)
   tracker["app1_out"] = {"accuracy": accuracy}

# in app2.py
if __name__ == "__main__":
   tracker = FsspecResultTracker(args.tracker_base)
   app1_accuracy = tracker["app1_out"]
   do_something_else(app1_accuracy)

结果跟踪器

基础

torchx.runtime.tracking 中。ResultTracker[来源]

Base result tracker,应将其子类化以实施跟踪器。 通常,每个后备存储都存在一个跟踪链接实现。

用法:

# get and put APIs can be used directly or in map-like API
# the following are equivalent
tracker.put("foo", l2norm=1.2)
tracker["foo"] = {"l2norm": 1.2}

# so are these
tracker.get("foo")["l2norm"] == 1.2
tracker["foo"]["l2norm"] == 1.2

有效类型包括:result

  1. 数字:int、float

  2. literal:str (UTF-8 编码时的大小限制为 1KB)

有效类型包括:key

  1. int

  2. str

按照惯例,可以在键中使用 “slashes” 来存储 是统计的。例如,要存储 l2norm 的 mean 和 sem:

tracker[key] = {"l2norm/mean" : 1.2, "l2norm/sem": 3.4}
tracker[key]["l2norm/mean"] # returns 1.2
tracker[key]["l2norm/sem"] # returns 3.4

假设 Key 在跟踪链接的支持下是唯一的 商店。例如,如果跟踪链接由本地目录提供支持,并且 是保存结果的目录中的文件,则key

# same key, different backing directory -> results are not overwritten
FsspecResultTracker("/tmp/foo")["1"] = {"l2norm":1.2}
FsspecResultTracker("/tmp/bar")["1"] = {"l2norm":3.4}

跟踪器不是中心实体,因此无法保证高度一致性 (超出后备存储提供的范围)在对同一键执行 和作。同样,没有强一致性保证 在对同一键的两个连续 Or作之间进行。putgetputget

例如:

tracker[1] = {"l2norm":1.2}
tracker[1] = {"l2norm":3.4}
tracker[1] # NOT GUARANTEED TO BE 3.4!

sleep(1*MIN)
tracker[1] # more likely to be 3.4 but still not guaranteed!

强烈建议使用唯一 ID 作为键。此 id 为 通常是简单作业的作业 ID,或者可以是 (experiment_id、trial_number)或(作业 ID、副本/工作线程排名) 用于超参数优化等迭代应用程序。

FSSPEC 公司

torchx.runtime.tracking 中。FsspecResultTrackertracker_base str[来源]

在后台使用 fsspec 保存结果的跟踪器。

用法:

from torchx.runtime.tracking import FsspecResultTracker

# PUT: in trainer.py
tracker_base = "/tmp/foobar" # also supports URIs (e.g. "s3://bucket/trainer/123")
tracker = FsspecResultTracker(tracker_base)
tracker["attempt_1/out"] = {"accuracy": 0.233}

# GET: anywhere outside trainer.py
tracker = FsspecResultTracker(tracker_base)
print(tracker["attempt_1/out"]["accuracy"])
0.233

文档

访问 PyTorch 的全面开发人员文档

查看文档

教程

获取面向初学者和高级开发人员的深入教程

查看教程

资源

查找开发资源并解答您的问题

查看资源