제퍼넷 로고

신경 아키텍처 검색 및 SageMaker 자동 모델 튜닝을 사용하여 BERT 모델의 추론 시간 단축 | 아마존 웹 서비스

시간

이 게시물에서는 NAS(신경 아키텍처 검색) 기반 구조 가지치기를 사용하여 미세 조정된 BERT 모델을 압축하여 모델 성능을 향상하고 추론 시간을 줄이는 방법을 보여줍니다. 사전 훈련된 언어 모델(PLM)은 생산성 도구, 고객 서비스, 검색 및 권장 사항, 비즈니스 프로세스 자동화, 콘텐츠 생성 분야에서 상용 및 기업용으로 빠르게 채택되고 있습니다. PLM 추론 엔드포인트 배포는 일반적으로 컴퓨팅 요구 사항으로 인해 대기 시간이 길어지고 인프라 비용이 높아지며, 매개 변수 수가 많아 컴퓨팅 효율성이 저하됩니다. PLM을 정리하면 모델의 예측 기능을 유지하면서 모델의 크기와 복잡성이 줄어듭니다. 정리된 PLM은 더 작은 메모리 공간과 더 낮은 대기 시간을 달성합니다. 우리는 PLM을 정리하고 특정 대상 작업에 대한 매개변수 수와 검증 오류를 제거함으로써 기본 PLM 모델과 비교할 때 더 빠른 응답 시간을 달성할 수 있음을 보여줍니다.

다중 목표 최적화는 메모리 소비, 훈련 시간, 컴퓨팅 리소스 등 둘 이상의 목적 함수를 동시에 최적화하는 의사 결정 영역입니다. 구조적 가지치기는 모델 정확도를 유지하면서 레이어나 뉴런/노드를 가지치기하여 PLM의 크기와 계산 요구 사항을 줄이는 기술입니다. 레이어를 제거함으로써 구조적 가지치기는 더 높은 압축률을 달성하여 런타임과 응답 시간을 줄이는 하드웨어 친화적인 구조적 희소성을 얻습니다. PLM 모델에 구조적 가지치기 기술을 적용하면 메모리 공간이 더 적은 경량 모델이 생성됩니다. 이 모델은 SageMaker에서 추론 엔드포인트로 호스팅될 때 원래의 미세 조정된 PLM에 비해 리소스 효율성이 향상되고 비용이 절감됩니다.

이 게시물에 설명된 개념은 추천 시스템, 감정 분석, 검색 엔진 등 PLM 기능을 사용하는 애플리케이션에 적용될 수 있습니다. 특히, 도메인별 데이터 세트를 사용하여 자체 PLM 모델을 미세 조정하고 다음을 사용하여 다수의 추론 엔드포인트를 배포하는 전담 기계 학습(ML) 및 데이터 과학 팀이 있는 경우 이 접근 방식을 사용할 수 있습니다. 아마존 세이지 메이커. 한 가지 예는 텍스트 요약, 제품 카탈로그 분류, 제품 피드백 감정 분류를 위해 다수의 추론 엔드포인트를 배포하는 온라인 소매업체입니다. 또 다른 예로는 임상 문서 분류, 의료 보고서의 명명된 엔터티 인식, 의료 챗봇 및 환자 위험 계층화를 위해 PLM 추론 엔드포인트를 사용하는 의료 서비스 제공자가 있을 수 있습니다.

솔루션 개요

