BentoML로 Solar 배포

2024/04/18 | 이 글은 공동 작성된 블로그 게시물입니다:
- 전영훈, 업스테이지 테크니컬 라이터
- 셜록 쉬, BentoML 콘텐츠 전략 담당자
 

Solar는 미국, 한국 및 아시아의 기업 고객을 위한 풀스택 LLM 솔루션을 전문으로 제공하며 빠르게 성장하고 있는 AI 스타트업인 Upstage에서 개발한 고급 대규모 언어 모델(LLM)입니다. 고급 아키텍처와 학습 기술을 사용하여 퍼블릭, 프라이빗 클라우드, 온프레미스 및 온디바이스 환경에서 기업을 위한 목적에 맞게 학습된 맞춤형 LLM을 개발하는 데 최적화된 Solar 기반 모델을 개발합니다. 

특히 오픈 소스 모델 중 하나입니다, Solar 10.7B는 2023년 12월 출시 이후 개발자 커뮤니티에서 큰 주목을 받고 있습니다. 이 모델은 컴팩트한 크기에도 불구하고 30B 이상의 대형 모델과 비교했을 때에도 놀라울 정도로 강력합니다. 따라서 성능 저하 없이 속도와 비용 효율성을 최적화하고자 하는 사용자에게 Solar는 매력적인 옵션입니다.

이 블로그에서는 Solar 및 BentoML로 구동되는 LLM 서버를 배포하는 방법에 대해 설명합니다.

시작하기 전에

프로젝트에 가상 환경을 설정하여 종속성을 체계적으로 관리할 것을 권장합니다:

1
2
python -m venv solar-bentoml
source solar-bentoml/bin/activate
cs

프로젝트 리포지토리를 복제하고 모든 종속 요소를 설치합니다.

1
2
3
git clone https://github.com/bentoml/BentoVLLM.git
cd BentoVLLM/solar-10.7b-instruct
pip install -r requirements.txt && pip install --"pydantic>=2.0"
cs

BentoML 서비스 실행

복제하신 프로젝트에는 Solar 모델의 서빙 로직을 정의하는 BentoML 서비스 파일 service.py가 포함되어 있습니다. 이 파일을 단계별로 살펴보겠습니다.

필요한 모듈을 가져오는 것으로 시작합니다:

1
2
3
4
5
6
7
import uuid
from typing import AsyncGenerator
 
import bentoml
from annotated_types import Ge, Le # Importing type annotations for input validation
from typing_extensions import Annotated
from bentovllm_openai.utils import openai_endpoints # Supporting OpenAI compatible endpoints
cs

이러한 가져오기는 비동기 작업, 유형 검사, BentoML 통합 및 OpenAI 호환 엔드포인트 지원을 위한 유틸리티를 위한 것입니다. 다음 섹션에서 이에 대해 자세히 알아보세요.

다음으로 사용할 모델을 지정하고 따라야 할 몇 가지 지침을 제공합니다.

1
2
3
4
5
6
7
8
9
10
11
# Constants for controlling the model's behavior
MAX_TOKENS = 1024
PROMPT_TEMPLATE = """### User:
You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe. Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. Please ensure that your responses are socially unbiased and positive in nature.
If a question does not make any sense, or is not factually coherent, explain why instead of answering something not correct. If you don't know the answer to a question, please don't share false information.
{user_prompt}
### Assistant: """
 
MODEL_ID = "upstage/SOLAR-10.7B-Instruct-v1.0"
cs

그런 다음 @bentoml.service 데코레이터를 사용하여 클래스 기반 BentoML 서비스(이 예제에서는 bentovllm-solar-instruct-service)를 정의합니다. 300초 후에 시간 초과가 발생하도록 지정하고 BentoCloud에서 "nvidia-l4" 유형의 GPU 하나를 사용하도록 지정합니다.

