[PYTHON] Résumé de l'image Jupyter Docker

Il s'agit d'une version mise à jour de l'article suivant. L'image est organisée car Jupyter a été mis à niveau vers la série 5.

Jupyter a commencé avec IPython, un outil pour Python, mais comme le processus d'analyse des données peut être partagé sur le Web, il a également été utilisé dans R, et récemment il a été intégré à Spark avec l'infrastructure Hadoop comme back-end. est. Comme représenté par Numpy et pandas, les bibliothèques requises pour l'analyse des données peuvent avoir des dépendances compliquées et peuvent être difficiles à installer, mais Docker peut améliorer la portabilité de l'environnement d'exécution. De plus, comme l'environnement d'exécution peut être séparé pour chaque conteneur, le mécanisme d'exécution de Docker sur Hadoop ([Docker Container Executor --Apache Hadoop 2.7.4](https://hadoop.apache.org/docs/stable/hadoop-yarn] /hadoop-yarn-site/DockerContainerExecutor.html)) est également à l'étude (même si je pense que c'est un peu tôt dans la phase pratique). On pense que ce sera une direction pour utiliser correctement les images légères en fonction du but, je vais donc résumer les images organisées par Jupyter.

Le serveur Jupyter est destiné à une utilisation par un seul utilisateur. Par conséquent, un seul type de mot de passe peut être défini. Veuillez utiliser JupyterHub pour plusieurs personnes.

Liste des images Docker

L'image Jupyter Docker est gérée séparément comme suit. GitHub a un référentiel * jupyter / docker-stacks *, mais Docker Hub a plusieurs images.

Nom de l'image La description
base-notebook Jupyter Notebook 5.0.Vous pouvez utiliser x. La bibliothèque de calculs scientifiques n'est pas incluse.
minimal-notebook base-notebookDes outils de conversion de documents tels que pandoc et texlive ont été ajoutés.
scipy-notebook pandas et scikit-Inclut des bibliothèques d'analyse de données en Python, telles que learn.
datascience-notebook scipy-notebookR et Julia ont été ajoutés à. R plyr etc.condaIl est géré par.
tensorflow-notebook scipy-notebookTensorflow a été ajouté à. Il n'y a pas de support GPU.
pyspark-notebook scipy-notebookSpark 2.2.0 et Hadoop 2.7 a été ajouté. Mesos 1.Il comprend également 2 clients.
all-spark-notebook pyspark-notebookR et Toree et Spylon ont été ajoutés.
r-notebook minimal-notebookR a été ajouté à. plyr etc.condaIl est géré par. Si vous n'utilisez pas Python ou Juliadatascience-notebookPeut être préparé plus léger que.

La relation entre chaque image est facile à comprendre dans le diagramme Visual Overview (ʻinternal / inherit-diagram.png`) dans le référentiel GitHub.

Comme les paramètres de démarrage sont gérés par le script shell de base-notebook, il est recommandé de lire le README de "Base Jupyter Notebook Stack" pour les options et ainsi de suite.

[off topic] Avec Toree et Spylon, vous pouvez écrire des blocs-notes qui utilisent Spark dans Scala. Cependant, le statut du projet va de alpha à bêta, vous devez donc faire attention à la version que vous utilisez lorsque vous l'utilisez. Si vous ne vous souciez pas de Jupyter et que vous souhaitez configurer un notebook qui utilise Spark, Apache Zeppelin est également une bonne option.

Utilisez * base-notebook *

Essayez d'utiliser * base-notebook *. Je ne pense pas qu'il fonctionnera réellement avec cette image, mais comme il s'agit d'une image d'environ 600 Mo, elle est juste pour démarrer rapidement.

Tout d'abord, téléchargez l'image avec la commande pull.

$ 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

Démarrez le conteneur sur le port par défaut 8888. Lorsqu'il démarre normalement, le jeton d'authentification sera affiché sur la console. Copiez l'URL et accédez-y avec un navigateur. Vous pouvez accéder à l'interface utilisateur Web sans jeton et entrer une valeur après * token = * dans la zone de saisie.

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

Ensuite, pour exécuter en arrière-plan, exécutez avec différentes options. Dans ce cas, rien ne s'affiche dans la sortie standard après l'exécution de la commande. Vous aurez besoin d'un jeton d'authentification pour accéder à votre notebook, utilisez donc la commande * logs * pour vérifier les journaux de démarrage. Pour l'argument, spécifiez le nom défini au démarrage du conteneur.

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

Il y a un problème en raison du fait qu'il est difficile de lire l'affichage du journal ultérieurement. Vous pouvez également utiliser la commande jupyter pour renvoyer une liste de serveurs en cours d'exécution, de sorte que vous pouvez obtenir une sortie claire en accédant au conteneur avec la commande * exec * et en exécutant la jupyter notebook list.

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

Jeton d'authentification et mot de passe

La sécurité du serveur de notebook Jupyter se trouve dans les documents suivants:

Il existe deux méthodes, l'une consiste à utiliser un jeton d'authentification et l'autre à utiliser un mot de passe. Les jetons d'authentification peuvent être donnés dans l'en-tête HTTP * Authorization * ou dans le paramètre * token * de l'URL. Par défaut, la méthode d'utilisation du jeton d'authentification est activée, et on peut dire que la méthode donnée par le paramètre * token * de l'URL est affichée dans le message de démarrage.

Le comportement d'activation des jetons d'authentification par défaut a été introduit depuis Jupyter 4.3. Cependant, il semble que la publication n'ait pas été complètement organisée, et il existe de nombreux malentendus lors de la combinaison de plusieurs options.

Si votre ordinateur local ouvre automatiquement le navigateur au démarrage, vous pouvez accéder à l'URL avec un jeton temporaire et enregistrer les informations auxquelles vous pouvez y accéder dans un cookie afin de pouvoir l'utiliser de manière transparente. Cependant, lors du démarrage depuis Docker ou depuis un serveur distant, le démarrage automatique du navigateur est désactivé, il faut donc beaucoup de travail pour l'authentification.

Le jeton d'authentification et le mot de passe peuvent être spécifiés comme options de démarrage.

---- NotebookApp.token: Spécifiez une chaîne fixe au lieu de la génération automatique par défaut. La valeur définie n'est pas sortie dans le journal au démarrage.

---- NotebookApp.password: l'authentification par mot de passe est utilisée sans utiliser le jeton d'authentification dans l'URL et l'en-tête. La chaîne de mot de passe est hachée avec la fonction notebook.auth.passwd.

En principe, vous pouvez désactiver la fonction d'authentification en spécifiant un blanc pour les deux, mais cette méthode est * fortement déconseillée * sauf si vous restreignez l'accès à d'autres couches de votre application Web.

[off topic] Le traitement des options de configuration est implémenté dans notebook / notebookapp.py, donc la relation entre les options est le code source. Est précis à lire. L'implémentation utilise Traitlets, c'est donc une bonne idée d'ouvrir la référence pendant la lecture.

La fonction notebook.auth.passwd est simplement importée et appelée sans argument. Entrez le mot de passe que vous souhaitez spécifier et ressaisissez-le pour confirmation. Sort le résultat haché.

notebook_auth_passwd-on-Try Jupyter.png

Pour l'enregistrer en tant que fichier de configuration, exécutez jupyter notebook password ou python -m notebook.auth password. Le premier est meilleur. Entrez le mot de passe que vous voulez exécuter et définissez deux fois et le fichier de paramètres sera enregistré dans .jupyter / jupyter_notebook_config.json. Si vous le conservez sous forme de fichier, vous pouvez le gérer en montant le fichier sur la machine hôte à partir du conteneur Docker. Le fichier de configuration peut également être géré par Python.

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

Ici, redémarrez le conteneur pour refléter le contenu du fichier de paramètres. Lorsque vous rechargez le navigateur, une zone de texte pour saisir le mot de passe s'affiche, alors assurez-vous que vous pouvez vous connecter avec le mot de passe défini ci-dessus.

$ docker stop basenb
$ docker start basenb

De plus, comme le jeton d'authentification n'existe plus, l'URL avec le jeton n'est pas sortie dans le journal et le jeton n'est pas affiché même avec la commande jupyter notebook list. Cela nous a permis de passer du jeton d'authentification par défaut à l'authentification par mot de passe.

Configuration par option de démarrage à partir de la commande docker

Dans certains environnements, il ne convient pas de vérifier le journal ou de monter le fichier à chaque démarrage. Dans de tels cas, donnez un jeton d'authentification ou un hachage de mot de passe dans les options de démarrage.

Utilisez start-notebook.sh lors du démarrage du conteneur et spécifiez les options ci-dessus.

Lors de l'attribution d'un jeton d'authentification:

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

Lorsque vous donnez un hachage de mot de passe:

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

Si vous souhaitez donner à la fois un jeton d'authentification et un hachage de mot de passe, exécutez avec les deux options.

En gros, il est préférable de gérer avec un mot de passe, mais si vous souhaitez l'exécuter dans un environnement cloud et le partager facilement uniquement avec une URL, la méthode du jeton d'authentification est également bonne. Cependant, veuillez suivre la politique de sécurité de l'environnement utilisateur pour les restrictions sur l'adresse IP de la source d'accès.

Pour les autres paramètres SSL, reportez-vous aux documents suivants.

Utilisez * scipy-notebook *

Maintenant que nous avons organisé les problèmes de démarrage, dessinons un graphique en utilisant une autre image Docker.

Téléchargez l'image * scipy-notebook * et vérifiez la capacité.

$ 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

Commencez en arrière-plan et vérifiez le jeton.

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

Accédez au serveur de notebook avec un navigateur Web et créez un nouveau notebook Python 3.

Tout d'abord, exécutez le chargement du module standard comme indiqué ci-dessous.

Chargement du module Python


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

Ensuite, générez les données sinus et cosinus pour la fonction triangulaire.

sin/Définition de cos


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

Dessinons avec l'API matplotlib. Spécifiez deux séries de données, donnez des noms aux axes X et Y et donnez un titre au graphique. Si vous souhaitez utiliser le japonais, placez le fichier de police dans le conteneur. [^ 1]

[^ 1]: reportez-vous à cet article pour savoir comment définir l'axe du graphique en japonais. Paramètres japonais pour les axes matplotlib et Seaborn - Qiita

Dessiner avec l'API matplotlib


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

Dessinez la même chose avec l'API pandas DataFrame. Le graphique lui-même est facile, mais la valeur de retour matplotlib.AxesSubplot est utilisée pour les paramètres d'axe et ainsi de suite. De plus, pour faciliter la compréhension de la différence avec le graphique ci-dessus, Seaborn a changé le style pour des bordures plus sombres.

Dessiner avec l'API DataFrame


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

Ensuite, dessinons un graphique boursier en utilisant Bokeh. Les données sur le cours des actions sont obtenues auprès de Yahoo! À l'aide de * pandas-datareader *. * pandas-datareader * est indépendant du package * pandas.io *.

Utilisez pip pour installer le module. Préfixez la commande avec un "!" Pour exécuter la commande à partir du notebook.

Installer le module à l'aide de pip


!pip install -y pandas-datareader

ex1.png

Obtenez les données en spécifiant la date.

Obtenez des données avec l'API


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

Activez Bokeh sur votre ordinateur portable.

Activer le bokeh


import bokeh.plotting as bplt
bplt.output_notebook()

ex3.png

Dessinez un graphique. Bokeh utilise JavaScript pour effectuer le rendu dans un navigateur, vous pouvez donc utiliser le japonais sans avoir à mettre une police japonaise du côté du conteneur.

Dessinez un graphique avec Bokeh


p = bplt.figure(title='Nikkei moyenne', 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

Utilisez * pyspark-notebook *

J'utiliserai également l'image de PySpark. Des paramètres supplémentaires sont nécessaires pour se connecter à un cluster Spark en cours d'exécution, mais une opération autonome suffira pour de simples vérifications d'opération d'API.

Téléchargez l'image * pyspark-notebook * et vérifiez la capacité.

$ 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

Commencez en arrière-plan et vérifiez le jeton.

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

Accédez au serveur de notebook avec un navigateur Web et créez un nouveau notebook Python 3.

Essayez de courir de haut en bas selon la documentation officielle. Comme le code source n'est pas cloné, les données sont téléchargées et utilisées individuellement.

Créer une session Spark


from pyspark.sql import SparkSession

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

Téléchargez le fichier en utilisant la commande wget.

Télécharger les données


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

Chargez des données à l'aide de l'API DataFrame. Affichez les données et le schéma et assurez-vous également que vous pouvez sélectionner les données par spécification de colonne.

Lire les données


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

Assurez-vous également que vous pouvez utiliser SQL. Ce sera plus facile pour les tableaux simples.

Utilisation de SQL


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

Utilisez * tensorflow-notebook *

J'essaierai également d'utiliser l'image de TensorFlow. Aucun GPU ne devrait suffire pour essayer l'API TensorFlow Core.

Téléchargez l'image * tensorflow-notebook * et vérifiez la capacité.

$ 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

Commencez en arrière-plan et vérifiez le jeton.

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

Accédez au serveur de notebook avec un navigateur Web et créez un nouveau notebook Python 3.

Vérifiez le fonctionnement de l'API selon la documentation officielle.

Tout d'abord, importez le module et définissez le nœud constant.

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

Définissez une session et évaluez le nœud. Donnez aux méthodes * run () * de la session une liste de nœuds.

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

Définissez un nœud qui applique l'opération d'ajout aux deux nœuds constants et évaluez le nœud.

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

Permet de donner une entrée pendant l'évaluation plutôt qu'un nœud constant. TensorFlow utilise un type de données appelé * espace réservé *. Notez que ʻa + best un raccourci pourtf.add (a, b)`.

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

Spécifiez une valeur pour l'argument * feed_dict * lors de l'appel de la méthode * run () * de la session.

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

Si vous donnez un argument sous forme de liste, l'opération d'ajout est appliquée à chaque élément. N'est-il pas pratique de traiter les constantes et les vecteurs de la même manière?

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

Le flux de connexion des nœuds et de leur évaluation dans une session est le même pour les autres opérations. Cependant, le traitement des fractions peut être différent de ce à quoi vous vous attendiez dans les opérations fractionnaires, soyez donc prudent lorsque vous vérifiez l'opération avec un simple calcul.

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

Ce qui précède est résumé dans un cahier comme suit.

tf.png

La documentation officielle explique à partir de là comment gérer l'apprentissage automatique. Il décrit comment définir des variables pour définir un modèle linéaire ou fournir des données d'apprentissage pour créer un modèle et évaluer les résultats de l'exécution. Vous pouvez également essayer la reconnaissance d'image MNIST avec le module * tensorflow.examples.tutorials.mnist *, c'est donc une bonne idée de lire les didacticiels dans l'ordre.

Résumé

Maintenant que l'image Jupyter Docker a été nettoyée, j'ai essayé d'utiliser * base-notebook *, * scipy-notebook *, * pyspark-notebook *, * tensorflow-notebook *.

Le nombre d'ensembles d'outils disponibles en science des données augmente et la gestion de chacun d'entre eux peut être difficile, mais l'utilisation d'une image Docker peut éliminer la complexité du déploiement initial. Le déploiement à grande échelle et le réglage des performances sont également des préoccupations, mais dans les environnements cloud tels qu'AWS et GCP, l'utilisation de conteneurs est également simplifiée, ce qui facilite la création d'un environnement de reproduction hautement portable. On peut dire qu'il est bon que la gamme de choix augmente, comme utiliser correctement les images publiques en fonction de l'objectif ou se développer par vous-même.

Recommended Posts

Résumé de l'image Jupyter Docker
Résumé de la commande Docker
Exposez votre image Docker
Résumé des commandes liées à l'image
Résumé de la méthode du noyau de Kaggle [Image]
Essayez d'utiliser l'image Docker de Jupyter
Paramètres personnalisés pour Jupyter Lab lors de la création d'une image Docker
Générer une image Docker à l'aide de Fabric
Jusqu'à ce que vous démarriez Jupyter dans Docker
Résumé personnel de Jupyter Notebook Magic Command
Exécutez l'image Docker de TensorFlow sur Python3
Image Docker pouvant utiliser cx_Oracle
Comment écrire une image de base Docker
Créer un environnement Jupyter Lab (Python) avec Docker
Note récapitulative sur la programmation d'apprentissage automatique Python (Jupyter)
Résumé des paramètres de Nginx (édition Flask + Docker + Gunicorn)
J'ai essayé la reconnaissance d'image simple avec Jupyter