Trace install tas - SGLang
SGLang ROCm — Qwen3.8 27B W8A8 déployé
Composants
- Unité Quadlet rootless :
sglang.service, activée pourdefault.target - Quadlet :
/home/loic/.config/containers/systemd/sglang.container - Conteneur :
sglang-qwen38-w8a8 - Image :
localhost/sglang:qwen38-w8a8-rdna3-21c88f8 - Image ID :
06977e11fa96592e779eba01f41229884553d490788b3c73ad80aec6edeb05d3 - API :
http://127.0.0.1:30000/v1, non publiée sur le LAN - Nom OpenAI :
qwen3.8-27b-w8a8 - Checkpoint :
Freaksterz/Qwen3.8-27B-SmoothQuant-W8A8-INT8, révision68746dd - Quantification : poids INT8 par canal et activations INT8 dynamiques par token (
compressed-tensors, W8A8) - GPU : Radeon RX 7900 XTX 24 Gio, architecture
gfx1100
Profil retenu
--context-length 32768
--cpu-offload-gb 14
--mem-fraction-static 0.80
--max-running-requests 1
--chunked-prefill-size 2048
--attention-backend triton
--sampling-backend pytorch
--cuda-graph-backend-decode disabled
--cuda-graph-backend-prefill disabled
Le modèle accepte nativement 262 144 tokens, mais le profil 256K n'est pas réaliste sur cette carte avec des poids 8 bits. Après chargement, rocm-smi mesure environ 22,5 Go de VRAM utilisés sur 25,75 Go décimaux. Le démarrage à froid dure environ 80 à 90 secondes. Le premier appel après redémarrage compile encore des noyaux Triton et a pris 63,7 secondes lors du contrôle final ; le même test à chaud prend environ 18 secondes.
Ollama peut rester actif sans modèle chargé. Il ne faut toutefois pas charger simultanément un gros modèle Ollama, faute de marge VRAM ; arrêter SGLang ou décharger Ollama au préalable.
Construction RDNA3 et correctif
Le dépôt de travail est /media/loic/nem/sglang/build-rdna3/sglang-qwen38-current, branche deploy/qwen38-rdna3, base SGLang 21c88f862, déploiement figé au commit local 19d7dd612. L'image de base immuable est localhost/sglang:qwen38-rdna3-21c88f8-base. La couche finale se trouve dans docker/rdna3-w8a8-runtime.Dockerfile.
Le correctif déterminant concerne le déport CPU. SGLang exécute les couches déportées avec torch.func.functional_call. La vue attn.conv_weights, créée pendant l'initialisation, restait attachée à l'ancien stockage au lieu du poids conv1d.weight substitué. Cette vue est maintenant rafraîchie dans le passage avant. Le test W8A8 est alors passé de sorties invalides à une génération exacte.
Un port du GGUF Q8_0 officiel a aussi été chargé. Les multiplications et le remappage des poids sont numériquement corrects, mais la génération finale échoue encore au contrôle sémantique. Cette variante n'est pas déployée et reste étiquetée localhost/sglang:qwen38-rdna3-21c88f8-gguf-experimental pour diagnostic.
Contrôles
systemctl --user status sglang.service --no-pager
journalctl --user -u sglang.service -f
podman logs -f sglang-qwen38-w8a8
curl -fsS http://127.0.0.1:30000/v1/models
curl -fsS http://127.0.0.1:30000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model":"qwen3.8-27b-w8a8",
"messages":[{"role":"user","content":"Réponds uniquement par le nombre exact : 17 + 25 = ?"}],
"temperature":0,
"max_tokens":8,
"chat_template_kwargs":{"enable_thinking":false}
}'
Résultat attendu et observé : 42, arrêt sur le token de fin, 30 tokens d'entrée et 3 tokens de sortie. L'inventaire renvoie max_model_len: 32768. La génération texte est validée ; la partie vision présente dans le checkpoint ne l'est pas encore.
Exploitation et retour arrière
systemctl --user start sglang.service
systemctl --user stop sglang.service
systemctl --user restart sglang.service
La sauvegarde antérieure se trouve dans /home/loic/backups/sglang-qwen38-20260820T084200+0200/. Pour arrêter sans supprimer les images, checkpoints ou caches :
systemctl --user disable --now sglang.service
La documentation détaillée est dans /home/loic/mediawiki/docs/sglang.md. Les artefacts ont aussi été copiés dans Nextcloud sous minidev/sglang-qwen38-w8a8/.