[MLOps] 🍱 BentoML - 1


代名詞を作ったら大満足!
😏 ただし、このモデルをローカルにオフセットして繰り返し導出するたびに無効です.
😉 しかも、他のシステムとの接続が難しい!
✔従って、通常、学習したMLモデルは単独でML推論サーバを配置し、REST APIを利用してサービスを行う.
✔簡単に言えば、Flask/DjangoなどのPython Web Frameworkを使用してMLモデルをサービスすることができます.
🙌 でも今日は...!
😎 MLServiceFramework:bentoml:使いやすいが、性能は強い.)
△今後機会があれば、Flaskで簡単な性能比較ができます.
簡単に始めましょう.

BentoML?


BentoML is an open platform that simplifies ML model deployment and enables you to serve your models at production scale in minutes.
https://docs.bentoml.org/en/latest/index.html
簡単に!PRODUCTION SCALEのモデルサービスプラットフォーム!
✔実際には、MLモデルを本番サービスに適用する場合、本番に適用するのは、ローカルで行われる実際のテストとは大きく異なります.
  • 😎 モデルになってJupyter Notebookでローカル推論したら実現したみたい…!
  • 🤦‍♂️ 現実的には、サーバに少し負荷がかかっても爆発します...さらに負荷が1つのモデルに集中すると、良い隣のモデルも一緒に伸びる...状況もよく起こります...🤔
    -たとえば、以前使用していたMLサービスエンジンではclipperというエンジンがありましたが、負荷が集中している場合、実際のPRODUCTIONの場合、エンジンがフリーズしたり、推論速度が低下したりする現象が連続的に発見されるため、拡張は使用できません.
    https://github.com/ucbrise/clipper(さようなら...もう会わないで...)
  • ✔この場合、完全なエラーの原因(私はこのサービスの利用者です)は推定できませんが、いずれにしても、盲点部分は負荷配分の失敗です.
    ✔長々と話していますが.BentoMLは負荷分配の面でより強く、期待されていると述べた.🙌

    Pre-Setting


    ✔GPU利用可能ワークステーション:nvidia GTX 1660 TI(GPUは今日いなくてもOK!)
    ✔ IDE : VScode
    ✔関連ドライバのインストール
    ✔Linuxカーネル(WSL 2使用、下部にWSL 2時のcudaインストールページ付き)
    ✔ bentoml v1.0:まだ正式にリリースされていないプリバージョン.
    ✔anaconda仮想環境の使用

    Tutorial


    https://docs.bentoml.org/en/latest/quickstart.html
    簡単に-GeBentomlのQuickstartについて

    anaconda仮想環境on!


    linux cmdにbentomlをインストールする


    ✔下のコードはv 1です.0ベースのプリパブリッシュバージョンコード.
    pip install bentoml --pre

    料理の作成:モデルをBentoMLのローカルモデルストレージ(ローカルストレージ)に保存する


    🍖 次のコードはiris datasetを使用してsklearningフレームワークに基づくSVMモデルを学習し、BentoMLローカルリポジトリに格納します.
    🍣 ああ!こうしてみると、本当にお弁当にモデルを保存しているような気がします.
    import bentoml
    
    from sklearn import svm
    from sklearn import datasets
    
    # Load predefined training set to build an example model
    iris = datasets.load_iris()
    X, y = iris.data, iris.target
    
    # Model Training
    clf = svm.SVC(gamma='scale')
    clf.fit(X, y)
    
    # Call to bentoml.<FRAMEWORK>.save(<MODEL_NAME>, model)
    # In order to save to BentoML's standard format in a local model store
    # bentoml.sklearn.save("iris_clf", clf)
    
    # 03/21/22 22:43:57 INFO     [cli] Successfully saved                                 
                               # Model(tag="iris_clf:6tmyatnjdsg5kaav", path="/home/kang/bentoml/models/iris_clf/6tmyatnjdsg5kaav/")   
    ✔上記のコードをワークステーションで実行し、以下の正常に保存された結果を返します.

    モデルのロード


    ✔最新というタグを使用してバージョン管理を行います.(ドッキングイメージと同様)
    import bentoml
    import numpy as np
    
    iris_clf_runner = bentoml.sklearn.load_runner("iris_clf:latest")
    iris_clf_runner.run(np.array([5.9, 3. , 5.1, 1.8]))

    試作品弁当の作成:サービス作成


    ✔下記のコードにより、簡単にMLサービスサーバーを解放できます.)
    # service.py
    import numpy as np
    import bentoml
    from bentoml.io import NumpyNdarray
    
    # 이전 학습을 진행한 모델을 로드해주고,
    iris_clf_runner = bentoml.sklearn.load_runner("iris_clf:latest")
    
    # 위의 모델을 "runner"로 사용하는 "bentoml service"를 생성합니다. 
    # 만약, runner가 여러개면, runners 인자의 list 안에 모두 정의하여야 합니다.
    # 모든 모델을 가지고, "도시락을 싸는 거죠!"
    svc = bentoml.Service("iris_classifier", runners=[iris_clf_runner])
    
    # 그리고, 위에서 정의한 "bentoml service"를 어노테이션으로 사용하여, 추론 함수를 정의합니다.
    # pre / post processing 로직도 정의합니다.
    @svc.api(input=NumpyNdarray(), output=NumpyNdarray())
    def classify(input_series: np.ndarray) -> np.ndarray:
        # Define pre-processing logic
        result = iris_clf_runner.run(input_series)
        # Define post-processing logic
        return result
    「弁当で包む」「弁当を包む」「美味しくサービスする」とおっしゃるように.
    😃 Inputおよびoutputtypeは、上記の例のようにnumpyとして示されています.デフォルトではendarrayがサポートされており、pandasもあります.DataFrame/PIL.イメージをサポートします.その他、公式ドキュメントを参照してください.

    試食弁当:サービング!


    ✔ service.pyベースのサービス!
    ✔--再ロードオプションは、ソースが変更されたときに再起動しないオプションです:)
    bentoml serve ./service.py:svc --reload
    😁 簡単に結果を確認!
    
    import requests
    res = requests.post(
        "http://127.0.0.1:3000/classify",
        headers={"content-type": "application/json"},
        data="[5,4,3,2]").text
    
    print(res)
    # 1

    弁当量産:Build&Serve!


    😎 次のyamlファイルを簡単に作成します.
    # bentofile.yaml
    service: "service.py:svc"  # A convention for locating your service: <YOUR_SERVICE_PY>:<YOUR_SERVICE_ANNOTATION>
    description: "file: ./README.md"
    labels:
        owner: bentoml-team
        stage: demo
    include:
     - "*.py"  # A pattern for matching which files to include in the bento
    python:
      packages:
       - scikit-learn  # Additional libraries to be included in the bento
       - pandas
    ✔ README.mdファイルはbentofileです.yamlファイルと同じ場所に保存します.
    touch README.md
    😎 そして、CLIでbentoを作成!
    bento build
    「1000 bento list」コマンドを使用して生成されたbento:)を表示できます.
    『タイム誌』のイメージバージョンに似ています!
    bento list
    Tag            Service      Path           Size       Creation Time 
     iris_classif…  service:svc  /home/kang/b…  15.42 KiB  2022-03-21    
                                                           15:23:23
    🎉 いよいよ完成したベントで生産サービス開始!
    bentoml serve iris_classifier:latest --production
    😎 簡単に結果を確認!
    
    import requests
    res = requests.post(
        "http://127.0.0.1:3000/classify",
        headers={"content-type": "application/json"},
        data="[5,4,3,2]").text
    
    print(res)
    # 1

    文章を整理する。


    😁 今日は、BentoMLチュートリアルに重点を置きます.
    🍖 間違いなく、アクセスしやすいフレームワークで、「弁当」のように梱包して販売することができます.)
    😋 次の記事では,実用的なモデルを導入し,性能比較を行う.
    (ローカルなので、できるかどうかはわかりませんが…)もっと高級な機能を使います!

    コメントページ


    https://www.lainyzine.com/ko/article/how-to-install-wsl2-and-use-linux-on-windows-10/
  • WSL 2インストール
  • https://velog.io/@jaehyeong/WSL2-%EC%B4%88%EA%B0%84%EB%8B%A8-%EC%84%A4%EC%B9%98-%EB%B0%8F-CUDAGPU-%EC%84%A4%EC%A0%95-%EB%B0%A9%EB%B2%95
  • WSLを使用して、Cudaのインストールについて詳しく説明していただき、ありがとうございます:)
  • https://zzsza.github.io/mlops/2021/04/18/bentoml-basic/
  • 卞成允の開発ブログ:本当に整理してよかった...!