제퍼넷 로고

대규모 모델 유추 컨테이너를 사용하여 AWS Inferentia2에 대규모 언어 모델 배포

시간

대규모 언어 모델(LLM)의 가치를 이해하기 위해 기계 학습(ML) 전문가가 될 필요는 없습니다. 더 나은 검색 결과, 시각 장애인을 위한 이미지 인식, 텍스트에서 새로운 디자인 생성, 지능형 챗봇은 이러한 모델이 다양한 애플리케이션과 작업을 어떻게 용이하게 하는지 보여주는 몇 가지 예일 뿐입니다.

ML 실무자는 이러한 모델의 정확도와 기능을 지속적으로 개선하고 있습니다. 결과적으로 이러한 모델은 변압기 모델의 진화와 같이 크기가 커지고 더 일반화됩니다. 우리는 이전에 설명했습니다 게시 당신이 사용할 수있는 방법 아마존 세이지 메이커 딥 러닝 컨테이너 (DLC)는 GPU 기반 인스턴스를 사용하여 이러한 종류의 대규모 모델을 배포합니다.

이 게시물에서는 동일한 접근 방식을 사용하지만 모델을 호스팅합니다. AWS 인퍼렌시아2. 우리는 AWS 뉴런 소프트웨어 개발 키트(SDK)를 사용하여 Inferentia 장치에 액세스하고 고성능을 활용할 수 있습니다. 그런 다음 다음으로 구동되는 대형 모델 추론 컨테이너를 사용합니다. 딥 자바 라이브러리 (DJLServing)을 모델 서빙 솔루션으로 사용합니다. 우리는 이 세 계층이 함께 작동하는 방식을 시연합니다. OPT-13B 모델 아마존 엘라스틱 컴퓨트 클라우드 (아마존 EC2) inf2.48xlarge .

세 가지 기둥

다음 이미지는 대규모 언어 모델의 최상의 가격과 성능을 실현하는 데 도움이 되는 하드웨어 및 소프트웨어 계층을 나타냅니다. AWS 뉴런 및 tranformers-neuronx AWS Inferentia에서 딥 러닝 워크로드를 실행하는 데 사용되는 SDK입니다. 마지막으로 DJLServing은 컨테이너에 통합된 서빙 솔루션입니다.

하드웨어: Inferentia

AWS의 추론을 위해 특별히 설계된 AWS Inferentia는 고성능 및 저비용 ML 추론 가속기입니다. 이 게시물에서는 2세대 전용 ML 추론 가속기인 AWS Inferentia2(InfXNUMX 인스턴스를 통해 사용 가능)를 사용합니다.

각 EC2 Inf2 인스턴스는 최대 12개로 구동됩니다. Inferentia2 장치, 다음 중에서 선택할 수 있습니다. 네 가지 인스턴스 크기.

Amazon EC2 Inf2는 지연 시간이 짧고 대역폭이 높은 칩 간 상호 연결인 NeuronLink v2를 지원하여 다음과 같은 고성능 집단 통신 작업을 가능하게 합니다. AllReduceAllGather. 이는 Tensor Parallelism 등을 통해 AWS Inferentia2 장치 전체에서 모델을 효율적으로 샤딩하므로 대기 시간과 처리량이 최적화됩니다. 이는 대규모 언어 모델에 특히 유용합니다. 벤치마크 성능 수치는 AWS를 참조하십시오. 뉴런 성능.

Amazon EC2 Inf2 인스턴스의 중심에는 AWS Inferentia2 디바이스가 있으며, 각 디바이스에는 XNUMX개의 NeuronCores-v2. 각 NeuronCore-v2는 Tensor, Vector, Scalar 및 GPSIMD 엔진의 2가지 주요 엔진이 있는 독립적인 이기종 계산 장치입니다. 여기에는 데이터 지역성을 최대화하기 위한 온칩 소프트웨어 관리 SRAM 메모리가 포함됩니다. 다음 다이어그램은 AWS InferentiaXNUMX 디바이스 아키텍처의 내부 작동을 보여줍니다.

