2 points par GN⁺ 2024-12-13 | 1 commentaires | Partager sur WhatsApp
  • Implémentation d’un clone de ChatGPT

    • Ce programme est une implémentation sans dépendances de GPT-2.
    • Il charge les matrices de poids depuis des fichiers TensorFlow et les fichiers BPE, puis tokenise l’entrée avec un encodeur byte pair simple.
    • Il implémente un package d’algèbre linéaire de base, définit l’architecture du transformeur, exécute l’inférence du transformeur, puis détokenise la sortie avec un décodeur BPE.
    • Il est écrit en environ 3000 octets de C.
    • Il est optimisé efficacement, ce qui permet au modèle GPT-2 Small de répondre en quelques secondes sur du matériel moderne.
    • Il implémente le KV caching et un algorithme efficace de multiplication de matrices.
  • Structure du programme

    • Bibliothèque de mathématiques matricielles de base (700 octets)
    • Multiplication de matrices rapide (300 octets)
    • Couches de réseau neuronal (300 octets)
    • Modèle de transformeur (600 octets)
    • Byte pair encoding (400 octets)
    • Entrées/sorties (200 octets)
    • Chargement des poids (300 octets)
    • Chargement du byte pair encoding (300 octets)
  • Contexte sur ChatGPT et les transformeurs

    • ChatGPT est une application permettant de converser avec un modèle de langage.
    • GPT-4 est le modèle le plus récent et il est très impressionnant.
    • Ce programme en C reproduit le fonctionnement de ChatGPT en utilisant GPT-2, un modèle plus faible datant de 2019.
    • GPT-2 est un transformeur qui prend en entrée une séquence de mots de taille fixe et prédit le mot suivant.
  • Explication du code C

    • Premiers pas avec les mathématiques matricielles (700 octets)

      • Les réseaux neuronaux sont composés d’opérations sur des matrices.
      • Une bibliothèque matricielle est construite à partir d’une définition minimale des matrices.
      • Des macros sont utilisées pour extraire la logique commune en méta-routines.
    • Multiplication de matrices rapide (300 octets)

      • La multiplication de matrices de base est implémentée à l’aide de trois boucles.
      • Grâce au fonctionnement de la mémoire et du cache, il est plus rapide de relire et réécrire plusieurs fois la même mémoire.
    • Couches de réseau neuronal (300 octets)

      • Quelques couches de réseau neuronal spéciales sont définies pour écrire le transformeur.
      • La fonction d’activation GELU et une fonction de définition de la sous-diagonale nécessaire à l’attention causale, entre autres, sont implémentées.
    • Architecture du transformeur (600 octets)

      • Le transformeur est implémenté en 600 octets.
      • À chaque couche, les clés, requêtes et valeurs sont calculées, la matrice d’attention est générée, puis les résultats sont combinés.
    • Byte pair encoding (400 octets)

      • Les modèles de langage ont besoin d’entrées de taille fixe, donc des fragments de mots sont utilisés pour générer des tokens.
      • Un mot donné est découpé en caractères individuels, puis les paires de tokens adjacentes sont fusionnées.
    • Chargement des poids (300 octets)

      • Les poids du réseau neuronal sont chargés depuis le disque.
      • Les poids sont sérialisés en nombres flottants 32 bits.
    • Chargement du byte pair encoding (300 octets)

      • Le vocabulaire du byte pair encoding est chargé depuis le disque.
      • Le format de fichier est constitué d’une liste de byte pair encoding.
  • Conclusion

    • Il est possible de compresser des décennies de progrès en machine learning en quelques milliers d’octets.
    • C’est un exemple de réseau neuronal simple qui inclut tout sauf les poids réels du modèle.

1 commentaires

 
GN⁺ 2024-12-13
Avis Hacker News
  • Quand j’ai utilisé GPT-2 pour simuler une conversation avec un ami, c’était amusant et parfois étonnamment précis. Je me demande si le grand saut entre GPT-2 et GPT-3 vient de modèles plus grands, de plus de données, ou des deux. Le RLHF fait une grande différence, mais même le modèle GPT-3 de base était très utile avec suffisamment d’exemples

  • C’est un bon exemple qui montre à quel point un réseau de neurones simple peut réellement être simple. L’intelligence artificielle est la magie noire que nous utilisons pour gagner de l’argent

  • Je n’ai pas exécuté le code, mais j’ai été impressionné par sa petite taille. Les premiers programmes ELISA étaient plus gros. Ces 4 dernières années ont permis de faire tenir cela au byte près. S’il y a un indice sur l’endroit où se trouve la magie, j’aimerais bien qu’on me l’explique. Je me demande si c’est la fonction GELU ou le modèle téléchargé via un script bash

  • GPT-2 a écrit mon conte préféré. Lien : The Princess, the Fairy Godmother, and the Chest

  • Je me demande si GPT-2 a réellement été ajusté pour pouvoir servir au chat. Sinon, je pense que l’appeler un clone de ChatGPT est un peu exagéré

  • LISP n’est pas toujours meilleur que C. Cette fois, c’est acceptable. Si vous avez raté le lien vers le code, le voici : C-Chat-GPT-2

  • Je me demande sur quel matériel cela peut tourner. Je me demande si l’on peut utiliser les poids quantifiés de Hugging Face, et pour quels types de problèmes ou de requêtes cela est particulièrement adapté

  • De nos jours, on peut facilement implémenter son propre ChatGPT avec gptscript. Lien : gptscript

  • Je ne comprends pas en quoi les macros C ressemblent aux expressions régulières. Les macros C font correspondre des mots et les remplacent par un autre texte. Les expressions régulières font correspondre du texte à des motifs relativement complexes, et ne font pas de substitution de texte par elles-mêmes

  • Je me demande si quelqu’un l’a exécuté en local pour voir à quoi ressemble la sortie générée par ce GPT-2