*협찬
https://m.smartstore.naver.com/digshop
디그샵 : 네이버쇼핑 스마트스토어
반려동물의 모든 것
smartstore.naver.com
당근마켓의 게시글 필터링 모델
*모델 학습하기
- 입력 : 게시글 단위
- 게시글 텍스트는 sentencepiece로 학습한 model을 그대로 사용
- 또는 mecab tokenizer 사용
- BERT finetune 모델은 pretrain 된 BERT 모델을 load하고, 그 뒤에 fully-connected layer를 붙임
***
class BERTFINETUNE(nn.Module):
def __init__(self, bert : BERT, num_class):
super().__init__()
self.bert = bert
self.decode = nn.Linear(self.bert.hidden, num_class)
self.softmax = nn.LogSoftmax(dim=-1)
def forward(self, x, segment_label):
x = self.bert(x, segment_label)
out = self.softmax(self.decode(x[:,0]))
return out
***
- BERT finetune 모델의 입력은 token index list + segment index list
- finetune할 때는 masking을 하지 않는다.
- finetune 단계에서 2개의 문장을 집어넣는 것이 아니기 때문에 segment embedding은 모두 같은 embedding을 사용
- 데이터셋의 카테고리 마다의 샘플 수가 일정하지 않기 때문에 pytorch WeightedRandomSampler을 사용
- WeightedRandomSampler : mini-batch를 sampling할 때 카테고리마다 다른 확률로 샘플링 하는 방법
- BERT를 5 epoch 정도 finetune 하니 97% 정도의 정확도가 나왔다고 함
-
*nn.Linear
- torch.nn 패키지를 사용해서 신경망 생성할 수 있음
- torch.nn.Linear는 레이어 간의 선형결합을 의미
- 이를 활성화 함수를 통과시키면 MLP 구조가 된다. (Multi Layer Perception)
"""
model = nn.Sequential(
nn.Linear(784, 15),
nn.Sigmoid(),
nn.Linear(15, 10),
nn.Sigmoid(),
).cuda()
"""
- 28*28 크기의 이미지를 1차원 벡터로 만들어 입력하고, 15개 노드의 은닉층을 거쳐, 10개 노드를 출력한다.
*모델 배포하기
***
def predict():
vocab = WordVocab.load_vocab('data/x.vocab')
bert = BERT(len(vocab), hidden=256, n_layers=8, attn_heads=8)
trainer = BERTPredict(bert, len(vocab), vocab, seq_len=163)
trainer.load_finetune('./save_model')
result = trainer.predict(문장)
***
- 요청을 주고, 결과를 받을 수 있는 api가 필요
- python에서 api를 만들 수 있는 가장 간단한 방법 중 하나가 Flask
***
app = Flask(__name__)
def make_model():
vocab = WordVocab.load_vocab('data/x.vocab')
bert = BERT(len(vocab), hidden=256, n_layers=8, attn_heads=8, dropout=0.1)
trainer = BERTPredict(bert, len(vocab), vocab, seq_len=163)
trainer.load_finetune('./save_model')
@app.route("/predict", methods = ["POST"])
def predict():
received_data = request.get_json()
start = time.time()
text = received_data['content']
output, score = trainer.predict(text)
end = time.time()
return jsonify(
output = output,
score = score,
version = '20200807',
time = str(end-start)
)
if __name__ == '__main__':
make_model()
PORT = 50051
app.run(host = "0.0.0.0", debug=True, port=PORT)
***
- Flask에서는 app.run을 통해 웹서버를 구축
- host와 port를 지정하면 host:port를 통해 만든 서버에 접속할 수 있음
- Flask에서는 여러 route를 만들 수 있는데 prediction을 위한 route를 만든다.
- 요청을 json 형태로 줄 것이기 때문에 request.get_json()을 통해 요청을 받아옴
- 요청이 오면 prediction을 하고 출력을 다시 json 형태로 반환
- 모델은 AWS ECS로 배포
- Docker container로 같은 기능을 수행하도록 만들어야 함
- 서버에서 서빙할 때는 cpu만 사용하기 때문에 pytorch도 cpu 버젼으로 설치
- Docker image를 build할 때, 이미 pytorch cpu 버젼을 설치한 이미지를 pull
- docker image를 build하기 위해 사용한 Dockerfile은 다음과 같다.
***
FROM anibali/pytorch:no-cuda
MAINTAINER
USER root
RUN apt-get update -y
RUN apt-get install -y wget build-essential autotools-dev automake libmecab2 libmecab-dev
RUN wget -O -https://bitbucket.org/eunjeon/mecab-ko-dic/downloads/mecab-ko-dic-2.0.1-20150920.tar.gz | tar zxfv
RUN cd mecab-ko-dic-2.0.1-20150920; sh ./autogen.sh
RUN cd mecab-ko-dic-2.0.1-20150920; ./configure; make; make install; ldconfig
RUN pip install numpy flask tqdm
RUN pip install python-mecab-ko
RUN pip install flask-cors
COPY . /app
WORKDIR /app
ENTRYPOINT["python"]
CMD["serving.py"]
"""
- 이 도커 파일로 build를 하고 docker run으로 구동했을 때 동일한 출력이 나와야 함
- docker image를 build 했다면 AWS ECR에 업로드할 수 있음
- ECR에 docker image를 upload 하고 나면 ECS를 통해 모델 서빙을 할 수 있음
*apt
- Advanced Packaging Tool
*wget
- 웹서버로부터 콘텐츠를 가져오는 컴퓨터 프로그램
'스타트업 > AI' 카테고리의 다른 글
[AI] 워드 임베딩(Word Embedding) (0) | 2020.08.07 |
---|---|
[AI] mecab (0) | 2020.08.07 |
[AI] NLP Task (0) | 2020.08.05 |
[AI] BERT (0) | 2020.08.04 |
[AI] Post-OCR parsing (0) | 2020.08.04 |