본문 바로가기
개발

Firebase Functions 의 한계와 해결방안

by dev-mong2 2025. 4. 2.

 

지금까지 만든 Dialogflow 챗봇(json 파일을 이용하는)은 정해진 Training phrases에만 반응할 수 있었음


예를 들어 '돈까스가 뭐야?' 라는 질문이 json 파일에 있으면 응답하지만

'돈까스 뜻 알려줘' 같은 유사 질문엔 응답하지 못하는 구조...

 

그래서 유사어도 해석이 가능한 챗봇을 만들고자 했음

--> Universal Sentence Encoder (USE) 를 도입해, 입력된 문장을 벡터화하여 유사도 기반 응답을 시도

 

하지만...

Firebase Functions에서 TensorFlow USE 사용이 어려운 이유

1. 메모리 부족

  • @tensorflow/tfjs-node 기반 모델 로딩에는 최소 500~700MB 이상 메모리 필요.
  • Firebase Functions 기본 메모리: 256MB / 512MB / 1024MB
  • 1024MB(최대) 설정 후에도, USE 모델 로딩 중 1088MB 사용 → 초과 발생.
Memory limit of 1024 MiB exceeded with 1088 MiB used.

2. 타임아웃

  • Firebase Functions 1세대는 60초 안에 HTTP 응답을 반환해야 함.
  • 모델 로딩이나 외부 다운로드에 60초 이상 걸리면 timeout 발생.

1, 2 문제를 해결하기 위해...

const use = require("@tensorflow-models/universal-sentence-encoder");
const tf = require("@tensorflow/tfjs-node");

let useModel;
use.load().then(model => {
  useModel = model;
});

Universal Sentence Encoder (USE) 모델을 외부에서 직접 다운로드하여 메모리에 로딩하는 구조에서

 

await bucket.file(`models/use_model/saved_model.pb`).download({ destination: localPath });

Firebase Storage에 모델을 업로드하고, Functions가 Storage에서만 가져오는 구조로 변경 했으나...

메모리 초과

  • 모델을 /tmp에 저장하더라도, 로드 시점에 최소 1GB 이상 메모리 사용
  • Firebase Functions 최대 메모리 제한: 1GB
  • 결국 모델을 불러오자마자 Memory limit exceeded 에러 발생

타임아웃

  • Firebase Storage에서 파일 다운로드 시 네트워크 지연 → 여전히 느림
  • cold start + 다운로드 = 60초 초과

3. tfjs-node의 Native 모듈 오류

  • @tensorflow/tfjs-node는 C++ 기반의 native binding (tfjs_binding.node) 을 사용
  • Firebase Functions는 이 모듈을 로딩하지 못하거나 빌드 실패 
Error: Cannot find module '.../tfjs_binding.node'

4. 네트워크 지연 + cold start

  • use.load() 또는 외부 모델 다운로드 시, 함수 cold start 상태에서 네트워크 응답 지연으로 실패.
  • 특히 모델을 Firebase Storage에서 불러올 경우도 5~10초 이상 걸림.

5. 비용과 효율 문제

  • 메모리 1GB, timeout 확장, 빌드 최적화 등 해결은 가능하더라도 복잡하고,
  • 결국 비용 대비 성능이 떨어짐 → 실시간 응답성도 나빠짐

 

정리하면

메모리 초과 모델 로딩에 필요한 공간 부족
타임아웃 초기 모델 로딩 시간 60초 초과
tfjs-node native binding functions 환경에서 실패
느린 네트워크 cold start 시 모델 다운로드 지연
구조적 비효율 request마다 모델 재로드 필요, 유지 어려움

 

결론...

Firebase Functions는 모델을 로딩하는 구조엔 적합하지 않다.

(단순 파일에서 가져오는 QnA 형식이나,  Dialogflow 에서 지원하는 Training phrases 를 사용하면 적합함 )

 

>> Cloud Run + 사전 임베딩 구조로 변경 할 예정

 

Dialogflow → Firebase Functions(Webhook) → 자연어 처리 모델 로딩 → 질문 응답

 

소스 정리는 다음 게시물에...