Skip to content

Commit 331fa9c

Browse files
authored
Merge branch 'pytorch:main' into main
2 parents 4d41785 + cc0f9d0 commit 331fa9c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+2670
-1991
lines changed

.clang-format

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,6 @@ MacroBlockBegin: ''
6060
MacroBlockEnd: ''
6161
MaxEmptyLinesToKeep: 1
6262
NamespaceIndentation: None
63-
ObjCBlockIndentWidth: 2
64-
ObjCSpaceAfterProperty: false
65-
ObjCSpaceBeforeProtocolList: false
6663
PenaltyBreakBeforeFirstCallParameter: 1
6764
PenaltyBreakComment: 300
6865
PenaltyBreakFirstLessLess: 120
@@ -85,4 +82,11 @@ SpacesInSquareBrackets: false
8582
Standard: Cpp11
8683
TabWidth: 8
8784
UseTab: Never
85+
---
86+
Language: ObjC
87+
ColumnLimit: 120
88+
AlignAfterOpenBracket: Align
89+
ObjCBlockIndentWidth: 2
90+
ObjCSpaceAfterProperty: false
91+
ObjCSpaceBeforeProtocolList: false
8892
...

.git-blame-ignore-revs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,5 @@
77
d367a01a18a3ae6bee13d8be3b63fd6a581ea46f
88
# Upgrade usort to 1.0.2 and black to 22.3.0 (#5106)
99
6ca9c76adb6daf2695d603ad623a9cf1c4f4806f
10+
# Fix unnecessary exploded black formatting (#7709)
11+
a335d916db0694770e8152f41e19195de3134523

.github/scripts/setup-env.sh

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,11 @@ echo '::endgroup::'
5454

5555
if [[ "${OS_TYPE}" == windows && "${GPU_ARCH_TYPE}" == cuda ]]; then
5656
echo '::group::Install VisualStudio CUDA extensions on Windows'
57-
TARGET_DIR="/c/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/MSBuild/Microsoft/VC/v160/BuildCustomizations"
57+
if [[ "${VC_YEAR:-}" == "2022" ]]; then
58+
TARGET_DIR="/c/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/MSBuild/Microsoft/VC/v170/BuildCustomizations"
59+
else
60+
TARGET_DIR="/c/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/MSBuild/Microsoft/VC/v160/BuildCustomizations"
61+
fi
5862
mkdir -p "${TARGET_DIR}"
5963
cp -r "${CUDA_HOME}/MSBuildExtensions/"* "${TARGET_DIR}"
6064
echo '::endgroup::'

.github/workflows/build-cmake.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,9 @@ jobs:
7474
script: |
7575
set -euo pipefail
7676
77-
source packaging/windows/internal/vc_install_helper.sh
78-
7977
export PYTHON_VERSION=3.8
78+
export VC_YEAR=2022
79+
export VSDEVCMD_ARGS=""
8080
export GPU_ARCH_TYPE=${{ matrix.gpu-arch-type }}
8181
export GPU_ARCH_VERSION=${{ matrix.gpu-arch-version }}
8282

.github/workflows/tests.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ jobs:
9898
set -euxo pipefail
9999
100100
export PYTHON_VERSION=${{ matrix.python-version }}
101+
export VC_YEAR=2019
102+
export VSDEVCMD_ARGS=""
101103
export GPU_ARCH_TYPE=${{ matrix.gpu-arch-type }}
102104
export GPU_ARCH_VERSION=${{ matrix.gpu-arch-version }}
103105

.pre-commit-config.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ repos:
66
- id: check-toml
77
- id: check-yaml
88
exclude: packaging/.*
9+
args:
10+
- --allow-multiple-documents
911
- id: mixed-line-ending
1012
args: [--fix=lf]
1113
- id: end-of-file-fixer

docs/source/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@
140140
"logo_only": True,
141141
"pytorch_project": "docs",
142142
"navigation_with_keys": True,
143-
"analytics_id": "UA-117752657-2",
143+
"analytics_id": "GTM-T8XT4PS",
144144
}
145145

146146
html_logo = "_static/img/pytorch-logo-dark.svg"

packaging/wheel/relocate.py

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import glob
44
import hashlib
5-
import io
65

76
# Standard library imports
87
import os
@@ -65,21 +64,12 @@
6564
PYTHON_VERSION = sys.version_info
6665

