Ana içeriğe geç

GPT-OSS’u İnce Ayarlama

Hem doğruluk hem de üslup uyumu için tıbbi soru-cevap veri kümesi üzerinde OpenAI GPT-OSS 20B modelini ince ayarlamaya yönelik adım adım kılavuz.
· 6 dk. oku

Yapay Zeka ile Keşfedin

GPT-OSS 20B, OpenAI’nin gpt-oss serisinden, düşük gecikme ve uzmanlaşmış kullanım senaryoları için tasarlanmış açık ağırlıklı bir dil modelidir. 21 milyar parametreye (3,6B aktif) sahiptir ve MXFP4 niceleme sayesinde yalnızca yaklaşık 16 GB bellek gerektirerek tüketici donanımında verimli çalışacak şekilde optimize edilmiştir.

GPT-OSS 120B’den daha küçük olmasına rağmen, yine de yapılandırılabilir akıl yürütme düzeyleri (düşük, orta, yüksek), hata ayıklama ve şeffaflık için tam zincirleme düşünme erişimi ve fonksiyon çağırma, web’de gezinme, kod yürütme gibi aracısal yetenekler gibi gelişmiş özellikleri destekler.

Bu kılavuzda, GPT-OSS 20B’nin kurulum ve ince ayar sürecinin tamamını adım adım anlatacağım. Buna şunlar dahildir:

  1. Bağımlılıkların kurulması ve ortamın hazırlanması
  2. Model ve belirteçleyicinin (tokenizer) yüklenmesi
  3. Yeni OpenAI Harmony Python paketiyle istem (prompt) stilinin oluşturulması
  4. Veri kümesinin yüklenmesi ve Harmony biçimlendirmesinin uygulanması
  5. İnce ayardan önce basit model çıkarımı (inference) çalıştırma
  6. Modelin eğitime hazırlanması
  7. Modelin bir tıbbi S&C veri kümesi üzerinde ince ayarı
  8. İyileştirmeleri değerlendirmek için ince ayardan sonra çıkarım yapma

Bu eğitimin araştırma ve eğitim amaçlı olduğunu, hasta tanı veya tedavisi için olmadığını unutmayın.

Görsel: Yazar

1. Ortamın Hazırlanması

GPT-OSS modeli 21 milyar parametreye sahip olsa da, modeli rahatça yönetmek için en az 80 GB VRAM olmak üzere ciddi GPU belleğine ihtiyaç duyar. Hızlı bir başlangıç için RunPod H100 örneği ya da benzer yüksek bellekli bir GPU ortamı başlatabilirsiniz.

RunPod H100SXM machine

Ortam hazır olduğunda, veri işleme, model ince ayarı ve deney takibi için gerekli tüm Python paketlerini kurun:

%%capture
%pip install -U accelerate 
%pip install -U peft 
%pip install -U trl 
%pip install -U bitsandbytes
%pip install -U transformers
%pip install -U trackio
%pip install -U openai-harmony
%pip install -U tiktoken
%pip install -U pyctcdecode

Son olarak, Hugging Face Hub’a API anahtarınızla giriş yapın. Bu sayede ince ayarlı modeli ve belirteçleyiciyi doğrudan Hugging Face hesabınıza kaydedip paylaşabilirsiniz:

from huggingface_hub import notebook_login

notebook_login()

2. GPT-OSS Modeli ve Belirteçleyicinin Yüklenmesi

Sırada, MXFP4 niceleme ile GPT-OSS 20B’yi yüklüyoruz; ancak yükleme sırasında ağırlıkları anında bfloat16’a denorlamaya alıyor, istekli dikkat (eager attention) kullanıyor, önbelleği devre dışı bırakıyor ve otomatik aygıt yerleşimi uyguluyoruz.

import torch
from transformers import AutoModelForCausalLM, Mxfp4Config

quantization_config = Mxfp4Config(dequantize=True)
model_kwargs = dict(
    attn_implementation="eager",
    torch_dtype=torch.bfloat16,
    quantization_config=quantization_config,
    use_cache=False,
    device_map="auto",
)

