Docker에서 ChromaDB 사용하기(1)

JeongYun Lee·2024년 4월 29일
0

LLM

목록 보기
5/7

chromadb_docker

지금까지는 ChromaDB를 로컬에서 실행해서 해당 runtime이 끝나면 저장된 것들이 전부 사라졌다. 장기적으로 ChromaDB를 사용하기 위해서 Docker 환경에서 실행한뒤 collection별 (폴더라고 생각하면 됨)로 저장하는 방법에 대해서 알아보았다. Mac과 Window환경 모두 테스트 해보았고, Window에서는 설정 과정에서 약간의 에러가 있었지만 해결하였다.

ChromaDB 공식 문서의 Deployment 부분에서 잘 설명해주고 있다.

설치

Mac

git clone https://github.com/chroma-core/chroma

우선 chroma github을 클론해온다. 이후 해당 폴더에 들어가서 docker compose up을 하면 된다.

cd chroma
docker-compose up -d --build

localhost:8000 포트를 열어보면 정상적으로 실행되는 것을 확인할 수 있다.

Window

똑같이 클론해온 파일로 docker compose를 해주면 server-1 | exec /docker_entrypoint.sh: no such file or directory 이런 에러가 발생한다. 깃헙의 이 이슈를 보면 동일한 에러가 발생했음을 알 수 있는데 다들 명확한 이유는 모르는 것 같다. 하지만 누군가의 답변을 통해 해결할 수 있었다. Dockerfile을 전부 수정하라는 것.

FROM python:3.11-slim-bookworm AS builder
ARG REBUILD_HNSWLIB
RUN apt-get update --fix-missing && apt-get install -y --fix-missing \
    build-essential \
    gcc \
    g++ \
    cmake \
    autoconf && \
    rm -rf /var/lib/apt/lists/* && \
    mkdir /install

WORKDIR /install

COPY ./requirements.txt requirements.txt

RUN pip install --no-cache-dir --upgrade --prefix="/install" -r requirements.txt
RUN if [ "$REBUILD_HNSWLIB" = "true" ]; then pip install --no-binary :all: --force-reinstall --no-cache-dir --prefix="/install" chroma-hnswlib; fi

FROM python:3.11-slim-bookworm AS final

RUN mkdir /chroma
WORKDIR /chroma

COPY --from=builder /install /usr/local
COPY ./bin/docker_entrypoint.sh /docker_entrypoint.sh
COPY ./ /chroma

RUN apt-get update --fix-missing && apt-get install -y curl && \
    chmod +x /docker_entrypoint.sh && \
    rm -rf /var/lib/apt/lists/*

ENV CHROMA_HOST_ADDR "0.0.0.0"
ENV CHROMA_HOST_PORT 8000
ENV CHROMA_WORKERS 1
ENV CHROMA_LOG_CONFIG "chromadb/log_config.yml"
ENV CHROMA_TIMEOUT_KEEP_ALIVE 30

EXPOSE 8000

ENTRYPOINT ["/bin/bash", "-c", "uvicorn chromadb.app:app --workers ${CHROMA_WORKERS} --host ${CHROMA_HOST_ADDR} --port ${CHROMA_HOST_PORT} --proxy-headers --log-config ${CHROMA_LOG_CONFIG} --timeout-keep-alive ${CHROMA_TIMEOUT_KEEP_ALIVE}"]

chroma 폴더에 있는 Dockerfile을 전부 삭제하고 위 코드로 수정한 뒤 다시 docker compose up을 하면 정상적으로 실행된다.

Python에서 사용하기

ipynb는 chroma 폴더 안에 생성해야 한다.

import chromadb
chroma_client = chromadb.HttpClient(host="localhost", port=8000)
print(chroma_client.list_collections())

client를 설정해주는데, localhost:8000으로 열었으므로 그대로 설정해준다. 초기에 Collection list를 확인해보면 아무것도 나오지 않는다.

새로운 컬렉션 만들기

collection = chroma_client.create_collection(name="new_collection")
print(chroma_client.list_collections())

컬렉션 삭제하기

chroma_client.delete_collection(
    name="new_collection"
)

컬렉션 데이터 확인하기

collection = chroma_client.get_collection("new_collection")
collection.peek()

collection.peek()을 하면 저장된 데이터를 확인할 수 있다. 현재는 데이터를 넣지 않았으므로 아무 값도 들어가지 않을 것이다.

공식 문서에서 보면 collection.add로 데이터를 넣는 예시가 있다. 그러나 내가 원하는 방식은 text를 넣었을 때 LLM model을 활용해서 embedding을 바로 진행하고 저장하는 방식이므로 이와 관련한 내용을 다음 글에서 다루겠다.

profile
궁금한 건 많지만, 천천히 알아가는 중입니다

0개의 댓글