カスタマイズ

カスタム推論モジュールについて

  • AIモデルの配備 iinfer -m client -c deploy <Option> コマンドで --predict_type Custom 且つ --custom_predict_py <カスタム推論pyファイル> オプションを指定すると、カスタムモデルを配備できるようになります。

  • カスタム推論pyファイルは iinfer.app.predict.Predict クラスを継承させたクラスを作成してください。

  • iinfer.app.predict.Predict クラスの定義は下記の通りで、継承したクラスは is_gpu_availablecreate_sessionpredict メソッドを定義してください。

  • なお、 iinfer.app.predict.Predict クラスを拡張した iinfer.app.predict.OnnxPredict 及び iinfer.app.predict.TorchPredict があり、 is_gpu_available メソッドが実装されています。

    from pathlib import Path
    from PIL import Image
    from typing import List, Tuple, Dict, Any
    import logging
    
    class Predict(object):
    def __init__(self, logger:logging.Logger) -> None:
          """
          このクラスのインスタンスを初期化します。
          継承時は、このコンストラクタを呼び出すようにしてください。
                super().__init__(logger)
          Args:
                logger (logging.Logger): ロガー
          """
          self.logger = logger
    
    def is_gpu_available(self, gpu_id:int=None) -> bool:
          """
          GPUが利用可能かどうかを返す関数です。
          戻り値がTrueの場合、GPUが利用可能です。
          戻り値がFalseの場合、GPUが利用不可です。
    
          Args:
                gpu_id (int, optional): GPU ID. Defaults to None.
          Returns:
                bool: GPUが利用可能かどうか
          """
          raise NotImplementedError()
    
    def post_deploy(self, deploy_dir:Path, conf:dict) -> None:
          """
          デプロイ後の処理を行う関数です。
          deployコマンド実行時に呼び出されます。
          この関数内でデプロイ後の処理を実装してください。
    
          Args:
                deploy_dir (Path): デプロイディレクトリのパス
                conf (dict): デプロイ設定
          """
          pass
    
    def create_session(self, deploy_dir:Path, model_path:Union[Path|Any], model_conf_path:Path, model_provider:str, gpu_id:int=None) -> Any:
          """
          推論セッションを作成する関数です。
          startコマンド実行時に呼び出されます。
          この関数内でAIモデルのロードを行い、推論準備を完了するようにしてください。
          戻り値の推論セッションの型は問いません。
    
          Args:
                deploy_dir (Path): デプロイディレクトリのパス
                model_path (Path|Any): モデルファイルのパス
                model_conf_path (Path): モデル設定ファイルのパス
                gpu_id (int, optional): GPU ID. Defaults to None.
    
          Returns:
                推論セッション
          """
          raise NotImplementedError()
    
    def predict(self, session, img_width:int, img_height:int, image:Image.Image, labels:List[str]=None, colors:List[Tuple[int]]=None, nodraw:bool=False) -> Tuple[Dict[str, Any], Image.Image]:
          """
          予測を行う関数です。
          predictコマンドやcaptureコマンド実行時に呼び出されます。
          引数のimageはRGBですので、戻り値の出力画像もRGBにしてください。
          戻り値の推論結果のdictは、通常推論結果項目ごとに値(list)を設定します。
          例)Image Classification(EfficientNet_Lite4)の場合
          return dict(output_scores=output_scores, output_classes=output_classes), image_obj
          例)Object Detection(YoloX)の場合
          return dict(output_boxes=final_boxes, output_scores=final_scores, output_classes=final_cls_inds), output_image
    
          Args:
                session: 推論セッション
                img_width (int): モデルのINPUTサイズ(画像の幅)
                img_height (int): モデルのINPUTサイズ(画像の高さ)
                image (Image): 入力画像(RGB配列であること)
                labels (List[str], optional): クラスラベルのリスト. Defaults to None.
                colors (List[Tuple[int]], optional): ボックスの色のリスト. Defaults to None.
                nodraw (bool, optional): 描画フラグ. Defaults to False.
    
          Returns:
                Tuple[Dict[str, Any], Image]: 予測結果と出力画像(RGB)のタプル
          """
          raise NotImplementedError()
    

