Un serveur d'inférence isolé d'Internet. Un disque dédié aux modèles. Le tokenizer de Mistral téléchargé à l'avance, bien rangé dans son dossier. Et au démarrage :
FileNotFoundError : Aucun fichier local trouvé pour l’ID de dépôt mistralai/Mistral-7B-v0.1 et la révision None.pour l' identifiant de dépôt mistralai/Mistral- 7B -v0.1 et la révision None .
Le fichier est là. La bibliothèque cherche ailleurs.
J'ai trouvé ce bug dans mistral-common , la bibliothèque open source de Mistral AI qui prépare les requêtes pour ses modèles. Le correctif a été relu, approuvé et intégré par un mainteneur de Mistral AI ( PR #349 , issue #348 ).
Qui est concerné
Les équipes qui font tourner des modèles Mistral sans accès à Internet , et qui rangent leurs modèles ailleurs que dans le cache par défaut de Hugging Face. C'est précisément le cas des grands comptes : réseau isolé pour des raisons de sécurité, proxy d'entreprise, disque dédié aux modèles sur le serveur GPU.
Deux situations déclenchent le bug :
- l'appel interdit le réseau (
local_files_only=True) ; - le Hub est injoignable (coupure, pare-feu,
HF_HUB_OFFLINE=1) et la bibliothèque bascule d'elle-même sur les fichiers locaux.
Avec le cache par défaut, ou avec le réseau, rien ne se passe. C'est pour cela que le bug passe inaperçu en développement et apparaît le jour du déploiement.
La cause : deux étapes, deux dossiers
Hors ligne, le chargement du tokenizer enchaîne deux fonctions :
list_local_hf_repo_filesliste les fichiers en cache pour trouver le tokenizer (tekken.json). Elle regardait toujours le cache par défautHF_HUB_CACHE, et n'avait pas de paramètrecache_dir.hf_hub_downloadrécupérer ensuite le fichier. Elle, reçoit biencache_diret regarde dans le dossier personnalisé.
# avant : la liste ignore le dossier choisi par l'utilisateur
repo_cache = Path(huggingface_hub.constants.HF_HUB_CACHE) / ...
Si le tokenizer n'est que dans cache_dir, la liste revient vide et la fonction abandonne avant même d'essayer de lire le fichier. Le cas inverse échoue aussi, un cran plus loin.
Le correctif : 5 lignes, la même règle que Hugging Face
Les deux étapes lisent maintenant le même dossier : cache_dirs'il est fourni, sinon le cache par défaut, exactement la règle de hf_hub_download.
cache_root = Path(cache_dir) si cache_dir n'est pas None sinon Path ( huggingface_hub.constants.HF_HUB_CACHE )
repo_cache = cache_root / huggingface_hub.constants.REPO_ID_SEPARATOR. join ([ "models" , *repo_id.split( "/" )])
- Rétrocompatible : nouveau paramètre optionnel, comportement identique sans lui.
- 6 tests de non-régression , dont 5 échouent sans le correctif : dossier fourni en texte ou en
Path, chargement complet hors ligne, bascule après coupure réseau,HF_HUB_OFFLINE=1. - Périmètre minimal : pas de nouvelle fonctionnalité glissée dans le correctif.
Le mainteneur a demandé une seule retouche, appliquée par lui-même : retirer un commentaire. Le code n'a pas changé.
En attendant la nouvelle version
Si vous êtes touché et ne pouvez pas encore mettre à jour mistral-common : faites pointer HF_HUB_CACHEvers le même dossier que votre cache_dir. Les deux étapes lisent alors le même endroit.
D'après la lecture de leur code source, Transformers ( cache_dir) et vLLM ( --download-diravec tokenizer_mode=mistral) transmettent ce dossier à mistral-common : ils sont probablement concernés aussi hors ligne. Je ne l'ai pas testé de bout en bout.
Ce que ça change pour une équipe qui industrialise des agents
- Testez le déploiement réel, pas le poste du développeur. Ce bug n'existe que sans réseau et avec un dossier de modèles personnalisé : exactement la configuration de production, jamais celle du portable.
- Coupez le réseau dans vos tests.
HF_HUB_OFFLINE=1dans un test d'intégration aurait suffi à le voir. - Une option qui n'est pas transmise partout est un bug. Lorsqu'une fonction accepte
cache_dir, vérifiez que chaque appel interne le reçoit. - Contribuez en retour. Cinq lignes et six tests : c'est le prix d'un correctif qui protège tous ceux qui déploient Mistral hors ligne.
Vous déployez des modèles Mistral en réseau isolé ? Quels autres pièges avez-vous rencontrés ?
Pour en parler ou faire auditer vos propres agents : LinkedIn · Malt · Medium · Site
Vous formez vos équipes à l'IA générative ? J'anime avec Spar-x (organisme certifié Qualiopi, formations finançables par votre OPCO) une formation Copilot Studio : https://zakariakhchiche.github.io/formation-copilot-studio/ et j'ai publié un kit AI Act article 4 gratuit : https://zakariakhchiche.github.io/kit-ai-act/
Le bug raconté en podcast (12 min) :