diff --git a/.github/workflows/llm_unit_tests.yml b/.github/workflows/llm_unit_tests.yml index aa333e80..f9ab43fd 100644 --- a/.github/workflows/llm_unit_tests.yml +++ b/.github/workflows/llm_unit_tests.yml @@ -157,8 +157,8 @@ jobs: # fi if [ ! -d $ORIGINAL_CHATGLM2_6B_PATH ]; then echo "Directory $ORIGINAL_CHATGLM2_6B_PATH not found. Downloading from FTP server..." - echo "wget -r -nH --no-verbose --cut-dirs=1 $LLM_FTP_URL/llm/chatglm2-6b -P $ORIGIN_DIR" - wget -r -nH --no-verbose --cut-dirs=1 $LLM_FTP_URL/llm/chatglm2-6b -P $ORIGIN_DIR + echo "wget -r -nH --no-verbose --cut-dirs=2 $LLM_FTP_URL/llm/updated_for_4.36/chatglm2-6b -P $ORIGIN_DIR" + wget -r -nH --no-verbose --cut-dirs=2 $LLM_FTP_URL/llm/updated_for_4.36/chatglm2-6b -P $ORIGIN_DIR fi if [ ! -d $ORIGINAL_CODESHELL_7B_PATH ]; then echo "Directory $ORIGINAL_CODESHELL_7B_PATH not found. Downloading from FTP server..." @@ -240,10 +240,10 @@ jobs: strategy: fail-fast: false matrix: - # pytorch-version: ['2.1', '2.0'] + runner: ['arc-ut', 'arc-ut-win'] pytorch-version: ['2.1'] python-version: ${{ fromJson(needs.setup-python-version.outputs.python-version) }} - runs-on: [self-hosted, llm, arc-ut] + runs-on: [self-hosted, llm, "${{ matrix.runner }}"] env: # OMP_NUM_THREADS: 16 # THREAD_NUM: 16 @@ -284,6 +284,12 @@ jobs: # May remove later pip uninstall sentence-transformers -y || true + # On Windows, we need to add "Python3_ROOT_DIR/bin" to path to make libuv work + if [[ "$RUNNER_OS" == "Windows" ]]; then + echo $Python3_ROOT_DIR'\bin\' + echo $Python3_ROOT_DIR'\bin\' >> $GITHUB_PATH + fi + - name: Download llm binary uses: ./.github/actions/llm/download-llm-binary @@ -296,10 +302,12 @@ jobs: shell: bash run: | # Specific oneapi position on arc ut test machines - if [[ '${{ matrix.pytorch-version }}' == '2.1' ]]; then - source /opt/intel/oneapi/setvars.sh - elif [[ '${{ matrix.pytorch-version }}' == '2.0' ]]; then - source /home/arda/intel/oneapi/setvars.sh + if [[ "$RUNNER_OS" == "Linux" ]]; then + if [[ '${{ matrix.pytorch-version }}' == '2.1' ]]; then + source /opt/intel/oneapi/setvars.sh + elif [[ '${{ matrix.pytorch-version }}' == '2.0' ]]; then + source /home/arda/intel/oneapi/setvars.sh + fi fi bash python/llm/test/run-llm-install-tests.sh @@ -312,7 +320,7 @@ jobs: fi if [ ! -d $CHATGLM2_6B_ORIGIN_PATH ]; then echo "Directory $CHATGLM2_6B_ORIGIN_PATH not found. Downloading from FTP server..." - wget -r -nH --no-verbose --cut-dirs=1 $LLM_FTP_URL/llm/chatglm2-6b -P $ORIGIN_DIR + wget -r -nH --no-verbose --cut-dirs=2 $LLM_FTP_URL/llm/updated_for_4.36/chatglm2-6b -P $ORIGIN_DIR fi if [ ! -d $FALCON_7B_ORIGIN_PATH ]; then echo "Directory $FALCON_7B_ORIGIN_PATH not found. Downloading from FTP server..." @@ -320,7 +328,7 @@ jobs: fi if [ ! -d $MPT_7B_ORIGIN_PATH ]; then echo "Directory $MPT_7B_ORIGIN_PATH not found. Downloading from FTP server..." - wget -r -nH --no-verbose --cut-dirs=1 $LLM_FTP_URL/llm/mpt-7b-chat -P $ORIGIN_DIR + wget -r -nH --no-verbose --cut-dirs=2 $LLM_FTP_URL/llm/updated_for_4.36/mpt-7b-chat -P $ORIGIN_DIR fi if [ ! -d $WHISPER_TINY_ORIGIN_PATH ]; then echo "Directory $WHISPER_TINY_ORIGIN_PATH not found. Downloading from FTP server..." @@ -347,7 +355,7 @@ jobs: fi if [ ! -d $BAICHUAN2_7B_ORIGIN_PATH ]; then echo "Directory $BAICHUAN2_7B_ORIGIN_PATH not found. Downloading from FTP server..." - wget -r -nH --no-verbose --cut-dirs=1 $LLM_FTP_URL/llm/Baichuan2-7B-Chat -P $ORIGIN_DIR + wget -r -nH --no-verbose --cut-dirs=2 $LLM_FTP_URL/llm/updated_for_4.36/Baichuan2-7B-Chat -P $ORIGIN_DIR fi if [ ! -d $VICUNA_7B_1_3_ORIGIN_PATH ]; then echo "Directory $VICUNA_7B_1_3_ORIGIN_PATH not found. Downloading from FTP server..." @@ -358,12 +366,15 @@ jobs: shell: bash run: | # Specific oneapi position on arc ut test machines - if [[ '${{ matrix.pytorch-version }}' == '2.1' ]]; then - source /opt/intel/oneapi/setvars.sh - elif [[ '${{ matrix.pytorch-version }}' == '2.0' ]]; then - source /home/arda/intel/oneapi/setvars.sh + if [[ "$RUNNER_OS" == "Linux" ]]; then + if [[ '${{ matrix.pytorch-version }}' == '2.1' ]]; then + source /opt/intel/oneapi/setvars.sh + elif [[ '${{ matrix.pytorch-version }}' == '2.0' ]]; then + source /home/arda/intel/oneapi/setvars.sh + fi fi python -m pip install datasets librosa soundfile einops tiktoken transformers_stream_generator + bash python/llm/test/run-llm-inference-tests-gpu.sh - name: Run LLM example tests @@ -373,10 +384,12 @@ jobs: python -m pip install transformers==4.36.0 datasets peft==0.10.0 accelerate==0.23.0 python -m pip install bitsandbytes scipy # Specific oneapi position on arc ut test machines - if [[ '${{ matrix.pytorch-version }}' == '2.1' ]]; then - source /opt/intel/oneapi/setvars.sh - elif [[ '${{ matrix.pytorch-version }}' == '2.0' ]]; then - source /home/arda/intel/oneapi/setvars.sh + if [[ "$RUNNER_OS" == "Linux" ]]; then + if [[ '${{ matrix.pytorch-version }}' == '2.1' ]]; then + source /opt/intel/oneapi/setvars.sh + elif [[ '${{ matrix.pytorch-version }}' == '2.0' ]]; then + source /home/arda/intel/oneapi/setvars.sh + fi fi bash python/llm/test/run-llm-example-tests-gpu.sh @@ -403,10 +416,12 @@ jobs: pip install -U chromadb==0.3.25 pip install -U pandas==2.0.3 # Specific oneapi position on arc ut test machines - if [[ '${{ matrix.pytorch-version }}' == '2.1' ]]; then - source /opt/intel/oneapi/setvars.sh - elif [[ '${{ matrix.pytorch-version }}' == '2.0' ]]; then - source /home/arda/intel/oneapi/setvars.sh + if [[ "$RUNNER_OS" == "Linux" ]]; then + if [[ '${{ matrix.pytorch-version }}' == '2.1' ]]; then + source /opt/intel/oneapi/setvars.sh + elif [[ '${{ matrix.pytorch-version }}' == '2.0' ]]; then + source /home/arda/intel/oneapi/setvars.sh + fi fi bash python/llm/test/run-llm-langchain-tests-gpu.sh @@ -422,10 +437,14 @@ jobs: # Specific oneapi position on arc ut test machines if [[ '${{ matrix.pytorch-version }}' == '2.1' ]]; then pip install --pre --upgrade ipex-llm[xpu] --extra-index-url https://pytorch-extension.intel.com/release-whl/stable/xpu/cn/ - source /opt/intel/oneapi/setvars.sh + if [[ "$RUNNER_OS" == "Linux" ]]; then + source /opt/intel/oneapi/setvars.sh + fi elif [[ '${{ matrix.pytorch-version }}' == '2.0' ]]; then pip install --pre --upgrade ipex-llm[xpu_2.0] --extra-index-url https://pytorch-extension.intel.com/release-whl/stable/xpu/cn/ - source /home/arda/intel/oneapi/setvars.sh + if [[ "$RUNNER_OS" == "Linux" ]]; then + source /home/arda/intel/oneapi/setvars.sh + fi fi pip install transformers==4.36.2 pip install "pydantic>=2.0.0" diff --git a/python/llm/test/inference_gpu/test_transformers_api_attention.py b/python/llm/test/inference_gpu/test_transformers_api_attention.py index 149d81a3..1a3e5bf7 100644 --- a/python/llm/test/inference_gpu/test_transformers_api_attention.py +++ b/python/llm/test/inference_gpu/test_transformers_api_attention.py @@ -178,7 +178,10 @@ class Test_Optimize_Gpu_Model: # currently only need to compare the output of one self-attention layer. layer_norm = "model.layers.31.input_layernorm" self_attn = "model.layers.31.self_attn" - lower_bound = 9e-3 + if os.environ['RUNNER_OS'] == "Windows": + lower_bound = 2e-2 + else: + lower_bound = 9e-3 self.run_optimize_gpu_model(Name, Model, Tokenizer, model_path, self_attn, layer_norm, lower_bound) def Baichuan_gpu_model(self, Name, Model, Tokenizer, model_path): diff --git a/python/llm/test/inference_gpu/test_transformers_api_mlp.py b/python/llm/test/inference_gpu/test_transformers_api_mlp.py index 70ba2e7b..cf0581a5 100644 --- a/python/llm/test/inference_gpu/test_transformers_api_mlp.py +++ b/python/llm/test/inference_gpu/test_transformers_api_mlp.py @@ -142,5 +142,8 @@ class Test_Optimize_Gpu_Model: # since the original Llama2 code adds residual after the mlp layer, which differs from the implementation of bigdl layer_before_Decoder = "model.layers.30" Decoder_layer = "model.layers.31" - lower_bound = 1e-1 + if os.environ['RUNNER_OS'] == "Windows": + lower_bound = 2e-1 + else: + lower_bound = 1e-1 self.run_optimize_gpu_model(Name, Model, Tokenizer, model_path, Decoder_layer, layer_before_Decoder, lower_bound) diff --git a/python/llm/test/run-langchain-upstream-tests.sh b/python/llm/test/run-langchain-upstream-tests.sh index e28f1ad4..0e1d3dcd 100644 --- a/python/llm/test/run-langchain-upstream-tests.sh +++ b/python/llm/test/run-langchain-upstream-tests.sh @@ -4,14 +4,23 @@ export LLM_INFERENCE_TEST_DIR=${ANALYTICS_ZOO_ROOT}/python/llm/test/langchain_gp export TEST_BIGDLLLM_MODEL_IDS=${VICUNA_7B_1_3_ORIGIN_PATH} export TEST_IPEXLLM_MODEL_IDS=${VICUNA_7B_1_3_ORIGIN_PATH} +# Use Windows style path when running on Windows +if [[ $RUNNER_OS == "Windows" ]]; then + export ANALYTICS_ZOO_ROOT=$(cygpath -m ${ANALYTICS_ZOO_ROOT}) + export TEST_BIGDLLLM_MODEL_IDS=$(cygpath -m ${VICUNA_7B_1_3_ORIGIN_PATH}) + export TEST_IPEXLLM_MODEL_IDS=$(cygpath -m ${VICUNA_7B_1_3_ORIGIN_PATH}) +fi + set -e echo ">>> Testing LangChain upstream unit test" cp ${ANALYTICS_ZOO_ROOT}/langchain_upstream/libs/community/tests/integration_tests/llms/test_bigdl_llm.py ${ANALYTICS_ZOO_ROOT}/langchain_upstream cp ${ANALYTICS_ZOO_ROOT}/langchain_upstream/libs/community/tests/integration_tests/llms/test_ipex_llm.py ${ANALYTICS_ZOO_ROOT}/langchain_upstream -python -m pytest -s ${ANALYTICS_ZOO_ROOT}/langchain_upstream/test_bigdl_llm.py -python -m pytest -s ${ANALYTICS_ZOO_ROOT}/langchain_upstream/test_ipex_llm.py +source ${ANALYTICS_ZOO_ROOT}/python/llm/test/run-llm-check-function.sh + +pytest_check_error python -m pytest -s ${ANALYTICS_ZOO_ROOT}/langchain_upstream/test_bigdl_llm.py +pytest_check_error python -m pytest -s ${ANALYTICS_ZOO_ROOT}/langchain_upstream/test_ipex_llm.py echo ">>> Testing LangChain upstream ipynb" cp ${ANALYTICS_ZOO_ROOT}/langchain_upstream/docs/docs/integrations/llms/ipex_llm.ipynb ${ANALYTICS_ZOO_ROOT}/langchain_upstream/langchain_example.ipynb @@ -19,5 +28,5 @@ bash ./apps/ipynb2py.sh ${ANALYTICS_ZOO_ROOT}/langchain_upstream/langchain_examp sed -i '/^get_ipython/d' ${ANALYTICS_ZOO_ROOT}/langchain_upstream/langchain_example.py sed -i "s,model_id=\"[^\"]*\",model_id=\"$TEST_IPEXLLM_MODEL_IDS\",g" ${ANALYTICS_ZOO_ROOT}/langchain_upstream/langchain_example.py sed -i 's|saved_lowbit_model_path = "./vicuna-7b-1.5-low-bit"|saved_lowbit_model_path = "./langchain_upstream/vicuna-7b-1.5-low-bit"|' ${ANALYTICS_ZOO_ROOT}/langchain_upstream/langchain_example.py -python ${ANALYTICS_ZOO_ROOT}/langchain_upstream/langchain_example.py +ipex_workaround_wrapper python ${ANALYTICS_ZOO_ROOT}/langchain_upstream/langchain_example.py rm -rf ${ANALYTICS_ZOO_ROOT}/langchain_upstream diff --git a/python/llm/test/run-llm-check-function.sh b/python/llm/test/run-llm-check-function.sh new file mode 100644 index 00000000..ecd9644c --- /dev/null +++ b/python/llm/test/run-llm-check-function.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +# wrapper for pytest command +# add this before `pytest ...` or `python -m pytest ...` to avoid unexpected exit code 127 caused by ipex on Windows +# ref: https://github.com/intel/intel-extension-for-pytorch/issues/634 +pytest_check_error() { + result=$(eval "$@" || echo "FINISH PYTEST") + echo $result > pytest_check_error.log + cat pytest_check_error.log + failed_lines=$(cat pytest_check_error.log | { grep failed || true; }) + if [[ $failed_lines != "" ]]; then + exit 1 + fi + rm pytest_check_error.log +} + +# wrapper for python command +# add this before `python ...` to avoid unexpected exit code 127 caused by ipex on Windows +# ref: https://github.com/intel/intel-extension-for-pytorch/issues/634 +ipex_workaround_wrapper() { + eval "$@" || ( [[ $? == 127 && $RUNNER_OS == "Windows" ]] && echo "EXIT CODE 127 DETECTED ON WINDOWS, IGNORE." || exit 1) +} diff --git a/python/llm/test/run-llm-example-tests-gpu.sh b/python/llm/test/run-llm-example-tests-gpu.sh index be03a486..922ca328 100644 --- a/python/llm/test/run-llm-example-tests-gpu.sh +++ b/python/llm/test/run-llm-example-tests-gpu.sh @@ -1,6 +1,10 @@ #!/bin/bash -export ANALYTICS_ZOO_ROOT=${ANALYTICS_ZOO_ROOT} +if [[ $RUNNER_OS == "Linux" ]]; then + export ANALYTICS_ZOO_ROOT=${ANALYTICS_ZOO_ROOT} +elif [[ $RUNNER_OS == "Windows" ]]; then + export ANALYTICS_ZOO_ROOT=$(cygpath -m ${ANALYTICS_ZOO_ROOT}) +fi set -e @@ -10,11 +14,14 @@ start=$(date "+%s") sed -i 's/max_steps=200/max_steps=2/; s/save_steps=100/save_steps=2/; s/logging_steps=20/logging_steps=1/' \ ${ANALYTICS_ZOO_ROOT}/python/llm/example/GPU/LLM-Finetuning/QLoRA/simple-example/qlora_finetuning.py -python ${ANALYTICS_ZOO_ROOT}/python/llm/example/GPU/LLM-Finetuning/QLoRA/simple-example/qlora_finetuning.py \ +# import pytest_check_error function +source ${ANALYTICS_ZOO_ROOT}/python/llm/test/run-llm-check-function.sh + +ipex_workaround_wrapper python ${ANALYTICS_ZOO_ROOT}/python/llm/example/GPU/LLM-Finetuning/QLoRA/simple-example/qlora_finetuning.py \ --repo-id-or-model-path ${LLAMA2_7B_ORIGIN_PATH} \ --dataset ${YAHMA_ALPACA_CLEANED_PATH} -python ${ANALYTICS_ZOO_ROOT}/python/llm/example/GPU/LLM-Finetuning/QLoRA/simple-example/export_merged_model.py \ +ipex_workaround_wrapper python ${ANALYTICS_ZOO_ROOT}/python/llm/example/GPU/LLM-Finetuning/QLoRA/simple-example/export_merged_model.py \ --repo-id-or-model-path ${LLAMA2_7B_ORIGIN_PATH} \ --adapter_path ${PWD}/outputs/checkpoint-2 \ --output_path ${PWD}/outputs/checkpoint-2-merged diff --git a/python/llm/test/run-llm-inference-tests-gpu.sh b/python/llm/test/run-llm-inference-tests-gpu.sh index 5e48c0df..62f21487 100644 --- a/python/llm/test/run-llm-inference-tests-gpu.sh +++ b/python/llm/test/run-llm-inference-tests-gpu.sh @@ -4,8 +4,15 @@ export ANALYTICS_ZOO_ROOT=${ANALYTICS_ZOO_ROOT} export LLM_HOME=${ANALYTICS_ZOO_ROOT}/python/llm/src export LLM_INFERENCE_TEST_DIR=${ANALYTICS_ZOO_ROOT}/python/llm/test/inference_gpu -export USE_XETLA=OFF -export SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1 +if [[ $RUNNER_OS == "Linux" ]]; then + export USE_XETLA=OFF + export SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1 +elif [[ $RUNNER_OS == "Windows" ]]; then + export ANALYTICS_ZOO_ROOT=$(cygpath -m ${ANALYTICS_ZOO_ROOT}) + export LLM_INFERENCE_TEST_DIR=${ANALYTICS_ZOO_ROOT}/python/llm/test/inference_gpu + export SYCL_CACHE_PERSISTENT=1 +fi + export DEVICE='xpu' set -e @@ -17,13 +24,18 @@ start=$(date "+%s") # THREAD_NUM=2 # fi # export OMP_NUM_THREADS=$THREAD_NUM -pytest ${LLM_INFERENCE_TEST_DIR}/test_transformers_api.py -v -s -pytest ${LLM_INFERENCE_TEST_DIR}/test_transformers_api_layernorm.py -v -s + +# import pytest_check_error function +source ${ANALYTICS_ZOO_ROOT}/python/llm/test/run-llm-check-function.sh + +pytest_check_error pytest ${LLM_INFERENCE_TEST_DIR}/test_transformers_api.py -v -s +pytest_check_error pytest ${LLM_INFERENCE_TEST_DIR}/test_transformers_api_layernorm.py -v -s + export BIGDL_LLM_XMX_DISABLED=1 -pytest ${LLM_INFERENCE_TEST_DIR}/test_transformers_api_final_logits.py -v -s -pytest ${LLM_INFERENCE_TEST_DIR}/test_transformers_api_attention.py -v -s -pytest ${LLM_INFERENCE_TEST_DIR}/test_transformers_api_mlp.py -v -s -pytest ${LLM_INFERENCE_TEST_DIR}/test_transformers_api_RMSNorm.py -v -s +pytest_check_error pytest ${LLM_INFERENCE_TEST_DIR}/test_transformers_api_final_logits.py -v -s +pytest_check_error pytest ${LLM_INFERENCE_TEST_DIR}/test_transformers_api_attention.py -v -s +pytest_check_error pytest ${LLM_INFERENCE_TEST_DIR}/test_transformers_api_mlp.py -v -s +pytest_check_error pytest ${LLM_INFERENCE_TEST_DIR}/test_transformers_api_RMSNorm.py -v -s unset BIGDL_LLM_XMX_DISABLED now=$(date "+%s") @@ -35,7 +47,7 @@ echo "Time used:$time seconds" echo "# Start testing layers.fast_rope_embedding" start=$(date "+%s") -pytest ${LLM_INFERENCE_TEST_DIR}/test_layer_fast_rope.py -v -s +pytest_check_error pytest ${LLM_INFERENCE_TEST_DIR}/test_layer_fast_rope.py -v -s now=$(date "+%s") time=$((now-start)) diff --git a/python/llm/test/run-llm-langchain-tests-gpu.sh b/python/llm/test/run-llm-langchain-tests-gpu.sh index bff28198..be9c154c 100644 --- a/python/llm/test/run-llm-langchain-tests-gpu.sh +++ b/python/llm/test/run-llm-langchain-tests-gpu.sh @@ -4,8 +4,15 @@ export ANALYTICS_ZOO_ROOT=${ANALYTICS_ZOO_ROOT} export LLM_HOME=${ANALYTICS_ZOO_ROOT}/python/llm/src export LLM_INFERENCE_TEST_DIR=${ANALYTICS_ZOO_ROOT}/python/llm/test/langchain_gpu -export USE_XETLA=OFF -export SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1 +if [[ $RUNNER_OS == "Linux" ]]; then + export USE_XETLA=OFF + export SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1 +elif [[ $RUNNER_OS == "Windows" ]]; then + export ANALYTICS_ZOO_ROOT=$(cygpath -m ${ANALYTICS_ZOO_ROOT}) + export LLM_INFERENCE_TEST_DIR=${ANALYTICS_ZOO_ROOT}/python/llm/test/langchain_gpu + export SYCL_CACHE_PERSISTENT=1 +fi + export DEVICE='xpu' set -e @@ -13,7 +20,9 @@ set -e echo "# Start testing inference" start=$(date "+%s") -python -m pytest -s ${LLM_INFERENCE_TEST_DIR} +source ${ANALYTICS_ZOO_ROOT}/python/llm/test/run-llm-check-function.sh + +pytest_check_error python -m pytest -s ${LLM_INFERENCE_TEST_DIR} now=$(date "+%s") time=$((now-start)) diff --git a/python/llm/test/run-llm-llamaindex-tests-gpu.sh b/python/llm/test/run-llm-llamaindex-tests-gpu.sh index 387aa9cc..9ff6a53c 100644 --- a/python/llm/test/run-llm-llamaindex-tests-gpu.sh +++ b/python/llm/test/run-llm-llamaindex-tests-gpu.sh @@ -4,15 +4,23 @@ export ANALYTICS_ZOO_ROOT=${ANALYTICS_ZOO_ROOT} export LLM_HOME=${ANALYTICS_ZOO_ROOT}/python/llm/src export LLM_INFERENCE_TEST_DIR=${ANALYTICS_ZOO_ROOT}/python/llm/test/llamaindex_gpu -export USE_XETLA=OFF -export SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1 +if [[ $RUNNER_OS == "Linux" ]]; then + export USE_XETLA=OFF + export SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1 +elif [[ $RUNNER_OS == "Windows" ]]; then + export ANALYTICS_ZOO_ROOT=$(cygpath -m ${ANALYTICS_ZOO_ROOT}) + export LLM_INFERENCE_TEST_DIR=${ANALYTICS_ZOO_ROOT}/python/llm/test/llamaindex_gpu + export SYCL_CACHE_PERSISTENT=1 +fi set -e echo "# Start testing inference" start=$(date "+%s") -python -m pytest -s ${LLM_INFERENCE_TEST_DIR} +source ${ANALYTICS_ZOO_ROOT}/python/llm/test/run-llm-check-function.sh + +pytest_check_error python -m pytest -s ${LLM_INFERENCE_TEST_DIR} now=$(date "+%s") time=$((now-start))