Datalab SSPCloud

TP Découverte du datalab SSPCloud
Author

Ludovic Deneuville

Introduction

Le datalab SSP Cloud a été créé pour permettre aux statisticiens de la sphère publique et aux étudiants de découvrir, d’expérimenter, d’apprendre, de se former aux outils de la data.

Le principe est d’offrir aux utilisateurs de nombreux services (Jupyter, Rstudio, VSCode, PostgreSQL…) à la demande et une puissance de calcul adaptée aux besoins.

Caution

Ces services sont éphémères, car si les ressources sont importantes, il faut savoir les partager !

Le principe général est le suivant :

  • Vous lancez votre service en réservant des ressources (CPU, GPU, RAM)
  • Vous effectuez votre travail
  • Vous sauvegardez votre code (git) et vos résultats (MinIO)
  • Vous supprimez votre service et libérez les ressources

Ce datalab est une implémentation d’Onyxia, projet Open source initié et porté par le lab de l’INSEE.

Onyxia s’appuie sur des technologies sous-jacentes (Kubernetes, Helm, S3…) pour proposer une interface agréable pour le datascientist. Cependant la philosophie du projet Onyxia est d’être une brique qui facilite le travail sans se rendre indispensable.

1 Créer et configuration de compte

Pour profiter des services, vous devez créer un compte.

1.1 Générer un token GitHub

Sur le datalab, vos services ont une durée de vie limitée.

Pour sauvegarder vos programmes, la bonne pratique est d’utiliser un dépôt git. Nous allons donc créer et utiliser un jeton pour communiquer avec GitHub.

Pour suivre la démarche, il faut disposer d’un compte GitHub. Il est possible de suivre une démarche similaire avec GitLab.

    • Renseigner : nom du token, date d’expiration
    • Cochez repo
    • Cliquez sur Generate token
    • Copiez ce jeton commençant par “ghp_” et gardez le précieusement de côté quelques minutes
Warning
  • Ce jeton ne sera visible qu’une seule fois
  • si vous le perdez ou s’il est expiré, il faut en générer un nouveau

1.2 Déclarer votre jeton

GitHub vous a fournit un jeton. Il faut maintenant le déclarer sur le Datalab (Doc officielle) :

    • nom d’utilisateur Git
    • mail (celui utilisé pour votre compte GitHub)

2 Le stockage

Lorsque l’on travaille dans le cloud, il est essentiel de séparer les données des programmes pour mieux gérer les ressources, renforcer la sécurité en limitant les accès et les permissions, et permettre une scalabilité indépendante des composants.

MinIO est une solution de stockage d’objets open-source qui permet de déployer facilement un stockage évolutif et performant. Elle est compatible avec l’API S3 d’Amazon, ce qui facilite l’intégration avec les applications existantes. MinIO offre une haute disponibilité, une sécurité renforcée grâce au chiffrement des données et des contrôles d’accès, et des performances élevées, particulièrement adaptées aux environnements nécessitant un accès rapide aux données, comme le Big Data et l’intelligence artificielle.

2.1 Votre bucket

Lors de votre création de compte, un bucket est créé avec votre nom d’utilisateur. Dans ce bucket, vous pouvez :

  • créer / supprimer des dossiers
  • importer / supprimer des fichiers
  • créer un dossier nommé diffusion à la racine de votre bucket
    • celui-ci sera accessible en lecture à tous les utilisateurs du datalab

Pour accéder à votre stockage :

2.2 Stocker des fichiers

3 Les services

3.1 Dépôt pour le code

Avant de créer un service, nous allons créer un dépôt GitHub qui permettra de sauvegarder votre code.

    • Repository name : TP-datalab
    • Public
    • Cochez Add a README file
    • .gitignore template : R
    • Choose a license : Apache Licence 2.0
    • Create Repository

3.2 Créer un service

    • De nombreux onglets permettent de configurer votre service
    • Service : possibilité d’utiliser une autre image Docker
    • Resources : choisir CPU et RAM
    • Init : script à lancer au démarrage
    • Attendez quelques secondes le temps que le service se lance
    • username : onyxia
    • password : collez le mot de passe

Votre R Studio s’ouvre et vous remarquez dans l’explorateur en bas à droite que votre repo git a été cloné.

Pour plus de détails, vous pouvez consulter la vidéo en bas de la page.

Prenons l’exemple de ce qu’il se passe en arrière plan lorsque vous lancez un service Vscode-python :

Construction de l’image Docker

Une image Docker est un paquet léger et autonome qui contient tout le nécessaire pour exécuter une application : le code, les bibliothèques, les dépendances, les variables d’environnement et les fichiers de configuration.

Les images Docker permettent de créer des environnements isolés et cohérents, garantissant ainsi la portabilité et la reproductibilité des applications.

  1. Nous partons de l’image de base d’Onyxia
    • ubuntu:22.04 et quelques éléments de config
  2. Nous ajoutons la couche python-minimal
    • installation de python et quelques packages classiques
  3. Nous ajoutons la couche python-datascience
    • Julia, Quarto et des packages de datascience (numpy, pandas…)
  4. Nous ajoutons la couche vscode
    • Installation de Visual Studio Code et configuration

