[PYTHON] Jupyter Docker Bildzusammenfassung

Dies ist eine aktualisierte Version des folgenden Artikels. Das Bild ist so organisiert, dass Jupyter auf 5 Serien aktualisiert wurde.

Jupyter begann mit IPython, einem Tool für Python. Da der Prozess der Datenanalyse jedoch im Web gemeinsam genutzt werden kann, wurde er auch in R verwendet und kürzlich in Spark mit der Hadoop-Infrastruktur als Back-End integriert. ist. Wie von Numpy und Pandas dargestellt, können für die Datenanalyse erforderliche Bibliotheken komplizierte Abhängigkeiten aufweisen und schwierig zu installieren sein. Docker kann jedoch die Portabilität der Ausführungsumgebung verbessern. Da die Ausführungsumgebung für jeden Container getrennt werden kann, ist der Mechanismus zum Ausführen von Docker unter Hadoop (Docker Container Executor - Apache Hadoop 2.7.4) /hadoop-yarn-site/DockerContainerExecutor.html)) wird ebenfalls in Betracht gezogen (obwohl ich denke, dass es in der praktischen Phase etwas früh ist). Es wird angenommen, dass es eine Richtung sein wird, leichte Bilder entsprechend dem Zweck richtig zu verwenden, daher werde ich die von Jupyter organisierten Bilder zusammenfassen.

Der Jupyter-Server ist für die Verwendung durch Einzelbenutzer vorgesehen. Daher kann nur ein Kennworttyp festgelegt werden. Bitte verwenden Sie JupyterHub für mehrere Personen.

Liste der Docker-Bilder

Das Jupyter Docker-Image wird wie folgt separat verwaltet. GitHub hat ein Repository * jupyter / docker-stacks *, aber Docker Hub hat mehrere Images.

Bildname Erläuterung
base-notebook Jupyter Notebook 5.0.Sie können x verwenden. Die wissenschaftliche Berechnungsbibliothek ist nicht enthalten.
minimal-notebook base-notebookTools zur Dokumentkonvertierung wie Pandoc und Texlive wurden hinzugefügt.
scipy-notebook Pandas und Scikit-Enthält Datenanalysebibliotheken in Python, z. B. "Lernen".
datascience-notebook scipy-notebookR und Julia wurden hinzugefügt. R plyr etc.condaEs wird verwaltet von.
tensorflow-notebook scipy-notebookTensorflow wurde hinzugefügt. Es gibt keine GPU-Unterstützung.
pyspark-notebook scipy-notebookFunke 2.2.0 und Hadoop 2.7 wurde hinzugefügt. Mesos 1.Es enthält auch 2 Kunden.
all-spark-notebook pyspark-notebookR und Toree und Spylon wurden hinzugefügt.
r-notebook minimal-notebookR wurde hinzugefügt. plyr etc.condaEs wird verwaltet von. Wenn Sie Python oder Julia nicht verwendendatascience-notebookKann leichter als vorbereitet werden.

Die Beziehung zwischen den einzelnen Bildern ist im visuellen Übersichtsdiagramm (internal / inherit-chart.png) im GitHub-Repository leicht zu verstehen.

Da die Starteinstellungen vom Shell-Skript von Base-Notebook verwaltet werden, wird empfohlen, die README-Datei von "Base Jupyter Notebook Stack" für Optionen usw. zu lesen.

[off topic] Mit Toree und Spylon können Sie Notizbücher schreiben, die Spark in Scala verwenden. Der Status des Projekts reicht jedoch von Alpha bis Beta. Sie müssen also vorsichtig sein, welche Version Sie verwenden, wenn Sie es verwenden. Wenn Sie sich nicht für Jupyter interessieren und ein Notebook mit Spark konfigurieren möchten, ist Apache Zeppelin ebenfalls eine gute Option.

Verwenden Sie * Basis-Notebook *

Versuchen Sie es mit * base-notebook *. Ich denke nicht, dass es tatsächlich mit diesem Image verwendet wird, aber da es ein Image von ungefähr 600 MB ist, ist es genau richtig für einen schnellen Start.

