Aller au contenu

Inférence locale

Ce qui est publié

Le dépôt contient une implémentation de référence lisible, explicitement pas un moteur de service de production. Elle couvre l'encodeur visuel et son aligneur, la fenêtre glissante et l'attention creuse compressée avec son indexeur à deux niveaux, les recherches Engram, le MoE, les Hyper-Connections et le chemin avant de DSpark. La génération elle-même est un échantillonnage autorégressif simple.

Fichier Contenu
model.py le modèle complet, avec auto-test
kernel.py noyaux de quantification et GEMM en TileLang
convert.py conversion des poids Hugging Face vers le format parallèle
generate.py boucle de génération, mode interactif
vision.py, image_processor.py voie visuelle
engram.py module de mémoire conditionnelle
config.json configuration du runtime

La conversion des poids

Le runtime utilise un fichier de point de contrôle converti par rang de parallélisme de tenseur :

export HF_CKPT_PATH=/chemin/vers/DeepSeek-V4.1-Flash-HF
export SAVE_PATH=/chemin/vers/DeepSeek-V4.1-Flash-TP8
export MP=8

python convert.py \
  --hf-ckpt-path "${HF_CKPT_PATH}" \
  --save-path "${SAVE_PATH}" \
  --model-parallel "${MP}" \
  --expert-dtype fp4 \
  --tokenizer-path "${HF_CKPT_PATH}"

Le nombre d'experts est déduit des noms de tenseurs, il n'a pas à être passé. --tokenizer-path désigne le répertoire contenant tokenizer.json et tokenizer_config.json, copiés dans le point de contrôle converti.

L'exécution

export CKPT_PATH=/chemin/vers/DeepSeek-V4.1-Flash-TP8
export MP=8

INPUT_FILE=examples/example.txt ./run.sh
INPUT_FILE=examples/example_harmony.json ./run.sh

Les deux fichiers d'exemple expriment le même prompt à deux images entrelacées, et produisent donc des prompts encodés et des identifiants de jetons identiques.

En interactif :

torchrun --nproc-per-node "${MP}" generate.py \
  --ckpt-path "${CKPT_PATH}" \
  --config config.json \
  --interactive \
  --temperature 0.6

Pour du multi-nœud, les arguments habituels de torchrun — --nnodes, --node-rank, --master-addr, --master-port — précèdent generate.py.

L'auto-test

python model.py

Ce test construit un petit modèle à partir des valeurs par défaut de ModelArgs, exécute un préremplissage plus 22 étapes de décodage, et exerce les vrais noyaux dense-FP8 et MoE-FP4.

Ce que l'auto-test ne teste pas

Les poids sont non initialisés. Le test vérifie les formes des tenseurs et la plomberie des noyaux, pas la numérique. Il ne dit rien sur la correction des sorties.

La reproduction des évaluations

Le dépôt contient un dossier evaluation avec les instructions pas à pas pour reproduire les résultats de DeepSWE v1.1, pour l'agent dsh-minimal et pour mini-swe-agent officiel, ainsi que le correctif nécessaire pour intégrer dsh-minimal à Pier.

C'est un point à porter au crédit de DeepSeek : peu de laboratoires publient le nécessaire pour reproduire leurs chiffres agentiques.

Ce qu'on peut réellement faire tourner

Cette implémentation n'est pas utilisable seul

La conversion vise 8 rangs de parallélisme de tenseur par défaut, et le modèle demande de l'ordre de plusieurs centaines de gigaoctets pour les poids, plus les tables Engram. Voir Matériel et coûts.

L'implémentation de référence est destinée à comprendre et vérifier l'architecture, ou à servir de base à un moteur de service. Pas à faire tourner le modèle sur une station de travail.

Les tests du format de prompt

Le module d'encodage a sa propre suite :

python -m pytest -q test_encoding.py

Les cas de test sont stockés en paires JSON d'entrée / TXT de sortie attendue. Ils couvrent les conversations multitours, les appels d'outils, le mode réflexion, l'effort de raisonnement numérique, les messages système en milieu de conversation et l'ordre des images en multimodal — y compris une vérification que les exemples TXT et JSON encodent bien vers le même prompt.

C'est la partie du dépôt la plus immédiatement utile : elle ne demande ni GPU ni poids, et fixe sans ambiguïté le format attendu par le modèle.


Chapitre suivant : Matériel et coûts