이 섹션에서는 전반적인 작업 흐름을 제시하고 접근 방식을 설명합니다. 먼저, 우리는 아마존 세이지 메이커 스튜디오 수첩 도메인별 데이터 세트를 사용하여 대상 작업에 대해 사전 훈련된 BERT 모델을 미세 조정합니다. BERT (BiDirectional Encoder Representations from Transformers)는 다음을 기반으로 하는 사전 훈련된 언어 모델입니다. 변압기 아키텍처 자연어 처리(NLP) 작업에 사용됩니다. NAS(신경 아키텍처 검색)는 인공 신경망 설계를 자동화하기 위한 접근 방식으로, 기계 학습 분야에서 널리 사용되는 접근 방식인 하이퍼파라미터 최적화와 밀접한 관련이 있습니다. NAS의 목표는 Gradient-Free 최적화와 같은 기술을 사용하여 대규모 후보 아키텍처 세트를 검색하거나 원하는 메트릭을 최적화하여 주어진 문제에 대한 최적의 아키텍처를 찾는 것입니다. 아키텍처의 성능은 일반적으로 검증 손실과 같은 측정항목을 사용하여 측정됩니다. SageMaker 자동 모델 튜닝 (AMT)는 최고의 모델 성능을 제공하는 ML 모델 하이퍼파라미터의 최적 조합을 찾는 지루하고 복잡한 프로세스를 자동화합니다. AMT는 사용자가 지정하는 다양한 하이퍼 매개변수를 사용하여 지능형 검색 알고리즘과 반복 평가를 사용합니다. 정확도 및 F-1 점수와 같은 성능 지표로 측정된 대로 최상의 성능을 발휘하는 모델을 생성하는 하이퍼파라미터 값을 선택합니다.

이 게시물에 설명된 미세 조정 접근 방식은 일반적이며 모든 텍스트 기반 데이터세트에 적용할 수 있습니다. BERT PLM에 할당된 작업은 감정 분석, 텍스트 분류 또는 Q&A와 같은 텍스트 기반 작업일 수 있습니다. 이 데모에서 대상 작업은 BERT를 사용하여 텍스트 조각 쌍의 컬렉션으로 구성된 데이터 세트에서 한 텍스트 조각의 의미를 다른 조각에서 추론할 수 있는지 여부를 식별하는 이진 분류 문제입니다. 우리는 텍스트 포함 데이터 세트 인식 GLUE 벤치마킹 제품군에서. 우리는 SageMaker AMT를 사용하여 다중 목표 검색을 수행하여 대상 작업에 대한 매개변수 수와 예측 정확도 간에 최적의 균형을 제공하는 하위 네트워크를 식별합니다. 다중 목표 검색을 수행할 때 우리는 최적화하려는 목표로 정확도와 매개변수 수를 정의하는 것부터 시작합니다.

BERT PLM 네트워크 내에는 모델이 언어 이해 및 지식 표현과 같은 특수 기능을 가질 수 있도록 하는 모듈식 독립형 하위 네트워크가 있을 수 있습니다. BERT PLM은 다중 헤드 셀프 어텐션 하위 네트워크와 피드포워드 하위 네트워크를 사용합니다. Multi-headed self-attention 레이어를 사용하면 BERT가 여러 헤드가 여러 컨텍스트 신호에 참석할 수 있도록 하여 시퀀스 표현을 계산하기 위해 단일 시퀀스의 다양한 위치를 연관시킬 수 있습니다. 입력은 여러 하위 공간으로 분할되고 셀프 어텐션은 각 하위 공간에 개별적으로 적용됩니다. 변환기 PLM의 여러 헤드를 사용하면 모델이 다양한 표현 하위 공간의 정보에 공동으로 참여할 수 있습니다. 피드포워드 하위 네트워크는 다중 헤드 셀프 어텐션 하위 네트워크에서 출력을 가져와 데이터를 처리하고 최종 인코더 표현을 반환하는 간단한 신경망입니다.

무작위 하위 네트워크 샘플링의 목표는 대상 작업에서 충분히 잘 수행될 수 있는 더 작은 BERT 모델을 교육하는 것입니다. 미세 조정된 기본 BERT 모델에서 100개의 무작위 하위 네트워크를 샘플링하고 10개의 네트워크를 동시에 평가합니다. 훈련된 하위 네트워크는 객관적인 측정항목에 대해 평가되고 최종 모델은 객관적인 측정항목 간에 발견된 절충점을 기반으로 선택됩니다. 우리는 시각화 파레토 프론트 모델 정확도와 모델 크기 간의 최적의 균형을 제공하는 정리된 모델을 포함하는 샘플링된 하위 네트워크의 경우. 우리는 트레이드오프하려는 모델 크기와 모델 정확도를 기반으로 후보 하위 네트워크(NAS 프루닝된 BERT 모델)를 선택합니다. 다음으로 SageMaker를 사용하여 엔드포인트, 사전 교육된 BERT 기본 모델 및 NAS 정리 BERT 모델을 호스팅합니다. 부하 테스트를 수행하기 위해 우리는 다음을 사용합니다. 메뚜기, Python을 사용하여 구현할 수 있는 오픈 소스 부하 테스트 도구입니다. Locust를 사용하여 두 엔드포인트 모두에서 로드 테스트를 실행하고 Pareto front를 사용하여 결과를 시각화하여 두 모델의 응답 시간과 정확도 간의 균형을 보여줍니다. 다음 다이어그램은 이 게시물에서 설명하는 워크플로의 개요를 제공합니다.

