WEB GPU를 통한 로컬 LLM 서비스 구현하기 (1)

Nemo_Nemo·2025년 2월 17일

deepseek API 쓰다가 보안 취약점를 고민하게 되었다. DeepSeek를 서버를 통해서 사용하는 것이 보안에 있어서 위험하다면, 로컬에서 돌리면 되지 않을까? 하는 생각으로 이 프로젝트를 시작하게 되었다. 마침 webGPU라는 기술을 알게 되어 이걸 사용해보고자 한다.

여러 레퍼런스를 찾던 중 deepseek R1 1.5B 모델을 web gpu로 돌리는 huggingface page를 찾게 되었다. 코드를 열심히 들여다 보던 중, transformers.js 코드를 참고하면서, ONNX 기반으로만 모델이 돌아가는 걸 확인했고, Web Worker 대신 기존 경험을 살려 싱글톤 Controller 패턴으로 직접 제어해보고자 한다.

1. 아이디에이션: 문제 발견부터 방향성 설정까지

1.1 보안 이슈의 계기

보안 취약점:
Deepseek API를 사용하던 중, Deepseek의 경우 민감 데이터 유출 가능성과 같은 보안 취약점에 대한 우려들이 뉴스조차도 언급하고 있어 확실히 문제라고 생각이 들었다. 하지만, Deepseek를 단순히 사용하지 않기에는 오픈소스 중에서는 성능이 뛰어난 편이라고 생각이 들었다.

로컬 실행 아이디어:
"로컬에서 직접 모델을 실행하고 관리할 수 있다면 외부 서버 의존성을 완전히 제거하고 정보 유출에 대한 걱정을 덜 수 있지 않을까?"라는 생각에서 이 프로젝트가 출발했다. 이를 통해 보안성을 강화하고, 네트워크 환경에 영향을 받지 않는 안정적인 모델 운영이 목표이다.

1.2 로컬 실행의 장점 확인

보안성 향상:
데이터가 외부 서버로 전송되지 않으므로, 민감 정보의 유출 위험이 현저히 줄어든다.

낮은 레이턴시:
네트워크 지연 없이 로컬에서 바로 추론이 가능하여, 1.5B 모델의 경우 특히 저사양 환경에서도 빠른 응답 속도를 기대할 수 있다.

유연한 모델 커스터마이징:
로컬 환경에서 직접 시스템 조건등을 직접 다루므로, 사용자나 특정 환경에 맞춘 프라이빗한 사용 시나리오 구현이 용이할 것으로 예상된다..

1.3 레퍼런스 분석: Deepseek WebGUI 데모

참고 코드:
Deepseek-R1 WebGPU 데모의 코드를 참고했다. 해당 예제는 Web Worker를 활용한 비동기 모델 로드 및 추론 구조를 갖추고 있어, 초기 개발 방향성에 큰 영감을 주었다.

내부 구조 분석:
내부 구조를 살펴보면, Transformers.js를 통햇 onnx 모델을 구동하고 있었다. 일단 모델을 가져와 텔레그램같은 채팅 UI를 입히는 것이 목표였기에 Worker를 사용하지 않고 복잡한 메시지 핸들링 로직을 제거하고 이전 프로젝트 경험을 토대로 컨트롤러 패턴을 도입하여 메인 스레드에서 직접 모델을 제어하는 방식을 우선 적용하기로 결정했다.

1.4 기능 설계 초안

이번 개발의 주요 목표는 아래의 3가지 화면을 구성하는 것이다.

모델 로드 화면:
로컬 또는 허깅페이스에서 모델 파일(.bin, .json)을 선택할 수 있도록 구성
모델 로딩 상태를 Progress Bar와 ETA로 표시

채팅방 목록:
세션별 채팅 기록을 관리
로컬 스토리지와 연동하여 사용자 편의성 강화

채팅 화면:
1. 사용자 메시지 입력 후, deepseek R1 1.5B 모델을 활용하여 추론 결과를 실시간 스트리밍 방식으로 출력
2. 긴 응답 시 추론 중단 버튼을 추가하여 사용자 경험 개선
1.5 예상 트러블슈팅 이슈 및 해결 방안
초기 아이디어 단계에서 미리 고민해본 잠재적인 문제와 그에 대한 해결 방안은 다음과 같습니다.

모델 로드 지연:
대용량 모델 파일의 로딩 및 초기화에 시간이 소요될 수 있다.
해결 방안: 로딩 애니메이션과 함께 Progress Bar, ETA 등을 통해 사용자가 현재 진행 상황을 명확히 파악할 수 있도록 UI 개선.

메모리 관리 이슈:
로컬 실행 시 메모리 사용량이 급증할 가능성이 있어, 저사양 환경에서의 안정적인 운영이 우려되지만, 뭐 그건 하드웨어로 버텨야하지 않을까?

비동기 처리 문제:
Worker 대신 컨트롤러 패턴을 사용하면, 비동기 처리 및 이벤트 핸들링에 있어서 예기치 못한 버그가 발생할 수 있다.
해결 방안: 로깅 시스템을 통해 비동기 처리 흐름을 면밀히 모니터링하고, 디버깅 시 상세한 로그를 기록하여 문제 발생 시 빠르게 대응.

성능 저하 우려:
특히 저사양 기기에서 추론 속도가 느려질 가능성이 있.
해결 방안: 모델 경량화 방안 및 온디맨드 로딩 전략을 고려하여, 필요 시 사용자가 선택적으로 기능을 활성화할 수 있도록 옵션 제공.

결론

이번 아이디에이션 단계에서는 deepseek API 사용 중 발견한 보안 취약점을 계기로, 로컬에서 deepseek R1 1.5B 모델을 직접 실행하여 보안성을 강화하고, 네트워크 레이턴시 없이 빠른 추론 환경을 구현하는 방향으로 개발 아이디어를 도출했다. 물론 github에 충분히 훌륭한 프로젝트들도 많지만, 뭐 내가 직접 구현해보는 것도 또 공부를 하는 게 아닐까 한다.

앞으로 이 아이디어를 바탕으로 모델 로드, 채팅방, 채팅 인터페이스 구현 등 구체적인 기능들을 단계별로 진행하며, 발생할 수 있는 여러 트러블슈팅 이슈에 대한 대응 방안을 지속적으로 고민할 예정이다.

0개의 댓글