Найти тему
Pavel Zloi

Label Studio: удобный инструмент создания датасетов для машинного обучения

Оглавление

Приветствую вас, мои уважаемые читатели!

В данной публикации мой рассказ будет про один очень любопытный инструмент для создания и управления датасетами, их разметке, как ручной так и автоматической, под названием Label Studio.

Логотип Label Studio
Логотип Label Studio

Ранее в публикации Как я боролся с матюками: история одного ML API я вскользь затрагивал тему работы с Label Studio и подключения к ней системы автоматической классификации текстовых данных, однако, на этот раз решил чуть более подробно осветить эту тему.

Введение

Как и многие из вас, я часто сталкиваюсь с необходимостью создавать датасеты для своих проектов по машинному обучению. И вот, однажды, в очередной раз намучившись с вопросом сборки очередного датасета я наткнулся на Label Studio. По сути, это именно то, о чём я мечтал: удобный интерфейс, гибкая система аннотаций и множество других полезных функций.

Источник: https://labelstud.io/guide/manage_data.html
Источник: https://labelstud.io/guide/manage_data.html

Один из важнейших факторов почему мне понравилась именно эта система заключался в том, что данное решение является OpenSource проектом, иными словами оно бесплатное и авторы предоставляют в ваше распоряжение все исходные коды и инструкции по их сборке.

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

Запускаем через Docker Compose

Давайте попробуем запустить данное приложение у себя локально, для этого нам понадобится Docker Engine и Docker Compose (кстати, у меня есть пару публикаций про базовые вещи и некоторые хитрости Docker, рекомендую ознакомиться).

Первым делом создадим папку, назовём её скажем docker-label-studio, перейдём в нём создадим файл docker-compose.yml.

mkdir docker-label-studio
cd docker-label-studio
touch docker-compose.yml

Далее откроем файл docker-compose.yml в редакторе и наполним его следующими содержимым:

Конфигурация для запуска Label Studio
Конфигурация для запуска Label Studio

Исходный код тут.

Тут видно, что у нас имеется два сервиса, собственно label-studio и db, в роли базы данных будем использовать сервер PostgreSQL (смотри публикацию про короткие команды постгреса).

Параметр depends_on сказано, что label-studio зависит от сервиса db, это означает, что label-studio не будет запущен до тех пор, пока база данных не будет полностью проинициализирована.

В принципе Label Studio возможно использовать и без применения какой-то внешней базы данных, в этом случае система будет использовать SQLite, но сами понимаете, что для больших датасетов это решение может оказаться неприемлемым, плюс в режиме SQLite системой невозможно пользоваться более чем одному человеку в один момент времени.

Идём дальше, параметр ports говорит нам о том, что приложение будет пробрасывать 8080 порт с нашего хоста, на 8080 порт внутри Docker-контейнера label-studio.

В volumes мы описываем какие директории мы хотим смонтировать, можно использовать и динамические тома, которыми будет управлять Docker Engine, но мне больше нравится когда данные хранятся рядом с конфигурациями запуска.

Далее идёт параметр env_file который описывать путь до файла с переменными окружения, собственно через .env и выполняется вся настройка как приложения, так и базы данных.

Теперь создадим файл .env, положим его на одном уровне с docker-compose.yml.

touch .env

В нём будут следующие значения:

Конфигурация приложения
Конфигурация приложения

Теперь запустим приложение командой:

docker-compose up -d

Теперь надо немного исправить права доступа:

sudo chown -R 1001:1001 label-studio_data

Затем ещё раз выполнить up -d:

docker-compose up -d

Выполнить это потребуется всего один раз, в дальнейшем никаких сложностей с правами возникнуть не должно. Чтобы не выполнять данную процедуру можете воспользоваться томами Docker.

Теперь откроем в браузере адрес http://localhost:8080

Страница авторизации
Страница авторизации

Предварительная настройка Label Studio

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

-6

Не забудьте убрать галочку с Get the latest news from Heidi дабы не получать их рассылки. Далее жмём Create account и оказываемся на странице главного окна приложения.

Проектов ещё пока нет
Проектов ещё пока нет

Как видно у нас ещё нет никаких датасетов, поэтому давайте попробуем создать несколько разных, чтобы разобраться в том как это в принципе происходит.

Создание датасета

