В этой статье я хочу поделиться своим опытом использования данной open-source библиотеки на примере реализации одной задачи с парсингом файлов PDF/DOC/DOCX содержащих резюме специалистов.
Здесь я также опишу этапы реализации инструмента для подготовки датасета. После чего можно будет обучить модель BERT на полученном датасете в рамках задачи распознавания сущностей из текстов (Named Entity Recognition – в дальнейшем NER).
Итак, с чего начать. Естественно для начала нужно установить и настроить среду для запуска нашего инструмента. Установку я буду выполнять на Windows 10.
На Хабре уже есть несколько статей от разработчиков этой библиотеки, где как раз есть подробная инструкция по установке. А в этой статье я хотел бы собрать все воедино, от запуска и до обучения модели. Также я укажу решения некоторых проблем, с которыми я столкнулся при работе с этой библиотекой.
ВАЖНО: при установке важно соблюдение версий всех продуктов и компонентов, так как часто возникают проблемы при несовместимости версий. Особенно это касается библиотеки TensorFlow. Бывает даже так, что для некоторых задач вплоть до нужного коммита на GitHub нужно использовать. В случае с DeepPavlov достаточно соблюдение только поддерживаемой версии.
Я укажу версии продуктов работающей конфигурации, и спецификации моего ноутбука, на котором я запускал процесс обучения нейронной сети. Я приведу несколько ссылок в которых также описан процесс установки и настройки open-source библиотеки DeepPavlov.
Полезные ссылки от разработчиков DeepPavlov
DeepPavlov для разработчиков: #1 инструменты NLP и создания чат-ботов. Здесь описан процесс установки библиотеки на примере модели ner_ontonotes_bert_mult, которая используется для мультиязычного анализа текстов.
DeepPavlov для разработчиков: #2 настройка и деплоймент. Здесь вы сможете найти информацию об основных важных моментах в настройке библиотеки.
Версии компонентов для установки
Python 3.6.6 – 3.7
Visual Studio Community 2017 (опционально)
Visual C++ Build Tools 14.0.25420.1
nVIDIA CUDA 10.0.130_411.31_win10
cuDNN-10.0-windows10-x64-v7.6.5.32
Установка среды для поддержки GPU
Установка Python или Visual Studio Community 2017 в составе с Python. В моей установке я использовал второй способ, установив Visual Studio Community с поддержкой Python.
в системную переменную PATH, там где установлен Python от Visual Studio, но для меня это не проблема, для меня важно знать, что я установил одну версию для Python.
Но это мой случай, вы можете установить все отдельно.
ВАЖНО: если ранее была установлена библиотека nVIDIA CUDA, тогда нужно удалить все установленные ранее компоненты от nVIDIA, вплоть до видео-драйвера. И уже потом на чистую установку видео-драйвера выполнять установку nVIDIA CUDA.
Теперь устанавливаем cuDNN для nVIDIA CUDA.
Для этого Вам необходимо зарегистрировать членство для NVIDIA Developer Program (это бесплатно).
Скачиваем версию cuDNN для CUDA 10.0
Распаковываем архив в папку
C:Users<имя_пользователя>DownloadscuDNN
Копируем все содержимое папки ..cuDNN в папку где у нас установлена CUDA
Перезагружаем компьютер. Необязательно, но я рекомендую.
Установка DeepPavlov
Создаeм и активируем виртуальное окружение Python.
ВАЖНО: я это делал через Visual Studio.
Для этого я создал новый проект для From Existing Python code.
Жмем далее до последнего окна, но на Finish пока не жмем. Необходимо снять галочку «Detect Virtual Environments»
Жмем на Finish.
Теперь нужно создать виртуальное окружение.
Все оставляем по-умолчанию.
Открываем папку проекта в командной строке. И выполняем команду:
.envScriptsactivate.bat
Теперь все готово чтобы установить DeepPavlov. Выполняем команду:
pip install deeppavlov
Далее необходимо установить TensorFlow 1.14.0 с поддержкой GPU. Для этого выполняем команду:
pip install tensorflow-gpu==1.14.0
Почти все готово. Необходимо только убедиться, что TensorFlow будет использовать видеокарту для вычислений. Для этого напишем простенький скрипт devices.py, следующего содержания:
from tensorflow.python.client import device_lib print(device_lib.list_local_devices())
или tensorflow_test.py:
import tensorflow as tf tf.test.is_built_with_cuda() tf.test.is_gpu_available(cuda_only=False, min_cuda_compute_capability=None)
После выполнения devices.py, мы должны увидеть примерно следующее:
Теперь все готово для обучения и использования DeepPavlov с поддержкой GPU.
DeepPavlov на REST API
Для того чтобы запустить и установить сервис для REST API, нужно выполнить следующие команды:
Данная модель будет доступна по адресу http://localhost:5005. Порт можете указать свой. Все модели по-умолчанию будут скачены по пути
C:Users<имя_пользователя>.deeppavlov
Настройка DeepPavlov для обучения
Перед тем как запускать процесс обучения нам необходимо настроить конфигурацию DeepPavlov так, чтобы процесс обучения не «валился» с ошибкой от того, что память на нашей видеокарте переполнена. Для этого у нас есть файлы конфигурации для каждой модели.
Как и в примере от разработчиков, я также собираюсь использовать модель ner_ontonotes_bert_mult. Все конфигурации по умолчанию для DeepPavlov находятся по пути:
<папка_проекта>envLibsite-packagesdeeppavlovconfigs er
В моем случае файл будет называться как и модель ner_ontonotes_bert_mult.json.
Для моей конфигурации ноутбука мне пришлось поменять значение batch_size в блоке train на 4.
Иначе моя видеокарта после нескольких минут «захлёбывалась», и процесс обучения падал с ошибкой.
Конфигурация ноубука
Модель: MSI GS-65
Процессор: Core i7 8750H 2200 МГц
Объём установленной памяти: 32 Гб DDR-4
Жесткий диск: SSD 512 Гб
Видеокарта: GeForce GTX 1070 8192 Мб
Инструмент для подготовки датасета
Для того чтобы обучить модель, нужно подготовить датасет. Датасет состоит из трех файлов train.txt, valid.txt, test.txt. С разбивкой данных в следующем процентном соотношении train – 80%, valid и test по 10%.
Датасет для BERT-модели имеет следующий вид:
Ivan B-PERSON Ivanov I-PERSON Senior B-WORK_OF_ART Java I-WORK_OF_ART Developer I-WORK_OF_ART IT B-ORG - I-ORG Company I-ORG Key O duties O : 0 Java B-WORK_OF_ART Python B-WORK_OF_ART CSS B-WORK_OF_ART JavaScript B-WORK_OF_ART Russian B-LOC Federation I-LOC . O Petr B-PERSON Petrov I-PERSON Junior B-WORK_OF_ART Web I-WORK_OF_ART Developer I-WORK_OF_ART Boogle B-ORG I O ' O ve O developed O Web B-WORK_OF_ART - O Application O . Skills O : O ReactJS B-WORK_OF_ART Vue B-WORK_OF_ART - I-WORK_OF_ART JS I-WORK_OF_ART HTML B-WORK_OF_ART CSS B-WORK_OF_ART Russian B-LOC Federation I-LOC . O ...
Формат датасета выглядит так:
<текст_токена><пробел><тип_токена>
ВАЖНО: после конца предложения обязательно должен быть перенос строки. Если предложение содержит более 75 токенов, то также необходимо поставить перенос строки, иначе при обучении модели процесс выпадет с ошибкой.
Для подготовки датасета я написал веб-интерфейс, где имеется возможность загрузить файлы DOC/PDF/DOCX на сервер, распарсить в обычный текст, а потом пропустить этот текст через активную модель с доступом по REST API сохранив при этом результат в промежуточную БД. Для этого я использую MongoDB.
После того как вышеперечисленные действия будут выполнены, можно приступать к формированию датасета под наши нужды.
Для этого в мною написанном веб-интерфейсе я сделал отдельную панель, где есть возможность осуществлять поиск по токенам датасета и затем менять тип токена и сам текст токена.
Инструмент также умеет автоматически на основе списка слов делать обновление типа у токена, указанного пользователем при запросе.
В целом инструмент помогает автоматизировать часть работы, но все равно приходится много делать ручной работы.
Интерфейс для проверки результата и разбивка датасета на три файла также реализованы.
Обучение DeepPavlov
Вот мы и добрались до самой интересной части. Для процесса обучения сначала нужно скачать модель ner_ontonotes_bert_mult, если вы это еще не сделали, то нужно выполнить первые два шага из раздела DeepPavlov на REST API выше.
Перед запуском процесса обучения необходимо выполнить два шага:
Для запуска обучения можно написать простенький скрипт train.py следующего вида:
from deeppavlov import configs, train_model ner_model = train_model(configs.ner.ner_ontonotes_bert_mult, download=False)
или использовать командную строку:
python -m deeppavlov train <папка_проекта>envLibsite-packagesdeeppavlovconfigs er er_ontonotes_bert_mult.json
Результаты
Я обучал модель на датасете размером 115540 токенов. Этот датасет был сгенерирован из 100 файлов резюме сотрудников. Процесс обучения у меня занял 5 часов 18 минут.
Модель имела следующие значения:
precision: 76.32%;
recall: 72.32%;
FB1: 74.27;
loss: 5.4907482981681826;
После правок нескольких проблем в авто-генерации датасета, я получил loss ниже. А в целом остался доволен результатом. Конечно, у меня осталось много вопросов по использованию этой библиотеки и то, что я здесь описал, это лишь капля в море.
Библиотека мне очень понравилась своей простотой и удобством в использовании. По крайней мере для задачи NER. Буду очень рад обсудить другие возможности этой библиотеки и надеюсь кому-то будет полезен материал из этой статьи.