AI

TIL230524 DRF에서 머신러닝 API 호출 속도 증가

베스트오버 2023. 5. 25. 00:35

DRF와 머신러닝을 어떻게 연결을 할까 고민을 하며 구글링을 하다 찾았던 글이 있다.

https://medium.com/saarthi-ai/deploying-a-machine-learning-model-using-django-part-1-6c7de05c8d7

 

Deploying a Machine Learning Model Using Django: Part-1

Create your own Django REST application to deploy Machine Learning models in simple steps.

medium.com

 

 

 

엔드포인트가 호출 될 때마다 모델 로드 하는 것은 오버헤드가 증가한다는 내용이니 한 번만 로드하도록 하라는 내용이 있었다.

 

그래서 기존 코드에서 수정을 하도록 하였다.

 

# views.py <기존 코드>

class TransformView(APIView):
    parser_classes = [parsers.MultiPartParser]
    permission_classes = [permissions.IsAuthenticated]

    def post(self, request, change_id, format=None):
        file_obj = request.FILES['image']
        # change_id = request.POST['change_id']

        # .t7 파일 로드
        model_dict = {
            '1': 'change/models/candy.t7',
            '2': 'change/models/composition_vii.t7',
            '3': 'change/models/feathers.t7',
            '4': 'change/models/la_muse.t7',
            '5': 'change/models/mosaic.t7',
            '6': 'change/models/starry_night.t7',
            '7': 'change/models/the_scream.t7',
            '8': 'change/models/the_wave.t7',
            '9': 'change/models/udnie.t7',
        }
        model_path = model_dict.get(str(change_id))
        if model_path is None:
            return Response({'error': 'Invalid change_id'}, status=400)
        net = cv2.dnn.readNetFromTorch(model_path)
        
        .....

 

# views.py <수정 후 코드>

class TransformView(APIView):
    parser_classes = [parsers.MultiPartParser]
    permission_classes = [permissions.IsAuthenticated]

    # .t7 파일 로드
    model_dict = {
        '1': cv2.dnn.readNetFromTorch('change/models/candy.t7'),
        '2': cv2.dnn.readNetFromTorch('change/models/composition_vii.t7'),
        '3': cv2.dnn.readNetFromTorch('change/models/feathers.t7'),
        '4': cv2.dnn.readNetFromTorch('change/models/la_muse.t7'),
        '5': cv2.dnn.readNetFromTorch('change/models/mosaic.t7'),
        '6': cv2.dnn.readNetFromTorch('change/models/starry_night.t7'),
        '7': cv2.dnn.readNetFromTorch('change/models/the_scream.t7'),
        '8': cv2.dnn.readNetFromTorch('change/models/the_wave.t7'),
        '9': cv2.dnn.readNetFromTorch('change/models/udnie.t7'),
    }
    
    def post(self, request, change_id, format=None):
        file_obj = request.FILES['image']
        # change_id = request.POST['change_id']
        
        net = self.model_dict.get(str(change_id))
        if net is None:
            return Response({'error': 'Invalid change_id'}, status=status.HTTP_200_OK)

 

모델을 한 번만 로드하도록 개선하는 방법에

클래스 레벨에 모델을 로드하는 코드를 추가하는 것이다.

 

서버가 시작될 때 한 번만 모델을 로드하므로, 각 요청마다 모델을 로드하는 시간을 절약할 수 있다.

 

하지만 주의할 점이 있다.

 

1. 모델이 많거나 크면, 서버를 시작하는 데 오래 걸릴 수 있다.

2. 모델이 메모리에 상주하게 되므로, 사용 가능한 메모리 용량에 따라서 문제가 될 수 있다.

 

그러므로 구현하려는 모델과 환경 등을 생각하여 효율적으로 유동적이게 코드를 작성해야 한다.