跟踪¶
概述和用法¶
注意
实验性,使用风险自负,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
尽管这看起来很简单,但有几件事需要担心:
文件的格式(app1 需要以 app2 理解的格式写入)
app1.out
实际解析 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
数字:int、float
literal:str (UTF-8 编码时的大小限制为 1KB)
有效类型包括:
key
int
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作之间进行。
put
get
put
get
例如:
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 中。FsspecResultTracker(tracker_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