atomgpt-oss : Guide d'exécution

Exécutez et affinez les nouveaux modèles open-source d'OpenAI !

OpenAI publie 'gpt-oss-120b' et 'gpt-oss-20b', deux modèles de langage ouverts SOTA sous licence Apache 2.0. Les deux modèles à contexte 128k surpassent des modèles ouverts de taille similaire en raisonnement, utilisation d'outils et tâches agentiques. Vous pouvez maintenant les exécuter et les affiner localement avec Unsloth !

Exécuter gpt-oss-20bExécuter gpt-oss-120bAjustement fin gpt-oss

circle-check

Affiner gpt-oss-20b gratuitement avec notre notebook Colabarrow-up-right

Entraîné avec RL, gpt-oss-120b rivalise avec o4-mini et gpt-oss-20b rivalise avec o3-mini. Les deux excellent en appel de fonction et raisonnement CoT, surpassant o1 et GPT-4o.

gpt-oss - GGUFs Unsloth :

circle-check

📜Corrections Unsloth pour gpt-oss

circle-info

Certaines de nos corrections ont été intégrées en amont dans le modèle officiel d'OpenAI sur Hugging Face. Voirarrow-up-right

OpenAI a publié une bibliothèque autonome de parsing et tokenisation appelée Harmonyarrow-up-right qui permet de tokenizer des conversations au format préféré par OpenAI pour gpt-oss.

Les moteurs d'inférence utilisent généralement le template de chat jinja à la place du package Harmony, et nous avons trouvé certains problèmes en les comparant directement à Harmony. Si vous regardez ci-dessous, le haut est la forme correctement rendue par Harmony. Ce qui suit est ce qui est rendu par le template de chat jinja actuel. Il y a pas mal de différences !

Nous avons aussi créé des fonctions pour vous permettre d'utiliser directement la bibliothèque Harmony d'OpenAI sans template de chat jinja si vous le souhaitez - vous pouvez simplement parser des conversations normales comme ci-dessous :

Puis utilisez la encode_conversations_with_harmony fonction d'Unsloth :

Le format harmony inclut plusieurs éléments intéressants :

  1. reasoning_effort = "medium" Vous pouvez sélectionner low, medium ou high, et cela modifie le budget de raisonnement de gpt-oss - généralement plus c'est élevé meilleure est la précision du modèle.

  2. developer_instructions est comme un prompt système que vous pouvez ajouter.

  3. model_identity il vaut mieux le laisser tel quel - vous pouvez le modifier, mais nous ne sommes pas sûrs que des personnalisations fonctionneront.

Nous trouvons plusieurs problèmes avec les templates de chat jinja actuels (il existe plusieurs implémentations dans l'écosystème) :

  1. Les appels de fonction et d'outil sont rendus avec tojson, ce qui est acceptable si c'est un dict, mais si c'est une chaîne, les guillemets et autres symboles deviennent échappés.

  2. Il y a quelques nouvelles lignes supplémentaires dans le template jinja à certaines frontières.

  3. Les pensées d'appel d'outil du modèle devraient avoir le analysis tag et pas final tag.

  4. D'autres templates de chat semblent ne pas utiliser du tout <|channel|>final - on devrait l'utiliser pour le message final de l'assistant. Vous ne devriez pas l'utiliser pour les traces de réflexion ou les appels d'outil.

Nos templates de chat pour le GGUF, nos téléversements BnB et BF16 et toutes les versions sont corrigés ! Par exemple, en comparant nos formats et celui d'Harmony, nous n'obtenons pas de caractères différents :

🔢 Problèmes de précision

Nous avons trouvé plusieurs problèmes de précision sur Tesla T4 et machines float16 principalement parce que le modèle a été entraîné en BF16, et donc il existait des valeurs aberrantes et des dépassements. MXFP4 n'est en réalité pas pris en charge sur Ampere et GPU plus anciens, donc Triton fournit tl.dot_scaled pour la multiplication de matrices MXFP4. Il rehausse les matrices en BF16 en interne à la volée.

Nous avons fait un carnet d'inférence MXFP4arrow-up-right également dans Colab Tesla T4 !

circle-info

Émulation logiciellearrow-up-right permet de cibler des architectures matérielles sans support natif d'opérations microscalées. Pour l'instant, dans ce cas, les lhs/rhs microscalés sont rehaussés en bf16 type d'élément au préalable pour le calcul du produit scalaire,

Nous avons constaté que si vous utilisez float16 comme type d'autocast de précision mixte, vous obtiendrez des infinis après un certain temps. Pour contrer cela, nous avons constaté qu'exécuter le MoE en bfloat16, puis le laisser soit en bfloat16 soit en float32 est efficace. Si les GPU plus anciens n'ont même pas de support bfloat16 (comme le T4), alors float32 est utilisé.

Nous changeons également toutes les précisions des opérations (comme le routeur) en float32 pour les machines float16.

🖥️ Exécution de gpt-oss

Ci-dessous se trouvent des guides pour les 20B et 120B variantes du modèle.

circle-info

Toute quantification plus petite que F16, y compris 2 bits, entraîne une perte d'exactitude minimale, puisque seules certaines parties (par ex. les couches d'attention) sont en bits inférieurs tandis que la plupart restent en pleine précision. C'est pourquoi les tailles sont proches du modèle F16 ; par exemple, la version 2 bits (11,5 Go) fonctionne presque de la même manière que la version pleine 16 bits (14 Go). Une fois que llama.cpp prendra en charge une meilleure quantification pour ces modèles, nous les mettrons en ligne dès que possible.

