То кошта милионе долара и мјесеци рачунарског времена да обучи велики језик модел од нуле. највероватније никада не морате да то урадите. фине-тунинг вам омогућава да прилагодите претходно обучене језике за ваше потребе у сатима или данима, а не месецима, са фракцијом ресурса. Овај туториал ће вас : научићете четири основне технике фине прилагођавања, кодирати комплетан тренинг цевовод у Питону и научити технике које раздвајају готове моделе од скупих експеримената. from theory to practice Шта је ЛЛМ Фине-Тунинг? Фине-тунинг тренира постојећи језички модел на вашим подацима како би га побољшао Pre-trenirani modeli su moćni generalisti, ali ih izlažu Можете их претворити у специјалисте за ваш случај употребе. performance on specific tasks focused examples Уместо да изградите модел од нуле (који захтева огромно израчунавање и податке), дајете већ способном моделу колапс у ономе што вам је важно, било да је то медицинска дијагноза, аутоматизација корисничке подршке, анализа осећања или било који други специфичан задатак. Како ради ЛЛМ Фине-Тунинг? Фине-тунинг наставља процес обуке на претходно обученим језичким моделима користећи ваш специфичан скуп података. модел обрађује ваше примере, упоређује своје резултате са очекиваним резултатима, и да се прилагоде и минимизирају губитке. updates internal weights Овај приступ може варирати на основу вашег , , и Неки пројекти захтевају потпуно фино подешавање, где ажурирате све параметре модела, док други боље раде са параметарски ефикасним методама као што су То мења само мали део. goals available data computational resources Лора ЛЛМ Фине-тунинг методе Контролисано фине-тунирање SFT uči model da nauči obrasce ispravnih parova pitanja i odgovora i prilagođava težine modela da tačno odgovaraju tim odgovorima. Користите ово када желите доследне излазе, као што је да модел увек одговара у ЈСОН формату, пратите скрипте за услугу корисницима или пишете е-пошту у тону ваше компаније. (Prompt, Ideal Response) Ненадзорни фине-тунинг Док је ово технички пре-тренинг процес познат као континуирано пре-тренинг (ЦПТ), то се обично ради након почетне пре-тренинг фазе. Користите ово прво када ваш модел треба да разуме специјализовани садржај на којем није првобитно обучен, као што је медицинска терминологија, правни уговори или нови језик. Директна преференцијална оптимизација ДПО учи модел да преферира боље одговоре тако што показује примере добрих и лоших одговора на исто питање и прилагођава га да подржава добре. Користите ДПО након основног тренинга да бисте поправили досадно понашање као што је заустављање модела да направи ствари, бити превише словесан или дати несигурне одговоре. (Prompt, Good Response, Bad Response) Побољшање фине-тунинг У РЛХФ-у, прво тренирате модел награде на позивима са више одговора који су рангирани од стране људи, учећи га да предвиди које одговоре људи преферирају. Затим, користите учење ојачања да бисте оптимизовали и фино прилагодили модел који генерише одговоре, које наградни модел суди. Ово помаже моделу да научи током времена да производи излазе са већим резултатима. Овај процес захтева скупове података у овом формату: Најбоље је за задатке у којима је лакше проценити квалитет него креирати савршене примере, као што су медицинске дијагнозе, правна истраживања и друга сложена размишљања специфична за домен. (Prompt, [Response A, Response B, ...], [Rankings]) Корак по корак Фине-Тунинг ЛЛМс туториал Ми ћемо вас водити кроз сваки корак фино подешавања малог претходно обученог модела како би се решили математички проблеми засновани на речима, са чиме се бори ван кутије. Приступ : подучавање модели специјализоване терминологије, побољшање перформанси модела на специфичним задацима, или га прилагођавање вашем домену. works for virtually any use case of fine-tuning LLMs Предуслови Инсталирајте неколико пакета Питхон које ћемо користити током овог туторијала.У новој фасцикли пројекта, креирајте и активирајте виртуелно окружење Питхон, а затим инсталирајте ове библиотеке користећи или ваш омиљени менаџер пакета: pip pip install requests datasets transformers 'transformers[torch]' Get & Load Dataset (Учитај и учитај скуп података) Процес фино подешавања почиње одабиром сета података, што је вероватно најважнија одлука. . reflect the task you want your model to perform Једноставни задаци као што је анализа осећања захтевају основне паре уноса и излаза. Комплексни задаци као што су праћење инструкција или одговарање на питања захтевају богатије скупове података са контекстом, примјерима и разноврсним форматима. Najlakši početak je библиотека сета података, која хостује хиљаде сетова података отвореног кода за различите домене и задатке. Да ли вам је потребно нешто специфично и квалитетно? или javno dostupni podaci. Hugging Face Purchase specialized datasets build your own by Скрапинг Скрапинг На пример, ако желите да изградите модел анализе осећања за Амазон рецензије производа, можда ћете желети да прикупите податке из стварних рецензија користећи алат за гребање на вебу. : Веб Сцрапер API import json import requests # Web Scraper API parameters. payload = { "source": "amazon_product", # Query is the ASIN of a product. "query": "B0DZDBWM5B", "parse": True, } # Send a request to the API and get the response. response = requests.post( "https://realtime.oxylabs.io/v1/queries", # Visit https://dashboard.oxylabs.io to claim FREE API tokens. auth=("USERNAME", "PASSWORD"), json=payload, ) print(response.text) # Extract the reviews from the response. reviews = response.json()["results"][0]["content"]["reviews"] print(f"Found {len(reviews)} reviews") # Save the reviews to a JSON file. with open("reviews.json", "w") as f: json.dump(reviews, f, indent=2) For this tutorial, let’s keep it simple without building a custom data collection pipeline. Since we're teaching the base model to solve word-based math problems, we can use the openai/gsm8k dataset. It’s a collection of grade-school math problems with step-by-step solutions. Load it in your Python file: from datasets import load_dataset dataset = load_dataset("openai/gsm8k", "main") print(dataset["train"][0]) Tokenizujte podatke za obradu Модели не разумеју текст директно; они раде са Tokenizacija pretvara vaš tekst u žetone (numeričke reprezentacije) koje model može da obrađuje.Svaki model ima svoj tokenizer obučeni pored njega, tako da koristite onaj koji odgovara vašem osnovnom modelu: numbers from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-0.5B") tokenizer.pad_token = tokenizer.eos_token Како токенизујемо наше облике података шта модел учи. За математичке проблеме желимо да усавршимо модел како бисмо научили како да Ево трика: токенизујте питања и одговоре одвојено, а затим користите технику маскирања. Odgovor Постављање питања токенс на kaže procesu obuke da ih ignoriše prilikom izračunavanja gubitaka. model uči samo iz odgovora, čineći obuku fokusnijom i efikasnijom. -100 def tokenize_function(examples): input_ids_list = [] labels_list = [] for question, answer in zip(examples["question"], examples["answer"]): # Tokenize question and answer separately question_tokens = tokenizer(question, add_special_tokens=False)["input_ids"] answer_tokens = tokenizer(answer, add_special_tokens=False)["input_ids"] + [tokenizer.eos_token_id] # Combine question + answer for input input_ids = question_tokens + answer_tokens # Mask question tokens with -100 so loss is only computed on the answer labels = [-100] * len(question_tokens) + answer_tokens input_ids_list.append(input_ids) labels_list.append(labels) return { "input_ids": input_ids_list, "labels": labels_list, } Примените ову функцију токенизације и на скупове података за обуку и тестирање. Филтрирамо примере дуже од 512 токена како бисмо управљали употребом меморије и осигурали да модел обрађује комплетне информације без прекида. train_dataset = dataset["train"].map( tokenize_function, batched=True, remove_columns=dataset["train"].column_names, ).filter(lambda x: len(x["input_ids"]) <= 512) .shuffle(seed=42) eval_dataset = dataset["test"].map( tokenize_function, batched=True, remove_columns=dataset["test"].column_names, ).filter(lambda x: len(x["input_ids"]) <= 512) print(f"Samples: {len(dataset['train'])} → {len(train_dataset)} (after filtering)") print(f"Samples: {len(dataset['test'])} → {len(eval_dataset)} (after filtering)") Optional: Да ли желите брзо тестирати цијели цевовод пре него што се обавезујете на пуну обуку? Можете тренирати модел на подсету података. Дакле, уместо да користите комплетан 8.5К сет података, можете га минимизирати на 3К укупно, чинећи процес много бржим: train_dataset = train_dataset.select(range(2000)) eval_dataset = eval_dataset.select(range(1000)) Manji skupovi podataka povećavaju rizik od prekomerne konfiguracije, gde model pamti podatke o obuci umesto da uči opšte obrasce.Za proizvodnju, ciljajte na najmanje 5K+ uzorke obuke i pažljivo podesite svoje hiperparametre. Keep in mind: Иницијализација базног модела Затим учитајте претходно обучени базни модел да бисте га фино прилагодили побољшањем његових математичких способности за решавање проблема: from transformers import AutoModelForCausalLM model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-0.5B") model.config.pad_token_id = tokenizer.pad_token_id Фине-туне користећи метод тренера Овде се дешава магија. TrainingArguments контролише како ваш модел учи (мислите на то као рецепт који одређује квалитет коначног резултата).Ова подешавања и хиперпараметри могу направити или сломити ваше фино подешавање, тако да експериментишете са различитим вредностима да бисте пронашли шта функционише за ваш случај употребе. Key parameters explained: • Више епоха једнако је више могућности за учење, али превише узрокује преоптерећење. Epochs: • Утиче на употребу меморије и брзину обуке. Прилагодите их на основу вашег хардвера. Batch size: • Контролише колико брзо се модел прилагођава. Превише високо и може пропустити оптимално решење, превише ниско и обука траје заувек. Learning rate: • Може помоћи у спречавању преоптерећења одвраћањем модела од претераног ослањања на било који појединачни образац.Ако је деградација тежине превелика, то може довести до подоптерећења спречавајући модел да научи неопходне обрасце. Weight decay: Оптимална конфигурација испод је специјализована за обуку ЦПУ-а (уклоните use_cpu=True ако имате ГПУ): from transformers import TrainingArguments, Trainer, DataCollatorForSeq2Seq training_args = TrainingArguments( output_dir="./qwen-math", # Custom output directory for the fine-tuned model use_cpu=True, # Set to False or remove to use GPU if available # Training duration num_train_epochs=2, # 3 may improve reasoning at the expense of overfitting # Batch size and memory management per_device_train_batch_size=5, # Adjust depending on your PC capacity per_device_eval_batch_size=5, # Adjust depending on your PC capacity gradient_accumulation_steps=4, # Decreases memory usage, adjust if needed # Learning rate and regularization learning_rate=2e-5, # Affects learning speed and overfitting weight_decay=0.01, # Prevents overfitting by penalizing large weights max_grad_norm=1.0, # Prevents exploding gradients warmup_ratio=0.1, # Gradually increases learning rate to stabilize training lr_scheduler_type="cosine", # Smoother decay than linear # Evaluation and checkpointing eval_strategy="steps", eval_steps=100, save_strategy="steps", save_steps=100, save_total_limit=3, # Keep only the best 3 checkpoints load_best_model_at_end=True, # Load the best checkpoint at the end of training metric_for_best_model="eval_loss", greater_is_better=False, # Logging logging_steps=25, logging_first_step=True, ) # Data collator handles padding and batching data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=model) # Initialize trainer trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=eval_dataset, data_collator=data_collator, ) # Fine-tune the base model print("Fine-tuning started...") trainer.train() Once training completes, save your fine-tuned model: trainer.save_model("./qwen-math/final") tokenizer.save_pretrained("./qwen-math/final") 5 Оцените модел Након фино подешавања, измерите колико добро ваш модел функционише користећи две заједничке метрике: • Meri koliko su predviđanja modela daleko od ciljanih rezultata, gde niže vrednosti ukazuju na bolje performanse. Loss: • Prikazuje iste informacije na intuitivnijoj skali, gde niže vrednosti znače da je model sigurniji u svoje predviđanja. Perplexity (the exponential of loss): За производна окружења, размотрите додавање метрике као што су или da bi se izmerilo koliko se usko generisani odgovori podudaraju sa referentnim odgovorima. BLEU ROUGE import math eval_results = trainer.evaluate() print(f"Final Evaluation Loss: {eval_results['eval_loss']:.4f}") print(f"Perplexity: {math.exp(eval_results['eval_loss']):.2f}") Такође можете укључити и друге метрике као што је Ф1, који мери колико је ваш модел добар у хватању онога што је важно док остаје тачан. је добра почетна тачка за учење о суштинама коришћења библиотеке трансформатора. Загрљај лице читање Пример комплетног фине-тунинг кода Након ових пет корака, требало би да имате следећи код комбинован у једну Питхон датотеку: import math from datasets import load_dataset from transformers import ( AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer, DataCollatorForSeq2Seq, ) dataset = load_dataset("openai/gsm8k", "main") tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-0.5B") tokenizer.pad_token = tokenizer.eos_token # Tokenization function adjusted for the specific dataset format def tokenize_function(examples): input_ids_list = [] labels_list = [] for question, answer in zip(examples["question"], examples["answer"]): question_tokens = tokenizer(question, add_special_tokens=False)["input_ids"] answer_tokens = tokenizer(answer, add_special_tokens=False)["input_ids"] + [tokenizer.eos_token_id] input_ids = question_tokens + answer_tokens labels = [-100] * len(question_tokens) + answer_tokens input_ids_list.append(input_ids) labels_list.append(labels) return { "input_ids": input_ids_list, "labels": labels_list, } # Tokenize the data train_dataset = dataset["train"].map( tokenize_function, batched=True, remove_columns=dataset["train"].column_names, ).filter(lambda x: len(x["input_ids"]) <= 512) .shuffle(seed=42) eval_dataset = dataset["test"].map( tokenize_function, batched=True, remove_columns=dataset["test"].column_names, ).filter(lambda x: len(x["input_ids"]) <= 512) print(f"Samples: {len(dataset['train'])} → {len(train_dataset)} (after filtering)") print(f"Samples: {len(dataset['test'])} → {len(eval_dataset)} (after filtering)") # Optional: Use a smaller subset for faster testing # train_dataset = train_dataset.select(range(2000)) # eval_dataset = eval_dataset.select(range(1000)) model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-0.5B") model.config.pad_token_id = tokenizer.pad_token_id # Configuration settings and hyperparameters for fine-tuning training_args = TrainingArguments( output_dir="./qwen-math", use_cpu=True, # Training duration num_train_epochs=2, # Batch size and memory management per_device_train_batch_size=5, per_device_eval_batch_size=5, gradient_accumulation_steps=4, # Learning rate and regularization learning_rate=2e-5, weight_decay=0.01, max_grad_norm=1.0, warmup_ratio=0.1, lr_scheduler_type="cosine", # Evaluation and checkpointing eval_strategy="steps", eval_steps=100, save_strategy="steps", save_steps=100, save_total_limit=3, load_best_model_at_end=True, metric_for_best_model="eval_loss", greater_is_better=False, # Logging logging_steps=25, logging_first_step=True, ) data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=model) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=eval_dataset, data_collator=data_collator, ) # Fine-tune the base model print("Fine-tuning started...") trainer.train() # Save the final model trainer.save_model("./qwen-math/final") tokenizer.save_pretrained("./qwen-math/final") # Evaluate after fine-tuning eval_results = trainer.evaluate() print(f"Final Evaluation Loss: {eval_results['eval_loss']:.4f}") print(f"Perplexity: {math.exp(eval_results['eval_loss']):.2f}") Пре извршења, узмите тренутак да прилагодите конфигурацију тренера и хиперпараметре на основу онога што ваша машина заправо може да се носи. Да бисте вам дали референцу у стварном свету, ево шта је глатко радило за нас на МацБоок Аиру са М4 чипом и 16ГБ РАМ-а. • : 7 Batch size for training • 7 Batch size for eval: • 5 Gradient accumulation: Како ваш модел возе, држите поглед на Ако се повећава док губитак тренинга пада, модел је преоптерећен. У том случају, прилагодите епохе, смањите стопу учења, модификујте губитак тежине и друге хиперпараметре.У примјеру испод видимо здраве резултате са губитком евалуа смањујући се од два Завршна заблуда о . evaluation loss 0.496 0.469 1.60 Тестирање фино прилагођеног модела Сада за тренутак истине – да ли је наш фин-тунинг заправо успео? Можете ручно тестирати фин-тунинг модел тако што ћете га позвати помоћу овог Питон кода: from transformers import pipeline generator = pipeline( "text-generation", # Use `Qwen/Qwen2.5-0.5B` for testing the base model model="./qwen-math/final" ) output = generator( "James has 5 apples. He buys 3 times as many. Then gives half away. How many does he have?", return_full_text=False ) print(output[0]["generated_text"]) У овом поређењу, можете видети како модели пре и после одговарају на исто питање (прави одговор је 10): Када је узорковање омогућено, оба модела повремено добијају право или погрешно због случајности. функција открива њихово право поверење: модел увек бира свој највероватнији одговор. Уверен излаз (на језику ), док је Уверен излаз (на језику To je fine-tuning na poslu. do_sample=False in the generator() base model -2 pogrešno fine-tuned model 10 исправно Фине-тунинг најбоље праксе Избор модела • Модели специфични за домен и одговарајући контекстни прозори штеде вас од борбе против постојећег знања модела. Choose the right base model: • Модели само за енкодер (као што је БЕРТ) одликују се за задатке класификације, модели само за декодер (као што је ГПТ) за генерисање текста и модели за енкодер-декодер (као што је Т5) за задатке трансформације као што су превод или сумирација. Understand the model architecture: • Ако је ваш основни модел обучен са специфичним шаблонима за позиве, користите исти формат у фином подешавању. Match your model's input format: Припрема података • Чисти и прецизни примери сваки пут превазилазе масивне и бучне податке. Prioritize data quality over quantity: • Никада не дозволите свом моделу да види податке о евалуацији током тренинга. Ово вам омогућава да ухватите прекомјерну опрему пре него што уништи ваш модел. Split training and evaluation samples: • Аутоматске метрике као што је збуњеност не кажу да ли модел заправо прати инструкције или само статистички предвиђа речи. Establish a "golden set" for evaluation: Стратегија обуке • Направите мање прилагођавања, не учите га од нуле, тако да агресивне стопе могу избрисати оно што је научено током пре-тренинга. Start with a lower learning rate: • Тренирајте само 1% параметара да бисте добили 90% + перформансе док користите мање меморије и времена. Use parameter-efficient fine-tuning (LoRA/PEFT): • Циљати све слојеве ( итд.) даје моделе који размишљају знатно боље, а не само имитирају стил. Target all linear layers in LoRA: q_proj, k_proj, v_proj, o_proj, • Случајни бука у уграђењима делује као регулација, што може спречити памћење и повећати квалитет разговора за 35+ процентних поена. Use NEFTune ( ): Бучно убацивање фин-тунинг Бучно убацивање фин-тунинг • СФТ учи како да разговара; ДПО учи шта је добро учењем од преференцијалних парова. After SFT, Run DPO: Која су ограничења ЛЛМ Фине-Тунинг? • Фине-тунинг преписује постојеће неуронске обрасце, што може избрисати драгоцено опште знање које је модел научио током пре-тренинга.Мулти-таск учење, где тренирате на свом специјализованом задатку уз опште примере, може помоћи очувању шире могућности. Catastrophic forgetting: • Модел може запамтити ваше примере тренинга уместо образаца учења, узрокујући да не успе на мало различитим уносима. Overfitting on small datasets: • Фино подешавање милијарди параметара захтева скупе ГПУ-је, значајну меморију и сате до дана или недеља времена обуке. High computational cost: • Претходно обучени модели већ носе предрасуде из својих података о обуци, а фино подешавање може интензивирати ове предрасуде ако ваш скуп података није пажљиво куриран. Bias amplification: • Ново и спољашње знање може захтевати ретренирање целог модела или имплементацију Retrieval-Augmented Generation (RAG), док поновљено фино подешавање често деградира перформансе. Manual knowledge update: Закључак Fine-tuning funkcioniše, ali samo ako su vaši podaci čisti i vaši hiperparametri su uključeni.Kombinujte ga sa prompt inženjering za najbolje rezultate, gde fin-tuning rukuje specijalizacijom zadataka, dok prompt inženjering vodi ponašanje modela u vreme zaključivanja. Наставите тако што ћете ухватити модел из Хаггинг Фаце-а који одговара вашем корисничком случају за фино подешавање специфичног за домен, скрапити или изградити квалитетни скуп података за ваш задатак и покренути своју прву сесију фино подешавања на малом подсету.Када видите обећавајуће резултате, скалирајте и експериментишите са ЛоРА, ДПО или НЕФТУНЕ-ом како бисте стиснули бољу перформансу.