카테고리 없음

스파르타 AI-8기 TIL(11/9) -> 모델 서빙-ChatGPT와 Elevenlabs

kimjunki-8 2024. 11. 9. 22:01
모델 서빙
모델 서빙(Model Serving)은 머신러닝 또는 AI 모델을 학습 후, 실제 애플리케이션 환경에서 실시간으로 사용할 수 있도록 배포하고 제공하는 과정을 말합니다. 이를 통해 모델은 사용자나 시스템의 요청을 실시간으로 받아들이고, 이에 대해 예측이나 생성 결과를 반환하게 됩니다.
주요 개념들
RESTful API
RESTful API처럼 모델에 접근하는 기본적인 인터페이스로, 모델 서빙의 입출력 통로입니다. 클라이언트가 모델에게 데이터를 보내고 결과를 받을 때 사용됩니다. HTTP를 통해 특정 엔드포인트로 요청을 보내면, 모델이 그 요청을 처리하고 결과를 돌려주는 방식이죠.

RPC (Remote Procedure Call)
RESTful API와 달리 함수를 원격에서 호출하듯이 모델을 호출하는 방식입니다. 요청을 보내는 측에서는 함수 호출처럼 보이지만, 실제로는 네트워크를 통해 모델이 있는 서버에서 처리됩니다. RESTful API에 비해 더 직접적이고 빠른 통신을 제공합니다.

gRPC
구글에서 만든 고성능 RPC 프레임워크로, RESTful API와 비슷하지만, 데이터를 바이너리 형식으로 주고받기 때문에 빠르고 효율적입니다. 특히 대규모 요청을 빠르게 처리하는 데 유리합니다. 많은 요청을 처리해야 하는 대규모 모델 서빙에서 활용도가 높습니다.

온-디맨드 서빙(On-Demand Serving)
모델을 사용자가 요청할 때마다 새로 로딩하는 방식입니다. 서버 리소스를 절약하면서 모델을 사용할 수 있지만, 매번 모델을 로드하므로 응답이 느릴 수 있습니다. 지연 시간을 줄이는 것이 중요하지 않은 경우에 유용합니다.

배치 서빙(Batch Serving)
여러 요청을 한 번에 모아 처리하는 방식입니다. 실시간이 아닌 일정 주기로 요청을 모아서 예측 결과를 반환하므로, 반복적인 작업에서 리소스를 절약하고 일괄 처리로 효율성을 높입니다.

캐싱 (Caching)
모델이 자주 사용하는 데이터를 미리 저장해 두는 방식입니다. 같은 요청이 반복될 때 모델이 다시 계산할 필요 없이, 이전 결과를 빠르게 반환할 수 있습니다. 캐시는 속도를 높이고 리소스를 절약할 수 있어 실시간 서빙에서 중요한 역할을 합니다.

로드 밸런싱 (Load Balancing)
여러 서버에 요청을 분산하여 과부하를 방지하는 개념입니다. 예를 들어, 사용자가 많아질수록 여러 서버가 요청을 나누어 처리하게 하는 것인데, 이는 대규모 모델 서빙 환경에서 필수적인 요소입니다.

온-프레미스(온프렘) 및 클라우드 서빙
모델을 직접 서버에 배포하는 방식과, 클라우드 서비스(AWS, Azure 등)에서 제공하는 환경에서 서빙하는 방식입니다.
온프렘: 서버를 자체적으로 관리하므로 보안성이 높고, 커스터마이징이 용이합니다.
클라우드: 확장성이 높고 관리가 용이하므로, 빠르게 리소스를 추가하거나 제거할 수 있습니다.

 

간단한 코드

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"message" : "not found"}
    
@app.get("/test")
async def read_test():
    return {"message": "Hello World!"}

@app.get("/test2")
async def read_test_2():
    return {'message': 'Hello World!2'}
app이라는 객체를 생성해서, 전반적으로 FastAPI를 사용할 수 있게 하고, @app.get을 통해 get 단계를 사용하며 ()안에 경로를 만들고, 만약 그 경로에 들어갔을 경우 def 함수를 만들어서 실행할 코드 생성.('message' : 'Hello World!')

