config.yml.in 35.2 KB
Newer Older
1
2
3
4
version: 2.1

# How to test the Linux jobs:
#   - Install CircleCI local CLI: https://circleci.com/docs/2.0/local-cli/
Edward Z. Yang's avatar
Edward Z. Yang committed
5
6
7
#   - circleci config process .circleci/config.yml > gen.yml && circleci local execute -c gen.yml --job binary_linux_wheel_py3.7
#     - Replace binary_linux_wheel_py3.7 with the name of the job you want to test.
#       Job names are 'name:' key.
8

9
executors:
10
11
12
13
14
15
16
  windows-cpu:
    machine:
      resource_class: windows.xlarge
      image: windows-server-2019-vs2019:stable
      shell: bash.exe

  windows-gpu:
17
    machine:
18
19
      resource_class: windows.gpu.nvidia.medium
      image: windows-server-2019-nvidia:stable
20
21
      shell: bash.exe

22
23
24
25
26
commands:
  checkout_merge:
    description: "checkout merge branch"
    steps:
      - checkout
27
28
29
30
31
#     - run:
#         name: Checkout merge branch
#         command: |
#           set -ex
#           BRANCH=$(git rev-parse --abbrev-ref HEAD)
32
#           if [[ "$BRANCH" != "main" ]]; then
33
34
35
#             git fetch --force origin ${CIRCLE_BRANCH}/merge:merged/${CIRCLE_BRANCH}
#             git checkout "merged/$CIRCLE_BRANCH"
#           fi
36
37
38
39
40
41
  designate_upload_channel:
    description: "inserts the correct upload channel into ${BASH_ENV}"
    steps:
      - run:
          name: adding UPLOAD_CHANNEL to BASH_ENV
          command: |
42
            our_upload_channel=test
43
            echo "export UPLOAD_CHANNEL=${our_upload_channel}" >> ${BASH_ENV}
44

45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
  brew_update:
    description: "Update Homebrew and install base formulae"
    steps:
      - run:
          name: Update Homebrew
          no_output_timeout: "10m"
          command: |
            set -ex

            # Update repositories manually.
            # Running `brew update` produces a comparison between the
            # current checkout and the updated checkout, which takes a
            # very long time because the existing checkout is 2y old.
            for path in $(find /usr/local/Homebrew -type d -name .git)
            do
            cd $path/..
            git fetch --depth=1 origin
            git reset --hard origin/master
            done

            export HOMEBREW_NO_AUTO_UPDATE=1

            # Install expect and moreutils so that we can call `unbuffer` and `ts`.
            # moreutils installs a `parallel` executable by default, which conflicts
            # with the executable from the GNU `parallel`, so we must unlink GNU
            # `parallel` first, and relink it afterwards.
            brew install coreutils
            brew unlink parallel
            brew install moreutils
            brew link parallel --overwrite
            brew install expect

  brew_install:
    description: "Install Homebrew formulae"
    parameters:
      formulae:
        type: string
        default: ""
    steps:
      - run:
          name: Install << parameters.formulae >>
          no_output_timeout: "10m"
          command: |
            set -ex
            export HOMEBREW_NO_AUTO_UPDATE=1
            brew install << parameters.formulae >>

  run_brew_for_ios_build:
    steps:
      - brew_update
      - brew_install:
          formulae: libtool

Philip Meier's avatar
Philip Meier committed
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
  apt_install:
    parameters:
      args:
        type: string
      descr:
        type: string
        default: ""
      update:
        type: boolean
        default: true
    steps:
      - run:
          name: >
            <<^ parameters.descr >> apt install << parameters.args >> <</ parameters.descr >>
            <<# parameters.descr >> << parameters.descr >>            <</ parameters.descr >>
          command: |
            <<# parameters.update >> sudo apt update -qy  <</ parameters.update >>
            sudo apt install << parameters.args >>

  pip_install:
    parameters:
      args:
        type: string
      descr:
        type: string
        default: ""
      user:
        type: boolean
        default: true
    steps:
      - run:
          name: >
            <<^ parameters.descr >> pip install << parameters.args >> <</ parameters.descr >>
            <<# parameters.descr >> << parameters.descr >>            <</ parameters.descr >>
          command: >
            pip install
            <<# parameters.user >> --user <</ parameters.user >>
            --progress-bar=off
            << parameters.args >>

  install_torchvision:
    parameters:
      editable:
        type: boolean
        default: true
    steps:
      - pip_install:
145
          args: --pre torch -f https://download.pytorch.org/whl/test/cpu/torch_test.html
