트랜스포머 기반의 자연어 처리를 위한 고급 딥 러닝 모델은 인상적인 결과를 제공하지만, 빠른 빠른 성능을 얻기는 어렵습니다. 이 글에서는 다음과 같은 목적을 달성하기 위한 최상의 옵션을 요약해 보겠습니다. 프로덕션 환경에서 예측의 지연 시간을 줄이세요.
트랜스포머 기반 자연어 처리 모델의 속도를 향상시키고자 할 때 "순진한" 접근 방식은 고급 하드웨어를 고급 하드웨어를 사용하는 것입니다.
순수 소프트웨어 기반 솔루션은 모두 한계가 있기 때문에 대부분의 경우 이는 불가피한 해결책입니다. CPU에서 추론을 수행한다고 가정해 보겠습니다. 좋아하는 Transformer 기반 모델에 대한 낮은 수준의 최적화 작업에 몇 주를 소비할 수 있습니다, 모델을 단순히 다른 모델로 옮기는 것만으로도 더 나은 속도 향상을 얻을 수 있습니다. NVIDIA A100 GPU로 옮기는 것만으로도 속도를 개선할 수 있습니다.
현재 프로덕션에서 추론에 가장 널리 사용되는 GPU는 NVIDIA Tesla T4 및 V100입니다.
하지만 이미 하드웨어를 업그레이드했다면 어떻게 해야 할까요? 또는 예산이 한정되어 있어서 감당할 수 없다면 고가의 최신 GPU를 활용할 여력이 없다면요? 다음 글을 읽어보세요!
일괄 추론은 모델에 여러 요청을 동시에 전송하는 것으로, 한 번에 여러 요청을 처리합니다. 요청을 한 번에 처리합니다.
일괄 추론은 모델이 하나의 요청을 처리하는 데 걸리는 시간과 여러 요청을 처리하는 시간이 여러 요청을 처리하는 데 걸리는 시간과 거의 동일하기 때문입니다. 내부적으로 일부 연산은 인수분해되므로 모든 작업을 n번 수행하는 대신 모델은 한 번만 수행하면 됩니다.
기술적으로 말하자면, 요청이 더 빨리 처리되지 않기 때문에 요청의 지연 시간이 줄어들지는 않습니다. 더 빨리 처리되지는 않지만, 애플리케이션의 처리량이 크게 향상됩니다(애플리케이션이 동일한 하드웨어로 더 많은 요청을 은 동일한 하드웨어로 더 많은 요청을 처리할 수 있습니다.)
하지만 일괄 추론은 완벽하지 않습니다.
첫째, 다음과 같은 이유로 온라인 추론(즉, 고객 대면 애플리케이션)에 항상 적합한 것은 아닙니다. 배치를 빌드하기 위해서는 일부 사용자 요청을 버퍼링해야 하므로 일부 사용자는 평소보다 더 오래 기다려야 합니다.
두 번째 과제: 일괄 추론은 유사한 요청에 대해 더 잘 작동합니다. 예를 들어, 텍스트 생성 자연어 처리 모델을 배포하는 경우 텍스트 생성 자연어 처리 모델을 배포하는 경우, 길이가 같은 요청을 일괄 처리하는 것이 더 효율적입니다. 요청을 일괄 처리하는 것이 더 효율적입니다.
마지막으로, 배치 추론은 딥 러닝 모델 자체에서 수행되는 것이 아니라 전용 추론 서버와 같은 상위 추론 전용 서버와 같은 상위 계층에서 수행됩니다. 이러한 계층을 구현하는 것이 항상 쉬운 것은 아닙니다. 예를 들어 예를 들어, 엔비디아의 트리톤 추론 서버(아래 참조)는 일괄 추론에 매우 능숙합니다, 하지만 먼저 모델을 트리톤과 호환되도록 만드는 방법을 찾아야 합니다.
모델을 트리톤으로 내보내면 배치 추론은 매우 간단합니다. 예를 들어, 다음은 최대 128개의 요청으로 구성된 배치를 생성하고 최대 5초 동안 기다린 후 처리하는 방법은 다음과 같습니다. 배치("config.pbtxt" 파일에 넣어야 함)를 처리하기 전에 최대 5초를 기다리는 방법입니다.
max_batch_size: 128
dynamic_batching {
max_queue_delay_microseconds: 5000000
}
많은 사람들과 회사들이 일부 Transformer 기반 자연어 처리 모델에 대한 낮은 수준의 최적화를 위해 노력하고 있습니다. 이러한 맞춤형 모델 구현을 활용하는 것도 좋은 방법이 될 수 있습니다.
대부분의 경우 이러한 사용자 지정 구현은 사용하기 쉬우며 추가 작업이 거의 필요하지 않습니다. 거의 필요하지 않습니다. 여기 몇 가지를 소개해드리겠습니다:
다음은 DeepSpeed를 통해 GPT Neo 2.7B 모델에 대한 추론을 수행하는 방법에 대한 예제입니다. 어렵지 않나요?
# 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 런타임("ORT")은 Microsoft의 크로스 플랫폼 추론 및 트레이닝 머신 러닝 가속기 (여기를 참조하십시오.). 고성능 딥 러닝을 위한 SDK인 NVIDIA의 TensorRT("TRT")는 고성능 딥 러닝을 위한 추론용 SDK입니다. 여기에는 딥 러닝 추론 최적화 도구와 런타임이 포함되어 있어 딥 러닝 추론 애플리케이션에 짧은 지연 시간과 높은 처리량을 제공합니다. 딥 러닝 추론 애플리케이션을 위한 높은 처리량 (여기를 참조하십시오.).
또한 NVIDIA Triton 추론 서버는 추론 서비스 소프트웨어로, 프레임워크에 AI 모델을 배포할 수 있도록 지원하여 다양한 프레임워크에서 AI 모델을 배포할 수 있게 해줍니다. Triton을 사용하면 다음을 수행할 수 있습니다. 일괄 추론을 쉽게 수행하고, 동일한 GPU에서 여러 딥 러닝 모델을 동시에 실행할 수 있습니다, 여러 GPU에 모델을 배포하는 등의 작업을 수행할 수 있습니다. 여기를 참조하세요.
위의 내용은 흥미로워 보이지만 물론 그렇게 간단하지는 않습니다... 모델에서 이러한 전용 추론 엔진을 활용하려면 전용 추론 엔진을 활용하려면 먼저 기존 모델을 적절한 형식으로 변환해야 합니다.
몇 가지 선택 사항이 있습니다:
위의 방법을 사용할 때는 내보낸 모델의 품질에 매우 주의해야 합니다. 사용자 모델을 성공적으로 내보냈다고 생각할 수 있지만 그 과정에서 정확도가 떨어졌을 수 있습니다. 따라서 내보낸 새 모델을 테스트하는 방법을 매우 엄격하게 적용해야 합니다.
최신 트랜스포머 기반 자연어 처리 모델은 인상적인 결과를 제공하므로 점점 더 많은 기업이 프로덕션에서 프로덕션에 사용하기를 원합니다. 하지만 성능이 실망스러운 경우가 종종 있습니다...
예측 속도를 개선하기 위해 노력하는 것은 매우 중요하지만, 위에서 볼 수 있듯이 만능 솔루션은 없습니다.
추론 속도를 높이는 방법에 대해 궁금한 점이 있으면 언제든지 문의해 주세요! 또는 인프라에 신경 쓰지 않고 NLP Cloud를 구독하세요!
Abhinav
NLP 클라우드의 Devops 엔지니어