From dad5f10138bca80241fc1b1cb569ba7dd3f4be5d Mon Sep 17 00:00:00 2001 From: Yang Gu Date: Thu, 18 Jun 2020 10:32:23 +0800 Subject: [PATCH] Add unittest to CI --- .circleci/config.yml | 369 +++++++++++++----- .circleci/config.yml.in | 200 ++++++++-- .circleci/regenerate.py | 39 +- .../unittest/linux/scripts/environment.yml | 14 + .circleci/unittest/linux/scripts/install.sh | 23 ++ .../unittest/linux/scripts/post_process.sh | 8 + .circleci/unittest/linux/scripts/run_test.sh | 9 + .circleci/unittest/linux/scripts/setup_env.sh | 34 ++ .../unittest/windows/scripts/environment.yml | 14 + .circleci/unittest/windows/scripts/install.sh | 25 ++ .../windows/scripts/install_conda.bat | 1 + .../unittest/windows/scripts/post_process.sh | 8 + .../unittest/windows/scripts/run_test.sh | 9 + .../unittest/windows/scripts/setup_env.sh | 39 ++ .../windows/scripts/vc_env_helper.bat | 39 ++ packaging/torchvision/meta.yaml | 2 - 16 files changed, 699 insertions(+), 134 deletions(-) create mode 100644 .circleci/unittest/linux/scripts/environment.yml create mode 100755 .circleci/unittest/linux/scripts/install.sh create mode 100755 .circleci/unittest/linux/scripts/post_process.sh create mode 100755 .circleci/unittest/linux/scripts/run_test.sh create mode 100755 .circleci/unittest/linux/scripts/setup_env.sh create mode 100644 .circleci/unittest/windows/scripts/environment.yml create mode 100644 .circleci/unittest/windows/scripts/install.sh create mode 100644 .circleci/unittest/windows/scripts/install_conda.bat create mode 100644 .circleci/unittest/windows/scripts/post_process.sh create mode 100644 .circleci/unittest/windows/scripts/run_test.sh create mode 100644 .circleci/unittest/windows/scripts/setup_env.sh create mode 100644 .circleci/unittest/windows/scripts/vc_env_helper.bat diff --git a/.circleci/config.yml b/.circleci/config.yml index 081337bdcf9..9de70fc4c11 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -225,36 +225,6 @@ jobs: docker run --gpus all --ipc=host -v $(pwd):/remote -w /remote ${VARS_TO_PASS} ${DOCKER_IMAGE} ./packaging/build_conda.sh binary_win_conda: - <<: *binary_common - executor: windows-cpu - steps: - - checkout_merge - - run: - command: | - set -ex - source packaging/windows/internal/vc_install_helper.sh - eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')" - conda activate base - conda install -yq conda-build "conda-package-handling!=1.5.0" - packaging/build_conda.sh - - store_test_results: - path: build_results/ - - binary_win_conda_cuda: - <<: *binary_common - executor: windows-gpu - steps: - - checkout_merge - - run: - command: | - set -ex - source packaging/windows/internal/vc_install_helper.sh - eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')" - conda activate base - conda install -yq conda-build "conda-package-handling!=1.5.0" - packaging/build_conda.sh - - binary_win_conda_release: <<: *binary_common executor: windows-cpu steps: @@ -279,7 +249,7 @@ jobs: - store_test_results: path: build_results/ - binary_win_wheel_release: + binary_win_wheel: <<: *binary_common executor: windows-cpu steps: @@ -385,6 +355,159 @@ jobs: aws s3 cp "$pkg" "s3://pytorch/whl/${UPLOAD_CHANNEL}/<< parameters.subfolder >>" --acl public-read done + unittest_linux_cpu: + <<: *binary_common + docker: + - image: "pytorch/manylinux-cuda102" + resource_class: 2xlarge+ + steps: + - checkout + - run: + name: Generate cache key + # This will refresh cache on Sundays, nightly build should generate new cache. + command: echo "$(date +"%Y-%U")" > .circleci-weekly + - restore_cache: + + keys: + - env-v2-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} + + - run: + name: Setup + command: .circleci/unittest/linux/scripts/setup_env.sh + - save_cache: + + key: env-v2-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} + + paths: + - conda + - env + - run: + name: Install torchvision + command: .circleci/unittest/linux/scripts/install.sh + - run: + name: Run tests + command: .circleci/unittest/linux/scripts/run_test.sh + - run: + name: Post process + command: .circleci/unittest/linux/scripts/post_process.sh + - store_test_results: + path: test-results + + unittest_linux_gpu: + <<: *binary_common + machine: + image: ubuntu-1604-cuda-10.1:201909-23 + resource_class: gpu.small + environment: + image_name: "pytorch/manylinux-cuda101" + steps: + - checkout + - run: + name: Generate cache key + # This will refresh cache on Sundays, nightly build should generate new cache. + command: echo "$(date +"%Y-%U")" > .circleci-weekly + - restore_cache: + + keys: + - env-v2-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} + + - run: + name: Setup + command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/setup_env.sh + - save_cache: + + key: env-v2-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} + + paths: + - conda + - env + - run: + name: Install torchvision + command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/install.sh + - run: + name: Run tests + command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/run_test.sh + - run: + name: Post Process + command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/post_process.sh + - store_test_results: + path: test-results + + unittest_windows_cpu: + <<: *binary_common + executor: + name: windows-cpu + steps: + - checkout + - run: + name: Generate cache key + # This will refresh cache on Sundays, nightly build should generate new cache. + command: echo "$(date +"%Y-%U")" > .circleci-weekly + - restore_cache: + + keys: + - env-v2-windows-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/windows/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} + + - run: + name: Setup + command: .circleci/unittest/windows/scripts/setup_env.sh + - save_cache: + + key: env-v2-windows-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/windows/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} + + paths: + - conda + - env + - run: + name: Install torchvision + command: .circleci/unittest/windows/scripts/install.sh + - run: + name: Run tests + command: .circleci/unittest/windows/scripts/run_test.sh + - run: + name: Post process + command: .circleci/unittest/windows/scripts/post_process.sh + - store_test_results: + path: test-results + + unittest_windows_gpu: + <<: *binary_common + executor: + name: windows-gpu + environment: + CUDA_VERSION: "10.1" + steps: + - checkout + - run: + name: Generate cache key + # This will refresh cache on Sundays, nightly build should generate new cache. + command: echo "$(date +"%Y-%U")" > .circleci-weekly + - restore_cache: + + keys: + - env-v1-windows-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/windows/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} + + - run: + name: Setup + command: .circleci/unittest/windows/scripts/setup_env.sh + - save_cache: + + key: env-v1-windows-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/windows/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} + + paths: + - conda + - env + - run: + name: Install torchvision + command: .circleci/unittest/windows/scripts/install.sh + - run: + name: Run tests + command: .circleci/unittest/windows/scripts/run_test.sh + - run: + name: Post process + command: .circleci/unittest/windows/scripts/post_process.sh + - store_test_results: + path: test-results workflows: build: @@ -465,81 +588,81 @@ workflows: name: binary_macos_wheel_py3.8_cpu python_version: '3.8' wheel_docker_image: pytorch/manylinux-cuda102 - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cpu filters: branches: only: master name: binary_win_wheel_py3.6_cpu python_version: '3.6' - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cu92 filters: branches: only: master name: binary_win_wheel_py3.6_cu92 python_version: '3.6' - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cu101 filters: branches: only: master name: binary_win_wheel_py3.6_cu101 python_version: '3.6' - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cu102 filters: branches: only: master name: binary_win_wheel_py3.6_cu102 python_version: '3.6' - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cpu filters: branches: only: master name: binary_win_wheel_py3.7_cpu python_version: '3.7' - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cu92 filters: branches: only: master name: binary_win_wheel_py3.7_cu92 python_version: '3.7' - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cu101 filters: branches: only: master name: binary_win_wheel_py3.7_cu101 python_version: '3.7' - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cu102 filters: branches: only: master name: binary_win_wheel_py3.7_cu102 python_version: '3.7' - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cpu name: binary_win_wheel_py3.8_cpu python_version: '3.8' - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cu92 filters: branches: only: master name: binary_win_wheel_py3.8_cu92 python_version: '3.8' - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cu101 filters: branches: only: master name: binary_win_wheel_py3.8_cu101 python_version: '3.8' - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cu102 name: binary_win_wheel_py3.8_cu102 python_version: '3.8' @@ -618,81 +741,81 @@ workflows: name: binary_macos_conda_py3.8_cpu python_version: '3.8' wheel_docker_image: pytorch/manylinux-cuda102 - - binary_win_conda_release: + - binary_win_conda: cu_version: cpu filters: branches: only: master name: binary_win_conda_py3.6_cpu python_version: '3.6' - - binary_win_conda_release: + - binary_win_conda: cu_version: cu92 filters: branches: only: master name: binary_win_conda_py3.6_cu92 python_version: '3.6' - - binary_win_conda_release: + - binary_win_conda: cu_version: cu101 filters: branches: only: master name: binary_win_conda_py3.6_cu101 python_version: '3.6' - - binary_win_conda_release: + - binary_win_conda: cu_version: cu102 filters: branches: only: master name: binary_win_conda_py3.6_cu102 python_version: '3.6' - - binary_win_conda_release: + - binary_win_conda: cu_version: cpu filters: branches: only: master name: binary_win_conda_py3.7_cpu python_version: '3.7' - - binary_win_conda_release: + - binary_win_conda: cu_version: cu92 filters: branches: only: master name: binary_win_conda_py3.7_cu92 python_version: '3.7' - - binary_win_conda_release: + - binary_win_conda: cu_version: cu101 filters: branches: only: master name: binary_win_conda_py3.7_cu101 python_version: '3.7' - - binary_win_conda_release: + - binary_win_conda: cu_version: cu102 filters: branches: only: master name: binary_win_conda_py3.7_cu102 python_version: '3.7' - - binary_win_conda_release: + - binary_win_conda: cu_version: cpu name: binary_win_conda_py3.8_cpu python_version: '3.8' - - binary_win_conda_release: + - binary_win_conda: cu_version: cu92 filters: branches: only: master name: binary_win_conda_py3.8_cu92 python_version: '3.8' - - binary_win_conda_release: + - binary_win_conda: cu_version: cu101 filters: branches: only: master name: binary_win_conda_py3.8_cu101 python_version: '3.8' - - binary_win_conda_release: + - binary_win_conda: cu_version: cu102 name: binary_win_conda_py3.8_cu102 python_version: '3.8' @@ -700,18 +823,90 @@ workflows: name: torchvision_linux_py3.8_cu102_cuda python_version: "3.8" cu_version: "cu102" - - binary_win_conda: - name: torchvision_win_py3.6_cpu - python_version: "3.6" - cu_version: "cpu" - - binary_win_conda_cuda: - name: torchvision_win_py3.6_cu101 - python_version: "3.6" - cu_version: "cu101" - python_lint - python_type_check - clang_format + unittest: + jobs: + - unittest_linux_cpu: + cu_version: cpu + name: unittest_linux_cpu_py3.6 + python_version: '3.6' + - unittest_linux_cpu: + cu_version: cpu + name: unittest_linux_cpu_py3.7 + python_version: '3.7' + - unittest_linux_cpu: + cu_version: cpu + name: unittest_linux_cpu_py3.8 + python_version: '3.8' + - unittest_linux_gpu: + cu_version: cu101 + filters: + branches: + only: + - master + - nightly + name: unittest_linux_gpu_py3.6 + python_version: '3.6' + - unittest_linux_gpu: + cu_version: cu101 + filters: + branches: + only: + - master + - nightly + name: unittest_linux_gpu_py3.7 + python_version: '3.7' + - unittest_linux_gpu: + cu_version: cu101 + filters: + branches: + only: + - master + - nightly + name: unittest_linux_gpu_py3.8 + python_version: '3.8' + - unittest_windows_cpu: + cu_version: cpu + name: unittest_windows_cpu_py3.6 + python_version: '3.6' + - unittest_windows_cpu: + cu_version: cpu + name: unittest_windows_cpu_py3.7 + python_version: '3.7' + - unittest_windows_cpu: + cu_version: cpu + name: unittest_windows_cpu_py3.8 + python_version: '3.8' + - unittest_windows_gpu: + cu_version: cu101 + filters: + branches: + only: + - master + - nightly + name: unittest_windows_gpu_py3.6 + python_version: '3.6' + - unittest_windows_gpu: + cu_version: cu101 + filters: + branches: + only: + - master + - nightly + name: unittest_windows_gpu_py3.7 + python_version: '3.7' + - unittest_windows_gpu: + cu_version: cu101 + filters: + branches: + only: + - master + - nightly + name: unittest_windows_gpu_py3.8 + python_version: '3.8' nightly: jobs: - circleci_consistency @@ -1003,7 +1198,7 @@ workflows: requires: - nightly_binary_macos_wheel_py3.8_cpu subfolder: '' - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cpu filters: branches: @@ -1021,7 +1216,7 @@ workflows: requires: - nightly_binary_win_wheel_py3.6_cpu subfolder: cpu/ - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cu92 filters: branches: @@ -1039,7 +1234,7 @@ workflows: requires: - nightly_binary_win_wheel_py3.6_cu92 subfolder: cu92/ - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cu101 filters: branches: @@ -1057,7 +1252,7 @@ workflows: requires: - nightly_binary_win_wheel_py3.6_cu101 subfolder: cu101/ - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cu102 filters: branches: @@ -1075,7 +1270,7 @@ workflows: requires: - nightly_binary_win_wheel_py3.6_cu102 subfolder: cu102/ - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cpu filters: branches: @@ -1093,7 +1288,7 @@ workflows: requires: - nightly_binary_win_wheel_py3.7_cpu subfolder: cpu/ - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cu92 filters: branches: @@ -1111,7 +1306,7 @@ workflows: requires: - nightly_binary_win_wheel_py3.7_cu92 subfolder: cu92/ - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cu101 filters: branches: @@ -1129,7 +1324,7 @@ workflows: requires: - nightly_binary_win_wheel_py3.7_cu101 subfolder: cu101/ - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cu102 filters: branches: @@ -1147,7 +1342,7 @@ workflows: requires: - nightly_binary_win_wheel_py3.7_cu102 subfolder: cu102/ - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cpu filters: branches: @@ -1165,7 +1360,7 @@ workflows: requires: - nightly_binary_win_wheel_py3.8_cpu subfolder: cpu/ - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cu92 filters: branches: @@ -1183,7 +1378,7 @@ workflows: requires: - nightly_binary_win_wheel_py3.8_cu92 subfolder: cu92/ - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cu101 filters: branches: @@ -1201,7 +1396,7 @@ workflows: requires: - nightly_binary_win_wheel_py3.8_cu101 subfolder: cu101/ - - binary_win_wheel_release: + - binary_win_wheel: cu_version: cu102 filters: branches: @@ -1489,7 +1684,7 @@ workflows: name: nightly_binary_macos_conda_py3.8_cpu_upload requires: - nightly_binary_macos_conda_py3.8_cpu - - binary_win_conda_release: + - binary_win_conda: cu_version: cpu filters: branches: @@ -1506,7 +1701,7 @@ workflows: name: nightly_binary_win_conda_py3.6_cpu_upload requires: - nightly_binary_win_conda_py3.6_cpu - - binary_win_conda_release: + - binary_win_conda: cu_version: cu92 filters: branches: @@ -1523,7 +1718,7 @@ workflows: name: nightly_binary_win_conda_py3.6_cu92_upload requires: - nightly_binary_win_conda_py3.6_cu92 - - binary_win_conda_release: + - binary_win_conda: cu_version: cu101 filters: branches: @@ -1540,7 +1735,7 @@ workflows: name: nightly_binary_win_conda_py3.6_cu101_upload requires: - nightly_binary_win_conda_py3.6_cu101 - - binary_win_conda_release: + - binary_win_conda: cu_version: cu102 filters: branches: @@ -1557,7 +1752,7 @@ workflows: name: nightly_binary_win_conda_py3.6_cu102_upload requires: - nightly_binary_win_conda_py3.6_cu102 - - binary_win_conda_release: + - binary_win_conda: cu_version: cpu filters: branches: @@ -1574,7 +1769,7 @@ workflows: name: nightly_binary_win_conda_py3.7_cpu_upload requires: - nightly_binary_win_conda_py3.7_cpu - - binary_win_conda_release: + - binary_win_conda: cu_version: cu92 filters: branches: @@ -1591,7 +1786,7 @@ workflows: name: nightly_binary_win_conda_py3.7_cu92_upload requires: - nightly_binary_win_conda_py3.7_cu92 - - binary_win_conda_release: + - binary_win_conda: cu_version: cu101 filters: branches: @@ -1608,7 +1803,7 @@ workflows: name: nightly_binary_win_conda_py3.7_cu101_upload requires: - nightly_binary_win_conda_py3.7_cu101 - - binary_win_conda_release: + - binary_win_conda: cu_version: cu102 filters: branches: @@ -1625,7 +1820,7 @@ workflows: name: nightly_binary_win_conda_py3.7_cu102_upload requires: - nightly_binary_win_conda_py3.7_cu102 - - binary_win_conda_release: + - binary_win_conda: cu_version: cpu filters: branches: @@ -1642,7 +1837,7 @@ workflows: name: nightly_binary_win_conda_py3.8_cpu_upload requires: - nightly_binary_win_conda_py3.8_cpu - - binary_win_conda_release: + - binary_win_conda: cu_version: cu92 filters: branches: @@ -1659,7 +1854,7 @@ workflows: name: nightly_binary_win_conda_py3.8_cu92_upload requires: - nightly_binary_win_conda_py3.8_cu92 - - binary_win_conda_release: + - binary_win_conda: cu_version: cu101 filters: branches: @@ -1676,7 +1871,7 @@ workflows: name: nightly_binary_win_conda_py3.8_cu101_upload requires: - nightly_binary_win_conda_py3.8_cu101 - - binary_win_conda_release: + - binary_win_conda: cu_version: cu102 filters: branches: diff --git a/.circleci/config.yml.in b/.circleci/config.yml.in index 620e00807d4..4171ef2fd61 100644 --- a/.circleci/config.yml.in +++ b/.circleci/config.yml.in @@ -225,36 +225,6 @@ jobs: docker run --gpus all --ipc=host -v $(pwd):/remote -w /remote ${VARS_TO_PASS} ${DOCKER_IMAGE} ./packaging/build_conda.sh binary_win_conda: - <<: *binary_common - executor: windows-cpu - steps: - - checkout_merge - - run: - command: | - set -ex - source packaging/windows/internal/vc_install_helper.sh - eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')" - conda activate base - conda install -yq conda-build "conda-package-handling!=1.5.0" - packaging/build_conda.sh - - store_test_results: - path: build_results/ - - binary_win_conda_cuda: - <<: *binary_common - executor: windows-gpu - steps: - - checkout_merge - - run: - command: | - set -ex - source packaging/windows/internal/vc_install_helper.sh - eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')" - conda activate base - conda install -yq conda-build "conda-package-handling!=1.5.0" - packaging/build_conda.sh - - binary_win_conda_release: <<: *binary_common executor: windows-cpu steps: @@ -279,7 +249,7 @@ jobs: - store_test_results: path: build_results/ - binary_win_wheel_release: + binary_win_wheel: <<: *binary_common executor: windows-cpu steps: @@ -385,29 +355,177 @@ jobs: aws s3 cp "$pkg" "s3://pytorch/whl/${UPLOAD_CHANNEL}/<< parameters.subfolder >>" --acl public-read done + unittest_linux_cpu: + <<: *binary_common + docker: + - image: "pytorch/manylinux-cuda102" + resource_class: 2xlarge+ + steps: + - checkout + - run: + name: Generate cache key + # This will refresh cache on Sundays, nightly build should generate new cache. + command: echo "$(date +"%Y-%U")" > .circleci-weekly + - restore_cache: + {% raw %} + keys: + - env-v2-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} + {% endraw %} + - run: + name: Setup + command: .circleci/unittest/linux/scripts/setup_env.sh + - save_cache: + {% raw %} + key: env-v2-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} + {% endraw %} + paths: + - conda + - env + - run: + name: Install torchvision + command: .circleci/unittest/linux/scripts/install.sh + - run: + name: Run tests + command: .circleci/unittest/linux/scripts/run_test.sh + - run: + name: Post process + command: .circleci/unittest/linux/scripts/post_process.sh + - store_test_results: + path: test-results + + unittest_linux_gpu: + <<: *binary_common + machine: + image: ubuntu-1604-cuda-10.1:201909-23 + resource_class: gpu.small + environment: + image_name: "pytorch/manylinux-cuda101" + steps: + - checkout + - run: + name: Generate cache key + # This will refresh cache on Sundays, nightly build should generate new cache. + command: echo "$(date +"%Y-%U")" > .circleci-weekly + - restore_cache: + {% raw %} + keys: + - env-v2-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} + {% endraw %} + - run: + name: Setup + command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/setup_env.sh + - save_cache: + {% raw %} + key: env-v2-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} + {% endraw %} + paths: + - conda + - env + - run: + name: Install torchvision + command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/install.sh + - run: + name: Run tests + command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/run_test.sh + - run: + name: Post Process + command: docker run -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/post_process.sh + - store_test_results: + path: test-results + + unittest_windows_cpu: + <<: *binary_common + executor: + name: windows-cpu + steps: + - checkout + - run: + name: Generate cache key + # This will refresh cache on Sundays, nightly build should generate new cache. + command: echo "$(date +"%Y-%U")" > .circleci-weekly + - restore_cache: + {% raw %} + keys: + - env-v2-windows-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/windows/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} + {% endraw %} + - run: + name: Setup + command: .circleci/unittest/windows/scripts/setup_env.sh + - save_cache: + {% raw %} + key: env-v2-windows-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/windows/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} + {% endraw %} + paths: + - conda + - env + - run: + name: Install torchvision + command: .circleci/unittest/windows/scripts/install.sh + - run: + name: Run tests + command: .circleci/unittest/windows/scripts/run_test.sh + - run: + name: Post process + command: .circleci/unittest/windows/scripts/post_process.sh + - store_test_results: + path: test-results + + unittest_windows_gpu: + <<: *binary_common + executor: + name: windows-gpu + environment: + CUDA_VERSION: "10.1" + steps: + - checkout + - run: + name: Generate cache key + # This will refresh cache on Sundays, nightly build should generate new cache. + command: echo "$(date +"%Y-%U")" > .circleci-weekly + - restore_cache: + {% raw %} + keys: + - env-v1-windows-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/windows/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} + {% endraw %} + - run: + name: Setup + command: .circleci/unittest/windows/scripts/setup_env.sh + - save_cache: + {% raw %} + key: env-v1-windows-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/windows/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }} + {% endraw %} + paths: + - conda + - env + - run: + name: Install torchvision + command: .circleci/unittest/windows/scripts/install.sh + - run: + name: Run tests + command: .circleci/unittest/windows/scripts/run_test.sh + - run: + name: Post process + command: .circleci/unittest/windows/scripts/post_process.sh + - store_test_results: + path: test-results workflows: build: {%- if True %} jobs: - circleci_consistency - {{ workflows(windows_latest_only=True) }} + {{ build_workflows(windows_latest_only=True) }} - binary_linux_conda_cuda: name: torchvision_linux_py3.8_cu102_cuda python_version: "3.8" cu_version: "cu102" - - binary_win_conda: - name: torchvision_win_py3.6_cpu - python_version: "3.6" - cu_version: "cpu" - - binary_win_conda_cuda: - name: torchvision_win_py3.6_cu101 - python_version: "3.6" - cu_version: "cu101" - python_lint - python_type_check - clang_format + unittest: + jobs: + {{ unittest_workflows() }} nightly: {%- endif %} jobs: @@ -415,4 +533,4 @@ workflows: - python_lint - python_type_check - clang_format - {{ workflows(prefix="nightly_", filter_branch="nightly", upload=True) }} + {{ build_workflows(prefix="nightly_", filter_branch="nightly", upload=True) }} diff --git a/.circleci/regenerate.py b/.circleci/regenerate.py index 1e929242974..dba1536812c 100755 --- a/.circleci/regenerate.py +++ b/.circleci/regenerate.py @@ -19,11 +19,14 @@ import os.path -def workflows(prefix='', filter_branch=None, upload=False, indentation=6, windows_latest_only=False): +PYTHON_VERSIONS = ["3.6", "3.7", "3.8"] + + +def build_workflows(prefix='', filter_branch=None, upload=False, indentation=6, windows_latest_only=False): w = [] for btype in ["wheel", "conda"]: for os_type in ["linux", "macos", "win"]: - python_versions = ["3.6", "3.7", "3.8"] + python_versions = PYTHON_VERSIONS cu_versions = (["cpu", "cu92", "cu101", "cu102"] if os_type == "linux" or os_type == "win" else ["cpu"]) for python_version in python_versions: for cu_version in cu_versions: @@ -88,10 +91,14 @@ def generate_base_workflow(base_workflow_name, python_version, cu_version, if filter_branch is not None: d["filters"] = {"branches": {"only": filter_branch}} - w = f"binary_{os_type}_{btype}_release" if os_type == "win" else f"binary_{os_type}_{btype}" + w = f"binary_{os_type}_{btype}" return {w: d} +def gen_filter_branch_tree(*branches): + return {"branches": {"only": [b for b in branches]}} + + def generate_upload_workflow(base_workflow_name, os_type, btype, cu_version, *, filter_branch=None): d = { "name": f"{base_workflow_name}_upload", @@ -122,6 +129,27 @@ def indent(indentation, data_list): yaml.dump(data_list, default_flow_style=False).splitlines()) +def unittest_workflows(indentation=6): + jobs = [] + for os_type in ["linux", "windows"]: + for device_type in ["cpu", "gpu"]: + for i, python_version in enumerate(PYTHON_VERSIONS): + job = { + "name": f"unittest_{os_type}_{device_type}_py{python_version}", + "python_version": python_version, + } + + if device_type == 'gpu': + job['filters'] = gen_filter_branch_tree('master', 'nightly') + job['cu_version'] = 'cu101' + else: + job['cu_version'] = 'cpu' + + jobs.append({f"unittest_{os_type}_{device_type}": job}) + + return indent(indentation, jobs) + + if __name__ == "__main__": d = os.path.dirname(__file__) env = jinja2.Environment( @@ -131,4 +159,7 @@ def indent(indentation, data_list): ) with open(os.path.join(d, 'config.yml'), 'w') as f: - f.write(env.get_template('config.yml.in').render(workflows=workflows)) + f.write(env.get_template('config.yml.in').render( + build_workflows=build_workflows, + unittest_workflows=unittest_workflows, + )) diff --git a/.circleci/unittest/linux/scripts/environment.yml b/.circleci/unittest/linux/scripts/environment.yml new file mode 100644 index 00000000000..d664c7c0f7f --- /dev/null +++ b/.circleci/unittest/linux/scripts/environment.yml @@ -0,0 +1,14 @@ +channels: + - defaults +dependencies: + - numpy + - pytest + - pytest-cov + - codecov + - pip + - ca-certificates + - pip: + - future + - pillow>=4.1.1 + - scipy + - av \ No newline at end of file diff --git a/.circleci/unittest/linux/scripts/install.sh b/.circleci/unittest/linux/scripts/install.sh new file mode 100755 index 00000000000..966a6b45eb7 --- /dev/null +++ b/.circleci/unittest/linux/scripts/install.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +unset PYTORCH_VERSION +# For unittest, nightly PyTorch is used as the following section, +# so no need to set PYTORCH_VERSION. +# In fact, keeping PYTORCH_VERSION forces us to hardcode PyTorch version in config. + +set -e + +eval "$(./conda/bin/conda shell.bash hook)" +conda activate ./env + +if [ -z "${CUDA_VERSION:-}" ] ; then + cudatoolkit="cpuonly" +else + version="$(python -c "print('.'.join(\"${CUDA_VERSION}\".split('.')[:2]))")" + cudatoolkit="cudatoolkit=${version}" +fi +printf "Installing PyTorch with %s\n" "${cudatoolkit}" +conda install -y -c pytorch-nightly pytorch "${cudatoolkit}" + +printf "* Installing torchvision\n" +python setup.py develop \ No newline at end of file diff --git a/.circleci/unittest/linux/scripts/post_process.sh b/.circleci/unittest/linux/scripts/post_process.sh new file mode 100755 index 00000000000..b05be6da37e --- /dev/null +++ b/.circleci/unittest/linux/scripts/post_process.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e + +eval "$(./conda/bin/conda shell.bash hook)" +conda activate ./env + +codecov \ No newline at end of file diff --git a/.circleci/unittest/linux/scripts/run_test.sh b/.circleci/unittest/linux/scripts/run_test.sh new file mode 100755 index 00000000000..169d65cccf1 --- /dev/null +++ b/.circleci/unittest/linux/scripts/run_test.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -e + +eval "$(./conda/bin/conda shell.bash hook)" +conda activate ./env + +python -m torch.utils.collect_env +pytest --cov=torchaudio --junitxml=test-results/junit.xml -v --durations 20 test \ No newline at end of file diff --git a/.circleci/unittest/linux/scripts/setup_env.sh b/.circleci/unittest/linux/scripts/setup_env.sh new file mode 100755 index 00000000000..a90fb071a08 --- /dev/null +++ b/.circleci/unittest/linux/scripts/setup_env.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +# This script is for setting up environment in which unit test is ran. +# To speed up the CI time, the resulting environment is cached. +# +# Do not install PyTorch and torchaudio here, otherwise they also get cached. + +set -e + +this_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +root_dir="$(git rev-parse --show-toplevel)" +conda_dir="${root_dir}/conda" +env_dir="${root_dir}/env" + +cd "${root_dir}" + +# 1. Install conda at ./conda +if [ ! -d "${conda_dir}" ]; then + printf "* Installing conda\n" + wget -O miniconda.sh http://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh + bash ./miniconda.sh -b -f -p "${conda_dir}" +fi +eval "$(${conda_dir}/bin/conda shell.bash hook)" + +# 2. Create test environment at ./env +if [ ! -d "${env_dir}" ]; then + printf "* Creating a test environment\n" + conda create --prefix "${env_dir}" -y python="$PYTHON_VERSION" +fi +conda activate "${env_dir}" + +# 3. Install Conda dependencies +printf "* Installing dependencies (except PyTorch)\n" +conda env update --file "${this_dir}/environment.yml" --prune diff --git a/.circleci/unittest/windows/scripts/environment.yml b/.circleci/unittest/windows/scripts/environment.yml new file mode 100644 index 00000000000..d664c7c0f7f --- /dev/null +++ b/.circleci/unittest/windows/scripts/environment.yml @@ -0,0 +1,14 @@ +channels: + - defaults +dependencies: + - numpy + - pytest + - pytest-cov + - codecov + - pip + - ca-certificates + - pip: + - future + - pillow>=4.1.1 + - scipy + - av \ No newline at end of file diff --git a/.circleci/unittest/windows/scripts/install.sh b/.circleci/unittest/windows/scripts/install.sh new file mode 100644 index 00000000000..584a868562d --- /dev/null +++ b/.circleci/unittest/windows/scripts/install.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +unset PYTORCH_VERSION +# For unittest, nightly PyTorch is used as the following section, +# so no need to set PYTORCH_VERSION. +# In fact, keeping PYTORCH_VERSION forces us to hardcode PyTorch version in config. + +set -e + +this_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" + +eval "$(./conda/Scripts/conda.exe 'shell.bash' 'hook')" +conda activate ./env + +if [ -z "${CUDA_VERSION:-}" ] ; then + cudatoolkit="cpuonly" +else + version="$(python -c "print('.'.join(\"${CUDA_VERSION}\".split('.')[:2]))")" + cudatoolkit="cudatoolkit=${version}" +fi +printf "Installing PyTorch with %s\n" "${cudatoolkit}" +conda install -y -c pytorch-nightly pytorch "${cudatoolkit}" + +printf "* Installing torchvision\n" +"$this_dir/vc_env_helper.bat" python setup.py develop \ No newline at end of file diff --git a/.circleci/unittest/windows/scripts/install_conda.bat b/.circleci/unittest/windows/scripts/install_conda.bat new file mode 100644 index 00000000000..6612fba56f6 --- /dev/null +++ b/.circleci/unittest/windows/scripts/install_conda.bat @@ -0,0 +1 @@ +start /wait "" "%miniconda_exe%" /S /InstallationType=JustMe /RegisterPython=0 /AddToPath=0 /D=%tmp_conda% \ No newline at end of file diff --git a/.circleci/unittest/windows/scripts/post_process.sh b/.circleci/unittest/windows/scripts/post_process.sh new file mode 100644 index 00000000000..b132113194b --- /dev/null +++ b/.circleci/unittest/windows/scripts/post_process.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e + +eval "$(./conda/Scripts/conda.exe 'shell.bash' 'hook')" +conda activate ./env + +codecov diff --git a/.circleci/unittest/windows/scripts/run_test.sh b/.circleci/unittest/windows/scripts/run_test.sh new file mode 100644 index 00000000000..34de9339429 --- /dev/null +++ b/.circleci/unittest/windows/scripts/run_test.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -e + +eval "$(./conda/Scripts/conda.exe 'shell.bash' 'hook')" +conda activate ./env + +python -m torch.utils.collect_env +pytest --cov=torchvision --junitxml=test-results/junit.xml -v --durations 20 test \ No newline at end of file diff --git a/.circleci/unittest/windows/scripts/setup_env.sh b/.circleci/unittest/windows/scripts/setup_env.sh new file mode 100644 index 00000000000..52eefb6d628 --- /dev/null +++ b/.circleci/unittest/windows/scripts/setup_env.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +# This script is for setting up environment in which unit test is ran. +# To speed up the CI time, the resulting environment is cached. +# +# Do not install PyTorch and torchaudio here, otherwise they also get cached. + +set -e + +this_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +root_dir="$(git rev-parse --show-toplevel)" +conda_dir="${root_dir}/conda" +env_dir="${root_dir}/env" + +cd "${root_dir}" + +# 1. Install conda at ./conda +if [ ! -d "${conda_dir}" ]; then + printf "* Installing conda\n" + export tmp_conda="$(echo $conda_dir | tr '/' '\\')" + export miniconda_exe="$(echo $root_dir | tr '/' '\\')\\miniconda.exe" + curl --output miniconda.exe https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe -O + "$this_dir/install_conda.bat" + unset tmp_conda + unset miniconda_exe +fi + +eval "$(${conda_dir}/Scripts/conda.exe 'shell.bash' 'hook')" + +# 2. Create test environment at ./env +if [ ! -d "${env_dir}" ]; then + printf "* Creating a test environment\n" + conda create --prefix "${env_dir}" -y python="$PYTHON_VERSION" +fi +conda activate "${env_dir}" + +# 3. Install Conda dependencies +printf "* Installing dependencies (except PyTorch)\n" +conda env update --file "${this_dir}/environment.yml" --prune \ No newline at end of file diff --git a/.circleci/unittest/windows/scripts/vc_env_helper.bat b/.circleci/unittest/windows/scripts/vc_env_helper.bat new file mode 100644 index 00000000000..9410135677a --- /dev/null +++ b/.circleci/unittest/windows/scripts/vc_env_helper.bat @@ -0,0 +1,39 @@ +@echo on + +set VC_VERSION_LOWER=16 +set VC_VERSION_UPPER=17 + +for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -legacy -products * -version [%VC_VERSION_LOWER%^,%VC_VERSION_UPPER%^) -property installationPath`) do ( + if exist "%%i" if exist "%%i\VC\Auxiliary\Build\vcvarsall.bat" ( + set "VS15INSTALLDIR=%%i" + set "VS15VCVARSALL=%%i\VC\Auxiliary\Build\vcvarsall.bat" + goto vswhere + ) +) + +:vswhere +if "%VSDEVCMD_ARGS%" == "" ( + call "%VS15VCVARSALL%" x64 || exit /b 1 +) else ( + call "%VS15VCVARSALL%" x64 %VSDEVCMD_ARGS% || exit /b 1 +) + +@echo on + +set DISTUTILS_USE_SDK=1 + +set args=%1 +shift +:start +if [%1] == [] goto done +set args=%args% %1 +shift +goto start + +:done +if "%args%" == "" ( + echo Usage: vc_env_helper.bat [command] [args] + echo e.g. vc_env_helper.bat cl /c test.cpp +) + +%args% || exit /b 1 diff --git a/packaging/torchvision/meta.yaml b/packaging/torchvision/meta.yaml index 8be8eabdd09..7d6f28cdf3c 100644 --- a/packaging/torchvision/meta.yaml +++ b/packaging/torchvision/meta.yaml @@ -47,8 +47,6 @@ test: - av - ca-certificates {{ environ.get('CONDA_TYPING_CONSTRAINT') }} - commands: - pytest . --verbose --junitxml={{ environ.get("CONDA_PYTORCH_BUILD_RESULTS_DIRECTORY", "build/test_results.xml" )}} about: