From c5484d5d32e3c6cdbea4b2fa261109b86c2f7609 Mon Sep 17 00:00:00 2001 From: jerryjzhang Date: Thu, 16 May 2024 18:12:36 +0800 Subject: [PATCH] (improvement)(assembly)Improve release scripts to make file structure cleaner. --- .gitignore | 1 + assembly/bin/supersonic-build.sh | 109 ++++++++++++++++------------ assembly/bin/supersonic-common.sh | 94 ++---------------------- assembly/bin/supersonic-daemon.sh | 116 +++++++++++++++++++----------- assembly/build/build.xml | 6 ++ 5 files changed, 151 insertions(+), 175 deletions(-) diff --git a/.gitignore b/.gitignore index 2f509cfc0..55c7381fb 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ log/ *.bin *.log *.tar.gz +*.zip *.lib assembly/runtime/* **/dist/ diff --git a/assembly/bin/supersonic-build.sh b/assembly/bin/supersonic-build.sh index 2561afd21..4aeae14e2 100755 --- a/assembly/bin/supersonic-build.sh +++ b/assembly/bin/supersonic-build.sh @@ -1,58 +1,79 @@ #!/usr/bin/env bash -set -x sbinDir=$(cd "$(dirname "$0")"; pwd) chmod +x $sbinDir/supersonic-common.sh source $sbinDir/supersonic-common.sh +cd $projectDir +MVN_VERSION=$(mvn help:evaluate -Dexpression=project.version | grep -e '^[^\[]') + cd $baseDir - service=$1 -#1. build backend java modules -rm -fr ${buildDir}/*.tar.gz -rm -fr dist -set +x -mvn -f $baseDir/../ clean package -DskipTests -# check build result -if [ $? -ne 0 ]; then - echo "Failed to build backend Java modules." - exit 1 +if [ -z "$service" ]; then + service=${STANDALONE_SERVICE} fi -#2. move package to build -cp $baseDir/../launchers/headless/target/*.tar.gz ${buildDir}/supersonic-headless.tar.gz -cp $baseDir/../launchers/chat/target/*.tar.gz ${buildDir}/supersonic-chat.tar.gz -cp $baseDir/../launchers/standalone/target/*.tar.gz ${buildDir}/supersonic-standalone.tar.gz +function buildJavaService { + model_name=$1 + echo "starting building supersonic-${model_name} service" + mvn -f $projectDir/launchers/${model_name} clean package -DskipTests + if [ $? -ne 0 ]; then + echo "Failed to build backend Java modules." + exit 1 + fi + cp $projectDir/launchers/${model_name}/target/*.tar.gz ${buildDir}/ + echo "finished building supersonic-${model_name} service" +} -#3. build frontend webapp -chmod +x $baseDir/../webapp/start-fe-prod.sh -cd ../webapp -sh ./start-fe-prod.sh -cp -fr ./supersonic-webapp.tar.gz ${buildDir}/ +function buildWebapp { + echo "starting building supersonic webapp" + chmod +x $projectDir/webapp/start-fe-prod.sh + cd $projectDir/webapp + sh ./start-fe-prod.sh + cp -fr ./supersonic-webapp.tar.gz ${buildDir}/ + # check build result + if [ $? -ne 0 ]; then + echo "Failed to build frontend webapp." + exit 1 + fi + echo "finished building supersonic webapp" +} -# check build result -if [ $? -ne 0 ]; then - echo "Failed to build frontend webapp." - exit 1 -fi -#4. copy webapp to java classpath -cd $buildDir -tar xvf supersonic-webapp.tar.gz -mv supersonic-webapp webapp -cp -fr webapp ../../launchers/headless/target/classes -cp -fr webapp ../../launchers/chat/target/classes -cp -fr webapp ../../launchers/standalone/target/classes -rm -fr ${buildDir}/webapp +function packageRelease { + model_name=$1 + release_dir=supersonic-${model_name}-${MVN_VERSION} + service_name=launchers-${model_name}-${MVN_VERSION} + echo "starting packaging supersonic release" + cd $buildDir + mkdir $release_dir + # package webapp + tar xvf supersonic-webapp.tar.gz + mv supersonic-webapp webapp + json='{"env": "'$model_name'"}' + echo $json > webapp/supersonic.config.json + mv webapp $release_dir/ + # package java service + tar xvf $service_name-bin.tar.gz + mv $service_name/* $release_dir/ + # generate zip file + zip -r $release_dir.zip $release_dir + # delete intermediate files + rm -rf supersonic-webapp.tar.gz + rm -rf $service_name-bin.tar.gz + rm -rf $service_name + echo "finished packaging supersonic release" +} -#5. build backend python modules -if [ "$service" == "pyllm" ]; then - echo "start installing python modules with pip: ${pip_path}" - requirementPath=$baseDir/../headless/python/requirements.txt +#1. build backend services +if [ "$service" == $PYLLM_SERVICE ]; then + echo "start installing python modules required by supersonic-pyllm: ${pip_path}" + requirementPath=$projectDir/headless/python/requirements.txt ${pip_path} install -r ${requirementPath} echo "install python modules success" -fi - -#6. reset runtime -rm -fr $runtimeDir/supersonic* -moveAllToRuntime -setEnvToWeb chat -setEnvToWeb headless +elif [ "$service" == "webapp" ]; then + buildWebapp + cp -fr webapp $projectDir/launchers/$STANDALONE_SERVICE/target/classes +else + buildJavaService $service + buildWebapp + packageRelease $service +fi \ No newline at end of file diff --git a/assembly/bin/supersonic-common.sh b/assembly/bin/supersonic-common.sh index b2e80fc66..aebe480ac 100755 --- a/assembly/bin/supersonic-common.sh +++ b/assembly/bin/supersonic-common.sh @@ -6,105 +6,19 @@ pip_path=${PIP_PATH:-"pip3"} sbinDir=$(cd "$(dirname "$0")"; pwd) baseDir=$(cd "$sbinDir/.." && pwd -P) -runtimeDir=$baseDir/../runtime +runtimeDir=$baseDir/runtime buildDir=$baseDir/build +projectDir=$baseDir/.. readonly CHAT_APP_NAME="supersonic_chat" readonly HEADLESS_APP_NAME="supersonic_headless" readonly PYLLM_APP_NAME="supersonic_pyllm" readonly STANDALONE_APP_NAME="supersonic_standalone" + readonly CHAT_SERVICE="chat" readonly HEADLESS_SERVICE="headless" readonly PYLLM_SERVICE="pyllm" readonly STANDALONE_SERVICE="standalone" + readonly PYLLM_HOST="127.0.0.1" readonly PYLLM_PORT="9092" - -function setEnvToWeb { - model_name=$1 - json='{"env": "'$model_name'"}' - echo $json > ${runtimeDir}/supersonic-${model_name}/webapp/supersonic.config.json - echo $json > $baseDir/../launchers/${model_name}/target/classes/webapp/supersonic.config.json -} - -function moveToRuntime { - model_name=$1 - file="${buildDir}/supersonic-${model_name}.tar.gz" - if [ -f "$file" ]; then - tar -zxvf "$file" -C ${runtimeDir} - mv ${runtimeDir}/launchers-${model_name}-* ${runtimeDir}/supersonic-${model_name} - mkdir -p ${runtimeDir}/supersonic-${model_name}/webapp - cp -fr ${buildDir}/webapp/* ${runtimeDir}/supersonic-${model_name}/webapp - else - echo "File $file does not exist. Skipping the move to runtime." - fi -} - -function moveAllToRuntime { - mkdir -p ${runtimeDir} - tar xvf ${buildDir}/supersonic-webapp.tar.gz -C ${buildDir} - mv ${buildDir}/supersonic-webapp ${buildDir}/webapp - - moveToRuntime chat - moveToRuntime headless - moveToRuntime standalone - rm -fr ${buildDir}/webapp -} - -# run java service -function runJavaService { - javaRunDir=${runtimeDir}/supersonic-${model_name} - local_app_name=$1 - libDir=$javaRunDir/lib - confDir=$javaRunDir/conf - - CLASSPATH="" - CLASSPATH=$CLASSPATH:$confDir - - for jarPath in $libDir/*.jar; do - CLASSPATH=$CLASSPATH:$jarPath - done - - export CLASSPATH - export LANG="zh_CN.UTF-8" - - cd $javaRunDir - if [[ "$JAVA_HOME" == "" ]]; then - JAVA_HOME=$(ls /usr/jdk64/jdk* -d 2>/dev/null | xargs | awk '{print "'$local_app_name'"}') - fi - export PATH=$JAVA_HOME/bin:$PATH - command="-Dfile.encoding="UTF-8" -Duser.language="Zh" -Duser.region="CN" -Duser.timezone="GMT+08" -Dapp_name=${local_app_name} -Xms1024m -Xmx2048m "$main_class - - mkdir -p $javaRunDir/logs - if [[ "$is_test" == "true" ]]; then - java -Dspring.profiles.active="dev" $command >/dev/null 2>$javaRunDir/logs/error.log & - else - java $command $javaRunDir >/dev/null 2>$javaRunDir/logs/error.log & - fi -} - -# run python service -function runPythonService { - pythonRunDir=${runtimeDir}/supersonic-${model_name}/pyllm - cd $pythonRunDir - nohup ${python_path} supersonic_pyllm.py > $pythonRunDir/pyllm.log 2>&1 & - # add health check - for i in {1..10} - do - echo "pyllm health check attempt $i..." - response=$(curl -s http://${PYLLM_HOST}:${PYLLM_PORT}/health) - echo "pyllm health check response: $response" - status_ok="Healthy" - if [[ $response == *$status_ok* ]] ; then - echo "pyllm Health check passed." - break - else - if [ "$i" -eq 10 ]; then - echo "pyllm Health check failed after 10 attempts." - echo "May still downloading model files. Please check pyllm.log in runtime directory." - fi - echo "Retrying after 5 seconds..." - sleep 5 - fi - done -} diff --git a/assembly/bin/supersonic-daemon.sh b/assembly/bin/supersonic-daemon.sh index 6d05f0b27..7e7dbbdac 100755 --- a/assembly/bin/supersonic-daemon.sh +++ b/assembly/bin/supersonic-daemon.sh @@ -1,61 +1,102 @@ #!/usr/bin/env bash -set -x sbinDir=$(cd "$(dirname "$0")"; pwd) chmod +x $sbinDir/supersonic-common.sh source $sbinDir/supersonic-common.sh -# 1.init environment parameters -if [ ! -d "$runtimeDir" ]; then - echo "the runtime dir does not exist move all to runtime" - moveAllToRuntime -fi -set +x - command=$1 service=$2 if [ -z "$service" ]; then service=${STANDALONE_SERVICE} fi -app_name=$STANDALONE_APP_NAME -main_class="com.tencent.supersonic.StandaloneLauncher" model_name=$service - if [ "$service" == "pyllm" ]; then model_name=${STANDALONE_SERVICE} export llmProxy=PythonLLMProxy fi - cd $baseDir -# 2.set main class function setMainClass { if [ "$service" == $CHAT_SERVICE ]; then main_class="com.tencent.supersonic.ChatLauncher" elif [ "$service" == $HEADLESS_SERVICE ]; then main_class="com.tencent.supersonic.HeadlessLauncher" + else + main_class="com.tencent.supersonic.StandaloneLauncher" fi } -setMainClass -# 3.set app name + function setAppName { if [ "$service" == $CHAT_SERVICE ]; then app_name=$CHAT_APP_NAME elif [ "$service" == $HEADLESS_SERVICE ]; then app_name=$HEADLESS_APP_NAME - elif [ "$service" == $PYLLM_SERVICE ]; then - app_name=$PYLLM_APP_NAME + else + app_name=$STANDALONE_APP_NAME fi } -setAppName function reloadExamples { - pythonRunDir=${runtimeDir}/supersonic-${model_name}/pyllm - cd $pythonRunDir/sql + cd $baseDir/pyllm/sql ${python_path} examples_reload_run.py } +function runJavaService { + javaRunDir=$baseDir + local_app_name=$1 + libDir=$baseDir/lib + confDir=$baseDir/conf + + CLASSPATH="" + CLASSPATH=$CLASSPATH:$confDir + + for jarPath in $libDir/*.jar; do + CLASSPATH=$CLASSPATH:$jarPath + done + + export CLASSPATH + export LANG="zh_CN.UTF-8" + + cd $javaRunDir + if [[ "$JAVA_HOME" == "" ]]; then + JAVA_HOME=$(ls /usr/jdk64/jdk* -d 2>/dev/null | xargs | awk '{print "'$local_app_name'"}') + fi + export PATH=$JAVA_HOME/bin:$PATH + command="-Dfile.encoding="UTF-8" -Duser.language="Zh" -Duser.region="CN" -Duser.timezone="GMT+08" -Dapp_name=${local_app_name} -Xms1024m -Xmx2048m "$main_class + + mkdir -p $javaRunDir/logs + if [[ "$is_test" == "true" ]]; then + java -Dspring.profiles.active="dev" $command >/dev/null 2>$javaRunDir/logs/error.log & + else + java $command $javaRunDir >/dev/null 2>$javaRunDir/logs/error.log & + fi +} + +function runPythonService { + pythonRunDir=$baseDir/pyllm + cd $pythonRunDir + nohup ${python_path} supersonic_pyllm.py > $pythonRunDir/pyllm.log 2>&1 & + # add health check + for i in {1..10} + do + echo "pyllm health check attempt $i..." + response=$(curl -s http://${PYLLM_HOST}:${PYLLM_PORT}/health) + echo "pyllm health check response: $response" + status_ok="Healthy" + if [[ $response == *$status_ok* ]] ; then + echo "pyllm Health check passed." + break + else + if [ "$i" -eq 10 ]; then + echo "pyllm Health check failed after 10 attempts." + echo "May still downloading model files. Please check pyllm.log in runtime directory." + fi + echo "Retrying after 5 seconds..." + sleep 5 + fi + done +} function start() { @@ -93,18 +134,16 @@ function reload() fi } -# 4. execute command operation +setMainClass +setAppName case "$command" in start) if [ "$service" == $PYLLM_SERVICE ]; then - echo "Starting $app_name" - start $app_name - echo "Starting $STANDALONE_APP_NAME" - start $STANDALONE_APP_NAME - else - echo "Starting $app_name" - start $app_name + echo "Starting $PYLLM_APP_NAME" + start $PYLLM_APP_NAME fi + echo "Starting ${app_name}" + start ${app_name} echo "Start success" ;; stop) @@ -121,20 +160,15 @@ case "$command" in ;; restart) if [ "$service" == $PYLLM_SERVICE ]; then - echo "Stopping ${app_name}" - stop ${app_name} - echo "Stopping ${STANDALONE_APP_NAME}" - stop $STANDALONE_APP_NAME - echo "Starting ${app_name}" - start ${app_name} - echo "Starting ${STANDALONE_APP_NAME}" - start $STANDALONE_APP_NAME - else - echo "Stopping ${app_name}" - stop ${app_name} - echo "Starting ${app_name}" - start ${app_name} + echo "Stopping $PYLLM_APP_NAME" + stop $PYLLM_APP_NAME + echo "Starting $PYLLM_APP_NAME" + start $PYLLM_APP_NAME fi + echo "Stopping ${app_name}" + stop ${app_name} + echo "Starting ${app_name}" + start ${app_name} echo "Restart success" ;; *) diff --git a/assembly/build/build.xml b/assembly/build/build.xml index c78587988..88fd3ec99 100644 --- a/assembly/build/build.xml +++ b/assembly/build/build.xml @@ -26,6 +26,12 @@ 0777 0755 + + ${project.basedir}/../../assembly/bin + bin + 0777 + 0755 +