config.yml.in 19.4 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/
Philip Meier's avatar
Philip Meier committed
5
6
#   - circleci config process .circleci/config.yml > gen.yml && circleci local execute -c gen.yml --job binary_win_wheel_py3.8
#     - Replace binary_win_wheel_py3.8 with the name of the job you want to test.
Edward Z. Yang's avatar
Edward Z. Yang committed
7
#       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
42
43
44
45
46
47
  designate_upload_channel:
    description: "inserts the correct upload channel into ${BASH_ENV}"
    steps:
      - run:
          name: adding UPLOAD_CHANNEL to BASH_ENV
          command: |
            our_upload_channel=nightly
            # On tags upload to test instead
            if [[ -n "${CIRCLE_TAG}" ]]; then
              our_upload_channel=test
            fi
            echo "export UPLOAD_CHANNEL=${our_upload_channel}" >> ${BASH_ENV}
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
98
99
100
101
  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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
  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 >>

123
124
binary_common: &binary_common
  parameters:
125
    # Edit these defaults to do a release
126
127
128
129
130
    build_version:
      description: "version number of release binary; by default, build a nightly"
      type: string
      default: ""
    pytorch_version:
131
      description: "PyTorch version to build against; by default, use a nightly"
132
      type: string
133
      default: ""
134
135
    # Don't edit these
    python_version:
136
      description: "Python version to build against (e.g., 3.8)"
137
      type: string
Edward Z. Yang's avatar
Edward Z. Yang committed
138
139
    cu_version:
      description: "CUDA version to build against, in CU format (e.g., cpu or cu100)"
140
      type: string
guyang3532's avatar
guyang3532 committed
141
      default: "cpu"
142
143
144
145
    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
146
147
148
    wheel_docker_image:
      description: "Wheel only: what docker image to use"
      type: string
149
      default: ""
150
151
152
153
    conda_docker_image:
      description: "Conda only: what docker image to use"
      type: string
      default: "pytorch/conda-builder:cpu"
154
155
156
157
  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
158
    CU_VERSION: << parameters.cu_version >>
159
    MACOSX_DEPLOYMENT_TARGET: 10.9
160

161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
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 >>

177
178
179
180
181
182
183
184
torchvision_android_params: &torchvision_android_params
  parameters:
    build_environment:
      type: string
      default: ""
  environment:
    BUILD_ENVIRONMENT: << parameters.build_environment >>

guyang3532's avatar
guyang3532 committed
185
186
187
188
189
smoke_test_common: &smoke_test_common
  <<: *binary_common
  docker:
    - image: torchvision/smoke_test:latest

190
191
192
jobs:
  circleci_consistency:
    docker:
193
      - image: cimg/python:3.8
194
195
    steps:
      - checkout
Philip Meier's avatar
Philip Meier committed
196
197
      - pip_install:
          args: jinja2 pyyaml
198
      - run:
Philip Meier's avatar
Philip Meier committed
199
          name: Check CircleCI config consistency
200
201
202
203
          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)

Francisco Massa's avatar
Francisco Massa committed
204
  binary_win_conda:
205
206
    <<: *binary_common
    executor: windows-cpu
207
208
    steps:
      - checkout_merge
209
      - designate_upload_channel
210
211
      - run:
          name: Build conda packages
212
          no_output_timeout: 30m
213
          command: |
214
215
216
217
218
219
220
            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
221
            rm /C/tools/miniconda3/conda-bld/win-64/vs${VC_YEAR}*.tar.bz2
222
      - store_artifacts:
223
          path: C:/tools/miniconda3/conda-bld/win-64
224
      - persist_to_workspace:
225
          root: C:/tools/miniconda3/conda-bld/win-64
226
227
228
229
230
          paths:
            - "*"
      - store_test_results:
          path: build_results/

231
  binary_win_wheel:
232
233
    <<: *binary_common
    executor: windows-cpu
234
235
    steps:
      - checkout_merge
236
      - designate_upload_channel
237
238
      - run:
          name: Build wheel packages
239
          no_output_timeout: 30m
240
          command: |
241
242
243
244
            set -ex
            source packaging/windows/internal/vc_install_helper.sh
            packaging/windows/internal/cuda_install.bat
            packaging/build_wheel.sh
245
      - store_artifacts:
246
          path: dist
