下一步
一旦任务被定义并进入ClearML系统,它们可以被链接在一起以创建管道。 管道为用户提供了更高层次的抽象和自动化,任务一个接一个地运行。
任务可以与管道中的其他任务进行交互,并利用其他任务的工作成果。
以下部分描述了以下场景:
- 数据集创建
- 数据 processing 和 consumption
- 管道构建
构建任务
数据集创建
假设你有一些代码从生产数据库中提取数据到本地文件夹。 你的目标是创建一个不可变的数据副本,以供后续步骤使用:
clearml-data create --project data --name dataset
clearml-data sync --folder ./from_production
你可以向数据集添加一个标签latest
,将其标记为最新版本。
预处理数据
第二步是预处理数据。首先访问数据,然后修改它,最后创建数据的新版本。
from clearml import Task, Dataset
# create a task for the data processing part
task = Task.init(project_name='data', task_name='create', task_type='data_processing')
# get the v1 dataset
dataset = Dataset.get(dataset_project='data', dataset_name='dataset_v1')
# get a local mutable copy of the dataset
dataset_folder = dataset.get_mutable_local_copy(
target_folder='work_dataset',
overwrite=True
)
# change some files in the `./work_dataset` folder
# create a new version of the dataset with the pickle file
new_dataset = Dataset.create(
dataset_project='data',
dataset_name='dataset_v2',
parent_datasets=[dataset],
# this will make sure we have the creation code and the actual dataset artifacts on the same Task
use_current_task=True,
)
new_dataset.sync_folder(local_path=dataset_folder)
new_dataset.upload()
new_dataset.finalize()
# now let's remove the previous dataset tag
dataset.tags = []
new_dataset.tags = ['latest']
新数据集继承了在Dataset.create
的parent_datasets
参数中指定的数据集的内容。
这不仅有助于通过完整的谱系追溯数据集的变化,还使存储更加高效,
因为它只存储父版本中更改和/或添加的文件。
当您访问数据集时,它会自动合并所有父版本中的文件,
这个过程是完全自动和透明的,就像这些文件一直是所请求数据集的一部分一样。
训练
你现在可以使用系统中最新的数据集来训练你的模型,通过基于latest
标签获取数据集的实例
(如果你有两个相同标签的数据集,你将获得最新的那个)。
一旦你有了数据集,你可以请求数据的本地副本。所有的本地副本请求都会被缓存,
这意味着如果你多次访问相同的数据集,你将不会有任何不必要的下载。
# create a task for the model training
task = Task.init(project_name='data', task_name='ingest', task_type='training')
# get the latest dataset with the tag `latest`
dataset = Dataset.get(dataset_tags='latest')
# get a cached copy of the Dataset files
dataset_folder = dataset.get_local_copy()
# train our model here
构建管道
现在你已经有了数据创建步骤和数据训练步骤,创建一个管道,当执行时,将首先运行第一个步骤,然后运行第二个步骤。 重要的是要记住,管道本身也是任务,也可以被其他管道自动化(即管道的管道)。
from clearml import PipelineController
pipe = PipelineController(
project='data',
name='pipeline demo',
version="1.0"
)
pipe.add_step(
name='step 1 data',
base_project_name='data',
base_task_name='create'
)
pipe.add_step(
name='step 2 train',
parents=['step 1 data', ],
base_project_name='data',
base_task_name='ingest'
)
您还可以将参数从一个步骤传递到另一个步骤(例如 Task.id
)。
除了由任务步骤组成的管道外,ClearML 还支持由函数步骤组成的管道。更多信息,请参阅 完整的管道文档。