집 노트북을 서버로: ONNX 양자화와 Cloudflare Tunnel
GPU 없는 노트북에서 한국어 임베딩 모델을 8배 빠르게 돌리고, 포트 개방 없이 외부 주소를 붙인 과정과 시행착오.
views
| comments
도서관 추천 앱에는 질문 문장을 벡터로 바꿔 책 14,278권과 비교하는 서버가 필요했다. 클라우드에 GPU 서버를 빌리는 대신, 집에 놀고 있던 노트북(i5 4코어, RAM 7.8GB, GPU 없음)을 서버로 썼다.
모델을 가볍게 만들기#
한국어 임베딩 모델 KURE-v1을 그대로 돌리면 메모리를 약 2GB 쓰고 질문 하나에 0.3초가 걸렸다. ONNX로 변환한 뒤 int8로 양자화했다.
| 방식 | 1위 일치(30문항) | 속도 | 결정 |
|---|---|---|---|
| PyTorch 동적 양자화 | 20/30 | 이득 거의 없음 | 불채택 |
| ONNX int8 | 29/30 | 질문 1개 0.31초 → 0.039초 | 채택 |
결과 정확도는 상위 10권이 약 90% 겹칠 정도로 유지됐고, 서버 메모리는 약 1.3GB로 줄었다. 질문 여섯 개를 한 번에 보내도 60밀리초 안에 끝난다.
포트를 열지 않고 외부에 공개하기#
Cloudflare Tunnel을 썼다. 구조는 이렇다.
- 집 PC의
cloudflared가 Cloudflare로 나가는 연결을 유지한다. - 방문자의 요청은 Cloudflare가 그 연결로 넘겨 준다.
- 그래서 공유기 포트포워딩이 필요 없고, 집 IP가 드러나지 않고, HTTPS 인증서도 자동이다.
대가도 알아 두어야 한다. 암호화가 Cloudflare에서 한 번 풀리므로 요청과 응답 내용은 Cloudflare가 볼 수 있다. 그래서 민감한 내용은 이 경로에 싣지 않는다.
부팅하면 알아서 켜지게#
- 서버는 작업 스케줄러로 부팅 시 자동 실행하고, 실패하면 1분 뒤 재시작하게 했다.
- 터널은 윈도우 서비스로 등록했다.
- 전원 설정에서 절전을 끄고 덮개를 닫아도 아무 일도 안 하게 했다.
설치하며 막혔던 것#
- PyTorch가
c10.dll오류를 내며 안 뜸 → Visual C++ 재배포 패키지 설치 - 모델 다운로드가 0바이트에서 멈춤 → 환경변수
HF_HUB_DISABLE_XET=1 - 오프라인 모드에서 저장소 이름으로 ONNX 변환이 실패 → 내려받은 폴더 경로를 직접 지정
- 점검 순서를 정해 두니 편했다: 로컬 상태 확인 → 외부 상태 확인 → 키 없이 호출하면 401 → 키를 넣고 검색
한계#
노트북이 꺼지거나 정전이 나면 서비스도 멈춘다. 개인용이나 실험용에는 충분하지만, 항상 켜져 있어야 하는 서비스는 Firebase 같은 관리형 서비스가 맞다. 그래서 서버가 꺼졌을 때를 대비해 앱 쪽에 대체 동작을 두었다.