So installieren Sie die neueste Scipy-Version auf Raspberry Pi

10

Ich habe derzeit Raspbian OS

und ich versuchte:

sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose

das hat gut funktioniert, aber eine alte Version installiert (0.10)

Und:

sudo apt-get install libatlas-base-dev gfortran python-pip

sudo pip install scipy

was nach mehr als einer Stunde Arbeit mit einigen Fehlern endete.

Was haben Sie getan, um Scipy 0.12 auf Ihrer Himbeere zu installieren?

zurfyx
quelle
1
Können Sie die genaue Fehlermeldung geben?
Arne
Hier ist auch ein Blog-Beitrag über die Installation von scipy auf dem Raspberry Pi: wyolum.com/numpyscipymatplotlib-on-raspberry-pi
Arne

Antworten:

14

TL; DR: Fahren Sie mit dem letzten Absatz fort, um zu erfahren, wie Sie den Swap-Speicherplatz erhöhen und Speicherverstopfungen vermeiden können. Verwenden Sie Pip auch nicht für Numpy und Scipy.

Um die neueste Version von scipy auf dem Himbeer-Pi zu erhalten, müssen Sie aus dem Quellcode erstellen. Der Hauptgrund ist, dass scipy auf kompilierten C- und fortran-Bibliotheken basiert, die auf derselben Architektur kompiliert werden müssen. Normalerweise werden pip installvorgefertigte Pakete für Sie abgerufen, aber die ARM-Architektur von Raspberry Pi wird nicht wirklich unterstützt.

Wenn dies alles wäre, was Sie brauchen, wäre es relativ einfach (die wichtigsten Anweisungen finden Sie hier und sind unten zusammengefasst), aber es gibt ein zusätzliches Problem mit dem Himbeer-Pi, das ich erst nach einer Woche Recherche und Ausprobieren erkannt habe (überspringen bei das Ende, wenn Sie nur das Update benötigen), was meiner Meinung nach auf die geringe Menge an verfügbarem Speicher zurückzuführen ist.

Ich werde nur versuchen, den gesamten Prozess zusammenzufassen (damit die Leute nicht wie ich im Internet herumspringen müssen).

Bedarf

Es gibt einige Anforderungen für das Bauen von Scipy. Soweit Python - Pakete gehen, müssen Sie numpy, cython, setuptools, und (wenn Sie die Dokumentation aufbauen wollen) Sphinx. Sie sollten versuchen, die mit Raspbian gelieferte Version dieser Pakete zu verwenden (in Paketen wie python3-numpy), sie müssen jedoch möglicherweise separat erstellt werden (OT).

Für die Systemanforderungen benötigen Sie einige Pakete, mit denen Folgendes installiert werden apt-getkann:

  • Eine BLAS / LAPACK-Mathematikbibliothek mit Entwicklungsheadern, z. B. libopenblas-baseund libopenblas-dev;
  • python-dev;;
  • C- und Fortran-Compiler gccund gfortran;

Schließlich benötigen Sie den Quellcode, den Sie hier herunterladen können (Scipy 1.0.0 ist die neueste stabile Version, die ich gerade schreibe). Dann ist es nur noch eine Frage von tar -xzvf scipy-v1.0.0.tar.gz cd scipy

Quelle kompilieren

Wenn Sie zu diesem Zeitpunkt den Erstellungsprozess starten, scheint dies in Ordnung zu sein, hängt jedoch nach einigen Minuten ab.

Hinzufügen eines größeren Swap-Space

Dies liegt daran, dass das Kompilierungsskript die Gesamtheit des Arbeitsspeichers und des Auslagerungsspeichers belegt, indem mehrere Prozesse erzeugt werden (und der Speicher folglich repliziert wird). Das Problem ist, dass im Raspberry Pi der Swap-Speicher besonders klein ist (nur 100 MB, glaube ich), während die Norm darin besteht, dass er die gleiche Größe Ihres RAM hat.

Wie hier und hier erläutert , kann der Swap-Bereich vergrößert werden, indem Folgendes eingegeben wird:

sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
sudo /sbin/mkswap /var/swap.1
sudo chmod 600 /var/swap.1
sudo /sbin/swapon /var/swap.1

Dadurch erhalten Sie 1 GB Swap-Speicherplatz.

Dann kann man endlich mit bauen und installieren

python3 setup.py build

python3 setup.py install --user

(Sie können das löschen, --user flagwenn Sie es systemweit installieren möchten, aber Sie benötigen Root-Rechte).

Zum Schluss entfernen Sie den zusätzlichen Swap und stellen den Standard wieder her:

sudo swapoff /var/swap.1
sudo rm /var/swap.1
teoguso
quelle
1
Ich habe einige Tage dieses Speicherproblem mit Himbeere gelöst. Männer, du hast mein Leben gerettet.
Taras Vaskiv
1
@ Zurfyx IMHO dieser Beitrag sollte als Antwort markiert werden
jlandercy
Danke @jlandercy, ich hatte darauf gehofft, aber ich fürchte, das OP hat die Plattform verlassen.
Teoguso
5

Installieren Sie mit einem Rad für pi. Es ist vielleicht nicht das neueste Scipy, aber es ist ziemlich aktuell.

  • Update Pip: pip install pip --upgrade(oder pip3passen Sie sich an Ihre Python-Version an)
  • Gehen Sie zu https://www.piwheels.org/simple/scipy/
  • Wählen Sie die Scipy-Version und die Zielplattform aus (z. B. armv6l für pi null und früher pi; armv7l für 3).
    • Beispiel: scipy-1.2.1-cp35-cp35m-linux_armv7l.whlauf einem 3 Modell B.
  • Laden Sie die .whl-Datei herunter
    • mit zum Beispiel: wget https://www.piwheels.org/simple/scipy/scipy-1.2.1-cp35-cp35m-linux_armv7l.whl#sha256=270be300233af556e6ee3f55a0ae237df0cb65ac85d47559010d7a9071f2e878
  • Gehen Sie zu dem Ort, an dem die .whlDatei heruntergeladen wurde, und:pip install the-scipy-file.whl

Anmerkungen :

  • Dies kann in einer virtuellen Umgebung erfolgen (gerade getestet).
  • Dies ist viel schneller als jede andere Methode, die ich gesehen oder ausprobiert habe.
Calocedrus
quelle
3

Wie Goldlöckchen betonten, wird Debian nicht immer mit den neuesten Versionen von Paketen geliefert. Manchmal wird es mit wirklich alten Versionen ausgeliefert, wie der Netpbm-Distribution, die über 12 Jahre veraltet ist.

Es gibt zwei Möglichkeiten, damit umzugehen:

  1. Lebe damit : Bist du sicher, dass du wirklich die neueste Version haben musst? Wenn Ihr Code Funktionen oder Bugfixes aus der neuesten Version erfordert, ist dies keine Option. Debian-Pakete sind normalerweise ziemlich stabil. Wenn Sie also Ihren Code damit arbeiten lassen können, müssen Sie sich keine Gedanken über die Wartung Ihrer eigenen Upgrades machen. Hier sind die SciPy 0.10.0-Versionshinweise - würden diese Funktionen funktionieren?

  2. Aus Quelle erstellen : Der einfachste Weg, um die Quellabhängigkeiten für die aktuelle Version abzurufen, ist die Verwendung. apt-get build-depSie benötigen jedoch eine Quellzeile in Ihrem /etc/apt/sources.list:

    • Um /etc/apt/sources.list, fügen Sie die Zeile: deb-src http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi (im Wesentlichen die gleiche wie die debLinie, aber mit deb-src. Wenn Sie dies nicht tun, apt wird sich beschweren.)
    • Jetzt Ausgabe sudo apt-get build-dep python-scipy; Dies gibt eine große Liste von Paketen zurück, viel mehr als Ihr Beitrag enthalten. In Ihrer Fehlermeldung ging es möglicherweise um fehlende Abhängigkeiten.
    • Versuchen Sie erneut, scipy zu bauen.

