Многие из вас наверняка слышали о Берте или трансформерах.
И вы также можете знать huggingface. В этом уроке давайте поиграем с его моделью-трансформером pytorch и подадим ей Pinferencia.

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

Как работает модель?

При вводе неполного предложения модель сделает вывод о недостающем слове:

Круто~попробуем сейчас~

Предпосылка

Для пользователей Mac

Если вы, как и я, работаете на Mac M1, вам необходимо установить cmake и rust.

brew install cmake
curl — proto ‘=https’ — tlsv1.2 -sSf https://sh.rustup.rs | sh

Установить зависимости

Вы можете установить зависимости, используя pip.

pip install tqdm boto3 requests regex sentencepiece sacremoses

или вместо этого вы можете использовать образ докера:

docker run -it -p 8000:8000 -v $(pwd):/opt/workspace huggingface/transformers-pytorch-cpu:4.18.0 bash

Загрузите модель

Это загрузит токенизатор и модель. Загрузка может занять некоторое время.

import torch
# load tokenizer
tokenizer = torch.hub.load(
    “huggingface/pytorch-transformers”,
    “tokenizer”,
    “bert-base-cased”,
)
# load masked model
masked_lm_model = torch.hub.load(
    “huggingface/pytorch-transformers”,
    “modelForMaskedLM”,
    “bert-base-cased”,
)

Определите функцию прогнозирования

Вводимый текст: Париж — это [МАСКА] Франции.

input_text = “Paris is the [MASK] of France.”

Сначала нам нужно токенизировать

tokens = tokenizer(input_text)

Давайте посмотрим на замаскированный индекс:

mask_index = [
    i
    for i, token_id in enumerate(tokens[“input_ids”])
    if token_id == tokenizer.mask_token_id
]

Подготовьте тензор:

segments_tensors = torch.tensor([tokens[“token_type_ids”]])
tokens_tensor = torch.tensor([tokens[“input_ids”]])

Предсказывать:

with torch.no_grad():
     predictions = masked_lm_model(
         tokens_tensor, token_type_ids=segments_tensors
     )

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

pred_tokens = torch.argmax(predictions[0][0], dim=1)
# replace the initail input text’s mask with predicted text
for i in mask_index:
    tokens[“input_ids”][i] = pred_tokens[i]
tokenizer.decode(tokens[“input_ids”], skip_special_tokens=True)

Выход:

Paris is the capital of France.

Давайте организуем коды в функцию прогнозирования:

Бегать:

predict(“Paris is the [MASK] of France.”)

Выход:

Подавать через REST API

Сначала установим Pinferencia.

pip install “pinferencia[uvicorn]”

С Pinferencia просто добавьте еще три строчки, и ваша модель появится в сети!

Никогда не слышали о Pinferencia? Еще не поздно. Зайдите на его GitHub, чтобы посмотреть. Не забудьте поставить ему звезду.

Давайте сохраним нашу функцию прогнозирования в файл app.py и добавим несколько строк для ее регистрации.

Запустите службу и подождите, пока она загрузит модель и запустит сервер:

uvicorn app:service — reload

Протестируйте сервис

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

Ответ:

Круто~~ Еще нет, еще круче:

Вы можете использовать пользовательский интерфейс swagger по адресу http://127.0.0.1:8000 (адрес сервера), чтобы попробовать предсказание: