한국정보기술진흥원
한국정보기술신문
thumbnail

정보기술 · 인공지능 ·

개인 데이터 검색의 새 지평...자체 호스팅 이미지 검색 엔진 'Hachi' 등장

발행일
읽는 시간4분 9초

인도 개발자가 최소 의존성과 얼굴 인식 기능을 갖춘 오픈소스 검색 엔진 개발, 180GB 규모 데이터셋 처리 성공

[한국정보기술신문] 클라우드 중심의 데이터 저장 환경에서 개인 정보 보호와 검색 효율성을 동시에 추구하는 새로운 시도가 주목받고 있다. 인도의 한 개발자가 수년간의 개발 끝에 완전 자체 호스팅이 가능한 이미지 검색 엔진 'Hachi'를 공개했다.

Hachi는 사용자의 로컬 하드디스크부터 원격 서버에 분산된 개인 데이터를 하나의 인터페이스로 통합 검색할 수 있는 엔드투엔드 검색 솔루션이다. 현재는 이미지 검색만 지원하지만, 향후 비디오, 텍스트, 오디오 등 다양한 모달리티로 확장할 계획이다.

이 프로젝트의 가장 큰 특징은 외부 의존성을 최소화한 설계 철학이다. 대부분의 검색 엔진이 수십 개의 외부 라이브러리에 의존하는 것과 달리, Hachi는 Python 환경에서 numpy, regex, markupsafe 단 3개의 의존성만으로 구동된다. 이러한 미니멀리즘은 다양한 플랫폼에서의 설치와 실행을 용이하게 만든다.

머신러닝 기반 시맨틱 검색

Hachi는 전통적인 메타데이터 검색과 머신러닝 기반 시맨틱 검색을 결합한다. CLIP 모델을 활용해 이미지의 의미론적 특징을 벡터로 변환하고, 이를 통해 사용자가 자연어로 이미지를 검색할 수 있다. 예를 들어 '해변의 일몰'이라고 검색하면 실제로 그러한 장면을 담은 사진들을 찾아낼 수 있다.

특히 주목할 만한 기능은 얼굴 인식과 클러스터링이다. Retina-Face 모델을 사용해 이미지에서 얼굴을 감지하고 랜드마크를 추출한 후, 동일 인물의 사진들을 자동으로 그룹화한다. 이 과정에서 선글라스를 착용한 얼굴이나 흐릿한 이미지는 자동으로 필터링되며, 정면을 향한 안정적인 프로필을 우선적으로 선택한다.

개발자는 실제 데이터셋을 대상으로 한 테스트에서 약 25밀리초의 지연시간으로 높은 정확도의 얼굴 인식을 구현했다고 밝혔다. 특히 근접 촬영된 얼굴, Z세대 스타일의 셀카, 선글라스로 눈이 가려진 사진 등 다양한 조건에서도 안정적인 성능을 보였다.

독자적 ML 프레임워크와 최적화

Hachi의 또 다른 특징은 Nim 언어로 작성된 독자적인 머신러닝 프레임워크를 사용한다는 점이다. 이는 PyTorch 등 기존 프레임워크보다 Intel과 AMD CPU에서 더 빠른 추론 속도를 보인다. 배치 정규화와 컨볼루션의 융합, 사전 할당된 메모리의 재사용 등을 통해 최적화를 달성했다.

백엔드는 Python으로 작성되었으며, 초기에는 Flask를 사용했으나 현재는 Werkzeug를 직접 활용해 불필요한 의존성을 제거했다. 멀티스레드 처리를 통해 리소스 활용도를 극대화하며, 인덱싱 진행 상황과 예상 완료 시간을 실시간으로 제공한다.

프론트엔드는 HTML, JavaScript(TypeScript), Tailwind CSS로 구성된 멀티페이지 웹앱이다. 초기에는 Svelte를 사용했으나, 과도한 추상화를 피하기 위해 네이티브 브라우저 API로 전환했다. 배치 업데이트와 페이지네이션을 통해 대용량 데이터셋에서도 원활한 성능을 유지한다.

아키텍처와 데이터 처리

Hachi의 아키텍처는 메타데이터 인덱싱 엔진과 벡터 검색 엔진으로 구성된다. 메타데이터 인덱싱 엔진은 Nim으로 작성된 컬럼 지향 데이터베이스로, EXIF 데이터, 파일 크기, 위치 등의 정보를 저장하고 검색한다. 필요에 따라 특정 컬럼에 대한 보조 인덱스를 생성해 쿼리 속도를 높일 수 있다.

벡터 검색 엔진은 ML 모델이 생성한 임베딩 벡터를 샤드 단위로 디스크에 저장한다. 각 샤드는 numpy 텐서 형태로 저장되며, 검색 시 디스크에서 로드되어 내적 연산을 통해 유사도가 계산된다. 샤드 크기를 조정해 RAM 사용량을 제어할 수 있어, 싱글보드 컴퓨터부터 고성능 서버까지 다양한 환경에서 실행 가능하다.