6766

68-
def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE):
69-
"""Yield pieces of data from a file-like object until EOF."""
70-
while True:
71-
chunk = file.read(size)
72-
if not chunk:
73-
break
74-
yield chunk
75-
76-
7767
def rehash(path, blocksize=1 << 20):
7868
"""Return (hash, length) for path using hashlib.sha256()"""
7969
h = hashlib.sha256()
8070
length = 0
8171
with open(path, "rb") as f:
82-
for block in read_chunks(f, size=blocksize):
72+
while block := f.read(blocksize):
8373
length += len(block)
8474
h.update(block)
8575
digest = "sha256=" + urlsafe_b64encode(h.digest()).decode("latin1").rstrip("=")

packaging/windows/internal/vc_env_helper.bat

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
@echo on
22

3-
set VC_VERSION_LOWER=16
4-
set VC_VERSION_UPPER=17
3+
set VC_VERSION_LOWER=17
4+
set VC_VERSION_UPPER=18
5+
if "%VC_YEAR%" == "2019" (
6+
set VC_VERSION_LOWER=16
7+
set VC_VERSION_UPPER=17
8+
)
59
if "%VC_YEAR%" == "2017" (
610
set VC_VERSION_LOWER=15
711
set VC_VERSION_UPPER=16

packaging/windows/internal/vc_install_helper.sh

Lines changed: 0 additions & 6 deletions
This file was deleted.

references/classification/presets.py

Lines changed: 45 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,23 @@
11
import torch
2-
from torchvision.transforms import autoaugment, transforms
32
from torchvision.transforms.functional import InterpolationMode
43

54

5+
def get_module(use_v2):
6+
# We need a protected import to avoid the V2 warning in case just V1 is used
7+
if use_v2:
8+
import torchvision.transforms.v2
9+
10+
return torchvision.transforms.v2
11+
else:
12+
import torchvision.transforms
13+
14+
return torchvision.transforms
15+
16+
617
class ClassificationPresetTrain:
18+
# Note: this transform assumes that the input to forward() are always PIL
19+
# images, regardless of the backend parameter. We may change that in the
20+
# future though, if we change the output type from the dataset.
721
def __init__(
822
self,
923
*,
@@ -17,41 +31,44 @@ def __init__(
1731
augmix_severity=3,
1832
random_erase_prob=0.0,
1933
backend="pil",
34+
use_v2=False,
2035
):
21-
trans = []
36+
T = get_module(use_v2)
37+
38+
transforms = []
2239
backend = backend.lower()
2340
if backend == "tensor":
24-
trans.append(transforms.PILToTensor())
41+
transforms.append(T.PILToTensor())
2542
elif backend != "pil":
2643
raise ValueError(f"backend can be 'tensor' or 'pil', but got {backend}")
2744

28-
trans.append(transforms.RandomResizedCrop(crop_size, interpolation=interpolation, antialias=True))
45+
transforms.append(T.RandomResizedCrop(crop_size, interpolation=interpolation, antialias=True))
2946
if hflip_prob > 0:
30-
trans.append(transforms.RandomHorizontalFlip(hflip_prob))
47+
transforms.append(T.RandomHorizontalFlip(hflip_prob))
3148
if auto_augment_policy is not None:
3249
if auto_augment_policy == "ra":
33-
trans.append(autoaugment.RandAugment(interpolation=interpolation, magnitude=ra_magnitude))
50+
transforms.append(T.RandAugment(interpolation=interpolation, magnitude=ra_magnitude))
3451
elif auto_augment_policy == "ta_wide":
35-
trans.append(autoaugment.TrivialAugmentWide(interpolation=interpolation))
52+
transforms.append(T.TrivialAugmentWide(interpolation=interpolation))
3653
elif auto_augment_policy == "augmix":
37-
trans.append(autoaugment.AugMix(interpolation=interpolation, severity=augmix_severity))
54+
transforms.append(T.AugMix(interpolation=interpolation, severity=augmix_severity))
3855
else:
39-
aa_policy = autoaugment.AutoAugmentPolicy(auto_augment_policy)
40-
trans.append(autoaugment.AutoAugment(policy=aa_policy, interpolation=interpolation))
56+
aa_policy = T.AutoAugmentPolicy(auto_augment_policy)
57+
transforms.append(T.AutoAugment(policy=aa_policy, interpolation=interpolation))
4158

4259
if backend == "pil":
43-
trans.append(transforms.PILToTensor())
60+
transforms.append(T.PILToTensor())
4461

45-
trans.extend(
62+
transforms.extend(
4663
[
47-
transforms.ConvertImageDtype(torch.float),
48-
transforms.Normalize(mean=mean, std=std),
64+
T.ConvertImageDtype(torch.float),
65+
T.Normalize(mean=mean, std=std),
4966
]
5067
)
5168
if random_erase_prob > 0:
52-
trans.append(transforms.RandomErasing(p=random_erase_prob))
69+
transforms.append(T.RandomErasing(p=random_erase_prob))
5370

54-
self.transforms = transforms.Compose(trans)
71+
self.transforms = T.Compose(transforms)
5572

5673
def __call__(self, img):
5774
return self.transforms(img)
@@ -67,28 +84,30 @@ def __init__(
6784
std=(0.229, 0.224, 0.225),
6885
interpolation=InterpolationMode.BILINEAR,
6986
backend="pil",
87+
use_v2=False,
7088
):
71-
trans = []
89+
T = get_module(use_v2)
90+
transforms = []
7291
backend = backend.lower()
7392
if backend == "tensor":
74-
trans.append(transforms.PILToTensor())
93+
transforms.append(T.PILToTensor())
7594
elif backend != "pil":
7695
raise ValueError(f"backend can be 'tensor' or 'pil', but got {backend}")
7796

78-
trans += [
79-
transforms.Resize(resize_size, interpolation=interpolation, antialias=True),
80-
transforms.CenterCrop(crop_size),
97+
transforms += [
98+
T.Resize(resize_size, interpolation=interpolation, antialias=True),
99+
T.CenterCrop(crop_size),
81100
]
82101

83102
if backend == "pil":
84-
trans.append(transforms.PILToTensor())
103+
transforms.append(T.PILToTensor())
85104

86-
trans += [
87-
transforms.ConvertImageDtype(torch.float),
88-
transforms.Normalize(mean=mean, std=std),
105+
transforms += [
106+
T.ConvertImageDtype(torch.float),
107+
T.Normalize(mean=mean, std=std),
89108
]
90109

91-
self.transforms = transforms.Compose(trans)
110+
self.transforms = T.Compose(transforms)
92111

93112
def __call__(self, img):
94113
return self.transforms(img)

references/classification/train.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ def load_data(traindir, valdir, args):
145145
ra_magnitude=ra_magnitude,
146146
augmix_severity=augmix_severity,
147147
backend=args.backend,
148+
use_v2=args.use_v2,
148149
),
149150
)
150151
if args.cache_dataset:
@@ -172,6 +173,7 @@ def load_data(traindir, valdir, args):
172173
resize_size=val_resize_size,
173174
interpolation=interpolation,
174175
backend=args.backend,
176+
use_v2=args.use_v2,
175177
)
176178

177179
dataset_test = torchvision.datasets.ImageFolder(
@@ -516,6 +518,7 @@ def get_args_parser(add_help=True):
516518
)
517519
parser.add_argument("--weights", default=None, type=str, help="the weights enum name to load")
518520
parser.add_argument("--backend", default="PIL", type=str.lower, help="PIL or tensor - case insensitive")
521+
parser.add_argument("--use-v2", action="store_true", help="Use V2 transforms")
519522
return parser
520523

521524

references/detection/coco_utils.py

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import transforms as T
88
from pycocotools import mask as coco_mask
99
from pycocotools.coco import COCO
10+
from torchvision.datasets import wrap_dataset_for_transforms_v2
1011

1112

1213
class FilterAndRemapCocoCategories:
@@ -49,7 +50,6 @@ def __call__(self, image, target):
4950
w, h = image.size
5051

5152
image_id = target["image_id"]
52-
image_id = torch.tensor([image_id])
5353

5454
anno = target["annotations"]
5555

@@ -126,10 +126,6 @@ def _has_valid_annotation(anno):
126126
return True
127127
return False
128128

129-
if not isinstance(dataset, torchvision.datasets.CocoDetection):
130-
raise TypeError(
131-
f"This function expects dataset of type torchvision.datasets.CocoDetection, instead got {type(dataset)}"
132-
)
133129
ids = []
134130
for ds_idx, img_id in enumerate(dataset.ids):
135131
ann_ids = dataset.coco.getAnnIds(imgIds=img_id, iscrowd=None)
@@ -196,12 +192,15 @@ def convert_to_coco_api(ds):
196192

197193

198194
def get_coco_api_from_dataset(dataset):
195+
# FIXME: This is... awful?
199196
for _ in range(10):
200197
if isinstance(dataset, torchvision.datasets.CocoDetection):
201198
break
202199
if isinstance(dataset, torch.utils.data.Subset):
203200
dataset = dataset.dataset
204-
if isinstance(dataset, torchvision.datasets.CocoDetection):
201+
if isinstance(dataset, torchvision.datasets.CocoDetection) or isinstance(
202+
getattr(dataset, "_dataset", None), torchvision.datasets.CocoDetection
203+
):
205204
return dataset.coco
206205
return convert_to_coco_api(dataset)
207206

@@ -220,25 +219,29 @@ def __getitem__(self, idx):
220219
return img, target
221220

222221

223-
def get_coco(root, image_set, transforms, mode="instances"):
222+
def get_coco(root, image_set, transforms, mode="instances", use_v2=False):
224223
anno_file_template = "{}_{}2017.json"
225224
PATHS = {
226225
"train": ("train2017", os.path.join("annotations", anno_file_template.format(mode, "train"))),
227226
"val": ("val2017", os.path.join("annotations", anno_file_template.format(mode, "val"))),
228227
# "train": ("val2017", os.path.join("annotations", anno_file_template.format(mode, "val")))
229228
}
230229

231-
t = [ConvertCocoPolysToMask()]
232-
233-
if transforms is not None:
234-
t.append(transforms)
235-
transforms = T.Compose(t)
236-
237230
img_folder, ann_file = PATHS[image_set]
238231
img_folder = os.path.join(root, img_folder)
239232
ann_file = os.path.join(root, ann_file)
240233

241-
dataset = CocoDetection(img_folder, ann_file, transforms=transforms)
234+
if use_v2:
235+
dataset = torchvision.datasets.CocoDetection(img_folder, ann_file, transforms=transforms)
236+
# TODO: need to update target_keys to handle masks for segmentation!
237+
dataset = wrap_dataset_for_transforms_v2(dataset, target_keys={"boxes", "labels", "image_id"})
238+
else:
239+
t = [ConvertCocoPolysToMask()]
240+
if transforms is not None:
241+
t.append(transforms)
242+
transforms = T.Compose(t)
243+
244+
dataset = CocoDetection(img_folder, ann_file, transforms=transforms)
242245

243246
if image_set == "train":
244247
dataset = _coco_remove_images_without_annotations(dataset)
@@ -248,5 +251,7 @@ def get_coco(root, image_set, transforms, mode="instances"):
248251
return dataset
249252

250253

251-
def get_coco_kp(root, image_set, transforms):
254+
def get_coco_kp(root, image_set, transforms, use_v2=False):
255+
if use_v2:
256+
raise ValueError("KeyPoints aren't supported by transforms V2 yet.")
252257
return get_coco(root, image_set, transforms, mode="person_keypoints")

references/detection/engine.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def train_one_epoch(model, optimizer, data_loader, device, epoch, print_freq, sc
2626

2727
for images, targets in metric_logger.log_every(data_loader, print_freq, header):
2828
images = list(image.to(device) for image in images)
29-
targets = [{k: v.to(device) for k, v in t.items()} for t in targets]
29+
targets = [{k: v.to(device) if isinstance(v, torch.Tensor) else v for k, v in t.items()} for t in targets]
3030
with torch.cuda.amp.autocast(enabled=scaler is not None):
3131
loss_dict = model(images, targets)
3232
losses = sum(loss for loss in loss_dict.values())
@@ -97,7 +97,7 @@ def evaluate(model, data_loader, device):
9797
outputs = [{k: v.to(cpu_device) for k, v in t.items()} for t in outputs]
9898
model_time = time.time() - model_time
9999

100-
res = {target["image_id"].item(): output for target, output in zip(targets, outputs)}
100+
res = {target["image_id"]: output for target, output in zip(targets, outputs)}
101101
evaluator_time = time.time()
102102
coco_evaluator.update(res)
103103
evaluator_time = time.time() - evaluator_time

0 commit comments

Comments
 (0)