Laden Sie zuerst das Bild mit dem Befehl pull herunter.

$ docker pull jupyter/base-notebook
$ docker images jupyter/base-notebook
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
jupyter/base-notebook   latest              749eef0adf19        4 days ago          599MB

Starten Sie den Container am Standardport 8888. Wenn es normal gestartet wird, wird das Authentifizierungstoken auf der Konsole angezeigt. Kopieren Sie die URL und greifen Sie mit einem Browser darauf zu. Sie können ohne Token auf die Web-Benutzeroberfläche zugreifen und einen Wert nach * token = * in das Eingabefeld eingeben.

$ docker run -it --rm -p 8888:8888 jupyter/base-notebook
(Kürzung)
    
    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=1898d7309d85940ac77acc59b15b4f9c572c96afdfc0e198

Um im Hintergrund ausgeführt zu werden, führen Sie dann verschiedene Optionen aus. In diesem Fall wird nach Ausführung des Befehls in der Standardausgabe nichts angezeigt. Sie benötigen ein Authentifizierungstoken, um auf Ihr Notebook zugreifen zu können. Verwenden Sie daher den Befehl * logs *, um die Startprotokolle zu überprüfen. Geben Sie für das Argument den Namen an, der beim Starten des Containers festgelegt wird.

$ docker run -d --name basenb -p 8888:8888 jupyter/base-notebook
$ docker logs basenb

Es besteht das Problem, dass es schwierig ist, die Protokollanzeige später zu lesen. Sie können auch den Befehl "jupyter" verwenden, um eine Liste der ausgeführten Server zurückzugeben, sodass Sie eine eindeutige Ausgabe erhalten, indem Sie mit dem Befehl * exec * auf den Container zugreifen und die Liste "jupyter notebook" ausführen.

$ docker exec basenb jupyter notebook list
Currently running servers:
http://localhost:8888/?token=1898d7309d85940ac77acc59b15b4f9c572c96afdfc0e198 :: /home/jovyan

Authentifizierungstoken und Passwort

Die Sicherheit des Jupyter-Notebook-Servers finden Sie in den folgenden Dokumenten:

Es gibt zwei Methoden: Die eine besteht darin, ein Authentifizierungstoken zu verwenden, und die andere darin, ein Kennwort zu verwenden. Authentifizierungstoken können im HTTP-Header * Authorization * oder im Parameter * token * der URL angegeben werden. Standardmäßig ist die Methode zur Verwendung des Authentifizierungstokens aktiviert, und es kann gesagt werden, dass die vom Parameter * token * der URL angegebene Methode in der Startnachricht angezeigt wird.

Das Verhalten der standardmäßigen Aktivierung von Authentifizierungstoken wurde seit Jupyter 4.3 eingeführt. Es scheint jedoch, dass die Veröffentlichung nicht vollständig organisiert war, und es gibt viele Missverständnisse, wenn mehrere Optionen kombiniert werden.

Wenn Ihr lokaler Computer den Browser beim Start automatisch öffnet, können Sie mit einem temporären Token auf die URL zugreifen und die Informationen, auf die Sie zugreifen können, in einem Cookie speichern, damit Sie sie nahtlos verwenden können. Wenn Sie jedoch von Docker oder von einem Remote-Server aus starten, ist der automatische Start des Browsers deaktiviert, sodass die Authentifizierung viel Arbeit erfordert.

Das Authentifizierungstoken und das Kennwort können als Startoptionen angegeben werden.

---- NotebookApp.token: Geben Sie anstelle der automatischen Standardgenerierung eine feste Zeichenfolge an. Der eingestellte Wert wird beim Start nicht in das Protokoll ausgegeben.

---- NotebookApp.password: Die Kennwortauthentifizierung wird verwendet, ohne das Authentifizierungstoken in der URL und im Header zu verwenden. Die Passwortzeichenfolge wird mit der Funktion notebook.auth.passwd gehasht.

