Mechanical Tsar

Материал из NLPub
Версия от 07:06, 28 октября 2016; Ustalov (обсуждение | вклад) (Проблемы и решения: chown)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Mechanical Tsar — программное обеспечение для краудсорсинга, позволяющее за короткое время организовать процесс коллективной разметки данных[1] с использованием трёхзвенной архитектуры.

MechanicalTsar.svg

Движок включает в себя реализацию популярных адаптивных методов ранжирования участников, назначения заданий и агрегации полученных от них ответов, в том числе ZenCrowd[2], алгоритма Давида-Скина[3], голосования большинства, и др.

Доступность

Mechanical Tsar распространяется на условиях лицензии Apache версии 2.0. Исходные коды доступны на GitHub.

Установка

Рекомендуется использовать контейнерную виртуализацию (Docker) для быстрого развёртывания Mechanical Tsar на базе Linux. В целях экономии места, способы запуска в PaaS-средах или путём сборки из исходников, не рассматриваются.

В реестре Docker Hub доступен образ mtsar/mtsar с актуальной версией движка. Для начала нужно скачать его с репозитория.

# docker pull mtsar/mtsar

Для работы Mechanical Tsar необходим PostgreSQL версии не ниже 9.3. В случае, если предполагается использование уже работающего сервера базы данных, доступного по порту 5432, то движок можно запустить при помощи docker run. Параметры доступа к базе определяются при помощи переменных окружения: POSTGRES_PORT — адрес сервера базы данных (такое странное название переменной вызвано особенностями docker-compose), POSTGRES_DATABASE — название базы данных, POSTGRES_USER — пользователь базы данных, POSTGRES_PASSWORD — пароль пользователя базы данных.

# docker run -p 8080:8080 -p 8081:8081 --restart=always --name=mtsar \
  -e POSTGRES_PORT=tcp://192.168.1.2:5432 \
  -e POSTGRES_DATABASE=mtsar \
  -e POSTGRES_USER=mtsar \
  -e POSTGRES_PASSWORD=mtsar \
  -d mtsar/mtsar

После выполнения этой команды, основной интерфейс Mechanical Tsar будет доступен по адресу http://127.0.0.1:8080/, а служебный интерфейс — по адресу http://127.0.0.1:8081/. Проверить конфигурацию движка можно при помощи команды about. В целях компактности, переменные окружения пропущены.

# docker run --rm mtsar/mtsar /mtsar/mtsar.sh about
Mechanical Tsar version 0.0.1-SNAPSHOT
Java version 1.8.0_45-internal-b14

