[MLOps] 🍱 BentoML - 2 : kogpt2 with transformers!


😎 今日は簡単にkogpt 2をBentoMLとして使いましょう!
😅 前回の記事はBentoML v 10-以前のバージョンですが、Transformer関連APIがBentoML 0.11.1(stable)に存在するため、今日の環境はBentoML=0.11.1!
(transformers==4.18.0/torch==1.11.0)

kogpt2?


https://github.com/SKT-AI/KoGPT2
🤗 '「NLPの民主化」をコンセプトに、HuggingFace Transformerが作成した「韓国語生成モデル」に基づいている.

huggingface? Transformer?


https://huggingface.co/docs/transformers/index
😉 「自己関心」メカニズムを用いたTransformerが強力なパフォーマンス向上を実現して以来、様々なNLPドメインD/Lアルゴリズムが広く採用されている.
😄 代表的なのはGPT(作成)、BERT(事前トレーニング)などです.
😋 これは非常に感謝すべきパッケージであり、様々なアルゴリズムを簡単にAPIとして使用することができる:)
😌 最近,docker hubのようなweight hubに発展し,API側でデータ科学者によって作成されたモデルの導入を実現した.

kogpt2!


http://aidev.co.kr/chatbotdeeplearning/9538
😁 最終的に、文を入れて、文をもとにして、「韓国語」NLP生成モデルを書きます!
# 예시
from transformers import PreTrainedTokenizerFast

tokenizer = PreTrainedTokenizerFast.from_pretrained("skt/kogpt2-base-v2",
  bos_token='</s>', eos_token='</s>', unk_token='<unk>',
  pad_token='<pad>', mask_token='<mask>')

# print(tokenizer.tokenize("안녕하세요. 한국어 GPT-2 입니다.😤:)l^o"))

import torch
from transformers import GPT2LMHeadModel

model = GPT2LMHeadModel.from_pretrained('skt/kogpt2-base-v2')

text = '달 밝은 밤'

input_ids = tokenizer.encode(text, return_tensors='pt')

gen_ids = model.generate(input_ids,
                           max_length=256,
                           repetition_penalty=4.0,
                           pad_token_id=tokenizer.pad_token_id,
                           eos_token_id=tokenizer.eos_token_id,
                           bos_token_id=tokenizer.bos_token_id,
                           use_cache=True)

generated = tokenizer.decode(gen_ids[0])

print(generated)
>>> 달 밝은 밤하늘을 볼 수 있는 곳.</d> 지난해 1231일 오후 2시 서울 종로구 세종문화회관 대극장에서 열린 ‘2018 대한민국연극제’ 개막식에는 배우들과 관객들이 대거 참석했다.
이날 개막한 연극제는 올해로 10회째를 맞는 국내 최대 규모의 공연예술축제다.
올해는 코로나19로 인해 온라인으로 진행됐다. ...

BentoML!


https://docs.bentoml.org/en/0.13-lts/quickstart.html#example-hello-world
https://docs.bentoml.org/en/0.13-lts/frameworks.html#transformers
https://sooftware.io/bentoml/

Script


😆 2つのスクリプトを含むファイル.
😋 main.pyはTransformerに関連する関数をロードし、これらの変数をサービスに「パッケージ」します.
😎 そしてBentoMLのポイントサービスはBento Servicepyをインポートして実装します.
# main.py
import torch
from transformers import GPT2LMHeadModel
from transformers import PreTrainedTokenizerFast
from bento_service import TransformerService

model_name = 'kogpt2'
model = GPT2LMHeadModel.from_pretrained('skt/kogpt2-base-v2')
tokenizer = PreTrainedTokenizerFast.from_pretrained("skt/kogpt2-base-v2",
  bos_token='</s>', eos_token='</s>', unk_token='<unk>',
  pad_token='<pad>', mask_token='<mask>')

service = TransformerService()

artifact = {'model' : model, 'tokenizer' : tokenizer}
service.pack("kogpt2Model", artifact)