Grundsätzlich können Sie die Authentifizierungsfunktion deaktivieren, indem Sie für beide ein Leerzeichen angeben. Diese Methode ist jedoch * stark veraltet *, es sei denn, Sie beschränken den Zugriff auf andere Ebenen Ihrer Webanwendung.

[off topic] Die Verarbeitung der Einstellungsoptionen ist in notebook / notebookapp.py implementiert, sodass die Beziehung zwischen den Optionen der Quellcode ist. Ist genau zu lesen. Die Implementierung verwendet Traitlets. Daher empfiehlt es sich, die Referenz beim Lesen zu öffnen.

Die Funktion "notebook.auth.passwd" wird einfach importiert und ohne Argumente aufgerufen. Geben Sie das Passwort ein, das Sie angeben möchten, und geben Sie es zur Bestätigung erneut ein. Gibt das Hash-Ergebnis aus.

notebook_auth_passwd-on-Try Jupyter.png

Um es als Konfigurationsdatei zu speichern, führen Sie "jupyter notebook password" oder "python -m notebook.auth password" aus. Ersteres ist besser. Geben Sie das Kennwort ein, das Sie ausführen möchten, und legen Sie es zweimal fest. Die Einstellungsdatei wird in .jupyter / jupyter_notebook_config.json gespeichert. Wenn Sie es als Datei behalten, können Sie es verwalten, indem Sie die Datei aus dem Docker-Container auf dem Hostcomputer bereitstellen. Die Konfigurationsdatei kann auch von Python verwaltet werden.

$ docker exec -it basenb jupyter notebook password
$ docker exec -it basenb cat .jupyter/jupyter_notebook_config.json
{
  "NotebookApp": {
    "password": "sha1:2165e2ddd92d:8131245514d60dd9eb91433af30bf1ccbbc36962"
  }
}

Starten Sie hier den Container neu, um den Inhalt der Einstellungsdatei wiederzugeben. Wenn Sie den Browser neu laden, wird ein Textfeld zur Eingabe des Kennworts angezeigt. Stellen Sie daher sicher, dass Sie sich mit dem oben festgelegten Kennwort anmelden können.

$ docker stop basenb
$ docker start basenb

Da das Authentifizierungstoken nicht mehr vorhanden ist, wird die URL mit dem Token nicht im Protokoll ausgegeben, und das Token wird auch mit dem Befehl "jupyter notebook list" nicht angezeigt. Dadurch konnten wir vom Standardauthentifizierungstoken zur Kennwortauthentifizierung wechseln.

Einstellung nach Boot-Option über den Docker-Befehl

In einigen Umgebungen ist es nicht geeignet, das Protokoll bei jedem Start zu überprüfen oder die Datei bereitzustellen. Geben Sie in solchen Fällen in den Startoptionen ein Authentifizierungstoken oder einen Kennwort-Hash an.

Verwenden Sie beim Starten des Containers start-notebook.sh und geben Sie die oben genannten Optionen an.

Wenn Sie ein Authentifizierungstoken geben:

$ docker run -d --name basenb-token -p 8080:8888 jupyter/base-notebook start-notebook.sh --NotebookApp.token=foobarbaz

Wenn Sie einen Passwort-Hash eingeben:

$ docker run -d --name basenb-passwd -p 8088:8888 jupyter/base-notebook start-notebook.sh --NotebookApp.password=sha1:2165e2ddd92d:8131245514d60dd9eb91433af30bf1ccbbc36962

Wenn Sie sowohl ein Authentifizierungstoken als auch einen Kennwort-Hash angeben möchten, führen Sie beide Optionen aus.

Grundsätzlich ist es besser, mit einem Kennwort zu verwalten. Wenn Sie es jedoch in einer Cloud-Umgebung ausführen und nur mit einer URL freigeben möchten, ist die Authentifizierungstoken-Methode ebenfalls gut. Befolgen Sie jedoch die Sicherheitsrichtlinien der Benutzerumgebung, um Einschränkungen hinsichtlich der IP-Adresse der Zugriffsquelle zu erhalten.

Weitere SSL-Einstellungen finden Sie in den folgenden Dokumenten.

