GTnotebook
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Write
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Help
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Write
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    --- title: Webinaire 7 GT Notebook date: 2024-04-02 --- # Webinaire 7 GT Notebook - 4 octobre 2024 12h30-14h00 ###### tags: `gt notebook`,`webinaire` :::warning Il y avait une coquille dans l'objet du mail, **il s'agit bien du Vendredi 4 octobre 12h30-14h00**. ::: ![](https://i.imgur.com/9H8EYaz.png =200x) :::info - Présent.e.s : - Sébastien Rey-Coyrehourcq, UMR IDEES, GT Notebook - Hugues Pécout, Géographie-Cité, GT Notebook - Konrad Hinsen - Nicolas Roelandt - Nicolas Sauret - Excusé.e.s : - Lien site web : https://gt-notebook.gitpages.huma-num.fr/site_quarto/ - Issue & ODJ : https://gitlab.huma-num.fr/gt-notebook/webinaires/-/issues/8 - Lien visio BBB : https://webconf.univ-rouen.fr/greenlight/rey-px2-ewg-7av - Lien d'inscription : https://enquetes-ng.univ-rouen.fr/index.php/719751 - Lien chat public : https://rocket.esup-portail.org/channel/GT-Notebook - Lien mailling-list : https://groupes.renater.fr/sympa/info/notebooks-inter-reseaux - Lien support présentation et notebooks de démonstration: ::: ## Ordre du Jour (Vendredi 04/10) - Accueil (5 minutes) - Interventions 15/20 minutes + 5 minutes de question de : - Bernard Chambon (Ingénieur en développement logiciel, IN2P3, Villeurbane ) - Benoist GASTON (Ingénieur de Recherche HPC au CRIANN, Rouen) - Pierre-Antoine Boutier (Ingénieur de recherche GRICAD, Grenoble) - Ludovic Courtès (Ingénieur de Recherche Inria, Bordeaux) - Infos / événements ## Accueil et description de la session Pour cette septième édition du webinaire du GT Notebook, nous avons décidé de faire un focus sur **l'execution des Notebooks dans un environnement HPC**. Ces dernières années, avec - entre autre- le développement rapide et soutenu du Machine Learning et de la Data Science dans de multiples disciplines, de nouvelles communautées avec de nouveaux besoins se sont manifestés auprès des équipes d'ingénieur·e·s dans les centres de calculs. Ces usages s'appuient sur le format Notebook (Jupyter, etc.), or celui n'est pas/n'était pas historiquement conçu pour un usage sur des clusters. C'est ce qui a poussé des équipes d'ingénieurs à développer différentes solutions pour déléguer les calculs réalisé dans les Notebook, en intervenant soit au niveau de la cellule, soit au niveau du Notebook lui-même. Dans ce webinaire, et grâce à nos intervenants, nous allons voir quelques une des approches déjà en production au sein de différents centres de calcul. ## Présentations ### Bernard CHAMBON / The Jupyter notebooks platform at CC-IN2P3 :::info Bernard CHAMBON est ingénieur en développement logiciel au Centre de Calcul de l'IN2P3 (CC-IN2P3, UAR6402 rattachée à l’IN2P3). Il a mis en place et est responsable de la plateforme des notebooks Jupyter. Le Centre de Calcul de l'IN2P3 fournit des moyens de calcul et de stockage à de grandes expériences de physique. Il participe, avec d'autres centres internationaux, au traitement de données des expériences installées sur l’accélérateur LHC. Il fournit aussi des moyens pour des expériences de physique des astroparticules, comme celui du futur télescope LSST, ou encore le satellite européen EUCLID. Ma présentation a pour objectif de donner une vue d'ensemble de la plateforme de notebooks Jupyter, mise en place depuis 4 ans, pour permettre à nos utilisateurs de faire de l'analyse interactive de données. Je ferai un focus sur l'utilisation du framework Dask pour distribuer des tâches, depuis un notebook, sur des nœuds de calcul gérés par le système de batch SLURM. ::: #### Notes Distribuer sur le système de dask sur slurm - service d'analyse aux utilisateurs - identification sso de cc-in2p3 - jupyterhub : plurilingue ![image](https://hackmd.io/_uploads/S1TQwrpCC.png) Basé sur Jupyterhub : - composant qui permet de faire de l'authentification ou authentification externe - spawn image docker (autre notebook jupyter) - formulaire d'options - possibilité architecture ![image](https://hackmd.io/_uploads/S1QtDr6AA.png) ![image](https://hackmd.io/_uploads/HyletHaC0.png) Docker va instancier les serveurs de notebook, qui sont connecté aux différents système de stockages (home du user, espace dédié). Compte calcul = qui a la possibilité d'utiliser SLURM, et aussi le service Notebook, le SSO se fait via Keycloak Les groupes vont driver le montage des points de montage dans le docker qui va être spawnée JupyterNotebook - Centos (passage vers RHEL prévision) Pour la RAM, 2gb, assez faible mais cela peut servir pour pas mal de personnes de base. Dès qu'on a des utilisateurs qui veulent plus, on augmente snas trop de souci. 10aine utilisateur à 64gb par exemple. Pas de limite en nombre de CPU mais on monitore et on peut contraindre si besoin. La durée de vie des Notebook il n'y a pas de temps limite du moment que celui-ci est actif. On monitor les notebook idle, et on a timeout sur 3 jours. GPU aussi sur la plateforme. Ressource plus rare donc timeout un peu plus court. CAdvisor va remonter de l'information et graphana derrière nous permet de voir des graphiques pour monitorer. Dask composant logiciel utilisé : - dask scheduler fait l'interface entre dask client et dask worker - dask worker - dask client (tourne dnas le notebook de l'utilisateur) Deux ports : - 1 pour le dask client vers le dask scheduler - 2 ème port pour le dashboard pour avoir les métriques du daskworker, on a ca via une extension. Les dask worker doivent avoir accès aux point de montage car il y'a en général des données volumineuses. Dask : - peut utiliser des ressources locales ou HPC. - structure de données connus des utilisateurs - lazy evaluation : tableau de fonction non executée directement, par exemple : `@delay` et c'est la méthode `compute()` qui déclenche son execution Il faut écrire du code en python, et surtout il faut connaitre Dask. L'utilisatuer doit spécifié : - Package "Dask4IN2P3" pour gérer un peu toute la plomberie : définit le venv et dépendances du virtual env - Ram / Cpu - info de timeout, etc Ils ont définit une partition spécifique pour SLURM pour que cela démarre plus vite (haute priorité) => résultat, c'est assez rapide ! **Demo** : quel impact pour la parallelisation : combien de temps gagné du fait de didtribuer ces tâches sur un gd nbr de points d'execution. Possibilité d'avoir plusieurs dask client sur le meme dask cluster. 60 70 utilisateurs en moyenne 100 max possibilité de formations également 250 cores, 18000 coeurs et quasi pas d'attente sur le batch slurm #### Questions **Sébastien :** Quelles perspectives en terme de développement : quelles évolutions ? BC: 60-70 utilisateurs en régime nominale. L'infra en elle-même va bien, mais demande pour du GPU. Demande pour des N40S (nvidia) → 20 utilisateurs supplémentaires 6000 lignes de code python pour paramétrer le JHub. Diff. game de machines (petite; moyenne, grande) au regard de la mémoire disponible **Matthieu H. :** Qu'est-ce qui limite la scalabilité dans ce cas ? Le framework Dask ? La bande passante disque pour lire et écrire les images ? Dask+SLURM : utilisé surtoute pour processer de gros volumes de données (TeraB). Pour garder de l'interactivité (car on travaille dans des notebooks), on doit paralleliser :-1: - 30 To de données, 1500 fichiers de 20Go chacun **Nicolas R. :** Pourquoi passer de CentOS à RHEL ? Quid 'almaLinux ? le centre de calcul est en train de migrer vers RHEL9. (fin de support de CentOS 7) **Tru H.:** des demandes de visualisation 3d dans les notebooks? pas de visualisation 3D ### Benoist GASTON / Service Jupyter du supercalculateur Austral du CRIANN :::info Benoist Gaston est ingénieur HPC au sein de l'équipe calcul du CRIANN (Centre Régional Informatique et d'Application Numériques de Normandie).Il est rattaché au CCFR (Centre de Compétence HPC, HPDA et IA) du projet EuroCC qui accompagne les entreprises et le secteur public dans l'usage du HPC. La présentation portera sur le service Jupyter déployé sur Austral, le nouveau supercalculateur du Criann en précisant son fonctionnement et l'usage qui en est fait principalement la communauté de l'IA et du traitement des données. ::: #### Notes CRIANN : association (1992) des établissements ESR de normandie, rectorat, établissements de santé) Mutualisation services haute performance (centre de données,réseau, centre de calcul) 14 employés (tech & admin) financement publics : région, état + qlq industriels Certifications ISO 27001 et Habilitation Données de Santé Service HPC : mésocentre régional : première marche avant d'aller chercher des ressources nationales EuroCC : projet européen qui regroupe des centres HPC en Europe, faciliter usage HPC et technologies associées (HPDA, IA et calcul quantique) assure des moyens de calcul souverains utilisateurs : - 30 labo et industries - simulation numérique, physique des matériaux, et plus récemment économie, géographie, biologie, SHS besoin de traitement de données à haute performance (HPDA - High Performance Data Analysis) plutôt que du HPC pure. - communauté Ia depuis 2017 (besoins HPC croissants en physique, mathématique, chimie, etc) demande croissante en terme de matériel : GPU tester de manière interactive leur code avant de lancer le supercalculateur Besoins de calcul importants pour créer les modèles et pas seulement pour traiter les données - suite logicielle importante du fait de l'augmentation des disciplines et des besoins (simulation, biologie, mécanique des fluides, modélisation, macanique, acoustique, mathématiques, machine/deep learning,) acquisition d'un supercalculateur Austral, qui a pris la suite de Miria ![Supercalculateur Austral](https://hackmd.io/_uploads/r101-8T0R.png) Processeurs AMD GENOA (23000 coeurs), 88 GPU NVIDIA A100 répartis sur 11 noeuds, un GPU peut être divisé en 7 sous-GPU JupyterHub: - besoin de pouvoir tester du code interactivement - un bassin d'utilisateurs croissant (doctorants) - gestion de la connexion avec authentification - sessions jupyter courtes (temps limités) - accès aux environnements AUSTRAL Sur austral : session JH courte qui tourne sur les sessions de calcul directement. L'utilisateur peut aller se connecter sur JH, démarrer un service Jupyter et travailler un env. logiciel disponible sur Austral, mais pour une durée limitée. JH ne cible qu'une partie d'Austral (via SLURM). basé sur la solution déployée par l'Idris (Jean Zay) Selection de profil de calcul à la connexion sur le JH → définit une durée d'utilisation (8h) Tache executé par slurm c'est un service jupyterlab Si pas de ressources disponible le service ne démarre pas. Liste de Kernel dispo est celle installé sur Austral Service Tensorboard pour visualiser leurs modèles et widget Daskboard pour les utilisateurs de Dask Utilisation native sur le serveur, pas d'utilisation de container #### Questions **Yann S.:** pourquoi ne pas acheter de gpus "bas de gamme" plutôt que de scinder les A100 avec MIG? Est-ce qu'il y a un intérêt au niveau coût? **Pierre-Antoine B. :** @Yann : un premier élément de réponse : - le ratio puissance/conso est quand même meilleur - les GPU "bas de gamme" (en réalité plus ancien) ne sont plus forcémnet disponibles à l'achat **Benoist G.:** On a de toutes les façons des utilisateurs qui ont besoin de ces A100. À l'usage, les utilisateurs préfèrent peu de grosses bêtes plutôt que plein de petites. **Antoine Fortuné:** Les environnements (kernels) sont géré par conda ? Oui! et certains packages sont installés à la main. **Matthieu H.:** Une instance jupyterlab = 1 et un seul noeud de calcul complet dédié ? ou il y a la possibilité de demander plus ou moins ? non, une instance JLab = la ressource qui est dédiée par SLURM sur les "job profile" ![selection de job profile](https://hackmd.io/_uploads/Skf6V86CA.png) **Tru Huynh:** les utilisateurs peuvent-ils ajouter leur propre "kernel"? Oui, ils peuvent le faire s'ils sont agguéris : config en local de python puis ..? --- ### Pierre-Antoine Bouttier / Titre à définir :::info Pierre-Antoine Bouttier est ingénieur de recherche CNRS en ingéniérie logicielle, actuellement directeur adjoint de l'UAR GRICAD. GRICAD, sous la tutelle de l’UGA, du CNRS, de G-INP et de l’INRIA, a pour mission de soutenir les communautés de recherche grenobloises dans leurs besoins en calcul scientifique ainsi qu'en gestion des données et des logiciels de recherche. Parmi les services proposés par l'unité, GRICAD opère plusieurs supercalculateurs afin de répondre aux besoins en calcul intensif de l'ensemble des communautés de recherche. Cette présentation détaillera comment GRICAD, à travers des services dédiés ou via l'usage des supercalculateurs, offre des possibilités pour travailler avec les bloc-notes Jupyter. S'ensuivront quelques réflexions sur les relations entre calcul et traitement de données intensifs et Jupyter. ::: #### Notes GRICAD : Mésocentre de calcul grenoblois Unité qui fournit des conseils de l'accompagnement, formations au profit des communatués de recherche grenobloises → fournit des services et infrastructures pour le calcul intensif ![image](https://hackmd.io/_uploads/By6L8860A.png) **Services fournies et infrastructure** 1/ JupyterHub@Gricad : accessible tous personnels du référentiel UGA 20Go données par utilisateur, avec données persistantes l'intérêt de ce jupyterhub est assez limité: pas très puissant, pas de GPU, mais très intéressant pour l'enseignement (mais hors mission). Pas de GPU (donc pas d'IA) quelques utilisateurs à quelques centaines simultanés (principalement formations) 2/ Cloud computing VM à la demande avec des ressources ajustables, en fonction de demandes liés à des projets. Centaines de Go, dizaines de Go RAM, 1 vGPU Installation et maintenance des VM à la charge des utilisateurs - usages diversifiés - liberté totale sur la pile logicielle - inconvénient : demande des connaissances et compétences en administration système : vrai frein pour certaines communautés 3/ Supercalculateurs : - Dahu: HPC classique et traitement massif de données - Bifoot: IA et calcul sur GPU **Jupyter sur un super calculateur** ![image](https://hackmd.io/_uploads/B1lDDI6AR.png) Connexion via SSH, réservation de ressources - mode interactif - mode passif (simulation préparée en avance) installation de Jupyter grâce à GUIX et configuration avec 2 lignes à ajouter au fichier de configuration Tunnel SSH pour l'accès à l'interface (bien lire la doc et faire les copier-coller au bon endroit) Remarques: - accès à l'ensemble eds espaces de stockage du cluster - complexe au début pour les non-initiés - usage du supercalculateur en mode interactif : frein ? **Remarques sur les notebooks et HPC** HPC l'usage interactif n'est pas nominal/standard car les temps d'attente/calculs peuvent être très longs (plusieurs jours) Problème si 1h réservée : il faut être présent quand les ressources disponibles Pourquoi un notebook sur un cluster ? besoin de plus de puissance (données massives) ce qu'on peut améliorer: - côté utilisateur : - le besoin de HPC est un indicateur pour extraire le code du notebook et passer sur un projet de dév logiciel à part entière, propre au HPC - permet d'appliquer des bonnes pratiques de développement de logiciel de la recheche (gestion de version, modularité, maintenance) - côté GRICAD : - fournir des solutions simples pour accéder aux ressources (cloud computing → VM toute prêtes avec des gabarits de ressources) - mieux accompagner les utilisateurs #### Questions Pierre Antoine : Quid de la reproductibilité de l'env. logiciel (cf GUIX) dans le cadre d'un projet notebook... ? --- ### Ludovic Courtès / Vers un environnement reproductible pour les blocs-notes Jupyter :::info Les blocs-notes de Jupyter Notebook s'imposent comme un moyen permettant aux chercheur·euses de partager et de reproduire des expériences impliquant du calcul. Certains centres de calcul permettent maintenant d'utiliser leurs ressources à travers Jupyter, grâce à une instance JupyterHub. Chaque bloc-notes fait appel à des outils extérieur : un interprète, un compilateur, des bibliothèques, etc. Cependant, ces dépendances ne sont pas explicites dans le bloc-notes. Dans ces conditions, comment garantir que deux personnes exécutant le bloc-notes dans un environnement différent obtiendront le même résultat ? Dans cet exposé, je présenterai [Guix-Jupyter](https://gitlab.inria.fr/guix-hpc/guix-kernel), un noyau Jupyter qui vise à fournir un environnement d'exécution contrôlé et reproductible pour les blocs-notes Jupyter. Un bloc-notes Jupyter utilisant ce noyau peut spécifier sous forme d'annotations l'environnment logiciel nécessaire à son exécution. Chaque cellule s'exécute ensuite dans un environnement défini avec le noyau choisi : Python, Julia, R, etc. Guix-Jupyter utilise en coulisse GNU Guix pour le déploiement logiciel ; je décrirai l'architecture utilisée et en discuterai les avantages et inconvénients. Je montrerai comment cette approche a le potentiel de rendre les bloc-notes Jupyter réellement reproductibles et portables en la comparant à d'autres approches. ::: #### Notes Jupyter = science reproductible (?) aide beaucoup pour la reproductibilité (code + analyse mélangé) Mais pas d'informations sur ce qui se passe réllement ? Approche locale: est-ce que les dépendances sont installées ? Est-ce que ça ne va pas installer quelque chose dans l'environnement utilisateur ? Approche MyBinder : repose sur des outils (pip, apt, ) avec des fichiers de configuration Problème : il faut des connaissances en administration système (surtout piur des mésocentres) pas forcément réalisable par une personne seule 4 possibilités pour des calculs reproductibles 1. inspecter les données et le code 2. faire tourner sur l'ordinateur de son choix (pas possible avec MyBinder) 3. explorer le comportement du code 4. vérifier les objets produits Problème du cloud: utilisation d'ordinateurs appartenant à d'autres personnes, perte d'autonomie Peut on faire du Notebook autocontenu ? guix: déployer des environnements logiciels de manière reproductible guix+Jupyter: noyau Jupyter qui permet de déployer un environnement logiciel définition d'un environnement dans une cellule de conficguration que Guix va créer Possibilité d'utiliser guix search depuis le notebook guix pin <numéro de commit> : définition de l'ensemble des paquets disponibles noyau guic-jupyter sert d'intermédiaire entre jupyter et les noyaux Python/R/Julia Possibilité d'avoir des cellules qui appellent plusieurs noyaux Exécution du noyau complètement isolé dans un container (un seul répertoire, un seul utilisateur) => impossible de faire référence à un fichier qui n'est pas sur la machine Télécharger des données dont le contenu est connu à l'avance avec guix (contrôle de la validité via un hash) => faire référence aux mêmes données Guix-jupyter : expérience sans vraiment d'utilisateurs, beaucoup de questions (interopérabilité) Pour résumer - notebooks auto-suffisants - lancer du code reproductible - une 3ème point que j'ai oublié #### Questions **Bernard Chambon** - Qu'est-ce qui limite la scalabilité dans ce cas ? Le framework Dask ? La bande passante disque pour lire et écrire les images ? --- ### Infos / événements ### JE de l'automne

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully