Parallel Scientific Computation Software-Entwicklungssprache?


18

Ich möchte eine parallele wissenschaftliche Berechnungssoftware von Grund auf neu entwickeln. Ich möchte ein paar Gedanken darüber haben, welche Sprache ich anfangen soll. Das Programm beinhaltet das Lesen / Schreiben von Daten in TXT-Dateien und das parallele Ausführen umfangreicher Berechnungen mit vielen LU-Faktorisierungen und der Verwendung sparsamer linearer Löser. Die möglichen Lösungen, an die ich dachte, sind Fortran 2003/2008 mit OpenMP oder Co-Array, C ++ mit OpenMP Cilk + oder TBB, Python. Alle anderen dokumentierten Vorschläge sind willkommen! Ich kenne C, Fortran und Java (in dieser Reihenfolge) sehr gut. Ich habe ein paar Skripte in Python geschrieben, aber grundlegende Dinge.

Ich weiß, dass Fortran sehr schnell ist, aber schwer zu warten und zu parallelisieren. C ++ soll langsam sein, es sei denn, Sie verwenden externe Bibliotheken usw. Python gefällt mir, aber ist es realistisch, eine vollständige Software auf industrieller Ebene zu schreiben?

Die Software muss in der Lage sein, große Datenmengen zu verarbeiten und mit wissenschaftlichen Berechnungen effektiv umzugehen. Die Leistung ist von entscheidender Bedeutung.

Für den Hintergrund habe ich bereits eine funktionierende Software in Fortran geschrieben. Viele Leute waren über viele Jahre an der Entwicklung beteiligt und der Code ist wirklich schmutzig. Das Verwalten und Parallelisieren des Codes hat sich als Alptraum erwiesen, und ich denke über Alternativen nach.

Petros


5
Als C ++ Wonk würde ich Fortran nicht als schwer zu pflegend bezeichnen. Die Wartbarkeit ist größtenteils an bewährte Praktiken gebunden, nicht an die Wahl der Sprache. Die Langsamkeit von C ++ ist überverkauft. Außerdem würde ich empfehlen, dass Sie diesen Beitrag erweitern, um Ihre Anforderungen an Datengröße und Bearbeitungszeit zu beschreiben. Ich habe gesehen, dass "groß" um 9 oder 10 Größenordnungen variiert, je nachdem, mit wem ich spreche.
Bill Barth

@BillBarth Das Problem mit dem vorhandenen Fortran-Code ist, dass drei Personen mit unterschiedlichen Methoden beteiligt waren. Ich komme aus C, einem Typ aus F77 und einem anderen aus Matlab. Die Daten sind nicht zuordenbar und für das System der größten Größe (ich war in letzter Zeit beteiligt) dimensioniert. Der Code war in der Lage, ein System mit 72000 Differential- und 74000 algebraischen Gleichungen über einen Zeithorizont von 240 Sekunden in 350 Sekunden (abgelaufene Zeit) zu simulieren. Ich habe das auf 170s reduziert, indem ich OpenMP zum Parallelisieren verwendet habe. Jetzt muss ich mehrere Fälle parallel ausführen (um die Sicherheitsprüfung durchzuführen).
Electrique

4
@BillBarth ist zu bescheiden im Verkauf seiner C ++ - Fähigkeiten, aber er ist auch zu großzügig in seiner Aussage, dass die "Langsamkeit von C ++ überverkauft ist". In scicomp.stackexchange.com gab es eine Reihe von C ++ - und Fortran-Threads, die genau diese Frage diskutierten, und die allgemeine Schlussfolgerung war, dass es einfach nicht mehr wahr ist, als C ++ in fast allen Fällen langsamer als Fortran ist. Ich persönlich denke, dass es heute ein urbaner Mythos sein könnte. Was ist sehr wahr ist , dass , wenn Sie in die Wartbarkeit des Codes Rechnung zu tragen, dann Fortran nicht sehr gut heute nicht ergehen.
Wolfgang Bangerth

2
@BillBarth und andere, wenn Sie weiterhin die allgemeinen Vorzüge von Fortran, C ++ und anderen Sprachen besprechen möchten , bringen Sie es bitte in den scicomp-Chatraum und @ zu jedem, den Sie speziell ansprechen möchten .
Aron Ahmadia

