Portable remainder kernel: wrong sign for integers and float64 rounded to float
Les mainteneurs répondent en général sous 1 jour
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 82/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Domaine
- backend, machine-learning
Piste de recherche
Lisez kernels/portable/cpu/util/math_util.h et le fichier op_remainder_test.cpp existant. Vérifiez les surcharges pour les entiers et les nombres à virgule flottante en fonction des cas de signe et de précision indiqués dans l’issue, y compris la forme scalaire. Le travail est terminé lorsque les tests couvrent ces cas et que les kernels portables correspondent aux résultats de PyTorch.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
🐛 Describe the bug
The portable remainder kernels give results that differ from PyTorch in two cases.
- Integers with mixed signs. ATen's
remaindertakes the sign of the divisor (-7 % 3 == 2), but for integer typesutils::remainder_overrideinkernels/portable/cpu/util/math_util.hreturnsa % b, which takes the sign of the dividend (-1). The floating-point overload already addsbin this case, as the comment above both overloads describes. The integer one doesn't. - float64 loses precision. The floating-point overload stores
std::fmod(a, b)in afloat, sodoubleresults are rounded to float precision.
import torch
from executorch.exir import to_edge
from executorch.runtime import Runtime
class Rem(torch.nn.Module):
def forward(self, a, b):
return torch.remainder(a, b)
def run(a, b):
prog = to_edge(torch.export.export(Rem(), (a, b))).to_executorch()
return Runtime.get().load_program(prog.buffer).load_method("forward").execute([a, b])[0]
a = torch.tensor([7, -7, 7, -7])
b = torch.tensor([3, 3, -3, -3])
print(torch.remainder(a, b).tolist(), run(a, b).tolist())
# [1, 2, -2, -1] [1, -1, 1, -1]
a = torch.tensor([123456789.123456789], dtype=torch.float64)
b = torch.tensor([1000.0], dtype=torch.float64)
print(torch.remainder(a, b).item(), run(a, b).item())
# 789.1234567910433 789.1234741210938
The integer case affects int8, int32 and int64, and remainder.Scalar too: torch.remainder(x, 3) gives -1 for x = -1 instead of 2. With the XNNPACK partitioner the result is the same, since these ops run on the portable kernel. A model that uses Python's % on integer tensors (for example to wrap positions or bucket ids) gets different values after export.
The existing op_remainder_test.cpp only covers 46 % 4. I have a fix with tests and will open a PR.
Versions
executorch 1.5.1 (math_util.h is the same on main at f2575be), torch 2.14.1+cpu, Python 3.12, Linux x86_64 (WSL2).
cc @larryliu0820 @manuelcandales @JakeStevens
- Langage dominant
- Python
- Étoiles
- 5.1k
- Forks
- 1.2k
- Merge moyen
- 2 j 8 h
- PR mergées (30 j)
- 610
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de pytorch/executorch
-
enhancement triaged
Difficulté 2/5 Une demi-journée Accessibilité débutants 68/100
pytorch/executorch#21640 ·
Les mainteneurs répondent en général sous 1 jour
-
Feedback about ToolsOuverteinvalid module: doc
Difficulté 3/5 1-2 jours Accessibilité débutants 35/100
pytorch/executorch#23706 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Portable floor_divide returns non-whole numbers for floats and wrong values for a zero divisorPeut-être pris @JakeStevens l’a pris aujourd’hui. Ouvertebug module: kernels
Difficulté 3/5 1-2 jours Accessibilité débutants 52/100
pytorch/executorch#23684 · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
torch.var_mean and torch.std_mean fail in to_edge: aten.var_mean.correction is not core ATen and has no core decompositionPeut-être pris @usmanmateen l’a pris aujourd’hui. Ouvertebug module: exir triaged
Difficulté 3/5 1-2 jours Accessibilité débutants 58/100
pytorch/executorch#23680 · 2 personnes assignées ·
Les mainteneurs répondent en général sous 1 jour
-
Prompts of max_seq_len tokens fail to prefill: export_llm bounds the KV-cache token input at max_seq_len - 1 but publishes get_max_seq_len = max_seq_lenPeut-être pris @alpharomercoma l’a pris il y a 3 jours. Ouvertebug module: extension module: llm triaged
Difficulté 3/5 1-2 jours Accessibilité débutants 20/100
pytorch/executorch#23678 ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de pytorch/executorch
Issues similaires
-
bug difficulty:2 good first issue help wanted
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
MakazhanAlpamys/Soup#1865 ·
Les mainteneurs répondent en général sous 1 jour
-
area: agents area: docs good first issue
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
openapi/gknowledge#23 ·
-
useless-suppression reported for deprecated-* messages that should be exemptPeut-être pris @adityasinha-ghub l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
pylint-dev/pylint#11656 ·
Les mainteneurs répondent en général sous 1 jour
-
area:provisioning effort:S priority:P2 provider:local-libvirt risk:daytime-only status:in-progress type:bug
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
randomparity/kdive#3203 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
get() for StrEnumPeut-être pris @FeJo5952 l’a pris aujourd’hui. Ouvertegood first issue
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
collective/icalendar#1921 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour