클라우드/AWS

[AWS Bedrock] Multi-Region LLM을 이용하여 Token 허용량 늘리기(1/2)

잡뿌 2025. 6. 1. 23:17
반응형

Multi-Region LLM을 이용하여 Token 허용량 늘리기

Multi-Region LLM: AWS는 전 세계 여러 리전(데이터 센터)에 서비스를 제공합니다. Multi-Region LLM은 말 그대로 여러 AWS

리전에 LLM 엔드포인트를 배포하는 전략입니다. 이는 다음과 같은 이점을 제공합니다.

1) 지연 시간 단축: 사용자와 가까운 리전에서 응답하여 챗봇의 반응 속도를 높입니다.
2) 고가용성: 특정 리전에 문제가 생겨도 다른 리전으로 트래픽을 전환하여 서비스 중단 없이 챗봇을 운영할 수 있습니다.
3) 로드 밸런싱: 특정 리전에 부하가 집중될 경우, 다른 리전으로 분산하여 안정적인 서비스를 유지합니다.

Python으로 경험하는 Multi-Region LLM 호출 시나리오

Multi-Region LLM이 어떻게 동작하는지 파이썬 코드로 간략하게 시뮬레이션 해봅시다. 이 코드는 여러 AWS 리전에 배포된 LLM 엔드포인트 중 사용 가능한 곳을 찾아 호출하는 간단한 예시입니다.

import boto3
from botocore.exceptions import ClientError
import json
import time

def call_llm_in_region(prompt: str, region_name: str) -> str | None:
    """
    지정된 AWS 리전에서 Amazon Bedrock의 LLM을 호출합니다.
    """
    try:
        bedrock_runtime = boto3.client(
            service_name='bedrock-runtime',
            region_name=region_name
        )

        # 예시: Anthropic Claude v2 모델 사용
        # 실제 모델 ID는 AWS Bedrock 콘솔에서 확인 및 변경 가능합니다.
        model_id = "anthropic.claude-v2"
        body = json.dumps({
            "prompt": f"\n\nHuman: {prompt}\n\nAssistant:",
            "max_tokens_to_sample": 200,
            "temperature": 0.7,
            "top_p": 1,
            "stop_sequences": ["\n\nHuman:"],
        })

        response = bedrock_runtime.invoke_model(
            body=body,
            modelId=model_id,
            accept="application/json",
            contentType="application/json"
        )
        response_body = json.loads(response.get("body").read())
        return response_body.get("completion")

    except ClientError as e:
        print(f"⚠️ Error calling LLM in {region_name}: {e}")
        return None

def call_multi_region_llm(prompt: str, preferred_regions: list[str]) -> str:
    """
    지정된 우선순위에 따라 여러 리전에서 LLM을 호출합니다.
    """
    print(f"사용자 질문: \"{prompt}\"")
    for region in preferred_regions:
        print(f"➡️ {region} 리전에서 LLM 호출 시도 중...")
        start_time = time.time()
        response = call_llm_in_region(prompt, region)
        end_time = time.time()

        if response:
            print(f"✅ {region} 리전에서 {end_time - start_time:.2f}초 만에 응답 성공!")
            return response
        else:
            print(f"❌ {region} 리전에서 응답 실패. 다음 리전으로 전환합니다...")

    print("🚨 모든 선호 리전에서 응답을 받지 못했습니다.")
    return "죄송합니다. 현재 요청을 처리할 수 없습니다. 잠시 후 다시 시도해 주세요."

# --- 시나리오 실행 예시 ---
user_query = "AWS 클라우드 컴퓨팅의 주요 이점은 무엇인가요?"
# 선호하는 리전을 우선순위대로 나열 (예: 서울, 버지니아 북부, 오하이오)
# 실제 환경에서는 사용자 위치나 트래픽 상황에 따라 동적으로 결정될 수 있습니다.
regions_to_try = ["ap-northeast-2", "us-east-1", "us-west-2"] # 서울, 버지니아 북부, 오레곤

llm_answer = call_multi_region_llm(user_query, regions_to_try)
print("\n--- LLM 최종 응답 ---")
print(llm_answer)

이 코드는 preferred_regions 리스트에 정의된 순서대로 각 리전의 LLM을 호출합니다. 만약 첫 번째 리전에서 응답을 받지 못하면 다음 리전으로 자동으로 전환하여 재시도하죠. 이렇게 하면 한 리전에 문제가 생겨도 서비스 연속성을 유지할 수 있습니다.

 

반응형