학습한 모델 결과를 웹 서비스로 이용하기 위해서는 모델을 서빙 해야한다.
Tensorflow 기반의 모델은 tensorflow.js를 이용해서 손쉽게 모델을 서빙할 수 있다.
하지만 자연어처리 모델의 경우 대부분의 pytorch 기반으로 모델이 작성되어 있다.
그래서 다른 방법을 고민해봐야 한다.
🧐💙💦
🔷 Pytorch 기반의 model을 serve 하기 위한 방법
1. Pytorch Serve 활용
2. torch.onnx 모듈 활용
3. flask or django 등을 활용한 serve
🔷 flask나 django를 이용하는 방법
[원리]
1) flask나 django 등의 python 기반 패키지를 활용하여 api 서버를 구축한다
2) 생성한 api 단에서 모델을 실행한다
저는 flask랑 django를 이용해본적이 없어서 onnx를 이용해서 모델을 서브 해보겠다
🔷 ONNX 형식을 이용하는 방법
[원리]
1) 학습한 모델을 ONNX 형식으로 변환한다
2) 생성한 .onnx 파일을 백엔드로 전달한다
3) 백엔드에서는 ONNX 런타임을 이용해 모델을 실행한다
node 환경은 ONNX를 지원하기에 torch 기반의 모델을 ONNX 파일로 내보낸 다음에 node환경에서 불러서 사용하는 방법은 모델 서브하는 좋은 방법중 하나이다.
- onnx모듈을 사용하는 방법 참고 링크: https://pytorch.org/docs/stable/onnx.html
- node 런타임에서 onnx를 사용하는 방법 참고 링크: https://github.com/microsoft/onnxjs
나는 MS에서 제공되는 가이드를 참고해서 모델을 ONNX로 변환해보았다.
- 참고링크 : https://docs.microsoft.com/ko-kr/windows/ai/windows-ml/tutorials/pytorch-convert-model
PyTorch 모델을 ONNX로 변환
PyTorch 모델을 ONNX 모델 형식으로 변환하여 Windows ML 앱과 통합
docs.microsoft.com
⭐👍💛
👇위의 MS 가이드 참고하여 수정한 코드
import torch
import torch.onnx
from transformers import GPT2LMHeadModel
# from ratsnlp.nlpbook.generation import GenerationTrainArguments
# Function to Convert to ONNX
from transformers import PreTrainedTokenizerFast
def Convert_ONNX():
# * 추가
tokens_list = ['<unused0>', '<unused1>', '<unused2>',
'<unused3>', '<unused4>', '<unused5>']
tokenizer = PreTrainedTokenizerFast.from_pretrained("skt/kogpt2-base-v2",
bos_token='</s>', eos_token='</s>', unk_token='<unk>',
pad_token='<pad>', mask_token='<mask>', additional_special_tokens=tokens_list)
# *
# set the model to inference mode
model.eval()
# Let's create a dummy input tensor
# dummy_input = torch.randn(1, input_size, requires_grad=True)
input_ids = tokenizer.encode(
'<unused0>비빔밥<unused1><unused2>콩나물$고추장$간장$상추$밥$계란$<unused3><unused4>', return_tensors='pt')
# Export the model
torch.onnx.export(model, # model being run
# model input (or a tuple for multiple inputs)
# dummy_input,
input_ids,
"KoGPT_recipt.onnx", # where to save the model
export_params=True, # store the trained parameter weights inside the model file
opset_version=10, # the ONNX version to export the model to
do_constant_folding=True, # whether to execute constant folding for optimization
input_names=['modelInput'], # the model's input names
output_names=['modelOutput'], # the model's output names
dynamic_axes={'modelInput': {0: 'batch_size'}, # variable length axes
'modelOutput': {0: 'batch_size'}})
print(" ")
print('Model has been converted to ONNX')
if __name__ == "__main__":
# Let's build our model
# train(5)
#print('Finished Training')
# Test which classes performed well
# testAccuracy()
# Let's load the model we just created and test the accuracy per label
# model = Network()
# * 추가
# argss = GenerationTrainArguments(
# pretrained_model_name="skt/kogpt2-base-v2",
# downstream_corpus_name="recipegpt",
# downstream_corpus_root_dir='/Test_onnx/data',
# downstream_model_dir="/Test_onnx/models",
# max_seq_length=150,
# batch_size=16 if torch.cuda.is_available() else 4,
# learning_rate=5e-5,
# epochs=10,
# tpu_cores=0 if torch.cuda.is_available() else 8,
# seed=7,
# )
model = GPT2LMHeadModel.from_pretrained(
"skt/kogpt2-base-v2"
)
# *
path = "TypeTesting_.pt"
model.load_state_dict(torch.load(path))
# Test with batch of images
# testBatch()
# Test how the classes performed
# testClassess()
# Conversion to ONNX
Convert_ONNX()
🔶 파일 실행 결과
ONNX를 이용하는게 처음이어서 어떻게 해야할지 잘 몰랐는데 일단 코드를 보면서 어느정도 따라하니 일단 파일은 변환이 잘 되었다. 😂 제대로 잘 동작하는지는 이후에 onnx 런타임을 이용해서 모델을 실행하면서 테스트 해봐야 알 것 같다.
'인공지능' 카테고리의 다른 글
ChatGPT 사용 후기 | 쿼리 튜닝 및 테스트 (0) | 2023.02.18 |
---|---|
ONNX 파일 onnx runtime 실행하여 모델 유추하는 방법 (0) | 2022.06.13 |
conda: command not found 해결하기 (0) | 2022.06.10 |
스왑파일 './bashrc.swp' vi swap file already exists 해결 (0) | 2022.06.10 |