Machine learning und AI nur für Python-Programmierer?

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
kirchfritz
Beiträge: 172
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Machine learning und AI nur für Python-Programmierer?

Beitrag von kirchfritz »

Wenn ich heute im Internet zum Thema Machine Learning, Deep Learning, Artificial Intelligence, neuronale Netze recherchiere, finde ich nur Artikel, die zu diesem Thema die Programmiersprache Python bevorzugen.
Wie kann ich mich als überzeugter Freepascal/Lazarus-Anhänger mit diesen Themen auseinandersetzen und dabei bei meiner geliebten Programmiersprache bleiben?
Fritz

Benutzeravatar
kupferstecher
Beiträge: 422
Registriert: Do 17. Nov 2016, 11:52

Re: Machine learning und AI nur für Python-Programmierer?

Beitrag von kupferstecher »

Im englischen Forum gibt es Beiträge:
https://forum.lazarus.freepascal.org/in ... opic,39049
https://forum.lazarus.freepascal.org/in ... opic,18769

Beim Stuttgarter Lazarustreffen wurden auch mal neuronale Netze vorgestellt (hilft dir jetzt aber natürlich nichts).

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Machine learning und AI nur für Python-Programmierer?

Beitrag von Warf »

Ich weiß nicht warum du das überhaupt willst. Programmiersprachen sind wie Werkzeuge, es gibt immer das richtige für einen speziellen Job. Und die schnittmenge zwischen dem worin Pascal/Lazarus gut ist und was du für Machine Learning brauchst ist eher sehr gering.

Für ML brauchst du vor allem Matrix und Vector rechnungen. Python bietet dafür numpy als sehr gute bibliothek. Dann benutzt du für ML eh normalerweise ein komplett optimiertes backend wie TensorFlow oder Torch. D.h. das python als skriptsprache langsam ist, macht hier nichts aus. Außerdem musst du oft, grade am anfang, mit den hyperparametern rumspielen. Dafür ist pythons natur als skriptsprache sehr gut geeignet da man die einfach im souce ändern kann. Außerdem läuft python als skriptsprache einfach überall, und mit einem pipenv gehen auch alle dependencies ohne wenn und aber. Und ML algorithmen sind meist nicht mehr als ein paar hundert zeilen code, was bedeutet das das python script auch nicht zu unübersichtlich wird (was mMn. das größte problem an python ist)

Im vergleich dazu pascal. Du hast im bestenfall eine Ok Numerik bibliothek, die es mit numpy sowohl von der performance als auch von den features wahrscheinlich nicht mithalten kann, die performance durch das Kompilieren von Pascal code bringt dir nichts, stattdessen musst du um kleinere änderungen zu machen immer das gesammte Projekt neukompilieren, oder für deine hyperparameter irgendein Config file system schreiben, was selbst im besten fall locker 200 zeilen source sind. Mal ganz davon abgesehen das es ein absoluter scheiss job ist, zu versuchen seine Pascalprogramme auf einem fremden rechner zum laufen zu bekommen. Dependencies installieren, und dann noch sicherstellen das man es auch fürs richtige target kompiliert hat.

Die stärken von Pascal sind:
1. gutes/einfaches GUI design, was du nicht brauchst da du fürs ML normalerweise keine GUI's verwendest.
2. Gut strukturiereter leserlicher code, was du nicht brauchst da deine ML Programme meist nur ein paar hundert zeilen brauchen sollten. Nicht nur das, die strukturierung von Pascal code sorgt wahrscheinlich dafür das du für äquivalenten code statt ein paar hunder zeilen python, eventuell mehr als tausend zeilen Pascal brauchst
3. Robuste performance, was du nicht brauchst, da die ganzen berechnungen eh von einem hoch optimierten backend gemacht werden

Wenn du also pascal für ML verwenden willst, ist das ein bisschen so als wölltest du eine Säge zum reinhämmern von nägeln verwenden, weil du die Säge einfach lieber magst als den Hammer