saved_path = service.save()
😏 BentoServiceクラスを継承し、TransformerServiceを作成します.
また、適切なフォーマットを使用すると理解される場合、decoratorの使用に問題はありません.
✔@env推理用のパッケージ/バージョンを定義します.
✔@artifactsは、BentoMLで事前に作成したArtifactを使用することを示し、Artifactの名前を宣言します.
✔@apiはdecoratorで、入力されたフォーマットを事前に決定し、モデルが提供されるとすぐにapiとして使用できます.
😜 そして、Predicateのロジックを作成すればよい.
✔ main.pyで渡されたワークピースを使用するには、@artifacts decoratorで設定した「kogpt 2 model」を使用して、モデルとタグが使用されていることを確認します.
# bento_service.py
from bentoml import env, artifacts, api, BentoService
from bentoml.adapters import JsonInput
from bentoml.frameworks.transformers import TransformersModelArtifact

@env(pip_packages=["transformers==4.18.0", "torch==1.11.0"])
@artifacts([TransformersModelArtifact("kogpt2Model")])
class TransformerService(BentoService):
    @api(input=JsonInput(), batch=False)
    def predict(self, parsed_json):
        src_text = parsed_json.get("text")

        model = self.artifacts.kogpt2Model.get("model")
        tokenizer = self.artifacts.kogpt2Model.get("tokenizer")

        input_ids = tokenizer.encode(src_text, return_tensors="pt")

        gen_ids = model.generate(input_ids,
                           max_length=256,
                           repetition_penalty=4.0,
                           pad_token_id=tokenizer.pad_token_id,
                           eos_token_id=tokenizer.eos_token_id,
                           bos_token_id=tokenizer.bos_token_id,
                           use_cache=True)

        output = tokenizer.decode(gen_ids[0])

        return output

Model Serve!


😀 まずサービスします.save()ロジックのmainを作成します.pyを実行します.
# bash
python main.py
😜 通常、サービスは次のメッセージとともに保存されます.
実際、ディレクトリをチェックすると、要求されます.txt/Dockerfileなどの配置用のファイルが自動的に作成されたことを確認できます.
[2022-04-19 23:49:29,091] INFO - BentoService bundle 'TransformerService:20220419234923_5080D7' saved to: /home/kang/bentoml/repository/TransformerService/20220419234923_5080D7
😆 また、ローカルでサービスを実行すると、サーバは離れます.
# bash
bentoml serve TransformerService:latest
>>> 2022-04-19 23:51:14,614] INFO - Getting latest version TransformerService:20220419234923_5080D7
[2022-04-19 23:51:14,622] INFO - Starting BentoML API proxy in development mode..
[2022-04-19 23:51:14,623] INFO - Starting BentoML API server in development mode..
[2022-04-19 23:51:14,743] INFO - Your system nofile limit is 4096, which means each instance of microbatch service is able to hold this number of connections at same time. You can increase the number of file descriptors for the server process, or launch more microbatch instances to accept more concurrent connection.
======== Running on http://0.0.0.0:5000 ========
(Press CTRL+C to quit)
 * Serving Flask app 'TransformerService' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:54471 (Press CTRL+C to quit)
😉 http://127.0.0.1:54471に入ると、Swaggerは簡単に値を決定することができる:)



もちろん、Pythonリクエストパッケージまたはcurlリクエスト5000ポート:)
import requests
res = requests.post("http://127.0.0.1:5000/predict", json={"text": "가끔 이상한 말도 해요"})
print(res.text)

文章を整理する。


😃 kogpt 2を用いた結果から,いくつかの言葉自体が可能であることを確認したが,最終的には文脈に合わない単語が連続的に吐き出される部分があった.<
🤗 kogpt 2を私の好みに合った面白いモデルにして、次の記事で提供します:)
💕 そして、私はhttps://sooftware.io/bentoml/の文章を勉強して、たくさんの助けを得ました.ありがとう!👍
😉 では今日もコメントありがとうございました!