뉴런 및 변환기-neuronx

하드웨어 계층 위에는 AWS Inferentia와 상호 작용하는 데 사용되는 소프트웨어 계층이 있습니다. AWS Neuron은 AWS Inferentia에서 딥 러닝 워크로드를 실행하는 데 사용되는 SDK이며 AWS 트레이닝 기반 인스턴스. 엔드투엔드 ML 개발 수명 주기에서 새 모델을 구축하고, 이러한 모델을 교육 및 최적화하고, 프로덕션을 위해 배포할 수 있습니다. AWS Neuron에는 딥 러닝이 포함되어 있습니다. 컴파일러, 런타임검색을 TensorFlow 및 PyTorch와 같은 인기 있는 프레임워크와 기본적으로 통합됩니다.

transformers-neuronx 오픈 소스입니다 도서관 AWS Neuron SDK를 사용하여 변압기 디코더 추론 워크플로를 실행하는 데 도움이 되는 AWS Neuron 팀에서 구축했습니다. 현재, GPT2, GPT-J 및 OPT 모델 유형, 광범위한 코드 분석 및 최적화를 위해 컴파일된 언어로 다시 구현된 포워드 기능이 있는 다양한 모델 크기. 고객은 동일한 라이브러리를 기반으로 다른 모델 아키텍처를 구현할 수 있습니다. AWS Neuron 최적화 변환기 디코더 클래스는 PyHLO라는 구문을 사용하여 XLA HLO(High Level Operations)에서 다시 구현되었습니다. 라이브러리는 또한 텐서 병렬 처리를 구현하여 여러 NeuronCore에서 모델 가중치를 샤딩합니다.

모델이 너무 커서 단일 가속기 HBM 메모리에 맞지 않기 때문에 Tensor 병렬 처리가 필요합니다. 에서 AWS Neuron 런타임에 의한 텐서 병렬 처리 지원 transformers-neuronx 와 같은 집단 작업을 많이 사용합니다. AllReduce. 다음은 AWS Neuron 최적화 변압기 디코더 모델에 대한 텐서 병렬도(샤딩된 매트릭스 곱하기 작업에 참여하는 NeuronCore 수)를 설정하기 위한 몇 가지 원칙입니다.

  • Attention Heads의 수는 Tensor Parallelism Degree로 나눌 수 있어야 합니다.
  • 모델 가중치 및 키-값 캐시의 총 데이터 크기는 텐서 병렬도의 16GB보다 작아야 합니다.
  • 현재 Neuron 런타임은 텐서 병렬도 1, 2, 8 및 32를 지원합니다. 트렌1 Inf1에서 텐서 병렬도 2, 4, 8, 24 및 2를 지원합니다.

DJL서빙

DJLServing은 2년 2023월에 AWS InferentiaXNUMX에 대한 지원을 추가한 고성능 모델 서버입니다. AWS Model Server 팀은 컨테이너 이미지 LLM/AIGC 사용 사례에 도움이 될 수 있습니다. DJL은 또한 DJLServing 및 transformers-neuronx. DJLServing 모델 서버 및 transformers-neuronx 라이브러리는 변환기 라이브러리를 통해 지원되는 LLM을 제공하도록 구축된 컨테이너의 핵심 구성 요소입니다. 이 컨테이너와 후속 DLC는 설치된 AWSInferentia 드라이버 및 도구 키트와 함께 Amazon EC2 Inf2 호스트의 AWS Inferentia 칩에 모델을 로드할 수 있습니다. 이 게시물에서는 컨테이너를 실행하는 두 가지 방법을 설명합니다.