Philip Meier's avatar
Philip Meier committed
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
          descr: Install PyTorch from nightly releases
      - pip_install:
          args: --no-build-isolation <<# parameters.editable >> --editable <</ parameters.editable >> .
          descr: Install torchvision <<# parameters.editable >> in editable mode <</ parameters.editable >>

  # Most of the test suite is handled by the `unittest` jobs, with completely different workflow and setup.
  # This command can be used if only a selection of tests need to be run, for ad-hoc files.
  run_tests_selective:
    parameters:
      file_or_dir:
        type: string
    steps:
      - run:
          name: Install test utilities
          command: pip install --progress-bar=off pytest pytest-mock
      - run:
          name: Run tests
          command: pytest --junitxml=test-results/junit.xml -v --durations 20 <<parameters.file_or_dir>>
      - store_test_results:
          path: test-results

167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
  download_model_weights:
    parameters:
      extract_roots:
        type: string
        default: "torchvision/models"
      background:
        type: boolean
        default: true
    steps:
      - apt_install:
          args: parallel wget
          descr: Install download utilitites
      - run:
          name: Download model weights
          background: << parameters.background >>
          command: |
            mkdir -p ~/.cache/torch/hub/checkpoints
            python scripts/collect_model_urls.py << parameters.extract_roots >> \
                | parallel -j0 'wget --no-verbose -O ~/.cache/torch/hub/checkpoints/`basename {}` {}\?source=ci'

187
188
binary_common: &binary_common
  parameters:
189
    # Edit these defaults to do a release
190
191
192
    build_version:
      description: "version number of release binary; by default, build a nightly"
      type: string
193
      default: "0.14.0"
194
    pytorch_version:
195
      description: "PyTorch version to build against; by default, use a nightly"
196
      type: string
197
      default: "1.13.0"
198
199
200
201
    # Don't edit these
    python_version:
      description: "Python version to build against (e.g., 3.7)"
      type: string
Edward Z. Yang's avatar
Edward Z. Yang committed
202
203
    cu_version:
      description: "CUDA version to build against, in CU format (e.g., cpu or cu100)"
204
      type: string
guyang3532's avatar
guyang3532 committed
205
      default: "cpu"
206
207
208
209
    unicode_abi:
      description: "Python 2.7 wheel only: whether or not we are cp27mu (default: no)"
      type: string
      default: ""
Edward Z. Yang's avatar
Edward Z. Yang committed
210
211
212
    wheel_docker_image:
      description: "Wheel only: what docker image to use"
      type: string
213
      default: ""
214
215
216
217
    conda_docker_image:
      description: "Conda only: what docker image to use"
      type: string
      default: "pytorch/conda-builder:cpu"
218
219
220
221
  environment:
    PYTHON_VERSION: << parameters.python_version >>
    PYTORCH_VERSION: << parameters.pytorch_version >>
    UNICODE_ABI: << parameters.unicode_abi >>
Edward Z. Yang's avatar
Edward Z. Yang committed
222
    CU_VERSION: << parameters.cu_version >>
223
    MACOSX_DEPLOYMENT_TARGET: 10.9
224

225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
torchvision_ios_params: &torchvision_ios_params
  parameters:
    build_environment:
      type: string
      default: ""
    ios_arch:
      type: string
      default: ""
    ios_platform:
      type: string
      default: ""
  environment:
    BUILD_ENVIRONMENT: << parameters.build_environment >>
    IOS_ARCH: << parameters.ios_arch >>
    IOS_PLATFORM: << parameters.ios_platform >>

241
242
243
244
245
246
247
248
torchvision_android_params: &torchvision_android_params
  parameters:
    build_environment:
      type: string
      default: ""
  environment:
    BUILD_ENVIRONMENT: << parameters.build_environment >>

guyang3532's avatar
guyang3532 committed
249
250
251
252
253
smoke_test_common: &smoke_test_common
  <<: *binary_common
  docker:
    - image: torchvision/smoke_test:latest

254
255
256
jobs:
  circleci_consistency:
    docker:
257
      - image: cimg/python:3.7
258
259
    steps:
      - checkout
Philip Meier's avatar
Philip Meier committed
260
261
      - pip_install:
          args: jinja2 pyyaml
262
      - run:
Philip Meier's avatar
Philip Meier committed
263
          name: Check CircleCI config consistency
264
265
266
267
          command: |
            python .circleci/regenerate.py
            git diff --exit-code || (echo ".circleci/config.yml not in sync with config.yml.in! Run .circleci/regenerate.py to update config"; exit 1)

Philip Meier's avatar
Philip Meier committed
268
  lint_python_and_config:
269
    docker:
270
      - image: cimg/python:3.7
271
272
    steps:
      - checkout
Philip Meier's avatar
Philip Meier committed
273
      - pip_install:
