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. 모델이 메모리에 상주하게 되므로, 사용 가능한 메모리 용량에 따라서 문제가 될 수 있다.
그러므로 구현하려는 모델과 환경 등을 생각하여 효율적으로 유동적이게 코드를 작성해야 한다.