Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[te] Ban uint8 tensors from fusion groups #49247

Closed
wants to merge 7 commits into from

Commits on Dec 11, 2020

  1. [te] Ban uint8 tensors from fusion groups

    uint8's expose all kind of corner cases in type promotion.  As an example, consider:
    ```
    >>> torch.tensor([1], dtype=torch.uint8).lt(-1)
    tensor([True])
    >>> torch.tensor([1], dtype=torch.uint8).lt(torch.tensor(-1))
    tensor([True])
    >>> torch.tensor([1], dtype=torch.uint8).lt(torch.tensor([-1]))
    tensor([False])
    ```
    the difference is how promotions involving scalars (or 0-dim tensors, which are treated like scalars) are prioritized compared to tensor dtypes.
    Per @eellison, the order is something like:
    1. Tensor FP types
    2. Scalar FP types
    3. Tensor Int types
    4. Scalar Int types
    
    The logic for this is here: https://github.com/pytorch/pytorch/blob/c73e97033a3aef97a5685588ea014d54a5cc11cc/aten/src/ATen/native/TypeProperties.cpp#L93
    
    AFAICT the effects are mainly visible for the unsigned byte type (the only unsigned type, besides bool) since the others degrade more or less gracefully.
    
    It's hard to re-use this logic as is in TensorIterator/TypeProperties, and it's complicated enough that it's not worth re-implementing in TE unless there's evidence that it matters for real models.
    
    Differential Revision: [D25489035](https://our.internmc.facebook.com/intern/diff/D25489035/)
    
    [ghstack-poisoned]
    bertmaher committed Dec 11, 2020
    Configuration menu
    Copy the full SHA
    89c94b9 View commit details
    Browse the repository at this point in the history
  2. clang-format on "[te] Ban uint8 tensors from fusion groups"

    uint8's expose all kind of corner cases in type promotion.  As an example, consider:
    ```
    >>> torch.tensor([1], dtype=torch.uint8).lt(-1)
    tensor([True])
    >>> torch.tensor([1], dtype=torch.uint8).lt(torch.tensor(-1))
    tensor([True])
    >>> torch.tensor([1], dtype=torch.uint8).lt(torch.tensor([-1]))
    tensor([False])
    ```
    the difference is how promotions involving scalars (or 0-dim tensors, which are treated like scalars) are prioritized compared to tensor dtypes.
    Per @eellison, the order is something like:
    1. Tensor FP types
    2. Scalar FP types
    3. Tensor Int types
    4. Scalar Int types
    
    The logic for this is here: https://github.com/pytorch/pytorch/blob/c73e97033a3aef97a5685588ea014d54a5cc11cc/aten/src/ATen/native/TypeProperties.cpp#L93
    
    AFAICT the effects are mainly visible for the unsigned byte type (the only unsigned type, besides bool) since the others degrade more or less gracefully.
    
    It's hard to re-use this logic as is in TensorIterator/TypeProperties, and it's complicated enough that it's not worth re-implementing in TE unless there's evidence that it matters for real models.
    
    Differential Revision: [D25489035](https://our.internmc.facebook.com/intern/diff/D25489035/)
    
    [ghstack-poisoned]
    bertmaher committed Dec 11, 2020
    Configuration menu
    Copy the full SHA
    31dee70 View commit details
    Browse the repository at this point in the history
  3. actually enable tests on "[te] Ban uint8 tensors from fusion groups"

    uint8's expose all kind of corner cases in type promotion.  As an example, consider:
    ```
    >>> torch.tensor([1], dtype=torch.uint8).lt(-1)
    tensor([True])
    >>> torch.tensor([1], dtype=torch.uint8).lt(torch.tensor(-1))
    tensor([True])
    >>> torch.tensor([1], dtype=torch.uint8).lt(torch.tensor([-1]))
    tensor([False])
    ```
    the difference is how promotions involving scalars (or 0-dim tensors, which are treated like scalars) are prioritized compared to tensor dtypes.
    Per @eellison, the order is something like:
    1. Tensor FP types
    2. Scalar FP types
    3. Tensor Int types
    4. Scalar Int types
    
    The logic for this is here: https://github.com/pytorch/pytorch/blob/c73e97033a3aef97a5685588ea014d54a5cc11cc/aten/src/ATen/native/TypeProperties.cpp#L93
    
    AFAICT the effects are mainly visible for the unsigned byte type (the only unsigned type, besides bool) since the others degrade more or less gracefully.
    
    It's hard to re-use this logic as is in TensorIterator/TypeProperties, and it's complicated enough that it's not worth re-implementing in TE unless there's evidence that it matters for real models.
    
    Differential Revision: [D25489035](https://our.internmc.facebook.com/intern/diff/D25489035/)
    
    [ghstack-poisoned]
    bertmaher committed Dec 11, 2020
    Configuration menu
    Copy the full SHA
    f5d0ab4 View commit details
    Browse the repository at this point in the history
  4. clean up test dtypes on "[te] Ban uint8 tensors from fusion groups"

    uint8's expose all kind of corner cases in type promotion.  As an example, consider:
    ```
    >>> torch.tensor([1], dtype=torch.uint8).lt(-1)
    tensor([True])
    >>> torch.tensor([1], dtype=torch.uint8).lt(torch.tensor(-1))
    tensor([True])
    >>> torch.tensor([1], dtype=torch.uint8).lt(torch.tensor([-1]))
    tensor([False])
    ```
    the difference is how promotions involving scalars (or 0-dim tensors, which are treated like scalars) are prioritized compared to tensor dtypes.
    Per @eellison, the order is something like:
    1. Tensor FP types
    2. Scalar FP types
    3. Tensor Int types
    4. Scalar Int types
    
    The logic for this is here: https://github.com/pytorch/pytorch/blob/c73e97033a3aef97a5685588ea014d54a5cc11cc/aten/src/ATen/native/TypeProperties.cpp#L93
    
    AFAICT the effects are mainly visible for the unsigned byte type (the only unsigned type, besides bool) since the others degrade more or less gracefully.
    
    It's hard to re-use this logic as is in TensorIterator/TypeProperties, and it's complicated enough that it's not worth re-implementing in TE unless there's evidence that it matters for real models.
    
    Differential Revision: [D25489035](https://our.internmc.facebook.com/intern/diff/D25489035/)
    
    [ghstack-poisoned]
    bertmaher committed Dec 11, 2020
    Configuration menu
    Copy the full SHA
    2861e19 View commit details
    Browse the repository at this point in the history

Commits on Dec 12, 2020

  1. fix test on "[te] Ban uint8 tensors from fusion groups"

    uint8's expose all kind of corner cases in type promotion.  As an example, consider:
    ```
    >>> torch.tensor([1], dtype=torch.uint8).lt(-1)
    tensor([True])
    >>> torch.tensor([1], dtype=torch.uint8).lt(torch.tensor(-1))
    tensor([True])
    >>> torch.tensor([1], dtype=torch.uint8).lt(torch.tensor([-1]))
    tensor([False])
    ```
    the difference is how promotions involving scalars (or 0-dim tensors, which are treated like scalars) are prioritized compared to tensor dtypes.
    Per @eellison, the order is something like:
    1. Tensor FP types
    2. Scalar FP types
    3. Tensor Int types
    4. Scalar Int types
    
    The logic for this is here: https://github.com/pytorch/pytorch/blob/c73e97033a3aef97a5685588ea014d54a5cc11cc/aten/src/ATen/native/TypeProperties.cpp#L93
    
    AFAICT the effects are mainly visible for the unsigned byte type (the only unsigned type, besides bool) since the others degrade more or less gracefully.
    
    It's hard to re-use this logic as is in TensorIterator/TypeProperties, and it's complicated enough that it's not worth re-implementing in TE unless there's evidence that it matters for real models.
    
    Differential Revision: [D25489035](https://our.internmc.facebook.com/intern/diff/D25489035/)
    
    [ghstack-poisoned]
    bertmaher committed Dec 12, 2020
    Configuration menu
    Copy the full SHA
    dbd3326 View commit details
    Browse the repository at this point in the history

Commits on Dec 14, 2020

  1. no uint8 on cuda test on "[te] Ban uint8 tensors from fusion groups"

    uint8's expose all kind of corner cases in type promotion.  As an example, consider:
    ```
    >>> torch.tensor([1], dtype=torch.uint8).lt(-1)
    tensor([True])
    >>> torch.tensor([1], dtype=torch.uint8).lt(torch.tensor(-1))
    tensor([True])
    >>> torch.tensor([1], dtype=torch.uint8).lt(torch.tensor([-1]))
    tensor([False])
    ```
    the difference is how promotions involving scalars (or 0-dim tensors, which are treated like scalars) are prioritized compared to tensor dtypes.
    Per @eellison, the order is something like:
    1. Tensor FP types
    2. Scalar FP types
    3. Tensor Int types
    4. Scalar Int types
    
    The logic for this is here: https://github.com/pytorch/pytorch/blob/c73e97033a3aef97a5685588ea014d54a5cc11cc/aten/src/ATen/native/TypeProperties.cpp#L93
    
    AFAICT the effects are mainly visible for the unsigned byte type (the only unsigned type, besides bool) since the others degrade more or less gracefully.
    
    It's hard to re-use this logic as is in TensorIterator/TypeProperties, and it's complicated enough that it's not worth re-implementing in TE unless there's evidence that it matters for real models.
    
    Differential Revision: [D25489035](https://our.internmc.facebook.com/intern/diff/D25489035/)
    
    [ghstack-poisoned]
    bertmaher committed Dec 14, 2020
    Configuration menu
    Copy the full SHA
    52899c3 View commit details
    Browse the repository at this point in the history
  2. fix scalar ops again on "[te] Ban uint8 tensors from fusion groups"

    uint8's expose all kind of corner cases in type promotion.  As an example, consider:
    ```
    >>> torch.tensor([1], dtype=torch.uint8).lt(-1)
    tensor([True])
    >>> torch.tensor([1], dtype=torch.uint8).lt(torch.tensor(-1))
    tensor([True])
    >>> torch.tensor([1], dtype=torch.uint8).lt(torch.tensor([-1]))
    tensor([False])
    ```
    the difference is how promotions involving scalars (or 0-dim tensors, which are treated like scalars) are prioritized compared to tensor dtypes.
    Per @eellison, the order is something like:
    1. Tensor FP types
    2. Scalar FP types
    3. Tensor Int types
    4. Scalar Int types
    
    The logic for this is here: https://github.com/pytorch/pytorch/blob/c73e97033a3aef97a5685588ea014d54a5cc11cc/aten/src/ATen/native/TypeProperties.cpp#L93
    
    AFAICT the effects are mainly visible for the unsigned byte type (the only unsigned type, besides bool) since the others degrade more or less gracefully.
    
    It's hard to re-use this logic as is in TensorIterator/TypeProperties, and it's complicated enough that it's not worth re-implementing in TE unless there's evidence that it matters for real models.
    
    Differential Revision: [D25489035](https://our.internmc.facebook.com/intern/diff/D25489035/)
    
    [ghstack-poisoned]
    bertmaher committed Dec 14, 2020
    Configuration menu
    Copy the full SHA
    f5bdf85 View commit details
    Browse the repository at this point in the history