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.
Es gab zwei Arten von Umgebungen, die ich zur Hand haben konnte, also werde ich beide ausprobieren.
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.
[^ 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
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 ~~
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.
Recommended Posts