.github/workflows/job_python_unit_tests.yml #1
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Python unit tests | ||
on: | ||
workflow_call: | ||
inputs: | ||
runner: | ||
description: 'Machine on which the tests would run' | ||
type: string | ||
required: true | ||
container: | ||
description: 'JSON to be converted to the value of the "container" configuration for the job' | ||
type: string | ||
required: false | ||
default: '{"image": null}' | ||
affected-components: | ||
description: 'Components that are affected by changes in the commit defined by the Smart CI Action' | ||
type: string | ||
required: true | ||
env: | ||
PIP_CACHE_PATH: /mount/caches/pip/linux | ||
PYTHON_VERSION: '3.11' | ||
jobs: | ||
Python_Unit_Tests: | ||
name: Python unit tests | ||
timeout-minutes: 60 | ||
runs-on: ${{ inputs.runner }} | ||
container: ${{ fromJSON(inputs.container) }} | ||
defaults: | ||
run: | ||
shell: bash | ||
env: | ||
DEBIAN_FRONTEND: noninteractive # to prevent apt-get from waiting user input | ||
OPENVINO_REPO: ${{ github.workspace }}/openvino | ||
INSTALL_DIR: ${{ github.workspace }}/install | ||
INSTALL_TEST_DIR: ${{ github.workspace }}/install/tests | ||
LAYER_TESTS_INSTALL_DIR: ${{ github.workspace }}/install/tests/layer_tests | ||
PDM_PROJECT: ${{ github.workspace }}/install/tests/pyopenvino | ||
steps: | ||
- name: Set apt retries | ||
if: runner.os == 'Linux' | ||
run: echo 'Acquire::Retries "10";' > /etc/apt/apt.conf.d/80-retries | ||
- name: Download OpenVINO package | ||
uses: actions/download-artifact@v4 | ||
with: | ||
name: openvino_package | ||
path: ${{ env.INSTALL_DIR }} | ||
- name: Download OpenVINO tests package | ||
uses: actions/download-artifact@v4 | ||
with: | ||
name: openvino_tests | ||
path: ${{ env.INSTALL_TEST_DIR }} | ||
- name: Download OpenVINO tokenizers extension | ||
if: ${{ runner.os != 'macOS' && runner.arch != 'ARM64' }} # Ticket: 126287 | ||
uses: actions/download-artifact@v4 | ||
with: | ||
name: openvino_tokenizers_wheel | ||
path: ${{ env.INSTALL_DIR }} | ||
# Needed as ${{ github.workspace }} is not working correctly when using Docker | ||
- name: Setup Variables | ||
run: | | ||
echo "OPENVINO_REPO=$GITHUB_WORKSPACE/openvino" >> "$GITHUB_ENV" | ||
echo "INSTALL_DIR=$GITHUB_WORKSPACE/install" >> "$GITHUB_ENV" | ||
echo "INSTALL_TEST_DIR=$GITHUB_WORKSPACE/install/tests" >> "$GITHUB_ENV" | ||
echo "LAYER_TESTS_INSTALL_DIR=$GITHUB_WORKSPACE/install/tests/layer_tests" >> "$GITHUB_ENV" | ||
echo "PYTHON_RUN_PREFIX=${{ runner.arch == 'ARM64' && 'python3' || 'pdm run -v' }}" >> "$GITHUB_ENV" | ||
echo "PYTHON_RUN_TESTS_PREFIX=${{ runner.arch == 'ARM64' && 'python3 -m' || 'pdm run -v' }}" >> "$GITHUB_ENV" | ||
echo "PYTHON_INSTALL_PREFIX=${{ runner.arch == 'ARM64' && 'python3 -m pip install' || 'pdm add -v -G tests_ov_api' }}" >> "$GITHUB_ENV" | ||
echo "PYTHON_INSTALL_PYTHON_REQS=${{ runner.arch == 'ARM64' && 'python3 -m pip install -r ${INSTALL_TEST_DIR}/mo/requirements_dev.txt -r ${INSTALL_TEST_DIR}/python/preprocess/torchvision/requirements.txt' || 'pdm sync -v' }}" >> "$GITHUB_ENV" | ||
echo "PYTHON_INSTALL_LAYER_REQS=${{ runner.arch == 'ARM64' && 'python3 -m pip install -r ${LAYER_TESTS_INSTALL_DIR}/requirements.txt' || 'pdm sync -L ${LAYER_TESTS_INSTALL_DIR}/layer-tests.pdm.lock -v --venv layer-test' }}" >> "$GITHUB_ENV" | ||
- name: Extract OpenVINO packages | ||
run: | | ||
pushd $INSTALL_DIR | ||
tar -xzf openvino_package.tar.gz -C $INSTALL_DIR | ||
popd | ||
pushd $INSTALL_TEST_DIR | ||
tar -xzf openvino_tests.tar.gz -C $INSTALL_DIR | ||
popd | ||
- name: Install OpenVINO dependencies (Linux) | ||
if: runner.os == 'Linux' | ||
run: $INSTALL_DIR/install_dependencies/install_openvino_dependencies.sh -c=core -c=dev -y -c=gpu | ||
- name: Fetch setup_python action | ||
uses: actions/checkout@v4 | ||
with: | ||
sparse-checkout: | | ||
.github/actions/setup_python/action.yml | ||
sparse-checkout-cone-mode: false | ||
path: 'openvino' | ||
- name: Setup Python ${{ env.PYTHON_VERSION }} | ||
uses: ./openvino/.github/actions/setup_python | ||
with: | ||
version: ${{ env.PYTHON_VERSION }} | ||
pip-cache-path: ${{ runner.os == 'Linux' && env.PIP_CACHE_PATH || '' }} | ||
should-setup-pip-paths: ${{ runner.os == 'Linux' }} | ||
self-hosted-runner: ${{ runner.os == 'Linux' }} | ||
- name: Set up PDM | ||
if: ${{ runner.arch != 'ARM64' }} | ||
uses: pdm-project/setup-pdm@v3 | ||
with: | ||
python-version: ${{ env.PYTHON_VERSION }} | ||
# | ||
# Tests | ||
# | ||
- name: Install OpenVINO Python wheels | ||
run: | | ||
if [[ "${{ runner.arch }}" != "ARM64" ]]; then | ||
#Initialize pdm environment | ||
pdm venv create --name for-test ${{ env.PYTHON_VERSION }} | ||
pdm use --venv for-test | ||
pdm lock -v --strategy no_cross_platform -G tests_ov_api -G tests_mo | ||
fi | ||
# Install the core OV wheel | ||
${PYTHON_INSTALL_PREFIX} ${INSTALL_DIR}/tools/openvino-*.whl | ||
if [[ "${{ runner.arch }}" != "ARM64" ]]; then | ||
${PYTHON_INSTALL_PREFIX} ${INSTALL_DIR}/openvino_tokenizers-*.whl | ||
fi | ||
extras_to_install="caffe,kaldi,onnx,tensorflow2,pytorch" | ||
if [[ "${{ runner.arch }}" != "ARM64" ]]; then | ||
extras_to_install="mxnet,$extras_to_install" | ||
fi | ||
# Find and install OV dev wheel | ||
pushd ${INSTALL_DIR}/tools | ||
ov_dev_wheel_name=$(find . -name 'openvino_dev*.whl') | ||
${PYTHON_INSTALL_PREFIX} $ov_dev_wheel_name[$extras_to_install] | ||
popd | ||
- name: Install Python API tests dependencies | ||
run: | | ||
# To enable pytest parallel features | ||
${PYTHON_INSTALL_PREFIX} pytest-xdist[psutil] | ||
# For torchvision to OpenVINO preprocessing converter | ||
# TODO: replace with Python API tests requirements and add to test pkg | ||
${PYTHON_INSTALL_PYTHON_REQS} | ||
# | ||
# Tests | ||
# | ||
- name: Python API Tests | ||
# if: ${{ fromJSON(inputs.affected-components).Python_API.test && runner.arch != 'ARM64' }} # Ticket: 126380, 127101 | ||
run: | | ||
# for 'template' extension | ||
export LD_LIBRARY_PATH=${INSTALL_TEST_DIR}:$LD_LIBRARY_PATH | ||
${PYTHON_RUN_TESTS_PREFIX} pytest -sv ${INSTALL_TEST_DIR}/pyopenvino/tests \ | ||
--junitxml=${INSTALL_TEST_DIR}/TEST-Pyngraph.xml \ | ||
--ignore=${INSTALL_TEST_DIR}/pyopenvino/tests/test_utils/test_utils.py | ||
- name: Model Optimizer unit tests | ||
if: fromJSON(inputs.affected-components).MO.test | ||
run: | | ||
if [[ "${{ runner.os }}" == "Linux" ]] && [[ "${{ runner.arch }}" != "ARM64" ]]; then | ||
# required for MxNet | ||
apt-get install -y libgomp1 libquadmath0 | ||
fi | ||
# Skips under tickets: 133405, 122666 | ||
${PYTHON_RUN_TESTS_PREFIX} pytest -s ${INSTALL_TEST_DIR}/mo/unit_tests \ | ||
--junitxml=${INSTALL_TEST_DIR}/TEST-ModelOptimizer.xml \ | ||
--ignore-glob="**/mo/unit_tests/mo/front/mxnet/**" | ||
- name: Python ONNX operators tests | ||
if: (fromJSON(inputs.affected-components).Python_API.test || | ||
fromJSON(inputs.affected-components).ONNX_FE.test) && | ||
runner.arch != 'ARM64' # Ticket: 123325 | ||
run: | | ||
# Skip test_onnx/test_zoo_models and test_onnx/test_backend due to long execution time - ONNX Model Zoo tests are run separately | ||
${PYTHON_RUN_TESTS_PREFIX} pytest -sv ${INSTALL_TEST_DIR}/onnx -k 'not cuda' \ | ||
--junitxml=${INSTALL_TEST_DIR}/TEST-onnx_frontend.xml \ | ||
--ignore=${INSTALL_TEST_DIR}/onnx/test_python/test_zoo_models.py | ||
- name: OVC unit tests | ||
if: fromJSON(inputs.affected-components).MO.test | ||
run: ${PYTHON_RUN_TESTS_PREFIX} pytest -s ${INSTALL_TEST_DIR}/ovc/unit_tests --junitxml=${INSTALL_TEST_DIR}/TEST-OpenVinoConversion.xml | ||
- name: Install Python Layer tests dependencies | ||
run: | | ||
if [[ "${{ runner.arch }}" != "ARM64" ]]; then | ||
# #Initialize pdm environment | ||
pdm venv create --name layer-test ${{ env.PYTHON_VERSION }} | ||
pdm use --venv layer-test | ||
extras_to_install="caffe,kaldi,onnx,tensorflow2,pytorch" | ||
ov_dev_wheel_name=$(find ${INSTALL_DIR}/tools -name 'openvino_dev*.whl') | ||
# add extra openvino, openvino-dev dependency to layer-tests groups | ||
pdm add -L ${LAYER_TESTS_INSTALL_DIR}/layer-tests.pdm.lock -v --no-sync ${INSTALL_DIR}/tools/openvino-*.whl pytest-xdist[psutil] $ov_dev_wheel_name[$extras_to_install] | ||
fi | ||
# layer test requirements | ||
${PYTHON_INSTALL_LAYER_REQS} | ||
- name: MO Python API Tests | ||
if: fromJSON(inputs.affected-components).MO.test | ||
run: | | ||
# Import 'test_utils' installed in '<package_test>/tests/python/openvino' | ||
export LD_LIBRARY_PATH=${PIP_INSTALL_PATH}/openvino/libs:$LD_LIBRARY_PATH | ||
export PYTHONPATH=${INSTALL_TEST_DIR}/python | ||
if [[ "${{ runner.os }}" == "Linux" ]] && [[ "${{ runner.arch }}" == "ARM64" ]]; then | ||
# Find gomp lib | ||
GOMP_LIB=$(find "${PIP_INSTALL_PATH}/torch/lib/../../torch.libs/" -name '*libgomp-*so*') | ||
export LD_PRELOAD=${GOMP_LIB} | ||
fi | ||
${PYTHON_RUN_TESTS_PREFIX} pytest ${LAYER_TESTS_INSTALL_DIR}/mo_python_api_tests --junitxml=${INSTALL_TEST_DIR}/TEST-test_mo_convert.xml | ||
env: | ||
TEST_DEVICE: CPU | ||
TEST_PRECISION: FP16 | ||
- name: OVC Python API Tests | ||
if: fromJSON(inputs.affected-components).MO.test | ||
run: | | ||
# Import 'test_utils' installed in '<package_test>/tests/python/openvino' | ||
export PYTHONPATH=${INSTALL_TEST_DIR}/python | ||
export LD_LIBRARY_PATH=${PIP_INSTALL_PATH}/openvino/libs:$LD_LIBRARY_PATH | ||
if [[ "${{ runner.os }}" == "Linux" ]] && [[ "${{ runner.arch }}" == "ARM64" ]]; then | ||
# Find gomp lib | ||
GOMP_LIB=$(find "${PIP_INSTALL_PATH}/torch/lib/../../torch.libs/" -name '*libgomp-*so*') | ||
export LD_PRELOAD=${GOMP_LIB} | ||
fi | ||
${PYTHON_RUN_TESTS_PREFIX} pytest ${LAYER_TESTS_INSTALL_DIR}/ovc_python_api_tests --junitxml=${INSTALL_TEST_DIR}/TEST-test_ovc_convert.xm | ||
env: | ||
TEST_DEVICE: CPU | ||
TEST_PRECISION: FP16 | ||
- name: Python Frontend tests | ||
if: fromJSON(inputs.affected-components).PyTorch_FE.test || | ||
fromJSON(inputs.affected-components).PDPD_FE.test | ||
run: | | ||
# to allow 'libtest_builtin_extensions.so' to find 'libopenvino_onnx_frontend.so' | ||
export LD_LIBRARY_PATH=${PIP_INSTALL_PATH}/openvino/libs:$LD_LIBRARY_PATH | ||
${PYTHON_RUN_TESTS_PREFIX} pytest ${LAYER_TESTS_INSTALL_DIR}/py_frontend_tests --junitxml=${INSTALL_TEST_DIR}/TEST-test_py_fontend.xml | ||
- name: PyTorch Layer Tests | ||
if: ${{ fromJSON(inputs.affected-components).PyTorch_FE.test && runner.arch != 'ARM64' }} # Ticket: 126287 | ||
run: ${PYTHON_RUN_TESTS_PREFIX} pytest ${LAYER_TESTS_INSTALL_DIR}/ | ||
-n logical -m precommit --junitxml=${INSTALL_TEST_DIR}/TEST-pytorch.xml | ||
env: | ||
TEST_DEVICE: CPU | ||
TEST_PRECISION: FP32 | ||
- name: PyTorch torch.export Layer Tests | ||
if: ${{ fromJSON(inputs.affected-components).PyTorch_FE.test && runner.arch != 'ARM64' }} # Ticket: 126287 | ||
run: | | ||
${PYTHON_RUN_TESTS_PREFIX} pytest ${LAYER_TESTS_INSTALL_DIR}/pytorch_tests -n logical -m precommit_torch_export --junitxml=${INSTALL_TEST_DIR}/TEST-pytorch.xml | ||
env: | ||
TEST_DEVICE: CPU | ||
TEST_PRECISION: FP32 | ||
PYTORCH_TRACING_MODE: EXPORT | ||
- name: PyTorch torch.compile TORCHFX Layer Tests | ||
if: ${{ fromJSON(inputs.affected-components).PyTorch_FE.test && runner.os != 'macOS' && runner.arch != 'ARM64' }} # Ticket: 126287 | ||
run: | | ||
${PYTHON_RUN_TESTS_PREFIX} pytest ${LAYER_TESTS_INSTALL_DIR}/pytorch_tests -m precommit_fx_backend --junitxml=${INSTALL_TEST_DIR}/TEST-pytorch.xml | ||
env: | ||
TEST_DEVICE: CPU | ||
TEST_PRECISION: FP32 | ||
PYTORCH_TRACING_MODE: TORCHFX | ||
- name: ONNX Layer Tests | ||
if: fromJSON(inputs.affected-components).ONNX_FE.test | ||
run: | | ||
# requires 'unit_tests' from 'tools/mo' | ||
export PYTHONPATH=${INSTALL_TEST_DIR}/mo:$PYTHONPATH | ||
${PYTHON_RUN_TESTS_PREFIX} pytest ${LAYER_TESTS_INSTALL_DIR}/onnx_tests -m "not launch_only_if_manually_specified and precommit" --junitxml=${INSTALL_TEST_DIR}/TEST-onnx.xml | ||
env: | ||
TEST_DEVICE: CPU | ||
TEST_PRECISION: FP16 | ||
- name: TensorFlow 1 Layer Tests - TF FE | ||
if: fromJSON(inputs.affected-components).TF_FE.test | ||
run: | | ||
# requires 'unit_tests' from 'mo' | ||
export PYTHONPATH=${INSTALL_TEST_DIR}/mo | ||
${PYTHON_RUN_TESTS_PREFIX} pytest ${LAYER_TESTS_INSTALL_DIR}/tensorflow_tests/ -m precommit -n logical --junitxml=${INSTALL_TEST_DIR}/TEST-tf_fe.xml | ||
env: | ||
TEST_DEVICE: CPU | ||
TEST_PRECISION: FP16 | ||
- name: TensorFlow 2 Layer Tests - TF FE | ||
if: fromJSON(inputs.affected-components).TF_FE.test && runner.os != 'macOS' # Ticket: 123322 | ||
run: | | ||
# requires 'unit_tests' from 'mo' | ||
export PYTHONPATH=${INSTALL_TEST_DIR}/mo | ||
${PYTHON_RUN_TESTS_PREFIX} pytest ${LAYER_TESTS_INSTALL_DIR}/tensorflow2_keras_tests/ -n logical -m precommit_tf_fe --junitxml=${INSTALL_TEST_DIR}/TEST-tf2_fe.xml | ||
env: | ||
TEST_DEVICE: CPU | ||
TEST_PRECISION: FP16 | ||
- name: JAX Layer Tests - TF FE | ||
if: ${{ fromJSON(inputs.affected-components).TF_FE.test && runner.arch != 'ARM64' && runner.os != 'macOS' }} | ||
run: ${PYTHON_RUN_TESTS_PREFIX} pytest ${LAYER_TESTS_INSTALL_DIR}/jax_tests/ -m precommit --junitxml=${INSTALL_TEST_DIR}/TEST-jax.xml | ||
env: | ||
TEST_DEVICE: CPU | ||
- name: TensorFlow 1 Layer Tests - Legacy FE | ||
if: fromJSON(inputs.affected-components).TF_FE.test | ||
run: ${PYTHON_RUN_TESTS_PREFIX} pytest ${LAYER_TESTS_INSTALL_DIR}/tensorflow_tests/test_tf_Roll.py --use_legacy_frontend --ir_version=10 --junitxml=${INSTALL_TEST_DIR}/TEST-tf_Roll.xml | ||
- name: TensorFlow 2 Layer Tests - Legacy FE | ||
if: fromJSON(inputs.affected-components).TF_FE.test | ||
run: ${PYTHON_RUN_TESTS_PREFIX} pytest ${LAYER_TESTS_INSTALL_DIR}/tensorflow2_keras_tests/test_tf2_keras_activation.py --use_legacy_frontend --ir_version=11 -k "sigmoid" --junitxml=${INSTALL_TEST_DIR}/TEST-tf2_Activation.xml | ||
env: | ||
TEST_DEVICE: CPU | ||
TEST_PRECISION: FP16 | ||
- name: TensorFlow Lite Layer Tests - TFL FE | ||
if: fromJSON(inputs.affected-components).TFL_FE.test | ||
run: ${PYTHON_RUN_TESTS_PREFIX} pytest ${LAYER_TESTS_INSTALL_DIR}/tensorflow_lite_tests/ --junitxml=${INSTALL_TEST_DIR}/TEST-tfl_fe.xml | ||
env: | ||
TEST_DEVICE: CPU | ||
TEST_PRECISION: FP16 | ||
- name: Clone API snippets | ||
if: runner.os != 'macOS' | ||
uses: actions/checkout@v4 | ||
with: | ||
sparse-checkout: openvino/docs/snippets | ||
path: ${{ env.OPENVINO_REPO }} | ||
submodules: 'false' | ||
- name: Docs Python snippets | ||
if: runner.os != 'macOS' | ||
run: | | ||
# to find 'snippets' module in docs | ||
export PYTHONPATH=${OPENVINO_REPO}/docs | ||
# for 'template' extension | ||
export LD_LIBRARY_PATH=${INSTALL_TEST_DIR}:$LD_LIBRARY_PATH | ||
${PYTHON_RUN_PREFIX} ${OPENVINO_REPO}/docs/snippets/main.py | ||
- name: Upload Test Results | ||
uses: actions/upload-artifact@v4 | ||
if: ${{ !cancelled() }} | ||
with: | ||
name: test-results-python | ||
path: | | ||
${{ env.INSTALL_TEST_DIR }}/TEST*.html | ||
${{ env.INSTALL_TEST_DIR }}/TEST*.xml | ||
if-no-files-found: 'warn' |