첫 번째 방법은 추가 코드를 작성하지 않고 컨테이너를 실행하는 것입니다. 당신은 사용할 수 있습니다 기본 핸들러 원활한 사용자 경험을 위해 지원되는 모델 이름 중 하나와 구성 가능한 로드 시간 매개 변수를 전달합니다. 이것은 Inf2 인스턴스에서 LLM을 컴파일하고 제공합니다. 다음 코드는 예를 보여줍니다.

engine=Python
option.entryPoint=djl_python.transformers_neuronx
option.task=text-generation
option.model_id=facebook/opt-1.3b
option.tensor_parallel_degree=2

또는 직접 작성할 수 있습니다. model.py 파일이지만 DJLServing API와 이 경우에는 transformers-neuronx 아피스. 구성 가능한 매개변수를 serving.properties 모델 로드 중에 선택할 파일입니다. 구성 가능한 매개변수의 전체 목록은 다음을 참조하십시오. 모든 DJL 구성 옵션.

다음 코드는 샘플입니다. model.py 파일. 그만큼 serving.properties 파일은 이전에 표시된 것과 유사합니다.

def load_model(properties): """ Load a model based from the framework provided APIs :param: properties configurable properties for model loading specified in serving.properties :return: model and other artifacts required for inference """ batch_size = int(properties.get("batch_size", 2)) tp_degree = int(properties.get("tensor_parallel_degree", 2)) amp = properties.get("dtype", "f16") model_id = "facebook/opt-13b" model = OPTForCausalLM.from_pretrained(model_id, low_cpu_mem_usage=True) ... tokenizer = AutoTokenizer.from_pretrained(model_id) model = OPTForSampling.from_pretrained(load_path, batch_size=batch_size, amp=amp, tp_degree=tp_degree) model.to_neuron() return model, tokenizer, batch_size

이 모든 것이 Inf2 인스턴스에서 어떻게 보이는지 봅시다.

Inferentia 하드웨어 실행

먼저 OPT-42b 모델을 호스팅할 inf.13xlarge 인스턴스를 시작해야 합니다. 우리는 딥 러닝 AMI 뉴런 PyTorch 1.13.0(Ubuntu 20.04) 20230226 Docker 이미지와 AWS Neuron 런타임에 필요한 드라이버가 이미 포함되어 있기 때문에 Amazon 머신 이미지(AMI).

대규모 언어 모델을 수용하기 위해 인스턴스 스토리지를 512GB로 늘립니다.

필요한 종속성 설치 및 모델 생성

We Jupyter 노트북 서버 설정 AMI를 사용하여 디렉터리와 파일을 보다 쉽게 ​​보고 관리할 수 있습니다. 원하는 디렉토리에 있을 때 다음에 대한 하위 디렉토리를 설정합니다. logsmodels 만들고 serving.properties 파일.

에서 제공하는 독립 실행형 모델을 사용할 수 있습니다. DJL 서빙 컨테이너. 즉, 모델을 정의할 필요는 없지만 serving.properties 파일. 다음 코드를 참조하십시오.

option.model_id=facebook/opt-1.3b
option.batch_size=2
option.tensor_parallel_degree=2
option.n_positions=256
option.dtype=fp16
option.model_loading_timeout=600
engine=Python
option.entryPoint=djl_python.transformers-neuronx
#option.s3url=s3://djl-llm/opt-1.3b/ #can also specify which device to load on.
#engine=Python ---because the handles are implement in python.

이것은 DJL 모델 서버가 OPT-13B 모델을 사용하도록 지시합니다. 배치 크기를 2로 설정하고 dtype=f16 모델이 뉴런 장치에 맞도록 합니다. DJL 제공은 동적 일괄 처리를 지원하고 유사한 설정을 통해 tensor_parallel_degree 여러 NeuronCore에 추론을 분산하기 때문에 추론 요청 처리량을 늘릴 수 있습니다. 우리는 또한 설정 n_positions=256 이것은 모델이 가질 것으로 예상되는 최대 길이를 알려주기 때문입니다.

