查询语言基础
简介
Aim 提供了一种强大的查询语言 (Aim QL),用于筛选所有存储的元数据。
AimQL 使用 Python 表达式 筛选跟踪的元数据。可以将其视为针对您跟踪的所有内容进行的 Python if 语句。因此,几乎所有 Python 兼容的表达式都可用,但有一些限制。
数据以不同类型的实体(例如 run
、metric
)保存。搜索查询是针对这些实体编写的。在迭代实体时,Python 表达式将在布尔上下文中进行评估。当值为“真”时,则生成当前实体。否则,该实体将被跳过。
目前,AimQL 仅用于数据筛选,在数据排序或聚合中没有作用。
搜索
让我们通过 Aim SDK 跟踪几个运行(Runs)
from aim import Run
# Initialize run_1
# Define its params and track loss metric within test and train contexts
run_1 = Run()
run_1['learning_rate'] = 0.001
run_1['batch_size'] = 32
for i in range(10):
run_1.track(i, name='loss', context={ 'subset':'train' })
run_1.track(i, name='loss', context={ 'subset':'test' })
# Initialize run_2
run_2 = Run()
run_2['learning_rate'] = 0.0007
run_2['batch_size'] = 64
for i in range(20):
run_2.track(i, name='loss', context={ 'subset':'train' })
run_2.track(i, name='loss', context={ 'subset':'test' })
run_2.track(i/100, name='accuracy')
# Initialize run_3
run_3 = Run()
run_3['learning_rate'] = 0.005
run_3['batch_size'] = 16
for i in range(30):
run_3.track(i, name='loss', context={ 'subset':'train' })
run_3.track(i, name='loss', context={ 'subset':'test' })
run_3.track(i/100, name='accuracy')
Aim SDK 将在 .aim
仓库中收集并存储上述元数据。
运行 |
参数 |
指标 |
||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
|
||||||||||
|
|
|
||||||||||
|
|
|
搜索运行时,请使用 run
关键字,它表示 Run
对象。它具有以下属性
属性 |
描述 |
---|---|
|
运行名称 |
|
运行哈希 |
|
实验名称 |
|
运行标签列表 |
|
如果运行已归档,则为 |
|
如果运行处于活动状态(进行中),则为 |
|
运行持续时间(秒) |
|
运行创建日期时间 |
|
运行结束日期时间 |
|
运行指标集 |
运行参数可以通过链式属性和属性访问。
以下三个示例在功能上是等效的
run.hparams.learning_rate == 32(推荐)
run[“hparams”, “learning_rate”] == 32(推荐)
run[“hparams”][“learning_rate”] == 32
AimQL 的设计旨在实现高性能。只有在查询中使用的参数才会被加载到内存中。
如果您使用 [‘hparams’][‘learning_rate’] 语法,Aim 将把整个字典加载到内存中。搜索性能将受到影响。
我们建议使用 [‘hparams’, ‘learning_rate’] 或 hparams.learning_rate 语法,它们在性能方面是等效的。
查询示例
获取
learning_rate
大于0.0001
且batch_size
大于32
的运行。
run.learning_rate > 0.0001 and run.batch_size > 32
结果
运行 |
参数 |
||||
---|---|---|---|---|---|
|
|
获取
learning_rate
为0.0001
或0.005
的运行。
run.learning_rate in [0.0001, 0.005]
结果
运行 |
参数 |
||||
---|---|---|---|---|---|
|
|
||||
|
|
根据指标的最后值搜索运行。
metrics
属性接受 2 个参数:指标名称和上下文(名称是必需的,上下文默认为空({}))。
获取
accuracy, {}
最后值大于 0.25 的运行。
run.metrics['accuracy'].last > 0.25
结果
运行 |
参数 |
指标 |
||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
|
获取
loss, {'subset': 'train'}
最后值小于 25 的运行。
run.metrics['accuracy', {'subset': 'train'}].last < 25
结果
运行 |
参数 |
指标 |
||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
|
||||||||||
|
|
|
搜索
duration
小于 10 秒的运行(例如,用于筛选失败的运行).. code-block:: pythonrun.duration < 10
这将返回我们测试集中的所有运行,但在实际实验中,它将用于筛选在 10 秒内完成的运行。然后,这些运行可能会被归档/删除,因为它们可能已崩溃或被停止。
根据创建或结束时间搜索运行
created_at
和 finalized_at
属性表示为 python datetime
对象。因此,以下任何查询都是筛选运行的有效方式
获取特定日期的运行
run.created_at.strftime("%d/%m/%Y") == "24/12/2021"
获取特定日期之后的运行
run.finalized_at > datetime(2022, 2, 2)
获取特定月份的运行
run.created_at.month == 2 and run.created_at.year == 2022
搜索指标和图像
搜索指标
迭代指标时,请使用 metric
关键字,它表示跟踪的指标。在搜索指标时,您还可以通过 run
关键字引用相关的运行。
metric
具有以下默认属性。
属性 |
描述 |
---|---|
|
指标名称 |
|
指标上下文字典 |
|
指标的最后跟踪值 |
|
指标的最后跟踪步数 |
|
指标的第一次跟踪步数 |
查询示例
按名称查询指标
metric.name == "loss"
结果
指标 |
相关运行 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
按名称和上下文查询指标
metric.name == "loss" and metric.context.subset == "train"
结果
指标 |
相关运行 |
---|---|
|
|
|
|
|
|
按名称和运行参数查询指标
metric.name == "loss" and run.learning_rate >= 0.001
结果
指标 |
相关运行 |
---|---|
|
|
|
|
|
|
|
|
按名称和最后值查询指标
metric.name == "loss" and metric.last >= 15
结果
指标 |
相关运行 |
---|---|
|
|
|
|
|
|
|
|
搜索图像
图像搜索与指标搜索方式相同。迭代图像时,请使用 images
关键字,它表示跟踪的图像序列。在搜索图像时,您还可以通过 run
关键字引用相关的运行。
images
关键字具有以下默认属性。
属性 |
描述 |
---|---|
|
图像序列名称 |
|
图像序列上下文字典 |
查询示例
images.name == “generated” and run.learning_rate >= 0.001
images.name == “generated” and images.context.ema == 0
安全限制
AimQL 表达式使用 RestrictedPython 进行评估。
RestrictedPython 是一种工具,有助于定义 Python 语言的一个子集,允许将程序输入提供到受信任的环境中。
我们遵循了这些限制,以避免通过 AimQL 执行不安全函数等安全风险。