Configuration: {
  "database" : {
    "driverClass" : "org.postgresql.Driver",
  ...
}

Stages: { }

Контейнер целиком

В случае, если сервер PostgreSQL не установлен, то можно также воспользоваться Docker-образом и запустить сервер базы данных, связав его с контейнером Mechanical Tsar. Самый простой способ добиться этого — использовать docker-compose. В качестве основы можно взять конфигурационной файл docker-compose.yml.example из репозитория на GitHub.

Сначала необходимо запустить PostgreSQL и подождать несколько секунд, пока сервер проинициализирует свою базу данных.

# docker-compose -f docker-compose.yml.example up -d postgres

После этого можно запустить движок и приступить к работе, Docker самостоятельно обеспечит связь между контейнерами. Поскольку контейнер с движком запускается позже, чем контейнер с базой данных, важно указать опцию --no-recreate, которая запретит повторную инициализацию базы данных одновременно с движком и позволит избежать потери данных.

# docker-compose -f docker-compose.yml.example up --no-recreate -d app

Как правило, одновременно с движком необходимо предоставить Web-интерфейс Boyarin. Рекомендуется запуск отдельного контейнера с интерфейсом внутри общей конфигурации docker-compose. В настоящий момент не существует удобного образа для развёртывания интерфейса. Следует выполнить клонирование репозитория в каталог boyarin и самостоятельное внесение строк в конфигурацию контейнеров.

boyarin:
  build: boyarin
  environment:
    - MTSAR_API_URL=http://app:8080
  links:
    - app
  ports:
    - "8841:8841"
  restart: always

Проблемы и решения

Из соображений безопасности, Mechanical Tsar запускается от пользователя nobody. Поэтому все директории, монтируемые в контейнер, должны быть доступны пользователю с идентификатором 65534.

# chown -R 65534:65534 log

При использовании SELinux полезно выставлять контекст для монтируемых в контейнер директорий.

# chcon -Rt svirt_sandbox_file_t log

Иногда настройка iptables или firewalld мешает связи контейнеров друг с другом. В таком случае следует разрешить обмен данными между ними.

# iptables -t filter -A DOCKER -d 172.17.0.0/16 -i docker0 -j ACCEPT

В ряде случаев нужно разрешить обратному прокси-серверу nginx подключаться к удалённому серверу.

# setsebool -P httpd_can_network_connect on

Данные

Mechanical Tsar использует следующие поля при загрузке данных в систему и выгрузке данных из неё. Записи об участниках, заданиях и ответах имеют четыре общих поля с метаданными:

  • id — первичный ключ, целое число;
  • stage — идентификатор процесса разметки (игнорируется при загрузке данных);
  • datetime — временна́я метка записи в формате Unix time;
  • tags — пользовательские метки, разделённые знаком |.

При загрузке данных в систему все четыре поля могут быть пустыми, причём значение поля stage игнорируется. Метки в поле tags полезны при связывании записей со внешними источниками. Например, связь участника с его профилями в социальных сетях. Mechanical Tsar не использует метки в процессе работы и хранит их только для удобства пользователей.

Участники

Формат данных об участниках не приносит дополнительных полей, хотя в будущем это может измениться. В данном примере объявляется два участника с идентификаторами 1 и 2 внутри процесса duplicates без меток.

id,stage,datetime,tags
1,duplicates,1440357110,
2,duplicates,1440694589,

Задания

Формат данных о заданиях для разметки предусматривает три дополнительных поля:

  • type — тип задания, может быть single (одиночный выбор) или multiple (множественный выбор);
  • description — текстовая формулировка задания для участника, рекомендуется использовать Markdown;
  • answers — возможные ответы, разделённые знаком |.

В данном примере представлено два задания с идентификаторами 1 и 2. Первое задание имеет метку 69, второе задание имеет метку 130. Ответ на оба задания может быть либо «Да», либо «Нет».

id,stage,datetime,tags,type,description,answers
1,duplicates,1440357080,69,single,"Совпадают ли значения синонимических рядов *«закрытость, закрытый, закрытый для посторонних»* и *«закрытость, закрытый, закрытый со всех сторон»*?",Да|Нет
2,duplicates,1440357080,130,single,"Совпадают ли значения синонимических рядов *«вред, наклад, потеря, убыток, утрата, ущерб»* и *«лишение, потеря, убыль, убыток, утрата»*?",Да|Нет

Ответы

Формат данных об ответах участников предусматривает четыре дополнительных поля:

  • type — тип ответа, может быть answer (участник отправил ответ) или skip (участник пропустил задание);
  • task_id — идентификатор задания внутри данного процесса (id);
  • worker_id — идентификатор участника внутри данного процесса (id);
  • answers — полученные ответы, разделённые знаком |, если их несколько.
id,stage,datetime,tags,type,task_id,worker_id,answers
1,duplicates,1440390179,,answer,1,1,Нет
2,duplicates,1440409992,,answer,1,2,Да
3,duplicates,1440441656,,answer,2,1,Нет
4,duplicates,1440441669,,answer,2,2,Да

Использование

MechanicalTsarDashboard.png

Загрузка и выгрузка данных

Загрузка и выгрузка данных возможна при помощи встроенных средств PostgreSQL. На практике, это не очень удобно, поскольку работа с базой напрямую требует специфических навыков и повышенной аккуратности пользователя. Mechanical Tsar предоставляет возможность оперировать данными в унифицированном формате CSV.

Данные могут быть загружены в систему или выгружены из неё как при помощи Web-интерфейса, так и при помощи консольной утилиты cURL. Если сервер Mechanical Tsar доступен по адресу http://127.0.0.1:8080/ и существует процесс под названием duplicates, то следующие команды позволят загрузить данные в систему:

  • curl -F 'file=@workers.csv' 'http://127.0.0.1:8080/processes/duplicates/workers' — данные об участниках из файла workers.csv;
  • curl -F 'file=@tasks.csv' 'http://127.0.0.1:8080/processes/duplicates/tasks' — данные о заданиях из файла tasks.csv;
  • curl -F 'file=@answers.csv' 'http://127.0.0.1:8080/processes/duplicates/answers' — данные об ответах из файла answers.csv.

Аналогичным образом данные могут быть выгружены как для переноса, так и для дальнейшей обработки вне системы:

  • curl -s 'http://127.0.0.1:8080/processes/duplicates/workers.csv' — данные об участниках из файла workers.csv;
  • curl -s 'http://127.0.0.1:8080/processes/duplicates/tasks.csv' — данные о заданиях из файла tasks.csv;
  • curl -s 'http://127.0.0.1:8080/processes/duplicates/answers.csv' — данные об ответах из файла answers.csv.

Перед загрузкой ответов в Mechanical Tsar следует убедиться, что записи об участниках и заданиях уже загружены, иначе база данных прервёт процедуру загрузки данных в систему по причине нарушения ограничений целостности.

Цитирование

Ustalov, D.: A Crowdsourcing Engine for Mechanized Labor. Proceedings of the Institute for System Programming, Vol. 27(3), 351–364 (2015)

@article{Ustalov:15:ispras,
  author    = {Ustalov, D.},
  title     = {{A Crowdsourcing Engine for Mechanized Labor}},
  journal   = {Proceedings of the Institute for System Programming},
  pages     = {351--364},
  volume    = {27},
  number    = {3},
  year      = {2015},
  address   = {Moscow},
  publisher = {ISP RAS},
  url       = {http://www.ispras.ru/proceedings/docs/2015/27/3/isp\_27\_2015\_3\_351.pdf},
  issn      = {2220-6426},
  doi       = {10.15514/ISPRAS-2015-27(3)-25},
  language  = {english},
}

Ссылки

См. также

Примечания

  1. D. Ustalov (2015), A Crowdsourcing Engine for Mechanized Labor
  2. G. Demartini, D.E. Difallah & P. Cudré-Mauroux (2013), Large-scale Linked Data Integration Using Probabilistic Reasoning and Crowdsourcing
  3. A.P. Dawid, A.M. Skene (1979), Maximum Likelihood Estimation of Observer Error-Rates Using the EM Algorithm