@@ -136,7 +136,8 @@ auto select_registrations TORCHTRT_UNUSED =
136
136
// IShuffleLayer removes redundant dimensions
137
137
auto shuffle_layer = ctx->net ->addShuffle (*out);
138
138
TORCHTRT_CHECK (shuffle_layer, " Unable to create shuffle layer from node: " << *n);
139
- shuffle_layer->setReshapeDimensions (util::squeezeDims (out->getDimensions (), dim));
139
+ shuffle_layer->setReshapeDimensions (
140
+ util::squeezeDims (out->getDimensions (), dim, !ctx->input_is_dynamic ));
140
141
shuffle_layer->setName (util::node_info (n).c_str ());
141
142
out = shuffle_layer->getOutput (0 );
142
143
}
@@ -249,21 +250,19 @@ auto select_registrations TORCHTRT_UNUSED =
249
250
auto dims = args[2 ].unwrapToIntList ().vec ();
250
251
251
252
TORCHTRT_CHECK (dims.size () == shifts.size (), " dims.size() should be equal to shifts.size()" );
252
- if (ctx->input_is_dynamic ) {
253
- TORCHTRT_THROW_ERROR (" aten::roll is currently not support in dynamic input shape compilation" );
254
- } else {
255
- auto in_shape = util::toVec (in->getDimensions ());
256
- for (size_t i = 0 ; i < dims.size (); i++) {
257
- auto dim = dims[i] < 0 ? (in_shape.size () + dims[i]) : dims[i];
258
- TORCHTRT_CHECK (dim < in_shape.size (), " Dimension out of range" );
259
- in = roll (ctx, in, shifts[i], dim, in_shape);
260
- }
261
- auto out = ctx->AssociateValueAndTensor (n->outputs ()[0 ], in);
253
+ auto in_shape = util::toVec (in->getDimensions ());
254
+ for (size_t i = 0 ; i < dims.size (); i++) {
255
+ auto dim = dims[i] < 0 ? (in_shape.size () + dims[i]) : dims[i];
256
+ TORCHTRT_CHECK (dim < in_shape.size (), " Dimension out of range" );
257
+ TORCHTRT_CHECK (
258
+ in_shape[dim] != -1 , " aten::roll is not supported when the targeted dimension is dynamic" );
259
+ in = roll (ctx, in, shifts[i], dim, in_shape);
260
+ }
261
+ auto out = ctx->AssociateValueAndTensor (n->outputs ()[0 ], in);
262
262
263
- LOG_DEBUG (" Output tensor shape: " << out->getDimensions ());
263
+ LOG_DEBUG (" Output tensor shape: " << out->getDimensions ());
264
264
265
- return true ;
266
- }
265
+ return true ;
267
266
}})
268
267
.pattern(
269
268
{" aten::index.Tensor(Tensor self, Tensor?[] indices) -> (Tensor)" ,
@@ -360,9 +359,15 @@ auto select_registrations TORCHTRT_UNUSED =
360
359
stride_.d [i] = 1 ;
361
360
}
362
361
}
363
- auto slice_layer = ctx->net ->addSlice (*in, start_, size_, stride_);
364
-
365
- if (dynamic_shape) { // dynamic shape
362
+ if (!dynamic_shape) {
363
+ auto slice_layer = ctx->net ->addSlice (*in, start_, size_, stride_);
364
+ LOG_DEBUG (" start_:" << start_);
365
+ LOG_DEBUG (" size_:" << size_);
366
+ LOG_DEBUG (" stride_:" << stride_);
367
+ auto slice_out = slice_layer->getOutput (0 );
368
+ auto out = ctx->AssociateValueAndTensor (n->outputs ()[0 ], slice_out);
369
+ LOG_DEBUG (" Slice layer output shape: " << out->getDimensions ());
370
+ } else { // dynamic shape
366
371
LOG_DEBUG (" Using dynamic version of slice" );
367
372
// start tensor
368
373
at::Tensor start_tensor = torch::zeros ({nbdims}).to (torch::kI32 );
@@ -398,13 +403,13 @@ auto select_registrations TORCHTRT_UNUSED =
398
403
auto size_itensor = get_slice_size (ctx, out_start, out_end, stride_itensor, nbdims, node_name);
399
404
400
405
// update slice layer
406
+ auto slice_layer = ctx->net ->addSlice (*in, start_, size_, stride_);
401
407
slice_layer->setInput (1 , *out_start); // start
402
408
slice_layer->setInput (2 , *size_itensor); // size, must be set if input is dynamic
409
+ auto slice_out = slice_layer->getOutput (0 );
410
+ auto out = ctx->AssociateValueAndTensor (n->outputs ()[0 ], slice_out);
411
+ LOG_DEBUG (" Slice layer output shape: " << out->getDimensions ());
403
412
}
404
- auto slice_out = slice_layer->getOutput (0 );
405
-
406
- auto out = ctx->AssociateValueAndTensor (n->outputs ()[0 ], slice_out);
407
- LOG_DEBUG (" Slice layer output shape: " << out->getDimensions ());
408
413
409
414
return true ;
410
415
}})
@@ -484,7 +489,7 @@ auto select_registrations TORCHTRT_UNUSED =
484
489
485
490
auto layer = ctx->net ->addScatter (*self, *index , *value_tensor, nvinfer1::ScatterMode::kELEMENT );
486
491
layer->setAxis (dim);
487
-
492
+
488
493
TORCHTRT_CHECK (layer, " Unable to create layer for aten::scatter.value" );
489
494
490
495
layer->setName (util::node_info (n).c_str ());
@@ -503,7 +508,7 @@ auto select_registrations TORCHTRT_UNUSED =
503
508
504
509
auto layer = ctx->net ->addScatter (*self, *index , *src, nvinfer1::ScatterMode::kELEMENT );
505
510
layer->setAxis (dim);
506
-
511
+
507
512
TORCHTRT_CHECK (layer, " Unable to create layer for aten::scatter.src" );
508
513
509
514
layer->setName (util::node_info (n).c_str ());
0 commit comments