[PYTHON] Ich habe die Zeit gemessen, als ich das C-sprachabhängige Modul mit alpine installiert habe

Lassen Sie uns messen

Die Pip-Installation eines C-sprachabhängigen Moduls mit Alpine macht es zu einer schweren Geschichte

Ich versuchte zu sehen, wie lange es dauern würde, wenn ich gehorsam Pip installieren würde. Als ich es mit require.txt für maschinelles Lernen ausführte, kam das folgende Protokoll heraus.

Building wheels for collected packages: backcall, h5py, kiwisolver, matplotlib, numpy, pandas, pathspec, Pillow, PyYAML, pyzmq, regex, retrying, scikit-learn, scipy, tornado, typed-ast

Wir haben uns entschlossen, nur die Module aufzunehmen und zu messen, die während der Entwicklung wahrscheinlich häufig verwendet werden.

Experimentierumgebung

Es gab zwei Arten von Umgebungen, die ich zur Hand haben konnte, also werde ich beide ausprobieren.

Messmethode

Die Ausführungszeit wird durch Hinzufügen des Zeitbefehls zum Kopf gemessen. In beiden Fällen werden sie in derselben Docker-Datei ausgeführt, und die Anweisung "RUN" enthält den Befehl "time pip install hoge".


FROM python:3.8-alpine3.11
RUN apk update \
  && apk add --virtual .build --no-cache openblas-dev lapack-dev freetype-dev \
  gfortran libxml2 g++ gcc zip unzip cmake make \
  libpng-dev openssl-dev musl libffi-dev python3-dev libxslt-dev \
  libxml2-dev jpeg-dev \
  && apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/testing hdf5-dev

RUN pip install --upgrade --no-cache-dir pip setuptools wheel && \
  time pip install --no-cache-dir Cython && \
...

So was. In der folgenden Tabelle sind die während des Docker-Builds ausgegebenen Protokolle zusammengefasst.

Ergebnis

[^ 1]: Wie in hier beschrieben, ist none-any ein nicht von der Betriebssystemarchitektur abhängiges Modul, das hauptsächlich mit reinem Python erstellt wurde. Es ist gewesen. Siehe auch Official PEP425.

module / time case1 case2
real user sys real user sys
Cython 3.07s 2.33s 0.42s 1.52s 0.99s 0.07s
numpy 5m 28.27s 7m 6.90s 22.11s 2m 11.15s 3m 23.69s 6.05s
pandas 31m 46.58s 30m 36.25s 0m 53.83s 14m 8.24s 13m 53.10s 15.88s
Pillow 50.81s 44.09s 5.99s 24.79s 19.88s 1.69s
scipy 30m 45.99s 36m 29.33s 1m 45.89s 12m 52.81s 17m 54.87s 42.58s
scikit-learn 14m 38.63s 14m 3.37s 28.98s 6m 33.10s 6m 24.84s 10.11s
h5py 3m 45.58s 3m 34.79s 9.30s 1m 45.87s 1m 42.42s 4.18s
matplotlib 2m 51.50s 2m 35.53s 13.59s 1m 21.77s 1m 13.70s 6.75s
regex 30.52s 28.84s 1.24s 13.75s 13.06s 0.34s

Hoppla Es ist schlampig, schlampig

In Fall 1 dauert es allein für Numpy 5 Minuten und für Pandas / Scipy mehr als 30 Minuten. Da Scikit-Lernen von Numpy und Scipy abhängt, muss man tatsächlich auf eine Stunde vorbereitet sein. Es ist über anderthalb Stunden, wenn alle oben genannten kombiniert werden. Was wird das sein? Angenommen, Sie arbeiten 8 Stunden am Tag

** Sie können nur ungefähr 5 Mal am Tag bereitstellen **

Es wird schwierig, den neuesten Zweig einfach der Entwicklungsumgebung zuzuordnen und sogar nach geringfügigen Fehlerkorrekturen zu suchen. Wenn die Arbeitszeit enthalten ist, wird sie weiter reduziert.

Wenn der Speicher verdoppelt wird, wird vorerst auch die Verarbeitungsgeschwindigkeit verdoppelt, so dass es nicht unmöglich ist, die Zeit zu verkürzen. Wenn Sie aws verwenden, können Sie Zeit sparen, indem Sie einen Instanztyp mit viel Speicher auswählen. In Fall 2, der mehr als doppelt so hoch ist wie in Fall 1, dauert es jedoch weniger als die Hälfte der Zeit, insgesamt jedoch etwa 40 Minuten. Sie können nur bis zu 12 Mal pro Tag bereitstellen.


Übrigens umfasst die Ausführungszeit einiger Module die Ausführungszeit der Installation abhängiger Module, da "pip install" in der Reihenfolge oben in der Tabelle ausgeführt wurde. Kiwisolver scheint auch in "tar.gz" zu fallen, daher sollte Matplotlib allein etwas schneller sein.

  Successfully built pandas
  Installing collected packages: six, python-dateutil, pytz, pandas
  Successfully installed pandas-0.25.3 python-dateutil-2.8.1 pytz-2019.3 six-1.14.0
