mirror of
https://github.com/taosdata/TDengine
synced 2026-05-24 10:09:01 +00:00
224 lines
7.8 KiB
Bash
Executable file
224 lines
7.8 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
# docker run -d --name tdgpt -p 6090:6090 -p 5000:5000 -p 5001:5001 tdengine/tdengine-tdgpt-full:3.3.6.0
|
|
|
|
export PATH="/var/lib/taos/taosanode/venv/bin:$PATH"
|
|
export LANG=en_US.UTF-8
|
|
|
|
# Define the base path for models
|
|
MODEL_BASE_PATH="/var/lib/taos/taosanode/model"
|
|
MODEL_DIR_NAMES="${TAOS_MODELS:-tdtsfm}"
|
|
if [ -z "$EP_ENABLE" ]; then
|
|
ENDPOINT_ENABLE="False"
|
|
elif [ "$EP_ENABLE" == "True" ]; then
|
|
ENDPOINT_ENABLE="True"
|
|
else
|
|
ENDPOINT_ENABLE="False"
|
|
fi
|
|
|
|
# Define the five subdirectories under model path
|
|
declare -A MODEL_SUBDIRS=(
|
|
["chronos"]="model.safetensors"
|
|
["moirai"]="model.safetensors"
|
|
["tdtsfm"]="taos.pth"
|
|
["timemoe"]="model.safetensors"
|
|
["timesfm"]="model.safetensors"
|
|
["moment"]="model.safetensors"
|
|
)
|
|
declare -A MODEL_NAMES=(
|
|
["chronos"]="amazon/chronos-bolt-tiny"
|
|
["moirai"]="Salesforce/moirai-moe-1.0-R-small"
|
|
["tdtsfm"]="tdtsfm"
|
|
["timemoe"]="Maple728/TimeMoE-200M"
|
|
["timesfm"]="google/timesfm-2.0-500m-pytorch"
|
|
["moment"]="AutonLab/MOMENT-1-base"
|
|
)
|
|
|
|
declare -A MODEL_VENV_MAP=(
|
|
["chronos"]="/var/lib/taos/taosanode/venv_chronos"
|
|
["moirai"]="/var/lib/taos/taosanode/venv_moirai"
|
|
["tdtsfm"]="/var/lib/taos/taosanode/venv"
|
|
["timemoe"]="/var/lib/taos/taosanode/venv"
|
|
["timesfm"]="/var/lib/taos/taosanode/venv_timesfm"
|
|
# use the same venv as timesfm
|
|
["moment"]="/var/lib/taos/taosanode/venv_timesfm"
|
|
)
|
|
|
|
# Function to activate virtual environment
|
|
activate_venv() {
|
|
local model="$1"
|
|
echo "Activating virtual environment..."
|
|
local venv_path="${MODEL_VENV_MAP[$model]}"
|
|
echo "venv path: ${venv_path}"
|
|
# shellcheck disable=SC1091
|
|
source "${venv_path}/bin/activate"
|
|
}
|
|
|
|
# Function to execute startup script
|
|
execute_startup() {
|
|
local subdir="$1"
|
|
local model="$2"
|
|
local model_name="$3"
|
|
|
|
echo "Executing startup script for $subdir..."
|
|
|
|
# Activate virtual environment
|
|
activate_venv "${model}"
|
|
|
|
# Execute startup script if exists
|
|
local script_path="/usr/local/taos/taosanode/lib/taosanalytics/tsfmservice"
|
|
local startup_script="${script_path}/${model}-server.py"
|
|
if [ -f "${startup_script}" ]; then
|
|
echo "Running startup script: ${startup_script}"
|
|
cd "${script_path}" || exit
|
|
echo "Current directory: $(pwd)"
|
|
if [ "${model}" == "tdtsfm" ]; then
|
|
echo "Running command: nohup python3 /usr/local/taos/taosanode/lib/taosanalytics/tsfmservice/${model}-server.py &"
|
|
nohup python3 "${model}-server.py" --action server &
|
|
else
|
|
model_args=(--model-folder "${subdir}" --model-name "${model_name}")
|
|
if [ "${ENDPOINT_ENABLE}" == "True" ]; then
|
|
model_args+=(--enable-ep)
|
|
fi
|
|
echo "Running command: nohup python3 ${model}-server.py ${model_args[*]} &"
|
|
nohup python3 "${model}-server.py" "${model_args[@]}" &
|
|
fi
|
|
SERVER_PID=$!
|
|
if ps -p ${SERVER_PID} > /dev/null; then
|
|
echo "Startup script executed successfully for ${subdir}"
|
|
else
|
|
echo "Error: Startup script failed for ${subdir}"
|
|
exit 1
|
|
fi
|
|
else
|
|
echo "Startup script not found: ${startup_script}"
|
|
fi
|
|
}
|
|
|
|
# Function to download and setup
|
|
download_and_setup() {
|
|
local subdir="$1"
|
|
local model_name="$2"
|
|
local flag_file="$3"
|
|
|
|
echo "Downloading and setting up ${subdir}..."
|
|
|
|
# Execute download script if exists
|
|
local download_script="/usr/local/taos/taosanode/lib/taosanalytics/misc/model_downloader.py"
|
|
if [ -f "${download_script}" ]; then
|
|
echo "Running download script: ${download_script}"
|
|
cd /usr/local/taos/taosanode/lib/taosanalytics/misc || exit
|
|
echo "Current directory: $(pwd)"
|
|
echo "Running command: python3 model_downloader.py ${subdir} ${model_name} ${ENDPOINT_ENABLE}"
|
|
python3 model_downloader.py "${subdir}" "${model_name}" "${ENDPOINT_ENABLE}"
|
|
else
|
|
echo "Download script not found: ${download_script}"
|
|
fi
|
|
|
|
# Verify file was downloaded/created
|
|
if [ -f "${subdir}/${flag_file}" ]; then
|
|
echo "Successfully downloaded ${model_name}"
|
|
else
|
|
echo "Error: download Failed for ${subdir} "
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
find_model_file() {
|
|
local model="$1"
|
|
local base_path="${MODEL_BASE_PATH}/${model}"
|
|
local flag_file="${MODEL_SUBDIRS[$model]}"
|
|
|
|
# Priority 1: Check the root directory
|
|
if [ -f "${base_path}/${flag_file}" ] || [ -L "${base_path}/${flag_file}" ]; then
|
|
echo "${base_path}"
|
|
return 0
|
|
fi
|
|
|
|
# Priority 2: Check the snapshots directory (HuggingFace cache format)
|
|
local snapshot_dir
|
|
snapshot_dir=$(find "${base_path}/snapshots" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | head -n 1)
|
|
if [ -n "${snapshot_dir}" ] && [ -e "${snapshot_dir}/${flag_file}" ]; then
|
|
echo "${snapshot_dir}"
|
|
return 0
|
|
fi
|
|
|
|
# Priority 3: Check the blobs directory
|
|
local blob_file
|
|
blob_file=$(find "${base_path}/blobs" -name "*${flag_file}*" 2>/dev/null | head -n 1)
|
|
if [ -n "${blob_file}" ]; then
|
|
dirname "${blob_file}"
|
|
return 0
|
|
fi
|
|
|
|
return 1
|
|
}
|
|
|
|
# Check each directory and handle missing files
|
|
if mount | grep -q "${MODEL_BASE_PATH}"; then
|
|
echo "Model base path ${MODEL_BASE_PATH} is mounted."
|
|
# 检查 MODEL_DIR_NAMES 是否为空
|
|
if [ -z "${MODEL_DIR_NAMES}" ]; then
|
|
echo "WARNING: MODEL_DIR_NAMES is empty, skipping model processing"
|
|
else
|
|
echo "Processing models: ${MODEL_DIR_NAMES}"
|
|
IFS=',' read -ra MODEL_ARRAY <<< "${MODEL_DIR_NAMES}"
|
|
for model in "${MODEL_ARRAY[@]}"; do
|
|
# Check if model exists
|
|
if [[ ! ${MODEL_SUBDIRS[$model]+_} ]]; then
|
|
echo "Error: Unknown model '${model}'"
|
|
echo "Available models:" "${MODEL_SUBDIRS[@]}"
|
|
continue
|
|
fi
|
|
|
|
flag_file="${MODEL_SUBDIRS[$model]}"
|
|
subdir_path="$MODEL_BASE_PATH/$model"
|
|
model_name="${MODEL_NAMES[$model]}"
|
|
|
|
echo "Processing model: ${model}"
|
|
echo "model Directory: ${subdir_path}"
|
|
echo "model Name: ${model_name}"
|
|
|
|
# Check if subdirectory exists
|
|
if [ ! -d "${subdir_path}" ]; then
|
|
echo "Warning: Subdirectory ${subdir_path} does not exist, creating..."
|
|
mkdir -p "${subdir_path}"
|
|
fi
|
|
# Check if flag file exists
|
|
if [ -f "${subdir_path}/${flag_file}" ]; then
|
|
echo "Flag file ${flag_file} exists in ${subdir_path}, skipping download..."
|
|
# Execute startup script directly
|
|
execute_startup "${subdir_path}" "${model}" "${model_name}"
|
|
else
|
|
echo "Flag file ${flag_file} not found in ${subdir_path}, downloading..."
|
|
# Download and setup first
|
|
download_and_setup "${subdir_path}" "${model_name}" "${flag_file}"
|
|
# Then execute startup script
|
|
execute_startup "${subdir_path}" "${model}" "${model_name}"
|
|
fi
|
|
done
|
|
fi
|
|
else
|
|
echo "Non-mounted mode: starting built-in models..."
|
|
models=(tdtsfm timemoe moment moirai)
|
|
for model in "${models[@]}"; do
|
|
model_dir=$(find_model_file "${model}")
|
|
if [ -n "${model_dir}" ]; then
|
|
echo "✓ Found ${model} model at: ${model_dir}"
|
|
execute_startup "${model_dir}" "${model}" "${MODEL_NAMES[$model]}"
|
|
else
|
|
echo "✗ Model ${model} not found, skipping..."
|
|
fi
|
|
done
|
|
fi
|
|
|
|
CONFIG_FILE="/usr/local/taos/taosanode/cfg/taosanode.config.py"
|
|
|
|
if [ ! -f "${CONFIG_FILE}" ]; then
|
|
echo "Error: Configuration file ${CONFIG_FILE} not found!"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Starting Gunicorn with config: $CONFIG_FILE"
|
|
cd /usr/local/taos/taosanode/lib/taosanalytics/ || exit 1
|
|
exec /usr/local/bin/gunicorn -c "$CONFIG_FILE"
|