am2
Lazarusforum e. V.
Beiträge: 116
Registriert: Di 21. Dez 2010, 09:59
OS, Lazarus, FPC: Win (L 0.9.26 beta FPC 2.2.2)
CPU-Target: 32 Bit

Re: Machine learning und AI nur für Python-Programmierer?

Beitrag von am2 »

Warf hat geschrieben:Ich weiß nicht warum du das überhaupt willst. Programmiersprachen sind wie Werkzeuge, es gibt immer das richtige für einen speziellen Job. Und die schnittmenge zwischen dem worin Pascal/Lazarus gut ist und was du für Machine Learning brauchst ist eher sehr gering.

...

Wenn du also pascal für ML verwenden willst, ist das ein bisschen so als wölltest du eine Säge zum reinhämmern von nägeln verwenden, weil du die Säge einfach lieber magst als den Hammer


Sehe ich insgesamt ein wenig anders. Wie wäre es denn, wenn Du Deine GUI um Elemente bereichern willst, die in der Sphäre "ML" angesiedelt sind? Beispielsweise ein "intelligentes" Textprogramm, welches im Hintergrund Deine Aussagen recherchiert (sei es darauf, bestätigende Quellen zu finden oder dich vor versehentlichen Plagiatsvorwürfen zu schützen oder auch nur auf Stimmigkeit innerhalb Deiner Argumentation). Eine plumpe Volltextsuche dürfte da schnell an ihre Grenzen kommen.
Oder Du baust ein CAD- Programm, welches versucht, mittels ML verzichtbare Punkte aus einer Laserpunktwolke zu eliminieren.
Noch naheliegender ist eine Fotoverwaltung (natürlich offline, schließlich sollen ja nicht die Google- Mitarbeiter meine Bilder sortieren), die die Bilder auch nach meinen Grundsätzen nach Inhalten sortiert/markiert ...

Wenn man ML zum Selbstzweck benutzt, dann mag Deine Aussage so stimmen, wenn Du aber ML nutzen willst, um Deine Anwendung damit anzureichern, dann ist es schon blöd, wenn man die Welten nicht übereinander bringen kann.
Hinzu kommt, dass es vielleicht (leider) schwieriger ist, Lazarus mit allen daraus resultierenden Abhängigkeiten auf einem Fremdsystem zu installieren. Dafür kannst Du das Ergebnis weitergeben, ohne dass auf dem anderen Rechner überhaupt Lazarus installiert werden muss.

Mein persönliches Fazit: Sicher, das Fahrrad neu erfinden, ist Quatsch. Aber die Vorzüge der Werkzeuge möglichst nahtlos zu verbinden, das halte ich - insbesondere bei immer mehr guten Werkzeugen - für eine ganz wichtige Sache.
Um in Deinem Beispiel zu bleiben: Ich möchte nicht einen Werkzeugkästen für Sägen und einen für Hämmer. Wenn der Baum Dick genug ist, dann wirst Du vielleicht allein mit Sägen ein Haus daraus machen können. Und wenn die Nägel lang genug sind und der Platz nach außen keine Rolle spielt, lässt sich bestimmt auch ein Haus zusammennageln, ohne je zu sägen. Aber im Allgemeinen ist es doch zielführender, beide Werkzeuge zu kombinieren.

Was ich mir daher in jedem Fall ansehen werde, sobald ich irgendwo die Zeit dafür abknapsen kann, ist Python for Lazarus. In einer perfekten Welt sollte man alle möglichen Werkzeuge (Lazarus, Python, Prolog, GIS- Werkzeuge, CAD- Werkzeuge ...) kombinieren können, finde ich.

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Machine learning und AI nur für Python-Programmierer?

Beitrag von Warf »

