查询语言基础

介绍

Aim 提供了一种强大的查询语言(Aim QL),可用于筛选所有存储的元数据。

AimQL通过Python表达式来筛选跟踪的元数据。您可以将其视为对所有跟踪数据执行的Python if语句。因此,几乎所有兼容Python的表达式都可以使用,但存在一些限制

数据被保存为不同类型的实体(例如runmetric)。搜索查询是针对这些实体编写的。 在遍历实体时,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_1

学习率批次大小
0.00132

训练集损失 { "subset":"train" } 测试集损失 { "subset":"test" }
10 10

run_2

学习率批次大小
0.000764

训练集损失 { "subset":"train" } 测试集损失 { "subset":"test" } 准确率 {}
20 20 0.2

run_3

学习率批次大小
0.00516

训练集损失 { "subset":"train" } 测试集损失 { "subset":"test" } 准确率 {}
30 30 0.3

在搜索运行记录时,使用run关键字代表Run对象。该对象具有以下属性:

属性

描述

name

运行名称

hash

运行哈希

experiment

实验名称

tags

运行标签列表

archived

True 表示运行已归档,否则为 False

active

True 表示运行处于活动状态(进行中),否则为 False

duration

运行时长(秒)

created_at

运行创建日期时间

finalized_at

运行结束日期时间

metrics

运行指标集合

运行参数可以通过链式属性和属性两种方式访问。

以下三个示例在功能上是等效的:

  • 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语法,这两种写法在性能上是等效的。

查询示例:

  1. 获取运行记录,其中learning_rate大于0.0001batch_size大于32

run.learning_rate > 0.0001 and run.batch_size > 32

结果:

运行

参数

run_2 <hash=a32c911>

学习率批次大小
0.000764

  1. 获取learning_rate0.00010.005的运行记录。

run.learning_rate in [0.0001, 0.005]

结果:

运行

参数

run_1 <hash=a32c910>

学习率批次大小
0.00132

run_3 <hash=a32c912>

学习率批次大小
0.00516

  1. 根据指标的最新值搜索运行记录。

metrics 属性接受2个参数:指标名称和上下文(名称为必填项,上下文默认为空({}))。

  1. 获取运行记录中accuracy, {}最后值大于0.25的记录

run.metrics['accuracy'].last > 0.25

结果:

运行

参数

指标

run_3 <hash=a32c912>

学习率批次大小
0.00516

训练集损失 { "subset":"train" } 测试集损失 { "subset":"test" } 准确率 {}
30 30 0.3

  1. 获取运行记录中 loss, {'subset': 'train'} 最后值小于25的记录

run.metrics['accuracy', {'subset': 'train'}].last < 25

结果:

运行

参数

指标

run_1 <hash=a32c910>

学习率批次大小
0.00132

损失 { "subset":"train" } 损失 { "subset":"test" }
10 10

run_2 <hash=a32c911>

学习率批次大小
0.000764

训练集损失 { "subset":"train" } 测试集损失 { "subset":"test" } 准确率 {}
20 20 0.2

  1. 搜索运行时长小于10秒的运行记录(例如用于过滤掉失败的运行) .. code-block:: python

    run.duration < 10

这将返回测试集上的所有运行记录,但在实际实验中可用于筛选完成时间在10秒以内的运行。然后可以将这些记录归档/删除,因为它们可能已崩溃或被中止。

  1. 根据创建或结束时间搜索运行记录

created_atfinalized_at 属性以 python datetime 对象形式表示。因此以下任意查询都是筛选运行记录的有效方式:

  1. 获取特定日期的运行记录

run.created_at.strftime("%d/%m/%Y") == "24/12/2021"
  1. 获取特定日期之后的运行记录

run.finalized_at > datetime(2022, 2, 2)
  1. 获取特定月份的运行记录

run.created_at.month == 2 and run.created_at.year == 2022

搜索指标与图像

搜索指标

在遍历指标时,请使用metric关键字来表示被追踪的指标。在搜索指标时,您也可以通过run关键字引用相关的运行记录。

metric 具有以下默认属性。

属性

描述

name

指标名称

context

指标上下文字典

last

该指标的最后跟踪值

last_step

该指标最后追踪的步骤编号

first_step

该指标首次追踪的步骤编号

查询示例

  1. 按名称查询指标:

metric.name == "loss"

结果:

指标

相关运行

loss { "subset":"train" }

run_1 <hash=a32c910>

loss { "subset":"test" }

run_1 <hash=a32c910>

loss { "subset":"train" }

run_2 <hash=a32c911>

loss { "subset":"test" }

run_2 <hash=a32c911>

loss { "subset":"train" }

run_3 <hash=a32c912>

loss { "subset":"test" }

run_3 <hash=a32c912>

  1. 按名称和上下文查询指标

metric.name == "loss" and metric.context.subset == "train"

结果:

指标

相关运行

loss { "subset":"train" }

run_1 <hash=a32c910>

loss { "subset":"train" }

run_2 <hash=a32c911>

loss { "subset":"train" }

run_3 <hash=a32c912>

  1. 按名称和运行参数查询指标

metric.name == "loss" and run.learning_rate >= 0.001

结果:

指标

相关运行

loss { "subset":"train" }

run_1 <hash=a32c910>

loss { "subset":"test" }

run_1 <hash=a32c910>

loss { "subset":"train" }

run_3 <hash=a32c912>

loss { "subset":"test" }

run_3 <hash=a32c912>

  1. 按名称和最新值查询指标

metric.name == "loss" and metric.last >= 15

结果:

指标

相关运行

loss { "subset":"train" }

run_2 <hash=a32c911>

loss { "subset":"test" }

run_2 <hash=a32c911>

loss { "subset":"train" }

run_3 <hash=a32c912>

loss { "subset":"test" }

run_3 <hash=a32c912>

搜索图片

图像搜索的工作方式与指标相同。 在遍历图像时,请使用代表被追踪图像序列的images关键字。 在搜索图像时,您也可以通过run关键字引用相关的运行记录。

images 关键字具有以下默认属性。

属性

描述

name

图像序列名称

context

图像序列上下文字典

查询示例:

  • images.name == "generated" 且 run.learning_rate >= 0.001

  • images.name == "generated" 且 images.context.ema == 0

安全限制

AimQL表达式通过RestrictedPython进行评估。

RestrictedPython 是一个工具,用于定义Python语言的子集,允许将程序输入到受信任的环境中。

我们遵循了这些限制条件以避免安全风险,例如通过AimQL执行非安全函数。