------
  Successfully built scikit-learn
  Installing collected packages: joblib, scikit-learn
  Successfully installed joblib-0.14.1 scikit-learn-0.22.2.post1
-----
  Successfully built matplotlib kiwisolver
  Installing collected packages: cycler, kiwisolver, pyparsing, matplotlib
  Successfully installed cycler-0.10.0 kiwisolver-1.2.0 matplotlib-3.2.1 

Zusammenfassung

Selbst wenn es hell ist, dauert es jeweils 1 bis 2 Minuten. Daher muss die Operation berücksichtigt werden, bei der das sprachabhängige Modul C nicht so weit wie möglich erstellt werden muss. Verwenden Sie ~~ conda, ohne jetzt ~~

Neben pip

Zum Zeitpunkt der "Pip-Installation" wird unmittelbar nach Abschluss der Radumrüstung des Moduls das Whl erneut erweitert und die erforderlichen Produkte direkt unter "Site-Package" verschoben. Es ist alles, einschließlich der gemeinsam genutzten Bibliotheksgruppe "* .so", die aus in Python geschriebenem Code erstellt wurde. Wenn sich die Binärdatei python3.8 wie alpine direkt unter / usr / local / bin befindet, wird sie nach/ usr / local / lib / python3.8 / site-packages /verschoben.

Die erneute Bereitstellung mag mühsam erscheinen, ist jedoch eine PEP-kompatible sichere Modulbereitstellung. PEP491 sagt dies ebenfalls [^ 2]

[^ 2]: Abgesehen davon verwendet anaconda eine eigene Modulinstallationsmethode, sodass es nicht mit PEP übereinstimmt. Ein Ende, das die Gefahr des Mischens verursacht.


Entpacken Sie als Test die vorgefertigte whl-Datei und suchen Sie nach der .so-Datei.

./numpy/linalg/lapack_lite.cpython-38-x86_64-linux-gnu.so
./numpy/linalg/_umath_linalg.cpython-38-x86_64-linux-gnu.so
./numpy/core/_operand_flag_tests.cpython-38-x86_64-linux-gnu.so
...

Wenn Sie den Bibliothekspfad nach der .so-Datei durchsuchen, nachdem Sie jede whl-Datei mit pip install` installiert haben, können Sie sehen, dass die vorgefertigte Datei für jedes Modul vorhanden ist.

/usr/local/lib/python3.8/site-packages/numpy/linalg/lapack_lite.cpython-38-x86_64-linux-gnu.so
/usr/local/lib/python3.8/site-packages/numpy/linalg/_umath_linalg.cpython-38-x86_64-linux-gnu.so
/usr/local/lib/python3.8/site-packages/numpy/core/_operand_flag_tests.cpython-38-x86_64-linux-gnu.so
...
/usr/local/lib/python3.8/site-packages/pandas/io/sas/_sas.cpython-38-x86_64-linux-gnu.so
/usr/local/lib/python3.8/site-packages/pandas/_libs/hashtable.cpython-38-x86_64-linux-gnu.so
...

Jetzt können Sie endlich mit Python importieren, Auf der anderen Seite können Sie es verwenden, solange sich das Produkt in dem Pfad befindet, in dem Python nach dem Modul sucht. Fügen Sie in Problemumgehung des Originalartikels später andere als Python-bezogene Elemente ein. Angenommen, ich kopiere direkt unter / usr / local / mit Dockers mehrstufigem Build.

Verweise

Recommended Posts

Ich habe die Zeit gemessen, als ich das C-sprachabhängige Modul mit alpine installiert habe
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
Das Modul, das mit pip installiert werden sollte, läuft nicht
Ich kann das Paket nicht mit pip installieren.
Installieren Sie das C-sprachabhängige Modul von Python im Wheel-Format mit mehrstufigem Build
Ich habe Hello World mit 64-Bit-OS + C-Sprache ohne Verwendung einer Bibliothek ausprobiert
Was ich getan habe, als ich mit Lambda Python im Zeitlimit steckte
Ich habe vorerst mit Floydhub gespielt
Finden Sie den Speicherort der mit pip installierten Pakete heraus
Ich habe die Leistung von 1 Million Dokumenten mit mongoDB gemessen
[Hinweis] Das installierte Modul kann nicht im Jupiter aufgerufen werden.
Ich bin beim Einfügen von TensorFlow mit pip auf PyUnicodeUCS4_FromStringAndSize gestoßen
Warum kann ich das Modul durch Importieren mit Python verwenden?
Sie können das mit pip install --user installierte Paket nicht finden?
[Python] Ich habe das Spiel von pip installiert und versucht zu spielen
Eine Geschichte, die nicht funktioniert hat, als ich versucht habe, mich mit dem Python-Anforderungsmodul anzumelden