Модели T5 могут использоваться для нескольких задач NLP, таких как суммирование, QA, QG, перевод, генерация текста и многое другое. Последовательное генерация текста естественным образом медленная, а для более крупных моделей T5 она становится еще медленнее. Fastt5 делает вывод моделей T5 быстрее, запустив его на Onnxruntime. И это также уменьшает размер модели, квантовая ее.
Библиотека Fastt5 позволяет преобразовать предварительную модель T5 в ONNX, определяет ее и дает модель как вывод, которая работает на OnNxruntime в одной строке кода. Вы также можете настроить весь этот процесс.
Вы можете установить FASTT5 из PYPI:
pip install fastt5Если вы хотите построить из источника:
git clone https : // github . com / Ki6an / fastT5
cd fastT5
pip3 install - e . Метод export_and_get_onnx_model() Экспортирует данную предварительную модель T5 в ONNX, определяет ее и запускает ее на настройках по умолчанию. Возвращенная модель из этого метода поддерживает метод generate() HuggingFace.
Если вы не хотите квантовать модель, используйте
quantized=Falseв методе.
from fastT5 import export_and_get_onnx_model
from transformers import AutoTokenizer
model_name = 't5-small'
model = export_and_get_onnx_model ( model_name )
tokenizer = AutoTokenizer . from_pretrained ( model_name )
t_input = "translate English to French: The universe is a dark forest."
token = tokenizer ( t_input , return_tensors = 'pt' )
tokens = model . generate ( input_ids = token [ 'input_ids' ],
attention_mask = token [ 'attention_mask' ],
num_beams = 2 )
output = tokenizer . decode ( tokens . squeeze (), skip_special_tokens = True )
print ( output )Для запуска уже экспортируемой модели используйте
get_onnx_model()
Вы можете настроить весь трубопровод, как показано в приведенном ниже примере кода:
from fastT5 import ( OnnxT5 , get_onnx_runtime_sessions ,
generate_onnx_representation , quantize )
from transformers import AutoTokenizer
model_or_model_path = 't5-small'
# Step 1. convert huggingfaces t5 model to onnx
onnx_model_paths = generate_onnx_representation ( model_or_model_path )
# Step 2. (recommended) quantize the converted model for fast inference and to reduce model size.
quant_model_paths = quantize ( onnx_model_paths )
# step 3. setup onnx runtime
model_sessions = get_onnx_runtime_sessions ( quant_model_paths )
# step 4. get the onnx model
model = OnnxT5 ( model_or_model_path , model_sessions )
... По умолчанию FASTT5 создает папку models в текущем каталоге и хранит все модели. Вы можете предоставить пользовательский путь для папки для хранения экспортируемых моделей. И для запуска уже exported models , которые хранятся в пользовательском пути папки: используйте get_onnx_model(onnx_models_path="/path/to/custom/folder/")
from fastT5 import export_and_get_onnx_model , get_onnx_model
model_name = "t5-small"
custom_output_path = "/path/to/custom/folder/"
# 1. stores models to custom_output_path
model = export_and_get_onnx_model ( model_name , custom_output_path )
# 2. run already exported models that are stored in custom path
# model = get_onnx_model(model_name, custom_output_path) T5-это модель seq2seq (Encoder-Decoder), поскольку она использует декодер для вывода, мы не можем напрямую экспортировать всю модель в ONNX. Нам нужно экспортировать энкодер и декодер отдельно.
past_key_valuesсодержат предварительно вычисленные скрытые государства (ключи и значения в блоках самосознания и блоках поперечного амортизации), которые можно использовать для ускорения последовательного декодирования.
Модели могут быть экспортированы только с постоянным количеством входов. Вопреки этому, декодер первого шага не делает past_key_values , а остальные декодеры делают остальные шаги. Чтобы обойти эту проблему, мы можем создать два декодера: один для первого шага, который не делает past_key_values , а другой для остальных шагов, в которых используется past_key_values .
Далее мы экспортируем все три модели (Encoder, Decoder, init_decoder). А затем квантовать их, квантование 32bit до 8bit должно привести к снижению 4x памяти. Поскольку существует дополнительный декодер, размер модели уменьшается на 3 раза.
Наконец, мы запустим квантовую модель на Onnx Runtime.
Вывод прост, так как модель поддерживает метод
generate()HuggingFace.
past_key_values ).generate() .3X используя квантование.5X ускорения по сравнению с выполнением Pytorch для жадного поиска и 3-4X для поиска пучка. Цитрицы являются результатом модели T5-базы, протестированной на английском языке на французский перевод.
На следующем графике показана задержка квантованной модели ONNX по сравнению с моделью Pytorch для чисел пучков, варьируя от 1 до 9. Задержки, показанные здесь, предназначены для среднего значения длины последовательностей до 130.
Следующая тепловая карта показывает x раз быстрее, что отношение задержки Pytorch и модели ONNX. Модель ONNX превосходит большинство случаев. Однако скорость модели падает для более длительной длины последовательности.
Квантовые модели - это легкие модели, как упоминалось ранее, эти модели имеют почти такую же точность, как и исходная модель (квантованные модели упоминаются в следующем разделе). Квантовые модели ONNX имеют самую низкую задержку по сравнению с моделями ONNX и Pytorch.
Модель превосходит модель Pytorch в 5,7x для жадного поиска в среднем и 3-4x для поиска пучка.
Примечание. Результаты были получены на
AMD EPYC 7B12, эти результаты могут варьироваться от устройства к устройству. Модели ONNX обычно хорошо работают на высококлассных процессорах с большим количеством ядер.
Результаты были проверены на английский на французский перевод с номером поиска луча 3.
| Bleu_4 | Метеор | Rouge_l | |
|---|---|---|---|
| t5-small (Quant) | 0,240769 | 0,282342 | 0,468817 |
| T5-Small (Pytorch) | 0,254601 | 0,295172 | 0,492749 |
| T5-баз (квант) | 0,267606 | 0,306019 | 0,499188 |
| T5-база (Pytorch) | 0,268346 | 0,304969 | 0,503306 |
| T5-Large (квант) | 0,286726 | 0,316845 | 0,503585 |
| T5-Large (Pytorch) | 0,294015 | 0,315774 | 0,508677 |
Хаб модели Huggingface поддерживает частные модели. Чтобы использовать частную, предварительно обученную версию T5 с FASTT5, вы сначала должны были аутентифицировать в экосистеме huggingface с $ transformers-cli login . Затем, при использовании FASTT5, есть дополнительный импорт и звонок:
from fastT5 import (
OnnxT5 ,
get_onnx_runtime_sessions ,
generate_onnx_representation ,
quantize ,
set_auth_token )
from transformers import AutoTokenizer
set_auth_token ( True )
# the rest of the code is the same as using a public model Если вы не можете позвонить $ transformers-cli login или предпочитаете использовать свой ключ API, найденный по адресу https://huggingface.co/settings/token (или https://huggingface.co/organizations/org_name/settings/token для организаций), вы можете передать эту строку, чтобы set_auth_token . Избегайте жесткого кодирования ключа API в код, установив переменную среды HF_API_KEY=<redacted> , а затем в коде:
import os
from fastT5 import (
OnnxT5 ,
get_onnx_runtime_sessions ,
generate_onnx_representation ,
quantize ,
set_auth_token )
from transformers import AutoTokenizer
auth_token = os . environ . get ( "HF_API_KEY" )
set_auth_token ( auth_token )
# code proceeds as normal @ article { 2019 t5 ,
author = { Colin Raffel and Noam Shazeer and Adam Roberts and Katherine Lee and Sharan Narang and Michael Matena and Yanqi Zhou and Wei Li and Peter J . Liu },
title = { Exploring the Limits of Transfer Learning with a Unified Text - to - Text Transformer },
journal = { arXiv e - prints },
year = { 2019 },
archivePrefix = { arXiv },
eprint = { 1910.10683 },
}