DockerHub

Cette image est construite et déposée sur DockerHub onyxia-vscode-python.

Nous allons ensuite lancer une instance de cette image : un conteneur. Le conteneur est à l’image, ce que l’objet est à la classe.

Pour gérer tous les conteneurs lancés sur le datalab, nous avons besoin d’un orchestrateur : Kubernetes.

Chart Helm

Cependant, nous allons d’abord utiliser Helm pour faciliter le déploiement.

Helm simplifie le processus de déploiement d’applications sur Kubernetes en automatisant les tâches répétitives et en fournissant une gestion centralisée des configurations.

Le chart Helm vscode-python est un ensemble de fichiers de configuration qui facilite le déploiement d’application dans un envrionnement Kubernetes.

Déploiement sur Kube

Kubernetes (K8s) est un système open-source qui automatise le déploiement, la mise à l’échelle et la gestion d’applications conteneurisées. C’est un orchestrateur de conteneurs.

K8s récupére via le chart Helm toutes les infos nécessaires et déploie le conteneur (créé à partir de l’image Docker) sur l’infra du datalab

3.3 Jouer avec votre service

3.4 Accéder à votre stockage

Nous allons utiliser par exemple la librairie aws.s3 pour accéder au stockage.

    • aws.s3 : permet d’interagir avec le service Amazon S3 pour la gestion et le stockage de fichiers en ligne.
    • dplyr : fournit des fonctions simples et rapides pour la manipulation de données
library(aws.s3)
library(dplyr)
bucket_name <- "<username>"
aws.s3::get_bucket(bucket_name, region = "")
specific_folder <- aws.s3::get_bucket(bucket_name, 
                                      region = "", 
                                      prefix = "diffusion/INSEE")

# Affichage sous forme de dataframe
bind_rows(lapply(specific_folder, function(x) {
  data.frame(
    FileName = basename(x$Key), 
    Size = paste0(round(as.numeric(x$Size) / (1024 * 1024), 2), " Mo"), 
    LastModified = format(as.POSIXct(x$LastModified, format="%Y-%m-%dT%H:%M:%OSZ", tz="UTC"), "%Y.%m.%d %H:%M"),
    stringsAsFactors = FALSE
  )
}
))
df <- aws.s3::s3read_using(
  FUN = data.table::fread,
  object = "/diffusion/INSEE/dpt2022_csv.zip",
  bucket = bucket_name,
  opts = list("region" = "")
)
# Top 10 des prénoms féminins en 2021
top10f2021 <- df |>
  filter(sexe == 2, annais == 2021, preusuel != "_PRENOMS_RARES") |>
  group_by(preusuel) |>
  summarise(nombre_total = sum(nombre)) |>
  arrange(desc(nombre_total)) |>
  head(10) |>
  collect()  
aws.s3::s3write_using(
  top10f2021,
  FUN = data.table::fwrite,
  sep = ";",
  col.names = TRUE,
  object = "/diffusion/INSEE/output.csv",
  bucket = "ludo2ne",
  opts = list("region" = "")
)
    • le fichier output.csv a été généré
    • rafraichissez la page si besoin

3.5 Client MinIO

Le client MinIO installé et utilisable depuis le terminal permet également d’interagir avec vos fichiers.

    • le fichier apparait dans votre explorer
    • Car importer les fichiers de données dans son espace de travail n’est pas une bonne pratique
Tip

La commande mc --help liste toutes les commandes possibles (ESPACE pour défiler, CTRL+C pour sortir)

3.6 Sauver son code

    • le fichier tp1.R doit apparaître dans les Untracked files
    • Vous pouvez vérifier sur GitHub que votre fichier tp1.R est bien présent

3.7 Surveiller son service

Vous arrivez sur la page de l’outil Grafana qui permet d’observer les métriques de votre service.

3.8 Terminer son service

Une fois vos travaux terminés, il est temps de libérer les ressources réservées.

De toute manière, vous pouvez aisément reproduire votre travail plus tard :

  • Votre code est sur GitHub
  • Vos données sont sur MinIO
  • Il suffit de relancer un nouveau service

4 Les secrets

Certains éléments ne doivent pas être diffusés dans votre code (jetons d’accès, mots de passe…).

Pour éviter d’avoir à nettoyer votre code à chaque fois que vous le poussez sur GitHub, le datalab propose de gérer vos secrets.

4.1 Créer un secret

    • Nom : PATATE_TOKEN
    • Valeur : 123456
    • Cliquez sur pour valider
    • Nom : PATATE_PORT
    • Valeur : 5236
    • Cliquez sur pour valider

4.2 Utiliser dans un service

Dans votre servives, les deux variables d’environnement ont été créées.

Pour aller plus loin

Le projet Onyxia de A à Z

Une présentation complète du projet Onyxia au Devoxx 2023, de sa philosophie et de son fonctionnement par Olivier LEVITT, Joseph GARRONE et Comte FREDERIC.

Le projet Onyxia (version courte)

Bibliographie