Beachten Sie, dass möglicherweise immer noch Abhängigkeitsprobleme auftreten, da für die aktuelle Version (ca. 0.14) möglicherweise neuere abhängige Pakete erforderlich sind, als Raspbian kennt. Wenn Sie können, versuchen Sie, ein checkinstallsolches Tool zu verwenden , um Raspbian mitzuteilen, dass Sie eine neuere Version mit speziellen Abhängigkeiten installiert haben, damit diese bei Routine-Upgrades nicht überall herumtrampelt. Dieser Prozess ist etwas umständlich; Einige Hinweise dazu finden Sie hier: Wie erstelle ich ein Debian / Ubuntu-Paket aus dem Quellcode?

scruss
quelle
2

Ich bin kein Python-Benutzer, aber der (wahrscheinliche) Grund für die alte Version ist, dass die Debian-Richtlinie manchmal zu lange dauert, um Versionen zu aktualisieren. Außerdem ist das Paket möglicherweise dunkel (daher noch weniger aktualisiert) und raspbian selbst ist in Bezug auf Debian ziemlich dunkel (daher werden die Pakete dort noch weniger aktualisiert). Das heißt, es ist eine Folge der verfügbaren Ressourcen (die Leute, die die Pakete verwalten, die normalerweise nicht die vorgelagerten Entwickler sind).

Nach mehr als einer Stunde endete die Arbeit mit einigen Fehlern

Vermutlich ist dies ein Problem beim Kompilieren eines oder mehrerer Module, obwohl Sie nicht gesagt haben, was der Fehler war. Das Kompilieren von Python-Modulen sollte meiner Meinung nach hauptsächlich auf dem Pi funktionieren, aber denken Sie daran, dass dies eine ungewöhnliche Architektur ist, für die Bibliotheken speziell kompiliert wurden. Leider birgt dies das Risiko von zuvor unbemerkten Fehlern in einem Teil oder einer anderen Oberfläche (wenn Sie Fehler in einer kompilierten Sprache finden möchten - Teile einiger Python-Module befinden sich in C - versuchen Sie, den Code auf einigen verschiedenen Plattformen zu kompilieren, lol ...). Das Auffinden des Täters würde etwas mehr Arbeit erfordern und sich um die spezifischen Fehler kümmern.

Goldlöckchen
quelle
2

Nach vielen Versuchen gelang es mir, scipy mit "pip install scipy" zu installieren, indem ich die Swap-Größe auf einem Raspberry 4 mit 2 GB auf 2048 erhöhte.

Xavier Alexandre
quelle
1

1) Erhöhen Sie den Swap auf 1 GB

sudo dphys-swapfile swapoff
sudo vim /etc/dphys-swapfile

CONF_SWAPSIZE = 1024

sudo dphys-swapfile swapon

2) Starten Sie neu, um Swap-Änderungen zu übernehmen

sudo reboot

3) Als Build ist hier meine Docker-Datei

FROM python:3-alpine
MAINTAINER codertarasvaskiv

RUN apk add --no-cache g++ gfortran python3-dev openblas-dev bash
RUN pip install --no-cache-dir numpy
RUN pip install --no-cache-dir scipy
RUN pip install --no-cache-dir <my custom package>

ENTRYPOINT ["bash"]

Es dauert also 10 Minuten, um Numpy zu bauen, dann fast 3 Stunden, um Scipy im Container zu bauen.

Taras Vaskiv
quelle
1

Bei einigen Distributionen (zB Arch Linux Arm), gibt es vorkompilierte Pakete zur Verfügung, wie python-scipy, python-numpyund python-matplotlib. Abhängig von der in der Distribution standardmäßig verwendeten Python-Version und Ihren Anforderungen kann dies auch der Fall sein python3-*. Möglicherweise müssen Sie zuvor installierte Pakete und deren Abhängigkeiten entfernen, damit diese Pakete von den Distributions-Repos anstatt von installiert werden pip. Das Python-Paket pip-autoremovekann dabei hilfreich sein, da pipkeine Abhängigkeiten entfernt werden.

Robin Dinse
quelle