워크 플로우

사전 조건

이 게시물에는 다음 전제 조건이 필요합니다.

또한 서비스 할당량 SageMaker에서 ml.g4dn.xlarge 인스턴스의 최소 4개 인스턴스에 액세스합니다. 인스턴스 유형 ml.gXNUMXdn.xlarge는 PyTorch를 기본적으로 실행할 수 있는 비용 효율적인 GPU 인스턴스입니다. 서비스 할당량을 늘리려면 다음 단계를 완료하세요.

  1. 콘솔에서 서비스 할당량으로 이동합니다.
  2. 럭셔리 할당량 관리선택한다. 아마존 세이지 메이커다음을 선택 할당량 보기.

  1. “훈련 작업 사용을 위한 ml-g4dn.xlarge”를 검색하고 할당량 항목을 선택하세요.
  2. 왼쪽 메뉴에서 계정 수준에서 증가 요청.

  1. 럭셔리 할당량 값 증가, 5 이상의 값을 입력하세요.
  2. 왼쪽 메뉴에서 의뢰.

요청된 할당량 승인은 계정 권한에 따라 완료하는 데 다소 시간이 걸릴 수 있습니다.

  1. SageMaker 콘솔에서 SageMaker Studio를 엽니다.

  1. 왼쪽 메뉴에서 시스템 터미널 아래에 유틸리티 및 파일.

  1. 다음 명령을 실행하여 복제합니다. GitHub 레포 SageMaker Studio 인스턴스에:
    git clone https://github.com/aws/amazon-sagemaker-examples.git

  2. 로 이동 amazon-sagemaker-examples/hyperparameter_tuning/neural_architecture_search_llm.
  3. 파일 열기 nas_for_llm_with_amt.ipynb.
  4. 다음을 사용하여 환경을 설정합니다. ml.g4dn.xlarge 인스턴스 및 선택 선택.

사전 훈련된 BERT 모델 설정

이 섹션에서는 데이터세트 라이브러리에서 텍스트 내용 인식 데이터세트를 가져오고 데이터세트를 훈련 및 검증 세트로 분할합니다. 이 데이터 세트는 문장 쌍으로 구성됩니다. BERT PLM의 임무는 주어진 두 개의 텍스트 조각에서 한 텍스트 조각의 의미가 다른 조각에서 추론될 수 있는지 여부를 인식하는 것입니다. 다음 예에서는 두 번째 문구에서 첫 번째 문구의 의미를 추론할 수 있습니다.

Phrase 1: A man with a beard, wearing a red shirt with gray sleeves and work gloves, pulling on a rope.
Phrase 2: A bearded man pulls a rope

우리는 다음에서 텍스트 인식 수반 데이터세트를 로드합니다. GLUE 벤치마킹 제품군을 통해 데이터세트 라이브러리 훈련 스크립트 내의 Hugging Face에서(./training.py). GLUE의 원래 훈련 데이터 세트를 훈련 및 검증 세트로 분할했습니다. 우리의 접근 방식에서는 교육 데이터 세트를 사용하여 기본 BERT 모델을 미세 조정한 다음 다중 목표 검색을 수행하여 목표 측정항목 간의 균형을 최적으로 유지하는 하위 네트워크 세트를 식별합니다. 우리는 BERT 모델을 미세 조정하는 데에만 훈련 데이터 세트를 사용합니다. 그러나 우리는 홀드아웃 검증 데이터세트의 정확도를 측정하여 다중 목표 검색을 위한 검증 데이터를 사용합니다.