247
      - persist_to_workspace:
248
          root: dist
249
250
251
252
253
          paths:
            - "*"
      - store_test_results:
          path: build_results/

254
255
256
  binary_macos_wheel:
    <<: *binary_common
    macos:
257
      xcode: "14.0"
258
    steps:
259
      - checkout_merge
260
      - designate_upload_channel
261
262
263
264
265
266
267
268
269
270
271
      - 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
272
273
274
275
      - persist_to_workspace:
          root: dist
          paths:
            - "*"
276

277
278
279
  binary_ios_build:
    <<: *torchvision_ios_params
    macos:
280
      xcode: "14.0"
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
    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:
300
      xcode: "14.0"
301
302
303
304
305
306
307
308
309
310
311
312
313
    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"

314
315
316
  binary_android_build:
    <<: *torchvision_android_params
    docker:
317
      - image: cimg/android:2021.08-ndk
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
    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:
336
      - image: cimg/android:2021.08-ndk
337
338
339
340
341
342
343
344
345
346
347
348
349
    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"

350
351
352
  binary_macos_conda:
    <<: *binary_common
    macos:
353
      xcode: "14.0"
354
    steps:
355
      - checkout_merge
356
      - designate_upload_channel
357
358
359
360
361
362
363
364
365
      - 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
366
367
368
369
      - persist_to_workspace:
          root: /Users/distiller/miniconda3/conda-bld/osx-64
          paths:
            - "*"
370
371
      - store_test_results:
          path: build_results/
372

Edward Z. Yang's avatar
Edward Z. Yang committed
373
374
375
376
377
378
379
  # Requires org-member context
  binary_conda_upload:
    docker:
      - image: continuumio/miniconda
    steps:
      - attach_workspace:
          at: ~/workspace
380
      - designate_upload_channel
Edward Z. Yang's avatar
Edward Z. Yang committed
381
382
383
384
385
      - run:
          command: |
            # Prevent credential from leaking
            conda install -yq anaconda-client
            set -x
386
            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
387
388
389

  # Requires org-member context
  binary_wheel_upload:
Edward Z. Yang's avatar
Edward Z. Yang committed
390
391
392
393
    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
394
    docker:
395
      - image: cimg/python:3.8
Edward Z. Yang's avatar
Edward Z. Yang committed
396
397
398
    steps:
      - attach_workspace:
          at: ~/workspace
399
      - designate_upload_channel
Edward Z. Yang's avatar
Edward Z. Yang committed
400
      - checkout
Philip Meier's avatar
Philip Meier committed
401
402
      - pip_install:
          args: awscli
Edward Z. Yang's avatar
Edward Z. Yang committed
403
404
405
406
407
408
409
410
      - 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
