인공지능/자연어 처리

학습한 모델 시각화 하여 보기 깔끔하게 하기! - 모델 서빙하기 1

이게될까 2024. 8. 13. 23:17
728x90
728x90

일단 가장 기본 코드부터 테스트 해봅시다

python 파일은 main.py로 만들어 줬습니다.

from fastapi import FastAPI
# 오브젝트 생성
app = FastAPI()

@app.get('/')
def root():
    return{'message':'Hello World'}

이렇게 작성하고 powershell에서 

uvicorn main:app --reload

이렇게 작성하면 서버가 하나 켜지는 느낌이네요

 

 

저는 윈도우라 이렇게 실행해야 되네요

curl.exe -X GET "http://127.0.0.1:8000"

이런 출력이 나오는 것을 확인할 수 있습니다.

 

이번에는 입력을 넣어주면 모델을 거쳐서 출력이 나오는 코드 입니다.

from fastapi import FastAPI
from peft import PeftModel, PeftConfig
from transformers import AutoModelForCausalLM,AutoTokenizer

# 기본 모델 가져오기 
base_model = AutoModelForCausalLM.from_pretrained("SmolLM1.7B")

# 로컬 경로로 PeftModel 불러오기
model = PeftModel.from_pretrained(base_model,"saved_model")

# 로컬 경로로 tokenizer 불러오기
tokenizer = AutoTokenizer.from_pretrained("saved_model")


def get_answer(prompt): 
    #prompt = "what is a road runner?"
    inputs = tokenizer(prompt, return_tensors='pt')
    
    generate_ids = model.generate(inputs.input_ids, max_length = 50)
    output = tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
    
    return output
    
# 오브제긑 생성
app = FastAPI()

@app.get('/')
def root():
    return{'message':'Hello World'}


@app.get('/chat')
def test(user_message):
    return{'message': get_answer(user_message)}

 

curl.exe -X GET "http://127.0.0.1:8000/chat?user_message=TH"

user_message 뒤에 넣고 싶은 prompt를 작성하면 됩니다.

헛소리만 합니다 ㅎㅎ...

그러나 여기선 공백을 넣으면 오류가 납니다!

포스트를 사용하면 오류를 없앨 수 있습니다.

 

from fastapi import FastAPI
from peft import PeftModel, PeftConfig
from transformers import AutoModelForCausalLM,AutoTokenizer

# 기본 모델 가져오기 
base_model = AutoModelForCausalLM.from_pretrained("SmolLM1.7B")

# 로컬 경로로 PeftModel 불러오기
model = PeftModel.from_pretrained(base_model,"saved_model")

# 로컬 경로로 tokenizer 불러오기
tokenizer = AutoTokenizer.from_pretrained("saved_model")


def get_answer(prompt): 
    #prompt = "what is a road runner?"
    inputs = tokenizer(prompt, return_tensors='pt')
    
    generate_ids = model.generate(inputs.input_ids, max_length = 50)
    output = tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
    
    return output
    
# 오브제긑 생성
app = FastAPI()

@app.get('/')
def root():
    return{'message':'Hello World'}


@app.get('/chat_test')
def test(user_message):
    return{'message': get_answer(user_message)}

@app.post('/chat')
def test(param : dict={}):
    user_message=param.get('user_message', ' ')
    return {'message': get_answer(user_message)}

포스트 방식이기 때문에 호출하는 방법도 바뀝니다.

curl.exe -d '{"user_message": "the math works"}' -H "Content-Type: application/json" -X POST http://127.0.0.1:8000/chat

윈도우에서 하면 이거 오류나더라고요,,,,

curl.exe -d "{\"user_message\": \"the math works\"}" -H "Content-Type: application/json" -X POST http://127.0.0.1:8000/chat

이렇게 변경해서 cmd에서 하니까 출력 나옵니다.

이제 인풋도 삭제해 봅시다.

 

from fastapi import FastAPI
from peft import PeftModel, PeftConfig
from transformers import AutoModelForCausalLM,AutoTokenizer

# 기본 모델 가져오기 
base_model = AutoModelForCausalLM.from_pretrained("SmolLM1.7B")

# 로컬 경로로 PeftModel 불러오기
model = PeftModel.from_pretrained(base_model,"saved_model")

# 로컬 경로로 tokenizer 불러오기
tokenizer = AutoTokenizer.from_pretrained("saved_model")


def get_answer(prompt): 
    #prompt = "what is a road runner?"
    inputs = tokenizer(prompt, return_tensors='pt')
    
    generate_ids = model.generate(inputs.input_ids, max_length = inputs.input_ids.shape[1]+15)# 입력 길이에 +n만큼 출력한다.
    output = tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
    output = output[len(prompt):]
    return output
    
# 오브제긑 생성
app = FastAPI()

@app.get('/')
def root():
    return{'message':'Hello World'}


@app.get('/chat_test')
def test(user_message):
    return{'message': get_answer(user_message)}

@app.post('/chat')
def test(param : dict={}):
    user_message=param.get('user_message', ' ')
    return {'message': get_answer(user_message)}

입력도 자르고, 출력 제한도 확실하게 주니까 깔끔해졌네요

 

728x90