veilletech.fr
15 oct. Feed du jour
#07 LLM Article

AREX-2 : la config promet une tête MTP absente

La config déclare, les poids tranchent.

En comparant AREX-2 (27 B, BAAI, Apache 2.0) à Qwen3.8-27B, un billet montre qu'un fine-tune de même architecture ne se sert pas avec la même commande : sa config déclare une tête MTP dont l'index safetensors ne contient aucun tenseur, et le drafter DFlash2 vise le modèle de base. Il rappelle aussi que le FP8 est lent sur Ampère. Les auteurs n'ont pas fait tourner AREX-2 eux-mêmes.

4 min de lectureavancévidéo 1:25
Partager
Sommaire6 sections
  1. Ce qui se passe
  2. Vérifier les poids, pas la config
  3. Ce qui était juste pour le modèle de base
  4. Le FP8 sur Ampère, l'erreur coûteuse
  5. Première exécution
  6. À retenir

Ce qui se passe

BAAI a publié AREX-2 le 29 septembre, sous licence Apache 2.0, sans accès restreint : un modèle de 27 milliards de paramètres entraîné à travailler par tours (proposer, mesurer, réfléchir, réviser). Son config.json ouvre sur Qwen3_5ForConditionalGeneration, la même classe que Qwen3.8-27B, que l'équipe du billet sert déjà avec sglang. Tentation : changer --model-path et relancer.

L'équipe a comparé les deux configurations. Elles ne diffèrent que par transformers_version et deux clés redondantes ; le gabarit de conversation chat_template.jinja est identique octet pour octet. S'arrêter là, c'est conserver l'ancienne commande. Précision utile : les auteurs n'ont pas fait tourner AREX-2 ; toutes les vitesses citées viennent du modèle de base.

Vérifier les poids, pas la config

Le modèle de base embarque une tête de prédiction multi-token (MTP), une petite couche qui devine quelques jetons d'avance pour en émettre plusieurs par pas. La configuration d'AREX-2 la déclare toujours ; ses fichiers de poids ne la contiennent pas :

TEXT
config.json                    "mtp_num_hidden_layers": 1
safetensors index (AREX-2)     0 tenseur MTP
safetensors index (Qwen3.8)    15 tenseurs MTP

L'index safetensors liste chaque tenseur de la publication : c'est l'inventaire honnête. Autre différence discrète, dans tokenizer_config.json : un repaquetage communautaire signale que le pré-tokenizer et le décodeur diffèrent de Qwen3.8. Probablement sans effet — mais c'est le genre de détail qui se manifeste en appel d'outil illisible plusieurs heures après le début d'une session d'agent.

Ce qui était juste pour le modèle de base

La configuration la plus rapide de l'équipe tournait sur une RTX PRO 5000 (CUDA 13) avec un quant NVFP4 de RadixArk et le drafter DFlash2 de z-lab : 115 à 136 tok/s en décodage. Peu de choses survivent au changement :

Le FP8 sur Ampère, l'erreur coûteuse

La RTX A6000 est une Ampère sans matériel FP8 : sglang garde les poids en FP8 et les décompresse à la volée par des noyaux Marlin. Le modèle de base y décodait à 24 tok/s. Le quant INT4 W4A16 de RedHatAI, même carte, même million de contexte : 41 tok/s. Une A100 est aussi une Ampère : y préférer l'INT4.

Les poids ne sont pas toute la facture. En INT4 à 1M de contexte, sglang a pris environ 46 Go, dont 17,8 Go de poids, 11,5 Go d'état pour les couches d'attention linéaire et 12,8 Go de cache KV.

Première exécution

Commencer ennuyeux : BF16 sur une carte de 80 Go, contexte natif de 256K, sans option de spéculation, mêmes parseurs, une longue tâche d'agent. Ne changer qu'un paramètre par exécution, et surveiller les appels d'outil encore bien formés tard dans la session, le débit contre le modèle de base sur la même carte, la longueur d'acceptation si un drafter est ajouté (le chiffre que personne n'a publié) et les heures de GPU par tâche : le protocole d'évaluation autorise jusqu'à 1 500 appels et 24 heures par cas.

Les scores annoncés (70,7 sur Frontier-CS, 84,0 sur BrowseComp) sont déclarés par BAAI, sans reproduction indépendante trouvée par les auteurs.

Source : Same config.json, different serve command, DEV Community, 15 octobre 2026.