model = AutoModelForCausalLM.from_pretrained("openai/gpt-oss-20b", **model_kwargs)

Modele ek olarak, aynı depodan belirteçleyiciye de ihtiyacımız var. Belirteçleyici, metni modelin işleyebileceği belirteçlere (ID’ler) dönüştürmekten ve model çıktısını tekrar insan tarafından okunabilir metne çevirmekten sorumludur.

from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("openai/gpt-oss-20b")

3. OpenAI Harmony ile İstem Stili Oluşturma

OpenAI Harmony, GPT-OSS modelleri tarafından konuşmaları, akıl yürütme çıktıları ve fonksiyon çağrılarını tutarlı bir şekilde yapılandırmak için kullanılan özel bir yanıt biçimidir. 

Sistem, geliştirici, kullanıcı ve asistan rollerindeki mesajların nasıl düzenlendiğini tanımlar ve modelin birden fazla kanalda çıktı üretmesini sağlar—örneğin, zincirleme düşünmeyi, araç-çağrısı ön notlarını ve son kullanıcıya dönük yanıtları ayırır.

Bu bölümde, bir soru ve yanıtı alıp bunları Harmony tarzı bir sohbet istemine biçimlendiren bir fonksiyon oluşturacağız. openai_harmony kitaplığını kullanarak konuşmayı yapılandırılmış biçimde kodlar.

from openai_harmony import (
    load_harmony_encoding, HarmonyEncodingName,
    Conversation, Message, Role,
    SystemContent, DeveloperContent, ReasoningEffort
)

enc = load_harmony_encoding(HarmonyEncodingName.HARMONY_GPT_OSS)

def render_pair_harmony(question, answer):
    convo = Conversation.from_messages([
        Message.from_role_and_content(
            Role.DEVELOPER,
            DeveloperContent.new().with_instructions(
                "You are a medical expert with advanced knowledge in clinical reasoning and diagnostics. "
                "Respond with ONLY the final diagnosis/cause in ≤5 words."
            )
        ),
        Message.from_role_and_content(Role.USER, question.strip()),
        Message.from_role_and_content(Role.ASSISTANT, answer.strip()),
    ])
    tokens = enc.render_conversation(convo)
    text = enc.decode(tokens)
    return text

4. Veri Kümesini Yükleme ve Biçimlendirme

Şimdi tıbbi S&C veri kümesini (FreedomIntelligence/medical-o1-verifiable-problem) yükleyecek ve her örneğe prompt_style_harmony fonksiyonunu uygulayacağız. Dönüştürülen metin, geliştirici istemiyle uyumlu, temiz ve talimat odaklı bir biçim veren "text" adlı yeni bir sütunda saklanır.

from datasets import load_dataset

def prompt_style_harmony(examples):
    qs = examples["Open-ended Verifiable Question"]
    ans = examples["Ground-True Answer"]
    outputs = {"text": []}
    for q, a in zip(qs, ans):
        rendered = render_pair_harmony(q, a)
        outputs["text"].append(rendered)
    return outputs

dataset = load_dataset(
    "FreedomIntelligence/medical-o1-verifiable-problem",
    split="train[0:1000]"
)
dataset = dataset.map(prompt_style_harmony, batched=True)
print(dataset.column_names)

print(dataset[0]["text"])

Veri kümesi artık Harmony biçiminde sohbeti içeren yeni bir "text" sütunu barındırıyor. Bu şunları kapsar:

  • Geliştirici talimatları (ör. kısa bir tanıyla yanıt verin)
  • Kullanıcı mesajı (tıbbi soru)
  • Asistan mesajı (gerçek yanıt)
['Open-ended Verifiable Question', 'Ground-True Answer', 'text']
<|start|>developer<|message|># Instructions

You are a medical expert with advanced knowledge in clinical reasoning and diagnostics. Respond with ONLY the final diagnosis/cause in ≤5 words.<|end|><|start|>user<|message|>An 88-year-old woman with osteoarthritis is experiencing mild epigastric discomfort and has vomited material resembling coffee grounds multiple times. Considering her use of naproxen, what is the most likely cause of her gastrointestinal blood loss?<|end|><|start|>assistant<|message|>Gastric ulcer<|end|>