인스턴스에는 12개의 AWS Neuron 장치 또는 24개의 NeuronCore가 있는 반면 OPT-13B 모델에는 40개의 주의 헤드가 필요합니다. 예를 들어, 설정 tensor_parallel_degree=8 8개의 NeuronCore마다 하나의 모델 인스턴스를 호스팅한다는 의미입니다. 필요한 주의 헤드(40)를 NeuronCore 수(8)로 나누면 각 NeuronCore에 5개의 주의 헤드가 할당되거나 각 AWS Neuron 디바이스에 10이 할당됩니다.

다음 샘플을 사용할 수 있습니다. model.py 모델을 정의하고 핸들러 함수를 생성하는 파일입니다. 필요에 맞게 편집할 수 있지만 다음에서 지원되는지 확인하십시오. transformers-neuronx.

cat serving.properties
option.tensor_parallel_degree=2 option.batch_size=2 option.dtype=f16 engine=Python
cat model.py
import torch
import tempfile
import os from transformers.models.opt import OPTForCausalLM
from transformers import AutoTokenizer
from transformers_neuronx import dtypes
from transformers_neuronx.module import save_pretrained_split
from transformers_neuronx.opt.model import OPTForSampling
from djl_python import Input, Output model = None def load_model(properties): batch_size = int(properties.get("batch_size", 2)) tp_degree = int(properties.get("tensor_parallel_degree", 2)) amp = properties.get("dtype", "f16") model_id = "facebook/opt-13b" load_path = os.path.join(tempfile.gettempdir(), model_id) model = OPTForCausalLM.from_pretrained(model_id, low_cpu_mem_usage=True) dtype = dtypes.to_torch_dtype(amp) for block in model.model.decoder.layers: block.self_attn.to(dtype) block.fc1.to(dtype) block.fc2.to(dtype) model.lm_head.to(dtype) save_pretrained_split(model, load_path) tokenizer = AutoTokenizer.from_pretrained(model_id) model = OPTForSampling.from_pretrained(load_path, batch_size=batch_size, amp=amp, tp_degree=tp_degree) model.to_neuron() return model, tokenizer, batch_size def infer(seq_length, prompt): with torch.inference_mode(): input_ids = torch.as_tensor([tokenizer.encode(text) for text in prompt]) generated_sequence = model.sample(input_ids, sequence_length=seq_length) outputs = [tokenizer.decode(gen_seq) for gen_seq in generated_sequence] return outputs def handle(inputs: Input): global model, tokenizer, batch_size if not model: model, tokenizer, batch_size = load_model(inputs.get_properties()) if inputs.is_empty(): # Model server makes an empty call to warmup the model on startup return None data = inputs.get_as_json() seq_length = data["seq_length"] prompt = data["text"] outputs = infer(seq_length, prompt) result = {"outputs": outputs} return Output().add_as_json(result)
mkdir -p models/opt13b logs
mv serving.properties model.py models/opt13b

서빙 컨테이너 실행

추론 전 마지막 단계는 DJL 제공 컨테이너의 Docker 이미지를 가져와 인스턴스에서 실행하는 것입니다.

docker pull deepjavalibrary/djl-serving:0.21.0-pytorch-inf2

컨테이너 이미지를 가져온 후 다음 명령을 실행하여 모델을 배포합니다. 포함된 올바른 디렉토리에 있는지 확인하십시오. logsmodels 명령이 이들을 컨테이너의 하위 디렉토리에 매핑하기 때문입니다. /opt/디렉토리.

docker run -it --rm --network=host -v `pwd`/models:/opt/ml/model -v `pwd`/logs:/opt/djl/logs -u djl --device /dev/neuron0 --device /dev/neuron10 --device /dev/neuron2 --device /dev/neuron4 --device /dev/neuron6 --device /dev/neuron8 --device /dev/neuron1 --device /dev/neuron11 -e MODEL_LOADING_TIMEOUT=7200 -e PREDICT_TIMEOUT=360 deepjavalibrary/djl-serving:0.21.0-pytorch-inf2 serve

