Get Started Guide#
Time to Complete: 30 mins
Programming Language: Python
Get Started#
Prerequisites#
Install Docker: Installation Guide.
Install Docker Compose: Installation Guide.
Install Intel Client GPU driver: Installation Guide.
Step 1: Get the docker images#
Option 1: build from source#
Clone the source code repository if you don’t have it
git clone https://github.com/open-edge-platform/edge-ai-suites.git -b release-2025.2.0
Start from metro-ai-suite
cd edge-ai-suites/metro-ai-suite
Run the commands to build images for the microservices:
git clone https://github.com/open-edge-platform/edge-ai-libraries.git
cd edge-ai-libraries/microservices
docker build -t dataprep-visualdata-milvus:latest --build-arg https_proxy=$https_proxy --build-arg http_proxy=$http_proxy --build-arg no_proxy=$no_proxy -f visual-data-preparation-for-retrieval/milvus/src/Dockerfile .
docker build -t retriever-milvus:latest --build-arg https_proxy=$https_proxy --build-arg http_proxy=$http_proxy --build-arg no_proxy=$no_proxy -f vector-retriever/milvus/src/Dockerfile .
cd vlm-openvino-serving
docker build -t vlm-openvino-serving:latest --build-arg https_proxy=$https_proxy --build-arg http_proxy=$http_proxy --build-arg no_proxy=$no_proxy -f docker/Dockerfile .
cd ../multimodal-embedding-serving
docker build -t multimodal-embedding-serving:latest --build-arg https_proxy=$https_proxy --build-arg http_proxy=$http_proxy --build-arg no_proxy=$no_proxy -f docker/Dockerfile .
cd ../../..
Run the command to build image for the application:
docker build -t visual-search-qa-app:latest --build-arg https_proxy=$https_proxy --build-arg http_proxy=$http_proxy --build-arg no_proxy=$no_proxy -f visual-search-question-and-answering/src/Dockerfile .
Option 2: use remote prebuilt images#
Set a remote registry by exporting environment variables:
export REGISTRY="intel/"
export TAG="2025.2.0"
Step 2: Prepare host directories for models and data#
mkdir -p $HOME/data
If you would like to test the application with a demo dataset, please continue and follow the instructions in the Try with a demo dataset section later in this guide.
Otherwise, if you would like to use your own data (images and video), make sure to put them all in the created data directory ($HOME/data in the example commands above) and make sure the created path matches with the HOST_DATA_PATH variable in deployment/docker-compose/env.sh BEFORE deploying the services.
Note
Supported media types are jpg, png, and mp4.
Step 3: Deploy#
Option1 (Recommended): Deploy with docker compose#
Go to the deployment files
cd visual-search-question-and-answering/ cd deployment/docker-compose/
Set up environment variables, note that you need to set models first
export EMBEDDING_MODEL_NAME="CLIP/clip-vit-h-14" # Replace with other models if needed export VLM_MODEL_NAME="Qwen/Qwen2.5-VL-7B-Instruct" # Replace with other models if needed source env.sh
Important
You must set
EMBEDDING_MODEL_NAMEandVLM_MODEL_NAMEbefore runningenv.sh. See Supported models for Multimodal Embedding Serving for available embedding models, and Supported models for VLM OpenVINO for available VLM models.For PRC users, set up the huggingface endpoint first:
export HF_ENDPOINT=https://hf-mirror.com
Ubuntu:
You might want to pay some attention to
DEVICE,VLM_DEVICEandEMBEDDING_DEVICEinenv.sh. By default, they areGPU.1, which applies to a standard hardware platform with an integrated GPU asGPU.0and a discrete GPU asGPU.1. You can refer to OpenVINO’s query device sample to learn more about how to identify which GPU index should be set.Note: The default volume directory for Milvus (the vector DB) data is under
/opt/volumes. If this directory is under constraint or you simply would like to store the data in a diffrent location, please set the environment variable viaexport DOCKER_VOLUME_DIRECTORY=<your_data_directory>. The Milvus data will be stored at${DOCKER_VOLUME_DIRECTORY}/volumesin such case.For EMT-S platform
If you are on an EMT-S platform, please set up the variables correspondingly by runningcd emt-s # go to emt-s specific files export EMBEDDING_MODEL_NAME="CLIP/clip-vit-h-14" # Replace with other models if needed export VLM_MODEL_NAME="Qwen/Qwen2.5-VL-7B-Instruct" # Replace with other models if needed source env.sh
Deploy with docker compose
docker compose -f compose_milvus.yaml up -d
It might take a while to start the services for the first time, as there are some models to be prepared.
Check if all microservices are up and runnning with docker compose -f compose_milvus.yaml ps
Output
NAME COMMAND SERVICE STATUS PORTS
dataprep-visualdata-milvus "uvicorn dataprep_vi…" dataprep-visualdata-milvus running (healthy) 0.0.0.0:9990->9990/tcp, :::9990->9990/tcp
milvus-etcd "etcd -advertise-cli…" milvus-etcd running (healthy) 2379-2380/tcp
milvus-minio "/usr/bin/docker-ent…" milvus-minio running (healthy) 0.0.0.0:9000-9001->9000-9001/tcp, :::9000-9001->9000-9001/tcp
milvus-standalone "/tini -- milvus run…" milvus-standalone running (healthy) 0.0.0.0:9091->9091/tcp, 0.0.0.0:19530->19530/tcp, :::9091->9091/tcp, :::19530->19530/tcp
multimodal-embedding gunicorn -b 0.0.0.0:8000 - ... Up (unhealthy) 0.0.0.0:9777->8000/tcp,:::9777->8000/tcp
retriever-milvus "uvicorn retriever_s…" retriever-milvus running (healthy) 0.0.0.0:7770->7770/tcp, :::7770->7770/tcp
visual-search-qa-app "streamlit run app.p…" visual-search-qa-app running (healthy) 0.0.0.0:17580->17580/tcp, :::17580->17580/tcp
vlm-openvino-serving "/bin/bash -c '/app/…" vlm-openvino-serving running (healthy) 0.0.0.0:9764->8000/tcp, :::9764->8000/tcp
Option2: Deploy in Kubernetes#
Please refer to Deploy with helm for details.
Try with a demo dataset#
*Applicable to deployment with Option 1 (docker compose deployment).
Prepare demo dataset DAVIS#
Create a prepare_demo_dataset.sh script as following
CONTAINER_IDS=$(docker ps -a --filter "status=running" -q | xargs -r docker inspect --format '{{.Config.Image}} {{.Id}}' | grep "dataprep-visualdata-milvus" | awk '{print $2}')
# Check if any containers were found
if [ -z "$CONTAINER_IDS" ]; then
echo "No containers found"
exit 0
fi
CONTAINER_IDS=($CONTAINER_IDS)
NUM_CONTAINERS=${#CONTAINER_IDS[@]}
docker exec -it ${CONTAINER_IDS[0]} bash -c "python example/example_utils.py -d DAVIS"
exit 0
Run the script and check your host data directory $HOME/data, see if DAVIS is there.
bash prepare_demo_dataset.sh
In order to save time, only a subset of the dataset would be processed. They are stored in $HOME/data/DAVIS/subset, use this path to do the next step.
This script only works when the dataprep-visualdata-milvus service is available.
Use it on Web UI#
Go to http://{host_ip}:17580 with a browser. Put the exact path to the subset of demo dataset (usually/home/user/data/DAVIS/subset, may vary according to your local username) into file directory on host. Click UpdataDB and wait for the uploading done.
Try searching with query text tractor, see if the results are correct.
Expected valid inputs are “car-race”, “deer”, “guitar-violin”, “gym”, “helicopter”, “carousel”, “monkeys-trees”, “golf”, “rollercoaster”, “horsejump-stick”, “planes-crossing”, “tractor”
Try ticking a search result, and ask a question in the leftside chatbox about the selected media.
Note
For each chat request, you may select either a single image, or multiple images, or a single video. Multiple videos or a collection of images+videos are not supported yet.
Performance#
You can check the end-to-end response time for each round of question-and-answering in the chat history.
Summary#
In this get started guide, you learned how to:
Build the microservice images
Deploy the application with the microservices
Try the application with a demo dataset
Learn More#
Check the System requirements
Explore more functionalities in Tutorials.
Understand the components, services, architecture, and data flow, in the Overview.