*협찬
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

+ Recent posts