Ist Gleitkomma mit einfacher Genauigkeit so schlecht?

8

Ich habe von der hohen perf Aufgabe an einigen der Pakete suchen Ansicht Umgang mit GPU - Berechnungen, und da die meisten GPU scheint eine Größenordnung stärker bei der Durchführung einfacher Genauigkeit arithmetics als DP sein diejenigen , ich habe mich gefragt:

  1. Warum gibt keines der Pakete dem Benutzer mehr Kontrolle über die Art der erforderlichen Präzision? Ich kann viele Anwendungen in Statistiken sehen, bei denen die SP-Arithmetik (dh die mit 7-stelliger Genauigkeit codierte Zahl) für den praktischen Gebrauch gut genug ist (wenn ich die damit verbundenen Gewinne überschätze, lassen Sie es mich wissen).
  2. Ist Python diesbezüglich flexibler? Wenn ja warum ? Ich verstehe nicht, warum das Fehlen eines "einzelnen" Typs in R die Aufnahme einer solchen Option (zusammen mit einer Warnung) in beispielsweise GPUtools oder Magma unmöglich machen würde (obwohl ich froh sein werde, falsch angezeigt zu werden).

PS: Ich denke speziell an Anwendungen, bei denen die Zahlen bereits dimensionsmäßig skaliert und zentriert sind (so dass Chebychevs Ungleichung verbindlich ist).

user603
quelle
2
Ich gebe zu, dass ich dadurch mystifiziert bin, obwohl ich mehrmals darum gekämpft habe, einen Sinn daraus zu ziehen: Gibt es hier eine Frage? "So schlecht" ist vage und hat keinen Referenten. Was genau möchten Sie verstehen oder herausfinden?
whuber
@ Whuber:> Meine Frage war schlecht formuliert. Es lag wahrscheinlich daran, dass es aus Unwissenheit entstanden war: Ich hatte einige Whitepaper über die Verwendung von GPU gelesen (obwohl sich leider herausstellte, dass dies nicht die R-Befehlsreferenz von GPUtools ist) und konnte nicht verstehen, warum alle Tests durchgeführt wurden in DP. Ich werde die Frage (und den Titel) neu formulieren.
user603

Antworten:

5

Aus der GPUtools-Hilfedatei geht hervor , dass dies useSingle=TRUEdie Standardeinstellung für die Funktionen ist.

ars
quelle
@kwak: Ich finde die Antwort oben hilfreich, aber sie beantwortet die gestellte Frage wirklich nicht - "Ist einfache Präzision so schlecht?" Vielleicht sollten Sie Ihre Frage umformulieren?
Csgillespie
@csgellespie: Sie sind völlig richtig. Ich werde diese Frage umformulieren, damit sie von zukünftigen Lesern verwendet werden kann. In der Tat war der Wortlaut besonders schlecht.
user603
4
  1. Denn vor GPUs gab es keinen praktischen Sinn für die Verwendung einzelner Reals. Sie haben nie zu viel Genauigkeit und Speicher ist normalerweise kein Problem. Und die Unterstützung von nur Doppel machte das R-Design einfacher. (Obwohl R das Lesen / Schreiben einzelner Reals unterstützt.)
  2. Ja, da Python mit kompilierten Sprachen besser kompatibel sein soll. Sie haben jedoch Recht, dass es den Wrappern von R-Bibliotheken möglich ist, eine In-Fly-Konvertierung durchzuführen (dies braucht natürlich Zeit, aber dies ist ein kleines Problem). Sie können versuchen, die Betreuer der GPU-Pakete per E-Mail zu benachrichtigen, um solche Änderungen anzufordern.

quelle
3

Ich nehme an, dass Sie mit GPU-Programmierung das Programmieren von NVIDIA-Karten meinen? In diesem Fall sind die zugrunde liegenden Codeaufrufe von R und Python an C / CUDA .


Der einfache Grund dafür, dass nur eine einzige Genauigkeit angeboten wird, ist, dass dies von den meisten GPU-Karten unterstützt wird.