Verwenden Sie * scipy-notebook *

Nachdem wir die Startprobleme organisiert haben, zeichnen wir ein Diagramm mit einem anderen Docker-Image.

Laden Sie das Bild * scipy-notebook * herunter und überprüfen Sie die Kapazität.

$ docker pull jupyter/scipy-notebook
$ docker images jupyter/scipy-notebook
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
jupyter/scipy-notebook   latest              092599e85093        5 days ago          3.91GB

Beginnen Sie im Hintergrund und überprüfen Sie das Token.

$ docker run -d --name scipynb -p 8888:8888 jupyter/scipy-notebook
$ docker exec scipynb jupyter notebook list

Greifen Sie mit einem Webbrowser auf den Notebook-Server zu und erstellen Sie ein neues Python 3-Notebook.

Führen Sie zunächst das Laden des Standardmoduls wie unten gezeigt aus.

Python-Modul wird geladen


import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
%matplotlib inline

Generieren Sie als Nächstes die Sinus- und Cosinusdaten für die Dreiecksfunktion.

sin/Definition von cos


import math
cycle = math.pi * 2
x = np.linspace(-1 * cycle, cycle, 100)
y1 = np.sin(x)
y2 = np.cos(x)

Zeichnen wir mit der matplotlib-API. Geben Sie zwei Datenreihen an, geben Sie den X- und Y-Achsen Namen und geben Sie dem Diagramm einen Titel. Wenn Sie Japanisch verwenden möchten, platzieren Sie die Schriftartdatei im Container. [^ 1]

[^ 1]: Informationen zum Einstellen der Diagrammachse in Japanisch finden Sie in diesem Artikel. Japanische Einstellungen für Matplotlib- und Seaborn-Achsen - Qiita

Zeichnen Sie mit der matplotlib API


sns.set_style('whitegrid')
plt.plot(x, y1, color='red', linewidth=2, label='sin')
plt.plot(x, y2, color='blue', linewidth=1, label='cos')
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.title('sin/cos curve')
plt.legend()
plt.show()

Kobito.RrClEH.png

Zeichnen Sie dasselbe mit der Pandas DataFrame-API. Das Zeichnen des Diagramms selbst ist einfach, aber der Rückgabewert "matplotlib.AxesSubplot" wird für Achseneinstellungen usw. verwendet. Um den Unterschied zum obigen Diagramm besser verstehen zu können, hat Seaborn den Stil in dunklere Ränder geändert.

Zeichnen Sie mit der DataFrame-API


df = pd.DataFrame({'sin': y1, 'cos': y2}, index=x)
sns.set_style('darkgrid')
ax = df.plot(title='sin/cos curve')
ax.set_xlabel('x axis')
ax.set_ylabel('y axis')

Kobito.6I3ItZ.png

Als nächstes zeichnen wir mit Bokeh ein Aktienchart. Aktienkursdaten werden von Yahoo! mit * pandas-datareader * abgerufen. * pandas-datareader * ist unabhängig vom Paket * pandas.io *.

Verwenden Sie pip, um das Modul zu installieren. Stellen Sie dem Befehl ein "!" Vor, um den Befehl vom Notizbuch aus auszuführen.

Installieren Sie das Modul mit pip


!pip install -y pandas-datareader

ex1.png

Holen Sie sich die Daten durch Angabe des Datums.

Daten mit API abrufen


import datetime
import pandas_datareader.data as web

start = datetime.date(2014, 4, 1)
end = datetime.date.today()

stocks = web.DataReader("^N225", 'yahoo', start, end)
stocks.head(5)

ex2.png

Aktivieren Sie Bokeh auf Ihrem Notebook.

Bokeh aktivieren


import bokeh.plotting as bplt
bplt.output_notebook()

ex3.png

Zeichnen Sie ein Diagramm. Bokeh verwendet JavaScript zum Rendern in einem Browser, sodass Sie Japanisch verwenden können, ohne eine japanische Schriftart auf der Containerseite platzieren zu müssen.

Zeichnen Sie mit Bokeh ein Diagramm


p = bplt.figure(title='Nikkei Durchschnitt', x_axis_type='datetime', plot_width=640, plot_height=320)
p.segment(stocks.index, stocks.Open, stocks.index, stocks.Close, color='black')
bplt.show(p)

ex4.png

Verwenden Sie * pyspark-notebook *

Ich werde auch das Bild von PySpark verwenden. Für die Verbindung zu einem laufenden Spark-Cluster sind zusätzliche Einstellungen erforderlich. Für einfache API-Betriebsüberprüfungen reicht jedoch ein eigenständiger Betrieb aus.

Laden Sie das Bild * pyspark-notebook * herunter und überprüfen Sie die Kapazität.

$ docker pull jupyter/pyspark-notebook
$ docker images jupyter/pyspark-notebook
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
jupyter/pyspark-notebook   latest              26c919b64b68        2 days ago          4.46GB

Beginnen Sie im Hintergrund und überprüfen Sie das Token.

$ docker run -d --name pysparknb -p 8888:8888 jupyter/pyspark-notebook
$ docker exec pysparknb jupyter notebook list

Greifen Sie mit einem Webbrowser auf den Notebook-Server zu und erstellen Sie ein neues Python 3-Notebook.

Versuchen Sie, gemäß der offiziellen Dokumentation von oben nach unten zu laufen. Da der Quellcode nicht geklont wird, werden die Daten heruntergeladen und einzeln verwendet.

Erstellen Sie eine Spark-Sitzung


from pyspark.sql import SparkSession

spark = SparkSession \
    .builder \
    .appName("Python Spark SQL basic example") \
    .config("spark.some.config.option", "some-value") \
    .getOrCreate()

Laden Sie die Datei mit dem Befehl wget herunter.

Daten herunterladen


!wget https://raw.githubusercontent.com/apache/spark/master/examples/src/main/resources/people.json

Laden Sie Daten mit der DataFrame-API. Zeigen Sie die Daten und das Schema an und stellen Sie sicher, dass Sie die Daten nach Spaltenspezifikation auswählen können.

Daten lesen


df = spark.read.json("people.json")
df.show()
df.printSchema()
df.select("name").show()

Stellen Sie außerdem sicher, dass Sie SQL verwenden können. Dies ist für einfache Tabellen einfacher.

Verwendung von SQL


df.createOrReplaceTempView("people")
sqlDF = spark.sql("SELECT * FROM people")
sqlDF.show()

Verwenden Sie * Tensorflow-Notebook *

Ich werde auch versuchen, das Bild von TensorFlow zu verwenden. Keine GPU sollte ausreichen, um die TensorFlow Core-API auszuprobieren.

Laden Sie das Bild * tensorflow-notebook * herunter und überprüfen Sie die Kapazität.

$ docker pull jupyter/tensorflow-notebook
$ docker images jupyter/tensorflow-notebook
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
jupyter/tensorflow-notebook   latest              374b8bc43218        3 days ago          4.5GB

Beginnen Sie im Hintergrund und überprüfen Sie das Token.

$ docker run -d --name tfnb -p 8888:8888 jupyter/tensorflow-notebook
$ docker exec tfnb jupyter notebook list

Greifen Sie mit einem Webbrowser auf den Notebook-Server zu und erstellen Sie ein neues Python 3-Notebook.

Überprüfen Sie den Betrieb der API gemäß der offiziellen Dokumentation.

Importieren Sie zunächst das Modul und definieren Sie den konstanten Knoten.

import tensorflow as tf
node1 = tf.constant(3.0, dtype=tf.float32)
node2 = tf.constant(4.0)
node1, node2

Definieren Sie eine Sitzung und werten Sie den Knoten aus. Geben Sie den * run () * -Methoden der Sitzung eine Liste von Knoten.

sess = tf.Session()
sess.run([node1, node2])

Definieren Sie einen Knoten, der die Additionsoperation auf die beiden konstanten Knoten anwendet, und werten Sie den Knoten aus.

