Skip to content
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
5e2a6d6
modify service port for qdrant ci test
letonghan Aug 12, 2024
7cc7974
Merge branch 'main' into chatqna_test/qdrant
chensuyue Aug 12, 2024
d25011e
update funcs
letonghan Aug 12, 2024
7683a35
Merge branch 'chatqna_test/qdrant' of https://github.com/letonghan/Ge…
letonghan Aug 12, 2024
194e280
Merge branch 'main' into chatqna_test/qdrant
letonghan Aug 12, 2024
d20a6db
unify param name
letonghan Aug 12, 2024
c7f948c
Merge branch 'chatqna_test/qdrant' of https://github.com/letonghan/Ge…
letonghan Aug 12, 2024
bfc4a3f
Merge branch 'main' of https://github.com/letonghan/GenAIExamples int…
letonghan Aug 12, 2024
3898ac1
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Aug 12, 2024
a11ebe2
Merge branch 'main' of https://github.com/letonghan/GenAIExamples int…
letonghan Aug 12, 2024
239e610
add dataprep test
letonghan Aug 12, 2024
6f73132
update
letonghan Aug 12, 2024
5da2874
Merge branch 'main' of https://github.com/letonghan/GenAIExamples int…
letonghan Aug 13, 2024
2d8891f
update with refined dataprep qdrant
letonghan Aug 13, 2024
c488418
Merge branch 'main' into chatqna_test/qdrant
letonghan Aug 14, 2024
71f5e30
update readme_qdrant
letonghan Aug 14, 2024
fcc44bd
Merge branch 'main' of https://github.com/letonghan/GenAIExamples int…
letonghan Aug 14, 2024
5ae93b4
Merge branch 'chatqna_test/qdrant' of https://github.com/letonghan/Ge…
letonghan Aug 14, 2024
796b245
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Aug 14, 2024
525b9d7
Merge branch 'main' into chatqna_test/qdrant
letonghan Aug 14, 2024
e411ac9
update
letonghan Aug 14, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 16 additions & 22 deletions ChatQnA/docker/xeon/compose_qdrant.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,21 @@ services:
- qdrant-vector-db
- tei-embedding-service
ports:
- "6000:6000"
- "6043:6007"
environment:
no_proxy: ${no_proxy}
http_proxy: ${http_proxy}
https_proxy: ${https_proxy}
QDRANT: ${host_ip}
QDRANT_HOST: ${QDRANT_HOST}
QDRANT_PORT: 6333
COLLECTION_NAME: ${INDEX_NAME}
TEI_ENDPOINT: ${TEI_EMBEDDING_ENDPOINT}
HUGGINGFACEHUB_API_TOKEN: ${HUGGINGFACEHUB_API_TOKEN}
tei-embedding-service:
image: ghcr.io/huggingface/text-embeddings-inference:cpu-1.2
image: ghcr.io/huggingface/text-embeddings-inference:cpu-1.5
container_name: tei-embedding-server
ports:
- "6006:80"
- "6040:80"
volumes:
- "./data:/data"
shm_size: 1g
Expand All @@ -47,39 +47,35 @@ services:
depends_on:
- tei-embedding-service
ports:
- "6000:6000"
- "6044:6000"
ipc: host
environment:
no_proxy: ${no_proxy}
http_proxy: ${http_proxy}
https_proxy: ${https_proxy}
TEI_EMBEDDING_ENDPOINT: ${TEI_EMBEDDING_ENDPOINT}
LANGCHAIN_API_KEY: ${LANGCHAIN_API_KEY}
LANGCHAIN_TRACING_V2: ${LANGCHAIN_TRACING_V2}
LANGCHAIN_PROJECT: "opea-embedding-service"
restart: unless-stopped
retriever:
image: opea/retriever-qdrant:latest
container_name: retriever-qdrant-server
depends_on:
- qdrant-vector-db
ports:
- "7000:7000"
- "6045:7000"
ipc: host
environment:
no_proxy: ${no_proxy}
http_proxy: ${http_proxy}
https_proxy: ${https_proxy}
QDRANT_HOST: ${host_ip}
QDRANT_HOST: ${QDRANT_HOST}
QDRANT_PORT: 6333
INDEX_NAME: ${INDEX_NAME}
TEI_EMBEDDING_ENDPOINT: ${TEI_EMBEDDING_ENDPOINT}
restart: unless-stopped
tei-reranking-service:
image: ghcr.io/huggingface/text-embeddings-inference:cpu-1.2
container_name: tei-reranking-server
ports:
- "8808:80"
- "6041:80"
volumes:
- "./data:/data"
shm_size: 1g
Expand All @@ -97,7 +93,7 @@ services:
depends_on:
- tei-reranking-service
ports:
- "8000:8000"
- "6046:8000"
ipc: host
environment:
no_proxy: ${no_proxy}
Expand All @@ -107,15 +103,12 @@ services:
HUGGINGFACEHUB_API_TOKEN: ${HUGGINGFACEHUB_API_TOKEN}
HF_HUB_DISABLE_PROGRESS_BARS: 1
HF_HUB_ENABLE_HF_TRANSFER: 0
LANGCHAIN_API_KEY: ${LANGCHAIN_API_KEY}
LANGCHAIN_TRACING_V2: ${LANGCHAIN_TRACING_V2}
LANGCHAIN_PROJECT: "opea-reranking-service"
restart: unless-stopped
tgi-service:
image: ghcr.io/huggingface/text-generation-inference:2.1.0
container_name: tgi-service
ports:
- "9009:80"
- "6042:80"
volumes:
- "./data:/data"
shm_size: 1g
Expand All @@ -133,7 +126,7 @@ services:
depends_on:
- tgi-service
ports:
- "9000:9000"
- "6047:9000"
ipc: host
environment:
no_proxy: ${no_proxy}
Expand All @@ -143,9 +136,6 @@ services:
HUGGINGFACEHUB_API_TOKEN: ${HUGGINGFACEHUB_API_TOKEN}
HF_HUB_DISABLE_PROGRESS_BARS: 1
HF_HUB_ENABLE_HF_TRANSFER: 0
LANGCHAIN_API_KEY: ${LANGCHAIN_API_KEY}
LANGCHAIN_TRACING_V2: ${LANGCHAIN_TRACING_V2}
LANGCHAIN_PROJECT: "opea-llm-service"
restart: unless-stopped
chaqna-xeon-backend-server:
image: opea/chatqna:latest
Expand All @@ -160,16 +150,20 @@ services:
- tgi-service
- llm
ports:
- "8888:8888"
- "8912:8888"
environment:
- no_proxy=${no_proxy}
- https_proxy=${https_proxy}
- http_proxy=${http_proxy}
- MEGA_SERVICE_HOST_IP=${MEGA_SERVICE_HOST_IP}
- EMBEDDING_SERVICE_HOST_IP=${EMBEDDING_SERVICE_HOST_IP}
- EMBEDDING_SERVICE_PORT=${EMBEDDING_SERVICE_PORT}
- RETRIEVER_SERVICE_HOST_IP=${RETRIEVER_SERVICE_HOST_IP}
- RETRIEVER_SERVICE_PORT=${RETRIEVER_SERVICE_PORT}
- RERANK_SERVICE_HOST_IP=${RERANK_SERVICE_HOST_IP}
- RERANK_SERVICE_PORT=${RERANK_SERVICE_PORT}
- LLM_SERVICE_HOST_IP=${LLM_SERVICE_HOST_IP}
- LLM_SERVICE_PORT=${LLM_SERVICE_PORT}
ipc: host
restart: always
chaqna-xeon-ui-server:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ function start_services() {
export EMBEDDING_MODEL_ID="BAAI/bge-base-en-v1.5"
export RERANK_MODEL_ID="BAAI/bge-reranker-base"
export LLM_MODEL_ID="Intel/neural-chat-7b-v3-3"
export TEI_EMBEDDING_ENDPOINT="http://${ip_address}:6006"
export TEI_RERANKING_ENDPOINT="http://${ip_address}:8808"
export TGI_LLM_ENDPOINT="http://${ip_address}:9009"
export TEI_EMBEDDING_ENDPOINT="http://${ip_address}:6040"
export TEI_RERANKING_ENDPOINT="http://${ip_address}:6041"
export TGI_LLM_ENDPOINT="http://${ip_address}:6042"
export QDRANT_HOST=${ip_address}
export QDRANT_PORT=6333
export INDEX_NAME="rag-qdrant"
Expand All @@ -47,8 +47,12 @@ function start_services() {
export RETRIEVER_SERVICE_HOST_IP=${ip_address}
export RERANK_SERVICE_HOST_IP=${ip_address}
export LLM_SERVICE_HOST_IP=${ip_address}
export BACKEND_SERVICE_ENDPOINT="http://${ip_address}:8888/v1/chatqna"
export DATAPREP_SERVICE_ENDPOINT="http://${ip_address}:6007/v1/dataprep"
export EMBEDDING_SERVICE_PORT=6044
export RETRIEVER_SERVICE_PORT=6045
export RERANK_SERVICE_PORT=6046
export LLM_SERVICE_PORT=6047
export BACKEND_SERVICE_ENDPOINT="http://${ip_address}:8912/v1/chatqna"
export DATAPREP_SERVICE_ENDPOINT="http://${ip_address}:6043/v1/dataprep"

sed -i "s/backend_address/$ip_address/g" $WORKPATH/docker/ui/svelte/.env

Expand Down Expand Up @@ -82,24 +86,34 @@ function validate_services() {
local DOCKER_NAME="$4"
local INPUT_DATA="$5"

local HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" -X POST -d "$INPUT_DATA" -H 'Content-Type: application/json' "$URL")
if [ "$HTTP_STATUS" -eq 200 ]; then
echo "[ $SERVICE_NAME ] HTTP status is 200. Checking content..."
if [[ $SERVICE_NAME == *"dataprep_upload_file"* ]]; then
cd $LOG_PATH
HTTP_RESPONSE=$(curl --silent --write-out "HTTPSTATUS:%{http_code}" -X POST -F 'files=@./dataprep_file.txt' -H 'Content-Type: multipart/form-data' "$URL")
elif [[ $SERVICE_NAME == *"dataprep_upload_link"* ]]; then
HTTP_RESPONSE=$(curl --silent --write-out "HTTPSTATUS:%{http_code}" -X POST -F 'link_list=["https://www.ces.tech/"]' "$URL")
else
HTTP_RESPONSE=$(curl --silent --write-out "HTTPSTATUS:%{http_code}" -X POST -d "$INPUT_DATA" -H 'Content-Type: application/json' "$URL")
fi
HTTP_STATUS=$(echo $HTTP_RESPONSE | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')
RESPONSE_BODY=$(echo $HTTP_RESPONSE | sed -e 's/HTTPSTATUS\:.*//g')

local CONTENT=$(curl -s -X POST -d "$INPUT_DATA" -H 'Content-Type: application/json' "$URL" | tee ${LOG_PATH}/${SERVICE_NAME}.log)
docker logs ${DOCKER_NAME} >> ${LOG_PATH}/${SERVICE_NAME}.log

if echo "$CONTENT" | grep -q "$EXPECTED_RESULT"; then
echo "[ $SERVICE_NAME ] Content is as expected."
else
echo "[ $SERVICE_NAME ] Content does not match the expected result: $CONTENT"
docker logs ${DOCKER_NAME} >> ${LOG_PATH}/${SERVICE_NAME}.log
exit 1
fi
else
# check response status
if [ "$HTTP_STATUS" -ne "200" ]; then
echo "[ $SERVICE_NAME ] HTTP status is not 200. Received status was $HTTP_STATUS"
docker logs ${DOCKER_NAME} >> ${LOG_PATH}/${SERVICE_NAME}.log
exit 1
else
echo "[ $SERVICE_NAME ] HTTP status is 200. Checking content..."
fi
# check response body
if [[ "$RESPONSE_BODY" != *"$EXPECTED_RESULT"* ]]; then
echo "[ $SERVICE_NAME ] Content does not match the expected result: $RESPONSE_BODY"
exit 1
else
echo "[ $SERVICE_NAME ] Content is as expected."
fi

sleep 1s
}

Expand All @@ -108,69 +122,82 @@ function validate_microservices() {

# tei for embedding service
validate_services \
"${ip_address}:6006/embed" \
"\[\[" \
"${ip_address}:6040/embed" \
"[[" \
"tei-embedding" \
"tei-embedding-server" \
'{"inputs":"What is Deep Learning?"}'

# embedding microservice
validate_services \
"${ip_address}:6000/v1/embeddings" \
'"text":"What is Deep Learning?","embedding":\[' \
"${ip_address}:6044/v1/embeddings" \
'"text":"What is Deep Learning?","embedding":[' \
"embedding" \
"embedding-tei-server" \
'{"text":"What is Deep Learning?"}'

sleep 1m # retrieval can't curl as expected, try to wait for more time
# test /v1/dataprep upload file
echo "Deep learning is a subset of machine learning that utilizes neural networks with multiple layers to analyze various levels of abstract data representations. It enables computers to identify patterns and make decisions with minimal human intervention by learning from large amounts of data." > $LOG_PATH/dataprep_file.txt
validate_services \
"${ip_address}:6043/v1/dataprep" \
"Data preparation succeeded" \
"dataprep_upload_file" \
"dataprep-qdrant-server"

# test upload link
validate_services \
"${ip_address}:6043/v1/dataprep" \
"Data preparation succeeded" \
"dataprep_upload_link" \
"dataprep-qdrant-server"

# retrieval microservice
test_embedding=$(python3 -c "import random; embedding = [random.uniform(-1, 1) for _ in range(768)]; print(embedding)")
validate_services \
"${ip_address}:7000/v1/retrieval" \
" " \
"${ip_address}:6045/v1/retrieval" \
"retrieved_docs" \
"retrieval" \
"retriever-qdrant-server" \
"{\"text\":\"What is the revenue of Nike in 2023?\",\"embedding\":${test_embedding}}"
"{\"text\":\"What is Deep Learning?\",\"embedding\":${test_embedding}}"

# tei for rerank microservice
validate_services \
"${ip_address}:8808/rerank" \
"${ip_address}:6041/rerank" \
'{"index":1,"score":' \
"tei-rerank" \
"tei-reranking-server" \
'{"query":"What is Deep Learning?", "texts": ["Deep Learning is not...", "Deep learning is..."]}'

# rerank microservice
validate_services \
"${ip_address}:8000/v1/reranking" \
"${ip_address}:6046/v1/reranking" \
"Deep learning is..." \
"rerank" \
"reranking-tei-xeon-server" \
'{"initial_query":"What is Deep Learning?", "retrieved_docs": [{"text":"Deep Learning is not..."}, {"text":"Deep learning is..."}]}'

# tgi for llm service
validate_services \
"${ip_address}:9009/generate" \
"${ip_address}:6042/generate" \
"generated_text" \
"tgi-llm" \
"tgi-service" \
'{"inputs":"What is Deep Learning?","parameters":{"max_new_tokens":17, "do_sample": true}}'

# llm microservice
validate_services \
"${ip_address}:9000/v1/chat/completions" \
"${ip_address}:6047/v1/chat/completions" \
"data: " \
"llm" \
"llm-tgi-server" \
'{"query":"What is Deep Learning?"}'
'{"query":"Deep Learning"}'

}

function validate_megaservice() {
# Curl the Mega Service
validate_services \
"${ip_address}:8888/v1/chatqna" \
"${ip_address}:8912/v1/chatqna" \
"billion" \
"mega-chatqna" \
"chatqna-xeon-backend-server" \
Expand All @@ -182,13 +209,10 @@ function validate_frontend() {
cd $WORKPATH/docker/ui/svelte
local conda_env_name="OPEA_e2e"
export PATH=${HOME}/miniforge3/bin/:$PATH
# conda remove -n ${conda_env_name} --all -y
# conda create -n ${conda_env_name} python=3.12 -y
source activate ${conda_env_name}

sed -i "s/localhost/$ip_address/g" playwright.config.ts

# conda install -c conda-forge nodejs -y
npm install && npm ci && npx playwright install --with-deps
node -v && npm -v && pip list

Expand All @@ -205,7 +229,7 @@ function validate_frontend() {

function stop_docker() {
cd $WORKPATH/docker/xeon
docker compose stop && docker compose rm -f
docker compose -f compose_qdrant.yaml stop && docker compose -f compose_qdrant.yaml rm -f
}

function main() {
Expand Down