async는 코드가 너무 복잡할경우 사용
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
from openai import OpenAI

client = OpenAI()
system_message = {
    'role': 'system', 
    'content': '너는 투자자야, 나에게 투자 상담을 해줘. 그리고 주의사항은 말하지말고, 
    전세계 산업, PER등 여러가지 필수 요소들을 고려해야해',
}

messages = [system_message]
while True:
    user_input = input('사용자 전달: ')
    if user_input == 'exit':
        print('즐거운 대화였습니다! 감사합니다!')
        break
    messages.append({'role': 'user', 'content': user_input})
    completion = client.chat.completions.create(
        model='gpt-4-turbo',
        messages=messages
    )
    reply = completion.choices[0].message.content
    print('대답: ' + reply)
    messages.append({'role': 'assistant', 'content': reply})
system_message = {
    'role': 'system', 
    'content': '너는 투자자야, 나에게 투자 상담을 해줘. 
    그리고 주의사항은 말하지말고, 전세계 산업, PER등 여러가지 필수 요소들을 고려해야해',
}

시스템 메시지를 정의합니다. 이 메시지는 AI 모델에게 역할과 대화의 맥락을 전달하는 메시지로, AI에게 투자자의 역할을 수행하며 투자 상담을 제공하도록 지시합니다. 이는 대화의 초기 메시지로 사용됩니다.

messages = [system_message]

messages라는 리스트를 생성하고, 여기에 system_message를 첫 번째 요소로 추가합니다. 이 리스트는 대화 내 모든 메시지를 저장하는 역할을 하며, 이후 대화 중 발생하는 사용자와 AI의 모든 메시지가 여기에 추가됩니다.

while True:
    user_input = input('사용자 전달: ')
    if user_input == 'exit':
        print('즐거운 대화였습니다! 감사합니다!')
        break
    ...

무한 루프가 시작되며, 사용자가 대화에서 exit를 입력하기 전까지 계속 실행됩니다. user_input으로 사용자가 입력한 텍스트를 받고, 만약 입력이 "exit"라면 대화를 종료하고 "즐거운 대화였습니다! 감사합니다!"를 출력합니다.

messages.append({'role': 'user', 'content': user_input})

사용자가 입력한 텍스트를 딕셔너리로 만들어, messages 리스트에 추가합니다. role을 "user"로 설정하여 이 메시지가 사용자로부터 온 것임을 명시합니다.

completion = client.chat.completions.create(
    model='gpt-4-turbo',
    messages=messages
)

client.chat.completions.create 메서드를 사용하여 OpenAI API에 messages 리스트를 전달해 AI의 응답을 요청합니다. model='gpt-4-turbo'는 사용할 모델을 지정하는 옵션입니다.

reply = completion.choices[0].message.content
print('대답: ' + reply)
messages.append({'role': 'assistant', 'content': reply})

AI의 응답을 가져와서 reply 변수에 저장하고, 이를 출력합니다. 이후 messages 리스트에 AI 응답을 추가합니다(role이 "assistant"임을 명시).

messages.append({'role': 'assistant', 'content': reply})

AI의 응답이 reply 변수에 저장된 후, messages 리스트에 AI의 응답을 추가합니다. role이 "assistant"로 설정되어 이 메시지가 AI의 답변임을 나타냅니다. 이후 while 루프가 다시 시작되며, 다음 사용자 입력을 기다립니다. 이로 인해 사용자 입력과 AI 응답이 계속 추가되면서 대화가 쌓이게 됩니다.

무한 루프(while True) 안에서 exit 명령어가 입력되기 전까지 대화는 계속됩니다.
사용자는 새로운 입력을 하면 messages 리스트에 추가되며, 그동안 쌓인 대화 내역이 모두 포함된 messages 리스트를 바탕으로 AI가 답변을 생성합니다.
이렇게 messages 리스트에는 모든 대화 기록이 포함되므로, AI는 문맥을 이해하고 그 흐름에 맞는 응답을 하게 됩니다.

참고로 messages 안에 여러 user를 넣어서 먼저 추가되었으면 하는 추가 정보를 넣을 수 있습니다.