추론 실행

이제 모델을 배포했으므로 간단한 CURL 명령으로 모델을 테스트하여 일부 JSON 데이터를 엔드포인트에 전달해 보겠습니다. 배치 크기를 2로 설정했기 때문에 해당 입력 수를 전달합니다.

curl -X POST "http://127.0.0.1:8080/predictions/opt13b" -H 'Content-Type: application/json' -d '{"seq_length":2048, "text":[ "Hello, I am a language model,", "Welcome to Amazon Elastic Compute Cloud," ] }'


앞의 명령은 명령줄에서 응답을 생성합니다. 이 모델은 매우 수다스럽지만 응답이 우리 모델의 유효성을 검사합니다. Inferentia 덕분에 LLM에서 추론을 실행할 수 있었습니다!

정리

비용 절감을 위해 완료되면 EC2 인스턴스를 삭제하는 것을 잊지 마십시오.

결론

이 게시물에서는 Amazon EC2 Inf2 인스턴스를 배포하여 LLM을 호스팅하고 대형 모델 추론 컨테이너를 사용하여 추론을 실행했습니다. 최적의 가격 대비 성능 비율로 추론을 위해 LLM을 쉽게 배포할 수 있도록 AWS Inferentia와 AWS Neuron SDK가 어떻게 상호 작용하는지 배웠습니다. Inferentia의 더 많은 기능과 새로운 혁신에 대한 업데이트를 기대해 주세요. Neuron에 대한 더 많은 예는 다음을 참조하십시오. AWS 뉴런 샘플.


저자에 관하여

칭 웨이 리 Amazon Web Services의 기계 학습 전문가입니다. 그는 박사 학위를 받았습니다. 그는 고문의 연구 보조금 계좌를 깨고 그가 약속 한 노벨상을 전달하지 못한 후 Operations Research에서 현재 그는 금융 서비스 및 보험 업계의 고객이 AWS에서 기계 학습 솔루션을 구축하도록 돕습니다. 여가 시간에는 읽기와 가르치기를 좋아합니다.

피터 정 AWS용 솔루션 아키텍트이며 고객이 데이터에서 통찰력을 찾도록 돕는 데 열정적입니다. 그는 공공 부문과 민간 부문 모두에서 조직이 데이터 기반 의사 결정을 내리는 데 도움이 되는 솔루션을 구축해 왔습니다. 그는 모든 AWS 인증과 XNUMX개의 GCP 인증을 보유하고 있습니다. 그는 커피, 요리, 활동적인 생활, 가족과 함께 시간을 보내는 것을 즐깁니다.

아키브 안사리 Amazon SageMaker 추론 팀의 소프트웨어 개발 엔지니어입니다. 그는 SageMaker 고객이 모델 추론 및 배포를 가속화하도록 돕는 데 중점을 둡니다. 여가 시간에는 하이킹, 달리기, 사진 촬영 및 스케치를 즐깁니다.

칭란 AWS의 소프트웨어 개발 엔지니어입니다. 그는 고성능 ML 추론 솔루션 및 고성능 로깅 시스템을 포함하여 Amazon에서 여러 도전적인 제품을 작업해 왔습니다. Qing의 팀은 요구되는 매우 짧은 지연 시간으로 Amazon Advertising에서 첫 번째 XNUMX억 매개변수 모델을 성공적으로 출시했습니다. Qing은 인프라 최적화 및 딥 러닝 가속화에 대한 심층 지식을 보유하고 있습니다.

프랭크 리우 AWS Deep Learning의 소프트웨어 엔지니어입니다. 그는 소프트웨어 엔지니어와 과학자를위한 혁신적인 딥 러닝 도구를 구축하는 데 중점을 둡니다. 여가 시간에는 친구 및 가족과 함께 하이킹을 즐깁니다.

spot_img

최신 인텔리전스

spot_img