🐛 [Bug] torch.fmod returns a tiny value with the wrong sign when the float quotient rounds up

Đang mở Phù hợp với người mới
#4,860 0 bình luận 0 reaction 1 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 3 ngày

@micwill755 đang làm issue này rồi.

Từ ngày 10/11/2026.

  • #4861 của @usmanmateen — đang mở

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
70/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
python
Lĩnh vực
compilers

Hướng nghiên cứu

Bắt đầu từ impl.elementwise.fmod và hàm hỗ trợ trunc_div trong py/torch_tensorrt/dynamo/conversion/impl/elementwise/ops.py, rồi kiểm tra cách thương số dấu phẩy động được làm tròn xuống trước khi tính phần dư. Chạy script tái hiện từ issue trên máy có CUDA và so sánh với torch.fmod cho 4.2 / 1.4 và trường hợp 0.1 bị bọc lại. Hoàn thành khi kết quả fmod với số thực khớp PyTorch về dấu và giá trị, đồng thời hành vi với số nguyên không đổi.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

Bug Description

torch.fmod(a, b) on floating point tensors returns a tiny value with the wrong sign when a / b rounds up to a whole number. In float32, torch.fmod(4.2, 1.4) is 1.3999999 in PyTorch and -1.19e-07 in Torch-TensorRT. The result of fmod always has the sign of a, so a negative result for a positive a is never right. It shows up when wrapping values by a period: fmod(x, 0.1) for x = 0.1, 0.2, ..., 10.0 differs from PyTorch for 43 of the 100 values.

impl.elementwise.fmod in py/torch_tensorrt/dynamo/conversion/impl/elementwise/ops.py computes input - trunc_div(input, other) * other, and trunc_div takes FLOOR_DIV of |input| and |other|. For floats, the division is rounded before it's floored. In float32, 4.2 / 1.4 is 2.99999991, which rounds to 3.0, so the quotient comes out as 3 instead of 2 and input - 3 * other is just below zero. PyTorch computes fmod exactly and gets 2.

torch.remainder (%) gives the right result for these inputs.

To Reproduce

import torch
import torch_tensorrt


class Fmod(torch.nn.Module):
    def forward(self, a, b):
        return torch.fmod(a, b)


def trt(model, *args):
    return torch_tensorrt.compile(model.eval().cuda(), ir="dynamo", inputs=list(args), min_block_size=1)(*args)


a = torch.tensor([4.2, -4.2, 0.7, 5.0], device="cuda")
b = torch.tensor([1.4, 1.4, 0.1, 3.0], device="cuda")
print(Fmod()(a, b).tolist())
print(trt(Fmod(), a, b).tolist())

# Wrapping multiples of 0.1 by 0.1
x = torch.arange(1, 101, device="cuda") * 0.1
period = torch.full_like(x, 0.1)
expected, got = Fmod()(x, period), trt(Fmod(), x, period)
print((got - expected).abs().gt(1e-3).sum().item(), "of", x.numel(), "differ")

Output:

[1.3999998569488525, -1.3999998569488525, 0.09999997913837433, 2.0]
[-1.1920928955078125e-07, 1.1920928955078125e-07, -2.2351741790771484e-08, 2.0]
43 of 100 differ

Expected behavior

The same results as PyTorch, which always have the sign of a.

Environment

  • Torch-TensorRT Version: 2.14.0 (pip). fmod and trunc_div are the same on main.
  • PyTorch Version: 2.14.1+cu130
  • CPU Architecture: x86_64
  • OS: Ubuntu 26.04 (WSL2)
  • How you installed PyTorch: pip
  • Python version: 3.12
  • CUDA version: 13.0 (TensorRT 11.1.0.106)
  • GPU models and configuration: NVIDIA GeForce RTX 5060 Ti, driver 596.49

Additional context

I found this with torchparity, a tool I'm writing that runs PyTorch ops through converters and compares the results with eager PyTorch. I have a fix with tests and can open a PR. When the result has the sign opposite to input, it adds |other| back with the sign of input. Integer inputs are unchanged.

#4786 changes trunc_div for large integers and doesn't cover this.

Ngôn ngữ chính
Python
Star
3k
Fork
421
Merge trung bình
4 ngày 7 giờ
Pull request đã merge (30 ngày)
62

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của pytorch/TensorRT

Tất cả issue của pytorch/TensorRT

Issue tương tự

Thêm issue về Python

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.