1
@AronAhmadia: Ah, komm schon, ich muss Jed so viel sagen ;-) (Jed: ein andermal. In unserem Fall keine STL für spärliche Matrizen, aber viel davon in den adaptiven Mesh-Datenstrukturen.)
Wolfgang Bangerth

Antworten:


19

Lassen Sie mich versuchen, Ihre Anforderungen aufzuschlüsseln:

  • Wartbarkeit
  • Lesen / Schreiben von Textdaten
  • Starke Schnittstellen / Fähigkeit für LU-Faktorisierungen
  • Sparsame lineare Löser
  • Leistung und Skalierbarkeit für große Datenmengen

Aus dieser Liste würde ich die folgenden Sprachen betrachten:

C, C ++, Fortran, Python, MATLAB, Java

Julia ist eine vielversprechende neue Sprache, aber die Community formiert sich immer noch darum herum und sie wurde in keinen größeren neuen Codes implementiert.

Lesen / Schreiben von Textdaten

Dies ist in jeder Programmiersprache leicht zu erreichen. Stellen Sie sicher, dass Sie Ihren E / A-Zugriff in geeigneter Weise puffern und zusammenführen, und dass alle Sprachen, die Sie berücksichtigen sollten, eine gute Leistung erbringen. Vermeiden Sie die Stream-Objekte in C ++, es sei denn, Sie wissen, wie Sie sie performant verwenden.

Starke Schnittstellen / Fähigkeit für LU-Faktorisierungen

Wenn Sie dichte LU-Faktorisierungen durchführen, sollten Sie LAPACK oder ScaLAPACK / Elemental für die parallele Funktionalität verwenden. LAPACK und ScaLAPACK sind in Fortran geschrieben, Elemental ist in C ++ geschrieben. Alle drei Bibliotheken sind performant und gut unterstützt und dokumentiert. Sie können aus jeder Sprache, die Sie berücksichtigen sollten, eine Schnittstelle zu ihnen herstellen.

Sparsame lineare Löser

Die führenden frei verfügbaren linearen Sparse-Löser sind fast alle über PETSc erhältlich , das in C geschrieben ist und gut dokumentiert und unterstützt wird. Sie können aus jeder Sprache, die Sie berücksichtigen sollten, eine Schnittstelle zu PETSc herstellen.

Leistung und Skalierbarkeit für große Datenmengen

Die einzigen Paradigmen für die parallele Programmierung, die Sie erwähnen, sind Shared Memory-basierte, was bedeutet, dass Sie keinen MPI-basierten Ansatz (Message-Passing) für die verteilte Speicherberechnung in Betracht ziehen. Nach meiner Erfahrung ist es mit einer Lösung mit verteiltem Speicher viel einfacher, Code zu schreiben, der weit über ein Dutzend Kerne skaliert. Fast alle "Universitätscluster" basieren heutzutage auf MPI, große Shared-Memory-Maschinen sind teuer und dementsprechend selten. Sie sollten MPI für Ihre Herangehensweise in Betracht ziehen, aber mein Rat gilt unabhängig von dem von Ihnen gewählten Programmierparadigma.

In Bezug auf die Leistung auf dem Knoten ist es in Fortran am einfachsten, eine gute serielle Leistung zu erzielen, wenn Sie selbst numerische Routinen schreiben. Wenn Sie ein wenig Erfahrung mit C, C ++ oder Python haben, können Sie eine sehr vergleichbare Leistung erzielen (C und C ++ sind sogar mit Fortran, Python und MATLAB innerhalb von 25% des Zeitaufwands ohne großen Aufwand tot). MATLAB tut dies durch einen JIT-Compiler und eine sehr gute lineare Algebra-Expressivität. Sie müssen wahrscheinlich entweder Cython, numpy, numexpr oder eingebettete numerische Kernel verwenden, um die beanspruchte Leistung von Python zu erhalten. Ich kann die Leistung von Java nicht kommentieren, da ich die Sprache nicht sehr gut kenne, aber ich vermute, dass es nicht weit von Pythons ist, wenn es von einem Experten geschrieben wird.

Ein Hinweis zu Schnittstellen

