Имате проблеми с ИИ или разработката на пълен пакет? Нашите експерти са тук, за да ви напътстват: индивидуални съвети, техническа интеграция и др. Свържете се с [email protected].

Как да ускорим изводите от дълбоко обучение за обработка на естествен език Трансформатори

Усъвършенстваните модели за дълбоко обучение за обработка на естествен език, базирани на трансформатори, дават впечатляващи резултати, но постигането на високи скорост е трудно. В тази статия обобщаваме най-добрите възможности, с които разполагате, ако искате да да намалите латентността на прогнозите си в производството.

Използване на по-добър процесор или графичен процесор

Когато искаме да подобрим скоростта на моделите за обработка на естествен език, базирани на трансформатори, "наивният" подход е да използваме повече усъвършенстван хардуер.

В повечето случаи това е неизбежно решение, тъй като всички чисто софтуерни решения имат ограничения. Представете си, че извършвате изводи на процесор. Може да прекарате седмици в работа по оптимизация на ниско ниво за любимия си модел, базиран на Трансформатор, но е много вероятно да получите по-добро подобрение на скоростта, като просто преместите модела си на NVIDIA A100 GPU.

В наши дни най-широко използваните графични процесори за изводи в производството са NVIDIA Tesla T4 и V100.

Графичен процесор NVIDIA Tesla

Но какво да правите, ако вече сте обновили хардуера си? Или ако бюджетът ви е ограничен и не можете да да си позволите да да използвате последните най-съвременни скъпи графични процесори? Прочетете следното!

Партиден извод

Пакетният извод е свързан с изпращането на няколко заявки едновременно към вашия модел, така че той е насочен към всички заявки наведнъж.

Пакетното извеждане е много мощно, защото моделът ви ще се справи с почти същото време. на няколко заявки, колкото е необходимо за разглеждане на 1 заявка. Под капака някои операции ще бъдат факторизирани, така че вместо да прави всичко n пъти, моделът ще трябва да го направи само веднъж.

Технически погледнато, това не намалява латентността на заявките ви, защото заявките ви няма да бъдат по-бързо, но ще подобри значително пропускателната способност на вашето приложение (вашето приложение може да обработва повече заявки със същия хардуер).

Пакетният извод обаче не е съвършен.

Първо, тя не винаги е подходяща за онлайн изводи (т.е. за приложения, насочени към клиенти), защото за да изградите своите партиди, ще трябва да буферирате някои потребителски заявки, така че някои потребители ще имат да чакат по-дълго от обикновено.

Второ предизвикателство: груповият извод работи по-добре при сходни заявки. Например, ако внедрявате модел за генериране на текст за обработка на естествен език, пакетното изработване ще бъде по-ефективно, ако създавате партиди от заявки, които имат еднаква дължина.

И накрая, изводът за партидите не се извършва от самия модел за дълбоко обучение, а от по-висш ниво, например специален сървър за изводи. Не винаги е лесно да се реализира такъв слой. За например 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 е софтуер за обслужване на изводи, който прави изводите с изкуствен интелект улеснява, като дава възможност за внедряване на модели на ИИ от различни рамки. Благодарение на Triton можете да например лесно да извършвате пакетни изводи, да стартирате няколко модела за дълбоко обучение едновременно на един и същ графичен процесор, да разгръщате модели на множество графични процесори и др. Вижте тук.

ONNX Runtime
TensorRT
Triton Inference Server

Горното изглежда вълнуващо, но, разбира се, не е толкова просто... За да може вашият модел да използва тези специализирани двигатели за изводи, първо трябва да преобразувате съществуващия си модел в подходящ формат.

Имате няколко избора:

Когато работите с горните методи, трябва да внимавате много за качеството на експортираните модели. Можете да Може да си мислите, че успешно сте експортирали модела си, но е възможно да сте загубили част от точността в процеса, така че бъдете много стриктни по отношение на начина, по който тествате новия си експортиран модел.

Заключение

Съвременните модели за обработка на естествен език, базирани на трансформатори, дават впечатляващи резултати, така че все повече компании искат да да ги използват в производството. Но много често се оказва, че резултатите са разочароващи...

Работата по подобряване на скоростта на прогнозите е от решаващо значение, но, както видяхте по-горе, няма универсално решение.

Ако имате въпроси за това как да ускорите извеждането на данни, моля, не се колебайте да се свържете с нас!

Julien Salinas
Технически директор в NLP Cloud