Проект Label Studio позволяет создавать датасеты (в интерфейсе они называются проектами) в различных форматах, это могут быть любые данные, хоть текстовые, хоть в виде изображений, хоть аудио или видео файлы.

Предполагается, что у вас уже имеется какая-то коллекция файлов, либо же некий датасет в формате TXT, JSON, CSV или TSV, это необходимо для создания первоначальной структуры проекта.

Жмём кнопку Create Project.

Текст с метками

Попробуем создать простой датасет классификации текста, далее мы добавим к нему конфигурацию которая позволит выполнять разметку текста. Назовём новый датасет скажем demo-text, поле Description (описание) оставим пустим.

Создание датасета, шаг первый
Создание датасета, шаг первый

Затем переключимся на табу Data import.

Предположим, что у нас имеется некий тестовый файл под названием скажем demo-text.txt следующего вида:

В каждой строчке данного демо датасета находится одна строка
В каждой строчке данного демо датасета находится одна строка
Можете скопировать указанный URL и указать его в поле Dataset URL:
https://raw.githubusercontent.com/EvilFreelancer/docker-label-studio/main/datasets/demo-text.txt

На странице Data import выполним импорт файла data-text.txt перетащив его мышкой (или указав URL из моего примера), после чего система спросит о том как воспринимать этот файл.

-10

Жмём на селектор List of tasks, это позволит Label Studio понять, что каждая строка нашего файла это отдельный элемент датасета.

Далее необходимо описать шаблон, согласно которому будет выполняться разметка данных, для этого переключимся на вкладку Labeling Setup и выберем там какой тип задачи мы хотим решать, в данном примере у нас задача связанная классификацией текста, поэтому выберем категорию Natural Language Processing, а в ней Text Classification.

Выбираем шаблон классификатора
Выбираем шаблон классификатора

На следующей страницы мы можем чуть точнее настроить поля, например удалить варианты или добавить новые.

Визуальный редактор классификатора
Визуальный редактор классификатора

А также посмотреть XML-код конфигурации просто переключившись на вкладку под названием Code.

XML конифигурация
XML конифигурация

Но мы не будем вносить никаких изменений, просто нажмём кнопку Save в правом верхнем углу модального окна.

После этого мы попадаем на страницу редактирования датасета и можем наконец немного оглядеться.

Датасет успешно создан
Датасет успешно создан

На странице датасета (проекта) имеется множество элементов управления в частности можно выполнить импорт или экспорт датастета, можно отфильтровать данные, можно выбрать какие колонки необходимо отображать.

Обратите внимание на то, что каждая строка из файла demo-text.txt попала в колонку text.

Помимо этого можно выбрать режим отображения данных в формате таблицы (list) или в формате решётки (grid).

Теперь нажмём на любой элемент датасета и откроется окно ручной разметки данных.

-15

Тут можно классифицировать выбранный элемент, после чего нажать кнопку Submit, после чего в колонке Total annontations per task (синий квадрат слева) появится единица.

Разметка элементов датасета
Разметка элементов датасета

Таким нехитрым способом и происходит разметка данных для решения задач классификации текста.

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

Классификация и разметка чатов

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

Создадим новый проект, назовём его к примеру demo-chat.json, далее на странице импорт добавим пример JSON файла, следующего вида:

Небольшая переписка между пользователем и ассистентом
Небольшая переписка между пользователем и ассистентом

Ипортируем этот файл через интерфейс создания проекта.

Можете скопировать указанный URL и указать его в поле Dataset URL:
https://raw.githubusercontent.com/EvilFreelancer/docker-label-studio/main/datasets/demo-chat.json

Далее на странице Labeling Setup перейдём в категорию Conversational AI и выберем шаблон Intent Classification and Slot Filling.

Классификация диалогов
Классификация диалогов

Далее мы попадём на страницу настроек шаблона, подправим по вкусу конфигурацию и нажмём Save.

Шаблон настройки классификатора диалогов
Шаблон настройки классификатора диалогов

После чего перед нами будет страница со списком элементов датасета, выберем первый и посмотрим что внутри.

Пример диалога
Пример диалога

Чтобы проставить метки на словах нажимаем один из лейблов сверху, затем выделяем мышкой соответствующий элемент текста в чате, ну и снизу будет селектор в котором можно понять о чём указанный диалог был.