5. İnce Ayardan Önce Model Çıkarımı

Modeli eğitmeden önce, ince ayardan sonra karşılaştırmak için temel performansını değerlendirmek önemlidir. Bunu yapmak için, geliştiricinin katı talimatlarını ve kullanıcının sorusunu içeren, ancak asistanın yanıtını modelin tamamlaması için boş bırakan Harmony tarzı bir istem hazırlayan render_inference_harmony yardımcı fonksiyonunu tanımlıyoruz.

def render_inference_harmony(question):
    convo = Conversation.from_messages([
        Message.from_role_and_content(
            Role.DEVELOPER,
            DeveloperContent.new().with_instructions(
                "You are a medical expert with advanced knowledge in clinical reasoning and diagnostics. "
                "Respond with ONLY the final diagnosis/cause in ≤5 words."
            )
        ),
        Message.from_role_and_content(Role.USER, question.strip()),
    ])
    tokens = enc.render_conversation_for_completion(convo, Role.ASSISTANT)
    text = enc.decode(tokens)
    return text

Ardından, veri kümesinden ilk örneği alıp bu fonksiyonla biçimlendiriyor, belirteçliyor ve modele geçirerek bir yanıt üretiyoruz:

question = dataset[0]["Open-ended Verifiable Question"]

text = render_inference_harmony(question)

inputs = tokenizer(
    [text + tokenizer.eos_token], return_tensors="pt"
).to("cuda")
outputs = model.generate(
    input_ids=inputs.input_ids,
    attention_mask=inputs.attention_mask,
    max_new_tokens=20,
    eos_token_id=tokenizer.eos_token_id,
    use_cache=True,
)
response = tokenizer.batch_decode(outputs)
print(response[0])

Bu testte, geliştirici talimatları açıkça kısa bir tanı (≤5 kelime) isterken, modelin çıktısı belirgin şekilde daha uzun ve betimleyici oldu. 

<|start|>developer<|message|># Instructions

You are a medical expert with advanced knowledge in clinical reasoning and diagnostics. Respond with ONLY the final diagnosis/cause in ≤5 words.<|end|><|start|>user<|message|>An 88-year-old woman with osteoarthritis is experiencing mild epigastric discomfort and has vomited material resembling coffee grounds multiple times. Considering her use of naproxen, what is the most likely cause of her gastrointestinal blood loss?<|end|><|start|>assistant<|return|>We have an old woman with NSAID use causing ulcer bleed. The question: "An 88

Model, “Gastric ulcer” (gerçek etiket) demek yerine NSAID kullanımından ve ülser kanamasından bahseden uzun bir açıklama üretti.

dataset[0]["Ground-True Answer"]
'Gastric ulcer'

6. Modelin Eğitime Hazırlanması

Modeli verimli şekilde ince ayarlamak için, temel modeli donuk (frozen) tutarken yalnızca küçük bir parametre alt kümesini eğitmemizi sağlayan LoRA (Low-Rank Adaptation) kullanıyoruz. Bu yaklaşım bellek kullanımını ve eğitim maliyetini ciddi ölçüde düşürür.

LoraConfig ile rütbe, ölçekleme faktörü ve LoRA adaptörlerinin ekleneceği hedef katmanları belirleyerek başlıyoruz.

from peft import LoraConfig, get_peft_model

peft_config = LoraConfig(
    r=8,
    lora_alpha=16,
    target_modules="all-linear",
    target_parameters=[
        "7.mlp.experts.gate_up_proj",
        "7.mlp.experts.down_proj",
        "15.mlp.experts.gate_up_proj",
        "15.mlp.experts.down_proj",
        "23.mlp.experts.gate_up_proj",
        "23.mlp.experts.down_proj",
    ],
)
peft_model = get_peft_model(model, peft_config)
peft_model.print_trainable_parameters()

Eğitilebilir yalnızca ~15M parametre (tam modelin ≈%0,07’si) vardır ve adaptör boyutu yaklaşık 16 MB’tır; tam ince ayara kıyasla büyük bir verimlilik kazancı sağlar.