Ich hoffe, ich habe Sie überzeugt, dass Sie in jeder der von Ihnen in Betracht gezogenen Programmiersprachen alles tun können, was Sie wollen. Wenn Sie Java verwenden, sind die C-Schnittstellen eine kleine Herausforderung. Python bietet eine hervorragende Unterstützung für C- und Fortran-Interfaces durch ctypes, Cython und f2py. LAPACK ist bereits verpackt und über scipy erhältlich. MATLAB verfügt über alle Funktionen, die Sie in seinen nativen Bibliotheken benötigen, ist jedoch nicht leicht skalierbar oder auf Clustern besonders einfach auszuführen. Java kann C- und Fortran-Schnittstellen mit dem JNI unterstützen , ist jedoch nicht häufig in Clustern und in paralleler Software für wissenschaftliches Rechnen zu finden.

Wartbarkeit

Vieles davon hängt vom persönlichen Geschmack ab, aber der allgemeine Konsens über die Wartbarkeit besteht darin, dass Sie die Anzahl der Codezeilen in Ihrer Software minimieren, modularen Code mit genau definierten Schnittstellen schreiben und für Computersoftware bereitstellen möchten Tests, die die Richtigkeit und Funktionalität der Implementierung überprüfen.

Empfehlung

Ich persönlich hatte viel Glück mit Python und empfehle es für viele Computerprojekte. Ich denke, Sie sollten es für Ihr Projekt stark in Betracht ziehen. Python und MATLAB sind wahrscheinlich die ausdrucksstärksten Sprachen für das wissenschaftliche Rechnen. Sie können Python auf einfache Weise mit jeder anderen Programmiersprache verbinden. Mit f2py können Sie Ihre aktuelle Fortran-Implementierung verpacken und die gewünschten Teile in Python stückweise neu schreiben, während Sie sicherstellen, dass die Funktionalität erhalten bleibt. Zu diesem Zeitpunkt würde ich eine Kombination der offiziellen Python 2.7-Implementierung mit scipy empfehlen . Mit diesem Stack können Sie ganz einfach über die frei verfügbare Enthought Python Distribution loslegen .

Sie können das meiste auch in C, C ++ oder Fortran tun. C und C ++ sind sehr ansprechende Sprachen für professionelle Entwickler mit viel Erfahrung, stellen jedoch häufig neue Entwickler in Frage und sind in diesem Sinne wahrscheinlich keine gute Idee für einen akademischeren Code. Fortran und MATLAB sind im akademischen Bereich sehr beliebt, sie sind jedoch schwach in Bezug auf die erweiterten Datenstrukturen und die Expressivität, die Python bietet (denken Sie beispielsweise an ein Python-Diktat-Objekt).

Verwandte Fragen:


1
Eine sehr gut dokumentierte, allumfassende Antwort. Unter Fortran benutze ich viel Lapack. Ich werde einen Blick auf Python werfen und versuchen, zunächst meinen Fortran-Code zu verpacken und langsam zu Python zu wechseln. Das einzige, was mir Angst macht, ist der Zeitaufwand von 25%, den ich haben könnte. Aber wenn es den Vorteil eines aussagekräftigeren Codes und einer besseren parallelen Datenverarbeitung bietet, werde ich es versuchen. Ich erwähnte Shared Memory nur, weil die Software derzeit auf 2,4,8,24,48-Core-Shared-Memory-Computern von Forschern der Uni unter Windows und Linux interaktiv ausgeführt wird (Daten ändern und erneut ausführen).
Elektrique

3
Ich weiß nicht, wie Sie den Anspruch auf 25% Overhead für in Python geschriebene numerische Kernel erheben können. Reine numerische Python-Kernel sind oft um das 100-fache langsamer als C. Numpy und numexpr können mit bestimmten Ausdrücken gute Arbeit leisten, aber damit werden in Python kaum neue numerische Kernel geschrieben. Cython kann einige Dinge schnell erledigen, aber normalerweise nicht innerhalb von 25% von C. Python ist eine feine "Klebesprache", aber ich denke, Aron verkauft sie als Allzwecklösung für leistungskritische Aufgaben.
Jed Brown

I / O ist die Schwachstelle von Fortran, da Fortran viel Struktur in I / O erfordert. Meine Erfahrungen aus zweiter Hand im Gespräch mit Kollegen in meinem Labor, die mit Cython arbeiten, stimmen mit den Aussagen von Jed über Cython überein. Mindestens einer von ihnen schreibt handgestimmtes C, um das Cython für leistungsintensive Aufgaben zu ersetzen, und dann glaube ich, dass die Leistung von Python, das den resultierenden C-Code aufruft, näher an Arons Behauptung liegt. Wenn Sie PETSc und Python erwähnen, können Sie auch petsc4py erwähnen. Das letzte Mal, dass ich es gesehen habe (das war vor ein paar Jahren), gab es keine guten MPI-Schnittstellen für Java. Hat sich das geändert?
Geoff Oxberry

