seldon core

KFServing 对 Seldon Core 的 DAG 推理图进行了简化。KFServing 只支持 Transformer,Predicator。在实现上,KFServing 因为进行了简化,所以不再需要 Seldon Core 中的 Engine 这一角色。请求在 Transformer 和 Predicator 间的转发由 SDK 负责。

Seldon Core 对用户代码的侵入性非常低。用户只需要提供对应的 HTTP/gRPC Endpoint 来提供服务就可以,而不需要引用 Seldon Core 的 SDK。因为组合各个请求的职责不是由用户代码负责,而是由 Engine 执行。而在 KFServing 中,用户如果想实现自己的预处理的逻辑,需要引用 KFServing 的 SDK,这就是因为缺失了 Engine,导致转发的逻辑要利用 SDK 来实现。

下面是一个例子。可以看到这一例子中引用了 kfserving 这一个包,同时定义了两个命令行参数。这都是为了要实现转发而做的妥协。当 Transformer 预处理好后,会直接转发给命令行参数中传来的 predictor_host。这里的 predictor_host 是 InferenceService 中定义的 Predicator 的服务地址。

import kfserving
import argparse
from .image_transformer import ImageTransformer

DEFAULT_MODEL_NAME = "model"

parser = argparse.ArgumentParser(parents=[kfserving.kfserver.parser])
parser.add_argument('--model_name', default=DEFAULT_MODEL_NAME,
                    help='The name that the model is served under.')
parser.add_argument('--predictor_host', help='The URL for the model predict function', required=True)

args, _ = parser.parse_known_args()

class ImageTransformer(kfserving.KFModel):
    def __init__(self, name: str, predictor_host: str):
        super().__init__(name)
        self.predictor_host = predictor_host
        self._key = None

    def preprocess(self, inputs: Dict) -> Dict:
        if inputs['EventType'] == 's3:ObjectCreated:Put':
            bucket = inputs['Records'][0]['s3']['bucket']['name']
            key = inputs['Records'][0]['s3']['object']['key']
            self._key = key
            client.download_file(bucket, key, '/tmp/' + key)
            request = image_transform('/tmp/' + key)
            return {"instances": [request]}
        raise Exception("unknown event")

    def postprocess(self, inputs: Dict) -> Dict:
        logging.info(inputs)
        index = inputs["predictions"][0]["classes"]
        logging.info("digit:" + str(index))
        client.upload_file('/tmp/' + self._key, 'digit-'+str(index), self._key)
        return inputs

if __name__ == "__main__":
    transformer = ImageTransformer(args.model_name, predictor_host=args.predictor_host)
    kfserver = kfserving.KFServer()
    kfserver.start(models=[transformer])

 

 

参考:

https://zhuanlan.zhihu.com/p/145143582

posted on 2021-12-10 14:32  MissSimple  阅读(244)  评论(0编辑  收藏  举报

导航