am2 hat geschrieben:Was ich mir daher in jedem Fall ansehen werde, sobald ich irgendwo die Zeit dafür abknapsen kann, ist Python for Lazarus. In einer perfekten Welt sollte man alle möglichen Werkzeuge (Lazarus, Python, Prolog, GIS- Werkzeuge, CAD- Werkzeuge ...) kombinieren können, finde ich.


Nun die meisten Programmiersprachen kann man recht gut kombinieren. Z.B. bei allen Kompilierten sprachen kann man einfach Bibliotheken erstellen oder direkt die ObjectFiles gegenlinken, Java hat das JNI und ansonsten kann man immernoch einfach über IPC oder einfach Prozesse miteinander kommunizieren. Nehmen wir mal dein Beispiel mit dem textverarbeitungsprogramm. Sagen wir mal wir haben das in Lazarus geschrieben und möchten nun mit AI ähnlichkeiten zu anderen texten ermitteln. Dann würde ich erstmal in Python mit Torch oder TensorFlow eine anwendung schreiben die nur das macht. Sie bekommt einen text auf STDIN und macht den ganzen ML kram damit und gibt dann das ergebnis (z.B. den Feature vector) auf STDOUT raus. Dann würde ich in Lazarus mit TProcess den Python interpreter mit dem entsprechenden Script aufrufen (oder noch ein virtualenv dazwischen hauen für die dependencies, ML mit python braucht ja ne ganze reihe an bibliotheken) und die daten übergeben. In meinem Lazarusprogramm interessiert es mich dann absolut nicht wie der ML kram abläuft, und ich kann mich darauf konzentrieren was mit Lazarus am besten geht.

Sowas ähnliches hatte ich tatsächlich schonmal gemacht. Die Idee war einfach ich hatte ein ML script geschrieben mit PyTorch, für das ich nur noch ein UI brauchte. Also hab ich das entsprechend gebaut (in diesem fall war das mit HTML, Javascript und PHP im backend), welches die daten animmt dann an das python script übergibt (auf serverseite via Java und einer MySQL datenbank), und sobald das python script fertig ist wieder das frontend informiert mit den neuen informationen. Ist grundsätzlich kein hexenwerk. Man muss halt nur schauen das man die daten vernünftig codiert. In meinem fall waren es bilder, die konnte ich einfach über Blobs in der MySQL datenbank in temporäre dateien schreiben, die ich dann mit python direkt laden konnte. Somit hat mein frontend nie das ML gesehen, und das ML nie das frontend.
Und ich habe generell auch lieber 3 kleine sehr spezielle programme, als eine eierelegendewollmilchsau, ein riesen projekt mit 10 kilozeilen code, das versucht alles zu vereinen.

Und daran programme miteinander reden zu lassen soll es letzendlich nicht scheitern, mit sowas wie runcommand in der RTL und temporären dateien ist das wirklich ein klacks:

Code: Alles auswählen

procedure doTheMLStuff(Data: TSOmeData): TOutputData;
var tmpDir: String;
  output: String;
begin
  tmpDir := GetTempDir(false);
  Data.SaveToFile(tmpDir+'/inputFile'); // speichere daten in datei
  RunCommand('python3', ['mlscript.py', tmpdir+'/inputFile'], output); // übergib die datei an python
  Result := TOutputData.Create(output); // Mach aus dem string irgendwie verwertbare daten
end;

Die ausgabedaten müssen dann halt von python irgendwie sinnig formatiert werden, z.B. via CSV, XML, oder einem eigenen format

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Machine learning und AI nur für Python-Programmierer?

Beitrag von af0815 »

Die Frage ist, ob es auch ein C Interface gibt (KEIN C++). Dann greifen die Boardmittel von Lazarus. Ansonsten muss man ein Interfce von Phyton zu C machen, auf welches man dann mit Pascal aufsetzen kann.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2639
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Machine learning und AI nur für Python-Programmierer?

Beitrag von m.fuchs »

Für Python gibt es ja auch noch https://wiki.freepascal.org/Python4Delphi
Hilft ja vielleicht auch.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten