openvino icon indicating copy to clipboard operation
openvino copied to clipboard

Extend Python API with a new `model.reshape()` overload

Open p-wysocki opened this issue 2 years ago • 45 comments

Context

Currently there are multiple ways to reshape model inputs in Python API. They are defined as bindings to C++ code.

A new way to reshape has been suggested - implicit input reshaping with a list of input shapes. An example of new, desired overload/Python API function:

  1. model has three inputs: A, B and C
  2. model is being reshaped with a list of shapes: model.reshape([[2,2], [1, 3, 224, 244], [10]])
  3. the given shapes are assigned to respective inputs: A.shape = [2, 2] B.shape = [1, 3, 244, 244] C.shape = [10]

Python API model binding needs to be extended with a new overload which will add this functionality.

What needs to be done?

  1. Add a new overload for model.reshape in model C++ bindings
  2. Add tests for the new functionality in the correct test file - test_model.py
  3. Submit a PR
  4. Wait for review

Resources

Contact points

@p-wysocki @jiwaszki @akuporos

Don't hesitate to reach out, we're here to help!

Ticket: 110444

p-wysocki avatar Jul 03 '23 16:07 p-wysocki

Do we need any placeholder if I want to change only specific shapes? E.g. model has 3 inputs and old last one needs to be changed.

ilya-lavrenov avatar Jul 04 '23 07:07 ilya-lavrenov

I guess in that case the user should use dict overload, where a specific input can be reshaped. Either that or we do the placeholder you suggested, but I think that whatever the placeholder would be, it wouldn't be clear. We can't do -1 since it means a dynamic shape, None I think would look a bit weird, maybe some string? I guess it's a thing to discuss.

cc @jiwaszki @akuporos

p-wysocki avatar Jul 04 '23 11:07 p-wysocki

hey @p-wysocki @ilya-lavrenov I want to work on this can you please assign it to me

dev-seek avatar Jul 04 '23 12:07 dev-seek

thanks a lot for assigning me , i will surely come up with doubts or updates if any

dev-seek avatar Jul 04 '23 13:07 dev-seek

@dev-seek Thanks for taking a look, we're here to answer any questions. :)

p-wysocki avatar Jul 04 '23 13:07 p-wysocki

I guess in that case the user should use dict overload, where a specific input can be reshaped. Either that or we do the placeholder you suggested, but I think that whatever the placeholder would be, it wouldn't be clear. We can't do -1 since it means a dynamic shape, None I think would look a bit weird, maybe some string? I guess it's a thing to discuss.

cc @jiwaszki @akuporos

As for placeholder values, there is a problem with adding them. What should be a concept instead of integers? Enums like ov.PartialShape.KEEP and consequence of it ov.Dimension.KEEP? Or just a string value KEEP?

I think that placeholder values are not in the scope of this task and @p-wysocki solution with dict is suitable for now (e.x. {1: [1, 21, 37]}).

In general case user could perform something like model.reshape([model.inputs[0].shape, [1, 22, 48], model.inputs[0].partial_shape) where shape/partial_shape can be used interchangeably depending on dynamism of given model inputs. It's worth adding a test-case(s) for such usage.

jiwaszki avatar Jul 12 '23 13:07 jiwaszki

hey @p-wysocki @jiwaszki Just to clearify can i build the whole on Debian as here -> https://github.com/openvinotoolkit/openvino/blob/master/docs/dev/build_linux.md its written for Ubuntu can i do the same for Debian as Ubuntu is based on Debian

dev-seek avatar Jul 14 '23 17:07 dev-seek

Hi @dev-seek, as far as I know this instruction works for Debian. If you encounter any issues please let us know.

p-wysocki avatar Jul 18 '23 12:07 p-wysocki

hey is the issue resolve I want to contribute . I am new to open-source contribution

Jay-sanjay avatar Jul 22 '23 03:07 Jay-sanjay

Hey @Jay-sanjay i am already contributing to it

dev-seek avatar Jul 22 '23 03:07 dev-seek

I'm returning the task to being open due to current assignee's inactivity.

p-wysocki avatar Aug 23 '23 10:08 p-wysocki

Sry @p-wysocki i am not inactive in middle i am suffering from a bad health issue related to heart... But believe me i am on after a week... If u can plz remain it as it is..

dev-seek avatar Aug 23 '23 10:08 dev-seek

i really want this to be done if u can, please reassign it to me @p-wysocki

dev-seek avatar Aug 23 '23 11:08 dev-seek

Sure, get well soon. :)