274
          args: pre-commit
Philip Meier's avatar
Philip Meier committed
275
          descr: Install lint utilities
276
      - run:
Philip Meier's avatar
Philip Meier committed
277
278
279
280
          name: Install pre-commit hooks
          command: pre-commit install-hooks
      - run:
          name: Lint Python code and config files
281
          command: pre-commit run --all-files
282
283
284
      - run:
          name: Required lint modifications
          when: on_fail
285
          command: git --no-pager diff
286

Philip Meier's avatar
Philip Meier committed
287
  lint_c:
288
    docker:
289
      - image: cimg/python:3.7
290
    steps:
Philip Meier's avatar
Philip Meier committed
291
292
293
      - apt_install:
          args: libtinfo5
          descr: Install additional system libraries
294
295
      - checkout
      - run:
Philip Meier's avatar
Philip Meier committed
296
          name: Install lint utilities
297
          command: |
Philip Meier's avatar
Philip Meier committed
298
299
300
            curl https://oss-clang-format.s3.us-east-2.amazonaws.com/linux64/clang-format-linux64 -o clang-format
            chmod +x clang-format
            sudo mv clang-format /opt/clang-format
301
      - run:
Philip Meier's avatar
Philip Meier committed
302
303
304
305
306
307
          name: Lint C code
          command: ./.circleci/unittest/linux/scripts/run-clang-format.py -r torchvision/csrc --clang-format-executable /opt/clang-format
      - run:
          name: Required lint modifications
          when: on_fail
          command: git --no-pager diff
308

Philip Meier's avatar
Philip Meier committed
309
  type_check_python:
310
    docker:
311
      - image: cimg/python:3.7
312
313
    steps:
      - checkout
Philip Meier's avatar
Philip Meier committed
314
315
316
317
318
319
320
      - install_torchvision:
          editable: true
      - pip_install:
          args: mypy
          descr: Install Python type check utilities
      - run:
          name: Check Python types statically
321
          command: mypy --install-types --non-interactive --config-file mypy.ini
322

Philip Meier's avatar
Philip Meier committed
323
  unittest_torchhub:
Francisco Massa's avatar
Francisco Massa committed
324
    docker:
325
      - image: cimg/python:3.7
Francisco Massa's avatar
Francisco Massa committed
326
327
    steps:
      - checkout
Philip Meier's avatar
Philip Meier committed
328
329
330
      - install_torchvision
      - run_tests_selective:
          file_or_dir: test/test_hub.py
Francisco Massa's avatar
Francisco Massa committed
331

Philip Meier's avatar
Philip Meier committed
332
  unittest_onnx:
333
    docker:
334
      - image: cimg/python:3.7
335
336
    steps:
      - checkout
Philip Meier's avatar
Philip Meier committed
337
338
339
340
341
342
      - install_torchvision
      - pip_install:
          args: onnx onnxruntime
          descr: Install ONNX
      - run_tests_selective:
          file_or_dir: test/test_onnx.py
343

344
345
  unittest_extended:
    docker:
346
      - image: cimg/python:3.7
347
348
349
350
351
352
353
354
355
356
357
    resource_class: xlarge
    steps:
      - checkout
      - download_model_weights
      - install_torchvision
      - run:
          name: Enable extended tests
          command: echo 'export PYTORCH_TEST_WITH_EXTENDED=1' >> $BASH_ENV
      - run_tests_selective:
          file_or_dir: test/test_extended_*.py

358
359
360
  binary_linux_wheel:
    <<: *binary_common
    docker:
Edward Z. Yang's avatar
Edward Z. Yang committed
361
      - image: << parameters.wheel_docker_image >>
362
363
    resource_class: 2xlarge+
    steps:
364
      - checkout_merge
365
      - designate_upload_channel
366
367
368
      - run: packaging/build_wheel.sh
      - store_artifacts:
          path: dist
Edward Z. Yang's avatar
Edward Z. Yang committed
369
370
371
372
      - persist_to_workspace:
          root: dist
          paths:
            - "*"
373
374
375
376

  binary_linux_conda:
    <<: *binary_common
    docker:
377
      - image: "<< parameters.conda_docker_image >>"
378
379
    resource_class: 2xlarge+
    steps:
380
      - checkout_merge
381
      - designate_upload_channel
382
383
384
      - run: packaging/build_conda.sh
      - store_artifacts:
          path: /opt/conda/conda-bld/linux-64
Edward Z. Yang's avatar
Edward Z. Yang committed
385
386
387
388
      - persist_to_workspace:
          root: /opt/conda/conda-bld/linux-64
          paths:
            - "*"
389
390
      - store_test_results:
          path: build_results/
391