도메인별 데이터 세트를 사용하여 BERT PLM을 미세 조정

원시 BERT 모델의 일반적인 사용 사례에는 다음 문장 예측 또는 마스크된 언어 모델링이 포함됩니다. 텍스트 인식 수반과 같은 다운스트림 작업에 기본 BERT 모델을 사용하려면 도메인별 데이터 세트를 사용하여 모델을 더욱 미세 조정해야 합니다. 시퀀스 분류, 질문 답변, 토큰 분류 등의 작업에 미세 조정된 BERT 모델을 사용할 수 있습니다. 그러나 이 데모에서는 이진 분류를 위해 미세 조정된 모델을 사용합니다. 다음 하이퍼파라미터를 사용하여 이전에 준비한 교육 데이터 세트로 사전 교육된 BERT 모델을 미세 조정합니다.

hyperparameters["per_device_train_batch_size"] = 8
hyperparameters["per_device_eval_batch_size"] = 8
hyperparameters["learning_rate"] = 2e-05
hyperparameters["num_train_epochs"] = 5
hyperparameters["save_strategy"] = "epoch"
hyperparameters[
"is_regression"
] = False  # set this to True if your dataset is a regression dataset, for example STSB

모델 훈련의 체크포인트를 다음 위치에 저장합니다. 아마존 단순 스토리지 서비스 (Amazon S3) 버킷을 사용하여 NAS 기반 다중 목표 검색 중에 모델을 로드할 수 있습니다. 모델을 훈련하기 전에 에포크, 훈련 손실, 매개변수 수, 검증 오류와 같은 측정항목을 정의합니다.

session = Session()
s3_bucket = session.default_bucket()
s3_bucket_prefix = "nas_amt/model_checkpoint"
s3_path = f"s3://{s3_bucket}/{s3_bucket_prefix}"

metric_definitions = [
    {"Name": "epoch", "Regex": "epoch: ([0-9.]+)"},
    {"Name": "training-loss", "Regex": "training loss: ([0-9.]+)"},
    {"Name": "num-parameters", "Regex": "number of parameters: ([0-9.]+)"},
    {"Name": "validation-error", "Regex": "validation error: ([0-9.]+)"},
]

sm_args = dict(
    entry_point="training.py",
    source_dir=os.path.abspath(""),
    instance_type="ml.g4dn.xlarge",
    instance_count=1,
    py_version="py39",
    framework_version="1.13",
    transformers_version="4.26",
    max_run=3600 * 72,
    role=get_execution_role(),
    checkpoint_local_path="/opt/ml/checkpoints",
    hyperparameters=hyperparameters,
    checkpoint_s3_uri=s3_path,
    metric_definitions=metric_definitions,
)
est = PyTorch(**sm_args)
est.fit()

미세 조정 프로세스가 시작된 후 훈련 작업을 완료하는 데 약 15분이 소요됩니다.

다중 목표 검색을 수행하여 하위 네트워크를 선택하고 결과를 시각화합니다.

다음 단계에서는 SageMaker AMT를 사용하여 무작위 하위 네트워크를 샘플링하여 미세 조정된 기본 BERT 모델에 대한 다중 목표 검색을 수행합니다. 슈퍼 네트워크(미세 조정된 BERT 모델) 내의 하위 네트워크에 액세스하기 위해 하위 네트워크의 일부가 아닌 PLM의 모든 구성 요소를 마스킹합니다. PLM에서 하위 네트워크를 찾기 위해 슈퍼 네트워크를 마스킹하는 것은 모델 동작의 패턴을 분리하고 식별하는 데 사용되는 기술입니다. Hugging Face 변환기에서는 숨겨진 크기가 머리 수의 배수가 되어야 합니다. 변환기 PLM의 숨겨진 크기는 숨겨진 상태 벡터 공간의 크기를 제어하며, 이는 데이터의 복잡한 표현과 패턴을 학습하는 모델의 기능에 영향을 미칩니다. BERT PLM에서 숨겨진 상태 벡터는 고정된 크기(768)입니다. 숨겨진 크기를 변경할 수 없으므로 머리 수는 [1, 3, 6, 12]이어야 합니다.

