171 lines
6.8 KiB
Markdown
171 lines
6.8 KiB
Markdown
# Последовательный запуск пайплайнов
|
||
|
||
Несколько компонентов `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`.
|