Skip to content

Commit 9ce5d09

Browse files
authored
Merge branch 'main' into patch-1
2 parents d4011fc + 8aa3174 commit 9ce5d09

Some content is hidden

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

41 files changed

+711
-70
lines changed

.circleci/config.yml

Lines changed: 592 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.circleci/regenerate.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ def build_workflows(prefix="", filter_branch=None, upload=False, indentation=6,
3232
for os_type in ["linux", "macos", "win"]:
3333
python_versions = PYTHON_VERSIONS
3434
cu_versions_dict = {
35-
"linux": ["cpu", "cu102", "cu111", "cu113", "rocm4.2", "rocm4.3.1"],
36-
"win": ["cpu", "cu111", "cu113"],
35+
"linux": ["cpu", "cu102", "cu111", "cu113", "cu115", "rocm4.2", "rocm4.3.1"],
36+
"win": ["cpu", "cu111", "cu113", "cu115"],
3737
"macos": ["cpu"],
3838
}
3939
cu_versions = cu_versions_dict[os_type]
@@ -128,6 +128,7 @@ def upload_doc_job(filter_branch):
128128
"cu111": "pytorch/manylinux-cuda111",
129129
"cu112": "pytorch/manylinux-cuda112",
130130
"cu113": "pytorch/manylinux-cuda113",
131+
"cu115": "pytorch/manylinux-cuda115",
131132
}
132133

133134

packaging/build_conda.sh

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,11 @@ setup_conda_pytorch_constraint
1111
setup_conda_cudatoolkit_constraint
1212
setup_visual_studio_constraint
1313
setup_junit_results_folder
14-
# nvidia channel included for cudatoolkit >= 11
15-
conda build -c defaults -c nvidia $CONDA_CHANNEL_FLAGS --no-anaconda-upload --python "$PYTHON_VERSION" packaging/torchvision
14+
15+
# nvidia channel included for cudatoolkit >= 11 however for 11.5 we use conda-forge
16+
export CUDATOOLKIT_CHANNEL="nvidia"
17+
if [[ "$CU_VERSION" == cu115 ]]; then
18+
export CUDATOOLKIT_CHANNEL="conda-forge"
19+
fi
20+
21+
conda build -c defaults -c $CUDATOOLKIT_CHANNEL $CONDA_CHANNEL_FLAGS --no-anaconda-upload --python "$PYTHON_VERSION" packaging/torchvision

packaging/pkg_helpers.bash

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,14 @@ setup_cuda() {
4646

4747
# Now work out the CUDA settings
4848
case "$CU_VERSION" in
49+
cu115)
50+
if [[ "$OSTYPE" == "msys" ]]; then
51+
export CUDA_HOME="C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.5"
52+
else
53+
export CUDA_HOME=/usr/local/cuda-11.5/
54+
fi
55+
export TORCH_CUDA_ARCH_LIST="3.5;5.0+PTX;6.0;7.0;7.5;8.0;8.6"
56+
;;
4957
cu113)
5058
if [[ "$OSTYPE" == "msys" ]]; then
5159
export CUDA_HOME="C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.3"
@@ -289,6 +297,9 @@ setup_conda_cudatoolkit_constraint() {
289297
export CONDA_BUILD_VARIANT="cpu"
290298
else
291299
case "$CU_VERSION" in
300+
cu115)
301+
export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=11.5,<11.6 # [not osx]"
302+
;;
292303
cu113)
293304
export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=11.3,<11.4 # [not osx]"
294305
;;
@@ -333,6 +344,9 @@ setup_conda_cudatoolkit_plain_constraint() {
333344
export CMAKE_USE_CUDA=0
334345
else
335346
case "$CU_VERSION" in
347+
cu115)
348+
export CONDA_CUDATOOLKIT_CONSTRAINT="cudatoolkit=11.5"
349+
;;
336350
cu113)
337351
export CONDA_CUDATOOLKIT_CONSTRAINT="cudatoolkit=11.3"
338352
;;

packaging/windows/internal/cuda_install.bat

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ set CUDA_VER_MAJOR=%CUDA_VER:~0,-1%
2121
set CUDA_VER_MINOR=%CUDA_VER:~-1,1%
2222
set CUDA_VERSION_STR=%CUDA_VER_MAJOR%.%CUDA_VER_MINOR%
2323

