# Model testleri yazma

Transformers test paketi, minimal koddan 100'den fazla testi otomatik olarak oluşturmak için mixin tabanlı bir mimari kullanır. Modelle ilgili küçük miktarda kod yazar, save/load, generation, pipelines, training ve tensor parallelism işlemlerini ise mixin'ler üstlenir.

Modelinizin testlerini aşağıdaki komutlarla çalıştırın.

```bash
# run your model's tests
pytest tests/models/mymodel/test_modeling_mymodel.py -v

# run a specific test
pytest tests/models/mymodel/test_modeling_mymodel.py::MyModelTest::test_model

# run tests matching a keyword pattern (useful to run all integration tests)
pytest tests/models/mymodel/ -k integration -v

# include slow integration tests
RUN_SLOW=1 pytest tests/models/mymodel/ -v
```

Hugging Face CI, her pull request'te `@slow` olmadan model testlerini çalıştırır ve yavaş testler günlük bir zamanlamayla çalıştırılır (CI'ın neyi doğruladığı hakkında bkz. [Pull request kontrolleri](./pr_checks)).

## Bir temel test sınıfı seçin

Üç temel sınıf, en yaygın model ailelerini kapsar. Modelinizin modalitesine uygun olanı seçin.

| Temel sınıf | Kullanım alanı | Mixin'ler |
|---|---|---|
| `CausalLMModelTest` | Nedensel dil modelleri | `ModelTesterMixin`, `GenerationTesterMixin`, `PipelineTesterMixin`, `TrainingTesterMixin`, `TensorParallelTesterMixin` |
| `VLMModelTest` | Görüntü-dil modelleri | `ModelTesterMixin`, `GenerationTesterMixin`, `PipelineTesterMixin` |
| `ALMModelTest` | Ses-dil modelleri | `ModelTesterMixin`, `GenerationTesterMixin`, `PipelineTesterMixin` |

`VLMModelTest` ve `ALMModelTest`, alt yapılandırmaları bileşik üst düzey bir yapılandırmaya yerleştiren ve ham modallite özelliklerinin (ses veya görüntü) yanında `input_ids` içinde modallite yer tutucu belirteçlerini konumlandıran ortak bir `MultiModalModelTest` üst sınıfını paylaşır. `CausalLMModelTest` çok modallı üst sınıfı kullanmaz. Üç ortak karışım sınıfının üzerine inşa edilir ve eğitim ile tensör paralelliği kapsamı için `TrainingTesterMixin` ve `TensorParallelTesterMixin` ekler.

