HuggingFace чрезвычайно упростил запуск моделей машинного обучения в Python.

Но что, если вам нужно запустить эти модели на Java? Простое решение — поставить службу Python и сделать HTTP-запрос из Java.

Но иногда вы не можете отправлять HTTP-запросы к службам. Следовательно, как вы можете запустить модель прямо в Java?

Вы можете использовать Deep Java Library (https://djl.ai/) и Open Neural Network Exchange (https://onnx.ai/), чтобы добиться желаемого.

В этом посте я приведу рабочий пример для начала.

Запустить код на Python

Во-первых, давайте запустим на Python код, который мы хотим запустить на Java, чтобы убедиться, что мы получаем те же значения.

Взгляните на эту суть (https://gist.github.com/carlos-aguayo/2d1fe4c246a7ad2c54cd726c17c30a770)

Вы можете видеть, что мы размечаем предложение «Hello world», запускаем его через предварительно обученную модель и просматриваем первые значения последнего скрытого состояния.

Вы можете видеть, что мы отображаем первое измерение для вложений для каждого токена в «[CLS] Hello world [SEP]», равное [0.1000, 0.5740, 0.7239, 0.0975]. Если мы получим аналогичные значения в Java, мы можем быть уверены, что выполняем один и тот же код.

Сериализация токенизатора и модели

Чтобы запускать вещи на Java, нам нужно сериализовать токенизатор и модель.

Код, выполняющий сериализацию, можно посмотреть здесь (https://gist.github.com/carlos-aguayo/2bb28c893584fc6325216cbe43711a1b). Это довольно просто.

Сначала скачиваем нужный нам Tokenizer и сохраняем его методом save_pretrained. Нам нужен файл tokenizer.json,, и вы можете загрузить его прямо из Colab после выполнения кода. Если вы не знакомы с загрузкой файлов из Colab, есть несколько способов сделать это. Взгляните на этот вопрос Stackoverflow (https://stackoverflow.com/questions/48774285/how-to-download-file-created-in-colaboratory-workspace)

Во-вторых, нам нужно сериализовать модель, используя формат ONNX. Это, опять же, простая задача. Вы вызываете эту команду

!python -m transformers.onnx -- model=’sentence-transformers/all-distilroberta-v1' onnx/

Вы можете видеть, что он принимает модель HuggingFace в качестве параметра и каталог, в котором вы хотите сохранить вещи.

После запуска этой команды будет создан файл «model.onnx».

Эти модели, как правило, имеют большой размер, как вы можете видеть, model.onnx составляет около 330 МБ. По какой-то причине Colab не может загружать большие файлы. Проще смонтировать Google Диск, скопировать туда файл и скачать прямо с Google Диска.

Откройте свой Google Диск, и вы найдете файл model.onnx.

Создание вашего Java-проекта с правильными зависимостями

Создайте новый проект Java, используя Gradle, Maven или любой другой инструмент сборки, который вы предпочитаете. Или обновите зависимости вашего существующего проекта.

Вот суть простого pom.xml (https://gist.github.com/carlos-aguayo/ea8772c4a8a86601829d69be0a3752d6)

Это зависимости, которые вам нужны в формате Maven:

Создайте папку с именем «artifacts» и добавьте файлы tokenizer.json и model.onnx, которые мы создали на предыдущем шаге.

Запустите модель на Java

Теперь мы наконец готовы запустить наш код на Java. Взгляните на этот пример для рабочего примера (https://gist.github.com/carlos-aguayo/f2743e15186a0965e1958a599055683c)

Во-первых, вы можете видеть, что мы будем кодировать то же предложение, что и на предыдущем шаге: «Hello world».

Затем мы создаем экземпляр Tokenizer и кодируем предложение.

Затем мы загружаем модель в память.

Наша модель принимает два входа, input_ids и attention_mask. Токенизатор предоставляет эти значения. Нам нужно создать тензоры и карту для передачи в нашу модель.

Наконец, мы можем передать эти входные данные нашей модели и проверить результаты.

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

Эти значения такие же, как те, которые мы получили на первом этапе при запуске нашего кода на Python: [0.1000, 0.5740, 0.7239, 0.0975].

Заключение

В этом сообщении блога вы запустили токенизатор и модель, загруженные из хаба HuggingFace на Python. Затем мы сериализовали токенизатор и модель, чтобы потом загрузить их в Java, используя Deep Java Library (https://djl.ai/) и Open Neural Network Exchange (https://onnx.ai/ ) и подтвердил, что мы получили одинаковые значения.