Die neue nvidia Fermi- Architektur unterstützt jedoch doppelte Genauigkeit. Wenn Sie dieses Jahr eine NVIDIA-Grafikkarte gekauft haben, dann ist es wahrscheinlich eine Fermi. Auch hier sind die Dinge nicht einfach:

  • Sie erhalten einen leichten Leistungseinbruch, wenn Sie mit doppelter Genauigkeit kompilieren (ein Faktor von zwei, wenn ich mich richtig erinnere).
  • Auf den billigeren Karten Fermi-Karten hat nvidia absichtlich die doppelte Genauigkeit deaktiviert. Es ist jedoch möglich, dies zu umgehen und Programme mit doppelter Genauigkeit auszuführen. Das habe ich auf meiner GeForce GTX 465 unter Linux geschafft.

Die Beantwortung der Frage in Ihrem Titel "Ist die Genauigkeit mit einfacher Genauigkeit in Ordnung?" Hängt von Ihrer Bewerbung ab (Entschuldigung, Mist!). Ich nehme an, jeder verwendet jetzt doppelte Präzision, weil es keinen Leistungseinbruch mehr gibt.

Als ich mich mit GPUs beschäftigte, wurde die Programmierung plötzlich viel komplizierter. Sie müssen sich um Dinge kümmern wie:

  • verzerren und ordnen Sie Ihr Gedächtnis richtig.
  • # Threads pro Kernel.
  • Das Debuggen ist schrecklich - es gibt keine print-Anweisung in den GPU-Kernel-Anweisungen
  • Mangel an Zufallsgeneratoren
  • Mit einfacher Genauigkeit.
csgillespie
quelle
@ccgillespie:> Ich denke, meine Frage wurde möglicherweise schlecht formuliert. In dem Paket, das ich sehe (GPUtools, Magma), scheint die doppelte Genauigkeit als Standard verwendet zu werden (mit dem von Ihnen beschriebenen Leistungsverlust). Ich habe mich gefragt, warum einfache Präzision nicht als Option angeboten wird.
user603
@kwak: Die Werte mit doppelter Genauigkeit müssen vom Wrapper in einfache Genauigkeit konvertiert werden. Der Wrapper versuchte nur, hilfreich zu sein.
Csgillespie
@ccgillespie:> ja, aber es scheint, dass der Wrapper mit Leistungskosten verbunden ist, die den von Ihnen genannten Faktor 2 überschreiten (korrigieren Sie mich erneut, wenn ich mich irre) und in einigen Fällen keine konkreten Vorteile (ich kann mir viele Anwendungen in stat vorstellen Wäre SP FP Arithmetik wäre okay). Ich habe mich gefragt, ob es sinnvoll ist, nach einer Option zum Ausschalten des Wrappers zu fragen.
user603
2
@kwak: Ein Blick auf die GPUtools-Hilfedatei useSingle=TRUEscheint die Standardeinstellung in den Funktionen zu sein. Vermisse ich hier etwas?
Ars
@csgillespie: Denken Sie daran, bis vor kurzem die meisten nvidia Karten einfach nicht konnte mit doppelter Genauigkeit Berechnung tun. Der Faktor 2 Treffer ist das, was ich mit rohem C / CUDA-Code beobachtet habe. Ein Python / R-Wrapper kann dies am schlimmsten machen.
Csgillespie
1

Die überwiegende Mehrheit der im Umlauf befindlichen GPUs unterstützt nur Gleitkommazahlen mit einfacher Genauigkeit.

Bei der Titelfrage müssen Sie sich die Daten ansehen, die Sie verarbeiten, um festzustellen, ob eine einzelne Genauigkeit für Sie ausreicht. Oft werden Sie feststellen, dass Singles für> 90% der von Ihnen verarbeiteten Daten durchaus akzeptabel sind, für die letzten 10% jedoch spektakulär scheitern. Wenn Sie nicht auf einfache Weise feststellen können, ob Ihr bestimmter Datensatz fehlschlägt oder nicht, müssen Sie für alles die doppelte Genauigkeit verwenden.