Francisco Massa's avatar
Francisco Massa committed
392
  binary_win_conda:
393
394
    <<: *binary_common
    executor: windows-cpu
395
396
    steps:
      - checkout_merge
397
      - designate_upload_channel
398
399
      - run:
          name: Build conda packages
400
          no_output_timeout: 20m
401
          command: |
402
403
404
405
406
407
408
            set -ex
            source packaging/windows/internal/vc_install_helper.sh
            packaging/windows/internal/cuda_install.bat
            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
409
            rm /C/tools/miniconda3/conda-bld/win-64/vs${VC_YEAR}*.tar.bz2
410
      - store_artifacts:
411
          path: C:/tools/miniconda3/conda-bld/win-64
412
      - persist_to_workspace:
413
          root: C:/tools/miniconda3/conda-bld/win-64
414
415
416
417
418
          paths:
            - "*"
      - store_test_results:
          path: build_results/

419
  binary_win_wheel:
420
421
    <<: *binary_common
    executor: windows-cpu
422
423
    steps:
      - checkout_merge
424
      - designate_upload_channel
425
426
427
      - run:
          name: Build wheel packages
          command: |
428
429
430
431
            set -ex
            source packaging/windows/internal/vc_install_helper.sh
            packaging/windows/internal/cuda_install.bat
            packaging/build_wheel.sh
432
      - store_artifacts:
433
          path: dist
434
      - persist_to_workspace:
435
          root: dist
436
437
438
439
440
          paths:
            - "*"
      - store_test_results:
          path: build_results/

441
442
443
  binary_macos_wheel:
    <<: *binary_common
    macos:
444
      xcode: "14.0"
445
    steps:
446
      - checkout_merge
447
      - designate_upload_channel
448
449
450
451
452
453
454
455
456
457
458
      - run:
          # Cannot easily deduplicate this as source'ing activate
          # will set environment variables which we need to propagate
          # to build_wheel.sh
          command: |
            curl -o conda.sh https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh
            sh conda.sh -b
            source $HOME/miniconda3/bin/activate
            packaging/build_wheel.sh
      - store_artifacts:
          path: dist
Edward Z. Yang's avatar
Edward Z. Yang committed
459
460
461
462
      - persist_to_workspace:
          root: dist
          paths:
            - "*"
463

464
465
466
  binary_ios_build:
    <<: *torchvision_ios_params
    macos:
467
      xcode: "14.0"
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
    steps:
    - attach_workspace:
        at: ~/workspace
    - checkout
    - run_brew_for_ios_build
    - run:
        name: Build
        no_output_timeout: "1h"
        command: |
          script="/Users/distiller/project/.circleci/unittest/ios/scripts/binary_ios_build.sh"
          cat "$script"
          source "$script"
    - persist_to_workspace:
        root: /Users/distiller/workspace/
        paths: ios

  binary_ios_upload:
    <<: *torchvision_ios_params
    macos:
487
      xcode: "14.0"
488
489
490
491
492
493
494
495
496
497
498
499
500
    steps:
    - attach_workspace:
        at: ~/workspace
    - checkout
    - run_brew_for_ios_build
    - run:
        name: Upload
        no_output_timeout: "1h"
        command: |
          script="/Users/distiller/project/.circleci/unittest/ios/scripts/binary_ios_upload.sh"
          cat "$script"
          source "$script"

501
502
503
  binary_android_build:
    <<: *torchvision_android_params
    docker:
504
      - image: cimg/android:2021.08-ndk
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
    resource_class: xlarge
    steps:
    - attach_workspace:
        at: ~/workspace
    - checkout
    - run:
        name: Build
        no_output_timeout: "1h"
        command: |
          script="/home/circleci/project/.circleci/unittest/android/scripts/binary_android_build.sh"
          cat "$script"
          source "$script"
    - store_artifacts:
        path: ~/workspace/artifacts

  binary_android_upload:
    <<: *torchvision_android_params
    docker:
523
      - image: cimg/android:2021.08-ndk
524
525
526
527
528
529
530
531
532
533
534
535
536
    resource_class: xlarge
    steps:
    - attach_workspace:
        at: ~/workspace
    - checkout
    - run:
        name: Upload
        no_output_timeout: "1h"
        command: |
          script="/home/circleci/project/.circleci/unittest/android/scripts/binary_android_upload.sh"
          cat "$script"
          source "$script"

537
538
539
  binary_macos_conda:
    <<: *binary_common
    macos:
540
      xcode: "14.0"
541
    steps:
542
      - checkout_merge
543
      - designate_upload_channel
