config.yml.in 16.3 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
  cmake_linux_cpu:
    <<: *binary_common
    docker:
439
      - image: "pytorch/manylinux-cpu"
440
441
442
    resource_class: 2xlarge+
    steps:
      - checkout_merge
443
      - designate_upload_channel
444
445
446
447
448
449
450
451
      - run:
          name: Setup conda
          command: .circleci/unittest/linux/scripts/setup_env.sh
      - run: packaging/build_cmake.sh

  cmake_linux_gpu:
    <<: *binary_common
    machine:
452
      image: ubuntu-2004-cuda-11.4:202110-01
453
    resource_class: gpu.nvidia.small
454
455
    steps:
      - checkout_merge
456
      - designate_upload_channel
457
458
459
460
461
      - 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
462
          no_output_timeout: 30m
463
          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
464
465
466
467

  cmake_macos_cpu:
    <<: *binary_common
    macos:
468
      xcode: "14.0"
469
470
    steps:
      - checkout_merge
471
      - designate_upload_channel
472
473
474
475
476
      - 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
477
            conda install -yq conda-build cmake python=<< parameters.python_version >>
478
479
480
481
482
483
484
485
            packaging/build_cmake.sh

  cmake_windows_cpu:
    <<: *binary_common
    executor:
      name: windows-cpu
    steps:
      - checkout_merge
486
      - designate_upload_channel
487
488
489
490
      - run:
          command: |
            set -ex
            source packaging/windows/internal/vc_install_helper.sh
491
492
493
494
            eval "$('/C/tools/miniconda3/Scripts/conda.exe' 'shell.bash' 'hook')"
            conda activate base
            conda create -yn python39 python=3.9
            conda activate python39
495
496
497
498
499
500
501
502
            packaging/build_cmake.sh

  cmake_windows_gpu:
    <<: *binary_common
    executor:
      name: windows-gpu
    steps:
      - checkout_merge
503
      - designate_upload_channel
Andrey Talman's avatar
Andrey Talman committed
504
505
506
      - run:
          name: Update CUDA driver
          command: packaging/windows/internal/driver_update.bat
507
508
509
510
511
      - run:
          command: |
            set -ex
            source packaging/windows/internal/vc_install_helper.sh
            packaging/windows/internal/cuda_install.bat
512
513
514
515
516
            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
517
518
            packaging/build_cmake.sh

519

Edward Z. Yang's avatar
Edward Z. Yang committed
520
workflows:
Philip Meier's avatar
Philip Meier committed
521
  lint:
Edward Z. Yang's avatar
Edward Z. Yang committed
522
523
    jobs:
      - circleci_consistency
Philip Meier's avatar
Philip Meier committed
524
525
526

  build:
    jobs:
527
      {{ build_workflows(windows_latest_only=True) }}
528
      {{ ios_workflows() }}
529
      {{ android_workflows() }}
Edward Z. Yang's avatar
Edward Z. Yang committed
530

531
532
533
534
  cmake:
    jobs:
      {{ cmake_workflows() }}

Edward Z. Yang's avatar
Edward Z. Yang committed
535
536
  nightly:
    jobs:
537
      {{ ios_workflows(nightly=True) }}
538
      {{ android_workflows(nightly=True) }}
539
      {{ build_workflows(prefix="nightly_", filter_branch="nightly", upload=True) }}
guyang3532's avatar
guyang3532 committed
540
541
542
543
544
545
546
  docker_build:
    triggers:
      - schedule:
          cron: "0 10 * * 0"
          filters:
            branches:
              only:
547
                - main
guyang3532's avatar
guyang3532 committed
548
549
550
    jobs:
      - smoke_test_docker_image_build:
          context: org-member