Üçünden (yalnızca kodlayıcı, kodlayıcı-çözücü vb.) hiçbirine uymayan mimariler için, aşağıda açıklanan [iki sınıflı desen](#modeltester-and-modeltest) ve [test karışımlarını](#test-mixins) kullanarak test altyapısını doğrudan oluşturun.

## CausalLMModelTest

`CausalLMModelTest`, nedensel dil modellerini test etmek için önerilen temel sınıftır. Beş [test karışımından](#test-mixins) (mixin) devralır ve kaydet/yükleme, üretim, boru hatları, eğitim ve gergilik paralelliği (tensor parallelism) için testleri otomatik olarak oluşturur.

```py
import unittest

from transformers.testing_utils import require_torch
from transformers import is_torch_available

from ...causal_lm_tester import CausalLMModelTest, CausalLMModelTester

if is_torch_available():
    from transformers import MyModel

class MyModelTester(CausalLMModelTester):
    if is_torch_available():
        base_model_class = MyModel

@require_torch
class MyModelTest(CausalLMModelTest, unittest.TestCase):
    model_tester_class = MyModelTester
```

Bu iki sınıf, `MyModel` ve tüm başlık sınıfları (`MyModelForCausalLM`, `MyModelForSequenceClassification` vb.) için tam test kapsamı sağlar. Gerçek bir örnek için [tests/models/llama/test_modeling_llama.py](https://github.com/huggingface/transformers/blob/main/tests/models/llama/test_modeling_llama.py) dosyasına bakın.

`CausalLMModelTester` yalnızca `base_model_class` parametresini gerektirir. Tester, `Model` son ekini kaldırarak bir taban ad alır (`LlamaModel` `Llama` olur), ardından ilgili sınıfları bulmak için `Config` veya `ForCausalLM` gibi son ekleri ekler. Bir sınıf modülde mevcut değilse, ilgili öznitelik `None` olarak kalır ve tester ilgili testleri atlar.

### CausalLMTester'de varsayılanların geçersiz kılınması

Modeliniz standart adlandırma kurallarına uymuyorsa veya davranışı özelleştirmeniz gerekiyorsa, tester veya test sınıfındaki öznitelikleri geçersiz kılın.

```py
class MyModelTester(CausalLMModelTester):
    if is_torch_available():
        base_model_class = MyModel
        # override if the class name doesn't follow the convention
        causal_lm_class = MyCustomCausalLM

@require_torch
class MyModelTest(CausalLMModelTest, unittest.TestCase):
    model_tester_class = MyModelTester
    # disable embedding resize tests
    test_resize_embeddings = False
```

Tester'de özel constructor parametreleri gerektiren modeller için `__init__` metodunu geçersiz kılın ve ek öznitelikleri ayarlamadan önce `super().__init__(parent=parent)` çağrısını yapın. Gerçek bir örnek için [tests/models/youtu/test_modeling_youtu.py](https://github.com/huggingface/transformers/blob/main/tests/models/youtu/test_modeling_youtu.py) dosyasına bakın.

```py
class YoutuModelTester(CausalLMModelTester):
    if is_torch_available():
        base_model_class = YoutuModel

    def __init__(self, parent, kv_lora_rank=16, q_lora_rank=32):
        super().__init__(parent=parent)
        self.kv_lora_rank = kv_lora_rank
        self.q_lora_rank = q_lora_rank
```

## VLMModelTest

`VLMModelTest`, görme-dil modelleri için temel sınıftır. Üç karışım sınıfından (`ModelTesterMixin`, `GenerationTesterMixin`, `PipelineTesterMixin`) devralır ve birden fazla alt modeli işlemek için `_is_composite = True` değerini ayarlar.

```py
import unittest

from transformers.testing_utils import require_torch
from transformers import is_torch_available

from ...vlm_tester import VLMModelTest, VLMModelTester

if is_torch_available():
    from transformers import (
        MyVLMConfig,
        MyVLMModel,
        MyVLMTextConfig,
        MyVLMVisionConfig,
        MyVLMForConditionalGeneration,
    )

class MyVLMTester(VLMModelTester):
    if is_torch_available():
        base_model_class = MyVLMModel
        config_class = MyVLMConfig
        text_config_class = MyVLMTextConfig
        vision_config_class = MyVLMVisionConfig
        conditional_generation_class = MyVLMForConditionalGeneration

@require_torch
class MyVLMTest(VLMModelTest, unittest.TestCase):
    model_tester_class = MyVLMTester
```

### VLMModelTester'de varsayılanların geçersiz kılınması

VLM özel görme parametreleri veya varsayılan olmayan yapılandırma değerleri gerektirdiğinde `__init__` metodunu geçersiz kılın. `super().__init__(parent, **kwargs)` çağrısından önce `setdefault` ile varsayılanları ayarlayın. Aşağıdaki örnek, [tests/models/qianfan_ocr/test_modeling_qianfan_ocr.py](https://github.com/huggingface/transformers/blob/main/tests/models/qianfan_ocr/test_modeling_qianfan_ocr.py) dosyasındaki ilk birkaç varsayılan değeri göstermektedir.

```py
class QianfanOCRVisionText2TextModelTester(VLMModelTester):
    base_model_class = QianfanOCRModel
    config_class = QianfanOCRConfig
    text_config_class = Qwen3Config
    vision_config_class = QianfanOCRVisionConfig
    conditional_generation_class = QianfanOCRForConditionalGeneration

    def __init__(self, parent, **kwargs):
        kwargs.setdefault("image_token_id", 1)
        kwargs.setdefault("image_size", 32)
        kwargs.setdefault("patch_size", 4)
        kwargs.setdefault("num_channels", 3)
        # ... more defaults
        super().__init__(parent, **kwargs)
```

VLM testleri, `CausalLMModelTest`'ten birkaç açıdan farklıdır.

- Test edicide `config_class`, `text_config_class`, `vision_config_class` ve `conditional_generation_class` değerlerini belirlemelisiniz.
- `VLMModelTest`, `TrainingTesterMixin` veya `TensorParallelTesterMixin` içermez.
- Testçinin `__init__` metodu, `**kwargs` ve `setdefault()` üzerinden görüntü parametrelerini (`image_size`, `patch_size`, `num_channels`, `num_image_tokens`) kabul eder.
- `ConfigTester`, üst düzey yapılandırmanın bir metin modeli yapılandırması değil, bileşik bir yapılandırma olması nedeniyle `has_text_modality=False` kullanır.

## ALMModelTest

`ALMModelTest`, Qwen2Audio, AudioFlamingo3 ve GraniteSpeech gibi ses-dil modellerinin (ALM) temel sınıfıdır. `MultiModalModelTest` ebeveyn sınıfını ve head sınıflarının otomatik keşfini içeren VLM desenini yansıtır. Görüntü tarafındaki mekanizma, ses özellikleri, bir ses alt yapılandırması ve bir ses-jetonu yerleştirme stratejisi ile değiştirilmiştir.

```py
class MyALMTester(ALMModelTester):
    config_class = MyALMConfig
    text_config_class = MyALMTextConfig
    audio_config_class = MyALMAudioConfig
    conditional_generation_class = MyALMForConditionalGeneration
    audio_mask_key = "feature_attention_mask"

class MyALMTest(ALMModelTest, unittest.TestCase):
    model_tester_class = MyALMTester
```

### ALMModelTester'de varsayılan değerlerin geçersiz kılınması

Testçinin `__init__` metodu, ALM'ye özgü varsayılan değerleri (`feat_seq_length=128`, `num_mel_bins=80`, `audio_token_id=0`) ayarlar. `super().__init__(parent, **kwargs)` çağrısından önce bunları `setdefault` ile geçersiz kılın.

İki sınıf özelliği, testçinin modelinizin nesneleri nasıl adlandırdığını bilmesini sağlar.

- `audio_mask_key`: modelinizin ses maskesi için beklediği kwarg adı (`"feature_attention_mask"`, `"input_features_mask"` vb.). Modeliniz ayrı bir ses maskesi kullanmıyorsa `None` olarak bırakın.
- `audio_config_key`: üst düzey yapılandırmanızın ses alt yapılandırmasını iç içe geçirmek için kullandığı öznitelik adı. Varsayılan olarak `"audio_config"` kullanılır ancak GraniteSpeech gibi modeller `"encoder_config"` kullanır.

```py
class Qwen2AudioModelTester(ALMModelTester):
    def __init__(self, parent, **kwargs):
        kwargs.setdefault("feat_seq_length", 60)
        kwargs.setdefault("max_source_positions", kwargs["feat_seq_length"] // 2)
        super().__init__(parent, **kwargs)
```

`ALMModelTester`, `get_audio_embeds_mask(audio_mask)` adlı tek bir hook'un yeniden tanımlanmasını gerektirir ve özelleştirme için birkaç ek isteğe bağlı hook sunar.

- `get_audio_embeds_mask(audio_mask)`: kodlayıcının indirgeme işleminden sonra ses gömme konumlarının parti başına maskesini döndürür. Testçi, `input_ids` içine kaç adet `audio_token_id` yer tutucusu ekleyeceğine karar vermek için satır bazlı toplamını kullanır; bu nedenle sayı, kodlayıcınızın ürettiği değerle eşleşmelidir.
- `create_audio_features()`: ses özellik tensörünü döndürür. Varsayılan şekil `[batch_size, num_mel_bins, feat_seq_length]`'dir. Modeliniz, GraniteSpeech gibi, zaman-öncelikli özellikler (`[batch_size, feat_seq_length, num_mel_bins]`) bekliyorsa bu yöntemi geçersiz kılın.
- `create_audio_mask()`: ses düzeyi dikkat maskesini döndürür. Varsayılan davranış, batch içindeki her satır için rastgele, ardışık geçerli bir bölge oluşturur. Testleriniz iki `prepare_config_and_inputs_for_common()` çağrısını birbirine karşılaştırıyorsa veya ses kodlayıcınız null olmayan maskeleri reddeden bir arka uca yönlendiriliyorsa, deterministik bir tam uzunluklu maske ile geçersiz kılın.
- `place_audio_tokens(input_ids, config, num_audio_tokens)`: ses yer tutucu jetonlarını `BOS` sonrasında ardışık olarak yerleştirir. Modeliniz farklı bir yerleşim gerektiriyorsa yalnızca bu durumu geçersiz kılın.
- `get_audio_feature_key()`: ses özellikleri için girdi sözlüğü anahtarını döndürür (varsayılan olarak `"input_features"`).

Miras alınan çok modlu testlerin yanı sıra, `ALMModelTest` `test_mismatching_num_audio_tokens` testini ekler. Bu test, `input_ids` içindeki ses yer tutucu jetonlarının sayısı ile ses özelliklerinin sayısı eşleşmediğinde modelin açık bir `ValueError` fırlattığını doğrular ve birden fazla ses segmenti içeren bir istemin yine de başarıyla iletildiğini kontrol eder.

## Diğer mimariler için testler yazın

Sadece kodlayıcı, kodlayıcı-çözücü, ses veya diğer standart dışı mimariler için, aşağıda açıklanan iki sınıflı desen ve test karışımlarından (test mixins) doğrudan test altyapısını oluşturun.

### ModelTester ve ModelTest

Her model test dosyası aynı yapıyı izler.

1. `ModelTester` (sadece bir sınıf), testler için küçük yapılandırmalar ve sahte girdiler oluşturur ve modele özgü küçük regresyon testlerini de barındırabilir.
2. `ModelTest` (`unittest.TestCase` + karışımlar), otomatik olarak oluşturulan testleri devralır ve bunları her model varyantına karşı çalıştırır.

`ModelTest`, test edici üzerinde `prepare_config_and_inputs_for_common()` çağırarak `(config, inputs_dict)` demeti alır. Tüm karışımlar, test verileri için `prepare_config_and_inputs_for_common()` işlevine dayanır.

### Test karışımları

Modelinizin ihtiyaç duyduğu karışım sınıflarını seçin.

| Karışım | Kaynak dosya | Ne test eder |
|---|---|---|
| `ModelTesterMixin` | `tests/test_modeling_common.py` | Kaydet/yükle, gradyan denetleme noktası, ileri imzası, ortak öznitelikler |
| `GenerationTesterMixin` | `tests/generation/test_utils.py` | Açgözlü, örneklemeli, demet aramalı, destekli çözümleme |
| `PipelineTesterMixin` | `tests/test_pipeline_mixin.py` | Her pipeline görevi için bir test |
| `TrainingTesterMixin` | `tests/test_training_mixin.py` | Küçük bir partide aşırı uyum |
| `TensorParallelTesterMixin` | `tests/test_tensor_parallel_mixin.py` | Dağıtık tensör paralelliği |

### Bir model testi yazma

Tamamen çalışan bir örnek için [tests/models/modernbert/test_modeling_modernbert.py](https://github.com/huggingface/transformers/blob/main/tests/models/modernbert/test_modeling_modernbert.py) dosyasına bakın. Ana adımlar aşağıda özetlenmiştir.

1. `ModelTester` sınıfı küçük yapılandırmalar ve sahte girdiler oluşturur. Testlerin CPU üzerinde saniyeler içinde tamamlanması için boyutları küçük tutun. Girdileri oluşturmak için aşağıdaki üç tensör yardımcısını kullanın.

    - `ids_tensor(shape, vocab_size)`: `[0, vocab_size)` aralığında rastgele tamsayı tensörü. `input_ids`, `token_type_ids` ve etiket tensörleri için kullanılır.
    - `random_attention_mask(shape)`: İlk token her zaman 1 olan ikili tensör (0 ve 1). `attention_mask` için kullanılır.
    - `floats_tensor(shape, scale=1.0)`: Rastgele float tensörü. `pixel_values` veya `inputs_embeds` gibi sürekli girdiler için kullanılır.

    Test edici, `get_config()`, `prepare_config_and_inputs()` ve `prepare_config_and_inputs_for_common()` yöntemlerini uygulamalıdır. Her görev başı (temel model, dizi sınıflandırma, token sınıflandırma vb.) için `create_and_check_*` yöntemleri ekleyin.

2. Modelinizin ihtiyaç duyduğu karışımlardan (mixins) devralın, `all_model_classes` ve `pipeline_model_mapping` değerlerini belirleyin ve `setUp()` fonksiyonunu tanımlayın. Testçinin `create_and_check_*` yöntemlerine devreden `test_*` yöntemleri yazın.

3. Her görev başı için, modelin örneklenmesini, ileri geçişin çalıştırılmasını ve çıktı şekillerinin doğrulanmasını sağlayan bir `create_and_check_*` metodu test ediciye ekleyin. Ardından test sınıfına karşılık gelen bir `test_*` metodu ekleyin.

### Dosya düzeni

Test dosyaları, aşağıda gösterilen yapıya uygun olarak `tests/models/mymodel/` içinde yer alır.

```text
tests/models/mymodel/
├── __init__.py
├── test_modeling_mymodel.py            # model tests (required)
├── test_tokenization_mymodel.py        # tokenizer tests (if custom tokenizer)
├── test_image_processing_mymodel.py    # image processor tests (if vision model)
├── test_feature_extraction_mymodel.py  # feature extractor tests (if audio/speech model)
└── test_processing_mymodel.py          # processor tests (if multimodal)
```

Tokenizer testleri aynı deseni izler. `tests/test_tokenization_common.py` dosyasından `TokenizerTesterMixin` sınıfını devralın, birkaç özniteliği ayarlayın ve otomatik oluşturulan testleri alın. Örnek için [tests/models/llama/test_tokenization_llama.py](https://github.com/huggingface/transformers/blob/main/tests/models/llama/test_tokenization_llama.py) dosyasına bakın.

## Yapılandırma testleri

`ConfigTester`, bir config sınıfının seri hale getirme, kaydetme/yükleme ve standart özellikleri doğru şekilde işlediğini doğrular. `CausalLMModelTest` ve `VLMModelTest`, config testlerini otomatik olarak içerir. `ModelTester` ve `ModelTest` ile genel yol için config tester'ı `setUp()` içinde manuel olarak tanımlayın.

```py
from tests.test_configuration_common import ConfigTester

def setUp(self):
    self.config_tester = ConfigTester(self, config_class=MyModelConfig, hidden_size=32)

def test_config(self):
    self.config_tester.run_common_tests()
```

`run_common_tests()` birkaç kontrol çalıştırır.

- `hidden_size`, `num_attention_heads` ve `num_hidden_layers` gibi ortak özelliklerin (`has_text_modality=True` ise `vocab_size` dahil) mevcut olduğunu kontrol eder.
- JSON seri­leştirmesini `to_json_string()` ve `to_json_file()` ile test eder.
- `save_pretrained()` ve `from_pretrained()` işlemlerini gidip-geliş (round-trip) olarak test eder.
- `id2label` ve `label2id` tutarlılığını doğrular.
- Varsayılan başlatmayı doğrulamak için hiçbir argüman olmadan bir config oluşturur.
- `output_hidden_states` gibi ortak anahtar kelime-argümanlarını ayarlar ve bunların doğru şekilde saklandığını doğrular.

`vocab_size` içermeyen yalnızca görme modelleri için `has_text_modality=False` parametresini iletin ve yapılandırma varsayılanlarını geçersiz kılmak için ek `**kwargs` gönderin.

```py
self.config_tester = ConfigTester(
    self, config_class=MyVisionConfig, has_text_modality=False, hidden_size=64
)
```

## Entegrasyon testleri ve küçük modeller

Mixin testleri, model davranışını hızlı bir şekilde doğrulamak için rastgele ağırlıklara sahip küçük yapılandırmalar kullanır. Entegrasyon testleri, çıktı doğruluğunu doğrulamak için gerçek önceden eğitilmiş ağırlıklarla çıkarım (inference) çalıştırır. Hub'daki küçük modeller, hızlı CI için yeterince küçüktür ancak gerçek kontrol noktaları gibi yapılandırılmıştır.

### Entegrasyon testleri yazma

Entegrasyon testlerini ayrı bir test sınıfında konumlandırın, `@slow` ile işaretleyin ve `MemoryCleanupMixin` karışımını ekleyin. Her test gerçek ağırlıkları indirir, çıkarım çalıştırır ve çıktıları beklenen değerlerle karşılaştırır. Karışım, her testin kullandığı belleği serbest bırakır ve test yöntemlerini `torch.no_grad()` altında çalıştırır — ne yaptığını ve nasıl devre dışı bırakılacağını görmek için [Testler arası bellek serbest bırakma](#releasing-memory-between-tests) bölümüne bakın.

```py
import torch
from transformers import AutoTokenizer
from transformers.testing_utils import MemoryCleanupMixin, require_torch, slow, torch_device

class MyModelIntegrationTest(MemoryCleanupMixin, unittest.TestCase):
    @slow
    @require_torch
    def test_inference(self):
        model = MyModelForCausalLM.from_pretrained("myorg/mymodel-base").to(torch_device)
        tokenizer = AutoTokenizer.from_pretrained("myorg/mymodel-base")
        inputs = tokenizer("Hello, world", return_tensors="pt").to(torch_device)

        outputs = model(**inputs)

        # check against expected values
        expected_slice = torch.tensor([[-0.1234, 0.5678, -0.9012]])
        torch.testing.assert_close(outputs.logits[0, :1, :3], expected_slice, atol=1e-4, rtol=1e-4)
```

Ağırlık indiren, büyük bir veri seti yükleyen veya birkaç saniyeden fazla süren herhangi bir testi `@slow` ile işaretleyin. [pull request CI](./pr_checks) yavaş testleri atlar, ancak günlük planlama bunları çalıştırır.

#### Testler arasında bellek serbest bırakma

Entegrasyon testleri gerçek checkpoint’leri yüklediğinden, modeline bir referans tutan bir test, ondan sonra çalışan her şeyi OOM’a sokabilir. `tests/test_memory_cleanup_mixin.py` içindeki `MemoryCleanupMixin`, bunu tüm sınıf için ele alır:

- Her testten önce ve sonra artıkların taşınmaması için `cleanup(torch_device, gc_collect=True)` çalıştırır.
- Testin `self` üzerinde (dahil `@cached_property` önbellekleri) ve sınıf üzerinde (örneğin `setUpClass` içindeki `cls.model = ...`) eklediği öznitelikleri siler. Pytest, test örneklerini oturum boyunca canlı tuttuğu için, bu referansların hâlâ tuttuğu nesneleri `gc.collect()` serbest bırakamaz.
- İleri geçişin aktivasyonları tutmaması için test yöntemlerini `torch.no_grad()` altında çalıştırır.

`backward()` fonksiyonunu eğiten veya çağıran sınıflar `run_under_no_grad = False` değerini ayarlar. Her ikisini de kullanan bir sınıf, bunun yerine `@with_grad` veya `@with_no_grad` etiketlerini bireysel test yöntemlerine yerleştirir.

Sınıf gövdesinde atanan öznitelikler korunur, sonradan eklenen her şey ise düşürülür. `setUp` metodunu geçersiz kılıyorsanız, `super().setUp()` çağrısını yapın: mixin, özniteliklerin anlık görüntüsünü orada alır ve bu çağrı yapılmadığında hata verir.

> [!TIP]
> `MemoryCleanupTestCase`, otomatik olarak kaldırılan geçici dizinlere de sahip olmak isteyen testler için mixin'i `TestCasePlus` ile birleştirir.

Sızan bir testi bulmak için `TRANSFORMERS_TEST_MEMORY_LEAK_MIB` değerini MiB cinsinden bir bütçeye ayarlayın; cihazda bu miktardan fazlasını tahsis etmiş olarak bırakan her test, tepe kullanım değeriyle birlikte raporlanır. Uyarı vermek yerine hatayla sonuçlanmasını istiyorsanız `TRANSFORMERS_TEST_MEMORY_LEAK_MODE=error` ekleyin. Bu kontrol varsayılan olarak kapalıdır ve artıkları ararken açmanız gerekir. Mixin'in standart söküm işlemi zaten `gc.collect` çalıştırır; bu da bir sızıntıyı yeniden üretirken incelemek istediğiniz tahsisi temizleyebilir.

#### Üretim entegrasyon testleri

Üretim testlerinde çıktıların çalıştırmalar ve donanımlar arasında deterministik olmasını sağlamak için `do_sample=False` kullanın. Mixture-of-Experts modelleri için, kararlı bir uzman yönlendirme yolunu zorlamak üzere üretimden önce `model.set_experts_implementation("eager")` çağrısını da yapın. Bu yapılmazsa, yönlendiricideki küçük sayısal farklar, bir token'ı hangi uzmanın işleyeceğini değiştirebilir ve çıktıyı etkileyebilir.

```py
@slow
@require_torch
def test_generate(self):
    model = MyModelForCausalLM.from_pretrained("myorg/mymodel-base").to(torch_device)
    tokenizer = AutoTokenizer.from_pretrained("myorg/mymodel-base")
    inputs = tokenizer("Hello, world", return_tensors="pt").to(torch_device)

    # model.set_experts_implementation("eager")  # uncomment for MoE models
    generated_ids = model.generate(**inputs, max_new_tokens=20, do_sample=False)
    output = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)
    self.assertEqual(output, ["Hello, world! This is the expected continuation..."])
```

#### Donanım özelinde beklentiler

Transformers CI, yavaş testleri bir NVIDIA A10 üzerinde çalıştırır. Sayısal sonuçlar GPU nesilleri arasında hafif farklılıklar gösterebilir; bu nedenle entegrasyon testleri, cihaz başına beklenen değerleri kaydetmek için [Expectations](https://github.com/huggingface/transformers/blob/main/src/transformers/testing_utils.py#L3247) sınıfını kullanır. `Expectations`, `(device_type, (major, minor))` SM anahtarlarına göre mevcut donanım için en iyi eşleşmeyi seçer ve hiçbir eşleşme bulunamazsa varsayılana geri döner.

Yerel SM sürümünüzü (ör. A10 için `(8, 6)`, H100 için `(9, 0)`) yazdırmak için `torch.cuda.get_device_capability()` çalıştırın.

```py
from transformers.testing_utils import Expectations

expected_texts = Expectations(
    {
        ("cuda", (8, 6)): ["Hello, world! This is the A10 continuation..."],
        ("cuda", (9, 0)): ["Hello, world! This is the H100 continuation..."],
    }
).get_expectation()

self.assertEqual(output, expected_texts)
```

### Küçük modeller oluşturma

Rastgele ağırlıklı küçük modeller, Hub üzerinde [hf-internal-testing](https://huggingface.co/hf-internal-testing) kuruluşu altında barındırılır. Pipeline testleri, Hub'da barındırılan bir checkpoint'e ihtiyaç duydukları ancak çıktı kalitesine önem vermedikleri durumlarda küçük modellere başvurur. Hızlı duman testleri de büyük checkpoint'leri indirmeden ileri geçiş şekillerini doğrulamak için küçük modelleri yükler.

Tiny modeller, entegrasyon testleri için son çaredir. Sadece en küçük mevcut checkpoint ~24 GB VRAM'i aşıyorsa bunları kullanın. Gerçek sayısal regresyonları yakalayabilmek için mümkün olduğunda orijinal önceden eğitilmiş ağırlıkları kullanın.

`utils/create_dummy_models.py` betiği, `ModelTester.get_config()` üzerinden küçük modeller oluşturur. Betik, testçinizden küçük hiperparametreleri çıkarır, rastgele ağırlıklarla bir model oluşturur ve sonucu Hub'a yükler.

Yerel olarak küçük modeller oluşturun.

```bash
python utils/create_dummy_models.py output_dir -m your_model_type
```

Bunları Hub'a yükleyin.

```bash
python utils/create_dummy_models.py output_dir -m your_model_type --upload --organization hf-internal-testing
```

Her model `hf-internal-testing/tiny-random-{ModelClassName}` adını kullanır ve `tests/utils/tiny_model_summary.json` dosyasında kaydedilir. Bir CI iş akışı (`.github/workflows/check_tiny_models.yml`) küçük modelleri her gün yeniden oluşturur.

## Test edilecek içeriği kontrol edin

`ModelTesterMixin` üzerindeki Boolean bayrakları, otomatik oluşturulan testleri açar veya kapatır. Belirli denetimleri etkinleştirmek veya devre dışı bırakmak için test sınıfınızda herhangi bir bayrağı geçersiz kılın.

```py
class MyModelTest(CausalLMModelTest, unittest.TestCase):
    model_tester_class = MyModelTester
    test_resize_embeddings = False
    test_all_params_have_gradient = False  # when not all parameters are activated in every forward pass
```

| Bayrak | Varsayılan | Ne kontrol eder |
|---|---|---|
| `test_resize_embeddings` | `True` | Gömme katmanı yeniden boyutlandırma |
| `test_resize_position_embeddings` | `False` | Konum gömme yeniden boyutlandırma |
| `test_mismatched_shapes` | `True` | Eşleşmeyen giriş/çıkış şekli işleme |
| `test_missing_keys` | `True` | Yükleme sırasında eksik anahtar uyarıları |
| `test_torch_exportable` | `True` | `torch.export` uyumluluğu |
| `test_all_params_have_gradient` | `True` | Tüm parametreler gradyan alır (MoE uzmanları gibi her ileri geçişte tüm parametrelerin etkinleştirilmediği durumlarda `False` olarak ayarlayın) |
| `is_encoder_decoder` | `False` | Encoder-decoder'a özgü testler |
| `has_attentions` | `True` | Dikkat çıktısı testleri |
| `_is_composite` | `False` | Bileşik/çok modlu model işleme |
| `model_split_percents` | `[0.5, 0.7, 0.9]` | Model paralelliği testleri için bölme yüzdeleri |

## Sonraki adımlar

- Test seçimi, fixture'lar, günlük tutma ve daha fazlası hakkında daha fazla bilgi için [pytest](https://docs.pytest.org/en/latest/getting-started.html) belgelerine göz atın.

