kosmo138 / resumate

자기소개서를 세상에서 가장 쉽게 쓰는 방법
https://www.resumate.store
0 stars 0 forks source link

LLM 도입 시도 #6

Closed suyons closed 6 months ago

suyons commented 7 months ago

문제 상황

이력서 내용을 토대로 자기소개서 내용을 생성하기 위해서는 한국어 학습 데이터가 충분한 대규모 언어 모델 (LLM) 도입이 필요하다.

1차 해결 시도

당장 사용할 수 있는 LLM인 OpenAI의 gpt-3.5-turbo를 이용할 수 있도록 API Key를 발급하였다. 그리고, 해당 API에 접근 가능 여부를 확인하기 위해 fetch() 함수를 실행하는 Javascript 예시 코드를 작성하였다. 이후 Python 개발 환경에서 Langchain을 이용하여 API에 요청하는 코드를 작성할 예정이다.

Code

const API_KEY = "a1b2c3d4e5f6";
const askgpt = (command) => fetch(
  "https://api.openai.com/v1/chat/completions",
  {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${API_KEY}`.
    },
    body: JSON.stringify({
      model: "gpt-3.5-turbo",
      messages: [{"role": "user", "content": command}],
      n: 1
    }),
  }
)
  .then((response) => response.json())
  .then((data) => {
    console.log(data.choices[0].message.content);
  });
askgpt("Say 'Hello' to me!")

Result

Hello! How can I assist you today?

1차 해결 이후 문제

  1. OpenAI에서 제공하는 API는 저렴하지 않다.
  2. 비용 정보는 다음과 같다.
Model Input Output
gpt-3.5-turbo-0125 $0.50 / 1M tokens $1.50 / 1M tokens
  1. 토큰의 수는 다음 링크에서 확인 가능하다

https://platform.openai.com/tokenizer

Image

2차 해결 시도

  1. Hugging Face에서 한국어 학습이 충분한 LLM을 탐색
  2. AWS SageMaker, Lambda를 이용하여 LLM을 호스팅

LLM 정보

  1. 한국어 LLM 모델 정보 KoSOLAR-10.7B-v0.2
  2. Hugging Face 한국어 LLM (Large Language Model) 순위 Open Ko-LLM Leaderboard
  3. 1번 항목의 모델은 2번 항목의 LLM 순위 상위권 모델들의 기반이 되는 모델로 파악하여 선택

참고 영상

  1. https://www.youtube.com/watch?v=3y_TcDNC0HE
  2. https://www.youtube.com/watch?v=vQFuZUAFel4

SageMaker 요금 정보

낯선 AWS 서비스 이용을 시작하기 이전에 먼저 요금 확인을 해 보았다.

https://aws.amazon.com/ko/sagemaker/pricing/

Studio에서 Jupyter Notebook을 실행할 예정이며, 프리 티어에서는 다음과 같이 이용 가능한 것으로 확인되었다.

Amazon SageMaker 기능 처음 2개월간 월별 프리 티어 사용량
Studio 노트북 및 노트북 인스턴스 Studio 노트북에서 ml.t3.medium 인스턴스 250시간 또는 노트북 인스턴스에서
ml.t2 medium 인스턴스 또는 ml.t3.medium 인스턴스 250시간

ml.t3.medium 인스턴스의 스펙은 다음과 같다. RAM 4GB 미만으로 요구하는 작은 모델만 가동해야겠다 생각했다. 아쉽게도 이전에 생각해 둔 KoSOLAR-10.7B-v0.2 모델은 이용할 수 없었다. (시간당 요금 기준 리전 = 서울)

표준 인스턴스 vCPU 메모리 시간당 요금
ml.t3.medium 2 4GiB 0.062 USD

AWS SageMaker의 Jumpstarts 목록에 있던 다음 모델을 확인해 보았다.

TinyLlama/TinyLlama-1.1B-Chat-v1.0

Dedicated가 아닌 Serverless 모드로 잠깐 사용할 수 있는 메뉴가 있어 예시 수준의 질문을 입력해 보았다. 한국어 데이터의 학습이 부족해서 결과는 당장 사용할 수 있는 수준이 아니었다.

Image

3차 해결 시도

파라미터 수 7B 이상의 대용량 모델을 로컬에서 실행하기 위해 PyTorch, transformers를 이용한 예시 코드를 작성하였다.

languagemodel.py

import torch
from transformers import BertTokenizer

def load_language_model():
    path_prefix = "/data/models/"
    model_parts = [
        f"{path_prefix}model-1.safetensors",
        f"{path_prefix}model-2.safetensors",
        f"{path_prefix}model-3.safetensors",
        f"{path_prefix}model-4.safetensors",
        f"{path_prefix}model-5.safetensors",
    ]
    models = [torch.load(part) for part in model_parts]
    return models

if __name__ == "__main__":
    models = load_language_model()
    tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
    text = "I love machine learning, what about you?"
    inputs = tokenizer(text, return_tensors="pt")
    outputs = models[0](**inputs)
    print(outputs)

이를 Docker 컨테이너에서 실행하자 다음과 같은 오류가 표시되었다.

root@817ec7546bb8:/data/app/core# python languagemodel.py
Traceback (most recent call last):
  File "/data/app/core/languagemodel.py", line 19, in <module>
    models = load_language_model()
  File "/data/app/core/languagemodel.py", line 13, in load_language_model
    models = [torch.load(part) for part in model_parts]
  File "/usr/local/lib/python3.12/site-packages/torch/serialization.py", line 1040, in load
    return _legacy_load(opened_file, map_location, pickle_module, **pickle_load_args)
  File "/usr/local/lib/python3.12/site-packages/torch/serialization.py", line 1258, in _legacy_load
    magic_number = pickle_module.load(f, **pickle_load_args)
_pickle.UnpicklingError: Memo value not found at index 43

PyTorch의 러닝 커브를 고려하여 로컬에서 LLM을 호스팅하기 위한 시도는 중단하기로 했다.

결론

Hugging Face에서 찾은 오픈 소스 LLM을 직접 호스팅하기에는 PyTorch 사용법도 익혀야 하고, 적지 않은 비용이 발생한다. 지금 당장은 Langchain을 이용하여 OpenAI의 gpt-3.5-turbo 모델을 이용하기로 결정하였다.

suyons commented 6 months ago

Close #6