화이자 CFO 교체가 던진 질문: 우리는 여전히 2D 모니터 앞에서 분자를 '읽고' 있는가? — 한 구조생물학자의 VR 분자 실험실 체험기 (feat. NexoPeek, Meta Quest, PrankWeb/P2Rank, Foldseek, Mol*)

화이자 CFO 교체가 던진 질문: 우리는 여전히 2D 모니터 앞에서 분자를 '읽고' 있는가?

지난겨울, 연구실 한구석에서 밤새 돌리던 Cryo-EM 맵을 모니터 앞에서 확대·축소하며 포켓 위치를 추적하던 내 모습이 떠오른다. 마우스 휠을 돌릴 때마다 화면이 끊기고, 3D 회전은 여전히 키보드 단축키에 의존해야 했다. 그때 동료가 “VR로 직접 걸어보면 어떨까?”라고 던진 말이 머릿속을 맴돌았다. 그 말이 나를 NexoPeek와 Meta Quest의 조합으로 이끌었다.

NexoPeek는 Quest 2/3에서 네이티브로 구동되는 XR 애플리케이션이다. Unity 2022 LTS 기반으로 빌드되었고, WebXR 폴리필 없이 OpenXR 런타임만으로 90 fps를 유지한다. 초기 로딩 시 PDB/ mmCIF 파일을 파싱하는 워커 스레드를 별도로 분리해 메인 스레드 블로킹을 최소화했다. 코드 조각은 대략 이렇다:

async UniTask LoadStructureAsync(string url) { var bytes = await UnityWebRequest.Get(url).SendWebRequest(); var parser = new MmcifParser(); var structure = parser.Parse(bytes); await UniTask.SwitchToMainThread(); MolStarRenderer.Instance.Render(structure); } 

Mol* 렌더러는 WebGL2 컨텍스트를 Quest의 Vulkan 백엔드에 매핑해 GPU 인스턴스 드로잉으로 수만 개의 원자를 실시간으로 그린다. 메모리 프로파일링 결과, 300 k 원자 시스템에서 GPU 메모리 1.2 GB, CPU 12 % 수준으로 안정적이었다.

포켓 탐지는 PrankWeb/P2Rank 파이프라인을 서버리스 함수로 감싸 호출한다. 구조 파일이 업로드되면 AWS Lambda에서 P2Rank를 실행하고, 결과 JSON을 WebSocket으로 클라이언트에 푸시한다. 이 비동기 구조 덕분에 Quest 헤드셋에서는 로컬 연산 없이도 포켓 하이라이트가 즉시 나타난다. 벤치마크에서 2 초 이내에 상위 5개 포켓이 반환됐다.

동일 서버에서 Foldseek 인덱스를 미리 구축해 두었다. 사용자가 특정 포켓을 선택하면 Foldseek이 해당 서브구조와 유사한 PDB 엔트리 100개를 0.8 초 만에 검색해 온다. 결과를 Mol* 레이어에 오버레이하면 진화적 보존 영역이 색상으로 드러난다. 이 워크플로는 “구조 → 포켓 → 유사 구조 → 기능 가설”이라는 전통적 파이프라인을 VR 공간 안에서 한 번에 수행하게 해준다.

처음 Quest를 쓰고 실험실 벤치에 앉아 있던 나는, 단백질 표면 위를 손가락으로 스치며 포켓 입구가 어떻게 열리는지 직접 체감했다. 2D 화면에서는 보이지 않던 입체적 깊이가 손끝에서 느껴졌다. “이게 바로 내가 원하던 ‘분자 산책’이구나”라는 생각이 들었다. 동시에, 프레임 드랍 없이 90 fps를 유지하는 엔지니어링이 얼마나 정교한지 새삼 실감했다.

물론 아쉬움도 있다. Quest의 배터리 수명이 2시간 남짓이라 장시간 세션에는 외부 배터리 팩이 필수다. 또한, PrankWeb 서버 사이드 연산이 네트워크 지연에 민감해 5G 환경에서도 간혹 300 ms 지연이 발생한다. 팀은 이를 로컬 ONNX 모델로 포켓 예측을 경량화해 오프라인 모드를 준비 중이다.

이 경험은 내 연구 방식을 바꿨다. 이제 새로운 타겟이 들어오면 먼저 NexoPeek로 포켓 지형을 탐색하고, Foldseek로 유사 단백질을 뽑아 가설을 세운 뒤, 실험 설계로 넘어간다. 2D 모니터 앞에서 마우스만 굴리던 시절과는 비교도 안 될 만큼 직관적이고 빠르다.

지금 NexoPeek를 체험해보세요.