Caricamento con transformers 5.x fallisce (ImportError / KeyError su rope)

#2
by pierjoe - opened

Ciao!!

Ho provato a usare il modello con vLLM 0.19.1 e transformers 5.5.4 (trust_remote_code=True) e ho trovato quattro incompatibilità. Probabilmente il modello è stato scritto per transformers 4.x e alcune API sono cambiate nella 5.

In ordine di apparizione:

Import rotto, modeling_enggpt_moe.py riga 32 importa OutputRecorder e check_model_inputs da transformers.utils.generic, che in transformers 5 non esistono più. Entrambi sembrano usati solo per cose opzionali (routing logits + validazione input) — basterebbe un try/except ImportError con fallback no-op.

auto_map incompleto nel config.json. vLLM chiama anche AutoModel.from_config, non solo AutoModelForCausalLM, quindi serve anche la entry "AutoModel": "modeling_enggpt_moe.EngGPTMoeModel".

ROPE_INIT_FUNCTIONS["default"] non esiste più in transformers 5 (ora ci sono solo dynamic, linear, llama3, longrope, proportional, yarn). Quando config.rope_scaling è assente, il modello fa rope_type = "default" e fallisce con KeyError.

KeyError: 'factor', in transformers 5 le funzioni RoPE leggono da config.rope_parameters (nuovo formato standardizzato), non più da config.rope_scaling. Il modello dovrebbe chiamare config.standardize_rope_params() o adattarsi al nuovo formato.

Engineering Group org

Ciao @pierjoe ! grazie intanto della segnalazione (e di voler provare il modello). Il modello è attualmente compatibile con transformers==4.57.0, le incompatibilità che hai riscontrato sono proprio dovute alle breaking changes introdotte in transformers 5, per la quale al momento non abbiamo tempistiche di rilascio da condividere. Per ora quindi ti suggerirei di provare con la 4 (come a quickstart) e senza vLLM.

Ciao
Sono riuscito a farlo girare con vLLM, ma non è ancora del tutto plug-and-play.

Nel mio caso sono stati necessari alcuni adattamenti: usare trust_remote_code=True, impostare correttamente gli hf_overrides per l’architettura custom del modello (soprattutto AutoModel -> EngGPTMoeModel), tarare alcuni parametri vLLM per rientrare nella VRAM reale (ho solo 32 giga di VRAM), e applicare piccoli fix locali al codice Hugging Face nella parte MoE/configurazione per farlo girare davvero bene.

Pertanto, dal mio punto di vista, si può usare con vLLM, ma al momento richiede ancora un po’ di tuning e qualche adattamento manuale.

transformers 5.5.4
vllm 0.19.1

riusciresti a postare dettagli? mi serve runnarlo esattamente con quella versione di transformers e vllm! grazie mille

Ciao pierjoe, nel mio caso ha funzionato una combinazione di parametri e fix che di seguito riepilogo:

  1. device_map="cuda" fisso
    device_map="auto" nel mio ambiente causava crash durante il loading del modello. Causa sconosciuta, probabilmente legata alla gestione custom dei layer MoE. Ho risolto forzando su CUDA

  2. low_cpu_mem_usage=False
    Va lasciato al default (disabilitato).

  3. hf_overrides["AutoModel"] → EngGPTMoeModel (base model, non CausalLM)
    Si deve mappare al modello base: "AutoModel": "modeling_enggpt_moe.EngGPTMoeModel"

  4. enforce_eager=True
    Disabilitato i CUDA graphs, risparmiando 2-4 GiB di VRAM. Essenziale dato il margine strettissimo con 32GB della mia configurazione.

  5. Patch modeling_enggpt_moe.py — EngGPTMoeSparseMoeBlock.forward()
    Errore riscontrato: "TypeError: 'TransformersFusedMoE' object is not subscriptable / TransformersFusedMoE.forward() missing 'topk_weights'"
    Diagnosi e soluzione:

  • vLLM sostituisce la nn.ModuleList degli expert con TransformersFusedMoE, che non è subscriptable e ha firma forward(hidden_states, topk_ids, topk_weights). La patch:
    a. Pre-calcola routing_weights e selected_experts prima del branch
    b. Controlla isinstance(self.experts, nn.ModuleList) per distinguere i due path
    c. Path vLLM: self.experts(hidden_states, selected_experts, routing_weights)
    d. Path standard: loop per-expert con idx_int = expert_idx.item()
  1. Patch configuration_enggpt_moe.py
    rope_config_validation e self.standardize_rope_params() wrappati in try/except — vLLM chiama il config in contesti dove questi metodi possono fallire.

P.S
I punti 5, 6 sono stati risolti utilizzando Opus 4.7 con la massima profondità di pensiero.

Grazie mille! Ho applicato tutte le modifche e ha funzionato! Sto verificando adesso se i cambiamenti intaccano i benchmark presenti nella model card!

pierjoe changed discussion status to closed
pierjoe changed discussion status to open
pierjoe changed discussion status to closed

Sign up or log in to comment