인덱싱 파이프라인은 비동기 방식으로 설계되어 컴퓨팅 리소스를 최대한 활용한다. 한 번 읽은 원본 데이터를 해시 생성, 전처리, ML 모델 추론 등 여러 단계에서 재사용해 I/O 비용을 줄인다. 이미지 크기 조정, 색상 변환, 정규화 등의 작업을 단일 커널로 융합해 처리 속도를 높였다.

실용성 검증과 확장 가능성

개발자는 Pexels 데이터셋의 180GB 이미지를 대상으로 실제 테스트를 수행했다. 원격 서버 환경에서도 안정적인 검색 성능을 확인했으며, 50만 장 이상의 이미지에서 견고한 동작을 검증했다. 개발자는 현재 구조로 천만 장의 이미지도 처리 가능할 것으로 예상한다.

향후 계획으로는 구글 드라이브나 안드로이드 기기 등 원격 저장소를 앱에서 직접 인덱싱하는 기능이 포함된다. 개발자는 여러 재활용 스마트폰이나 싱글보드 컴퓨터로 구성된 클러스터를 통한 분산 쿼리 처리도 장기 목표로 제시했다.

현재 Windows와 Fedora 리눅스에서 테스트를 완료했으며, x64 아키텍처를 지원한다. 리눅스용 공유 객체는 glibc 2.27을 타겟으로 컴파일되어 대부분의 최신 배포판에서 즉시 실행 가능하다. 얼굴 인식을 제외한 대부분의 코드는 C 컴파일러만 있으면 사용자가 직접 확장할 수 있다.

오픈소스 정신과 지속 가능성

이 프로젝트는 인도 북부의 2단계 도시에서 진행되었으며, 개발자는 저축 없이 최소한의 고정 비용으로 프로젝트를 이어왔다. 지난 1년 반 동안 Samagata 재단과 FossUnited로부터 재정 지원을 받아 주요 작업을 완료할 수 있었다.

개발자는 프로젝트의 핵심 기능을 결코 타협하지 않으면서도 지속 가능한 방법을 모색 중이다. 모든 코드는 오픈소스로 공개될 예정이며, 사용자들이 자유롭게 수정하고 확장할 수 있도록 했다. 특히 Stb Image, LibWebp 같은 싱글 헤더 C 라이브러리를 활용해 의존성을 줄이고 코드의 이식성을 높였다.

개발자는 "AI 기업들이 오픈소스 코드와 예술 작품을 무단으로 사용하는 것에 분노한다"며 "작은 개발자나 커뮤니티가 운영하는 인프라에 대한 무분별한 공격이 정보 공유의 본질을 훼손하고 있다"고 비판했다. 그는 "대형 언어모델의 능력도 중요하지만, 일상 문제를 해결하는 작고 개인화된 모델의 잠재력을 믿는다"고 강조했다.

기술적 도전과 철학

개발 과정에서 가장 큰 도전은 여러 프로그래밍 언어와 런타임을 통합하는 것이었다. C와 Nim, Python을 오가며 각 언어의 경계와 런타임 가정을 이해해야 했다. 멀티스레드 환경에서의 디버깅은 특히 어려웠지만, 모든 구성 요소를 직접 컴파일할 수 있어 문제 추적이 가능했다.

개발자는 배치 처리와 캐싱이 병목 구간을 해결하는 두 가지 핵심 전략이라고 설명했다. 두 방법 모두 메모리 로드와 저장 명령을 최소화해 CPU 활용도를 높인다. 그러나 각 최적화는 가정을 수반하며, 과도한 최적화는 코드 리팩토링을 어렵게 만들 수 있어 적절한 선을 찾는 것이 중요하다고 강조했다.

AI 코딩 도구에 대해서는 "유용한 도구이지만, 원본 문서를 직접 찾아보는 것이 더 중요하다"는 입장이다. 그는 "한 주제를 깊이 공부하고 그 패턴을 전혀 다른 영역에 적용하는 인간 정신의 능력은 여전히 독특하다"며 "작성자의 톤과 동기가 중요하며, 흥미진진하게 쓴 글은 독자도 그 주제를 더 탐구하게 만든다"고 말했다.

Hachi 프로젝트는 개인 데이터 주권과 프라이버시 보호에 대한 관심이 높아지는 시점에서 의미 있는 대안을 제시한다. 최소한의 리소스로 최대한의 기능을 구현하려는 시도는 오픈소스 커뮤니티에 새로운 영감을 줄 것으로 기대된다.

한국정보기술신문 정보통신분과 김민재 기자 news@kitpa.org