1[[linter]] 2code = 'FLAKE8' 3include_patterns = ['**/*.py'] 4exclude_patterns = [ 5 '.git/**', 6 'build_test_custom_build/**', 7 'build/**', 8 'caffe2/**', 9 'docs/caffe2/**', 10 'docs/cpp/src/**', 11 'docs/src/**', 12 'fb/**', 13 '**/fb/**', 14 'functorch/docs/**', 15 'functorch/examples/**', 16 'functorch/notebooks/**', 17 'torch/_inductor/fx_passes/serialized_patterns/**', 18 'torch/_inductor/autoheuristic/artifacts/**', 19 'scripts/**', 20 'test/generated_type_hints_smoketest.py', 21 # Tests from the NumPy test suite 22 'test/torch_np/numpy_test/**/*.py', 23 'third_party/**', 24 'torch/include/**', 25 'torch/lib/**', 26 'venv/**', 27 '**/*.pyi', 28 'tools/test/test_selective_build.py', 29] 30command = [ 31 'python3', 32 'tools/linter/adapters/flake8_linter.py', 33 '--', 34 '@{{PATHSFILE}}' 35] 36init_command = [ 37 'python3', 38 'tools/linter/adapters/pip_init.py', 39 '--dry-run={{DRYRUN}}', 40 'flake8==6.1.0', 41 'flake8-bugbear==23.3.23', 42 'flake8-comprehensions==3.15.0', 43 'flake8-executable==2.1.3', 44 'flake8-logging-format==0.9.0', 45 'flake8-pyi==23.3.1', 46 'flake8-simplify==0.19.3', 47 'mccabe==0.7.0', 48 'pycodestyle==2.11.1', 49 'pyflakes==3.1.0', 50 'torchfix==0.4.0 ; python_version >= "3.9"', 51] 52 53 54[[linter]] 55code = 'CLANGFORMAT' 56include_patterns = [ 57 'aten/src/ATen/*.h', 58 'aten/src/ATen/mps/**/*.mm', 59 'aten/src/ATen/xpu/**/*.h', 60 'aten/src/ATen/xpu/**/*.cpp', 61 'aten/src/ATen/native/mps/**/*.mm', 62 'aten/src/ATen/native/vulkan/**/*.h', 63 'aten/src/ATen/native/vulkan/**/*.cpp', 64 'aten/src/ATen/native/cuda/MultiTensorApply.cuh', 65 'aten/src/ATen/native/**/Foreach*.*', 66 'aten/src/ATen/native/cuda/fused*.*', 67 'aten/src/ATen/native/cuda/Fused*.cu', 68 'aten/src/ATen/native/cudnn/*.h', 69 'aten/src/ATen/native/cudnn/*.cpp', 70 'c10/**/*.h', 71 'c10/**/*.cpp', 72 'distributed/c10d/*DMAConnectivity.*', 73 'distributed/c10d/*SymmetricMemory.*', 74 'torch/csrc/**/*.h', 75 'torch/csrc/**/*.hpp', 76 'torch/csrc/**/*.cpp', 77 'test/cpp/**/*.h', 78 'test/cpp/**/*.cpp', 79] 80exclude_patterns = [ 81 'aten/src/ATen/native/vulkan/api/vk_mem_alloc.h', 82 'c10/util/strong_type.h', 83 '**/fb/**', 84 'torch/csrc/inductor/aoti_torch/generated/**', 85 'torch/csrc/jit/serialization/mobile_bytecode_generated.h', 86 'torch/csrc/utils/pythoncapi_compat.h', 87 'aten/src/ATen/dlpack.h', 88] 89init_command = [ 90 'python3', 91 'tools/linter/adapters/s3_init.py', 92 '--config-json=tools/linter/adapters/s3_init_config.json', 93 '--linter=clang-format', 94 '--dry-run={{DRYRUN}}', 95 '--output-dir=.lintbin', 96 '--output-name=clang-format', 97] 98command = [ 99 'python3', 100 'tools/linter/adapters/clangformat_linter.py', 101 '--binary=.lintbin/clang-format', 102 '--', 103 '@{{PATHSFILE}}' 104] 105is_formatter = true 106 107[[linter]] 108code = 'MYPY' 109include_patterns = [ 110 'torch/**/*.py', 111 'torch/**/*.pyi', 112 'caffe2/**/*.py', 113 'caffe2/**/*.pyi', 114 'test/test_bundled_images.py', 115 'test/test_bundled_inputs.py', 116 'test/test_complex.py', 117 'test/test_datapipe.py', 118 'test/test_futures.py', 119 # 'test/test_numpy_interop.py', 120 'test/test_torch.py', 121 'test/test_type_hints.py', 122 'test/test_type_info.py', 123 'test/test_utils.py', 124] 125exclude_patterns = [ 126 '**/fb/**', 127] 128command = [ 129 'python3', 130 'tools/linter/adapters/mypy_linter.py', 131 '--config=mypy.ini', 132 '--', 133 '@{{PATHSFILE}}' 134] 135init_command = [ 136 'python3', 137 'tools/linter/adapters/pip_init.py', 138 '--dry-run={{DRYRUN}}', 139 'numpy==1.24.3 ; python_version == "3.8"', 140 'numpy==1.26.0 ; python_version >= "3.9"', 141 'expecttest==0.2.1', 142 'mypy==1.10.0', 143 'sympy==1.12.1 ; python_version == "3.8"', 144 'sympy==1.13.0 ; python_version >= "3.9"', 145 'types-requests==2.27.25', 146 'types-PyYAML==6.0.7', 147 'types-tabulate==0.8.8', 148 'types-protobuf==3.19.18', 149 'types-pkg-resources==0.1.3', 150 'types-Jinja2==2.11.9', 151 'types-colorama==0.4.6', 152 'filelock==3.13.1', 153 'junitparser==2.1.1', 154 'rich==10.9.0', 155 'pyyaml==6.0.1', 156 'optree==0.12.1', 157] 158 159[[linter]] 160code = 'MYPYSTRICT' 161include_patterns = [ 162 '.github/**/*.py', 163 'benchmarks/instruction_counts/**/*.py', 164 'tools/**/*.py', 165 'torchgen/**/*.py', 166 'torch/utils/_pytree.py', 167 'torch/utils/_cxx_pytree.py', 168 'torch/utils/benchmark/utils/common.py', 169 'torch/utils/benchmark/utils/timer.py', 170 'torch/utils/benchmark/utils/valgrind_wrapper/**/*.py', 171] 172exclude_patterns = [ 173 # (linbinyu) copied from internal repo 174 '**/fb/**', 175 'tools/code_analyzer/gen_operators_yaml.py', 176 'tools/dynamo/verify_dynamo.py', 177 'tools/gen_vulkan_spv.py', 178 'tools/test/gen_operators_yaml_test.py', 179 'tools/test/gen_oplist_test.py', 180 'tools/test/test_selective_build.py', 181] 182command = [ 183 'python3', 184 'tools/linter/adapters/mypy_linter.py', 185 '--config=mypy-strict.ini', 186 '--code=MYPYSTRICT', 187 '--', 188 '@{{PATHSFILE}}' 189] 190 191[[linter]] 192code = 'CLANGTIDY' 193include_patterns = [ 194 # Enable coverage of headers in aten/src/ATen 195 # and excluding most sub-directories for now. 196 'aten/src/ATen/*.h', 197 'aten/src/ATen/*.cpp', 198 'aten/src/ATen/cpu/*.h', 199 'aten/src/ATen/cpu/*.cpp', 200 'aten/src/ATen/core/*.h', 201 'aten/src/ATen/core/*.cpp', 202 'aten/src/ATen/cudnn/*.h', 203 'aten/src/ATen/cudnn/*.cpp', 204 'aten/src/ATen/detail/*', 205 'aten/src/ATen/functorch/*.h', 206 'aten/src/ATen/functorch/*.cpp', 207 'aten/src/ATen/native/nested/cuda/*.cpp', 208 'aten/src/ATen/native/nested/cuda/*.h', 209 'aten/src/ATen/native/nested/*.cpp', 210 'aten/src/ATen/native/nested/*.h', 211 'c10/**/*.cpp', 212 'c10/**/*.h', 213 'torch/*.h', 214 'torch/csrc/*.h', 215 'torch/csrc/*.cpp', 216 'torch/csrc/**/*.h', 217 'torch/csrc/**/*.cpp', 218 'torch/csrc/jit/serialization/*.h', 219 'torch/csrc/jit/serialization/*.cpp', 220] 221exclude_patterns = [ 222 # The negative filters below are to exclude files that include onnx_pb.h or 223 # caffe2_pb.h, otherwise we'd have to build protos as part of this CI job. 224 # CUDA files are also excluded. 225 '**/fb/**', 226 '**/*pb.h', 227 'aten/**/cuda/*pp', 228 'c10/xpu/**/*.h', 229 'c10/xpu/**/*.cpp', 230 'c10/cuda/CUDAAlgorithm.h', 231 'c10/util/complex_math.h', 232 'c10/util/complex_utils.h', 233 'c10/util/flat_hash_map.h', 234 'c10/util/logging*.h', 235 'c10/util/hash.h', 236 'c10/util/strong_type.h', 237 'c10/util/SmallVector.h', 238 'c10/util/win32-headers.h', 239 'c10/util/*inl.h', 240 'c10/test/**/*.h', 241 'third_party/**/*', 242 'torch/csrc/api/**', 243 'torch/csrc/autograd/generated/**', 244 'torch/csrc/distributed/**/*', 245 'torch/csrc/dynamo/eval_frame.h', 246 'torch/csrc/inductor/aoti_torch/c/shim.h', 247 'torch/csrc/jit/**/*', 248 'torch/csrc/jit/serialization/mobile_bytecode_generated.h', 249 'torch/csrc/lazy/**/*', 250] 251init_command = [ 252 'python3', 253 'tools/linter/adapters/s3_init.py', 254 '--config-json=tools/linter/adapters/s3_init_config.json', 255 '--linter=clang-tidy', 256 '--dry-run={{DRYRUN}}', 257 '--output-dir=.lintbin', 258 '--output-name=clang-tidy', 259] 260command = [ 261 'python3', 262 'tools/linter/adapters/clangtidy_linter.py', 263 '--binary=.lintbin/clang-tidy', 264 '--build_dir=./build', 265 '--', 266 '@{{PATHSFILE}}' 267] 268 269[[linter]] 270code = 'TYPEIGNORE' 271include_patterns = ['**/*.py', '**/*.pyi'] 272exclude_patterns = [ 273 'fb/**', 274 '**/fb/**', 275 'test/test_jit.py', 276] 277command = [ 278 'python3', 279 'tools/linter/adapters/grep_linter.py', 280 '--pattern=# type:\s*ignore([^\[]|$)', 281 '--linter-name=TYPEIGNORE', 282 '--error-name=unqualified type: ignore', 283 """--error-description=\ 284 This line has an unqualified `type: ignore`; \ 285 please convert it to `type: ignore[xxxx]`\ 286 """, 287 '--', 288 '@{{PATHSFILE}}' 289] 290 291[[linter]] 292code = 'TYPENOSKIP' 293include_patterns = ['mypy.ini'] 294command = [ 295 'python3', 296 'tools/linter/adapters/grep_linter.py', 297 '--pattern=follow_imports\s*=\s*skip', 298 '--linter-name=TYPENOSKIP', 299 '--error-name=use of follow_imports = skip', 300 """--error-description=\ 301 follow_imports = skip is forbidden from mypy.ini configuration as it \ 302 is extremely easy to accidentally turn off type checking unintentionally. If \ 303 you need to suppress type errors, use a top level # mypy: ignore-errors. \ 304 Do not rely on automatic Any substitution; instead, manually # type: ignore \ 305 at use sites or define a pyi type stub with more relaxed types. \ 306 """, 307 '--', 308 '@{{PATHSFILE}}' 309] 310 311[[linter]] 312code = 'NOQA' 313include_patterns = ['**/*.py', '**/*.pyi'] 314exclude_patterns = [ 315 'caffe2/**', 316 'fb/**', 317 '**/fb/**' 318 ] 319command = [ 320 'python3', 321 'tools/linter/adapters/grep_linter.py', 322 '--pattern=# noqa([^:]|$)', 323 '--linter-name=NOQA', 324 '--error-name=unqualified noqa', 325 """--error-description=\ 326 This line has an unqualified `noqa`; \ 327 please convert it to `noqa: XXXX`\ 328 """, 329 '--', 330 '@{{PATHSFILE}}' 331] 332 333[[linter]] 334code = 'NATIVEFUNCTIONS' 335include_patterns=['aten/src/ATen/native/native_functions.yaml'] 336command = [ 337 'python3', 338 'tools/linter/adapters/nativefunctions_linter.py', 339 '--native-functions-yml=aten/src/ATen/native/native_functions.yaml', 340] 341init_command = [ 342 'python3', 343 'tools/linter/adapters/pip_init.py', 344 '--dry-run={{DRYRUN}}', 345 'ruamel.yaml==0.17.4', 346] 347is_formatter = true 348 349[[linter]] 350code = 'NEWLINE' 351include_patterns=['**'] 352exclude_patterns=[ 353 '**/contrib/**', 354 'third_party/**', 355 '**/*.bat', 356 '**/*.expect', 357 '**/*.ipynb', 358 '**/*.ps1', 359 '**/*.ptl', 360 'fb/**', 361 '**/fb/**', 362 'tools/clang_format_hash/**', 363 'test/cpp/jit/upgrader_models/*.ptl', 364 'test/cpp/jit/upgrader_models/*.ptl.ff', 365 '**/*.png', 366 '**/*.gz', 367] 368command = [ 369 'python3', 370 'tools/linter/adapters/newlines_linter.py', 371 '--', 372 '@{{PATHSFILE}}', 373] 374is_formatter = true 375 376[[linter]] 377code = 'CONSTEXPR' 378include_patterns=['aten/src/ATen/native/cuda/*.cu'] 379command = [ 380 'python3', 381 'tools/linter/adapters/constexpr_linter.py', 382 '--', 383 '@{{PATHSFILE}}', 384] 385is_formatter = true 386 387[[linter]] 388code = 'SPACES' 389include_patterns = ['**'] 390exclude_patterns = [ 391 '**/contrib/**', 392 '**/*.diff', 393 '**/*.patch', 394 'third_party/**', 395 'aten/src/ATen/native/vulkan/api/vk_mem_alloc.h', 396 'fb/**', 397 '**/fb/**', 398 'test/cpp/jit/upgrader_models/*.ptl', 399 'test/cpp/jit/upgrader_models/*.ptl.ff', 400] 401command = [ 402 'python3', 403 'tools/linter/adapters/grep_linter.py', 404 '--pattern=[[:blank:]]$', 405 '--linter-name=SPACES', 406 '--error-name=trailing spaces', 407 '--replace-pattern=s/[[:blank:]]+$//', 408 """--error-description=\ 409 This line has trailing spaces; please remove them.\ 410 """, 411 '--', 412 '@{{PATHSFILE}}' 413] 414 415[[linter]] 416code = 'TABS' 417include_patterns = ['**'] 418exclude_patterns = [ 419 '**/*.svg', 420 '**/*Makefile', 421 '**/contrib/**', 422 'third_party/**', 423 '**/.gitattributes', 424 '**/.gitmodules', 425 'fb/**', 426 '**/fb/**', 427 'aten/src/ATen/native/vulkan/api/vk_mem_alloc.h', 428 'test/cpp/jit/upgrader_models/*.ptl', 429 'test/cpp/jit/upgrader_models/*.ptl.ff', 430 '.ci/docker/common/install_rocm_drm.sh', 431 '.lintrunner.toml', 432] 433command = [ 434 'python3', 435 'tools/linter/adapters/grep_linter.py', 436 # @lint-ignore TXT2 437 '--pattern= ', 438 '--linter-name=TABS', 439 '--error-name=saw some tabs', 440 '--replace-pattern=s/\t/ /', 441 """--error-description=\ 442 This line has tabs; please replace them with spaces.\ 443 """, 444 '--', 445 '@{{PATHSFILE}}' 446] 447 448[[linter]] 449code = 'INCLUDE' 450include_patterns = [ 451 'c10/**', 452 'aten/**', 453 'torch/csrc/**', 454] 455exclude_patterns = [ 456 'aten/src/ATen/native/quantized/cpu/qnnpack/**', 457 'aten/src/ATen/native/vulkan/api/vk_mem_alloc.h', 458 'aten/src/ATen/native/vulkan/glsl/**', 459 '**/fb/**', 460 'torch/csrc/jit/serialization/mobile_bytecode_generated.h', 461 'torch/csrc/utils/pythoncapi_compat.h', 462] 463command = [ 464 'python3', 465 'tools/linter/adapters/grep_linter.py', 466 '--pattern=#include "', 467 '--linter-name=INCLUDE', 468 '--error-name=quoted include', 469 '--replace-pattern=s/#include "(.*)"$/#include <\1>/', 470 """--error-description=\ 471 This #include uses quotes; please convert it to #include <xxxx>\ 472 """, 473 '--', 474 '@{{PATHSFILE}}' 475] 476 477[[linter]] 478code = 'PYBIND11_INCLUDE' 479include_patterns = [ 480 '**/*.cpp', 481 '**/*.h', 482] 483exclude_patterns = [ 484 'torch/csrc/utils/pybind.h', 485 'torch/utils/benchmark/utils/valgrind_wrapper/compat_bindings.cpp', 486 'caffe2/**/*', 487] 488command = [ 489 'python3', 490 'tools/linter/adapters/grep_linter.py', 491 '--pattern=#include <pybind11\/', 492 '--allowlist-pattern=#include <torch\/csrc\/utils\/pybind.h>', 493 '--linter-name=PYBIND11_INCLUDE', 494 '--match-first-only', 495 '--error-name=direct include of pybind11', 496 # https://stackoverflow.com/a/33416489/23845 497 # NB: this won't work if the pybind11 include is on the first line; 498 # but that's fine because it will just mean the lint will still fail 499 # after applying the change and you will have to fix it manually 500 '--replace-pattern=1,/(#include <pybind11\/)/ s/(#include <pybind11\/)/#include <torch\/csrc\/utils\/pybind.h>\n\1/', 501 """--error-description=\ 502 This #include directly includes pybind11 without also including \ 503 #include <torch/csrc/utils/pybind.h>; this means some important \ 504 specializations may not be included.\ 505 """, 506 '--', 507 '@{{PATHSFILE}}' 508] 509 510[[linter]] 511code = 'ERROR_PRONE_ISINSTANCE' 512include_patterns = [ 513 'torch/_refs/**/*.py', 514 'torch/_prims/**/*.py', 515 'torch/_prims_common/**/*.py', 516 'torch/_decomp/**/*.py', 517 'torch/_meta_registrations.py', 518] 519exclude_patterns = [ 520 '**/fb/**', 521] 522command = [ 523 'python3', 524 'tools/linter/adapters/grep_linter.py', 525 '--pattern=isinstance\([^)]+(int|float)\)', 526 '--linter-name=ERROR_PRONE_ISINSTANCE', 527 '--error-name=error prone isinstance', 528 """--error-description=\ 529 This line has an isinstance call that directly refers to \ 530 int or float. This is error-prone because you may also \ 531 have wanted to allow SymInt or SymFloat in your test. \ 532 To suppress this lint, use an appropriate type alias defined \ 533 in torch._prims_common; use IntLike/FloatLike when you would accept \ 534 both regular and symbolic numbers, Dim for ints representing \ 535 dimensions, or IntWithoutSymInt/FloatWithoutSymFloat if you really \ 536 meant to exclude symbolic numbers. 537 """, 538 '--', 539 '@{{PATHSFILE}}' 540] 541 542[[linter]] 543code = 'PYBIND11_SPECIALIZATION' 544include_patterns = [ 545 '**/*.cpp', 546 '**/*.h', 547] 548exclude_patterns = [ 549 # The place for all orphan specializations 550 'torch/csrc/utils/pybind.h', 551 # These specializations are non-orphan 552 'torch/csrc/distributed/c10d/init.cpp', 553 'torch/csrc/jit/python/pybind.h', 554 'fb/**', 555 '**/fb/**', 556 # These are safe to exclude as they do not have Python 557 'c10/**/*', 558] 559command = [ 560 'python3', 561 'tools/linter/adapters/grep_linter.py', 562 '--pattern=PYBIND11_DECLARE_HOLDER_TYPE', 563 '--linter-name=PYBIND11_SPECIALIZATION', 564 '--error-name=pybind11 specialization in non-standard location', 565 """--error-description=\ 566 This pybind11 specialization (PYBIND11_DECLARE_HOLDER_TYPE) should \ 567 be placed in torch/csrc/utils/pybind.h so that it is guaranteed to be \ 568 included at any site that may potentially make use of it via py::cast. \ 569 If your specialization is in the same header file as the definition \ 570 of the holder type, you can ignore this lint by adding your header to \ 571 the exclude_patterns for this lint in .lintrunner.toml. For more \ 572 information see https://github.com/pybind/pybind11/issues/4099 \ 573 """, 574 '--', 575 '@{{PATHSFILE}}' 576] 577 578[[linter]] 579code = 'PYPIDEP' 580include_patterns = ['.github/**'] 581exclude_patterns = [ 582 '**/*.rst', 583 '**/*.py', 584 '**/*.md', 585 '**/*.diff', 586 '**/fb/**', 587] 588command = [ 589 'python3', 590 'tools/linter/adapters/grep_linter.py', 591 """--pattern=\ 592 (pip|pip3|python -m pip|python3 -m pip|python3 -mpip|python -mpip) \ 593 install ([a-zA-Z0-9][A-Za-z0-9\\._\\-]+)([^/=<>~!]+)[A-Za-z0-9\\._\\-\\*\\+\\!]*$\ 594 """, 595 '--linter-name=PYPIDEP', 596 '--error-name=unpinned PyPI install', 597 """--error-description=\ 598 This line has unpinned PyPi installs; \ 599 please pin them to a specific version: e.g. 'thepackage==1.2'\ 600 """, 601 '--', 602 '@{{PATHSFILE}}' 603] 604 605[[linter]] 606code = 'EXEC' 607include_patterns = ['**'] 608exclude_patterns = [ 609 'third_party/**', 610 'torch/bin/**', 611 '**/*.so', 612 '**/*.py', 613 '**/*.sh', 614 '**/*.bash', 615 '**/git-pre-commit', 616 '**/git-clang-format', 617 '**/gradlew', 618 'fb/**', 619 '**/fb/**', 620] 621command = [ 622 'python3', 623 'tools/linter/adapters/exec_linter.py', 624 '--', 625 '@{{PATHSFILE}}', 626] 627 628[[linter]] 629code = 'CUBINCLUDE' 630include_patterns = ['aten/**'] 631exclude_patterns = [ 632 'aten/src/ATen/cuda/cub*.cuh', 633 '**/fb/**', 634] 635command = [ 636 'python3', 637 'tools/linter/adapters/grep_linter.py', 638 '--pattern=#include <cub/', 639 '--linter-name=CUBINCLUDE', 640 '--error-name=direct cub include', 641 """--error-description=\ 642 This line has a direct cub include; please include \ 643 ATen/cuda/cub.cuh instead and wrap your cub calls in \ 644 at::native namespace if necessary. 645 """, 646 '--', 647 '@{{PATHSFILE}}' 648] 649 650[[linter]] 651code = 'RAWCUDA' 652include_patterns = [ 653 'aten/**', 654 'c10/**', 655] 656exclude_patterns = [ 657 'aten/src/ATen/test/**', 658 'c10/cuda/CUDAFunctions.h', 659 'c10/cuda/CUDACachingAllocator.cpp', 660 '**/fb/**', 661] 662command = [ 663 'python3', 664 'tools/linter/adapters/grep_linter.py', 665 '--pattern=cudaStreamSynchronize', 666 '--linter-name=RAWCUDA', 667 '--error-name=raw CUDA API usage', 668 """--error-description=\ 669 This line calls raw CUDA APIs directly; please use at::cuda wrappers instead. 670 """, 671 '--', 672 '@{{PATHSFILE}}' 673] 674 675[[linter]] 676code = 'RAWCUDADEVICE' 677include_patterns = [ 678 'aten/**', 679 'c10/**', 680 'torch/csrc/**', 681] 682exclude_patterns = [ 683 'aten/src/ATen/cuda/CUDAContext.cpp', 684 'aten/src/ATen/cuda/CUDAGeneratorImpl.cpp', 685 'aten/src/ATen/test/**', 686 'c10/core/impl/InlineDeviceGuard.h', 687 'c10/cuda/CUDAFunctions.cpp', 688 'c10/cuda/CUDAGuard.h', 689 'c10/cuda/impl/CUDATest.cpp', 690 'torch/csrc/cuda/nccl.cpp', 691 '**/fb/**', 692] 693command = [ 694 'python3', 695 'tools/linter/adapters/grep_linter.py', 696 '--pattern=cudaSetDevice(', 697 '--pattern=cudaGetDevice(', 698 '--linter-name=RAWCUDADEVICE', 699 '--error-name=raw CUDA API usage', 700 """--error-description=\ 701 This line calls raw CUDA APIs directly; please use c10::cuda wrappers instead. 702 """, 703 '--', 704 '@{{PATHSFILE}}' 705] 706 707[[linter]] 708code = 'ROOT_LOGGING' 709include_patterns = [ 710 '**/*.py', 711] 712# These are not library code, but scripts in their own right, and so 713# therefore are permitted to use logging 714exclude_patterns = [ 715 'tools/**', 716 'test/**', 717 'benchmarks/**', 718 'torch/distributed/run.py', 719 'functorch/benchmarks/**', 720 # Grandfathered in 721 'caffe2/**', 722 'fb/**', 723 '**/fb/**', 724] 725command = [ 726 'python3', 727 'tools/linter/adapters/grep_linter.py', 728 '--pattern=logging\.(debug|info|warn|warning|error|critical|log|exception)\(', 729 '--replace-pattern=s/logging\.(debug|info|warn|warning|error|critical|log|exception)\(/log.\1(/', 730 '--linter-name=ROOT_LOGGING', 731 '--error-name=use of root logger', 732 """--error-description=\ 733 Do not use root logger (logging.info, etc) directly; instead \ 734 define 'log = logging.getLogger(__name__)' and call, e.g., log.info(). 735 """, 736 '--', 737 '@{{PATHSFILE}}' 738] 739 740[[linter]] 741code = 'DEPLOY_DETECTION' 742include_patterns = [ 743 '**/*.py', 744] 745command = [ 746 'python3', 747 'tools/linter/adapters/grep_linter.py', 748 '--pattern=sys\.executable == .torch_deploy.', 749 '--replace-pattern=s/sys\.executable == .torch_deploy./torch._running_with_deploy\(\)/', 750 '--linter-name=DEPLOY_DETECTION', 751 '--error-name=properly detect deploy runner', 752 """--error-description=\ 753 Do not use sys.executable to detect if running within deploy/multipy, use torch._running_with_deploy(). 754 """, 755 '--', 756 '@{{PATHSFILE}}' 757] 758 759[[linter]] 760code = 'CMAKE' 761include_patterns = [ 762 "**/*.cmake", 763 "**/*.cmake.in", 764 "**/CMakeLists.txt", 765] 766exclude_patterns = [ 767 'cmake/Modules/**', 768 'cmake/Modules_CUDA_fix/**', 769 'cmake/Caffe2Config.cmake.in', 770 'aten/src/ATen/ATenConfig.cmake.in', 771 'cmake/TorchConfig.cmake.in', 772 'cmake/TorchConfigVersion.cmake.in', 773 'cmake/cmake_uninstall.cmake.i', 774 'fb/**', 775 '**/fb/**', 776] 777command = [ 778 'python3', 779 'tools/linter/adapters/cmake_linter.py', 780 '--config=.cmakelintrc', 781 '--', 782 '@{{PATHSFILE}}', 783] 784init_command = [ 785 'python3', 786 'tools/linter/adapters/pip_init.py', 787 '--dry-run={{DRYRUN}}', 788 'cmakelint==1.4.1', 789] 790 791[[linter]] 792code = 'SHELLCHECK' 793include_patterns = [ 794 '.ci/pytorch/**/*.sh' 795] 796exclude_patterns = [ 797 '**/fb/**', 798] 799command = [ 800 'python3', 801 'tools/linter/adapters/shellcheck_linter.py', 802 '--', 803 '@{{PATHSFILE}}', 804] 805init_command = [ 806 'python3', 807 'tools/linter/adapters/pip_init.py', 808 '--dry-run={{DRYRUN}}', 809 'shellcheck-py==0.7.2.1', 810] 811 812[[linter]] 813code = 'ACTIONLINT' 814include_patterns = [ 815 '.github/workflows/*.yml', 816 '.github/workflows/*.yaml', 817 # actionlint does not support composite actions yet 818 # '.github/actions/**/*.yml', 819 # '.github/actions/**/*.yaml', 820] 821exclude_patterns = [ 822 '**/fb/**', 823] 824command = [ 825 'python3', 826 'tools/linter/adapters/actionlint_linter.py', 827 '--binary=.lintbin/actionlint', 828 '--', 829 '@{{PATHSFILE}}', 830] 831init_command = [ 832 'python3', 833 'tools/linter/adapters/s3_init.py', 834 '--config-json=tools/linter/adapters/s3_init_config.json', 835 '--linter=actionlint', 836 '--dry-run={{DRYRUN}}', 837 '--output-dir=.lintbin', 838 '--output-name=actionlint', 839] 840 841[[linter]] 842code = 'TESTOWNERS' 843include_patterns = [ 844 'test/**/test_*.py', 845 'test/**/*_test.py', 846] 847exclude_patterns = [ 848 'test/run_test.py', 849 '**/fb/**', 850] 851command = [ 852 'python3', 853 'tools/linter/adapters/testowners_linter.py', 854 '--', 855 '@{{PATHSFILE}}', 856] 857 858[[linter]] 859code = 'TEST_HAS_MAIN' 860include_patterns = [ 861 'test/**/test_*.py', 862] 863exclude_patterns = [ 864 'test/run_test.py', 865 '**/fb/**', 866 'test/quantization/**', # should be run through test/test_quantization.py 867 'test/jit/**', # should be run through test/test_jit.py 868 'test/ao/sparsity/**', # should be run through test/test_ao_sparsity.py 869 'test/fx/**', # should be run through test/test_fx.py 870 'test/bottleneck_test/**', # excluded by test/run_test.py 871 'test/package/**', # excluded by test/run_test.py 872 'test/distributed/argparse_util_test.py', 873 'test/distributed/bin/test_script.py', 874 'test/distributed/elastic/agent/server/test/local_elastic_agent_test.py', 875 'test/distributed/elastic/multiprocessing/bin/test_script.py', 876 'test/distributed/elastic/multiprocessing/bin/zombie_test.py', 877 'test/distributed/elastic/multiprocessing/errors/api_test.py', 878 'test/distributed/elastic/multiprocessing/errors/error_handler_test.py', 879 'test/distributed/elastic/multiprocessing/redirects_test.py', 880 'test/distributed/elastic/multiprocessing/tail_log_test.py', 881 'test/distributed/elastic/rendezvous/api_test.py', 882 'test/distributed/elastic/rendezvous/c10d_rendezvous_backend_test.py', 883 'test/distributed/elastic/rendezvous/dynamic_rendezvous_test.py', 884 'test/distributed/elastic/rendezvous/etcd_rendezvous_backend_test.py', 885 'test/distributed/elastic/rendezvous/etcd_rendezvous_test.py', 886 'test/distributed/elastic/rendezvous/etcd_server_test.py', 887 'test/distributed/elastic/rendezvous/rendezvous_backend_test.py', 888 'test/distributed/elastic/rendezvous/static_rendezvous_test.py', 889 'test/distributed/elastic/rendezvous/utils_test.py', 890 'test/distributed/elastic/timer/api_test.py', 891 'test/distributed/elastic/utils/data/cycling_iterator_test.py', 892 'test/distributed/launcher/api_test.py', 893 'test/distributed/launcher/bin/test_script.py', 894 'test/distributed/launcher/bin/test_script_init_method.py', 895 'test/distributed/launcher/bin/test_script_is_torchelastic_launched.py', 896 'test/distributed/launcher/bin/test_script_local_rank.py', 897 'test/distributed/launcher/launch_test.py', 898 'test/distributed/launcher/run_test.py', 899 'test/distributed/optim/test_apply_optimizer_in_backward.py', 900 'test/distributed/optim/test_named_optimizer.py', 901 'test/distributed/test_c10d_spawn.py', 902 'test/distributed/test_collective_utils.py', 903 'test/distributions/test_distributions.py', 904 'test/inductor/test_aot_inductor_utils.py', 905 'test/lazy/test_bindings.py', 906 'test/lazy/test_extract_compiled_graph.py', 907 'test/lazy/test_meta_kernel.py', 908 'test/nn/test_init.py', 909 'test/onnx/model_defs/op_test.py', 910 'test/onnx/test_models_quantized_onnxruntime.py', 911 'test/onnx/test_onnxscript_no_runtime.py', 912 'test/onnx_caffe2/test_caffe2_common.py', 913 'test/optim/test_lrscheduler.py', 914 'test/optim/test_optim.py', 915 'test/optim/test_swa_utils.py', 916 'test/run_test.py', 917 'test/test_bundled_images.py', 918 'test/test_cuda_expandable_segments.py', 919 'test/test_hub.py', 920] 921command = [ 922 'python3', 923 'tools/linter/adapters/test_has_main_linter.py', 924 '--', 925 '@{{PATHSFILE}}', 926] 927 928[[linter]] 929code = 'CALL_ONCE' 930include_patterns = [ 931 'c10/**', 932 'aten/**', 933 'torch/csrc/**', 934] 935exclude_patterns = [ 936 'c10/util/CallOnce.h', 937 '**/fb/**', 938] 939command = [ 940 'python3', 941 'tools/linter/adapters/grep_linter.py', 942 '--pattern=std::call_once', 943 '--linter-name=CALL_ONCE', 944 '--error-name=invalid call_once', 945 '--replace-pattern=s/std::call_once/c10::call_once/', 946 """--error-description=\ 947 Use of std::call_once is forbidden and should be replaced with c10::call_once\ 948 """, 949 '--', 950 '@{{PATHSFILE}}' 951] 952 953[[linter]] 954code = 'CONTEXT_DECORATOR' 955include_patterns = [ 956 'torch/**', 957] 958command = [ 959 'python3', 960 'tools/linter/adapters/grep_linter.py', 961 '--pattern=@.*(dynamo_timed|preserve_rng_state|clear_frame|with_fresh_cache_if_config|use_lazy_graph_module|_disable_current_modes)', 962 '--linter-name=CONTEXT_DECORATOR', 963 '--error-name=avoid context decorator', 964 """--error-description=\ 965 Do not use context manager as decorator as it breaks cProfile traces. Use it as \ 966 a context manager instead\ 967 """, 968 '--', 969 '@{{PATHSFILE}}' 970] 971 972[[linter]] 973code = 'ONCE_FLAG' 974include_patterns = [ 975 'c10/**', 976 'aten/**', 977 'torch/csrc/**', 978] 979exclude_patterns = [ 980 '**/fb/**', 981] 982command = [ 983 'python3', 984 'tools/linter/adapters/grep_linter.py', 985 '--pattern=std::once_flag', 986 '--linter-name=ONCE_FLAG', 987 '--error-name=invalid once_flag', 988 '--replace-pattern=s/std::once_flag/c10::once_flag/', 989 """--error-description=\ 990 Use of std::once_flag is forbidden and should be replaced with c10::once_flag\ 991 """, 992 '--', 993 '@{{PATHSFILE}}' 994] 995 996[[linter]] 997code = 'WORKFLOWSYNC' 998include_patterns = [ 999 '.github/workflows/pull.yml', 1000 '.github/workflows/trunk.yml', 1001 '.github/workflows/periodic.yml', 1002 '.github/workflows/mac-mps.yml', 1003 '.github/workflows/slow.yml', 1004] 1005command = [ 1006 'python3', 1007 'tools/linter/adapters/workflow_consistency_linter.py', 1008 '--', 1009 '@{{PATHSFILE}}' 1010] 1011init_command = [ 1012 'python3', 1013 'tools/linter/adapters/pip_init.py', 1014 '--dry-run={{DRYRUN}}', 1015 'PyYAML==6.0.1', 1016] 1017 1018# usort + ruff-format 1019[[linter]] 1020code = 'PYFMT' 1021include_patterns = [ 1022 '**/*.py', 1023 '**/*.pyi', 1024] 1025command = [ 1026 'python3', 1027 'tools/linter/adapters/pyfmt_linter.py', 1028 '--', 1029 '@{{PATHSFILE}}' 1030] 1031exclude_patterns = [ 1032 'tools/gen_vulkan_spv.py', 1033 # We don't care too much about files in this directory, don't enforce 1034 # formatting on them 1035 'caffe2/**/*.py', 1036 'caffe2/**/*.pyi', 1037 'fb/**', 1038 '**/fb/**', 1039 'third_party/**/*.py', 1040 'third_party/**/*.pyi', 1041 'torch/_inductor/fx_passes/serialized_patterns/**', 1042 'torch/_inductor/autoheuristic/artifacts/**', 1043 # These files are all grandfathered in, feel free to remove from this list 1044 # as necessary 1045 'test/_nvfuser/__init__.py', 1046 'test/_nvfuser/test_dynamo.py', 1047 'test/_nvfuser/test_python_frontend.py', 1048 'test/_nvfuser/test_torchscript.py', 1049 'test/delete.py', 1050 'test/expect/__init__.py', 1051 'test/quantization/__init__.py', 1052 'test/quantization/core/__init__.py', 1053 'test/quantization/core/experimental/apot_fx_graph_mode_ptq.py', 1054 'test/quantization/core/experimental/apot_fx_graph_mode_qat.py', 1055 'test/quantization/core/experimental/quantization_util.py', 1056 'test/quantization/core/experimental/test_bits.py', 1057 'test/quantization/core/experimental/test_fake_quantize.py', 1058 'test/quantization/core/experimental/test_linear.py', 1059 'test/quantization/core/experimental/test_nonuniform_observer.py', 1060 'test/quantization/core/experimental/test_quantized_tensor.py', 1061 'test/quantization/core/experimental/test_quantizer.py', 1062 'test/quantization/core/test_backend_config.py', 1063 'test/quantization/core/test_docs.py', 1064 'test/quantization/core/test_quantized_functional.py', 1065 'test/quantization/core/test_quantized_module.py', 1066 'test/quantization/core/test_quantized_op.py', 1067 'test/quantization/core/test_quantized_tensor.py', 1068 'test/quantization/core/test_top_level_apis.py', 1069 'test/quantization/core/test_utils.py', 1070 'test/quantization/core/test_workflow_module.py', 1071 'test/quantization/core/test_workflow_ops.py', 1072 'test/quantization/eager/__init__.py', 1073 'test/quantization/eager/test_bias_correction_eager.py', 1074 'test/quantization/eager/test_equalize_eager.py', 1075 'test/quantization/eager/test_fuse_eager.py', 1076 'test/quantization/eager/test_model_numerics.py', 1077 'test/quantization/eager/test_numeric_suite_eager.py', 1078 'test/quantization/eager/test_quantize_eager_ptq.py', 1079 'test/quantization/eager/test_quantize_eager_qat.py', 1080 'test/quantization/fx/__init__.py', 1081 'test/quantization/fx/test_equalize_fx.py', 1082 'test/quantization/fx/test_model_report_fx.py', 1083 'test/quantization/fx/test_numeric_suite_fx.py', 1084 'test/quantization/fx/test_quantize_fx.py', 1085 'test/quantization/fx/test_subgraph_rewriter.py', 1086 'test/test_fake_tensor.py', 1087 'test/test_flop_counter.py', 1088 'test/test_function_schema.py', 1089 'test/test_functional_autograd_benchmark.py', 1090 'test/test_functional_optim.py', 1091 'test/test_functionalization_of_rng_ops.py', 1092 'test/test_datapipe.py', 1093 'test/test_futures.py', 1094 'test/test_fx.py', 1095 'test/test_fx_experimental.py', 1096 'test/test_fx_passes.py', 1097 'test/test_fx_reinplace_pass.py', 1098 'test/test_import_stats.py', 1099 'test/test_itt.py', 1100 'test/test_jit.py', 1101 'test/test_jit_autocast.py', 1102 'test/test_jit_cuda_fuser.py', 1103 'test/test_jit_disabled.py', 1104 'test/test_jit_fuser.py', 1105 'test/test_jit_fuser_legacy.py', 1106 'test/test_jit_legacy.py', 1107 'test/test_jit_llga_fuser.py', 1108 'test/test_jit_profiling.py', 1109 'test/test_jit_simple.py', 1110 'test/test_jit_string.py', 1111 'test/test_jiterator.py', 1112 'test/test_kernel_launch_checks.py', 1113 'test/test_linalg.py', 1114 'test/test_masked.py', 1115 'test/test_maskedtensor.py', 1116 'test/test_matmul_cuda.py', 1117 'test/test_meta.py', 1118 'test/test_metal.py', 1119 'test/test_mkl_verbose.py', 1120 'test/test_mkldnn.py', 1121 'test/test_mkldnn_fusion.py', 1122 'test/test_mkldnn_verbose.py', 1123 'test/test_mobile_optimizer.py', 1124 'test/test_model_dump.py', 1125 'test/test_modules.py', 1126 'test/test_monitor.py', 1127 'test/test_mps.py', 1128 'test/test_multiprocessing_spawn.py', 1129 'test/test_namedtensor.py', 1130 'test/test_namedtuple_return_api.py', 1131 'test/test_native_functions.py', 1132 'test/test_native_mha.py', 1133 'test/test_nn.py', 1134 'test/test_out_dtype_op.py', 1135 'test/test_overrides.py', 1136 'test/test_prims.py', 1137 'test/test_proxy_tensor.py', 1138 'test/test_pruning_op.py', 1139 'test/test_quantization.py', 1140 'test/test_reductions.py', 1141 'test/test_scatter_gather_ops.py', 1142 'test/test_schema_check.py', 1143 'test/test_segment_reductions.py', 1144 'test/test_serialization.py', 1145 'test/test_set_default_mobile_cpu_allocator.py', 1146 'test/test_sparse.py', 1147 'test/test_sparse_csr.py', 1148 'test/test_sparse_semi_structured.py', 1149 'test/test_spectral_ops.py', 1150 'test/test_stateless.py', 1151 'test/test_static_runtime.py', 1152 'test/test_subclass.py', 1153 'test/test_sympy_utils.py', 1154 'test/test_tensor_creation_ops.py', 1155 'test/test_tensorboard.py', 1156 'test/test_tensorexpr.py', 1157 'test/test_tensorexpr_pybind.py', 1158 'test/test_testing.py', 1159 'test/test_torch.py', 1160 'test/test_transformers.py', 1161 'test/test_type_promotion.py', 1162 'test/test_unary_ufuncs.py', 1163 'test/test_vulkan.py', 1164 'torch/_awaits/__init__.py', 1165 'torch/_custom_op/__init__.py', 1166 'torch/_custom_op/autograd.py', 1167 'torch/_custom_op/functional.py', 1168 'torch/_custom_op/impl.py', 1169 'torch/_export/__init__.py', 1170 'torch/_export/constraints.py', 1171 'torch/_export/db/__init__.py', 1172 'torch/_export/db/case.py', 1173 'torch/_export/db/examples/__init__.py', 1174 'torch/_export/db/examples/assume_constant_result.py', 1175 'torch/_export/db/examples/autograd_function.py', 1176 'torch/_export/db/examples/class_method.py', 1177 'torch/_export/db/examples/cond_branch_class_method.py', 1178 'torch/_export/db/examples/cond_branch_nested_function.py', 1179 'torch/_export/db/examples/cond_branch_nonlocal_variables.py', 1180 'torch/_export/db/examples/cond_closed_over_variable.py', 1181 'torch/_export/db/examples/cond_operands.py', 1182 'torch/_export/db/examples/cond_predicate.py', 1183 'torch/_export/db/examples/decorator.py', 1184 'torch/_export/db/examples/dictionary.py', 1185 'torch/_export/db/examples/dynamic_shape_assert.py', 1186 'torch/_export/db/examples/dynamic_shape_constructor.py', 1187 'torch/_export/db/examples/dynamic_shape_if_guard.py', 1188 'torch/_export/db/examples/dynamic_shape_map.py', 1189 'torch/_export/db/examples/dynamic_shape_round.py', 1190 'torch/_export/db/examples/dynamic_shape_slicing.py', 1191 'torch/_export/db/examples/dynamic_shape_view.py', 1192 'torch/_export/db/examples/fn_with_kwargs.py', 1193 'torch/_export/db/examples/list_contains.py', 1194 'torch/_export/db/examples/list_unpack.py', 1195 'torch/_export/db/examples/nested_function.py', 1196 'torch/_export/db/examples/null_context_manager.py', 1197 'torch/_export/db/examples/pytree_flatten.py', 1198 'torch/_export/db/examples/scalar_output.py', 1199 'torch/_export/db/examples/specialized_attribute.py', 1200 'torch/_export/db/examples/static_for_loop.py', 1201 'torch/_export/db/examples/static_if.py', 1202 'torch/_export/db/examples/tensor_setattr.py', 1203 'torch/_export/db/examples/type_reflection_method.py', 1204 'torch/_export/db/gen_example.py', 1205 'torch/_export/db/logging.py', 1206 'torch/_export/error.py', 1207 'torch/_export/exported_program.py', 1208 'torch/_export/pass_base.py', 1209 'torch/_export/pass_infra/__init__.py', 1210 'torch/_export/pass_infra/node_metadata.py', 1211 'torch/_export/pass_infra/proxy_value.py', 1212 'torch/_export/passes/__init__.py', 1213 'torch/_export/passes/add_runtime_assertions_for_constraints_pass.py', 1214 'torch/_export/passes/const_prop_pass.py', 1215 'torch/_export/passes/functionalize_side_effectful_ops_pass.py', 1216 'torch/_export/passes/replace_sym_size_ops_pass.py', 1217 'torch/_export/passes/replace_view_ops_with_view_copy_ops_pass.py', 1218 'torch/_export/serde/__init__.py', 1219 'torch/_export/serde/schema.py', 1220 'torch/_export/serde/serialize.py', 1221 'torch/_export/serde/upgrade.py', 1222 'torch/_export/trace.py', 1223 'torch/_export/verifier.py', 1224 'torch/_vendor/**', 1225 'torch/contrib/__init__.py', 1226 'torch/contrib/_tensorboard_vis.py', 1227 "torch/cuda/_gpu_trace.py", 1228 'torch/cuda/_memory_viz.py', # mypy: Value of type "object" is not indexable 1229 'torch/fft/__init__.py', 1230 'torch/func/__init__.py', 1231 'torch/futures/__init__.py', 1232 'torch/fx/__init__.py', 1233 'torch/fx/_compatibility.py', 1234 'torch/fx/_symbolic_trace.py', 1235 'torch/fx/annotate.py', 1236 'torch/fx/config.py', 1237 'torch/fx/experimental/__init__.py', 1238 'torch/fx/experimental/accelerator_partitioner.py', 1239 'torch/fx/experimental/const_fold.py', 1240 'torch/fx/experimental/debug.py', 1241 'torch/fx/experimental/graph_gradual_typechecker.py', 1242 'torch/fx/experimental/merge_matmul.py', 1243 'torch/fx/experimental/meta_tracer.py', 1244 'torch/fx/experimental/migrate_gradual_types/__init__.py', 1245 'torch/fx/experimental/migrate_gradual_types/constraint.py', 1246 'torch/fx/experimental/migrate_gradual_types/constraint_generator.py', 1247 'torch/fx/experimental/migrate_gradual_types/constraint_transformation.py', 1248 'torch/fx/experimental/migrate_gradual_types/operation.py', 1249 'torch/fx/experimental/migrate_gradual_types/transform_to_z3.py', 1250 'torch/fx/experimental/migrate_gradual_types/util.py', 1251 'torch/fx/experimental/migrate_gradual_types/z3_types.py', 1252 'torch/fx/experimental/normalize.py', 1253 'torch/fx/experimental/optimization.py', 1254 'torch/fx/experimental/partitioner_utils.py', 1255 'torch/fx/experimental/refinement_types.py', 1256 'torch/fx/experimental/rewriter.py', 1257 'torch/fx/experimental/schema_type_annotation.py', 1258 'torch/fx/experimental/symbolic_shapes.py', 1259 'torch/fx/experimental/unification/__init__.py', 1260 'torch/fx/experimental/unification/core.py', 1261 'torch/fx/experimental/unification/dispatch.py', 1262 'torch/fx/experimental/unification/match.py', 1263 'torch/fx/experimental/unification/more.py', 1264 'torch/fx/experimental/unification/multipledispatch/__init__.py', 1265 'torch/fx/experimental/unification/multipledispatch/conflict.py', 1266 'torch/fx/experimental/unification/multipledispatch/core.py', 1267 'torch/fx/experimental/unification/multipledispatch/dispatcher.py', 1268 'torch/fx/experimental/unification/multipledispatch/utils.py', 1269 'torch/fx/experimental/unification/multipledispatch/variadic.py', 1270 'torch/fx/experimental/unification/unification_tools.py', 1271 'torch/fx/experimental/unification/utils.py', 1272 'torch/fx/experimental/unification/variable.py', 1273 'torch/fx/experimental/unify_refinements.py', 1274 'torch/fx/experimental/validator.py', 1275 'torch/fx/graph.py', 1276 'torch/fx/graph_module.py', 1277 'torch/fx/interpreter.py', 1278 'torch/fx/node.py', 1279 'torch/fx/operator_schemas.py', 1280 'torch/fx/passes/__init__.py', 1281 'torch/fx/passes/annotate_getitem_nodes.py', 1282 'torch/fx/passes/backends/__init__.py', 1283 'torch/fx/passes/backends/cudagraphs.py', 1284 'torch/fx/passes/dialect/__init__.py', 1285 'torch/fx/passes/dialect/common/__init__.py', 1286 'torch/fx/passes/dialect/common/cse_pass.py', 1287 'torch/fx/passes/fake_tensor_prop.py', 1288 'torch/fx/passes/graph_drawer.py', 1289 'torch/fx/passes/graph_manipulation.py', 1290 'torch/fx/passes/infra/__init__.py', 1291 'torch/fx/passes/infra/partitioner.py', 1292 'torch/fx/passes/infra/pass_base.py', 1293 'torch/fx/passes/infra/pass_manager.py', 1294 'torch/fx/passes/net_min_base.py', 1295 'torch/fx/passes/operator_support.py', 1296 'torch/fx/passes/param_fetch.py', 1297 'torch/fx/passes/pass_manager.py', 1298 'torch/fx/passes/reinplace.py', 1299 'torch/fx/passes/shape_prop.py', 1300 'torch/fx/passes/split_module.py', 1301 'torch/fx/passes/split_utils.py', 1302 'torch/fx/passes/splitter_base.py', 1303 'torch/fx/passes/tests/__init__.py', 1304 'torch/fx/passes/tests/test_pass_manager.py', 1305 'torch/fx/passes/tools_common.py', 1306 'torch/fx/passes/utils/__init__.py', 1307 'torch/fx/passes/utils/common.py', 1308 'torch/fx/passes/utils/fuser_utils.py', 1309 'torch/fx/passes/utils/matcher_utils.py', 1310 'torch/fx/passes/utils/source_matcher_utils.py', 1311 'torch/fx/proxy.py', 1312 'torch/fx/subgraph_rewriter.py', 1313 'torch/fx/tensor_type.py', 1314 'torch/fx/traceback.py', 1315 'torch/linalg/__init__.py', 1316 'torch/monitor/__init__.py', 1317 'torch/nested/__init__.py', 1318 'torch/signal/__init__.py', 1319 'torch/signal/windows/__init__.py', 1320 'torch/signal/windows/windows.py', 1321 'torch/special/__init__.py', 1322 'torch/testing/_internal/__init__.py', 1323 'torch/testing/_internal/autocast_test_lists.py', 1324 'torch/testing/_internal/autograd_function_db.py', 1325 'torch/testing/_internal/check_kernel_launches.py', 1326 'torch/testing/_internal/codegen/__init__.py', 1327 'torch/testing/_internal/codegen/random_topo_test.py', 1328 'torch/testing/_internal/common_cuda.py', 1329 'torch/testing/_internal/common_distributed.py', 1330 'torch/testing/_internal/common_jit.py', 1331 'torch/testing/_internal/common_methods_invocations.py', 1332 'torch/testing/_internal/common_modules.py', 1333 'torch/testing/_internal/common_nn.py', 1334 'torch/testing/_internal/common_pruning.py', 1335 'torch/testing/_internal/common_quantization.py', 1336 'torch/testing/_internal/common_quantized.py', 1337 'torch/testing/_internal/common_subclass.py', 1338 'torch/testing/_internal/common_utils.py', 1339 'torch/testing/_internal/composite_compliance.py', 1340 'torch/testing/_internal/hop_db.py', 1341 'torch/testing/_internal/custom_op_db.py', 1342 'torch/testing/_internal/data/__init__.py', 1343 'torch/testing/_internal/data/network1.py', 1344 'torch/testing/_internal/data/network2.py', 1345 'torch/testing/_internal/dist_utils.py', 1346 'torch/testing/_internal/distributed/__init__.py', 1347 'torch/testing/_internal/distributed/_shard/__init__.py', 1348 'torch/testing/_internal/distributed/_shard/sharded_tensor/__init__.py', 1349 'torch/testing/_internal/distributed/_shard/sharded_tensor/_test_ops_common.py', 1350 'torch/testing/_internal/distributed/_shard/sharded_tensor/_test_st_common.py', 1351 'torch/testing/_internal/distributed/_shard/test_common.py', 1352 'torch/testing/_internal/distributed/_tensor/__init__.py', 1353 'torch/testing/_internal/distributed/_tensor/common_dtensor.py', 1354 'torch/testing/_internal/distributed/ddp_under_dist_autograd_test.py', 1355 'torch/testing/_internal/distributed/distributed_test.py', 1356 'torch/testing/_internal/distributed/distributed_utils.py', 1357 'torch/testing/_internal/distributed/fake_pg.py', 1358 'torch/testing/_internal/distributed/multi_threaded_pg.py', 1359 'torch/testing/_internal/distributed/nn/__init__.py', 1360 'torch/testing/_internal/distributed/nn/api/__init__.py', 1361 'torch/testing/_internal/distributed/nn/api/remote_module_test.py', 1362 'torch/testing/_internal/distributed/rpc/__init__.py', 1363 'torch/testing/_internal/distributed/rpc/dist_autograd_test.py', 1364 'torch/testing/_internal/distributed/rpc/dist_optimizer_test.py', 1365 'torch/testing/_internal/distributed/rpc/examples/__init__.py', 1366 'torch/testing/_internal/distributed/rpc/examples/parameter_server_test.py', 1367 'torch/testing/_internal/distributed/rpc/examples/reinforcement_learning_rpc_test.py', 1368 'torch/testing/_internal/distributed/rpc/faulty_agent_rpc_test.py', 1369 'torch/testing/_internal/distributed/rpc/faulty_rpc_agent_test_fixture.py', 1370 'torch/testing/_internal/distributed/rpc/jit/__init__.py', 1371 'torch/testing/_internal/distributed/rpc/jit/dist_autograd_test.py', 1372 'torch/testing/_internal/distributed/rpc/jit/rpc_test.py', 1373 'torch/testing/_internal/distributed/rpc/jit/rpc_test_faulty.py', 1374 'torch/testing/_internal/distributed/rpc/rpc_agent_test_fixture.py', 1375 'torch/testing/_internal/distributed/rpc/rpc_test.py', 1376 'torch/testing/_internal/distributed/rpc/tensorpipe_rpc_agent_test_fixture.py', 1377 'torch/testing/_internal/distributed/rpc_utils.py', 1378 'torch/testing/_internal/generated/__init__.py', 1379 'torch/testing/_internal/hypothesis_utils.py', 1380 'torch/testing/_internal/inductor_utils.py', 1381 'torch/testing/_internal/jit_metaprogramming_utils.py', 1382 'torch/testing/_internal/jit_utils.py', 1383 'torch/testing/_internal/logging_tensor.py', 1384 'torch/testing/_internal/logging_utils.py', 1385 'torch/testing/_internal/optests/__init__.py', 1386 'torch/testing/_internal/optests/aot_autograd.py', 1387 'torch/testing/_internal/optests/compile_check.py', 1388 'torch/testing/_internal/optests/fake_tensor.py', 1389 'torch/testing/_internal/optests/make_fx.py', 1390 'torch/testing/_internal/quantization_torch_package_models.py', 1391 'torch/testing/_internal/test_module/__init__.py', 1392 'torch/testing/_internal/test_module/future_div.py', 1393 'torch/testing/_internal/test_module/no_future_div.py', 1394 'torch/utils/_contextlib.py', 1395 'torch/utils/_cpp_extension_versioner.py', 1396 'torch/utils/_crash_handler.py', 1397 'torch/utils/_device.py', 1398 'torch/utils/_foreach_utils.py', 1399 'torch/utils/_freeze.py', 1400 'torch/utils/_mode_utils.py', 1401 'torch/utils/_python_dispatch.py', 1402 'torch/utils/_stats.py', 1403 'torch/utils/_traceback.py', 1404 'torch/utils/_zip.py', 1405 'torch/utils/backcompat/__init__.py', 1406 'torch/utils/backend_registration.py', 1407 'torch/utils/benchmark/__init__.py', 1408 'torch/utils/benchmark/examples/__init__.py', 1409 'torch/utils/benchmark/examples/blas_compare.py', 1410 'torch/utils/benchmark/examples/blas_compare_setup.py', 1411 'torch/utils/benchmark/examples/compare.py', 1412 'torch/utils/benchmark/examples/end_to_end.py', 1413 'torch/utils/benchmark/examples/fuzzer.py', 1414 'torch/utils/benchmark/examples/op_benchmark.py', 1415 'torch/utils/benchmark/examples/simple_timeit.py', 1416 'torch/utils/benchmark/examples/sparse/compare.py', 1417 'torch/utils/benchmark/examples/sparse/fuzzer.py', 1418 'torch/utils/benchmark/examples/sparse/op_benchmark.py', 1419 'torch/utils/benchmark/examples/spectral_ops_fuzz_test.py', 1420 'torch/utils/benchmark/op_fuzzers/__init__.py', 1421 'torch/utils/benchmark/op_fuzzers/binary.py', 1422 'torch/utils/benchmark/op_fuzzers/sparse_binary.py', 1423 'torch/utils/benchmark/op_fuzzers/sparse_unary.py', 1424 'torch/utils/benchmark/op_fuzzers/spectral.py', 1425 'torch/utils/benchmark/op_fuzzers/unary.py', 1426 'torch/utils/benchmark/utils/__init__.py', 1427 'torch/utils/benchmark/utils/_stubs.py', 1428 'torch/utils/benchmark/utils/common.py', 1429 'torch/utils/benchmark/utils/compare.py', 1430 'torch/utils/benchmark/utils/compile.py', 1431 'torch/utils/benchmark/utils/cpp_jit.py', 1432 'torch/utils/benchmark/utils/fuzzer.py', 1433 'torch/utils/benchmark/utils/sparse_fuzzer.py', 1434 'torch/utils/benchmark/utils/timer.py', 1435 'torch/utils/benchmark/utils/valgrind_wrapper/__init__.py', 1436 'torch/utils/benchmark/utils/valgrind_wrapper/timer_interface.py', 1437 'torch/utils/bottleneck/__init__.py', 1438 'torch/utils/bottleneck/__main__.py', 1439 'torch/utils/bundled_inputs.py', 1440 'torch/utils/checkpoint.py', 1441 'torch/utils/collect_env.py', 1442 'torch/utils/cpp_backtrace.py', 1443 'torch/utils/cpp_extension.py', 1444 'torch/utils/dlpack.py', 1445 'torch/utils/file_baton.py', 1446 'torch/utils/flop_counter.py', 1447 'torch/utils/hipify/__init__.py', 1448 'torch/utils/hipify/constants.py', 1449 'torch/utils/hipify/cuda_to_hip_mappings.py', 1450 'torch/utils/hipify/hipify_python.py', 1451 'torch/utils/hipify/version.py', 1452 'torch/utils/hooks.py', 1453 'torch/utils/jit/__init__.py', 1454 'torch/utils/jit/log_extract.py', 1455 'torch/utils/mkldnn.py', 1456 'torch/utils/mobile_optimizer.py', 1457 'torch/utils/model_dump/__init__.py', 1458 'torch/utils/model_dump/__main__.py', 1459 'torch/utils/model_zoo.py', 1460 'torch/utils/show_pickle.py', 1461 'torch/utils/tensorboard/__init__.py', 1462 'torch/utils/tensorboard/_caffe2_graph.py', 1463 'torch/utils/tensorboard/_convert_np.py', 1464 'torch/utils/tensorboard/_embedding.py', 1465 'torch/utils/tensorboard/_onnx_graph.py', 1466 'torch/utils/tensorboard/_proto_graph.py', 1467 'torch/utils/tensorboard/_pytorch_graph.py', 1468 'torch/utils/tensorboard/_utils.py', 1469 'torch/utils/tensorboard/summary.py', 1470 'torch/utils/tensorboard/writer.py', 1471 'torch/utils/throughput_benchmark.py', 1472 'torch/utils/viz/__init__.py', 1473 'torch/utils/viz/_cycles.py', 1474 'torch/utils/weak.py', 1475 'torch/xpu/_gpu_trace.py', 1476] 1477init_command = [ 1478 'python3', 1479 'tools/linter/adapters/pip_init.py', 1480 '--dry-run={{DRYRUN}}', 1481 '--no-black-binary', 1482 'black==23.12.1', 1483 'usort==1.0.8.post1', 1484 'isort==5.13.2', 1485 'ruff==0.6.3', # sync with RUFF 1486] 1487is_formatter = true 1488 1489[[linter]] 1490code = 'COPYRIGHT' 1491include_patterns = ['**'] 1492exclude_patterns = [ 1493 '.lintrunner.toml', 1494 'fb/**', 1495 '**/fb/**', 1496] 1497command = [ 1498 'python3', 1499 'tools/linter/adapters/grep_linter.py', 1500 '--pattern=Confidential and proprietary', 1501 '--linter-name=COPYRIGHT', 1502 '--error-name=Confidential Code', 1503 """--error-description=\ 1504 Proprietary and confidential source code\ 1505 should not be contributed to PyTorch codebase\ 1506 """, 1507 '--', 1508 '@{{PATHSFILE}}' 1509] 1510 1511[[linter]] 1512code = 'BAZEL_LINTER' 1513include_patterns = ['WORKSPACE'] 1514command = [ 1515 'python3', 1516 'tools/linter/adapters/bazel_linter.py', 1517 '--binary=.lintbin/bazel', 1518 '--', 1519 '@{{PATHSFILE}}' 1520] 1521init_command = [ 1522 'python3', 1523 'tools/linter/adapters/s3_init.py', 1524 '--config-json=tools/linter/adapters/s3_init_config.json', 1525 '--linter=bazel', 1526 '--dry-run={{DRYRUN}}', 1527 '--output-dir=.lintbin', 1528 '--output-name=bazel', 1529] 1530is_formatter = true 1531 1532[[linter]] 1533code = 'LINTRUNNER_VERSION' 1534include_patterns = ['**'] 1535exclude_patterns = [ 1536 'fb/**', 1537 '**/fb/**', 1538] 1539command = [ 1540 'python3', 1541 'tools/linter/adapters/lintrunner_version_linter.py' 1542] 1543 1544[[linter]] 1545code = 'RUFF' 1546include_patterns = ['**/*.py', '**/*.pyi'] 1547exclude_patterns = [ 1548 'caffe2/**', 1549 'functorch/docs/**', 1550 'functorch/notebooks/**', 1551 'torch/_inductor/fx_passes/serialized_patterns/**', 1552 'torch/_inductor/autoheuristic/artifacts/**', 1553 'scripts/**', 1554 'third_party/**', 1555 'fb/**', 1556 '**/fb/**', 1557] 1558command = [ 1559 'python3', 1560 'tools/linter/adapters/ruff_linter.py', 1561 '--config=pyproject.toml', 1562 '--show-disable', 1563 '--', 1564 '@{{PATHSFILE}}' 1565] 1566init_command = [ 1567 'python3', 1568 'tools/linter/adapters/pip_init.py', 1569 '--dry-run={{DRYRUN}}', 1570 'ruff==0.6.3', # sync with PYFMT 1571] 1572is_formatter = true 1573 1574# This linter prevents merge conlicts in csv files in pytorch by enforcing 1575# three lines of whitespace between entries such that unless people are modifying 1576# the same line, merge conflicts should not arise in git or hg 1577[[linter]] 1578code = 'MERGE_CONFLICTLESS_CSV' 1579include_patterns = ['benchmarks/dynamo/ci_expected_accuracy/*.csv'] 1580command = [ 1581 'python3', 1582 'tools/linter/adapters/no_merge_conflict_csv_linter.py', 1583 '--', 1584 '@{{PATHSFILE}}' 1585] 1586is_formatter = true 1587 1588[[linter]] 1589code = 'ATEN_CPU_GPU_AGNOSTIC' 1590include_patterns = [ 1591 # aten source 1592 "aten/src/ATen/*.cpp", 1593 "aten/src/ATen/cpu/*.cpp", 1594 "aten/src/ATen/functorch/**/*.cpp", 1595 "aten/src/ATen/nnapi/*.cpp", 1596 "aten/src/ATen/quantized/*.cpp", 1597 "aten/src/ATen/vulkan/*.cpp", 1598 "aten/src/ATen/metal/*.cpp", 1599 "aten/src/ATen/detail/CPUGuardImpl.cpp", 1600 "aten/src/ATen/detail/MetaGuardImpl.cpp", 1601 # aten native source 1602 "aten/src/ATen/native/cpu/*.cpp", 1603 "aten/src/ATen/native/ao_sparse/cpu/kernels/*.cpp", 1604 "aten/src/ATen/native/ao_sparse/quantized/cpu/kernels/*.cpp", 1605 "aten/src/ATen/native/quantized/cpu/kernels/*.cpp", 1606 "aten/src/ATen/native/*.cpp", 1607 "aten/src/ATen/native/cpu/**/*.cpp", 1608 "aten/src/ATen/native/ao_sparse/*.cpp", 1609 "aten/src/ATen/native/ao_sparse/**/*.cpp", 1610 "aten/src/ATen/native/ao_sparse/quantized/*.cpp", 1611 "aten/src/ATen/native/ao_sparse/quantized/**/*.cpp", 1612 "aten/src/ATen/native/nested/*.cpp", 1613 "aten/src/ATen/native/quantized/*.cpp", 1614 "aten/src/ATen/native/quantized/**/*.cpp", 1615 "aten/src/ATen/native/sparse/*.cpp", 1616 "aten/src/ATen/native/transformers/*.cpp", 1617 "aten/src/ATen/native/utils/*.cpp", 1618 "aten/src/ATen/native/xnnpack/*.cpp", 1619 "aten/src/ATen/native/metal/MetalPrepackOpRegister.cpp", 1620 # aten headers 1621 "aten/src/ATen/*.h", 1622 "aten/src/ATen/functorch/**/*.h", 1623 "aten/src/ATen/ops/*.h", 1624 "aten/src/ATen/cpu/**/*.h", 1625 "aten/src/ATen/nnapi/*.h", 1626 "aten/src/ATen/quantized/*.h", 1627 "aten/src/ATen/vulkan/*.h", 1628 "aten/src/ATen/metal/*.h", 1629 "aten/src/ATen/mps/*.h", 1630 # aten native headers 1631 "aten/src/ATen/native/*.h", 1632 "aten/src/ATen/native/cpu/**/*.h", 1633 "aten/src/ATen/native/nested/*.h", 1634 "aten/src/ATen/native/sparse/*.h", 1635 "aten/src/ATen/native/ao_sparse/*.h", 1636 "aten/src/ATen/native/ao_sparse/cpu/*.h", 1637 "aten/src/ATen/native/ao_sparse/quantized/*.h", 1638 "aten/src/ATen/native/ao_sparse/quantized/cpu/*.h", 1639 "aten/src/ATen/native/quantized/*.h", 1640 "aten/src/ATen/native/quantized/cpu/*.h", 1641 "aten/src/ATen/native/transformers/*.h", 1642 "aten/src/ATen/native/quantized/cpu/qnnpack/include/*.h", 1643 "aten/src/ATen/native/utils/*.h", 1644 "aten/src/ATen/native/vulkan/ops/*.h", 1645 "aten/src/ATen/native/xnnpack/*.h", 1646 "aten/src/ATen/native/metal/MetalPrepackOpContext.h", 1647 "aten/src/ATen/native/mps/Copy.h", 1648 "aten/src/ATen/native/mkldnn/**/*.h", 1649] 1650exclude_patterns = [ 1651 "aten/src/ATen/Context.h", 1652 "aten/src/ATen/Context.cpp", 1653 "aten/src/ATen/DLConvertor.cpp", 1654 "aten/src/ATen/core/Array.h", 1655 "aten/src/ATen/native/quantized/ConvUtils.h", 1656 "aten/src/ATen/native/sparse/SparseBlasImpl.cpp", # triton implementation 1657 "aten/src/ATen/native/transformers/attention.cpp", 1658 "aten/src/ATen/native/**/cudnn/**", # cudnn is cuda specific 1659] 1660command = [ 1661 'python3', 1662 'tools/linter/adapters/grep_linter.py', 1663 '--pattern=(^#if.*USE_ROCM.*)|(^#if.*USE_CUDA.*)', 1664 '--linter-name=ATEN_CPU', 1665 '--error-name=aten-cpu should be gpu agnostic', 1666 """--error-description=\ 1667 We strongly discourage the compile-time divergence \ 1668 on ATen-CPU code for different GPU code. This \ 1669 disallows sharing the same aten-cpu shared object \ 1670 between different GPU backends \ 1671 """, 1672 '--', 1673 '@{{PATHSFILE}}' 1674] 1675is_formatter = true 1676