@GeoffOxberry: Die Java MPI-Bindungen existieren, wurden jedoch seit fast einem Jahrzehnt nicht mehr aktualisiert. Ich halte ihren Status für zweifelhaft. Fortran verfügt über zahlreiche E / A-Optionen, die sehr schnell ausgeführt werden können. Ich würde empfehlen, Parallel HDF5 (und HDF5 im Allgemeinen) zu erkunden. Wenn E / A wirklich dominant ist (mehr als 50% der Laufzeit), sind möglicherweise ernsthaftere Maßnahmen erforderlich. Andernfalls lohnt sich jedoch wahrscheinlich die Qualität und Portabilität einer HDF-ähnlichen Schnittstelle.
Bill Barth

@ BillBarth: Ich muss das überprüfen. Mein Kommentar zu Fortran I / O stammt aus der Sicht von jemandem, der mir einmal empfohlen hat, einen Parser für Eingabedateien in Fortran zu schreiben. Durch die Durchsetzung vieler Strukturen ist dies möglich, aber ich habe in Fortran (um nur einige Beispiele zu nennen) einfach und häufig verwendete Regex-Parser- oder XML-Parser-Bibliotheken nicht gesehen. Dafür gibt es einen guten Grund: Wir sind die einzigen, die Fortran mehr verwenden. Vielleicht denken wir an verschiedene Anwendungsfälle.
Geoff Oxberry

2

Neben der sehr umfassenden Antwort von Aron möchte ich einen Blick auf die verschiedenen Themen auf scicomp.stackexchange werfen, die sich mit der Frage befassten, welche Programmiersprache verwendet werden sollte - sowohl in Bezug auf die Programmgeschwindigkeit als auch auf die Frage, wie einfach oder schwierig Es soll Software in diesen Sprachen schreiben und warten.

Abgesehen von dem, was dort geschrieben steht, möchte ich einige Anmerkungen machen:

(i) Sie nehmen Co-Array-Fortran in Ihre Liste auf. Meines Wissens nach ist die Anzahl der Compiler, die es tatsächlich unterstützen, sehr gering - und meine tatsächlich Null. Der am weitesten verbreitete Fortran-Compiler ist GNU gfortran, und während die aktuellen Entwicklungsquellen eine Untergruppe von Co-Arrays analysieren, glaube ich, dass er keines davon unterstützt (dh er akzeptiert die Syntax, implementiert aber keine der Semantiken). . Dies ist natürlich eine allgemeine Beobachtung über neuere Fortran-Standards: Die Verzögerung, mit der Compiler tatsächlich neue Standards unterstützen, wird in mehreren Jahren gemessen. Compiler haben Fortran 2003 in den letzten Jahren erst vollständig implementiert und unterstützen Fortran 2008 nur teilweise. Dies sollte Sie nicht davon abhalten, etwas davon zu verwenden, wenn Sie einen Compiler haben, der unterstützt, was Sie verwenden.

(ii) Dasselbe gilt sicherlich für C ++ / Cilk +: Ja, Intel entwickelt dies auf einem Zweig von GCC, aber es ist in keinem der GCC-Releases verfügbar und wird wahrscheinlich für eine Weile nicht verfügbar sein. Sie können davon ausgehen, dass es noch mindestens 2-3 Jahre dauern wird, bis Sie Cilk + mit den auf typischen Linux-Computern installierten GCC-Versionen finden.

(iii) C ++ / TBB ist eine andere Geschichte: Das TBB gibt es schon eine Weile, es hat eine sehr stabile Oberfläche und ist mit den meisten C ++ - Compilern kompatibel, die es in den letzten Jahren gab (sowohl unter Linux als auch unter Windows). . Wir haben es in deal.II bereits seit mehreren Jahren mit guten Ergebnissen eingesetzt. Es gibt auch ein sehr gutes Buch darüber.

