When you start fine-tuning language models, you often imagine a fairly straightforward process: prepare a dataset, run training, tweak a few prompts, and get a model that works reliably.Když člověk začíná s fine-tuningem jazykových modelů, často si představuje relativně přímočarý proces. Připravit dataset, spustit training, doladit pár promptů a získat model, který bude spolehlivě fungovat.
Reality is much less elegant.Realita je výrazně méně elegantní.
After the first few hundred documents I realized the problem usually is not the model itself. The hardest part tends to be defining the “reality” you actually want from the model.Po prvních stovkách dokumentů jsem zjistil, že problém většinou není samotný model. Největší problém bývá definice reality, kterou po modelu vlastně chceme.
Dataset and JSON schemaDataset a JSON schéma
At first I felt I had the dataset in good shape. But further tests showed that parts of the structure did not hold up long term. Some fields were defined too broadly, some too narrowly, and some edge cases could not be represented consistently at all.Na začátku jsem měl pocit, že mám dataset připravený dobře. Jenže po dalších testech se ukázalo, že některé části struktury nedávají dlouhodobě smysl. Některá pole byla definovaná příliš obecně, některá příliš úzce a některé edge cases nebylo možné konzistentně reprezentovat vůbec.
That is where the most expensive part of the work began.A tady začala ta nejdražší část celé práce.
One change to the JSON schema or to how the model should interpret a specific field meant manually revisiting hundreds of documents in the dataset from scratch. On larger datasets that was weeks of work just to keep the data consistent.Jedna změna v JSON struktuře nebo v tom, jak má model chápat konkrétní pole, znamenala ručně upravit stovky dokumentů v datasetu znovu od začátku. U větších datasetů to byly týdny práce jen proto, aby data zůstala konzistentní.
Prompts, local models, and total breakagePrompty, lokální modely a totální rozpad
Another big lesson came with prompting.Další velká lekce přišla u promptingu.
Local models have significantly weaker reasoning and worse attention than large cloud models. A single differently phrased word could change what the model focused on. Sometimes a tiny tweak to the instruction was enough for the model to stop returning important fields or to start ignoring parts of the document that had worked before.Lokální modely mají výrazně menší reasoning schopnosti a horší práci s pozorností než velké cloudové modely. Jediné jinak formulované slovo dokázalo změnit, na co se model soustředil. Někdy stačila drobná úprava instrukce a model přestal vracet důležitá pole nebo začal ignorovat části dokumentu, které předtím fungovaly správně.
And the worst part? You often cannot tell right away whether a change helped or broke everything.A nejhorší část? Člověk často neví hned, jestli změna pomohla nebo všechno rozbila.
For larger experiments that meant: adjust the prompt, launch a new tuning run, wait several hours, test the results, and discover that one part improved while three others fell apart. And the whole cycle starts again.U větších experimentů to znamenalo upravit prompt, spustit nový tuning, čekat několik hodin, otestovat výsledky a zjistit, že se zlepšila jedna část, ale rozpadly se tři další. A celé kolečko začít znovu.
Sometimes you wait for hours only to find out that one badly phrased word shifted the model’s attention somewhere else entirely.Občas člověk několik hodin čeká jen proto, aby zjistil, že jedno špatně formulované slovo přesunulo pozornost modelu úplně jinam.
And then come the moments when everything breaks completely.A pak přijdou momenty, kdy se všechno rozbije úplně.
You have a dataset you spent hundreds of hours on. Everything looks right. Training finishes. And the model starts returning utter nonsense. Not small mistakes. Full-blown hallucinations.Máte dataset, na kterém jste strávili stovky hodin. Všechno vypadá správně. Training doběhne. A model začne vracet absolutní nesmysly. Ne drobné chyby. Úplné halucinace.
Suddenly it ignores parts of documents, mixes up field meanings, returns broken JSON, or generates outputs that make no sense at all.Najednou ignoruje části dokumentů, plete si význam polí, vrací rozbitý JSON nebo generuje výstupy, které vůbec nedávají smysl.
And the worst part is you often have no idea why.A nejhorší je, že člověk často vůbec neví proč.
Is it the prompt? The data? Chunking? Learning rate? Quantization? The attention layer? Or did the model simply decide it hates your dataset today?Je problém v promptu? V datech? V chunkingu? V learning rate? V kvantizaci? V attention vrstvě? Nebo se prostě model jen rozhodl, že dneska nenávidí váš dataset?
At times I wanted to give up on tuning altogether.V některých chvílích jsem měl chuť se na celé ladění úplně vykašlat.
Because after more hours of waiting you learn only that the model worked yesterday, does not work today, and the only change was a few words in the prompt or a small tweak to the dataset.Protože po dalších hodinách čekání člověk zjistí jen to, že model fungoval včera, dnes nefunguje a jediná změna bylo pár slov v promptu nebo drobná úprava datasetu.
Training pipeline, GPU, and VRAMTraining pipeline, GPU a VRAM
On top of that you start wrestling with the training pipeline itself.A do toho všeho začne člověk řešit samotný training pipeline.
One day training runs at 10 seconds per iteration. The next day 70 seconds per iteration. Same dataset. Same hardware. Settings almost the same. Only now the GPU, instead of pulling 550 W, lazily chews along at 200 W and acts like it simply will not work today.Jednou training běží 10 sekund na iteraci. Druhý den 70 sekund na iteraci. Dataset stejný. Hardware stejný. Nastavení skoro stejné. Jen GPU najednou místo 550 W líně přežvykuje na 200 W a tváří se, že dneska prostě pracovat nebude.
And now another detective story begins. I/O bottleneck? Tokenizer? VRAM fragmentation? CPU throttling? A bad dataloader? CUDA? Driver? PyTorch? Kernel? Scheduler? Or did the universe just decide there will be no tuning today?A teď začíná další detektivka. Bottleneck v I/O? Tokenizer? VRAM fragmentation? CPU throttling? Špatný dataloader? CUDA? Driver? PyTorch? Kernel? Scheduler? Nebo jen vesmír rozhodl, že dneska žádný tuning nebude?
Then you spend hours not watching “AI” but GPU utilization graphs, wondering why a card that cost tens of thousands suddenly behaves like a calculator from 2004.Člověk pak několik hodin nesleduje AI, ale grafy vytížení GPU a přemýšlí, proč karta za desítky tisíc korun najednou funguje jako kalkulačka z roku 2004.
And then comes another lesson: VRAM.A pak přijde další lekce: VRAM.
A lot of the experiments ran on an RTX 4090, which is a great card — until you start working with larger vision models and real documents.Velká část experimentů probíhala na RTX 4090, což je skvělá karta… dokud člověk nezačne pracovat s většími vision modely a reálnými dokumenty.
Suddenly you are fighting for every gigabyte of memory. So you start lowering image resolution, tuning batch size, and making tradeoffs just so training fits in VRAM at all.Najednou začnete bojovat o každý gigabajt paměti. Takže člověk začne snižovat rozlišení obrázků, optimalizovat batch size a dělat kompromisy, aby se training vůbec vešel do VRAM.
But that creates another problem.Jenže tím vznikne další problém.
The model stops learning to read documents and starts learning to guess.Model se přestane učit číst dokumenty a začne se učit hádat.
The text is too small, parts of the document are blurry, and instead of real reading the model starts building statistical shortcuts from layout and patterns.Text je příliš malý, části dokumentů rozmazané a model si místo skutečného čtení začne vytvářet statistické zkratky podle layoutu a patternů.
On some data it looks like everything works great — until a new document arrives, a slightly different scan or structure — and the model completely falls apart.Na některých datech to vypadá, že všechno funguje skvěle. Dokud nepřijde nový dokument, trochu jiný scan nebo jiná struktura — a model se úplně rozsype.
And it takes a while before you realize the problem is not the prompt or the dataset but that, for lack of VRAM, the model never really “saw” what it was supposed to read most of the time.A člověku zase chvíli trvá, než mu dojde, že problém není v promptu ani datasetu, ale v tom, že kvůli nedostatku VRAM model vlastně většinu času pořádně „neviděl“, co měl číst.
Over time I also tried synthetic data and generated documents. At first glance it looked good: clean results, high accuracy, stable outputs.Postupně jsem zkoušel i syntetická data a generované dokumenty. Na první pohled to vypadalo dobře. Čisté výsledky, vysoká přesnost, stabilní výstupy.
But then production reality showed up.Jenže pak přišla produkční realita.
Rotated scans. Messy documents. Inconsistent layouts. OCR errors. Phone photos of documents. Torn pages. PDFs that were not really PDFs at all.Otočené scany. Špinavé dokumenty. Nekonzistentní layouty. OCR chyby. Dokumenty focené mobilem. Roztrhané stránky. PDF, které technicky ani nebyly skutečné PDF.
A model trained on overly clean data started failing exactly where it mattered most in production.Model naučený na příliš čistých datech začal selhávat přesně tam, kde na tom v produkci záleželo nejvíc.
And then comes another part almost nobody talks about: what to do once you finally have a good LoRA adapter.A pak přijde další část, o které se skoro nemluví: co vlastně dělat, když už konečně máte dobrý adapter.
Suddenly you are not only dealing with the model but distribution, versioning, compatibility, deployment, and security.Najednou člověk neřeší jen model, ale distribuci, verzování, kompatibilitu, deployment a bezpečnost.
If the adapter encodes months of work, tuning on internal data, and domain know-how, you do not want to casually upload it somewhere in the cloud and hope it “does not get lost.”Pokud adapter obsahuje měsíce práce, tuning na interních datech a know-how kolem konkrétní domény, nechcete ho jen tak nahrát někam do cloudu a doufat, že se „nějak neztratí“.
The questions start: where will inference run, who has access to the models, how to isolate customer data, how to secure adapters, and how to stop someone from simply walking off with the output of your entire effort.Začínají otázky: kde bude inference běžet, kdo má přístup k modelům, jak oddělit zákaznická data, jak zabezpečit adaptery a jak zabránit tomu, aby někdo jednoduše nevzal výsledky celé práce.
That is when you realize AI systems are not just about training models.V tu chvíli člověk zjistí, že AI systémy nejsou jen o trénování modelů.
The model is often the smallest part of the problem.Model je často ta nejmenší část problému.
The hard parts tend to be data quality, dataset consistency, output validation, edge cases, deployment, security, and compressing real-world chaos into a shape the model can still understand.To nejtěžší bývá kvalita dat, konzistence datasetu, validace výstupů, edge cases, deployment, bezpečnost a schopnost přiblížit chaos reálného světa do podoby, kterou model ještě dokáže pochopit.
The more you work with real documents, the less you believe you can “just use AI.”Čím víc člověk pracuje s reálnými dokumenty, tím méně věří představě, že stačí „jen použít AI“.
Because the biggest gap between a demo and a production system is often not the model.Protože největší rozdíl mezi demem a produkčním systémem často není v modelu.
It is how much chaos from the real world the system can survive long term.Je v tom, kolik chaosu z reality systém dokáže dlouhodobě přežít.