heojae / FoodImageRotationAdmin

Food Image Rotation (음식이미지 회전) 이라는 주제에 대해서. 실제로 딥러닝(deeplearning)을 어떻게 도입하고, 이를 API(backend)로서 서버에 올리며, 웹(frontend) 를 통해서 올리는 과정을 구현하기 위해서 만든 프로젝트입니다.
0 stars 0 forks source link

[Backend] Model Version Server 설계 및 구상도 #18

Open heojae opened 3 years ago

heojae commented 3 years ago

대주제 : Model Version server 의 설계와 각각의 API 들의 설정이유들을 명시하고 싶다.

소주제 : db 설계 와 활용한 각 라이브러리들을 정리하고 싶다.

참고 이슈

User Server 설계 및 구상도

만든이유

dl server 에서, 단순히 모델을 load 하고, inference 하는 것만 해도 괜찮도록 만들기 위해서, 고안한 서버입니다.

dl server 에서는 오직, model 의 inference 작업에만 하고, 그외에 DB 작업과 관련된 것은 배제하였습니다.


API 설명

아래 3개의 API 모두, Service-Side Interceptor 를 활용해서,

https://grpc.github.io/grpc/python/grpc.html#service-side-interceptor

user server - authenticate 에게 요청을 보내서, 유저 인증을 하게 됩니다.


DB 설계도

아래와 같이, ModelVersion 하나의 테이블로 이루어져있으며, 기본적인 정보들만, 포함하고 있습니다. erdcloud 를 활용하여 그렸습니다.

스크린샷 2021-02-12 오전 12 26 50


라이브러리

User Server 설계 및 구상도 의 라이브러리를 기본으로 하였지만, 추가로 활용한 라이브러리에서, 해결을 하는데 어려움이 있었기에 정리하고 싶습니다.

처음 grpc 에 접하게 된다면, 아래와 같은 내용들은 흔하지 않은 내용이기에, 도움이 될 수 있을 것이라 생각합니다.

class AuthenticateUserAccessToken(grpc.aio.ServerInterceptor):

    def __init__(self, free_pass_method_name_list: List[str]):

        def abort(ignored_request, context: grpc.aio.ServicerContext) -> None:
            context.abort(grpc.StatusCode.UNAUTHENTICATED, 'Invalid signature')

        self._abort_handler = grpc.unary_unary_rpc_method_handler(abort)
        self.free_pass_method_name_list = free_pass_method_name_list

    async def intercept_service(
            self, continuation: Callable[[grpc.HandlerCallDetails], Awaitable[
                grpc.RpcMethodHandler]],
            handler_call_details: grpc.HandlerCallDetails
    ) -> grpc.RpcMethodHandler:

        method_name = handler_call_details.method.split('/')[-1]
        if method_name in self.free_pass_method_name_list:
            return await continuation(handler_call_details)

        for key, value in handler_call_details.invocation_metadata:
            if key == settings.token_header:
                user_authenticated, _ = await authenticate(access_token=value)
                if user_authenticated:
                    return await continuation(handler_call_details)
                break
        return self._abort_handler

 # --------------------------------
# app.py
server = grpc.aio.server(interceptors=(AuthenticateUserAccessToken(free_pass_method_name_list=[]),))

스크린샷 2021-02-12 오전 10 56 36

스크린샷 2021-02-12 오전 10 18 26