#!/bin/bash # Copyright (C) 2024 Intel Corporation # SPDX-License-Identifier: Apache-2.0 set -e IMAGE_REPO=${IMAGE_REPO:-"opea"} IMAGE_TAG=${IMAGE_TAG:-"latest"} echo "REGISTRY=IMAGE_REPO=${IMAGE_REPO}" echo "TAG=IMAGE_TAG=${IMAGE_TAG}" export REGISTRY=${IMAGE_REPO} export TAG=${IMAGE_TAG} export MODEL_CACHE=${model_cache:-"./data"} WORKPATH=$(dirname "$PWD") LOG_PATH="$WORKPATH/tests" ip_address=$(hostname -I | awk '{print $1}') function build_docker_images() { opea_branch=${opea_branch:-"main"} cd $WORKPATH/docker_image_build git clone --depth 1 --branch ${opea_branch} https://github.com/opea-project/GenAIComps.git pushd GenAIComps echo "GenAIComps test commit is $(git rev-parse HEAD)" docker build --no-cache -t ${REGISTRY}/comps-base:${TAG} --build-arg https_proxy=$https_proxy --build-arg http_proxy=$http_proxy -f Dockerfile . popd && sleep 1s git clone https://github.com/HabanaAI/vllm-fork.git && cd vllm-fork VLLM_FORK_VER=v0.7.2+Gaudi-1.21.0 git checkout ${VLLM_FORK_VER} &> /dev/null && cd ../ echo "Build all the images with --no-cache, check docker_image_build.log for details..." service_list="chatqna chatqna-ui dataprep retriever vllm-gaudi guardrails nginx" docker compose -f build.yaml build ${service_list} --no-cache > ${LOG_PATH}/docker_image_build.log docker images && sleep 1s } function start_services() { cd $WORKPATH/docker_compose/intel/hpu/gaudi export EMBEDDING_MODEL_ID="BAAI/bge-base-en-v1.5" export RERANK_MODEL_ID="BAAI/bge-reranker-base" export LLM_MODEL_ID="meta-llama/Meta-Llama-3-8B-Instruct" export NUM_CARDS=1 export INDEX_NAME="rag-redis" export HUGGINGFACEHUB_API_TOKEN=${HUGGINGFACEHUB_API_TOKEN} export host_ip=${ip_address} export GURADRAILS_MODEL_ID="meta-llama/Meta-Llama-Guard-2-8B" # Start Docker Containers docker compose -f compose_guardrails.yaml up -d > ${LOG_PATH}/start_services_with_compose.log n=0 until [[ "$n" -ge 200 ]]; do echo "n=$n" docker logs vllm-gaudi-server > vllm_service_start.log if grep -q "Warmup finished" vllm_service_start.log; then break fi sleep 5s n=$((n+1)) done # Make sure vllm guardrails service is ready m=0 until [[ "$m" -ge 200 ]]; do echo "m=$m" docker logs vllm-guardrails-server > vllm_guardrails_service_start.log if grep -q "Warmup finished" vllm_guardrails_service_start.log; then break fi sleep 5s m=$((m+1)) done } function validate_service() { local URL="$1" local EXPECTED_RESULT="$2" local SERVICE_NAME="$3" local DOCKER_NAME="$4" local INPUT_DATA="$5" HTTP_RESPONSE=$(curl --silent --write-out "HTTPSTATUS:%{http_code}" -X POST -d "$INPUT_DATA" -H 'Content-Type: application/json' "$URL") HTTP_STATUS=$(echo $HTTP_RESPONSE | tr -d '\n' | sed -e 's/.*HTTPSTATUS://') RESPONSE_BODY=$(echo $HTTP_RESPONSE | sed -e 's/HTTPSTATUS\:.*//g') docker logs ${DOCKER_NAME} >> ${LOG_PATH}/${SERVICE_NAME}.log # check response status if [ "$HTTP_STATUS" -ne "200" ]; then echo "[ $SERVICE_NAME ] HTTP status is not 200. Received status was $HTTP_STATUS" 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 } function validate_microservices() { # Check if the microservices are running correctly. # tei for embedding service validate_service \ "${ip_address}:8090/embed" \ "[[" \ "tei-embedding" \ "tei-embedding-gaudi-server" \ '{"inputs":"What is Deep Learning?"}' sleep 1m # retrieval can't curl as expected, try to wait for more time # retrieval microservice test_embedding=$(python3 -c "import random; embedding = [random.uniform(-1, 1) for _ in range(768)]; print(embedding)") validate_service \ "${ip_address}:7000/v1/retrieval" \ "retrieved_docs" \ "retrieval" \ "retriever-redis-server" \ "{\"text\":\"What is the revenue of Nike in 2023?\",\"embedding\":${test_embedding}}" # tei for rerank microservice validate_service \ "${ip_address}:8808/rerank" \ '{"index":1,"score":' \ "tei-rerank" \ "tei-reranking-gaudi-server" \ '{"query":"What is Deep Learning?", "texts": ["Deep Learning is not...", "Deep learning is..."]}' # vllm for llm service validate_service \ "${ip_address}:8008/v1/chat/completions" \ "content" \ "vllm-llm" \ "vllm-gaudi-server" \ '{"model": "meta-llama/Meta-Llama-3-8B-Instruct", "messages": [{"role": "user", "content": "What is Deep Learning?"}], "max_tokens":17}' # guardrails microservice validate_service \ "${ip_address}:9090/v1/guardrails" \ "Violated policies" \ "guardrails" \ "guardrails-gaudi-server" \ '{"text":"How do you buy a tiger in the US?"}' } function validate_megaservice() { # Curl the Mega Service validate_service \ "${ip_address}:8888/v1/chatqna" \ "Nike" \ "mega-chatqna" \ "chatqna-gaudi-guardrails-server" \ '{"messages": "What is the revenue of Nike in 2023?"}' } function validate_frontend() { cd $WORKPATH/ui/svelte local conda_env_name="OPEA_e2e" export PATH=${HOME}/miniforge3/bin/:$PATH if conda info --envs | grep -q "$conda_env_name"; then echo "$conda_env_name exist!" else conda create -n ${conda_env_name} python=3.12 -y fi source activate ${conda_env_name} sed -i "s/localhost/$ip_address/g" playwright.config.ts conda install -c conda-forge nodejs=22.6.0 -y npm install && npm ci && npx playwright install --with-deps node -v && npm -v && pip list exit_status=0 npx playwright test || exit_status=$? if [ $exit_status -ne 0 ]; then echo "[TEST INFO]: ---------frontend test failed---------" exit $exit_status else echo "[TEST INFO]: ---------frontend test passed---------" fi } function stop_docker() { cd $WORKPATH/docker_compose/intel/hpu/gaudi docker compose -f compose_guardrails.yaml down } function main() { echo "::group::stop_docker" stop_docker echo "::endgroup::" echo "::group::build_docker_images" if [[ "$IMAGE_REPO" == "opea" ]]; then build_docker_images; fi echo "::endgroup::" echo "::group::start_services" start_services echo "::endgroup::" echo "::group::validate_microservices" validate_microservices echo "::endgroup::" echo "::group::validate_megaservice" validate_megaservice echo "::endgroup::" echo "::group::validate_frontend" validate_frontend echo "::endgroup::" echo "::group::stop_docker" stop_docker echo "::endgroup::" docker system prune -f } main