(iv) Ich habe meine ganz eigene Meinung zu OpenMP, nämlich dass es eine Lösung auf der Suche nach einem Problem ist. Es eignet sich gut zum Parallelisieren der inneren Schleifen, was bei sehr regelmäßigen Datenstrukturen von Interesse sein kann. Aber es ist selten, was Sie tun möchten, wenn Sie etwas parallelisieren müssen - denn was Sie wirklich tun möchten, ist, die äußeren Schleifen zu parallelisieren . Und dafür sind Lösungen wie TBB viel bessere Lösungen, da sie die Mechanismen der Programmiersprache nutzen, anstatt zu beschreiben, was außerhalb der Sprache geschieht (über #pragmas) und so, dass Sie keinen Zugriff auf Thread-Handles haben , Ergebnisstatusanzeigen usw. in Ihrem Programm.

(v) Wenn Sie experimentieren, können Sie auch einen Blick auf die neuen Programmiersprachen werfen, die für die parallele Programmierung und insbesondere für Aufgaben wie die von Ihnen beschriebenen entwickelt wurden. Es gibt im Wesentlichen zwei, die ich mir ansehen würde: X10 und Chapel . Ich habe nette Tutorials über Chapel gesehen, und es scheint gut gestaltet zu sein, obwohl beide heutzutage natürlich auch Insellösungen sind.


Intel behauptet, in seine aktuellen Compiler ein parallelisiertes (verteiltes Speicher-) Co-Array-Fortran eingebaut zu haben. Wir prüfen dies bei TACC, aber ich habe noch nichts zu berichten. Cray hat auch eine Implementierung in seinem Compiler, die jedoch nur auf einer kleinen Anzahl von Computern weltweit verfügbar ist. Ich glaube nicht, dass irgendjemand den vollständigen Fortran 2008-Standard in Bezug auf Co-Arrays implementiert, aber einige Compiler bieten mehr als nur Unterstützung. Cilk + ist natürlich auch mit den Intel-Compilern erhältlich, aber es ist wahrscheinlich noch nicht ratsam, darauf angewiesen zu sein.
Bill Barth

Der Fortran 2008-Standard wurde erst Ende 2010 genehmigt. Es wird also einige Jahre dauern, bis CAF allgemein verfügbar sein wird. G95 hatte tatsächlich eine (nicht freie) Implementierung, ist aber nicht mehr entwickelt (der Entwickler war PathScale beigetreten).
Stali

Das meiste von g95 ist letztendlich in gfortran gelandet, aber es kann sein, dass CAF nicht dazu gehört.
Wolfgang Bangerth

Ich glaube, der Intel-Compiler bietet eine gute Unterstützung für Co-Array. Sie haben es mit mpiexec gebaut. Es wird nicht meine erste Wahl sein. Das Schöne ist, dass die gleiche Implementierung auf gemeinsam genutztem und verteiltem Speicher ausgeführt werden kann (ich habe einige Tests durchgeführt). Mit opteron Shared-Memory-Prozessoren, die 60 Kerne zu wirklich vernünftigen Preisen erreichen, möchte ich zuerst meine Shared-Memory-Optionen sehen.
Electrique

2

Im Allgemeinen würde ich, wenn Sie dieses Softwareprojekt wirklich ernst nehmen, eine vollständige Neuschreibung in der Sprache vorschlagen, in der Sie sich am wohlsten fühlen. Es hört sich so an, als würden Sie die Arbeit alleine erledigen, und daher erzielen Sie die besten Ergebnisse in der Sprache, in der Sie sich am wohlsten fühlen.

Im Hinblick auf die Parallelität möchte ich Sie jedoch dazu ermutigen, etwas über den Tellerrand hinaus zu denken. OpenMP hat seine Stärken, steckt jedoch in der Denkweise, hier und da einen sequentiellen Code zu verwenden und Parallelität herzustellen. Dasselbe gilt im Wesentlichen für Intel TBB.

Cilk ist definitiv ein Schritt in die richtige Richtung, dh es zwingt Sie dazu, Ihr Problem / Ihre Lösung in einem von Natur aus parallelen Aufbau zu überdenken. Was ich jedoch nicht mag, ist, dass es eine weitere Sprache ist . Da nur grobe Rückschlüsse auf die Beziehungen zwischen parallelen Tasks gezogen werden können, kann der Scheduler auch recht konservativ sein und sich bei bestimmten Problemen möglicherweise nicht gut skalieren lassen.

Die gute Nachricht ist jedoch, dass Sie, wenn Sie Ihre Implementierung ernst nehmen, das tun können, was Cilk tut, z. B. Ihr Problem in eine Reihe von voneinander abhängigen Aufgaben umschreiben und diese auf eine Reihe von Prozessoren verteilen. Kerne, ganz alleine, entweder mit Hilfe von Pthreads oder durch Missbrauch von OpenMP, um Prozesse zu erzeugen. Ein schönes Beispiel dafür ist der in der PLASMA- Bibliothek verwendete QUARK- Scheduler . Ein schöner Vergleich der Leistung mit Cilk ist hier zu finden .


Ich werde mir die vorgeschlagenen Links ansehen. Das Vergleichspapier ist sehr schön! Vielen Dank! Ich habe über PThreads nachgedacht, möchte aber, dass das Programm plattformübergreifend ist. Nach meinem Wissen haben pthreads Probleme unter Windows (falsch?).
Electrique

@ p3tris: Das "p" in pthreads ist für POSIX, es ist also so portabel wie es nur sein kann. Es gibt einige kompatible Windows-Implementierungen wie pthreads-win32oder innerhalb des cygwinProjekts.
Pedro

Basierend auf stackoverflow.com/q/2797690/801468 sehe ich, dass eine Menge Material benötigt wird, um es zu verwenden. Da ich kein Programmierer bin, würde ich es vorziehen, mich an etwas Getesteteres zu halten.
Electrique

2

In den obigen Kommentaren wurde Coarray Fortran nur wenig diskutiert. Derzeit sieht die Unterstützung von Coarrays in Compilern meines Wissens nach ungefähr wie folgt aus:

  • Cray verfügt über einen Compiler, der mindestens die grundlegenden Coarray-Funktionen unterstützt. Ich habe es verwendet, um Code zu schreiben, der "lehrreich" sein sollte, aber ich würde sagen, dass Sie echten Code in coarray fortran schreiben können. Die Syntax und Konzepte sind meist viel einfacher als bei MPI, aber wie immer gibt es viele Fallen, und die Fallen unterscheiden sich von MPI.
  • Intel fortran bietet Coarray-Unterstützung, die auf der MPI-Bibliothek aufbaut. Angeblich schränkt dies ihre theoretische Spitzenleistung ein, aber ich habe keine Metriken gesehen.
  • Gfortran unterstützt Coarrays, jedoch nur für ein einzelnes Bild (oder einen einzelnen Rang, in MPI-Sprache). Daher ist keine echte Parallelisierung verfügbar, bis gfortran 4.8 oder 4.9 nicht verfügbar ist.

Im Allgemeinen wäre ich vorsichtig, wenn ich einen Coarray-basierten Code starten würde. Die Syntax ist einfach und viel praktischer als bei Fortran / C / C ++ mit MPI, aber dann ist sie einfach nicht so umfassend. Zum Beispiel unterstützt MPI viele Reduktionsoperationen usw., die für Sie sehr praktisch sein könnten. Es würde wirklich von Ihrem Bedürfnis nach viel Kommunikation abhängen. Wenn Sie ein Beispiel wollen, lassen Sie es mich wissen und ich kann Ihnen ein paar zur Verfügung stellen, wenn ich die Dateien ausgraben kann.


Ja, weitere Informationen über die Bereitschaft von Coarray Fortran für derartige Probleme wären sicherlich hilfreich. Willkommen bei scicomp!
Aron Ahmadia

1

Sehen Sie sich Spark an, ein verteiltes Framework für Berechnungen im Speicher, das die funktionale Programmierung nutzt. Die Struktur eines Programms in Spark unterscheidet sich stark von der in MPI. Im Grunde schreiben Sie einen Code wie für einen einzelnen Computer, der automatisch als Funktion auf Daten im Speicher verteilt wird. Es unterstützt Scala, Java und Python.

Logistische Regression (scala):

//load data to distributed memory
val points = spark.textFile(...).map(parsePoint).cache()
var w = Vector.random(D) // current separating plane
for (i <- 1 to ITERATIONS) {
  val gradient = points.map(p =>
    (1 / (1 + exp(-p.y*(w dot p.x))) - 1) * p.y * p.x
  ).reduce(_ + _)
  w -= gradient
}
println("Final separating plane: " + w)

Es gibt eine Erweiterung namens MLib (Machine Learning Library), die eine Fortran-Bibliothek für einige Low-Level-Berechnungen verwendet (für Python wird vermutlich numpy verwendet). Die Idee ist also einfach, konzentrieren Sie sich auf Ihren Algorithmus und überlassen Sie Optimierungen niedrigeren Ebenen (Reihenfolge der Verarbeitung, Datenverteilung usw.).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.