544
545
546
547
548
549
550
551
552
      - run:
          command: |
            curl -o conda.sh https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh
            sh conda.sh -b
            source $HOME/miniconda3/bin/activate
            conda install -yq conda-build
            packaging/build_conda.sh
      - store_artifacts:
          path: /Users/distiller/miniconda3/conda-bld/osx-64
Edward Z. Yang's avatar
Edward Z. Yang committed
553
554
555
556
      - persist_to_workspace:
          root: /Users/distiller/miniconda3/conda-bld/osx-64
          paths:
            - "*"
557
558
      - store_test_results:
          path: build_results/
559

Edward Z. Yang's avatar
Edward Z. Yang committed
560
561
562
563
564
565
566
  # Requires org-member context
  binary_conda_upload:
    docker:
      - image: continuumio/miniconda
    steps:
      - attach_workspace:
          at: ~/workspace
567
      - designate_upload_channel
Edward Z. Yang's avatar
Edward Z. Yang committed
568
569
570
571
572
      - run:
          command: |
            # Prevent credential from leaking
            conda install -yq anaconda-client
            set -x
573
            anaconda  -t "${CONDA_PYTORCHBOT_TOKEN}" upload ~/workspace/*.tar.bz2 -u "pytorch-${UPLOAD_CHANNEL}" --label main --no-progress --force
Edward Z. Yang's avatar
Edward Z. Yang committed
574
575
576

  # Requires org-member context
  binary_wheel_upload:
Edward Z. Yang's avatar
Edward Z. Yang committed
577
578
579
580
    parameters:
      subfolder:
        description: "What whl subfolder to upload to, e.g., blank or cu100/ (trailing slash is important)"
        type: string
Edward Z. Yang's avatar
Edward Z. Yang committed
581
    docker:
582
      - image: cimg/python:3.7
Edward Z. Yang's avatar
Edward Z. Yang committed
583
584
585
    steps:
      - attach_workspace:
          at: ~/workspace
586
      - designate_upload_channel
Edward Z. Yang's avatar
Edward Z. Yang committed
587
      - checkout
Philip Meier's avatar
Philip Meier committed
588
589
      - pip_install:
          args: awscli
Edward Z. Yang's avatar
Edward Z. Yang committed
590
591
592
593
594
595
596
597
      - run:
          command: |
            export PATH="$HOME/.local/bin:$PATH"
            # Prevent credential from leaking
            set +x
            export AWS_ACCESS_KEY_ID="${PYTORCH_BINARY_AWS_ACCESS_KEY_ID}"
            export AWS_SECRET_ACCESS_KEY="${PYTORCH_BINARY_AWS_SECRET_ACCESS_KEY}"
            set -x
Edward Z. Yang's avatar
Edward Z. Yang committed
598
            for pkg in ~/workspace/*.whl; do
599
              aws s3 cp "$pkg" "s3://pytorch/whl/${UPLOAD_CHANNEL}/<< parameters.subfolder >>" --acl public-read
Edward Z. Yang's avatar
Edward Z. Yang committed
600
            done
Edward Z. Yang's avatar
Edward Z. Yang committed
601

guyang3532's avatar
guyang3532 committed
602
603
604
605
606
  smoke_test_linux_conda:
    <<: *smoke_test_common
    steps:
      - attach_workspace:
          at: ~/workspace
607
      - designate_upload_channel
guyang3532's avatar
guyang3532 committed
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
      - run:
          name: install binaries
          command: |
            set -x
            source /usr/local/etc/profile.d/conda.sh && conda activate python${PYTHON_VERSION}
            conda install -v -y -c pytorch-nightly pytorch
            conda install -v -y $(ls ~/workspace/torchvision*.tar.bz2)
      - run:
          name: smoke test
          command: |
            source /usr/local/etc/profile.d/conda.sh && conda activate python${PYTHON_VERSION}
            python -c "import torchvision"

  smoke_test_linux_pip:
    <<: *smoke_test_common
    steps:
      - attach_workspace:
          at: ~/workspace
626
      - designate_upload_channel
guyang3532's avatar
guyang3532 committed
627
628
629
630
631
      - run:
          name: install binaries
          command: |
            set -x
            source /usr/local/etc/profile.d/conda.sh && conda activate python${PYTHON_VERSION}
Philip Meier's avatar
Philip Meier committed
632
      - pip_install:
633
          args: $(ls ~/workspace/torchvision*.whl) --pre -f https://download.pytorch.org/whl/test/torch_test.html
guyang3532's avatar
guyang3532 committed
634
635
636
637
638
639
640
641
      - run:
          name: smoke test
          command: |
            source /usr/local/etc/profile.d/conda.sh && conda activate python${PYTHON_VERSION}
            python -c "import torchvision"

  smoke_test_docker_image_build:
    machine:
642
      image: ubuntu-2004:202104-01
guyang3532's avatar
guyang3532 committed
643
644
645
646
647
    resource_class: large
    environment:
      image_name: torchvision/smoke_test
    steps:
      - checkout
648
      - designate_upload_channel
guyang3532's avatar
guyang3532 committed
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
      - run:
          name: Build and push Docker image
          no_output_timeout: "1h"
          command: |
            set +x
            echo "${DOCKER_HUB_TOKEN}" | docker login --username "${DOCKER_HUB_USERNAME}" --password-stdin
            set -x
            cd .circleci/smoke_test/docker && docker build . -t ${image_name}:${CIRCLE_WORKFLOW_ID}
            docker tag ${image_name}:${CIRCLE_WORKFLOW_ID} ${image_name}:latest
            docker push ${image_name}:${CIRCLE_WORKFLOW_ID}
            docker push ${image_name}:latest

  smoke_test_win_conda:
    <<: *binary_common
    executor:
      name: windows-cpu
    steps:
      - attach_workspace:
          at: ~/workspace
668
      - designate_upload_channel
guyang3532's avatar
guyang3532 committed
669
670
671
672
673
674
      - run:
          name: install binaries
          command: |
            set -x
            eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')"
            conda env remove -n python${PYTHON_VERSION} || true
675
            conda create -yn python${PYTHON_VERSION} python=${PYTHON_VERSION}
guyang3532's avatar
guyang3532 committed
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
            conda activate python${PYTHON_VERSION}
            conda install -v -y -c pytorch-nightly pytorch
            conda install -v -y $(ls ~/workspace/torchvision*.tar.bz2)
      - run:
          name: smoke test
          command: |
            eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')"
            conda activate python${PYTHON_VERSION}
            python -c "import torchvision"

  smoke_test_win_pip:
    <<: *binary_common
    executor:
      name: windows-cpu
    steps:
      - attach_workspace:
          at: ~/workspace
693
      - designate_upload_channel
guyang3532's avatar
guyang3532 committed
694
695
696
697
698
699
700
      - run:
          name: install binaries
          command: |
            set -x
            eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')"
            conda create -yn python${PYTHON_VERSION} python=${PYTHON_VERSION}
            conda activate python${PYTHON_VERSION}
Philip Meier's avatar
Philip Meier committed
701
      - pip_install:
702
          args: $(ls ~/workspace/torchvision*.whl) --pre -f https://download.pytorch.org/whl/test/torch_test.html
guyang3532's avatar
guyang3532 committed
703
704
705
706
707
708
709
      - run:
          name: smoke test
          command: |
            eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')"
            conda activate python${PYTHON_VERSION}
            python -c "import torchvision"

710
711
712
  unittest_linux_cpu:
    <<: *binary_common
    docker:
713
      - image: "pytorch/manylinux-cpu"
714
715
716
    resource_class: 2xlarge+
    steps:
      - checkout
717
      - designate_upload_channel
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
      - 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:
752
      image: ubuntu-2004-cuda-11.4:202110-01
753
    resource_class: gpu.nvidia.medium
754
    environment:
Andrey Talman's avatar
Andrey Talman committed
755
756
      image_name: "pytorch/manylinux-cuda116"
      CU_VERSION: << parameters.cu_version >>
757
      PYTHON_VERSION: << parameters.python_version >>
758
759
    steps:
      - checkout
760
      - designate_upload_channel
761
762
763
764
      - run:
          name: Generate cache key
          # This will refresh cache on Sundays, nightly build should generate new cache.
          command: echo "$(date +"%Y-%U")" > .circleci-weekly
765
766
767
768
769
      - restore_cache:
          {% raw %}
          keys:
            - env-v3-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }}
          {% endraw %}
770
771
      - run:
          name: Setup
772
          command: docker run -e PYTHON_VERSION -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/setup_env.sh
773
774
      - save_cache:
          {% raw %}
775
          key: env-v3-linux-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/linux/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }}
776
777
778
779
          {% endraw %}
          paths:
            - conda
            - env
780
781
782
783
784
785
786
787
      - run:
          # Here we create an envlist file that contains some env variables that we want the docker container to be aware of.
          # Normally, the CIRCLECI variable is set and available on all CI workflows: https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables.
          # They're avaiable in all the other workflows (OSX and Windows).
          # But here, we're running the unittest_linux_gpu workflows in a docker container, where those variables aren't accessible.
          # So instead we dump the variables we need in env.list and we pass that file when invoking "docker run".
          name: export CIRCLECI env var
          command: echo "CIRCLECI=true" >> ./env.list
788
789
      - run:
          name: Install torchvision
790
          command: docker run -t --gpus all -v $PWD:$PWD -w $PWD -e UPLOAD_CHANNEL -e CU_VERSION "${image_name}" .circleci/unittest/linux/scripts/install.sh
791
792
      - run:
          name: Run tests
793
          command: docker run --env-file ./env.list -t --gpus all -v $PWD:$PWD -w $PWD "${image_name}" .circleci/unittest/linux/scripts/run_test.sh
794
795
796
797
798
799
800
801
802
803
804
805
      - 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
806
      - designate_upload_channel
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
      - 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:
Andrey Talman's avatar
Andrey Talman committed
843
      CUDA_VERSION: "11.6"
844
      PYTHON_VERSION: << parameters.python_version >>
845
846
    steps:
      - checkout
847
      - designate_upload_channel
848
849
850
851
      - run:
          name: Generate cache key
          # This will refresh cache on Sundays, nightly build should generate new cache.
          command: echo "$(date +"%Y-%U")" > .circleci-weekly
852
853
854
855
      - restore_cache:
          {% raw %}
          keys:
            - env-v1-windows-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/windows/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }}
856
          {% endraw %}
857
858
859
860
861
862
863
864
865
866
      - 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
867
868
869
870
871
872
      - run:
          name: Install CUDA
          command: packaging/windows/internal/cuda_install.bat
      - run:
          name: Update CUDA driver
          command: packaging/windows/internal/driver_update.bat
873
874
875
876
877
878
879
880
881
882
883
      - 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
Edward Z. Yang's avatar
Edward Z. Yang committed
884

Francisco Massa's avatar
Francisco Massa committed
885
886
887
  unittest_macos_cpu:
    <<: *binary_common
    macos:
888
      xcode: "14.0"
Francisco Massa's avatar
Francisco Massa committed
889
890
891
    resource_class: large
    steps:
      - checkout
892
      - designate_upload_channel
Francisco Massa's avatar
Francisco Massa committed
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
      - run:
          name: Install wget
          command: HOMEBREW_NO_AUTO_UPDATE=1 brew install wget
          # Disable brew auto update which is very slow
      - 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-v3-macos-{{ 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-v3-macos-{{ 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

928
929
930
  cmake_linux_cpu:
    <<: *binary_common
    docker:
931
      - image: "pytorch/manylinux-cpu"
932
933
934
    resource_class: 2xlarge+
    steps:
      - checkout_merge
935
      - designate_upload_channel
936
937
938
939
940
941
942
943
      - run:
          name: Setup conda
          command: .circleci/unittest/linux/scripts/setup_env.sh
      - run: packaging/build_cmake.sh

  cmake_linux_gpu:
    <<: *binary_common
    machine:
944
      image: ubuntu-2004-cuda-11.4:202110-01
945
    resource_class: gpu.nvidia.small
946
947
948
949
950
951
952
    environment:
      PYTHON_VERSION: << parameters.python_version >>
      PYTORCH_VERSION: << parameters.pytorch_version >>
      UNICODE_ABI: << parameters.unicode_abi >>
      CU_VERSION: << parameters.cu_version >>
    steps:
      - checkout_merge
953
      - designate_upload_channel
954
955
956
957
958
      - run:
          name: Setup conda
          command: docker run -e CU_VERSION -e PYTHON_VERSION -e UNICODE_ABI -e PYTORCH_VERSION -t --gpus all -v $PWD:$PWD -w $PWD << parameters.wheel_docker_image >> .circleci/unittest/linux/scripts/setup_env.sh
      - run:
          name: Build torchvision C++ distribution and test
Andrey Talman's avatar
Andrey Talman committed
959
          no_output_timeout: 30m
960
          command: docker run -e CU_VERSION -e PYTHON_VERSION -e UNICODE_ABI -e PYTORCH_VERSION -e UPLOAD_CHANNEL -t --gpus all -v $PWD:$PWD -w $PWD << parameters.wheel_docker_image >> packaging/build_cmake.sh
961
962
963
964

  cmake_macos_cpu:
    <<: *binary_common
    macos:
965
      xcode: "14.0"
966
967
    steps:
      - checkout_merge
968
      - designate_upload_channel
969
970
971
972
973
974
975
976
977
978
979
980
981
982
      - run:
          command: |
            curl -o conda.sh https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh
            sh conda.sh -b
            source $HOME/miniconda3/bin/activate
            conda install -yq conda-build cmake
            packaging/build_cmake.sh

  cmake_windows_cpu:
    <<: *binary_common
    executor:
      name: windows-cpu
    steps:
      - checkout_merge
983
      - designate_upload_channel
984
985
986
987
988
989
990
991
992
993
994
995
      - run:
          command: |
            set -ex
            source packaging/windows/internal/vc_install_helper.sh
            packaging/build_cmake.sh

  cmake_windows_gpu:
    <<: *binary_common
    executor:
      name: windows-gpu
    steps:
      - checkout_merge
996
      - designate_upload_channel
Andrey Talman's avatar
Andrey Talman committed
997
998
999
      - run:
          name: Update CUDA driver
          command: packaging/windows/internal/driver_update.bat
1000
1001
1002
1003
1004
1005
1006
      - run:
          command: |
            set -ex
            source packaging/windows/internal/vc_install_helper.sh
            packaging/windows/internal/cuda_install.bat
            packaging/build_cmake.sh

1007
1008
1009
  build_docs:
    <<: *binary_common
    docker:
1010
      - image: cimg/python:3.7
1011
1012
1013
1014
1015
    resource_class: 2xlarge+
    steps:
      - attach_workspace:
          at: ~/workspace
      - checkout
1016
      - download_model_weights
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
      - run:
          name: Setup
          command: .circleci/unittest/linux/scripts/setup_env.sh
      - designate_upload_channel
      - run:
          name: Install torchvision
          command: .circleci/unittest/linux/scripts/install.sh
      - run:
          name: Build docs
          command: |
            set -ex
1028
1029
            # turn v1.12.0rc3 into 1.12.0
            tag=$(echo $CIRCLE_TAG | sed -e 's/v*\([0-9.]*\).*/\1/')