Benjamin Chambers
quelle
Können Sie etwas näher darauf eingehen? Es scheint, dass ein iterativer Algorithmus (Matrixinvertierung, QR-Zerlegung) gut funktioniert. Ich bin auch gespannt, ob die Ungenauigkeit von SP bei Operationen mit größeren Arrays zu einem größeren Problem wird.
user603
Es besteht aus zwei Teilen: 1) Was repräsentieren die Daten? 2) Wie verarbeiten Sie die Daten? Wenn Sie sich Tausende von Datenpunkten aus einer medizinischen Studie ansehen, ist eine einfache Genauigkeit wahrscheinlich ausreichend, um das Wohlbefinden der Patienten zu quantifizieren, und ich bezweifle, dass Sie jemals das Doppelte benötigen würden. Die Geometrie hingegen kann je nach Maßstab und Zoom entweder eine einfache oder eine doppelte Genauigkeit erfordern. Die Berechnung der Flugbahn einer Sonde zum Saturn würde immer ein Doppel erfordern, da selbst kleine Fehler das Ergebnis drastisch beeinflussen könnten. Sie müssen sich die Daten ansehen und entscheiden, wie hoch Ihre Toleranzen sind.
Benjamin Chambers
1
Dies hängt von der numerischen Stabilität des verwendeten Algorithmus und der Konditionierung des Problems ab. Denken Sie daran, dass Sie mit doppelter Genauigkeit sowohl auf kleinere als auch auf größere Zahlen zugreifen können.
James
1
Nicht unbedingt kleinere oder größere Zahlen; Denken Sie daran, wir haben es mit Gleitkomma zu tun. Vielmehr können Sie größere und kleinere Zahlen im Verhältnis zueinander verwenden und dabei die signifikanten Ziffern beibehalten.
Benjamin Chambers
1

OK, eine neue Antwort auf eine alte Frage, aber jetzt noch relevanter. Die Frage, die Sie stellen, hat mit endlicher Präzision zu tun, normalerweise im Bereich der Signalanalyse und der experimentellen Mathematik.

Mit Floats mit doppelter Genauigkeit (DP) können wir so tun, als gäbe es keine Probleme mit endlicher Präzision, genau wie bei den meisten mathematischen Problemen der realen Welt. In der experimentellen Mathematik gibt es kein Vortäuschen.

SP-Floats (Single Precision) zwingen uns, Quantisierungsrauschen zu berücksichtigen. Wenn unsere Modelle für maschinelles Lernen Rauschen wie neuronale Netze (NN), Faltungsnetze (CNN), Restnetze (ResN) usw. von Natur aus zurückweisen, liefert SP meistens ähnliche Ergebnisse wie DP.

Bei Floats mit halber Genauigkeit (HP) (jetzt in Cuda Toolkit 7.5 unterstützt) müssen Quantisierungseffekte (Rauschen und Rundungen) berücksichtigt werden. Höchstwahrscheinlich werden wir bald sehen, dass HP in den gängigen Toolkits für maschinelles Lernen verfügbar ist.

Es gibt neuere Arbeiten, um Berechnungen mit geringerer Genauigkeit in Floats sowie Zahlen mit fester Genauigkeit zu erstellen . Die stochastische Rundung hat die Konvergenz ermöglicht, mit CNNs zu verfahren, während die Lösung ohne sie divergiert. Diese Artikel helfen Ihnen dabei, die Probleme bei der Verwendung von Zahlen mit endlicher Genauigkeit beim maschinellen Lernen besser zu verstehen.

So beantworten Sie Ihre Fragen:

SP ist nicht so schlecht. Wie Sie betonen, ist es doppelt so schnell, aber Sie können auch mehr Ebenen in den Speicher einfügen. Ein Bonus besteht darin, Overhead zu sparen, indem Daten auf und von der GPU abgerufen werden. Die schnelleren Berechnungen und der geringere Overhead führen zu geringeren Konvergenzzeiten. Trotzdem ist HP bei einigen Problemen in einigen Teilen des Netzwerks besser und in anderen nicht.

  1. Es scheint mir, dass viele der Toolkits für maschinelles Lernen SPs und DPs verarbeiten. Vielleicht wird jemand anderes mit einem breiteren Erfahrungsspektrum mit den Toolkits sein Nickel hinzufügen.
  2. Python unterstützt das, was das GPU-Toolkit unterstützt. Sie möchten keine Python-Datentypen verwenden, da Sie dann ein interpretiertes Skript auf der CPU ausführen.

Beachten Sie, dass der Trend in neuronalen Netzen jetzt zu sehr tiefen Schichten geht, mit Läufen von mehr als einigen Tagen, die auf den schnellsten GPU-Clustern üblich sind.

r3mnant
quelle