bentovllm_openai.utils의 @openai_endpoints데코레이터(여기에서 사용 가능)는 OpenAI 호환 엔드포인트(채팅/완성완료) 제공하여 마치 OpenAI 서비스 자체인 것처럼 상호 작용할 수 있도록 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@openai_endpoints(served_model=MODEL_ID)
@bentoml.service(
    name="bentovllm-solar-instruct-service",
    traffic={
        "timeout"300,
    },
    resources={
        "gpu"1,
        "gpu_type""nvidia-l4",
    },
)
class VLLM:
    def __init__(self-> None:
        
        from vllm import AsyncEngineArgs, AsyncLLMEngine
 # Configuring the engine with the model ID and other parameters
        ENGINE_ARGS = AsyncEngineArgs(
            model=MODEL_ID,
            max_model_len=MAX_TOKENS,
            gpu_memory_utilization=0.95
        )
        
        self.engine = AsyncLLMEngine.from_engine_args(ENGINE_ARGS)
cs

클래스 내에는 LLM 추론 및 제공을 위한 빠르고 사용하기 쉬운 오픈 소스 라이브러리인 vLLM을 백엔드 옵션으로 사용하는 LLM 엔진이 있습니다. 이 엔진은 모델과 생성할 토큰 수를 지정합니다.

마지막으로 @bentoml.api를 사용하는 API 메서드가 있습니다. 이는 입력 프롬프트를 처리하고 생성된 텍스트를 다시 스트리밍하기 위한 기본 인터페이스 역할을 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 class VLLM:
    def __init__(self-> None:
    ...
 
    @bentoml.api
    async def generate(
        self,
        prompt: str = "Explain superconductors like I'm five years old",
        max_tokens: Annotated[int, Ge(128), Le(MAX_TOKENS)] = MAX_TOKENS,  # Ensuring `max_tokens` falls within a specified range
    ) -> AsyncGenerator[strNone]:
        # Importing the SamplingParams class to specify how text generation is sampled
        from vllm import SamplingParams
 
        # Creating a SamplingParams object with the specified `max_tokens`
        SAMPLING_PARAM = SamplingParams(max_tokens=max_tokens)
        # Formatting the prompt to include the user's input in a predefined template
        prompt = PROMPT_TEMPLATE.format(user_prompt=prompt)
        # Adding a request to the engine for text generation
        stream = await self.engine.add_request(uuid.uuid4().hex, prompt, SAMPLING_PARAM)
 
        cursor = 0
        # Iterating through the stream of generated text
        async for request_output in stream:
            text = request_output.outputs[0].text
            yield text[cursor:]
            cursor = len(text)
cs

벤톰엘 서브에서 이 프로젝트를 실행하려면 최소 16G VRAM이 장착된 NVIDIA GPU가 필요합니다.

1
bentoml serve .
cs

서버는 다음 위치에서 활성화됩니다. http://localhost:3000. curl 명령을 사용하여 이 서버와 통신할 수 있습니다:

1
2
3
4
5
6
7
8
curl -'POST' \
  'http://localhost:3000/generate' \
  -'accept: text/event-stream' \
  -'Content-Type: application/json' \
  -'{
  "prompt": "Explain superconductors like I'\''m five years old",
  "max_tokens": 1024
}'
cs

또는 OpenAI 호환 엔드포인트를 사용할 수도 있습니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from openai import OpenAI
 
client = OpenAI(base_url='http://localhost:3000/v1', api_key='na')
 
chat_completion = client.chat.completions.create(
    model="upstage/Solar-10.7B-Instruct-v1.0",
    messages=[
        {
            "role""user",
            "content""Explain superconductors like I'm five years old"
        }
    ],
    stream=True,
)
for chunk in chat_completion:
    # Extract and print the content of the model's reply
    print(chunk.choices[0].delta.content or "", end="")
cs

BentoCloud에 Solar 배포

프로덕션 환경에서 LLM을 배포하려면 로컬 머신에서 사용할 수 없는 상당한 컴퓨팅 리소스, 특히 GPU가 필요한 경우가 많습니다. 따라서 엔터프라이즈 AI 팀을 위한 AI 추론 플랫폼인 BentoCloud를 사용할 수 있습니다. 이 플랫폼은 안정성과 확장성을 위해 완전 관리형 인프라를 통해 매우 빠른 자동 확장 및 콜드 스타트 기능을 제공합니다.

Solar를 BentoCloud에 배포하려면 먼저 다음을 수행해야 합니다. 가입BentoCloud에 로그인.

BentoCloud 계정이 준비되면 프로젝트의 디렉토리로 이동한 다음 실행합니다:

1
bentoml deploy .
cs

배포가 완료되면 BentoCloud 콘솔에서 배포와 상호 작용할 수 있습니다:

통합 가시성 지표:

BentoML은 다양한 ML 프레임워크와 원활하게 통합되어 다양한 사내 ML 플랫폼에서 환경을 구성하는 프로세스를 간소화합니다. Scikit-Learn, PyTorch, Tensorflow, Keras, FastAI, XGBoost, LightGBM, CoreML 등 주요 프레임워크와의 뛰어난 호환성을 통해 모델을 쉽게 제공할 수 있습니다. 또한 다중 모델 기능을 통해 다양한 비즈니스 상황이나 모델 개발자의 배경에 맞게 서로 다른 프레임워크에서 생성된 모델의 결과를 통합할 수 있습니다.

Solar 및 BentoML에 대해 자세히 알아보기

솔라 바이 업스테이지와 BentoML에 대해 자세히 알아보려면 다음 리소스를 확인하세요:

이전 게시물
이전 게시물

Embedding 모델로 업무를 혁신하기

다음
다음

Evalverse: 거대 언어 모델 평가를 혁신하는 노코드 LLM 종합 평가 플랫폼