1030
            VERSION=${tag:-main}
1031
1032
1033
            eval "$(./conda/bin/conda shell.bash hook)"
            conda activate ./env
            pushd docs
Philip Meier's avatar
Philip Meier committed
1034
            pip install --progress-bar=off -r requirements.txt
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
            make html
            popd
      - persist_to_workspace:
          root: ./
          paths:
            - "*"
      - store_artifacts:
          path: ./docs/build/html
          destination: docs

  upload_docs:
    <<: *binary_common
    docker:
      - image: "pytorch/manylinux-cuda100"
    resource_class: 2xlarge+
    steps:
      - attach_workspace:
          at: ~/workspace
      - run:
          name: Generate netrc
          command: |
            # set credentials for https pushing
            # requires the org-member context
            cat > ~/.netrc \<<DONE
              machine github.com
              login pytorchbot
              password ${GITHUB_PYTORCHBOT_TOKEN}
            DONE
      - run:
          name: Upload docs
          command: |
            # Don't use "checkout" step since it uses ssh, which cannot git push
            # https://circleci.com/docs/2.0/configuration-reference/#checkout
            set -ex
1069
1070
            # Change v1.12.1rc1 into 1.12 (only major.minor)
            tag=$(echo $CIRCLE_TAG | sed -e 's/v*\([0-9]*\.[0-9]*\).*/\1/')