단일 목표 최적화와 달리 다중 목표 설정에서는 일반적으로 모든 목표를 동시에 최적화하는 단일 솔루션이 없습니다. 대신, 우리는 적어도 하나의 목표(예: 검증 오류)에서 다른 모든 솔루션을 지배하는 솔루션 세트를 수집하는 것을 목표로 합니다. 이제 줄이고 싶은 지표(검증 오류 및 매개변수 수)를 설정하여 AMT를 통해 다중 목표 검색을 시작할 수 있습니다. 임의의 하위 네트워크는 매개변수로 정의됩니다. max_jobs 동시 작업 수는 매개변수에 의해 정의됩니다. max_parallel_jobs. 모델 체크포인트를 로드하고 하위 네트워크를 평가하는 코드는 다음에서 사용할 수 있습니다. evaluate_subnetwork.py 스크립트.

# Maximum number of sub-networks we will evaluate
max_jobs = 100
max_parallel_jobs = 5

# Entry point script to load the super-network and evaluate a sub-network
entry_point = "evaluate_subnetwork.py"

# Command line arguments for the entry point script
hyperparameters = {"model_name_or_path": model_type, "output_dir": "./tmp", "task_name": "rte"}

# Define the metric we want to minimize
metric_definitions = [
    {"Name": "num-parameters", "Regex": "number of parameters: ([0-9.]+)"},
    {"Name": "validation-error", "Regex": "validation error: ([0-9.]+)"},
]

# Define HuggingFace estimator
estimator = HuggingFace(
    entry_point=entry_point,
    source_dir="./",
    instance_type="ml.g4dn.xlarge",  # instance types for the SageMaker training jobs
    instance_count=1,
    py_version="py39",
    framework_version="1.13",
    pytorch_version="1.13",
    transformers_version="4.26",
    max_run=3600 * 72,
    role=get_execution_role(),
    volume_size=125,
    model_uri=s3_path,
    hyperparameters=hyperparameters,
)

current_time = datetime.now().strftime("%m-%d-%Y-%H-%M-%S")
tuning_job_name = f"nas-search-{current_time}"

# Search space to define sub-networks
hyperparameter_ranges = {
    "num_layers": IntegerParameter(0, 12),
    # To meet HuggingFace constraints, we can only set the number of head to these values
    "num_heads": CategoricalParameter([1, 3, 6, 12]),
    "num_units": IntegerParameter(0, 3072),
}

# Define AMT Tuner object
my_tuner = HyperparameterTuner(
    estimator=estimator,
    objective_metric_name="validation-error",
    hyperparameter_ranges=hyperparameter_ranges,
    metric_definitions=metric_definitions,
    max_jobs=max_jobs,
    strategy="Random",
    random_seed=seed,
    objective_type="Minimize",
    max_parallel_jobs=max_parallel_jobs,
)

# Start hyperparameter tuning job
my_tuner.fit(job_name=tuning_job_name)

AMT 조정 작업을 실행하는 데 약 2시간 20분이 소요됩니다. AMT 튜닝 작업이 성공적으로 실행되면 작업 기록을 구문 분석하고 헤드 수, 레이어 수, 유닛 수 등 하위 네트워크의 구성과 유효성 검사 오류, 매개변수 수 등 해당 측정항목을 수집합니다. 다음 스크린샷은 성공적인 AMT 튜너 작업 요약을 보여줍니다.

다음으로, 객관적인 지표에서 다른 모든 하위 네트워크를 지배하는 최적의 하위 네트워크 세트를 식별하는 데 도움이 되는 파레토 세트(파레토 프론티어 또는 파레토 최적 세트라고도 함)를 사용하여 결과를 시각화합니다(검증 오류).