411
            for pkg in ~/workspace/*.whl; do
412
              aws s3 cp "$pkg" "s3://pytorch/whl/${UPLOAD_CHANNEL}/<< parameters.subfolder >>" --acl public-read
Edward Z. Yang's avatar
Edward Z. Yang committed
413
            done
Edward Z. Yang's avatar
Edward Z. Yang committed
414

guyang3532's avatar
guyang3532 committed
415
416
  smoke_test_docker_image_build:
    machine:
417
      image: ubuntu-2004:202104-01
guyang3532's avatar
guyang3532 committed
418
419
420
421
422
    resource_class: large
    environment:
      image_name: torchvision/smoke_test
    steps:
      - checkout
423
      - designate_upload_channel
guyang3532's avatar
guyang3532 committed
424
425
426
427
428
429
430
431
432
433
434
435
      - 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

436
437
438
439
440
441
  unittest_windows_cpu:
    <<: *binary_common
    executor:
      name: windows-cpu
    steps:
      - checkout
442
      - designate_upload_channel
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
      - 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:
479
      CUDA_VERSION: "11.7"
480
      PYTHON_VERSION: << parameters.python_version >>
481
482
    steps:
      - checkout
483
      - designate_upload_channel
484
485
486
487
      - run:
          name: Generate cache key
          # This will refresh cache on Sundays, nightly build should generate new cache.
          command: echo "$(date +"%Y-%U")" > .circleci-weekly
488
489
490
491
      - restore_cache:
          {% raw %}
          keys:
            - env-v1-windows-{{ arch }}-py<< parameters.python_version >>-{{ checksum ".circleci/unittest/windows/scripts/environment.yml" }}-{{ checksum ".circleci-weekly" }}
492
          {% endraw %}
493
494
495
496
497
498
499
500
501
502
      - 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
503
504
505
506
507
508
      - run:
          name: Install CUDA
          command: packaging/windows/internal/cuda_install.bat
      - run:
          name: Update CUDA driver
          command: packaging/windows/internal/driver_update.bat
509
510
511
512
513
514
515
516
517
518
519
      - 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
520

521
522
523
  cmake_linux_cpu:
    <<: *binary_common
    docker:
524
      - image: "pytorch/manylinux-cpu"
525
526
527
    resource_class: 2xlarge+
    steps:
      - checkout_merge
528
      - designate_upload_channel
529
530
531
532
533
534
535
536
      - run:
          name: Setup conda
          command: .circleci/unittest/linux/scripts/setup_env.sh
      - run: packaging/build_cmake.sh

  cmake_linux_gpu:
    <<: *binary_common
    machine:
537
      image: ubuntu-2004-cuda-11.4:202110-01
538
    resource_class: gpu.nvidia.small
539
540
    steps:
      - checkout_merge
541
      - designate_upload_channel
542
543
544
545
546
      - 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
547
          no_output_timeout: 30m
548
          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
549
550
551
552

  cmake_macos_cpu:
    <<: *binary_common
    macos:
553
      xcode: "14.0"
554
555
    steps:
      - checkout_merge
556
      - designate_upload_channel
557
558
559
560
561
      - 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
562
            conda install -yq conda-build cmake python=<< parameters.python_version >>
563
564
565
566
567
568
569
570
            packaging/build_cmake.sh

  cmake_windows_cpu:
    <<: *binary_common
    executor:
      name: windows-cpu
    steps:
      - checkout_merge
571
      - designate_upload_channel
572
573
574
575
      - run:
          command: |
            set -ex
            source packaging/windows/internal/vc_install_helper.sh
576
577
578
579
            eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')"
            conda activate base
            conda create -yn python39 python=3.9
            conda activate python39
580
581
582
583
584
585
586
587
            packaging/build_cmake.sh

  cmake_windows_gpu:
    <<: *binary_common
    executor:
      name: windows-gpu
    steps:
      - checkout_merge
588
      - designate_upload_channel
Andrey Talman's avatar
Andrey Talman committed
589
590
591
      - run:
          name: Update CUDA driver
          command: packaging/windows/internal/driver_update.bat
592
593
594
595
596
      - run:
          command: |
            set -ex
            source packaging/windows/internal/vc_install_helper.sh
            packaging/windows/internal/cuda_install.bat
597
598
599
600
601
            eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')"
            conda activate
            conda update -y conda
            conda create -yn python39 python=3.9
            conda activate python39
602
603
            packaging/build_cmake.sh

604

Edward Z. Yang's avatar
Edward Z. Yang committed
605
workflows:
Philip Meier's avatar
Philip Meier committed
606
  lint:
Edward Z. Yang's avatar
Edward Z. Yang committed
607
608
    jobs:
      - circleci_consistency
Philip Meier's avatar
Philip Meier committed
609
610
611

  build:
    jobs:
612
      {{ build_workflows(windows_latest_only=True) }}
613
      {{ ios_workflows() }}
614
      {{ android_workflows() }}
Edward Z. Yang's avatar
Edward Z. Yang committed
615

616
617
618
  unittest:
    jobs:
      {{ unittest_workflows() }}
619
620
621
622
623

  cmake:
    jobs:
      {{ cmake_workflows() }}

Edward Z. Yang's avatar
Edward Z. Yang committed
624
625
  nightly:
    jobs:
626
      {{ ios_workflows(nightly=True) }}
627
      {{ android_workflows(nightly=True) }}
628
      {{ build_workflows(prefix="nightly_", filter_branch="nightly", upload=True) }}
guyang3532's avatar
guyang3532 committed
629
630
631
632
633
634
635
  docker_build:
    triggers:
      - schedule:
          cron: "0 10 * * 0"
          filters:
            branches:
              only:
636
                - main
guyang3532's avatar
guyang3532 committed
637
638
639
    jobs:
      - smoke_test_docker_image_build:
          context: org-member