documentation/pages/split-pipeline.md

172 lines
6.8 KiB
Markdown
Raw Permalink Normal View History

# Последовательный запуск пайплайнов
Несколько компонентов `ExperimentPipeline` возможно соединить друг с другом в последовательную серию запусков, где запуск первого пайплайна предполагает последовательный запуск второго.
Если два пайплайна связаны таким образом, у пользователя появляется два варианта запуска:
- Запустить цепочку из первого и второго пайплайна вместе
- Запустить только второй пайплайн
Для соединения двух пайплайнов необходимо:
1. Добавить в манифест `ExperimentPipeline` первого пайплайна пункт `continueWith`.
2. Создать совмещённый `APIComponent` запуска цепочки, который будет соответствовать запуску первого пайплайна.
При этом второй пайплайн создаётся обычным способом, и может запускаться отдельно от цепочки.
## Пример ExperimentPipeline
Например, в модуле есть два пайплайна. Пайплайн `part-1` содержит этап обучения модели машинного обучения. Пайплайн `part-2` содержит этап построения отчёта по обученной модели.
Первый пайплайн:
```yaml
apiVersion: "unified-platform.cs.hse.ru/v1"
kind: ExperimentPipeline
metadata:
name: part-1
namespace: pu-username-pa-appname
spec:
vars:
- name: data
- name: model
stages:
- name: train
image:
existingImageName: platform-reg.stratpro.hse.ru/my_org/myproject-train:718e2b0
inputs:
- name: data
outputs:
- name: model
entryPoint:
cmd:
- python
- main.py
resourceLimits:
cpu: "500m"
memory: "512M"
connectedBoxes:
- name: user-box
path: /userdata/
default: true
mountS3Box:
s3BoxName: users
continueWith:
name: part-2
```
Второй пайплайн:
```yaml
apiVersion: "unified-platform.cs.hse.ru/v1"
kind: ExperimentPipeline
metadata:
name: part-2
namespace: pu-username-pa-appname
spec:
vars:
- name: report_document
- name: trained_model
stages:
- name: report
image:
existingImageName: platform-reg.stratpro.hse.ru/my_org/myproject-report:718e2b0
inputs:
- name: trained_model
outputs:
- name: report_document
resourceLimits:
cpu: "1"
memory: "2G"
connectedBoxes:
- name: user-box
path: /userdata/
default: true
mountS3Box:
s3BoxName: users
```
Пункт `continueWith` в первом пайплайне указывает, что после завершения работы первого пайплайна автоматически вызывается второй.
## Пример APIComponent
Для запуска пайплайна нужно передать все входные данные в запросе. Но если второй пайплайн вызывается сам автоматически, то нет запроса на его вызов. Поэтому все входные данные для всех пайплайнов цепочки должны быть переданы в изначальном запросе запуска первого пайплайна.
Сначала, пример `APIComponent` второго пайплайна:
```yaml
apiVersion: "unified-platform.cs.hse.ru/v1"
kind: APIComponent
metadata:
name: api-part-2
namespace: pu-username-pa-appname
spec:
published: true
experimentPipeline:
name: part-2
restfulApi:
auth:
basic:
credentials: appname-apis-cred
identityPassThrough: true
apiSpec:
inputs:
- name: trained_model
type:
datatypes: [ "FILE" ]
contentTypes: [ "pth" ]
outputs:
- name: report_document
type:
datatypes: [ "FILE" ]
contentTypes: [ "text/html" ]
```
Для второго пайплайна `APIComponent` создаётся как для обычного независимого пайплайна и содержит данные, которые пользователь передаёт на вход и получает на выход.
`APIComponent` первого пайплайна содержит данные как для себя, так и для второго пайплайна:
```yaml
apiVersion: "unified-platform.cs.hse.ru/v1"
kind: APIComponent
metadata:
name: api-part-1
namespace: pu-username-pa-appname
spec:
published: true
experimentPipeline:
name: part-1
restfulApi:
auth:
basic:
credentials: appname-apis-cred
identityPassThrough: true
apiSpec:
inputs:
- name: data
description: "Набор данных для обучения."
type:
datatypes: [ "FILE" ]
contentTypes: [ "text/csv" ]
- name: trained_model
description: "Готовая модель и её конфигурация."
type:
datatypes: [ "FILE" ]
contentTypes: [ "pth" ]
outputs:
- name: model
description: "Готовая модель и её конфигурация."
type:
datatypes: [ "FILE" ]
contentTypes: [ "pth" ]
- name: report_document
type:
datatypes: [ "FILE" ]
contentTypes: [ "text/html" ]
```
Здесь `trained_model` и `report_document` - это переменные второго пайплайна, которые не входят в первый. При получении запроса на запуск, фреймворк анализирует, какую последовательность пайплайнов нужно запустить, и отделяет переменные из `APIComponent` второго пайплайна от общего списка переменных.
На практике, если нужно передать данные из первого пайплайна во второй, для этого нужно создать две переменные с разными именами, и в запросе на запуск передать в них один и тот же путь. Тогда первый пайплайн запишет по этому пути выходные данные, а второй сможет их прочитать. В примере выше такими переменными являются `model` и `trained_model`.