history = my_tuner.analytics().dataframe()
data = []
configs = []
for i, t in enumerate(my_tuner.analytics().training_job_summaries()):
    jn = t["TrainingJobName"]
    df = sagemaker.analytics.TrainingJobAnalytics(jn).dataframe()

    row = history[history["TrainingJobName"] == jn]
    config = {
        "num-heads": int(row["num_heads"].iloc[0].strip('"')),
        "num-layers": int(row["num_layers"]),
        "num-units": int(row["num_units"]),
    }
    configs.append(config)

    p = []
    for j, metric in enumerate(metric_definitions):
        metric_name = metric["Name"]
        if "metric_name" not in df.keys():
            continue
        y = float(df[df["metric_name"] == metric_name]["value"])
        p.append(y)
    if len(p) > 0:
        data.append(p)

data = np.array(data)

먼저 AMT 튜닝 작업에서 데이터를 수집합니다. 그런 다음 다음을 사용하여 Pareto 세트를 플로팅합니다. matplotlob.pyplot x축에는 매개변수 개수가 있고 y축에는 유효성 검사 오류가 있습니다. 이는 Pareto 집합의 한 하위 네트워크에서 다른 하위 네트워크로 이동할 때 성능이나 모델 크기를 희생하고 다른 하위 네트워크를 개선해야 함을 의미합니다. 궁극적으로 Pareto 세트는 우리의 선호도에 가장 적합한 하위 네트워크를 선택할 수 있는 유연성을 제공합니다. 우리는 네트워크 크기를 얼마나 줄이고 싶은지, 그리고 얼마나 많은 성능을 희생할 의향이 있는지 결정할 수 있습니다.

import matplotlib.pyplot as plt
from multi_objective import get_pareto_optimal

# get results of the un-pruned network
df = sagemaker.analytics.TrainingJobAnalytics(est.jobs[0].name).dataframe()
validation_error_unpruned_network = float(df[df["metric_name"] == "validation-error"].value.min())
params_unpruned_network = int(df[df["metric_name"] == "num-parameters"].value.min())
plt.scatter(
params_unpruned_network,
validation_error_unpruned_network,
marker="o",
s=80,
facecolors="none",
edgecolors="C3",
linewidth=2,
label="un-pruned super-network",
)
# get Pareto optimal points
idx = get_pareto_optimal(data)
x = data[idx, 0]
y = data[idx, 1]
plt.scatter(
x,
y,
marker="o",
s=80,
facecolors="none",
edgecolors="C0",
linewidth=2,
label="Pareto front (sub-networks)",
)
plt.xlabel("number of parameters")
plt.ylabel("validation error")
plt.legend()
plt.xscale("log")
plt.grid(linewidth="1", alpha=0.4, which="both")

SageMaker를 사용하여 미세 조정된 BERT 모델 및 NAS에 최적화된 하위 네트워크 모델 배포

다음으로, 성능 저하를 최소화하는 Pareto 세트에서 가장 큰 모델을 배포합니다. SageMaker 엔드 포인트. 가장 좋은 모델은 검증 오류와 사용 사례에 대한 매개 변수 수 사이에서 최적의 균형을 제공하는 모델입니다.

# Let's take the largest model in the Pareto set
indicies = np.arange(len(configs))[idx]
pareto_optimal_sub_networks = [configs[i] for i in indicies]
config_to_deploy = pareto_optimal_sub_networks[-1]  

from sagemaker.huggingface.model import HuggingFaceModel

# create Hugging Face Model Class
huggingface_model = HuggingFaceModel(
    model_data=s3_path + "/model.tar.gz",
    role=get_execution_role(),
    transformers_version="4.26",
    pytorch_version="1.13",
    py_version="py39",
    entry_point="inference.py",
    source_dir="./",
    env={"SM_HPS": json.dumps(config_to_deploy)},
)

# deploy model to SageMaker Inference
predictor = huggingface_model.deploy(initial_instance_count=1, instance_type="ml.g4dn.xlarge")

모델 비교

사전 훈련된 기본 BERT 모델을 가져와 도메인별 데이터 세트를 사용하여 미세 조정하고 NAS 검색을 실행하여 객관적인 지표를 기반으로 주요 하위 네트워크를 식별하고 정리된 모델을 SageMaker 엔드포인트에 배포했습니다. 또한 사전 교육된 기본 BERT 모델을 가져와 두 번째 SageMaker 엔드포인트에 기본 모델을 배포했습니다. 다음으로 우리는 달렸습니다. 부하 테스트 두 추론 엔드포인트 모두에서 Locust를 사용하고 응답 시간 측면에서 성능을 평가했습니다.

