AI 모델 선택하기
적합한 AI 모델 선택
교수안 제작을 위해 적합한 AI 모델을 적용해야 했으며, 원하는 답변을 얻기위해 AI를 학습시킬 필요가 있었다. Deepseek과 Mistralai를 검토했지만, 한국어 지원이 부족한 부분이 있었고, 로컬 환경에서의 성능과 학습 시간 등을 고려했을 때 적합하지 않았다.
이에 따라 로컬환경의 제약 없이 파인튜닝이 가능한 OpenAI를 선택하게 되었다.
AI 모델 선택 비교 표
모델 이름 한국어 지원 성능 로컬 환경에서의 성능 적합성
skt/kogpt2-base-v2 | 탁월한 한국어 지원 | 다소 느림 (GPU 필요) | 질문 응답, 문장 완성, 챗봇 등에 적합하지만 교수안 제작에는 미흡 |
mistralai/Mistral-7B-Instruct-v0.3 | 영어 지원에 최적화 | 로컬 환경에서 비효율적 (큰 메모리 요구) | 영어 위주 작업에 적합, 한국어 지원 미흡 |
deepseek-ai/DeepSeek-R1 | 한국어 지원 미흡 (주로 영어, 중국어) | 로컬 환경에서 성능 부족, 다운로드 시간 너무 김 | 큰 모델로 성능이 뛰어나지만, 한국어 적용 어려움 |
GPT-3.5-turbo | 뛰어난 한국어 지원 | 빠른 파인튜닝 및 로컬 환경 영향 없음 | 교수안 제작에 적합, 다양한 작업에 유연함 |
하지만 GPT-3.5-turbo 보다는 학습시 가격이 저렴하고 가볍고 빠른 gpt-4o-mini 모델을 사용하기로 했다.
모델 : skt/kogpt2-base-v2
SKT에서 개발했으며, GPT-2 모델 기반의 한국어 학습을 시킨 모델이다. 한국어 지원은 탁월 했지만 질문에 대한 응답 생성, 문장 완성, 챗봇 등을 위해 만들어진 모델이다 보니 교수안 제작에는 적합하지 않다.
import numpy as np
import random
import tensorflow as tf
from transformers import AutoTokenizer
from transformers import TFGPT2LMHeadModel
model = TFGPT2LMHeadModel.from_pretrained('skt/kogpt2-base-v2', from_pt=True)
tokenizer = AutoTokenizer.from_pretrained('skt/kogpt2-base-v2')
sent = '과학 수업에 대한 교수안은'
# 문자열 정수 시퀸스로 변환
input_ids = tokenizer.encode(sent)
input_ids = tf.convert_to_tensor([input_ids])
print(input_ids)
# 주어진 문장을 이어서 작성한 내용의 시퀸스 반환
output = model.generate(input_ids,
max_length=128,
repetition_penalty=2.0,
use_cache=True)
output_ids = output.numpy().tolist()[0]
print(output_ids)
# 정수 시퀀스를 한국어로 변환
tokenizer.decode(output_ids)
해당 모델을 적용하며 AI 활용도와 학습시키는 방법들을 찾아보게되었으며 적합한 모델을 찾기 위해 노력했다.
모델 : mistralai/Mistral-7B-Instruct-v0.3
가볍게 사용이 가능하다고는 했지만 나의 로컬 환경에서는 적합하지 않았으며 주로 영어 데이터에 최적화가 되어 있어 적합 하지 않았다.
from transformers import AutoModelForCausalLM, AutoTokenizer
from huggingface_hub import login
login(token="my_token")
model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-Instruct-v0.3", device_map="auto")
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-
모델 : "deepseek-ai/DeepSeek-R1"
좋은 성능의 모델을 사용하고 싶어 해당 모델을 적용하고 싶어 테스트를 진행했지만 나의 로컬 환경에서 적용하기에는 선능이 부족했으며 시간도 많이 발생했다. 또한 영어와 중국어는 지원을 잘 하지만 한국어 지원은 미흡했다.
from transformers import AutoModelForCausalLM, AutoTokenizer
from huggingface_hub import login
login(token="my_token")
model_name = "deepseek-ai/DeepSeek-R1"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
input_text = "고등학교 1학년 물리학 교수안을 작성해줘."
input_ids = tokenizer(input_text, return_tensors="pt").input_ids
output = model.generate(input_ids, max_length=100)
print(tokenizer.decode(output[0], skip_special_tokens=True))
Deepseek 적용 이슈
ValueError: Unknown quantization type, got fp8 - supported types are:
['awq', 'bitsandbytes_4bit', 'bitsandbytes_8bit', 'gptq', 'aqlm',
'quanto', 'eetq', 'higgs', 'hqq', 'compressed-tensors', 'fbgemm_fp8',
'torchao', 'bitnet', 'vptq']
해당 에러는 fp8라는 양자화 유형을 지원하지 않아서 발생하는 에려였다.
양자화는 모델 크기를 줄이거나 계산 효율을 높이기 위한 모델의 가중치를 저정밀도로 표현하는 기술이라고 한다.
해결 방법
양자화 없이 모델를 로드 하는 방법을 사용했다.
https://github.com/huggingface/transformers/issues/35471
나와 같은 문제가 발생한 분의 코들 고대로 사용해 봤다. 코드 이해는 GPT를 통해 참고했습니다.
# 로깅 설정
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def load_model_without_quantization(
model_name: str = "deepseek-ai/DeepSeek-R1",
trust_remote_code: bool = True,
device_map="auto",
**kwargs
):
try:
# 원본 모델 로드 시도
model = AutoModel.from_pretrained(
model_name,
trust_remote_code=trust_remote_code,
device_map=device_map,
**kwargs
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
logger.info("✅ Model loaded successfully with original settings.")
return model, tokenizer
except ValueError as e:
if "Unknown quantization type" in str(e):
logger.warning("⚠️ Unknown quantization type detected. Trying without quantization...")
# 설정 파일에서 `quantization_config` 제거
config = AutoConfig.from_pretrained(model_name, trust_remote_code=trust_remote_code)
if hasattr(config, "quantization_config"):
delattr(config, "quantization_config")
try:
# 양자화 없이 모델 로드
model = AutoModel.from_pretrained(
model_name,
config=config,
trust_remote_code=trust_remote_code,
device_map=device_map,
**kwargs
)
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=trust_remote_code)
logger.info("✅ Model loaded successfully without quantization.")
return model, tokenizer
except Exception as inner_e:
logger.error(f"❌ Failed to load model without quantization: {str(inner_e)}")
raise
else:
logger.error(f"❌ Unexpected error during model loading: {str(e)}")
raise
# 모델 로드 테스트
model, tokenizer = load_model_without_quantization()
양자화 없이 모델을 사용하려 했지만 다운로드 시간이 너무 오래 걸리는 것을 확인 후 포기를 했다.
모델 : GPT-3.5-turbo
openai 라이브러리를 사용하여 로컬환경의 영향없이 파인듀닝이 가능했으며 한국어 지원도 탁월했다.
pip install openai
from openai import OpenAI
client = OpenAI(api_key="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")
response = client.chat.completions.create(
model="gpt-3.5-turbo",
response_format={ "type": "json_object" },
messages=[
{"role": "system", "content": "You are a helpful assistant designed to output JSON."},
{"role": "user","content": "교수안이 무엇인지 설명해줘"}
],
max_tokens = 200,
)
result = response.choices[0].message.content
print(result)
참고
https://github.com/skt-ai/kogpt2?utm_medium=social&utm_source=velog&utm_campaign=everyone ai&utm_content=kogpt2
https://ggaebap.tistory.com/121
https://platform.openai.com/docs/overview
'Python' 카테고리의 다른 글
FastAPI와 Django 비교 테스트 (0) | 2025.03.13 |
---|---|
Python GC 가비지 컬렉터: 메모리 관리의 이해 (1) | 2025.01.15 |
Python asyncio 비동기 처리 async/await (0) | 2025.01.09 |
Redis-Py : ZSet(Sorted Set) 랭킹 구현 활용 (1) | 2024.12.08 |
[TIL]내이배움캠프 - DRF + React 좋아요 기능 (0) | 2024.05.10 |