Skip to content

Introduce pytest-splits #49

Introduce pytest-splits

Introduce pytest-splits #49

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", "all"]
exec_model: ${{ fromJson(needs.build_and_cache_Kokkos.outputs.exec_model) }}
kokkos_version: ${{ fromJson(needs.build_and_cache_Kokkos.outputs.kokkos_version) }}
exclude:
- pl_backend: ["all"]
exec_model: OPENMP
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_and_cache_Kokkos]
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) }}
exclude:
- pl_backend: ["all"]
exec_model: OPENMP
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 }}