Le gpt-oss les modèles d'OpenAI incluent une fonctionnalité permettant aux utilisateurs d'ajuster « l'effort de raisonnement » du modèle. Cela vous donne le contrôle sur le compromis entre les performances du modèle et sa vitesse de réponse (latence) via la quantité de tokens que le modèle utilisera pour réfléchir.

Le gpt-oss les modèles proposent trois niveaux distincts d'effort de raisonnement parmi lesquels vous pouvez choisir :

  • Faible : Optimisé pour les tâches qui nécessitent des réponses très rapides et ne demandent pas de raisonnement complexe en plusieurs étapes.

  • Moyen : Un équilibre entre performance et rapidité.

  • Élevé : Offre la meilleure performance de raisonnement pour les tâches qui l'exigent, bien que cela entraîne une latence plus élevée.

⚙️ Paramètres recommandés

OpenAI recommande ces paramètres d'inférence pour les deux modèles :

temperature=1.0, top_p=1.0, top_k=0

  • Température de 1.0

  • Top_K = 0 (ou expérimentez avec 100 pour éventuellement de meilleurs résultats)

  • Top_P = 1.0

  • Contexte minimum recommandé : 16 384

  • Longueur de contexte maximale : 131 072

Modèle de chat :

Le token de fin de phrase/génération : EOS est <|return|>

Exécuter gpt-oss-20B

Pour atteindre des vitesses d'inférence de 6+ tokens par seconde pour notre quantification Dynamic 4-bit, ayez au moins 14 Go de mémoire unifiée (VRAM et RAM combinées) ou 14 Go de RAM système seulement. Comme règle générale, votre mémoire disponible devrait correspondre ou dépasser la taille du modèle que vous utilisez. Lien GGUF : unsloth/gpt-oss-20b-GGUFarrow-up-right

NOTE : Le modèle peut fonctionner avec moins de mémoire que sa taille totale, mais cela ralentira l'inférence. La mémoire maximale n'est nécessaire que pour les vitesses les plus rapides.

circle-info

Suivez les meilleures pratiques ci-dessus. Elles sont les mêmes que pour le modèle 120B.

Vous pouvez exécuter le modèle sur Google Colab, Docker, LM Studio ou llama.cpp pour l'instant. Voir ci-dessous :

Vous pouvez exécuter gpt-oss-20b gratuitement avec notre notebook Google Colabarrow-up-right

🐋 Docker : Tutoriel Exécuter gpt-oss-20b

Si vous avez déjà Docker Desktop, tout ce que vous devez faire est d'exécuter la commande ci-dessous et c'est fini :

Llama.cpp : Tutoriel Exécuter gpt-oss-20b

  1. Obtenez le dernier llama.cpp sur GitHub iciarrow-up-right. Vous pouvez suivre les instructions de compilation ci-dessous également. Changez -DGGML_CUDA=ON en -DGGML_CUDA=OFF si vous n'avez pas de GPU ou si vous voulez simplement une inférence CPU.

  1. Vous pouvez extraire directement depuis Hugging Face via :

  2. Téléchargez le modèle via (après avoir installé pip install huggingface_hub hf_transfer ).

Exécuter gpt-oss-120b :

