Skip to content

Comments

Support Unsqueeze#12

Merged
Honry merged 3 commits intostable-diffusionfrom
unsqueeze
May 19, 2023
Merged

Support Unsqueeze#12
Honry merged 3 commits intostable-diffusionfrom
unsqueeze

Conversation

@Honry
Copy link
Owner

@Honry Honry commented May 18, 2023

No description provided.

Copy link

@fdwr fdwr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks Wanming. Minor comments.

{"Reshape", "reshape"},
{"Resize", "resample2d"},
{"Split", "split"},
{"Transpose", "transpose"}};
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Yeah, not putting the closing } on the same brace is better because then you can more clearly see additions.

const Node& node,
const logging::Logger& logger) const {
const auto& input_defs = node.InputDefs();
emscripten::val input = model_builder.GetOperand(input_defs[0]->Name());
Copy link

@fdwr fdwr May 18, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Propose ORT_RETURN_IF_NOT(input_defs.size() < 1, "Unsqueeze has no input tensor"); since Definitions::input_defs as a std::vector<NodeArg*> has no bounds checking.

Or alternatively, check in the input count in the else branch of UnsqueezeOpBuilder::IsOpSupportedImpl:

if (node.SinceVersion() >= 13) {
    ...
} else {
    if (input_defs.size() < 1) {
    ...


if (node.SinceVersion() >= 13) {
// Input axes is provided, use axes initializer data.
const auto& initializers(model_builder.GetInitializerTensors());
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
const auto& initializers(model_builder.GetInitializerTensors());
const auto& initializers = model_builder.GetInitializerTensors();

Minor suggestion. At first glance due to parentheses, this looks like it's calling a constructor to create an object, but then you notice the little & and realize it actually it's just assigning a reference.

const auto& initializers(model_builder.GetInitializerTensors());
const auto& axes_tensor = *initializers.at(input_defs[1]->Name());
Initializer axes_initializer(axes_tensor);
const auto axes_data_span = axes_initializer.DataAsSpan<int64_t>();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does DataAsSpan validate the tensor type is actually int64_t first before casting? If not, we should validate before accessing the memory:

e.g.
ORT_RETURN_IF_NOT(axes_initializer.data_type() != ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_INT64, "Unsqueeze axes should be int64 data type.");

Or maybe what you did in SliceOpBuilder::IsOpSupportedImpl:

if (shape_tensor.data_type() != ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_INT64) {
  LOGS(logger, VERBOSE) << "The type of tensor's element data must be INT64.";
  return false;
}

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DataAsSpan does check the date type.

Copy link

@fdwr fdwr May 19, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DataAsSpan does check the date type.

Cool.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for the silly question. For some reason I wasn't getting search results for DataAsSpan in VS code. 🤷‍♂️

ORT_ENFORCE(utils::IsPrimitiveDataType<T>(dtype_), "Tensor type mismatch. ",
            "T ", "!=", dtype_);

// Operator support related

bool UnsqueezeOpBuilder::IsOpSupportedImpl(const InitializedTensorSet& initializers, const Node& node,
const logging::Logger& logger) const {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
const logging::Logger& logger) const {
const logging::Logger& logger) const {

[input_rank](int64_t axis) -> int32_t { return HandleNegativeAxis(axis, input_rank); });
}
}

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Per our Teams message:

output_rank = input_rank + axes.size();
HandleNegativeAxis(axis, output_rank); });

@Honry
Copy link
Owner Author

Honry commented May 19, 2023

@fdwr, comments addressed, PTAL again, thanks!

Copy link

@fdwr fdwr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks Honry ⭐.

const auto& initializers(model_builder.GetInitializerTensors());
const auto& axes_tensor = *initializers.at(input_defs[1]->Name());
Initializer axes_initializer(axes_tensor);
const auto axes_data_span = axes_initializer.DataAsSpan<int64_t>();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for the silly question. For some reason I wasn't getting search results for DataAsSpan in VS code. 🤷‍♂️

ORT_ENFORCE(utils::IsPrimitiveDataType<T>(dtype_), "Tensor type mismatch. ",
            "T ", "!=", dtype_);

@Honry Honry merged commit 2c7713b into stable-diffusion May 19, 2023
Honry pushed a commit that referenced this pull request Aug 7, 2024
… transient connection exceptions. (microsoft#21612)

### Description
Improve docker commands to make docker image layer caching works.
It can make docker building faster and more stable.
So far, A100 pool's system disk is too small to use docker cache.
We won't use pipeline cache for docker image and remove some legacy
code.

### Motivation and Context
There are often an exception of
```
64.58 + curl https://nodejs.org/dist/v18.17.1/node-v18.17.1-linux-x64.tar.gz -sSL --retry 5 --retry-delay 30 --create-dirs -o /tmp/src/node-v18.17.1-linux-x64.tar.gz --fail
286.4 curl: (92) HTTP/2 stream 0 was not closed cleanly: INTERNAL_ERROR (err 2)
```
Because Onnxruntime pipeline have been sending too many requests to
download Nodejs in docker building.
Which is the major reason of pipeline failing now

In fact, docker image layer caching never works.
We can always see the scrips are still running
```
#9 [3/5] RUN cd /tmp/scripts && /tmp/scripts/install_centos.sh && /tmp/scripts/install_deps.sh && rm -rf /tmp/scripts
#9 0.234 /bin/sh: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
#9 0.235 /bin/sh: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
#9 0.235 /tmp/scripts/install_centos.sh: line 1: !/bin/bash: No such file or directory
#9 0.235 ++ '[' '!' -f /etc/yum.repos.d/microsoft-prod.repo ']'
#9 0.236 +++ tr -dc 0-9.
#9 0.236 +++ cut -d . -f1
#9 0.238 ++ os_major_version=8
....
#9 60.41 + curl https://nodejs.org/dist/v18.17.1/node-v18.17.1-linux-x64.tar.gz -sSL --retry 5 --retry-delay 30 --create-dirs -o /tmp/src/node-v18.17.1-linux-x64.tar.gz --fail
#9 60.59 + return 0
...
```

This PR is improving the docker command to make image layer caching
work.
Thus, CI won't send so many redundant request of downloading NodeJS.
```
#9 [2/5] ADD scripts /tmp/scripts
#9 CACHED

#10 [3/5] RUN cd /tmp/scripts && /tmp/scripts/install_centos.sh && /tmp/scripts/install_deps.sh && rm -rf /tmp/scripts
#10 CACHED

#11 [4/5] RUN adduser --uid 1000 onnxruntimedev
#11 CACHED

#12 [5/5] WORKDIR /home/onnxruntimedev
#12 CACHED
```

###Reference
https://docs.docker.com/build/drivers/

---------

Co-authored-by: Yi Zhang <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants