يمكن استخدام نماذج T5 للعديد من مهام NLP مثل التلخيص ، و QA ، و QG ، والترجمة ، وتوليد النص ، وأكثر من ذلك. إن توليد النص المتسلسل بطيء بشكل طبيعي ، وبالنسبة لنماذج T5 الكبيرة ، يصبح الأمر أبطأ. FastT5 يجعل نماذج T5 الاستدلال أسرع عن طريق تشغيله على onnxruntime. كما أنه يقلل من حجم النموذج عن طريق تحديد كميته.
تتيح لك FastT5 Library تحويل طراز 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 ، ويقوم بتقديره ويديره على onnxruntime مع الإعدادات الافتراضية. يدعم النموذج الذي تم إرجاعه من هذه الطريقة طريقة generate() من luggingface.
إذا كنت لا ترغب في تحديد كمية النموذج ، فاستخدم
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 (ترميز التشفير) ، لأنه يستخدم وحدة فك الترميز مرارًا وتكرارًا للاستدلال ، لا يمكننا تصدير النموذج بالكامل مباشرة إلى ONNX. نحن بحاجة إلى تصدير المشفر وفك التشفير بشكل منفصل.
يحتوي
past_key_valuesعلى حالات مخفية محسوبة مسبقًا (المفتاح والقيم في كتل الاهتمام الذاتي وكتل الالتحاق المتبادل) التي يمكن استخدامها لتسريع فك التشفير المتسلسل.
لا يمكن تصدير النماذج إلا بعدد ثابت من المدخلات. على عكس هذا ، فإن وحدة فك ترميز الخطوة الأولى لا تأخذ past_key_values وبقية خطوات فك التشفير. للتغلب على هذه المشكلة ، يمكننا إنشاء اثنين من فك التشفير: أحدهما للخطوة الأولى التي لا تأخذ past_key_values والآخر لبقية الخطوات التي تستخدم past_key_values .
بعد ذلك ، سنقوم بتصدير جميع النماذج الثلاثة (التشفير ، وحدة فك الترميز ، init_decoder). ثم حددها ، وتكميات 32bit إلى 8bit يجب أن يعطي تقليل الذاكرة 4x. نظرًا لوجود وحدة فك ترميز إضافية ، يقل حجم النموذج بمقدار 3x.
أخيرًا ، سنقوم بتشغيل النموذج الكمي على وقت تشغيل ONNX.
الاستدلال بسيط حيث أن النموذج يدعم طريقة
generate()من luggingface.
past_key_values ).generate() .3X باستخدام القياس الكمي.5X Speedup مقارنة بتنفيذ Pytorch للبحث الجشع و 3-4X للبحث عن الشعاع. المعايير هي نتيجة لنموذج T5-base الذي تم اختباره على الترجمة الإنجليزية إلى اللغة الإنجليزية.
يوضح الرسم البياني التالي زمن انتقال نموذج 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 (كمية) | 0.240769 | 0.282342 | 0.468817 |
| T5-Small (Pytorch) | 0.254601 | 0.295172 | 0.492749 |
| T5-base (كمية) | 0.267606 | 0.306019 | 0.499188 |
| T5-base (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 Model Hub النماذج الخاصة. لاستخدام نسخة خاصة مدركة مسبقًا من 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/setings/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 },
}