Pour atteindre des vitesses d'inférence de 6+ tokens par seconde pour notre quantification 1-bit, nous recommandons au moins 66 Go de mémoire unifiée (VRAM et RAM combinées) ou 66 Go de RAM système seulement. Comme règle générale, votre mémoire disponible devrait correspondre ou dépasser la taille du modèle que vous utilisez. Lien GGUF : unsloth/gpt-oss-120b-GGUFarrow-up-right

NOTE : Le modèle peut fonctionner avec moins de mémoire que sa taille totale, mais cela ralentira l'inférence. La mémoire maximale n'est nécessaire que pour les vitesses les plus rapides.

circle-info

Suivez les meilleures pratiques ci-dessus. Elles sont les mêmes que pour le modèle 20B.

📖 Llama.cpp : Tutoriel Exécuter gpt-oss-120b

Pour gpt-oss-120b, nous utiliserons spécifiquement Llama.cpp pour une inférence optimisée.

circle-check
  1. Obtenez le dernier llama.cpp sur GitHub iciarrow-up-right. Vous pouvez suivre les instructions de compilation ci-dessous également. Changez -DGGML_CUDA=ON en -DGGML_CUDA=OFF si vous n'avez pas de GPU ou si vous voulez simplement une inférence CPU.

  2. Vous pouvez utiliser directement llama.cpp pour télécharger le modèle mais je suggère normalement d'utiliser huggingface_hub Pour utiliser llama.cpp directement, faites :

    {% code overflow="wrap" %}

    {% endcode %}

  3. Ou, téléchargez le modèle via (après avoir installé pip install huggingface_hub hf_transfer Nous suivons des étapes similaires à ci-dessus cependant cette fois nous devrons également effectuer des étapes supplémentaires car le modèle est si volumineux.

  4. Exécutez le modèle en mode conversation et essayez n'importe quel prompt.

  5. éditer --threads -1 pour le nombre de threads CPU, --ctx-size 262114 pour la longueur de contexte, --n-gpu-layers 99 pour le déchargement GPU sur le nombre de couches. Essayez de l'ajuster si votre GPU manque de mémoire. Supprimez-le également si vous n'avez qu'une inférence CPU.

circle-check

🛠️ Amélioration de la vitesse de génération

Si vous avez plus de VRAM, vous pouvez essayer de décharger plus de couches MoE, ou de décharger des couches complètes elles-mêmes.

Normalement, -ot ".ffn_.*_exps.=CPU" décharge toutes les couches MoE vers le CPU ! Cela vous permet effectivement de faire tenir toutes les couches non-MoE sur 1 GPU, améliorant les vitesses de génération. Vous pouvez personnaliser l'expression regex pour décharger plus de couches si vous disposez de plus de capacité GPU.

Si vous avez un peu plus de mémoire GPU, essayez -ot ".ffn_(up|down)_exps.=CPU" Cela décharge les couches MoE de projection up et down.

Essayez -ot ".ffn_(up)_exps.=CPU" si vous avez encore plus de mémoire GPU. Cela ne décharge que les couches MoE de projection up.

Vous pouvez aussi personnaliser le regex, par exemple -ot "\.(6|7|8|9|[0-9][0-9]|[0-9][0-9][0-9])\.ffn_(gate|up|down)_exps.=CPU" signifie décharger les couches MoE gate, up et down mais seulement à partir de la 6e couche.

Le dernière version de llama.cpparrow-up-right introduit également le mode haut débit. Utilisez llama-parallel. Lisez-en davantage iciarrow-up-right. Vous pouvez aussi quantifier le cache KV en 4 bits par exemple pour réduire les mouvements VRAM / RAM, ce qui peut aussi accélérer le processus de génération.

🦥 Affinage de gpt-oss avec Unsloth

L'affinage gpt-oss d'Unsloth est 1,5x plus rapide, utilise 70% de VRAM en moins, et prend en charge des contextes 10x plus longs. L'entraînement QLoRA de gpt-oss-20b tient sur 14 Go de VRAM, et gpt-oss-120b fonctionne sur 65 Go de VRAM.

  • Exigences QLoRA : gpt-oss-20b = 14 Go de VRAM • gpt-oss-120b = 65 Go de VRAM.

  • Exigences BF16 LoRA : gpt-oss-20b = 44 Go de VRAM • gpt-oss-120b = 210 Go de VRAM.

Lisez notre tutoriel étape par étape pour affiner gpt-oss :

Tutoriel : Comment affiner gpt-osschevron-right
circle-check

Notebooks Unsloth gratuits pour affiner gpt-oss :

Apprentissage par renforcement (GRPO)

Unsloth prend maintenant en charge le RL pour gpt-oss ! Nous avons créé deux notebooks, pour plus de détails, lisez notre blog spécifique pour le RL gpt-oss : gpt-oss RL

💾NOUVEAU : Sauvegarde en GGUF, vLLM après entraînement gpt-oss

Vous pouvez maintenant affiner gpt-oss avec QLoRA et directement sauvegarder, exporter ou fusionner le modèle vers llama.cpp, vLLM, ou HF - pas seulement Unsloth. Nous publierons bientôt, nous l'espérons, un notebook gratuit.

Auparavant, tout modèle gpt-oss affiné en QLoRA était limité à l'exécution dans Unsloth. Nous avons supprimé cette limitation en introduisant déquantification à la demande de MXFP4 modèles de base (comme gpt-oss) lors du processus de fusion LoRA. Cela rend possible de exporter votre modèle affiné au format bf16.

Après l'affinage de votre modèle gpt-oss, vous pouvez maintenant le fusionner en un format 16 bits avec une commande unique:

Si vous préférez fusionner le modèle et pousser directement sur le hub Hugging Face à la place, vous pouvez le faire en utilisant :

💡Rendre l'affinage gpt-oss efficace

Nous avons constaté que bien que MXFP4 soit très efficace, il ne prend pas en charge nativement l'entraînement avec gpt-oss. Pour surmonter cette limitation, nous avons implémenté des fonctions d'entraînement personnalisées spécifiquement pour les couches MXFP4 en les simulant via Bitsandbytes quantification NF4.

Nous avons utilisé directement la bibliothèque Triton Kernels d'OpenAI pour permettre l'inférence MXFP4. Pour l'affinage / l'entraînement cependant, les kernels MXFP4 ne prennent pas encore en charge l'entraînement, car la passe arrière n'est pas encore implémentée. Nous travaillons activement à son implémentation dans Triton ! Il existe un flag appelé W_TRANSPOSE comme mentionné iciarrow-up-right, qui devrait être implémenté. La dérivée peut être calculée par la transposée des matrices de poids, et donc nous devons implémenter l'opération de transposition.

Si vous voulez entraîner gpt-oss avec une bibliothèque autre qu'Unsloth, vous devrez rehausser les poids en bf16 avant l'entraînement. Cette approche, cependant, augmente significativement à la fois l'utilisation de la VRAM et le temps d'entraînement jusqu'à 300% d'utilisation mémoire en plus! TOUTES les autres méthodes d'entraînement nécessiteront un minimum de 65 Go de VRAM pour entraîner le modèle 20b tandis qu'Unsloth ne nécessite que 14 Go de VRAM (-80%).

Comme les deux modèles utilisent une architecture MoE, le modèle 20B sélectionne 4 experts sur 32, tandis que le modèle 120B en sélectionne 4 sur 128 par token. Pendant l'entraînement et la sortie, les poids sont stockés au format MXFP4 en tant que nn.Parameter objets, et non en tant que nn.Linear couches, ce qui complique la quantification, d'autant plus que les experts MoE/MLP représentent environ 19B des paramètres des 20B.

Pour permettre la quantification BitsandBytes et l'affinage économe en mémoire, nous avons converti ces paramètres en nn.Linear couches. Bien que cela ralentisse légèrement les opérations, cela permet l'affinage sur des GPU à mémoire limitée, un compromis rentable.

Guide d'affinage des jeux de données

Bien que gpt-oss ne supporte que le raisonnement, vous pouvez quand même l'affiner avec un Elisenon-raisonnement, mais cela peut affecter sa capacité de raisonnement. Si vous voulez maintenir ses capacités de raisonnement (optionnel), vous pouvez utiliser un mélange de réponses directes et d'exemples de chaîne de pensée. Utilisez au moins 75 % de raisonnement et 25 % sans raisonnement dans votre jeu de données pour que le modèle conserve ses capacités de raisonnement.

Notre notebook conversationnel gpt-oss-20b utilise l'exemple d'OpenAI qui est le jeu de données Multilingual-Thinking de Hugging Face. L'objectif d'utiliser ce dataset est de permettre au modèle d'apprendre et de développer des capacités de raisonnement dans ces quatre langues distinctes.

Mis à jour

Ce contenu vous a-t-il été utile ?