trainable params: 15,040,512 || all params: 20,929,797,696 || trainable%: 0.0719

Sonraki adımda trl kitaplığındaki SFTConfig ile eğitim kurulumunu yapılandırıyoruz. Buna öğrenme hızı, yığın boyutu, gradyan biriktirme, ısınma oranı ve zamanlayıcı türü gibi hiperparametreler dahildir:

from trl import SFTConfig

training_args = SFTConfig(
    learning_rate=2e-4,
    gradient_checkpointing=True,
    num_train_epochs=1,
    logging_steps=10,
    per_device_train_batch_size=4,
    gradient_accumulation_steps=4,
    max_length=2048,
    warmup_ratio=0.03,
    lr_scheduler_type="cosine_with_min_lr",
    lr_scheduler_kwargs={"min_lr_rate": 0.1},
    output_dir="gpt-oss-20b-medical-qa",
    report_to="trackio",
    push_to_hub=True,
)

7. Modelin Eğitilmesi

Veri kümesi hazır, LoRA adaptörü ekli ve eğitim argümanları yapılandırılmışken, artık ince ayar sürecini başlatabiliriz. trl kitaplığındaki SFTTrainer’ı kullanıyoruz; bu sınıf modeli, belirteçleyiciyi, veri kümesini ve eğitim döngüsünü tek yerde yöneterek gözetimli ince ayarı basitleştirir:

from trl import SFTTrainer

trainer = SFTTrainer(
    model=peft_model,
    args=training_args,
    train_dataset=dataset,
    processing_class=tokenizer,
)
trainer.train()

Eğitim sırasında kayıp kademeli olarak azalır; bu da modelin yanıtlarını Harmony biçimli tıbbi S&C veri kümesiyle hizalamayı öğrendiğini gösterir.

Model training loss

Eğitim tamamlandığında, ince ayarlı modeli yerel olarak kaydedip ardından Hugging Face Hub’a yüklüyoruz. Önemli bir nokta: Depoya yalnızca LoRA adaptör ağırlıkları (tam 20B model değil) yüklenir; bu da depoyu hafif ve paylaşımı kolay kılar:

trainer.save_model(training_args.output_dir)
trainer.push_to_hub(dataset_name="kingabzpro/gpt-oss-20b-medical-qa")

Bu işlem Hugging Face üzerinde şu ad altında yeni bir model deposu oluşturur: kingabzpro/gpt-oss-20b-medical-qa.

Kaynak: kingabzpro/gpt-oss-20b-medical-qa

8. İnce Ayardan Sonra Model Çıkarımı

İnce ayardan sonra modeli test ederek geliştirici talimatlarına daha yakından uyup uymadığını doğrulayabiliriz. Bunun için önce temel GPT-OSS 20B modelini yükleyip ardından ince ayarlı LoRA adaptörlerini ekliyoruz.

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel

# Load the tokenizer
tokenizer = AutoTokenizer.from_pretrained("openai/gpt-oss-20b")

# Load the original model first
model_kwargs = dict(attn_implementation="eager", torch_dtype="auto", use_cache=True, device_map="auto")
base_model = AutoModelForCausalLM.from_pretrained("openai/gpt-oss-20b", **model_kwargs).cuda()

# Merge fine-tuned weights with the base model
peft_model_id = "gpt-oss-20b-medical-qa"
model = PeftModel.from_pretrained(base_model, peft_model_id)
model = model.merge_and_unload()

Ardından, veri kümesinden bir örnek üzerinde çıkarım yapıyoruz. Soruyu Harmony stilinde biçimlendirip belirteçliyor, modelden geçiriyor ve metne geri çözümlüyoruz:

question = dataset[0]["Open-ended Verifiable Question"]

text = render_inference_harmony(question)

inputs = tokenizer(
    [text + tokenizer.eos_token], return_tensors="pt"
).to("cuda")
outputs = model.generate(
    input_ids=inputs.input_ids,
    attention_mask=inputs.attention_mask,
    max_new_tokens=20,
    eos_token_id=tokenizer.eos_token_id,
    use_cache=True,
)
response = tokenizer.batch_decode(outputs)
print(response[0])