먼저 필요한 Locust 및 Boto3 라이브러리를 가져옵니다. 그런 다음 요청 메타데이터를 구성하고 로드 테스트에 사용할 시작 시간을 기록합니다. 그런 다음 페이로드는 BotoClient를 통해 SageMaker 엔드포인트 호출 API로 전달되어 실제 사용자 요청을 시뮬레이션합니다. 우리는 Locust를 사용하여 여러 가상 사용자를 생성하여 요청을 병렬로 보내고 로드 시 엔드포인트 성능을 측정합니다. 두 엔드포인트 각각의 사용자 수를 늘려 테스트를 실행합니다. 테스트가 완료되면 Locust는 배포된 각 모델에 대한 요청 통계 CSV 파일을 출력합니다.

def send(self):
        request_meta = {
            "request_type": "InvokeEndpoint",
            "name": "SageMaker",
            "start_time": time.time(),
            "response_length": 0,
            "response": None,
            "context": {},
            "exception": None,
        }
        start_perf_counter = time.perf_counter()

        try:
            response = self.sagemaker_client.invoke_endpoint(
                EndpointName=self.endpoint_name,
                Body=self.payload,
                ContentType=self.content_type,
            )
            logging.info(response["Body"].read())
        except Exception as e:
            request_meta["exception"] = e

        request_meta["response_time"] = (
            time.perf_counter() - start_perf_counter
        ) * 1000

        events.request.fire(**request_meta)

다음으로 Locust로 테스트를 실행한 후 다운로드한 CSV 파일에서 응답 시간 플롯을 생성합니다. 응답 시간과 사용자 수를 그래프로 표시하는 목적은 모델 엔드포인트의 응답 시간이 미치는 영향을 시각화하여 부하 테스트 결과를 분석하는 것입니다. 다음 차트에서 NAS 정리 모델 엔드포인트가 기본 BERT 모델 엔드포인트에 비해 더 낮은 응답 시간을 달성하는 것을 볼 수 있습니다.

첫 번째 차트를 확장한 두 번째 차트에서는 약 70명의 사용자가 지나면 SageMaker가 기본 BERT 모델 엔드포인트를 제한하기 시작하고 예외를 발생시키는 것을 관찰합니다. 그러나 NAS 정리 모델 엔드포인트의 경우 제한은 90~100명의 사용자 사이에서 더 낮은 응답 시간으로 발생합니다.

두 차트에서 정리된 모델은 정리되지 않은 모델과 비교할 때 응답 시간이 더 빠르고 확장성이 더 좋은 것으로 나타났습니다. PLM 애플리케이션을 위해 다수의 추론 엔드포인트를 배포하는 사용자의 경우처럼 추론 엔드포인트의 수를 확장함에 따라 비용 이점과 성능 개선이 상당히 커지기 시작합니다.

정리

미세 조정된 기본 BERT 모델 및 NAS 정리 모델에 대한 SageMaker 엔드포인트를 삭제하려면 다음 단계를 완료하십시오.

  1. SageMaker 콘솔에서 추론종점 탐색 창에서
  2. 엔드포인트를 선택하고 삭제합니다.

또는 SageMaker Studio 노트북에서 엔드포인트 이름을 제공하여 다음 명령을 실행합니다.

predictor.delete_model()
predictor.delete_endpoint()

결론

이 게시물에서는 NAS를 사용하여 미세 조정된 BERT 모델을 정리하는 방법에 대해 논의했습니다. 먼저 도메인별 데이터를 사용하여 기본 BERT 모델을 교육하고 이를 SageMaker 엔드포인트에 배포했습니다. 대상 작업에 대해 SageMaker AMT를 사용하여 미세 조정된 기본 BERT 모델에 대해 다중 목표 검색을 수행했습니다. Pareto 전면을 시각화하고 Pareto 최적의 NAS 정리 BERT 모델을 선택하고 해당 모델을 두 번째 SageMaker 엔드포인트에 배포했습니다. 우리는 Locust를 사용하여 부하 테스트를 수행하여 두 엔드포인트를 모두 쿼리하는 사용자를 시뮬레이션하고 응답 시간을 측정하여 CSV 파일에 기록했습니다. 우리는 두 모델 모두에 대해 응답 시간과 사용자 수를 그래프로 표시했습니다.

