查询语言基础
介绍
Aim 提供了一种强大的查询语言(Aim QL),可用于筛选所有存储的元数据。
AimQL通过Python表达式来筛选跟踪的元数据。您可以将其视为对所有跟踪数据执行的Python if语句。因此,几乎所有兼容Python的表达式都可以使用,但存在一些限制。
数据被保存为不同类型的实体(例如run、metric)。搜索查询是针对这些实体编写的。
在遍历实体时,Python表达式会在布尔上下文中求值。当值为"真值"时,当前实体会被返回。否则该实体将被跳过。
目前,AimQL仅用于数据过滤,在排序或聚合数据方面不起作用。
搜索
让我们通过Aim SDK追踪多个运行记录:
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
结果:
运行 |
参数 |
指标 |
||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
|
||||||||||
|
|
|
搜索运行时长小于10秒的运行记录(例如用于过滤掉失败的运行) .. code-block:: python
run.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" 且 run.learning_rate >= 0.001
images.name == "generated" 且 images.context.ema == 0
安全限制
AimQL表达式通过RestrictedPython进行评估。
RestrictedPython 是一个工具,用于定义Python语言的子集,允许将程序输入到受信任的环境中。
我们遵循了这些限制条件以避免安全风险,例如通过AimQL执行非安全函数。