데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      에이닷 RAG 기능 개발을 위한 Qdrant 벡터 DB 구축 (from source tarball)

      jgs0344 24.09.27
      15,138 7 1
      DEVOTEE 요약
      에이닷의 맞춤형 모델을 위해 RAG 기능 활용이 필요하며, Qdrant VectorDB 구축 내용을 공유합니다. On-premise 환경에서 Kubernetes와 Docker 방식을 검토했지만, 독립 서버 호스팅을 위해 소스 tarball을 이용한 컴파일 방식을 채택했습니다. Rust Toolchain 설치부터 필수 라이브러리 설정과 Qdrant 소스 다운로드 및 컴파일, 클러스터 구성을 통해 Qdrant 운영을 완료했습니다.
      DEVOTEE 추천 블로그

      에이닷에서 파인튜닝을 통해 각 도메인별 특화 데이터를 추가 학습시켜 맞춤형 모델을 만들고 있지만

      실시간으로 업데이트 되는 동적인 데이터에 대한 대응 그리고 할루시네션 억제, 모델 외부 데이터의 대한 접근을 위해서는 RAG 기능 활용하는게 옳은 선택이라고 합니다.

      RAG 기능 구현에 있어 VectorDB는 필수 솔루션이며, 여러 VectorDB 중에서 현재 플랫폼에서 스테이징으로 이용하고 있는 Qdrant 구축 내용을 공유하고자 합니다.

      일반적인 Cloud 솔루션, Kubernetes , Docker 방식이 아닌 정통(?) 방식의 source tarball를 이용한 컴파일 및 Qdrant Cluster 구성방식 입니다.


      On-premise에서 Qdrant 구축 방법 ?

      https://qdrant.tech/documentation/guides/installation/

      위 링크 내용과 같이 Qdrant 설치에 있어 추천하는 Production 방식은 Qdrant Cloud, Kubernetes Helm, Qdrant Kubernetes Operator, Docker and Docker Compose 입니다.

      플랫폼에서는 대부분 On-premise 환경을 이용하기 때문에 Kubernetes와 Docker 방식이 적합한걸로 판단되었습니다.

      현재 내부 정책상 Redis, MongoDB, MySQL, Kafka 등 플랫폼에서 사용하는 주요 stateful 솔루션은 독립된 서버 호스트를 이용 Cluster로 구성하여 이용하고 있습니다.

      단일 솔루션의 장애가 다른 솔루션으로 전파되는걸 방지하는 목적이며, 그렇기 때문에 Kubernetes 방식은 차선택으로 우선순위가 밀리게 되었습니다.

      Docker 방식으로 구성을 검토하면서, Qdrant github의 Dockerfile 내부에서 소스파일 컴파일을 진행하는걸 확인했습니다.

      https://github.com/qdrant/qdrant/blob/master/Dockerfile

      image.png

      위 내용을 보면서 추가적인 Docker 레이어 없이 프로세스를 직접 컨트롤 할 수 있는 바이너리 형태로 서비스 운영이 가능하다고 판단하여 source tarball를 이용한 소스컴파일로 서비스 구성을 결정하였습니다.


      소스 컴파일은 Qdrant에서 추천하는 방식은 아닙니다. 그렇기 때문인지 컴파일을 위한 설명이 매우 미비합니다.

      image.png

      Qdratn Github의 Dockerfile을 참고하여 컴파일 과정을 이해 하였고 아래 내용부터는 해당 과정을 정리하였습니다.


      Qdrant 소스 컴파일

      구성 환경

      • Env : On-premise

      • Node : Cluster 구성을 위해 Baremetal 노드 3대 (VM구성시 최소 메모리는 6GB 이상 필요)

        • 서비스 운영 환경에 따라 스펙이 변경되어야 하므로 상세 스펙은 생략

        • 컴파일시 실제 메모리 사용이 6GB이상 발생하는것 확인 되었습니다.

      • OS : RHEL 8.10 (On-premise 데이터센터 표준정책 OS 버전)

      • Network : 각 노드가 Master 역할을 하며, HA 위해 L4 스위치 이용하는걸 추천합니다.

      소스 컴파일

      라이브러리 및 소스 다운로드로 위해 모든 노드들은 임시로 Outbound Any Open 된 상태가 되어야 합니다.

      참고로 Qdrant Github releases 에서 x86_64 범용 바이너리를 패키지를 제공하나 RHEL 8.x , RHEL 9.x , CentOS Stream 9 에서는 gcc 및 주요 라이브러리 버전 이슈로 사용이 어렵습니다.

      https://github.com/qdrant/qdrant/releases/download/v1.11.3/qdrant-x86_64-unknown-linux-gnu.tar.gz

      Rust Toolchain 설치

      Qdrant는 Rust 언어로 개발되었기 때문에 컴파일을 위해 Rust ToolCain 설치가 우선되어야 합니다.

      설치는 공식 설치 스크립트를 통해 간단히 설치가 가능합니다.

      • 3개 노드에 동일하게 진행합니다.

      # 공식 사이트 (https://www.rust-lang.org/learn/get-started) 참고
      curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

      Qdrant 실행계정으로 설치 진행합니다.

      image.png

      image.png


      설치 안내에 따라 환경파일을 재로딩을 하면 rust 설치 완료 여부를 확인 할 수 있습니다.

      . "$HOME/.cargo/env"
      또는
      source ~/.bash_profile

      image.png

      필수 라이브러리 설치
      • 3개 노드에 동일하게 진행합니다.

      • clang, lld, cmake, jq, libunwind-devel, protobuf 패키지가 필요 합니다.

      • Dockerfile 기준에서는 mold라는 linker가 필요하지만 실제 서비스 성능이 아닌 컴파일시 object link 성능 향상으로 컴파일 속도를 높이는 용도로 필수 라이브러리가 아닙니다.

        특히 RHEL 8 기반에선 라이브러리 버전 이슈가 있어 설치는 생략합니다.

      sudo yum -y install clang lld cmake jq libunwind-devel
      # RHEL 8.10 제공 protobuf 패키지는 버전이 3.5.0 으로 너무 낮음
      # protobuf-c-1.3.0-8.el8.x86_64
      # protobuf-3.5.0-15.el8.x86_64
      # protobuf-compiler-3.5.0-15.el8.x86_64
      # protobuf-devel-3.5.0-15.el8.x86_64
      # https://cbs.centos.org/koji/buildinfo?buildID=37604 에서 제공된 패키지를 활용
      wget https://cbs.centos.org/kojifiles/packages/protobuf/3.19.0/2.el8/x86_64/protobuf-3.19.0-2.el8.x86_64.rpm
      wget https://cbs.centos.org/kojifiles/packages/protobuf/3.19.0/2.el8/x86_64/protobuf-compiler-3.19.0-2.el8.x86_64.rpm
      wget https://cbs.centos.org/kojifiles/packages/protobuf/3.19.0/2.el8/x86_64/protobuf-devel-3.19.0-2.el8.x86_64.rpm
      sudo yum localinstall -y protobuf-*

      image.png

      image.png

      Rust component 활성화
      • 3개 노드에 동일하게 진행합니다.

      • rustfmt - A tool for formatting Rust code according to style guidelines. (https://github.com/rust-lang/rustfmt) 로딩이 필요합니다.

      rustup component add rustfmt
      #설치가되면 아래 메시지 호출
      #info: component 'rustfmt' for target 'x86_64-unknown-linux-gnu' is up to date

      image.png

      Qdrant 소스 다운 및 컴파일
      • 1개 노드에서 컴파일 후 바이너리를 2개 노드로 복제하여 이용할 수 있습니다.

      • 'RUSTFLAGS="-Z threads=8"' 옵션을 주고 cargo build 하면 멀티 프로세스로 빌드 할 수 있을것으로 판단되나, Qdrant에서는 관련 레퍼런스가 전혀 없기 때문에 옵션없이 컴파일 합니다.

      • 임시 디렉토리 생성 및 소스 다운 & 싱글쓰레드로 컴파일하기 때문에 약 10분 이상 소요

      
      export QDRANT_VERSION="1.11.3"
      mkdir qdrant_src && cd qdrant_src
      wget https://github.com/qdrant/qdrant/archive/refs/tags/v${QDRANT_VERSION}.tar.gz
      tar xvzf v${QDRANT_VERSION}.tar.gz && cd qdrant-${QDRANT_VERSION}
      cargo build --profile release --features=stacktrace --bin qdrant

      image.png

      image.png

      image.png

      image.png

      image.png

      컴파일이 완료되면 target/release/ 이하에 'qdrant' 바이너리를 확인 할 수 있습니다.

      image.png

      서비스를 위한 디렉토리 구성과 Web UI 구성
      • 컴파일이 완료되면 target/release/ 이하에 'qdrant' 바이너리를 내부 표준 정책에 맞게 서비스 디렉토리로 복제합니다.

      • Web UI는 http 서비스포트와 동일하게 동작하고 qdrant 바이너리와 같이 경로에 static 디렉토리로 존재해야합니다.

      image.png

      # Web UI를 위한 static 경로생성 및 소스코드내 sync-web-ui.sh 스크립트를 활용하여 Web UI 소스코드를 다운로드 및 배포 진행합니다.
      mkdir /skt/program/qdrant/static && STATIC_DIR=/skt/program/qdrant/static ./tools/sync-web-ui.sh

      image.png

      image.png

      이후 qdrant를 실행하게 되면 아래와 같이 UI 접근이 가눙합니다.


      http://qdrant주소:6333/dashboard

      image.png

      Cluster 구성

      • Qdrant-node01~03 노드가 동일하게 설치가 되었으며, 이제 Cluster 구성을 합니다.

      • 모든 노드가 동일한 구성이 완료된 조건 입니다.

      config.yaml 설정은 Qdrant github 소스 파일을 참고하며, cluster 에서 enabled : true 로 변경이 필요합니다.

      https://github.com/qdrant/qdrant/blob/master/config/config.yaml

      image.png


      Cluster를 구성의 첫번째 단계는 아래와 같이 '--uri' 옵션을 주고 1번 노드를 먼저 활성화 해야합니다.

      ./qdrant --config-path /skt/program/qdrant/config/config.yaml --uri 'http://Qdrant-node01:6335'

      image.png

      그리고 남은 2개 노드가 해당 1번 노드와 연결을 하도록 서비스 실행시 '--bootstrap' 옵션을 1번 노드의 '--url' 과 동일한 정보를 입력합니다.

      ./qdrant --config-path /skt/program/qdrant/config/config.yaml --bootstrap 'http://Qdrant-node01:6335'

      image.png


      전체 연동은 빠르게 완료 되며, API를 통해 현재 Cluster 상태를 확인 할 수 있습니다.

      curl -s -X GET localhost:6333/cluster -H 'api-key: API_KEY' -s | jq

      image.png


      현재 Qdrant에서 제공하는 실행 스크립트 또는 systemd 등록용 설정들은 제공하지 않기 때문에 본인 서비스에 맞게 작성해야 합니다.

      작성시 1개 노드는 꼭 '--url' 옵션이 지정되어야 하며, 다른 노드들은 '--bootstrap' 옵션이 지정되어야 하며,

      모든 노드 전체 다운시 '--url' 옵션이 지정된 서버를 가장 먼저 활성화 하는거 추천 드립니다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      jgs0344 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기