查询语言基础
简介
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:: 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” and run.learning_rate >= 0.001 
- images.name == “generated” and images.context.ema == 0 
安全限制
AimQL 表达式使用 RestrictedPython 进行评估。
RestrictedPython 是一种工具,有助于定义 Python 语言的一个子集,允许将程序输入提供到受信任的环境中。
我们遵循了这些限制,以避免通过 AimQL 执行不安全函数等安全风险。