Ответы генеративной модели

Теперь давайте представим, что мы собираем датасет с ответами генеративного ИИ (например ChatGPT-3.5 или ChatGPT-4), для того чтобы на базе полученного датасета обучить свою собственную модель способную реагировать на запросы пользователя аналогично проекту OpenAI.

Последовательность такая же, подготавливаем заранее набор текстовых запросов, для которых мы хотим получить ответ генеративного ИИ, после чего на этапе создания проекта импортируем его.

Пример списка вопросов про нейросети
Пример списка вопросов про нейросети
Можете импортировать его по указанной ссылке:
https://raw.githubusercontent.com/EvilFreelancer/docker-label-studio/main/datasets/demo-gen.txt

Далее жмём в сетелекторе справа List of tasks, после чего переходим на страницу выбора шаблона, там заходим в категорию Generative AI и в ней выбираем Supervised Language Model Fine-tuning.

Пример конфигурации вопросно ответной системы
Пример конфигурации вопросно ответной системы

Далее жмём Save и смотрим, что получилось.

Пример окна редактирования датасета
Пример окна редактирования датасета

Теперь мы можем вручную заполнить указанные поля, подобное решение очень удобно когда необходимо создать очень качественный INSTRUCT датасет, наполением которого будут заниматься эксперты.

Качество генерации нейросетей обученных на подобных датасетах обычно заметно выше, но если возможности пригласить экспертов у вас нет, то вам может помочь Label Studio ML Backend, в качестве примера можете изучить исходные коды моего проекта ru-toxicml-api о котором я недавно очень подробно рассказывал, после внесения небольших модификаций его будет возможно подружить с генератором промтов через ChatGPT API, а в публикации Data Labeling with GPT-4 in Label Studio: ML Backend Integration вы сможете чуть более подробно ознакомиться с тем как происходит интегреация с ChatGPT API.

Транскрипция аудио

Если в двух словах, транскриптор - это система способная выполнять преобразование аудиозаписей в текст, при помощи Label Studio вы можете создать датасет который будет содержать в себе коллекцию аудиозаписей и предоставлять пользователям (или нейросети через ML Backend) возможность эти записи расшифровывать.

Воспользуемся готовым датасетом под названием Mozilla Common Voice, скачаем из него несколько mp3 файлов (они вот тут находятся), после чего импортируем их через интерфес создания проекта.

Импорт аудиороликов
Импорт аудиороликов

Далее перейдём на таб Labeling Setup и в категории Audio/Speech Processing выберем шаблон Automatic Speech Recognition.

Редактор шаблона распознавания голоса
Редактор шаблона распознавания голоса

После нажатия на кнопку Save мы попадём на страницу датасета.

Окно обработки голосового датасета
Окно обработки голосового датасета

Предполагается, что данные в текстовом блоке Provide Transcription будет выпполнять человек, но вы можете написать специализированный ML Backend, который будет например использовать модель OpenAI Whisper для выполнения процедуры рассшифровки.

Где Label Studio хранит файлы?

На последок хочу обратить ваше внимание на то что все загруженные данные проект Label Studio хранит внутри контейнера в дирекртории /label-studio/data/media, когда мы описывали в docker-compose.yml мы указали, что директорию /label-studio/data необходимо монтировать из ./label-studio_data, которая находится на одном уровне с docker-compose.yml

Куда Label Studio складывает файлы
Куда Label Studio складывает файлы

Завершение

Так что, друзья, если вы ищете удобный и функциональный инструмент для создания датасетов – дайте шанс Label Studio. Мой опыт общения с данной системой оказался очень положительным, и я уверен, что и ваш не будет исключением.

Для дочитавших до конца вот ссылочка на мой проект docker-label-studio, в котором я подготовил для вас конфигурации, примеры и краткую инструкцию по запуску.

Не забудьте поставить лайк, подписаться на канал, а также приглашаю ко мне на Telegram-канал на котором я публикую свои размышления, рассказываю о разных интересных новостях, а также делюсь своими наработками и опытом.

К тому же, если вы хотите поддержать мои усилия и вклад в развитие общества знаний, вы можете сделать пожертвование на CloudTips. Ваша поддержка поможет мне продолжать свою работу и делиться новыми открытиями с вами.

До встречи в следующей публикации!