From d38f99e2ca462a5b9e77b732585e02fffec21c8c Mon Sep 17 00:00:00 2001 From: Karthik Prasad Date: Fri, 29 Sep 2023 14:41:12 -0700 Subject: [PATCH] Move CI from CircleCI to Github Actions (#605) Summary: Pull Request resolved: https://github.com/pytorch/opacus/pull/605 Differential Revision: D49757301 --- .github/workflows/integration-tests.yml | 243 ++++++++++++++++++++++++ .github/workflows/lint-checks.yml | 44 +++++ .github/workflows/unit-tests.yml | 105 ++++++++++ 3 files changed, 392 insertions(+) create mode 100644 .github/workflows/integration-tests.yml create mode 100644 .github/workflows/lint-checks.yml create mode 100644 .github/workflows/unit-tests.yml diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml new file mode 100644 index 00000000..105ea88b --- /dev/null +++ b/.github/workflows/integration-tests.yml @@ -0,0 +1,243 @@ +name: Integration tests with release version of PyTorch on Linux CPU and CUDA + +on: + pull_request: + push: + branches: + - main + workflow_dispatch: + +jobs: + integration_test_cpu: + strategy: + matrix: + python_version: ["3.9"] + fail-fast: false + uses: pytorch/test-infra/.github/workflows/linux_job.yml@main + with: + runner: linux.2xlarge + repository: pytorch/opacus + timeout: 60 + script: | + echo '::group::Create conda env with correct Python version' + set -x + PYTHON_VERSION="${{ matrix.python_version }}" + conda create --yes --quiet -n test python="${PYTHON_VERSION}" + conda activate test + python --version | grep "${PYTHON_VERSION}" + echo '::endgroup::' + + echo '::group::Install dependencies via pip, including extra deps.' + ./scripts/install_via_pip.sh + echo '::endgroup::' + + echo '::group::Runs MNIST example end to end' + mkdir -p runs/mnist/data + mkdir -p runs/mnist/test-reports + echo "Using $(python -V)" + echo "Using $(pip -V)" + python examples/mnist.py --lr 0.25 --sigma 0.7 -c 1.5 --batch-size 64 --epochs 1 --data-root runs/mnist/data --n-runs 1 --device <> + python -c "import torch; accuracy = torch.load('run_results_mnist_0.25_0.7_1.5_64_1.pt'); exit(0) if (accuracy[0]>0.78 and accuracy[0]<0.95) else exit(1)" + echo '::endgroup::' + + mnist: + strategy: + matrix: + python_version: ["3.9"] + cuda_arch_version: ["11.8"] + fail-fast: false + uses: pytorch/test-infra/.github/workflows/linux_job.yml@main + with: + runner: linux.g5.4xlarge.nvidia.gpu + gpu-arch-type: cuda + gpu-arch-version: ${{ matrix.cuda_arch_version }} + repository: pytorch/opacus + timeout: 60 + script: | + echo '::group::Create conda env with correct Python version' + set -x + PYTHON_VERSION="${{ matrix.python_version }}" + conda create --yes --quiet -n test python="${PYTHON_VERSION}" + conda activate test + python --version | grep "${PYTHON_VERSION}" + echo '::endgroup::' + + echo "::group::Install dependencies via pip, including extra deps." + ./scripts/install_via_pip.sh + echo "::endgroup::" + + echo "::group::Run nvidia-smi" + nvidia-smi + echo "::endgroup::" + + echo "::group::Run mnist example end to end" + mkdir -p runs/mnist/data + mkdir -p runs/mnist/test-reports + echo "Using $(python -V)" + echo "Using $(pip -V)" + python examples/mnist_lightning.py fit --trainer.accelerator cuda --model.lr 0.25 --model.sigma 0.7 --model.max_per_sample_grad_norm 1.5 --model.sample_rate 0.004 --trainer.max_epochs 1 --data.data_dir runs/mnist/data --data.sample_rate 0.004 + echo "::endgroup::" + + cifar10: + strategy: + matrix: + python_version: ["3.9"] + cuda_arch_version: ["11.8"] + fail-fast: false + uses: pytorch/test-infra/.github/workflows/linux_job.yml@main + with: + runner: linux.g5.4xlarge.nvidia.gpu + gpu-arch-type: cuda + gpu-arch-version: ${{ matrix.cuda_arch_version }} + repository: pytorch/opacus + timeout: 60 + script: | + echo '::group::Create conda env with correct Python version' + set -x + PYTHON_VERSION="${{ matrix.python_version }}" + conda create --yes --quiet -n test python="${PYTHON_VERSION}" + conda activate test + python --version | grep "${PYTHON_VERSION}" + echo '::endgroup::' + + echo "::group::Install dependencies via pip, including extra deps." + ./scripts/install_via_pip.sh + echo "::endgroup::" + + echo "::group::Run nvidia-smi" + nvidia-smi + echo "::endgroup::" + + echo "::group::Run cifar10 example end to end" + mkdir -p runs/cifar10/data + mkdir -p runs/cifar10/logs + mkdir -p runs/cifar10/test-reports + echo "Using $(python -V)" + echo "Using $(pip -V)" + pip install tensorboard + python examples/cifar10.py --lr 0.1 --sigma 1.5 -c 10 --batch-size 2000 --epochs 10 --data-root runs/cifar10/data --log-dir runs/cifar10/logs --device cuda + python -c "import torch; model = torch.load('model_best.pth.tar'); exit(0) if (model['best_acc1']>0.4 and model['best_acc1']<0.49) else exit(1)" + python examples/cifar10.py --lr 0.1 --sigma 1.5 -c 10 --batch-size 2000 --epochs 10 --data-root runs/cifar10/data --log-dir runs/cifar10/logs --device cuda --grad_sample_mode no_op + python -c "import torch; model = torch.load('model_best.pth.tar'); exit(0) if (model['best_acc1']>0.4 and model['best_acc1']<0.49) else exit(1)" + echo "::endgroup::" + + imdb: + strategy: + matrix: + python_version: ["3.9"] + cuda_arch_version: ["11.8"] + fail-fast: false + uses: pytorch/test-infra/.github/workflows/linux_job.yml@main + with: + runner: linux.g5.4xlarge.nvidia.gpu + gpu-arch-type: cuda + gpu-arch-version: ${{ matrix.cuda_arch_version }} + repository: pytorch/opacus + timeout: 60 + script: | + echo '::group::Create conda env with correct Python version' + set -x + PYTHON_VERSION="${{ matrix.python_version }}" + conda create --yes --quiet -n test python="${PYTHON_VERSION}" + conda activate test + python --version | grep "${PYTHON_VERSION}" + echo '::endgroup::' + + echo "::group::Install dependencies via pip, including extra deps." + ./scripts/install_via_pip.sh + echo "::endgroup::" + + echo "::group::Run nvidia-smi" + nvidia-smi + echo "::endgroup::" + + echo "::group::Run imdb example end to end" + mkdir -p runs/imdb/data + mkdir -p runs/imdb/test-reports + echo "Using $(python -V)" + echo "Using $(pip -V)" + pip install --user datasets transformers + python examples/imdb.py --lr 0.02 --sigma 1.0 -c 1.0 --batch-size 64 --max-sequence-length 256 --epochs 2 --data-root runs/imdb/data --device cuda + python -c "import torch; accuracy = torch.load('run_results_imdb_classification.pt'); exit(0) if (accuracy>0.54 and accuracy<0.66) else exit(1)" + echo "::endgroup::" + + charlstm: + strategy: + matrix: + python_version: ["3.9"] + cuda_arch_version: ["11.8"] + fail-fast: false + uses: pytorch/test-infra/.github/workflows/linux_job.yml@main + with: + runner: linux.g5.4xlarge.nvidia.gpu + gpu-arch-type: cuda + gpu-arch-version: ${{ matrix.cuda_arch_version }} + repository: pytorch/opacus + timeout: 60 + script: | + echo '::group::Create conda env with correct Python version' + set -x + PYTHON_VERSION="${{ matrix.python_version }}" + conda create --yes --quiet -n test python="${PYTHON_VERSION}" + conda activate test + python --version | grep "${PYTHON_VERSION}" + echo '::endgroup::' + + echo "::group::Install dependencies via pip, including extra deps." + ./scripts/install_via_pip.sh + echo "::endgroup::" + + echo "::group::Run nvidia-smi" + nvidia-smi + echo "::endgroup::" + + echo "::group::Run charlstm example end to end" + mkdir -p runs/charlstm/data + wget https://download.pytorch.org/tutorial/data.zip -O runs/charlstm/data/data.zip + unzip runs/charlstm/data/data.zip -d runs/charlstm/data + rm runs/charlstm/data/data.zip + mkdir -p runs/charlstm/test-reports + echo "Using $(python -V)" + echo "Using $(pip -V)" + pip install scikit-learn + python examples/char-lstm-classification.py --epochs=20 --learning-rate=2.0 --hidden-size=128 --delta=8e-5 --batch-size 400 --n-layers=1 --sigma=1.0 --max-per-sample-grad-norm=1.5 --data-root="runs/charlstm/data/data/names/" --device="cuda" --test-every 5 + python -c "import torch; accuracy = torch.load('run_results_chr_lstm_classification.pt'); exit(0) if (accuracy>0.60 and accuracy<0.80) else exit(1)" + echo "::endgroup::" + + dcgan: + strategy: + matrix: + python_version: ["3.9"] + cuda_arch_version: ["11.8"] + fail-fast: false + uses: pytorch/test-infra/.github/workflows/linux_job.yml@main + with: + runner: linux.g5.4xlarge.nvidia.gpu + gpu-arch-type: cuda + gpu-arch-version: ${{ matrix.cuda_arch_version }} + repository: pytorch/opacus + timeout: 60 + script: | + echo '::group::Create conda env with correct Python version' + set -x + PYTHON_VERSION="${{ matrix.python_version }}" + conda create --yes --quiet -n test python="${PYTHON_VERSION}" + conda activate test + python --version | grep "${PYTHON_VERSION}" + echo '::endgroup::' + + echo "::group::Install dependencies via pip, including extra deps." + ./scripts/install_via_pip.sh + echo "::endgroup::" + + echo "::group::Run nvidia-smi" + nvidia-smi + echo "::endgroup::" + + echo "::group::Run dcgan example end to end" + mkdir -p runs/dcgan/data + mkdir -p runs/dcgan/test-reports + echo "Using $(python -V) ($(which python))" + echo "Using $(pip -V) ($(which pip))" + python examples/dcgan.py --lr 2e-4 --sigma 0.7 -c 1.5 --batch-size 32 --epochs 1 --data-root runs/dcgan/data --device cuda + echo "::endgroup::" diff --git a/.github/workflows/lint-checks.yml b/.github/workflows/lint-checks.yml new file mode 100644 index 00000000..fe8e60c0 --- /dev/null +++ b/.github/workflows/lint-checks.yml @@ -0,0 +1,44 @@ +name: Lint checks release version of PyTorch on Linux CPU + +on: + pull_request: + push: + branches: + - main + workflow_dispatch: + +jobs: + lint: + strategy: + matrix: + python_version: ["3.9"] + fail-fast: false + uses: pytorch/test-infra/.github/workflows/linux_job.yml@main + with: + runner: linux.2xlarge + repository: pytorch/opacus + timeout: 60 + script: | + echo '::group::Create conda env with correct Python version' + set -x + PYTHON_VERSION="${{ matrix.python_version }}" + conda create --yes --quiet -n test python="${PYTHON_VERSION}" + conda activate test + python --version | grep "${PYTHON_VERSION}" + echo '::endgroup::' + + echo '::group::Install dependencies via pip, including extra deps.' + ./scripts/install_via_pip.sh + echo '::endgroup::' + + echo '::group::Lint with flake8' + flake8 --config ./.github/flake8_config.ini + echo '::endgroup::' + + echo '::group::Lint with black' + black --check --diff --color . + echo '::endgroup::' + + echo '::group::Check import order with isort' + isort -v -l 88 -o opacus --lines-after-imports 2 -m 3 --trailing-comma --check-only . + echo '::endgroup::' diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml new file mode 100644 index 00000000..cb2659ff --- /dev/null +++ b/.github/workflows/unit-tests.yml @@ -0,0 +1,105 @@ +name: Unit-tests with release and nightly versions of PyTorch on Linux CPU and CUDA + +on: + pull_request: + push: + branches: + - main + workflow_dispatch: + +jobs: + unit_tests_cpu: + strategy: + matrix: + python_version: ["3.9"] + pytorch_version: ["nightly", "release"] + fail-fast: false + uses: pytorch/test-infra/.github/workflows/linux_job.yml@main + with: + runner: linux.2xlarge + repository: pytorch/opacus + timeout: 60 + script: | + echo '::group::Create conda env with correct Python version' + set -x + PYTHON_VERSION="${{ matrix.python_version }}" + conda create --yes --quiet -n test python="${PYTHON_VERSION}" + conda activate test + python --version | grep "${PYTHON_VERSION}" + echo '::endgroup::' + + echo '::group::Install dependencies via pip, including extra deps.' + if ["${{ matrix.pytorch_version }}" == "nightly"]; then + pip_install_arg="-n" + else + pip_install_arg="" + fi + ./scripts/install_via_pip.sh "$pip_install_arg" + echo '::endgroup::' + + echo '::group::Run unit tests' + mkdir unittest-reports + python -m pytest --doctest-modules -p conftest --junitxml=unittest-reports/junit.xml opacus + echo '::endgroup::' + + unit_test_multi_gpu: + strategy: + matrix: + python_version: ["3.9"] + cuda_arch_version: ["12.0"] + fail-fast: false + uses: pytorch/test-infra/.github/workflows/linux_job.yml@main + with: + runner: linux.g5.4xlarge.nvidia.gpu + gpu-arch-type: cuda + gpu-arch-version: ${{ matrix.cuda_arch_version }} + repository: pytorch/opacus + timeout: 60 + script: | + echo '::group::Create conda env with correct Python version' + set -x + PYTHON_VERSION="${{ matrix.python_version }}" + conda create --yes --quiet -n test python="${PYTHON_VERSION}" + conda activate test + python --version | grep "${PYTHON_VERSION}" + echo '::endgroup::' + + echo '::group::Install dependencies via pip, including extra deps.' + ./scripts/install_via_pip.sh + echo '::endgroup::' + + echo '::group::Run nvidia-smi' + nvidia-smi + echo '::endgroup::' + + echo '::group::Run multi gpu unit tests' + mkdir unittest-multigpu-reports + python -m unittest opacus.tests.multigpu_gradcheck.GradientComputationTest.test_gradient_correct + echo '::endgroup::' + + prv_accountant_values: + strategy: + matrix: + python_version: ["3.9"] + fail-fast: false + uses: pytorch/test-infra/.github/workflows/linux_job.yml@main + with: + runner: linux.2xlarge + repository: pytorch/opacus + timeout: 60 + script: | + echo '::group::Create conda env with correct Python version' + set -x + PYTHON_VERSION="${{ matrix.python_version }}" + conda create --yes --quiet -n test python="${PYTHON_VERSION}" + conda activate test + python --version | grep "${PYTHON_VERSION}" + echo '::endgroup::' + + echo '::group::Install dependencies via pip, including extra deps.' + ./scripts/install_via_pip.sh + echo '::endgroup::' + + echo '::group::Unit test prv accountant' + python -m unittest opacus.tests.prv_accountant + echo '::endgroup::'