Просунуті моделі глибокого навчання для обробки природної мови на основі трансформаторів дають вражаючі результати, але отримати високі швидкісних показників складно досягти. У цій статті ми узагальнюємо найкращі варіанти, які у вас є, якщо ви хочете зменшити затримку ваших прогнозів у виробництві.
Коли потрібно підвищити швидкість роботи моделей обробки природної мови на основі трансформаторів, "наївним" підходом є використання більш просунуте апаратне забезпечення.
У більшості випадків це неминуче рішення, оскільки чисто програмні рішення мають свої межі. Уявіть, що ви виконуєте висновок на центральному процесорі. Ви можете витратити тижні, працюючи над низькорівневою оптимізацією для вашої улюбленої моделі на базі Transformer, дуже ймовірно, що ви все одно отримаєте кращий приріст швидкості, просто перемістивши свою модель на NVIDIA A100 GPU.
На сьогоднішній день найпоширенішими графічними процесорами для виведення у виробництві є NVIDIA Tesla T4 і V100.
Але що робити, якщо ви вже модернізували своє обладнання? Або якщо ваш бюджет обмежений і ви не можете собі дозволити дозволити собі використовувати останні передові дорогі графічні процесори? Читайте далі!
Пакетний висновок полягає у відправленні декількох запитів одночасно до вашої моделі, тому він обробляє ваші запити одночасно.
Пакетне виведення є дуже потужним, тому що вашій моделі знадобиться майже стільки ж часу для обробки декількох запитів, скільки потрібно для обробки одного запиту. кілька запитів, як і на обробку 1 запиту. Під капотом деякі операції будуть факторизовані, так що що замість того, щоб робити все n разів, модель має зробити це лише один раз.
Технічно кажучи, це не зменшує латентність ваших запитів, тому що ваші запити не будуть оброблятися швидше, але це значно покращить пропускну здатність вашого додатку (ваш додаток зможе обробляти більше запитів на тому ж самому обладнанні).
Пакетне виведення, однак, не є досконалим.
По-перше, він не завжди підходить для онлайн виведення (тобто для додатків, що працюють з клієнтами), тому що для того, щоб побудувати ваші партії, вам доведеться буферизувати деякі запити користувачів, тому деяким користувачам доведеться чекати довше, ніж зазвичай.
2-й виклик: пакетний висновок краще працює для схожих запитів. Наприклад, якщо ви розгортаєте модель модель генерації тексту на природній мові, пакетний висновок буде більш ефективним, якщо ви створюєте пакети запитів, які мають однакову довжину.
Нарешті, пакетний висновок виконується не самою моделлю глибокого навчання, а більш високим рівня, наприклад, виділеним сервером виводу. Реалізувати такий рівень не завжди просто. Наприклад наприклад, Triton Inference Server від NVIDIA (див. нижче) дуже добре виконує пакетний висновок, але спочатку потрібно знайти спосіб зробити вашу модель сумісною з Triton.
Після того, як вам вдасться експортувати вашу модель в Triton, пакетний висновок стає надзвичайно простим. Наприклад, ось як як створювати пакети, що складаються з 128 запитів, і чекати максимум 5 секунд перед обробкою пакету (це потрібно прописати у файлі "config.pbtxt").
max_batch_size: 128
dynamic_batching {
max_queue_delay_microseconds: 5000000
}
Багато людей і компаній наполегливо працюють над низькорівневою оптимізацією деяких моделей обробки природної мови на основі трансформаторів моделей обробки природної мови. Для вас може бути гарною ідеєю скористатися цими спеціальними реалізаціями вашої моделі.
У більшості випадків ці індивідуальні реалізації прості у використанні і майже не вимагають від вас додаткової роботи. від вас. Дозвольте згадати деякі з них:
Ось приклад того, як ви можете виконати висновок для вашої моделі GPT Neo 2.7B завдяки DeepSpeed. Не так вже й складно, чи не так?
# Filename: gpt-neo-2.7b-generation.py
import os
import deepspeed
import torch
from transformers import pipeline
local_rank = int(os.getenv('LOCAL_RANK', '0'))
world_size = int(os.getenv('WORLD_SIZE', '1'))
generator = pipeline('text-generation', model='EleutherAI/gpt-neo-2.7B',
device=local_rank)
generator.model = deepspeed.init_inference(generator.model,
mp_size=world_size,
dtype=torch.float,
replace_method='auto')
string = generator("DeepSpeed is", do_sample=True, min_length=50)
if not torch.distributed.is_initialized() or torch.distributed.get_rank() == 0:
print(string)
Використовуючи одну з цих користувацьких реалізацій, не забудьте ретельно протестувати якість вашої нової моделі, оскільки ви ніколи не можете бути на 100% впевнені, що в цих нових реалізаціях немає помилок.
Microsoft та NVIDIA працювали над вдосконаленими механізмами виводу, щоб покращити продуктивність виводу. продуктивності.
ONNX Runtime ("ORT") від Microsoft - це крос-платформний прискорювач машинного навчання прискорювач (дивіться тут). TensorRT ("TRT") від NVIDIA - це SDK для високопродуктивного глибокого навчання висновків. Він включає в себе оптимізатор глибокого навчання та середовище виконання, яке забезпечує низьку затримку та високу пропускну здатність для додатків глибокого навчання. (дивіться тут).
Крім того, NVIDIA Triton Inference Server - це програмне забезпечення, що обслуговує висновок, яке робить висновок ШІ простіше, дозволяючи розгортати моделі ШІ з різних фреймворків. Завдяки Triton ви можете наприклад, легко виконувати пакетний висновок, запускати кілька моделей глибокого навчання одночасно на одному GPU, розгортати моделі на декількох графічних процесорах тощо. Поглянь сюди.
Вищесказане здається захоплюючим, але, звичайно, не все так просто... Для того, щоб ваша модель могла використовувати ці спеціалізовані механізми виведення, вам спочатку потрібно перетворити вашу існуючу модель у відповідний формат.
У вас є кілька варіантів:
Використовуючи вищезазначені методи, ви повинні бути дуже уважними до якості ваших експортованих моделей. Вам може здатися, що ви може здатися, що ви успішно експортували свою модель, але цілком можливо, що ви втратили деяку точність в процесі, тому будьте дуже уважні до того, як ви тестуєте свою нову експортовану модель.
Сучасні трансформаторні моделі обробки природної мови дають вражаючі результати, тому все більше компаній хочуть використовувати їх у виробництві. Але дуже часто виявляється, що показники розчаровують...
Робота над підвищенням швидкості ваших прогнозів має вирішальне значення, але, як ви могли бачити вище, не існує універсального рішення.
Якщо у вас є питання щодо того, як прискорити ваш висновок, будь ласка, зв'яжіться з нами! Або ж не заморочуйтесь з інфраструктурою і просто підпишіться на NLP Cloud!
Julien Salinas
CTO в NLP Cloud