T5 모델은 요약, QA, QG, 번역, 텍스트 생성 등과 같은 여러 NLP 작업에 사용될 수 있습니다. 순차적 텍스트 생성은 자연스럽게 느리고 더 큰 T5 모델의 경우 더 느려집니다. FASTT5는 OnnxRuntime에서 실행하여 T5 모델을 더 빠르게합니다. 또한 모델 크기를 정량화하여 감소합니다.
FASTT5 라이브러리를 사용하면 사전 여겨진 T5 모델을 ONNX로 변환하고 정량화하며 모델을 하나의 코드 라인에서 ONNXRUNTIME에서 실행중인 출력으로 제공 할 수 있습니다. 이 전체 프로세스를 사용자 정의 할 수도 있습니다.
PYPI에서 FASTT5를 설치할 수 있습니다.
pip install fastt5출처에서 구축하려면 :
git clone https : // github . com / Ki6an / fastT5
cd fastT5
pip3 install - e . export_and_get_onnx_model() 메소드는 주어진 사전에 사전 된 T5 모델을 ONNX로 내보내고 기본 설정으로 ONNXRUNTIME에서 실행합니다. 이 메소드에서 반환 된 모델은 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 양자화하면 4 배 메모리 감소가 필요합니다. 여분의 디코더가 있으므로 모델 크기는 3 배 감소합니다.
마지막으로, ONNX 런타임에서 양자화 된 모델을 실행하겠습니다.
모델이
generate()메소드의 포옹 페이스를 지원하므로 추론은 간단합니다.
past_key_values 포함).generate() 메소드를 통해 빔 검색 및 탐욕 검색 등을 지원합니다.3X 줄입니다.5X 속도가 빠르고 빔 검색의 경우 3-4X . 벤치 마크는 영어에서 프랑스어 번역으로 테스트 된 T5-베이스 모델의 결과입니다.
다음 그래프는 1에서 9까지의 빔 수에 대한 양자화 된 ONNX 모델의 대기 시간을 보여줍니다. 여기에 표시된 대기 시간은 서열 길이의 평균 130까지입니다.
다음 히트 맵은 Pytorch 대 ONNX 모델 대기 시간의 비율을 X 배 빠르게 보여줍니다. ONNX 모델은 대부분의 경우보다 성능이 우수합니다. 그러나 모델의 속도는 더 긴 시퀀스 길이로 떨어집니다.
양자화 된 모델은 앞에서 언급했듯이 가벼운 모델이며,이 모델은 원래 모델과 거의 동일한 정확도를 가지고 있습니다 (양자 모델 점수는 다음 섹션에서 언급되어 있음). 양자화 된 ONNX 모델은 ONNX 및 PYTORCH 모델과 비교하여 가장 낮은 대기 시간을 갖습니다.
이 모델은 Pytorch 모델을 평균적으로 욕심 많은 검색의 경우 5.7 배, 빔 검색의 경우 3-4x를 능가합니다.
참고 : 결과는
AMD EPYC 7B12에서 생성되었으며,이 결과는 장치마다 다를 수 있습니다. ONNX 모델은 일반적으로 더 많은 코어가있는 고급 CPU에서 잘 작동합니다.
결과는 빔 검색 번호가 3 인 영어에서 프랑스어 번역에 대해 테스트되었습니다.
| bleu_4 | 유성 | Rouge_L | |
|---|---|---|---|
| T5-Small (수비) | 0.240769 | 0.282342 | 0.468817 |
| T5-Small (Pytorch) | 0.254601 | 0.295172 | 0.492749 |
| T5-베이스 (Quant) | 0.267606 | 0.306019 | 0.499188 |
| T5-베이스 (Pytorch) | 0.268346 | 0.304969 | 0.503306 |
| T5-LARGE (Quant) | 0.286726 | 0.316845 | 0.503585 |
| T5-Large (Pytorch) | 0.294015 | 0.315774 | 0.508677 |
Huggingface Model Hub는 개인 모델을 지원합니다. FASTT5와 함께 T5의 비공개, 미리 훈련 된 버전을 사용하려면 먼저 $ transformers-cli login 사용하여 Huggingface 생태계를 인증해야합니다. 그런 다음 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 https $ transformers-cli login set_auth_token 환경 변수 HF_API_KEY=<redacted> 설정 한 다음 코드에서 API 키를 코드로 하드 코딩하지 마십시오.
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 },
}