지금까지는 ChromaDB를 로컬에서 실행해서 해당 runtime이 끝나면 저장된 것들이 전부 사라졌다. 장기적으로 ChromaDB를 사용하기 위해서 Docker 환경에서 실행한뒤 collection별 (폴더라고 생각하면 됨)로 저장하는 방법에 대해서 알아보았다. Mac과 Window환경 모두 테스트 해보았고, Window에서는 설정 과정에서 약간의 에러가 있었지만 해결하였다.
ChromaDB 공식 문서의 Deployment 부분에서 잘 설명해주고 있다.
git clone https://github.com/chroma-core/chroma
우선 chroma github을 클론해온다. 이후 해당 폴더에 들어가서 docker compose up을 하면 된다.
cd chroma
docker-compose up -d --build
localhost:8000 포트를 열어보면 정상적으로 실행되는 것을 확인할 수 있다.
똑같이 클론해온 파일로 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을 하면 정상적으로 실행된다.
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을 바로 진행하고 저장하는 방식이므로 이와 관련한 내용을 다음 글에서 다루겠다.