node3 = tf.add(node1, node2)
sess.run(node3)

Ermöglicht die Eingabe während der Auswertung anstelle eines konstanten Knotens. TensorFlow verwendet einen Datentyp namens * Platzhalter *. Beachten Sie, dass "a + b" eine Abkürzung für "tf.add (a, b)" ist.

a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
adder_node = a + b

Geben Sie beim Aufrufen der * run () * -Methode der Sitzung einen Wert für das Argument * feed_dict * an.

sess.run(adder_node, {a: 3, b: 4.5})

Wenn Sie ein Argument als Liste angeben, wird die Additionsoperation auf jedes Element angewendet. Ist es nicht bequem, Konstanten und Vektoren gleich zu behandeln?

sess.run(adder_node, {a: [1, 3], b: [2, 4]})

Der Ablauf des Verbindens von Knoten und deren Auswertung in einer Sitzung ist für andere Vorgänge gleich. Die Verarbeitung von Brüchen kann jedoch von den Erwartungen bei Bruchoperationen abweichen. Seien Sie daher vorsichtig, wenn Sie die Operation mit einer einfachen Berechnung überprüfen.

add_and_triple = adder_node * 3.
sess.run(add_and_triple, {a: [1, 2], b: [3.4, 5.6]})

Das Obige wird in einem Notizbuch wie folgt zusammengefasst.

tf.png

In der offiziellen Dokumentation erfahren Sie, wie Sie mit maschinellem Lernen umgehen. Es wird beschrieben, wie Sie Variablen definieren, um ein lineares Modell zu definieren, oder Trainingsdaten angeben, um ein Modell zu erstellen und Ausführungsergebnisse auszuwerten. Sie können die MNIST-Bilderkennung auch mit dem Modul * tensorflow.examples.tutorials.mnist * ausprobieren. Lesen Sie daher die Tutorials nacheinander durch.

Zusammenfassung

Nachdem das Jupyter Docker-Image bereinigt wurde, habe ich versucht, * Basis-Notizbuch *, * Scipy-Notizbuch *, * Pyspark-Notizbuch *, * Tensorflow-Notizbuch * zu verwenden.

Die Anzahl der in Data Science verfügbaren Toolsets nimmt zu, und die Verwaltung der einzelnen Toolsets kann schwierig sein. Durch die Verwendung eines Docker-Images kann jedoch die Komplexität der Erstbereitstellung verringert werden. Die Bereitstellung in großem Maßstab und die Leistungsoptimierung sind ebenfalls problematisch. In Cloud-Umgebungen wie AWS und GCP wird jedoch auch die Verwendung von Containern vereinfacht, wodurch die Erstellung einer hoch portablen Reproduktionsumgebung vereinfacht wird. Es kann gesagt werden, dass es gut ist, dass die Auswahlmöglichkeiten zunehmen, z. B. öffentliche Bilder entsprechend dem Zweck richtig zu verwenden oder selbst zu erweitern.

Recommended Posts

Jupyter Docker Bildzusammenfassung
Docker-Befehlsübersicht
Belichten Sie Ihr Docker-Image
Bildbezogene Befehlsübersicht
Zusammenfassung der Kaggle-Kernel-Methode [Bild]
Versuchen Sie es mit Jupyters Docker-Image
Benutzerdefinierte Einstellungen für Jupyter Lab beim Erstellen eines Docker-Images
Generieren Sie ein Docker-Image mit Fabric
Bis Sie Jupyter in Docker starten
Jupyter Notebook Magic Command Persönliche Zusammenfassung
Führen Sie das Docker-Image von TensorFlow unter Python3 aus
Docker-Image, das cx_Oracle verwenden kann
So schreiben Sie ein Docker-Basis-Image
Erstellen Sie mit Docker eine Jupyter Lab (Python) -Umgebung
"Python Machine Learning Programming" - Zusammenfassung (Jupyter)
Zusammenfassung der Nginx-Einstellungen (Flask + Docker + Gunicorn Edition)
Ich habe mit Jupyter eine einfache Bilderkennung versucht