p-wysocki avatar Aug 23 '23 11:08 p-wysocki

Thanks a lot @p-wysocki Bed rest of 1 week is remaining, not suggested to work via doc... After a week i will be back and start working on it for sure

dev-seek avatar Aug 23 '23 11:08 dev-seek

I'm returning the task to being open due to current assignee's inactivity.

p-wysocki avatar Sep 15 '23 08:09 p-wysocki

Hey @p-wysocki doesn't this already solve this issue?

siddhant-0707 avatar Sep 15 '23 15:09 siddhant-0707

@slyalin could you please take a look? IIRC this feature was at your request, do you think there's a benefit on expanding our API to also accepting lists, when we have an overload which @siddhant-0707 linked?

p-wysocki avatar Oct 02 '23 11:10 p-wysocki

@slyalin

p-wysocki avatar Oct 25 '23 10:10 p-wysocki

@p-wysocki, the mentioned by @siddhant-0707 method accepts py::dict, this ticket is about a list. I don't see how they are connected. The problem when we want to skip part of the arguments in reshape and still want to use a method that accepts a list of shapes should be left as-is -- without any resolution, because in this case, indeed, mentioned by @siddhant-0707 method with py::dict should be used.

So we still don't have a method that just accepts the list of shapes. In the example from the description, instead of model.reshape([[2,2], [1, 3, 224, 244], [10]]) we still need to write model.reshape({0: [2,2], 1: [1, 3, 224, 244], 2: [10]}) which is rather annoying and is not aligned with capabilities provided for a compiled model used as a callable -- there I can use a list of inputs.

The real problem is how to align a newly proposed reshape method with other existing reshape methods: how to avoid ambiguities.

slyalin avatar Nov 20 '23 08:11 slyalin

want to make sure I understand this, basically to resolve this issue, go into model.cpp and add a new model.def("reshape", [](){ <code>} that will support the new desired functionality? if this seems to be an appropriate amount of understanding then I would like to pick up this issue

mcshawn10 avatar Nov 29 '23 07:11 mcshawn10

@slyalin @p-wysocki

mcshawn10 avatar Nov 30 '23 05:11 mcshawn10

Hello @mcshawn10, your understanding is correct. Adding a new model.def adds a new Python binding "overload" - it most likely should call the same C++ function internally, but probably do some preprocessing on the input data gotten from Python. Thanks for being interested in that! If you wish to pick up the issue, you can comment .take.

p-wysocki avatar Nov 30 '23 11:11 p-wysocki

Thank you for looking into this issue! Please let us know if you have any questions or require any help.

github-actions[bot] avatar Nov 30 '23 11:11 github-actions[bot]

Thank you for looking into this issue! Please let us know if you have any questions or require any help.

github-actions[bot] avatar Nov 30 '23 11:11 github-actions[bot]

.take

mcshawn10 avatar Nov 30 '23 13:11 mcshawn10

Thanks for being interested in this issue. It looks like this ticket is already assigned to a contributor. Please communicate with the assigned contributor to confirm the status of the issue.

github-actions[bot] avatar Nov 30 '23 13:11 github-actions[bot]

Hi @p-wysocki, could you transfer assignment of this issue, thank you!

mcshawn10 avatar Nov 30 '23 14:11 mcshawn10

Hi @p-wysocki, could you transfer assignment of this issue, thank you!

you got it! Sorry for inconvenience, we have to seriously talk with our bot ;) have fun!

mlukasze avatar Dec 01 '23 06:12 mlukasze

Hello @mcshawn10, is there anything we can help you with? Do you have any questions?

p-wysocki avatar Dec 08 '23 14:12 p-wysocki