1071
            target=${tag:-main}
1072
1073
1074
            ~/workspace/.circleci/build_docs/commit_docs.sh ~/workspace $target


Edward Z. Yang's avatar
Edward Z. Yang committed
1075
workflows:
Philip Meier's avatar
Philip Meier committed
1076
  lint:
Edward Z. Yang's avatar
Edward Z. Yang committed
1077
1078
    jobs:
      - circleci_consistency
Philip Meier's avatar
Philip Meier committed
1079
1080
1081
1082
1083
1084
      - lint_python_and_config
      - lint_c
      - type_check_python

  build:
    jobs:
1085
      {{ build_workflows(windows_latest_only=True) }}
1086
      {{ ios_workflows() }}
1087
      {{ android_workflows() }}
Edward Z. Yang's avatar
Edward Z. Yang committed
1088

1089
1090
  unittest:
    jobs:
Philip Meier's avatar
Philip Meier committed
1091
1092
      - unittest_torchhub
      - unittest_onnx
1093
      - unittest_extended
1094
      {{ unittest_workflows() }}
1095
1096
1097
1098
1099

  cmake:
    jobs:
      {{ cmake_workflows() }}

Edward Z. Yang's avatar
Edward Z. Yang committed
1100
1101
  nightly:
    jobs:
1102
      {{ ios_workflows(nightly=True) }}
1103
      {{ android_workflows(nightly=True) }}
1104
      {{ build_workflows(prefix="nightly_", filter_branch="nightly", upload=True) }}
guyang3532's avatar
guyang3532 committed
1105
1106
1107
1108
1109
1110
1111
  docker_build:
    triggers:
      - schedule:
          cron: "0 10 * * 0"
          filters:
            branches:
              only:
1112
                - main
guyang3532's avatar
guyang3532 committed
1113
1114
1115
    jobs:
      - smoke_test_docker_image_build:
          context: org-member