Closed zmactep closed 10 years ago
Вдохновляться dnanexus.com
Мысли вслух про реализацию, прокомментируй, пожалуйста. Мета-Актер - унифицированные команды. (Issue #20) Существующий протокол легко переделывается в general-purpose задачи.
{
"commands":[
{
"executable": "train.py",
"input": {
"params": [
{"name": "fasta", "value": "file1.fasta"},
{"name": "kabat", "value": "file1.kabat"},
{"name": "outdir", "value": "/tmp"},
{"name": "model_name", "value": "model.mdl"},
{"name": "ml_window_size", "value": "5"}
],
"comment": "ig is really cool!",
"group": "all stars"
}
},
{
"executable": "predict.py",
"input": {
"params": [
{"name": "fasta", "value": "file2.fasta"},
{"name": "outdir", "value": "/tmp"},
{"name": "model_path", "value": "/tmp/model.mdl"},
{"name": "merge_threshold", "value": "1"},
{"name": "avg_window_size", "value": "10"},
{"name": "ml_window_size", "value": "5"}
],
"comment": "ig is cool!",
"group": "all stars"
}
}
]
}
Backend ничего не знает про тулы. Он знает только корневую директорию с тулами. Из пришедшей команды он извлекает название exe-шника ("executable"), которое, в общем случае, включает в себя часть пути от tools_root. Params превращаются в аргументы (добавляется "--" и "=").
Все знание о тулах содержится в базе ig, которая доступна фронтэнду. Каждому тулу соответствует своя django-модель Удобно, что модель представляется в виде таблицы, в которой каждый столбец соответствует отдному параметру для тула. Дополнительное преимущество - из модели строится форма ввода параметров для пользователя, поэтому мы сразу убиваем двух зайцев.
Очень хорошо, так оно и должно выглядеть как-то. Только стоит разделять параметры и входные-выходные файлы, наверное. Просто логически, чтоб быстро строить пайплайны на дефолтных параметрах. Да, и накручивать тулы на выходы других тулов будет проще. А унифицировать во всех наших консольных утилитах флаги входа-выхода - это дело 10 минут.
Остается незакрытый вопрос - как в pipeline пробросить файлы с вывода первой утилиты на вход второй. Сейчас выбор входных файлов осуществляется через dropdown list, данные для которого берутся из таблички Storage. Нужно научиться на стороне фронтэнда для второй утилиты во входные файлы добавлять файлы с вывода первой утилиты. Мне пока что пришло в голову следующее:
Из минусов - любое переименование выходных файлов в скрипте должно отражаться в базе.
Прокомментируй, пожалуйста. Вдруг у тебя есть более изящное и красивое решение.
В общем-то, сейчас перечитал, у меня никаких возражений нет. Как я понимаю, оно ровно так и должно действовать.
Да, согласен. Нужно продумать формат манифеста. Видимо, это будет что-то вроде:
{
"tool_name": "predict.py"
"output": [
{
//Одиночный файл
"name": "predict_result.kabat",
"description": "output prediction in kabat",
"type": "kabat",
"is_input": true //Может ли подаваться на вход следующего тула?
"mandatory": true
},
{
//Группа файлов
"name": "cluster_\d+.txt",
"description": "clustered region",
"type": "cluster",
"is_input": true,
"mandatory": true,
"max_occurs": "unbounded", //Может быть несколько файлов, соответствующих регулярке "name"
"select_predicate": "max_size" //Если нужно выбрать лишь один из файлов для следующего этапа - выбираем файл наибольшего размера. Нужно продумать, как добавить другие варианты (максимальный score, что-то еще)
},
]
}
Да, как-то так. Ну, и иметь табличку типов где-то в базе. И табличку возможных предикатов. Аналогично input - отдельной графой. И params - отдельной графой. Хотя тут нужно еще подумать, потому что из моделей табличек БД действительно очень удобно потом на халяву иметь формочки в интерфейсе.
Нужна возможность сохранять собранный пайплайн под новым именем. Чтобы не собирать заново при следующем запуске.
Внизу, рядом с кнопкой Start появились две кнопки и выпадающее меню. Через меню выбирается тул, затем, по нажатию Add Selected добавляется новая форма. Например, после нажатия Add Selected добавляется форма:
Самое интересное - это раздел "Файл с моделью" во второй форме и "Входной KABAT файл" в третьей - это еще не существующие файлы с предыдущего шага.
Пока что поддерживается только Train и Predict, но поддержку я добавлю быстро, ибо трудно создать только первые формы.
Доделал поддержку пайплайна для всех форм. Обрати внимание, что нужно будет подправить таблицу ig.igbackend_tasks (в скрипте create_db.sql уже прописан правильный вариант).
Возможность накручивать на данные серию обработчиков (аналог pipe в Bash)