{"id":2623,"date":"2026-05-27T15:47:02","date_gmt":"2026-05-27T15:47:02","guid":{"rendered":"https:\/\/paoloronco.it\/?p=2623"},"modified":"2026-05-27T15:47:03","modified_gmt":"2026-05-27T15:47:03","slug":"gpu-renting-e-modelli-modificati-abliterare-mistral-7b-nel-cloud","status":"publish","type":"post","link":"https:\/\/paoloronco.it\/en\/gpu-renting-e-modelli-modificati-abliterare-mistral-7b-nel-cloud\/","title":{"rendered":"GPU renting e modelli modificati: abliterare Mistral 7B nel cloud"},"content":{"rendered":"<p class=\"wp-block-paragraph\">Il secondo capitolo del progetto Heretic: stessa tecnica, modello pi\u00f9 grande, GPU a noleggio per 2 euro \u2014 e qualche lezione inaspettata su come funziona davvero l&#8217;allineamento dei modelli AI.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Il punto di partenza<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nel primo esperimento avevo abliterato <strong>TinyLlama 1.1B<\/strong> sulla mia GPU locale \u2014 una RTX 3070 con 8GB di VRAM. Aveva funzionato bene: 200 trial di ottimizzazione in 15 minuti, risultato pubblicato su Hugging Face.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il passo successivo naturale era scalare: provare con un modello pi\u00f9 capace. Ho scelto <strong>Mistral 7B Instruct v0.3<\/strong>, uno dei modelli open source pi\u00f9 usati al mondo \u2014 sette volte pi\u00f9 grande di TinyLlama, ma soprattutto addestrato con un processo di allineamento molto pi\u00f9 aggressivo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il problema immediato: Mistral 7B in piena precisione richiede ~14GB di VRAM. La mia GPU ne ha 8. In locale avrebbe richiesto quantizzazione a 4-bit (una compressione dei pesi che degrada la qualit\u00e0) e circa 2.5 ore di elaborazione. Soluzione: GPU in affitto nel cloud.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Vast.ai: una GPU RTX 4090 per ~1.50 euro<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ho usato <strong><a href=\"https:\/\/vast.ai\">Vast.ai<\/a><\/strong> \u2014 un marketplace dove privati e datacenter mettono a disposizione GPU inutilizzate a prezzi molto inferiori ai cloud tradizionali come AWS o Google Cloud.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ho noleggiato un&#8217;istanza con una <strong>RTX 4090 da 48GB di VRAM<\/strong> a circa $1.13\/ora. Per un&#8217;operazione che si \u00e8 conclusa in circa 30 minuti di ottimizzazione effettiva, il costo totale \u00e8 stato <strong>inferiore a 2 euro<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il confronto con la mia macchina locale \u00e8 significativo:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><\/th><th>RTX 3070 (locale)<\/th><th>RTX 4090 (Vast.ai)<\/th><\/tr><\/thead><tbody><tr><td>VRAM<\/td><td>8 GB<\/td><td>48 GB<\/td><\/tr><tr><td>Quantizzazione necessaria<\/td><td>S\u00ec (4-bit)<\/td><td>No \u2014 modello intero in bfloat16<\/td><\/tr><tr><td>Tempo per 200 trial<\/td><td>~2.5 ore (stima)<\/td><td><strong>19 minuti e 21 secondi<\/strong><\/td><\/tr><tr><td>Costo<\/td><td>~\u20ac0<\/td><td>~\u20ac1.50<\/td><\/tr><tr><td>Qualit\u00e0 del modello risultante<\/td><td>Ridotta (dequantizzazione)<\/td><td>Massima<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Sull&#8217;istanza cloud, Mistral 7B girava in <strong>bfloat16 nativo<\/strong> \u2014 la stessa precisione con cui \u00e8 stato addestrato \u2014 senza compromessi. Il download del modello (14.5GB) ha impiegato 1 minuto e 34 secondi a 153 MB\/s. Tutto molto diverso da una workstation personale.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Come funziona il processo (riepilogo tecnico)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Per chi non ha letto il primo articolo: <strong>Heretic<\/strong> \u00e8 uno strumento open source che modifica il comportamento di un LLM senza riaddestrarlo. Il processo in breve:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Carica il modello<\/strong> dai server di Hugging Face<\/li>\n\n\n\n<li><strong>Esegue forward pass<\/strong> su due dataset: prompt innocui (<code>mlabonne\/harmless_alpaca<\/code>) e prompt problematici (<code>mlabonne\/harmful_behaviors<\/code>)<\/li>\n\n\n\n<li><strong>Analizza le attivazioni interne<\/strong> del transformer su entrambi i set per identificare la &#8220;direzione del rifiuto&#8221; nello spazio latente \u2014 cio\u00e8 il pattern matematico associato alle risposte di rifiuto<\/li>\n\n\n\n<li><strong>Ottimizza i parametri<\/strong> con Optuna (ottimizzazione bayesiana, 200 trial)<\/li>\n\n\n\n<li><strong>Applica la correzione via LoRA<\/strong> \u2014 una modifica leggera e mirata ai pesi<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Il risultato non \u00e8 un modello retrainato. \u00c8 lo stesso modello con la geometria interna leggermente riorientata.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">I risultati: Trial 173<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Al termine dei 200 trial, Heretic presenta una lista di combinazioni Pareto-ottimali \u2014 quelle che minimizzano sia il numero di rifiuti che la divergenza dal modello originale.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ho scelto il <strong>Trial 173<\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Metrica<\/th><th>Valore<\/th><\/tr><\/thead><tbody><tr><td>Rifiuti su 100 prompt<\/td><td><strong>4\/100<\/strong><\/td><\/tr><tr><td>KL divergence<\/td><td><strong>0.0606<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">La KL divergence misura quanto il modello si discosta dall&#8217;originale: valori sotto 0.5 indicano che le capacit\u00e0 generali sono intatte. 0.0606 \u00e8 eccellente \u2014 meglio del risultato ottenuto con TinyLlama (0.0840).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In pratica: il modello rifiuta 4 prompt su 100 invece di ~37, e le sue capacit\u00e0 originali sono largamente preservate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il modello \u00e8 pubblicato su Hugging Face: <strong><a href=\"https:\/\/huggingface.co\/paoloronco\/Mistral-7B-Instruct-v0.3-heretic\">paoloronco\/Mistral-7B-Instruct-v0.3-heretic<\/a><\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">La lezione pi\u00f9 interessante: l&#8217;abliterazione non \u00e8 magia<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dopo aver testato il modello, ho scoperto qualcosa che non avevo anticipato: <strong>Mistral 7B abliterato risponde in modo molto meno &#8220;libero&#8221; rispetto a TinyLlama abliterato<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il perch\u00e9 \u00e8 tecnico ma importante da capire.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">TinyLlama era addestrato principalmente su testo grezzo con un allineamento molto leggero. Quando si abliterava la direzione del rifiuto, sotto non c&#8217;era quasi nulla \u2014 il modello rispondeva liberamente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mistral 7B Instruct ha subito un <strong>RLHF (Reinforcement Learning from Human Feedback) intensivo<\/strong>: migliaia di esempi di feedback umano che hanno modellato non solo i rifiuti espliciti, ma anche il tono, lo stile, la tendenza a moralizzare e a inserire disclaimer. L&#8217;abliterazione rimuove il meccanismo del rifiuto diretto \u2014 ma i pattern comportamentali profondi rimangono nei pesi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Risultato pratico: il modello non dice pi\u00f9 &#8220;non posso aiutarti con questo&#8221;, ma la risposta che fornisce \u00e8 comunque moderata, annacquata, con tendenza all&#8217;auto-censura implicita.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Questo ha senso una volta capito come funziona il processo: <strong>Heretic modifica la geometria latente, non riscrive il training<\/strong>. Su modelli con RLHF leggero, basta. Su modelli con RLHF pesante, rimuove il sintomo ma non la causa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c8 una distinzione che non trovi spiegata chiaramente quasi da nessuna parte, e che cambia il modo in cui si sceglie il modello di partenza per questo tipo di esperimento.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">I problemi tecnici incontrati (e risolti)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Il percorso non \u00e8 stato lineare. Alcune difficolt\u00e0 che vale la pena documentare:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Il proxy del nodo Vast.ai<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Il nodo che avevo noleggiato aveva una configurazione di rete non standard: tutto il traffico verso Hugging Face veniva intercettato da un proxy locale (<code>117.175.104.83:8081<\/code>), probabilmente un mirror per ridurre i costi di banda del provider.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Questo causava due problemi:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The <strong>download di modelli non popolari<\/strong> falliva con errore 401 (il mirror non li aveva in cache)<\/li>\n\n\n\n<li>L&#8217;<strong>upload verso Hugging Face<\/strong> falliva perch\u00e9 il proxy non supportava il nuovo protocollo di storage (Xet) usato da HF<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Soluzione per il download: <code>export HF_ENDPOINT=https:\/\/huggingface.co<\/code> prima di lanciare qualsiasi comando.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Soluzione per l&#8217;upload: disabilitare il protocollo Xet e forzare LFS classico con <code>HF_HUB_DISABLE_XET=1<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Il formato del tokenizer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Heretic 1.3.0 (la versione installata sul cloud) salva il tokenizer con una classe non standard (<code>TokenizersBackend<\/code>) che le versioni locali di Transformers non riconoscono. Risolto modificando il <code>tokenizer_config.json<\/code> per usare <code>PreTrainedTokenizerFast<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Piccolo ma utile: mostra quanto il versionamento degli strumenti AI cambi velocemente e quanto sia importante documentare l&#8217;ambiente esatto usato per ogni esperimento.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Cosa ho imparato (questa volta)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Sul cloud computing per ML<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Il cloud GPU ha senso economico per task puntuali e computazionalmente pesanti. Per addestrare o modificare modelli da 7B in su, noleggiare 30 minuti di RTX 4090 costa meno dell&#8217;elettricit\u00e0 che consumeresti a far girare la stessa operazione per ore sulla tua GPU locale \u2014 e il risultato \u00e8 di qualit\u00e0 superiore perch\u00e9 si usa piena precisione senza quantizzazione.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vast.ai in particolare \u00e8 interessante perch\u00e9 il mercato \u00e8 competitivo: i prezzi variano molto tra i nodi, e con un po&#8217; di attenzione si trovano istanze verificate a meno di $0.40\/ora.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Sul processo di allineamento dei modelli<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;esperimento ha reso concreto qualcosa che prima capivo solo in modo astratto: l&#8217;allineamento di un LLM non \u00e8 uno strato separabile \u2014 \u00e8 distribuito nei pesi attraverso tutto il training. Rimuovere il rifiuto esplicito \u00e8 relativamente facile. Rimuovere i pattern comportamentali profondi richiede interventi diversi, pi\u00f9 invasivi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I modelli con RLHF leggero (come certi fine-tune community, o i modelli base senza instruction tuning) rispondono molto meglio all&#8217;abliterazione. I modelli con RLHF pesante (Meta Llama, modelli Instruct professionali) cedono il rifiuto esplicito ma mantengono il &#8220;carattere&#8221; del training.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Sulla scelta del modello di partenza<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Non tutti i modelli sono equivalenti come candidati per l&#8217;abliterazione. Il criterio pi\u00f9 importante non \u00e8 la dimensione \u2014 \u00e8 <strong>quanto aggressivo \u00e8 stato il processo di allineamento<\/strong>. Un 7B con RLHF leggero dar\u00e0 risultati pi\u00f9 netti di un 7B con RLHF intensivo.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Stack tecnico (aggiornato)<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Strumento<\/th><th>Ruolo<\/th><\/tr><\/thead><tbody><tr><td>Heretic v1.3.0<\/td><td>Tool di abliterazione<\/td><\/tr><tr><td>PyTorch 2.11 + CUDA 13.0<\/td><td>Calcolo su GPU (cloud)<\/td><\/tr><tr><td>Transformers 5.9.0<\/td><td>Caricamento modelli<\/td><\/tr><tr><td>bitsandbytes 0.49.2<\/td><td>Quantizzazione (uso locale)<\/td><\/tr><tr><td>Optuna 4.8.0<\/td><td>Ottimizzazione bayesiana<\/td><\/tr><tr><td>PEFT \/ LoRA<\/td><td>Applicazione modifiche ai pesi<\/td><\/tr><tr><td>Safetensors<\/td><td>Formato salvataggio modello<\/td><\/tr><tr><td>HuggingFace Hub<\/td><td>Pubblicazione e distribuzione<\/td><\/tr><tr><td><strong>Vast.ai<\/strong><\/td><td><strong>GPU cloud a noleggio (RTX 4090, 48GB VRAM)<\/strong><\/td><\/tr><tr><td>Gradio<\/td><td>Interfaccia chat locale per test<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Cosa NON \u00e8 questo progetto (ancora)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Come nel primo articolo: non sono un AI engineer. Ho usato strumenti esistenti, documentazione, e la capacit\u00e0 di capire cosa stavo facendo prima di farlo \u2014 inclusi i problemi tecnici che si presentano quando si esce dai tutorial e si lavora con ambienti reali.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;errore pi\u00f9 utile di questa sessione \u00e8 stato probabilmente quello del proxy: ha costretto a capire come funziona il routing delle richieste HTTP in un ambiente cloud, come Hugging Face gestisce i diversi protocolli di upload, e come si diagnostica un problema di rete quando l&#8217;errore che vedi non corrisponde al problema reale.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Link<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Modello pubblicato: <a href=\"https:\/\/huggingface.co\/paoloronco\/Mistral-7B-Instruct-v0.3-heretic\">paoloronco\/Mistral-7B-Instruct-v0.3-heretic<\/a><\/li>\n\n\n\n<li>Modello precedente: <a href=\"https:\/\/huggingface.co\/paoloronco\/TinyLlama-1.1B-Chat-v1.0-heretic\">paoloronco\/TinyLlama-1.1B-Chat-v1.0-heretic<\/a><\/li>\n\n\n\n<li>Repository GitHub modelli: <a href=\"https:\/\/github.com\/paoloronco\/heretic-models\">github.com\/paoloronco\/heretic-models<\/a><\/li>\n\n\n\n<li>Heretic (tool originale): <a href=\"https:\/\/github.com\/p-e-w\/heretic\">github.com\/p-e-w\/heretic<\/a><\/li>\n\n\n\n<li>Vast.ai (GPU cloud): <a href=\"https:\/\/vast.ai\">vast.ai<\/a><\/li>\n\n\n\n<li>Profilo HuggingFace: <a href=\"https:\/\/huggingface.co\/paoloronco\">huggingface.co\/paoloronco<\/a><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>","protected":false},"excerpt":{"rendered":"<p>Il secondo capitolo del progetto Heretic: stessa tecnica, modello pi\u00f9 grande, GPU a noleggio per 2 euro \u2014 e qualche lezione inaspettata su come funziona davvero l&#8217;allineamento dei modelli AI. Il punto di partenza Nel primo esperimento avevo abliterato TinyLlama 1.1B sulla mia GPU locale \u2014 una RTX 3070 con 8GB di VRAM. Aveva funzionato &hellip; <a href=\"https:\/\/paoloronco.it\/en\/gpu-renting-e-modelli-modificati-abliterare-mistral-7b-nel-cloud\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;GPU renting e modelli modificati: abliterare Mistral 7B nel cloud&#8221;<\/span><\/a><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2623","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/posts\/2623","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/comments?post=2623"}],"version-history":[{"count":1,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/posts\/2623\/revisions"}],"predecessor-version":[{"id":2624,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/posts\/2623\/revisions\/2624"}],"wp:attachment":[{"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/media?parent=2623"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/categories?post=2623"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/tags?post=2623"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}