우리는 정리된 BERT 모델이 응답 시간과 인스턴스 조절 임계값 모두에서 훨씬 더 나은 성능을 발휘한다는 것을 관찰했습니다. 우리는 NAS 정리 모델이 기본 BERT 모델에 비해 더 많은 사용자가 시스템에 스트레스를 주더라도 더 낮은 응답 시간을 유지하면서 엔드포인트의 증가된 로드에 더 탄력적이라는 결론을 내렸습니다. 이 게시물에 설명된 NAS 기술을 모든 대규모 언어 모델에 적용하여 상당히 낮은 응답 시간으로 대상 작업을 수행할 수 있는 정리된 모델을 찾을 수 있습니다. 유효성 검사 손실 외에도 대기 시간을 매개 변수로 사용하여 접근 방식을 더욱 최적화할 수 있습니다.

이 게시물에서는 NAS를 사용하지만 양자화는 PLM 모델을 최적화하고 압축하는 데 사용되는 또 다른 일반적인 접근 방식입니다. 양자화는 훈련된 네트워크의 가중치 및 활성화의 정밀도를 32비트 부동 소수점에서 8비트 또는 16비트 정수와 같은 더 낮은 비트 폭으로 줄여 더 빠른 추론을 생성하는 압축 모델을 만듭니다. 양자화는 매개변수 수를 줄이지 않습니다. 대신 기존 매개변수의 정밀도를 줄여 압축된 모델을 얻습니다. NAS 프루닝은 PLM에서 중복 네트워크를 제거하여 더 적은 수의 매개변수로 희소 모델을 생성합니다. 일반적으로 NAS 프루닝과 양자화는 대형 PLM을 압축하여 모델 정확도를 유지하고 검증 손실을 줄이면서 성능을 개선하고 모델 크기를 줄이는 데 함께 사용됩니다. PLM의 크기를 줄이기 위해 일반적으로 사용되는 다른 기술은 다음과 같습니다. 지식 증류, 행렬 분해증류 폭포.

블로그 게시물에 제안된 접근 방식은 SageMaker를 사용하여 도메인별 데이터를 사용하여 모델을 훈련 및 미세 조정하고 엔드포인트를 배포하여 추론을 생성하는 팀에 적합합니다. 생성적 AI 애플리케이션을 구축하는 데 필요한 고성능 기반 모델을 선택할 수 있는 완전관리형 서비스를 찾고 있다면 다음을 사용해 보세요. 아마존 기반암. 광범위한 비즈니스 사용 사례에 대해 사전 훈련된 오픈 소스 모델을 찾고 있고 솔루션 템플릿 및 예제 노트북에 액세스하려는 경우 다음을 사용하는 것을 고려해보세요. Amazon SageMaker 점프스타트. 이 게시물에서 사용한 Hugging Face BERT 기본 케이스 모델의 사전 훈련된 버전은 SageMaker JumpStart에서도 사용할 수 있습니다.


저자에 관하여

아파라지탄 바이디야나단 AWS의 수석 엔터프라이즈 솔루션 아키텍트입니다. 그는 엔터프라이즈, 대규모 및 분산 소프트웨어 시스템을 설계하고 개발한 24년 이상의 경험을 갖춘 클라우드 설계자입니다. 그는 생성적 AI 및 머신러닝 데이터 엔지니어링을 전문으로 합니다. 그는 야심 찬 마라톤 선수이며 취미로는 하이킹, 자전거 타기, 아내 및 두 아들과 함께 시간을 보내는 것 등이 있습니다.

아론 클라인 그는 심층 신경망을 위한 자동화된 기계 학습 방법을 연구하는 AWS의 수석 응용 과학자입니다.

야체크 골레비오프스키 AWS의 수석 응용 과학자입니다.

spot_img

최신 인텔리전스

spot_img