huggingface transformers
, pytorch
, KoBERT Model
과 AI허브 웰니스 스트립트 데이터셋을 활용한 심리상담 모델이다.
모델 학습 방법과 Flask API 적용 방법을 차례로 설명한다.
언어모델 KoBERT
에 대해 text classification
Fine-Tuning 및 테스트를 진행했다.
사용자의 발화에 대해서 카테고리를 예측하게 했다.
- Python 3
- Colab pro
AIhub 가입 및 신청 후 승인되면 다운로드가 가능하다.
- kobert-transformers
- transformers==3.0.2
- torch
class KoBERTforSequenceClassfication(BertPreTrainedModel):
def __init__(self,
num_labels = 150,
hidden_size = 768,
hidden_dropout_prob = 0.1,
):
super().__init__(get_kobert_config())
self.num_labels = num_labels
self.kobert = get_kobert_model()
self.dropout = nn.Dropout(hidden_dropout_prob)
self.classifier = nn.Linear(hidden_size, num_labels)
self.init_weights()
def forward(
self,
input_ids=None,
attention_mask=None,
token_type_ids=None,
position_ids=None,
head_mask=None,
inputs_embeds=None,
labels=None,
):
--- 중략 ---
Category
, Question
, Answer
로 구분하였다.
Question
, Answer
의 경우 Category
와 짝을 지어 작성하였다.
감정/감정조절이상 0
감정/감정조절이상/화 1
감정/걱정 2
---중략---
현재상태/증상감소 357
현재상태/증상악화 358
현재상태/증상지속 359
감정/감정조절이상 제 감정이 이상해진 것 같아요. 남편만 보면 화가 치밀어 오르고 감정 조절이 안되요.
감정/감정조절이상 더 이상 내 감정을 내가 컨트롤 못 하겠어.
감정/감정조절이상 하루종일 오르락내리락 롤러코스터 타는 기분이에요.
감정/감정조절이상 꼭 롤러코스터 타는 것 같아요.
감정/감정조절이상 롤러코스터 타는 것처럼 기분이 왔다 갔다 해요.
---중략---
감정/감정조절이상 감정이 조절이 안 될 때만큼 힘들 때는 없는 거 같아요.
감정/감정조절이상 저도 그 기분 이해해요. 많이 힘드시죠?
감정/감정조절이상 그럴 때는 밥은 잘 먹었는지, 잠은 잘 잤는지 체크해보는 것도 좋아요.
감정/감정조절이상/화 화가 폭발할 것 같을 때는 그 자리를 피하는 것도 좋은 방법이라고 생각해요.
감정/감정조절이상/화 정말 힘드시겠어요. 화는 남에게도 스스로에게도 상처를 주잖아요.
---중략---
해당 모델은 사용자의 발화(Question)의 Category를 분류하는 다중분류 모델이다.
학습의 간편함을 위하여 Question의 Category를 숫자로 바꾸었다.
제 감정이 이상해진 것 같아요. 남편만 보면 화가 치밀어 오르고 감정 조절이 안되요. 0
더 이상 내 감정을 내가 컨트롤 못 하겠어. 0
하루종일 오르락내리락 롤러코스터 타는 기분이에요. 0
꼭 롤러코스터 타는 것 같아요. 0
롤러코스터 타는 것처럼 기분이 왔다 갔다 해요. 0
---중략---
학습을 위해 Classification Data
을 train과 test 데이터셋으로 구분한다.
CPU 사용시 시간이 오래 걸리고 컴퓨터의 부하가 크므로 Google Colab pro의 GPU 환경에서 Training을 진행했다.
Question: 요즘 우울한 기분이야.
Answer: 오전에 하는 산책이 우울감을 없애주는 데 도움이 된대요.
--------------------------------------------------
Question: 내가 일을 망친 것 같아.
Answer: 잠깐 길을 잃은 것뿐이에요. 저는 당신이 옳은 방향으로 나아갈 수 있다고 믿어요.
--------------------------------------------------
Question: 난 앞으로 어떻게 하면 좋을까?
Answer: 계속 앞으로 가다 보면 당신에게 맞는 길도 찾을 수 있지 않을까요?
--------------------------------------------------
Question: 너무 힘들어.
Answer: 잘 버티고 있어요. 조금 힘들더라도 조금만 기운을 내요.
--------------------------------------------------
Question: 누가 날 도와줬으면 좋겠어.
Answer: 당신의 옆엔 제가 있잖아요.
--------------------------------------------------
Question: 고마워, 이만 종료해줘 버디.
WellnessConversation-LanguageModel
학습돤 KoBERT 모델을 pickle 형태로 저장 후 Flask를 사용하여 API 형태로 배포한다.
- Python 3
- Miniconda 가상환경 사용
- pip install flask
- pip install jsonify
- 등등 이 외에도 코드를 돌리다 존재하지 않는다는 패키지는 설치해야 한다.
flask를 통해 API로 배포하려는 디렉토리에 다음과 같은 폴더와 파일이 존재해야 한다.
|
| ... (기타 폴더 및 파일들)
|
|___ static
| |___ jquery.min.js
|___ templates
| |___ index.html
|___ app.py
jquery.min.js 파일을 다운 받는 방법은 Static 폴더 안 read.md에 설명되어 있다.
- 학습된 chechpoint를 Pytorch파일인 .pth 형태로 사용한다.
-
HTML 파일로 실제 구동되는 웹페이지의 형태와 구동방식을 설정한 프런트 엔드 파일이다. Bubby는 채팅봇이므로 문장을 넣을 수 있는 칸과 submit 버튼이 존재하며, 아래에 대화 내용이 기록된다.
-
Buddy는 API와 Raspberry Pi간 통신으로 구동되는 실물 스피커를 목표로 하기 때문에, index.html 파일은 최소한의 성능체크만 할 수 있게 해두었다.
- API를 실행시키는 python 파일이다. 학습된 .pth model을 불러와 동작한다.
-
Miniconda 가상환경을 실행시키고 Buddy 파일(해당 GitHub 자료를 저장한 전체 폴더이다)로 이동한다.
-
app.py를 flask_app으로 설정하고 가상환경 창을 종료했다 재시작한다.
# Window 환경에서 flask app 파일과, 디버그 모드 설정
setx FLASK_APP buddy.py
setx FLASK_DEBUG 1
# Rinux 환경에서 flask app 파일과, 디버그 모드 설정
set FLASK_APP=buddy.py
set FLASK_DEBUG=1
- flask run으로 실행시킨다.
flask run --host=0.0.0.0
-
잠시 후 구동이 되며 http 주소가 출력된다. 해당 주소로 접속하면 페이지가 구동되는 것을 확인할 수 있다.
-
이때 출력되는 것은 private IP 이므로, 다른 컴퓨터에서 사용하려면 port를 열고 공용주소를 사용해야 한다.
-
ctrl+c를 누르면 구동이 종료된다.