Introduce pytest-splits #51
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: Testing::x86_64::Python | |
on: | |
workflow_call: | |
inputs: | |
lightning-version: | |
type: string | |
required: true | |
description: The version of Lightning to use. Valid values are either 'release' (most recent release candidate), 'stable' (most recent git-tag) or 'latest' (most recent commit from master) | |
pennylane-version: | |
type: string | |
required: true | |
description: The version of PennyLane to use. Valid values are either 'release' (most recent release candidate), 'stable' (most recent git-tag) or 'latest' (most recent commit from master) | |
pull_request: | |
paths-ignore: | |
- pennylane_lightning/core/src/simulators/lightning_gpu/** | |
- pennylane_lightning/lightning_gpu/** | |
push: | |
branches: | |
- master | |
env: | |
TF_VERSION: 2.10.0 | |
TORCH_VERSION: 1.11.0+cpu | |
COVERAGE_FLAGS: "--cov=pennylane_lightning --cov-report=term-missing --no-flaky-report -p no:warnings --tb=native" | |
GCC_VERSION: 11 | |
OMP_NUM_THREADS: "2" | |
OMP_PROC_BIND: "false" | |
concurrency: | |
group: tests_linux_python-${{ github.ref }}-${{ inputs.lightning-version }}-${{ inputs.pennylane-version }} | |
cancel-in-progress: true | |
jobs: | |
build_lightning_qubit_wheels: | |
strategy: | |
matrix: | |
os: [ubuntu-22.04] | |
pl_backend: ["lightning_qubit"] | |
blas: ["OFF", "ON"] | |
timeout-minutes: 60 | |
name: Python tests | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/setup-python@v5 | |
name: Install Python | |
with: | |
python-version: '3.9' | |
- name: Checkout PennyLane-Lightning | |
uses: actions/checkout@v4 | |
with: | |
fetch-tags: true | |
path: main | |
- name: Switch to release build of Lightning | |
if: inputs.lightning-version == 'release' | |
run: | | |
cd main | |
git fetch --all | |
git checkout $(git branch -a --list "origin/v*rc*" | tail -1) | |
- name: Switch to stable build of Lightning | |
if: inputs.lightning-version == 'stable' | |
run: | | |
cd main | |
git fetch --tags --force | |
git checkout $(git tag | sort -V | tail -1) | |
git log -1 --format='%H' | |
git status | |
- name: Install dependencies | |
run: | | |
sudo apt-get update && sudo apt-get -y -q install cmake gcc-$GCC_VERSION g++-$GCC_VERSION libopenblas-dev | |
python -m pip install scipy wheel | |
- name: Get required Python packages | |
run: | | |
cd main | |
python -m pip install -r requirements-dev.txt | |
- name: Create device wheel | |
run: | | |
cd main | |
python setup.py build_ext -i --define="PL_BACKEND=${{ matrix.pl_backend }};ENABLE_BLAS=${{ matrix.blas }};LQ_ENABLE_KERNEL_OMP=ON;ENABLE_PYTHON=ON;CMAKE_CXX_COMPILER=$(which g++-$GCC_VERSION)" | |
PL_BACKEND=${{ matrix.pl_backend }} python setup.py bdist_wheel | |
mkdir -p ${{ github.workspace }}/wheels | |
cp dist/*.whl ${{ github.workspace }}/wheels | |
- name: Cache wheel directories | |
id: wheel-lightning_qubit | |
uses: actions/cache/save@v3 | |
with: | |
key: wheel_${{ matrix.pl_backend }}-BLAS${{ matrix.blas }}-${{ github.ref }}-${{ github.sha }} | |
path: ${{ github.workspace }}/wheels | |
test_lightning_qubit_wheels: | |
needs: ["build_lightning_qubit_wheels"] | |
strategy: | |
matrix: | |
os: [ubuntu-22.04] | |
pl_backend: ["lightning_qubit"] | |
blas: ["OFF", "ON"] | |
group: [1, 2, 3, 4] | |
timeout-minutes: 60 | |
name: Python tests | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/setup-python@v5 | |
name: Install Python | |
with: | |
python-version: '3.9' | |
- name: Checkout PennyLane-Lightning | |
uses: actions/checkout@v4 | |
with: | |
fetch-tags: true | |
path: main | |
- name: Restoring cached wheel | |
id: wheel-lightning_qubit | |
uses: actions/cache/restore@v3 | |
with: | |
path: ${{ github.workspace }}/wheels | |
key: wheel_${{ matrix.pl_backend }}-BLAS${{ matrix.blas }}-${{ github.ref }}-${{ github.sha }} | |
restore-keys: wheel_${{ matrix.pl_backend }}-BLAS${{ matrix.blas }}-${{ github.ref }}- | |
- name: Get required Python packages | |
run: | | |
cd main | |
python -m pip install ${{ github.workspace }}/wheels/PennyLane_Lightning*.whl --no-deps | |
python -m pip install -r requirements-dev.txt | |
python -m pip install openfermionpyscf | |
- name: Checkout PennyLane for release build | |
if: inputs.pennylane-version == 'release' | |
uses: actions/checkout@v4 | |
with: | |
path: pennylane | |
repository: PennyLaneAI/pennylane | |
- name: Switch to release build of PennyLane | |
if: inputs.pennylane-version == 'release' | |
run: | | |
cd pennylane | |
git fetch --all | |
git checkout $(git branch -a --list "origin/v*rc*" | tail -1) | |
python -m pip uninstall -y pennylane && python -m pip install . -vv --no-deps | |
- name: Install Stable PennyLane | |
if: inputs.pennylane-version == 'stable' | |
run: | | |
cd main | |
python -m pip uninstall -y pennylane && python -m pip install -U pennylane | |
- name: Install ML libraries for interfaces | |
run: | | |
python -m pip install --upgrade torch==$TORCH_VERSION -f https://download.pytorch.org/whl/cpu/torch_stable.html | |
python -m pip install --upgrade "jax[cpu]" # This also installs jaxlib | |
python -m pip install --upgrade tensorflow~=$TF_VERSION keras~=$TF_VERSION | |
- name: Run PennyLane-Lightning unit tests | |
run: | | |
# TODO: Remove installing pytest-xdist with release v0.36.0 | |
python -m pip install pytest-xdist | |
cd main/ | |
DEVICENAME=`echo ${{ matrix.pl_backend }} | sed "s/_/./g"` | |
OMP_NUM_THREADS=1 PL_DEVICE=${DEVICENAME} python -m pytest -n auto tests/ -k "not unitary_correct" $COVERAGE_FLAGS --splits 4 --group ${{ matrix.group }} --durations-path='.github/workflows/python_lightning_qubit_test_durations' | |
PL_DEVICE=${DEVICENAME} python -m pytest tests/ -k "unitary_correct" $COVERAGE_FLAGS --cov-append | |
pl-device-test --device ${DEVICENAME} --skip-ops --shots=20000 $COVERAGE_FLAGS --cov-append | |
pl-device-test --device ${DEVICENAME} --shots=None --skip-ops $COVERAGE_FLAGS --cov-append | |
mv .coverage .coverage-${{ github.job }}-${{ matrix.pl_backend }}-${{ matrix.group }} | |
- name: Upload code coverage results | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ubuntu-codecov-results-python | |
path: | | |
./main/.coverage-${{ github.job }}-${{ matrix.pl_backend }}-${{ matrix.group }} | |
if-no-files-found: error | |
build_and_cache_Kokkos: | |
name: "Build and cache Kokkos" | |
uses: ./.github/workflows/build_and_cache_Kokkos_linux.yml | |
with: | |
os: ubuntu-22.04 | |
build_lightning_kokkos_wheels: | |
needs: [build_and_cache_Kokkos] | |
strategy: | |
matrix: | |
os: [ubuntu-22.04] | |
pl_backend: ["lightning_kokkos"] | |
exec_model: ${{ fromJson(needs.build_and_cache_Kokkos.outputs.exec_model) }} | |
kokkos_version: ${{ fromJson(needs.build_and_cache_Kokkos.outputs.kokkos_version) }} | |
timeout-minutes: 60 | |
name: Python tests with Kokkos | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Checkout PennyLane-Lightning | |
uses: actions/checkout@v4 | |
with: | |
fetch-tags: true | |
path: main | |
- name: Switch to release build of Lightning | |
if: inputs.lightning-version == 'release' | |
run: | | |
cd main | |
git fetch --all | |
git checkout $(git branch -a --list "origin/v*rc*" | tail -1) | |
- name: Switch to stable build of Lightning | |
if: inputs.lightning-version == 'stable' | |
run: | | |
cd main | |
git fetch --tags --force | |
git checkout $(git tag | sort -V | tail -1) | |
git log -1 --format='%H' | |
git status | |
- uses: actions/setup-python@v5 | |
name: Install Python | |
with: | |
python-version: '3.9' | |
- name: Restoring cached dependencies | |
id: kokkos-cache | |
uses: actions/cache@v4 | |
with: | |
path: ${{ github.workspace}}/Kokkos_install/${{ matrix.exec_model }} | |
key: ${{ matrix.os }}-kokkos${{ matrix.kokkos_version }}-${{ matrix.exec_model }} | |
- name: Copy cached libraries | |
if: steps.kokkos-cache.outputs.cache-hit == 'true' | |
run: | | |
rm -rf Kokkos | |
mkdir Kokkos/ | |
cp -rf ${{ github.workspace}}/Kokkos_install/${{ matrix.exec_model }}/* Kokkos/ | |
pwd | |
- name: Install dependencies | |
run: | | |
sudo apt-get update && sudo apt-get -y -q install cmake gcc-$GCC_VERSION g++-$GCC_VERSION | |
python -m pip install scipy | |
- name: Get required Python packages | |
run: | | |
cd main | |
python -m pip install -r requirements-dev.txt | |
- name: Create device wheel | |
run: | | |
cd main | |
python setup.py build_ext -i --define="PL_BACKEND=${{ matrix.pl_backend }};ENABLE_PYTHON=ON;CMAKE_CXX_COMPILER=$(which g++-$GCC_VERSION)" | |
PL_BACKEND=${{ matrix.pl_backend }} python setup.py bdist_wheel | |
mkdir -p ${{ github.workspace }}/wheels | |
cp dist/*.whl ${{ github.workspace }}/wheels | |
- name: Cache wheel directories | |
id: wheel-lightning_kokkos | |
uses: actions/cache/save@v3 | |
with: | |
key: wheel_${{ matrix.pl_backend }}-${{ github.ref }}-${{ github.sha }} | |
path: ${{ github.workspace }}/wheels | |
test_lightning_kokkos_wheels: | |
needs: [build_lightning_kokkos_wheels] | |
strategy: | |
matrix: | |
os: [ubuntu-22.04] | |
pl_backend: ["lightning_kokkos"] | |
group: [1, 2, 3, 4] | |
exec_model: ${{ fromJson(needs.build_and_cache_Kokkos.outputs.exec_model) }} | |
kokkos_version: ${{ fromJson(needs.build_and_cache_Kokkos.outputs.kokkos_version) }} | |
timeout-minutes: 60 | |
name: Python tests with Kokkos | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Checkout PennyLane-Lightning | |
uses: actions/checkout@v4 | |
with: | |
fetch-tags: true | |
path: main | |
- name: Restoring cached wheel | |
id: wheel-lightning_kokkos | |
uses: actions/cache/restore@v3 | |
with: | |
path: ${{ github.workspace }}/wheels | |
key: wheel_${{ matrix.pl_backend }}-${{ github.ref }}-${{ github.sha }} | |
restore-keys: wheel_${{ matrix.pl_backend }}-${{ github.ref }}- | |
- name: Get required Python packages | |
run: | | |
cd main | |
python -m pip install ${{ github.workspace }}/wheels/PennyLane_Lightning*.whl --no-deps | |
python -m pip install -r requirements-dev.txt | |
python -m pip install openfermionpyscf | |
SKIP_COMPILATION=True python -m pip install -e . -vv | |
- name: Checkout PennyLane for release build | |
if: inputs.pennylane-version == 'release' | |
uses: actions/checkout@v4 | |
with: | |
path: pennylane | |
repository: PennyLaneAI/pennylane | |
- name: Switch to release build of PennyLane | |
if: inputs.pennylane-version == 'release' | |
run: | | |
cd pennylane | |
git fetch --all | |
git checkout $(git branch -a --list "origin/v*rc*" | tail -1) | |
python -m pip uninstall -y pennylane && python -m pip install . -vv --no-deps | |
- name: Install Stable PennyLane | |
if: inputs.pennylane-version == 'stable' | |
run: | | |
cd main | |
python -m pip uninstall -y pennylane && python -m pip install -U pennylane | |
- name: Install ML libraries for interfaces | |
run: | | |
python -m pip install --upgrade torch==$TORCH_VERSION -f https://download.pytorch.org/whl/cpu/torch_stable.html | |
python -m pip install --upgrade "jax[cpu]" # This also installs jaxlib | |
python -m pip install --upgrade tensorflow~=$TF_VERSION keras~=$TF_VERSION | |
- name: Run PennyLane-Lightning unit tests | |
run: | | |
# TODO: Remove installing pytest-xdist with release v0.36.0 | |
python -m pip install pytest-xdist | |
cd main/ | |
DEVICENAME=`echo ${{ matrix.pl_backend }} | sed "s/_/./g"` | |
PL_DEVICE=${DEVICENAME} python -m pytest tests/ -k "not test_native_mcm" $COVERAGE_FLAGS --splits 4 --group ${{ matrix.group }} --durations-path='.github/workflows/python_lightning_qubit_test_durations' | |
pl-device-test --device ${DEVICENAME} --skip-ops --shots=20000 $COVERAGE_FLAGS --cov-append | |
pl-device-test --device ${DEVICENAME} --shots=None --skip-ops $COVERAGE_FLAGS --cov-append | |
mv .coverage .coverage-${{ github.job }}-${{ matrix.pl_backend }}-${{ matrix.group }} | |
# TODO: Remove this if-cond with release v0.36.0 | |
if [ -f tests/test_native_mcm.py ]; then | |
OMP_NUM_THREADS=1 PL_DEVICE=${DEVICENAME} python -m pytest -n auto tests/ -k "test_native_mcm" $COVERAGE_FLAGS --cov-append --splits 4 --group ${{ matrix.group }} --durations-path='.github/workflows/python_lightning_qubit_test_durations' | |
fi | |
- name: Upload code coverage results | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ubuntu-codecov-results-python | |
path: ./main/.coverage-${{ github.job }}-${{ matrix.pl_backend }}-${{ matrix.group }} | |
if-no-files-found: error | |
upload-to-codecov-linux-python: | |
needs: [test_lightning_qubit_wheels, test_lightning_kokkos_wheels] | |
name: Upload python coverage data to codecov | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
fetch-tags: true | |
path: main | |
- name: Download coverage reports | |
uses: actions/download-artifact@v3 | |
with: | |
name: ubuntu-codecov-results-python | |
- name: Combine coverage files | |
run: | | |
python -m pip install coverage | |
python -m coverage combine .coverage-python* | |
# Added cov xml -i to ignore "No source for code" random errors | |
# https://stackoverflow.com/questions/2386975/no-source-for-code-message-in-coverage-py | |
python -m coverage xml -i -o coverage-${{ github.job }}.xml | |
- name: Upload to Codecov | |
uses: codecov/codecov-action@v4 | |
with: | |
fail_ci_if_error: true | |
verbose: true | |
token: ${{ secrets.CODECOV_TOKEN }} | |