前処理、後処理モジュールについて

  • AIモデルの配備 iinfer -m client -c deploy <Option> コマンドで --before_injection_py <前処理pyファイル> 及び --after_injection_py <後処理pyファイル> オプションを指定すると、サーバーサイドで実行する前処理及び後処理を配備できます。

  • 前処理pyファイルは iinfer.app.injection.BeforeInjection クラスを継承させたクラスを作成してください。

  • 後処理pyファイルは iinfer.app.injection.AfterInjection クラスを継承させたクラスを作成してください。

  • iinfer.app.injection.BeforeInjection 及び iinfer.app.injection.AfterInjection クラスの定義は下記の通りで、継承したクラスは action メソッドを定義してください。

  • --before_injection_py <前処理pyファイル> オプションを指定した場合、 --before_injection_conf <前処理py用設定ファイル> が指定できます。後処理も同様に指定できます。

  • --before_injection_conf <前処理py用設定ファイル> を指定した場合、 iinfer.app.injection.BeforeInjection クラスのコンストラクタの config 引数にその設定値が渡されます。後処理も同様です。

  • 前処理pyファイル及び後処理pyファイルのサンプルコードは、iinferのインストールパッケージ内の extensions フォルダ内にありますので参考にしてください。

    class BeforeInjection(object):
          """
          このクラスは推論を実行する前処理のインジェクションクラスです。
          """
          def __init__(self, config:Dict[str,Any], logger:logging.Logger):
                """
                このクラスのインスタンスを初期化します。
                継承時は、このコンストラクタを呼び出すようにしてください。
                      super().__init__(logger)
                Args:
                      config (Dict[str,Any]): 設定
                      logger (logging.Logger): ロガー
                """
                self.config = config
                self.logger = logger
    
          def action(self, reskey:str, name:str, image:Image.Image, session:Dict[str, Any]) -> Image.Image:
                """
                このメソッドは推論を実行する前処理を実行します。
                Args:
                      reskey (str): レスポンスキー
                      name (str): モデル名
                      image (Image.Image): 推論する画像データ
                      session (Dict[str, Any]): 推論セッション。次の項目が含まれます。
                                              session: app.predict.Predict#create_session() で作成されたセッション
                                              model_img_width: モデルの入力画像の幅
                                              model_img_height: モデルの入力画像の高さ
                                              predict_obj: app.predict.Predict インスタンス
                                              labels: クラスラベルのリスト
                                              colors: ボックスの色のリスト
                                              tracker: use_trackがTrueの場合、トラッカーのインスタンス
                Returns:
                      Image.Image: 前処理後の画像データ
                """
                return image
    
    class AfterInjection(object):
          """
          このクラスは推論実行後の後処理のインジェクションクラスです。
          """
          def __init__(self, config:Dict[str,Any], logger:logging.Logger):
                """
                このクラスのインスタンスを初期化します。
                継承時は、このコンストラクタを呼び出すようにしてください。
                      super().__init__(logger)
                Args:
                      config (Dict[str,Any]): 設定
                      logger (logging.Logger): ロガー
                """
                self.config = config
                self.logger = logger
    
          def action(self, reskey:str, name:str, outputs:Dict[str, Any], output_image:Image.Image, session:Dict[str, Any]) -> Tuple[Dict[str, Any], Image.Image]:
                """
                このメソッドは推論を実行した後の処理を実行します。
                Args:
                      reskey (str): レスポンスキー
                      name (str): モデル名
                      outputs (Dict[str, Any]): 推論結果。次の項目が含まれます。
                                              success or warn: 推論成功か警告のキーに対して、その内容が格納されます。
                                              output_image: 推論後の画像データをbase64エンコードした文字列
                                              output_image_shape: 推論後の画像データの形状(base46でコードするときに必要)
                                              output_image_name: クライアントから指定されてきた推論後の画像データの名前
                      output_image (Image.Image): 推論後の画像データ
                      session (Dict[str, Any]): 推論セッション。次の項目が含まれます。
                                              session: app.predict.Predict#create_session() で作成されたセッション
                                              model_img_width: モデルの入力画像の幅
                                              model_img_height: モデルの入力画像の高さ
                                              predict_obj: app.predict.Predict インスタンス
                                              labels: クラスラベルのリスト
                                              colors: ボックスの色のリスト
                                              tracker: use_trackがTrueの場合、トラッカーのインスタンス
                Returns:
                      Tuple[Dict[str, Any], Image.Image]: 後処理後の推論結果と画像データのタプル
                """
                return outputs, output_image