24+
2425
if %CUDA_VER% EQU 92 goto cuda92
2526
if %CUDA_VER% EQU 100 goto cuda100
2627
if %CUDA_VER% EQU 101 goto cuda101
@@ -29,6 +30,8 @@ if %CUDA_VER% EQU 110 goto cuda110
2930
if %CUDA_VER% EQU 111 goto cuda111
3031
if %CUDA_VER% EQU 112 goto cuda112
3132
if %CUDA_VER% EQU 113 goto cuda113
33+
if %CUDA_VER% EQU 115 goto cuda115
34+
3235

3336
echo CUDA %CUDA_VERSION_STR% is not supported
3437
exit /b 1
@@ -180,6 +183,25 @@ if not exist "%SRC_DIR%\temp_build\%CUDNN_INSTALL_ZIP%" (
180183

181184
goto cuda_common
182185

186+
:cuda115
187+
188+
set CUDA_INSTALL_EXE=cuda_11.5.0_496.13_win10.exe
189+
if not exist "%SRC_DIR%\temp_build\%CUDA_INSTALL_EXE%" (
190+
curl -k -L "https://ossci-windows.s3.amazonaws.com/%CUDA_INSTALL_EXE%" --output "%SRC_DIR%\temp_build\%CUDA_INSTALL_EXE%"
191+
if errorlevel 1 exit /b 1
192+
set "CUDA_SETUP_FILE=%SRC_DIR%\temp_build\%CUDA_INSTALL_EXE%"
193+
set "ARGS=thrust_11.5 nvcc_11.5 cuobjdump_11.5 nvprune_11.5 nvprof_11.5 cupti_11.5 cublas_11.5 cublas_dev_11.5 cudart_11.5 cufft_11.5 cufft_dev_11.5 curand_11.5 curand_dev_11.5 cusolver_11.5 cusolver_dev_11.5 cusparse_11.5 cusparse_dev_11.5 npp_11.5 npp_dev_11.5 nvrtc_11.5 nvrtc_dev_11.5 nvml_dev_11.5"
194+
)
195+
196+
set CUDNN_INSTALL_ZIP=cudnn-11.3-windows-x64-v8.2.0.53.zip
197+
if not exist "%SRC_DIR%\temp_build\%CUDNN_INSTALL_ZIP%" (
198+
curl -k -L "http://s3.amazonaws.com/ossci-windows/%CUDNN_INSTALL_ZIP%" --output "%SRC_DIR%\temp_build\%CUDNN_INSTALL_ZIP%"
199+
if errorlevel 1 exit /b 1
200+
set "CUDNN_SETUP_FILE=%SRC_DIR%\temp_build\%CUDNN_INSTALL_ZIP%"
201+
)
202+
203+
goto cuda_common
204+
183205
:cuda_common
184206

185207
if not exist "%SRC_DIR%\temp_build\NvToolsExt.7z" (
@@ -222,7 +244,7 @@ set "NVTOOLSEXT_PATH=%ProgramFiles%\NVIDIA Corporation\NvToolsExt\bin\x64"
222244
if not exist "%ProgramFiles%\NVIDIA GPU Computing Toolkit\CUDA\v%CUDA_VERSION_STR%\bin\nvcc.exe" (
223245
echo CUDA %CUDA_VERSION_STR% installed failed.
224246
echo --------- RunDll32.exe.log
225-
type "%SRC_DIR%\temp_build\cuda\cuda_install_logs\LOG.RunDll32.exe.log"
247+
type "%SRC_DIR%\temp_build\cuda\cuda_install_logs\LOG.RunDll32.exe.log"
226248
echo --------- setup.exe.log -------
227249
type "%SRC_DIR%\temp_build\cuda\cuda_install_logs\LOG.setup.exe.log"
228250
exit /b 1

torchvision/datasets/vision.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def __init__(
3535
transform: Optional[Callable] = None,
3636
target_transform: Optional[Callable] = None,
3737
) -> None:
38-
_log_api_usage_once(self)
38+
_log_api_usage_once("datasets", self.__class__.__name__)
3939
if isinstance(root, torch._six.string_classes):
4040
root = os.path.expanduser(root)
4141
self.root = root

torchvision/models/alexnet.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
class AlexNet(nn.Module):
1919
def __init__(self, num_classes: int = 1000, dropout: float = 0.5) -> None:
2020
super().__init__()
21-
_log_api_usage_once(self)
21+
_log_api_usage_once("models", self.__class__.__name__)
2222
self.features = nn.Sequential(
2323
nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
2424
nn.ReLU(inplace=True),

torchvision/models/densenet.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ def __init__(
163163
) -> None:
164164

165165
super().__init__()
166-
_log_api_usage_once(self)
166+
_log_api_usage_once("models", self.__class__.__name__)
167167

168168
# First convolution
169169
self.features = nn.Sequential(

torchvision/models/detection/generalized_rcnn.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class GeneralizedRCNN(nn.Module):
2727

2828
def __init__(self, backbone: nn.Module, rpn: nn.Module, roi_heads: nn.Module, transform: nn.Module) -> None:
2929
super().__init__()
30-
_log_api_usage_once(self)
30+
_log_api_usage_once("models", self.__class__.__name__)
3131
self.transform = transform
3232
self.backbone = backbone
3333
self.rpn = rpn

torchvision/models/detection/retinanet.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ def __init__(
337337
topk_candidates=1000,
338338
):
339339
super().__init__()
340-
_log_api_usage_once(self)
340+
_log_api_usage_once("models", self.__class__.__name__)
341341

342342
if not hasattr(backbone, "out_channels"):
343343
raise ValueError(

torchvision/models/detection/ssd.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ def __init__(
182182
positive_fraction: float = 0.25,
183183
):
184184
super().__init__()
185-
_log_api_usage_once(self)
185+
_log_api_usage_once("models", self.__class__.__name__)
186186

187187
self.backbone = backbone
188188

torchvision/models/detection/ssdlite.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ def __init__(
120120
min_depth: int = 16,
121121
):
122122
super().__init__()
123-
_log_api_usage_once(self)
123+
_log_api_usage_once("models", self.__class__.__name__)
124124

125125
assert not backbone[c4_pos].use_res_connect
126126
self.features = nn.Sequential(

torchvision/models/efficientnet.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ def __init__(
170170
norm_layer (Optional[Callable[..., nn.Module]]): Module specifying the normalization layer to use
171171
"""
172172
super().__init__()
173-
_log_api_usage_once(self)
173+
_log_api_usage_once("models", self.__class__.__name__)
174174

175175
if not inverted_residual_setting:
176176
raise ValueError("The inverted_residual_setting should not be empty")

torchvision/models/googlenet.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def __init__(
3939
dropout_aux: float = 0.7,
4040
) -> None:
4141
super().__init__()
42-
_log_api_usage_once(self)
42+
_log_api_usage_once("models", self.__class__.__name__)
4343
if blocks is None:
4444
blocks = [BasicConv2d, Inception, InceptionAux]
4545
if init_weights is None:

torchvision/models/inception.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def __init__(
3737
dropout: float = 0.5,
3838
) -> None:
3939
super().__init__()
40-
_log_api_usage_once(self)
40+
_log_api_usage_once("models", self.__class__.__name__)
4141
if inception_blocks is None:
4242
inception_blocks = [BasicConv2d, InceptionA, InceptionB, InceptionC, InceptionD, InceptionE, InceptionAux]
4343
if init_weights is None:

torchvision/models/mnasnet.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ class MNASNet(torch.nn.Module):
9898

9999
def __init__(self, alpha: float, num_classes: int = 1000, dropout: float = 0.2) -> None:
100100
super().__init__()
101-
_log_api_usage_once(self)
101+
_log_api_usage_once("models", self.__class__.__name__)
102102
assert alpha > 0.0
103103
self.alpha = alpha
104104
self.num_classes = num_classes

torchvision/models/mobilenetv2.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ def __init__(
111111
112112
"""
113113
super().__init__()
114-
_log_api_usage_once(self)
114+
_log_api_usage_once("models", self.__class__.__name__)
115115

116116
if block is None:
117117
block = InvertedResidual

torchvision/models/mobilenetv3.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ def __init__(
151151
dropout (float): The droupout probability
152152
"""
153153
super().__init__()
154-
_log_api_usage_once(self)
154+
_log_api_usage_once("models", self.__class__.__name__)
155155

156156
if not inverted_residual_setting:
157157
raise ValueError("The inverted_residual_setting should not be empty")

torchvision/models/optical_flow/raft.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ def __init__(self, *, feature_encoder, context_encoder, corr_block, update_block
440440
If ``None`` (default), the flow is upsampled using interpolation.
441441
"""
442442
super().__init__()
443-
_log_api_usage_once(self)
443+
_log_api_usage_once("models", self.__class__.__name__)
444444

445445
self.feature_encoder = feature_encoder
446446
self.context_encoder = context_encoder

torchvision/models/regnet.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ def __init__(
310310
activation: Optional[Callable[..., nn.Module]] = None,
311311
) -> None:
312312
super().__init__()
313-
_log_api_usage_once(self)
313+
_log_api_usage_once("models", self.__class__.__name__)
314314

315315
if stem_type is None:
316316
stem_type = SimpleStemIN

torchvision/models/resnet.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ def __init__(
174174
norm_layer: Optional[Callable[..., nn.Module]] = None,
175175
) -> None:
176176
super().__init__()
177-
_log_api_usage_once(self)
177+
_log_api_usage_once("models", self.__class__.__name__)
178178
if norm_layer is None:
179179
norm_layer = nn.BatchNorm2d
180180
self._norm_layer = norm_layer

torchvision/models/segmentation/_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class _SimpleSegmentationModel(nn.Module):
1313

1414
def __init__(self, backbone: nn.Module, classifier: nn.Module, aux_classifier: Optional[nn.Module] = None) -> None:
1515
super().__init__()
16-
_log_api_usage_once(self)
16+
_log_api_usage_once("models", self.__class__.__name__)
1717
self.backbone = backbone
1818
self.classifier = classifier
1919
self.aux_classifier = aux_classifier

torchvision/models/segmentation/lraspp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def __init__(
3838
self, backbone: nn.Module, low_channels: int, high_channels: int, num_classes: int, inter_channels: int = 128
3939
) -> None:
4040
super().__init__()
41-
_log_api_usage_once(self)
41+
_log_api_usage_once("models", self.__class__.__name__)
4242
self.backbone = backbone
4343
self.classifier = LRASPPHead(low_channels, high_channels, num_classes, inter_channels)
4444

torchvision/models/shufflenetv2.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ def __init__(
100100
inverted_residual: Callable[..., nn.Module] = InvertedResidual,
101101
) -> None:
102102
super().__init__()
103-
_log_api_usage_once(self)
103+
_log_api_usage_once("models", self.__class__.__name__)
104104

105105
if len(stages_repeats) != 3:
106106
raise ValueError("expected stages_repeats as list of 3 positive ints")

torchvision/models/squeezenet.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def forward(self, x: torch.Tensor) -> torch.Tensor:
3636
class SqueezeNet(nn.Module):
3737
def __init__(self, version: str = "1_0", num_classes: int = 1000, dropout: float = 0.5) -> None:
3838
super().__init__()
39-
_log_api_usage_once(self)
39+
_log_api_usage_once("models", self.__class__.__name__)
4040
self.num_classes = num_classes
4141
if version == "1_0":
4242
self.features = nn.Sequential(

torchvision/models/vgg.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def __init__(
3737
self, features: nn.Module, num_classes: int = 1000, init_weights: bool = True, dropout: float = 0.5
3838
) -> None:
3939
super().__init__()
40-
_log_api_usage_once(self)
40+
_log_api_usage_once("models", self.__class__.__name__)
4141
self.features = features
4242
self.avgpool = nn.AdaptiveAvgPool2d((7, 7))
4343
self.classifier = nn.Sequential(

torchvision/models/video/resnet.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ def __init__(
209209
zero_init_residual (bool, optional): Zero init bottleneck residual BN. Defaults to False.
210210
"""
211211
super().__init__()
212-
_log_api_usage_once(self)
212+
_log_api_usage_once("models", self.__class__.__name__)
213213
self.inplanes = 64
214214

215215
self.stem = stem()

torchvision/ops/boxes.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def nms(boxes: Tensor, scores: Tensor, iou_threshold: float) -> Tensor:
3434
Tensor: int64 tensor with the indices of the elements that have been kept
3535
by NMS, sorted in decreasing order of scores
3636
"""
37-
_log_api_usage_once("torchvision.ops.nms")
37+
_log_api_usage_once("ops", "nms")
3838
_assert_has_ops()
3939
return torch.ops.torchvision.nms(boxes, scores, iou_threshold)
4040

@@ -63,7 +63,7 @@ def batched_nms(
6363
Tensor: int64 tensor with the indices of the elements that have been kept by NMS, sorted
6464
in decreasing order of scores
6565
"""
66-
_log_api_usage_once("torchvision.ops.batched_nms")
66+
_log_api_usage_once("ops", "batched_nms")
6767
# Benchmarks that drove the following thresholds are at
6868
# https://github.com/pytorch/vision/issues/1311#issuecomment-781329339
6969
if boxes.numel() > (4000 if boxes.device.type == "cpu" else 20000) and not torchvision._is_tracing():
@@ -122,7 +122,7 @@ def remove_small_boxes(boxes: Tensor, min_size: float) -> Tensor:
122122
Tensor[K]: indices of the boxes that have both sides
123123
larger than min_size
124124
"""
125-
_log_api_usage_once("torchvision.ops.remove_small_boxes")
125+
_log_api_usage_once("ops", "remove_small_boxes")
126126
ws, hs = boxes[:, 2] - boxes[:, 0], boxes[:, 3] - boxes[:, 1]
127127
keep = (ws >= min_size) & (hs >= min_size)
128128
keep = torch.where(keep)[0]
@@ -141,7 +141,7 @@ def clip_boxes_to_image(boxes: Tensor, size: Tuple[int, int]) -> Tensor:
141141
Returns:
142142
Tensor[N, 4]: clipped boxes
143143
"""
144-
_log_api_usage_once("torchvision.ops.clip_boxes_to_image")
144+
_log_api_usage_once("ops", "clip_boxes_to_image")
145145
dim = boxes.dim()
146146
boxes_x = boxes[..., 0::2]
147147
boxes_y = boxes[..., 1::2]
@@ -182,7 +182,7 @@ def box_convert(boxes: Tensor, in_fmt: str, out_fmt: str) -> Tensor:
182182
Tensor[N, 4]: Boxes into converted format.
183183
"""
184184

185-
_log_api_usage_once("torchvision.ops.box_convert")
185+
_log_api_usage_once("ops", "box_convert")
186186
allowed_fmts = ("xyxy", "xywh", "cxcywh")
187187
if in_fmt not in allowed_fmts or out_fmt not in allowed_fmts:
188188
raise ValueError("Unsupported Bounding Box Conversions for given in_fmt and out_fmt")
@@ -232,7 +232,7 @@ def box_area(boxes: Tensor) -> Tensor:
232232
Returns:
233233
Tensor[N]: the area for each box
234234
"""
235-
_log_api_usage_once("torchvision.ops.box_area")
235+
_log_api_usage_once("ops", "box_area")
236236
boxes = _upcast(boxes)
237237
return (boxes[:, 2] - boxes[:, 0]) * (boxes[:, 3] - boxes[:, 1])
238238

@@ -268,7 +268,7 @@ def box_iou(boxes1: Tensor, boxes2: Tensor) -> Tensor:
268268
Returns:
269269
Tensor[N, M]: the NxM matrix containing the pairwise IoU values for every element in boxes1 and boxes2
270270
"""
271-
_log_api_usage_once("torchvision.ops.box_iou")
271+
_log_api_usage_once("ops", "box_iou")
272272
inter, union = _box_inter_union(boxes1, boxes2)
273273
iou = inter / union
274274
return iou
@@ -291,7 +291,7 @@ def generalized_box_iou(boxes1: Tensor, boxes2: Tensor) -> Tensor:
291291
for every element in boxes1 and boxes2
292292
"""
293293

294-
_log_api_usage_once("torchvision.ops.generalized_box_iou")
294+
_log_api_usage_once("ops", "generalized_box_iou")
295295
# degenerate boxes gives inf / nan results
296296
# so do an early check
297297
assert (boxes1[:, 2:] >= boxes1[:, :2]).all()
@@ -323,7 +323,7 @@ def masks_to_boxes(masks: torch.Tensor) -> torch.Tensor:
323323
Returns:
324324
Tensor[N, 4]: bounding boxes
325325
"""
326-
_log_api_usage_once("torchvision.ops.masks_to_boxes")
326+
_log_api_usage_once("ops", "masks_to_boxes")
327327
if masks.numel() == 0:
328328
return torch.zeros((0, 4), device=masks.device, dtype=torch.float)
329329

0 commit comments

Comments
 (0)