İnce ayarlı model artık kısa ve doğru bir yanıt üretiyor. Bu, gerçek etikete (“Gastric ulcer”) çok daha yakın ve ≤5 kelime kısıtını takip ediyor.

<|start|>developer<|message|># Instructions

You are a medical expert with advanced knowledge in clinical reasoning and diagnostics. Respond with ONLY the final diagnosis/cause in ≤5 words.<|end|><|start|>user<|message|>An 88-year-old woman with osteoarthritis is experiencing mild epigastric discomfort and has vomited material resembling coffee grounds multiple times. Considering her use of naproxen, what is the most likely cause of her gastrointestinal blood loss?<|end|><|start|>assistant<|return|><|message|>Stomach ulcer<|end|><|return|>

Tutarlılığı doğrulamak için başka bir örneği de test edebiliriz:

question = dataset[10]["Open-ended Verifiable Question"]

text = render_inference_harmony(question)

inputs = tokenizer(
    [text + tokenizer.eos_token], return_tensors="pt"
).to("cuda")
outputs = model.generate(
    input_ids=inputs.input_ids,
    attention_mask=inputs.attention_mask,
    max_new_tokens=20,
    eos_token_id=tokenizer.eos_token_id,
    use_cache=True,
)
response = tokenizer.batch_decode(outputs)
print(response[0])

Harika. İnce ayarlı model kısa, doğru ve talimatlara uygun yanıtlar üretti.

<|start|>developer<|message|># Instructions

You are a medical expert with advanced knowledge in clinical reasoning and diagnostics. Respond with ONLY the final diagnosis/cause in ≤5 words.<|end|><|start|>user<|message|>What substance is primarily filtered in the renal tubules with minimal secretion or re-absorption?<|end|><|start|>assistant<|return|><|message|>creatinine<|end|><|return|>

Sonuç

Açık kaynak yapay zekâ topluluğu için heyecan verici zamanlar. Yeni GPT-OSS modelleri henüz en üst sıralarda yer almasa da, özellikle kendi parametre sınıflarında küçük modellerin bile etkileyici sonuçlar sunabildiği güçlü bir potansiyel gösteriyorlar.

Bu eğitimde, LoRA adaptörleri ve Harmony istem stiliyle tıbbi soru-cevap için GPT-OSS 20B modelini ince ayarladık. Sonuçlar umut verici: ince ayarlı model, klinik akıl yürütme görevleriyle uyumlu, kısa ve doğru yanıtlar üretiyor. Daha fazla eğitim döngüsü, daha büyük veri kümeleri ve iyileştirilmiş sistem istemleriyle performans daha da artırılabilir.

İnce ayara alışmak için uygulamalı bir kurs arıyorsanız, Llama 3 ile İnce Ayar kursuna göz atmayı unutmayın.

Abid Ali Awan

Yazar

Abid Ali Awan

Sertifikalı bir veri bilimcisi olarak, yenilikçi makine öğrenimi uygulamaları oluşturmak için en son teknolojileri kullanmaya büyük ilgi duyuyorum. Konuşma tanıma, veri analizi ve raporlama, MLOps, konuşma yapay zekası ve NLP alanlarında güçlü bir geçmişe sahip olarak, gerçek bir etki yaratabilecek akıllı sistemler geliştirme becerilerimi geliştirdim. Teknik uzmanlığımın yanı sıra, karmaşık kavramları açık ve özlü bir dille ifade etme yeteneğine sahip, becerikli bir iletişimciyim. Sonuç olarak, veri bilimi konusunda aranan bir blog yazarı oldum ve giderek büyüyen veri profesyonelleri topluluğuyla görüşlerimi ve deneyimlerimi paylaşıyorum. Şu anda, içerik oluşturma ve düzenlemeye odaklanıyorum. Büyük dil modelleriyle çalışarak, hem işletmelerin hem de bireylerin verilerinden en iyi şekilde yararlanmalarına yardımcı olabilecek güçlü ve ilgi çekici içerikler geliştiriyorum.

Konular

İlgili