Wang's blog

进阶 - 任务管理

Published on

简介

工作流部分介绍了如何以低耦合的方式运行研究工作流,但是使用qrun时只能执行一个任务。为了自动生成与执行不同的任务,任务管理模块提供了一整套流程,包括任务生成、任务储存、任务训练与任务收集。使用此模块,用户可以在不同周期下,使用不同的损失甚至不同的模型运行任务。任务生成、模型训练以及数据合并与收集的流程如下:

流程图

该流程的一个例子在这里。该流程可以用于在线服务。

任务生成

一个任务包括模型、数据集、记录以及任何用户添加的内容。即使任务模板是固定的,用户仍然可以通过自定义TaskGen类来生成不同的任务。Qlib提供了RollingGen类来生成一系列使用不同时间段数据集的任务,这允许用户在一个实验中验证不同时间段数据在模型上的效果。

任务储存

为了达到更高的效率,并获得集群操作的可能性,任务管理器将所有任务保存在MongoDB中。任务管理器可以自动获取未完成的任务并通过错误处理来管理一组任务的生命周期。用户在使用本模块时必须完成MongoDB的配置,可以在初始化时提供MongoDB的URL和数据库名,或在代码中做如下声明:

from qlib.config import C
C["mongo"] = {
    "task_url" : "mongodb://localhost:27017/", # MongoDB的url
    "task_db_name" : "rolling_db" # 数据库名
}

任务训练

在生成与储存任务后,就需要运行处于等待状态的任务。Qlib提供了run_task方法来运行任务池中的任务,但是用户也可以自定义如何执行任务。获取task_func的一个简单的方法是使用直接qlib.model.trainer.task_train方法,它将运行被任务定义的包括了模型、数据集、记录的整个工作流。

训练器训练一组任务并返回一组模型记录器。Qlib提供了两种训练器,TrainerR是最简单的方式;TrainerRM基于任务管理器,可以帮助自动管理任务的生命周期。如果不需要使用任务管理器,则使用TrainerR训练一组TaskGen生成的任务就足够了。

任务收集

在收集模型的训练结果前,需要使用qlib.init指出mlrun的路径。

为了在训练后收集任务的结果,Qlib提供了CollectorGroupEnsemble,它们分别以只读、可扩展和松耦合的方式收集结果。

Collector可以从任何地方收集对象,并对它们进行处理,如合并、分组、平均等。它有两步操作:collect(将所有信息收集到一个字典中)与process_collect(处理收集的字典)。

Group同样有两个步骤:group(基于group_func将一些对象分组并将它们转换为字典)与reduce(基于某些规则将字典转换为一个整体)。

Ensemble可以将多个对象合并为一个整体。可以在Collector的处理列表中设置想要的整合方法。常用的整合方法包括AverageEnsembleRollingEnsembleAverageEnsemble用于将同一时间段不同模型的结果合并;RollingEnsemble用于将不同时间段相同模型的结果合并。

所以以上三种方法的层次是:Collector的第二个步骤对应Group,而Group的第二个步骤对应Ensemble