Transformers documentation
Modüler dönüştürücülerle bir model ekleyin
Modüler dönüştürücülerle bir model ekleyin
Modular transformers, tek model, tek dosya politikasının aksine, içe aktarma ve kalıtım imkânı sağlayarak bir model eklemek için gereken kodu azaltır. Model bileşenlerini dosyalar arasında tekrarlamak yerine, model klasörünüze bir modüler dosya ekleyin ve mevcut sınıflardan kalıtım alın.
Dönüştürücü, modüler dosyadan bağımsız dosyalar üretir. Kullanıcılar, zaten bildikleri tek dosyalı arayüzün aynısını alır.
Modular transformers, eski modelleme kodunun yerini almak için tasarlanmamıştır. Modeliniz mevcut bir modele dayanmıyorsa,
modeling.pydosyasını manuel olarak ekleyin. Benzer bir dosyadan temiz bir şekilde devralınamayan yapılandırma, tokenizasyon veya işleme dosyaları için de aynı durum geçerlidir.Tek bir doğru sıra da yoktur. Bazı katkıda bulunanlar önce modüler dosyayı yazar ve ondan üretir. Diğerleri elle yazılmış bir
modeling.pyile başlar ve onu daha sonra modüler dosyaya dönüştürür. Her iki yaklaşım da işe yarar.
Modüler bir dosya uygulama
Önce Transformers'ta sizin modelinize benzer bir model bulun. İyi başlangıç noktaları Mistral, Qwen2, Cohere ve Cohere2 ile Llama'dır. Aşağıdaki tablo, ortak bileşenleri devralabileceğiniz modellere eşler.
| Bileşen | Model |
|---|---|
| Uzmanlar karışımı | Mixtral veya Qwen2-MoE |
| Aralı (ve/veya kısmi) döner gömme | GLM, Phi |
| Durum uzayı modelleri | Jamba, Bamba, Zamba, Mamba2 |
| Yinelenen gizli durumlar | Gemma2 |
| Katman başına kayan pencere dikkati/tam dikkat deseni | Gemma2, Cohere2 |
| QKV kırpma | Olmo |
| QK normalizasyonu | Olmo2, Cohere |
| Birleştirilmiş QKV (önerilmez) | Phi3 |
Mevcut ve devralınabilecek uygulamaları bulmak için modular-detector-v2 aracını kullanın. Bir kod parçasını yapıştırın; araç, Transformers içindeki en benzer yöntemleri döndürür, böylece kod yazmaya başlamadan önce en uygun üst sınıfı belirleyebilirsiniz.
Miras almayı yeni modeliniz için çalışır hale getirmek amacıyla mevcut bir modeli değiştirmeyin. Bir üst sınıfı yeniden adlandırmak veya alt sınıf oluşturmak çok zahmetliyse, ilgili kodu doğrudan kopyalayın.
src/transformers/models/<name>/modular_<name>.py dosyasını oluşturun; burada <name>, snake_case model dizin adıyla eşleşir. Bu bölümde, Olmo modelinden Olmo2 modelini modüler yaklaşımla nasıl uygulayacağınızı adım adım ele alıyoruz (orijinal modular_olmo2.py dosyasına bakın).
Yapılandırma
Olmo2Config, OlmoConfig'den iki noktada farklılık gösterir.
- Yeni bir argüman var:
rms_norm_eps. clip_qkvargümanı artık kullanılmıyor.
Yeni argümanları, varsayılan bir değere sahip sınıf düzeyi tip açıklamaları olarak tanımlayın. Kaldırılan argümanlar için, üretilen dosyada devralınan özniteliği bastırmak üzere AttributeError() atayın (bkz. Öznitelikleri kaldırma).
- @auto_docstring(checkpoint="allenai/OLMo-7B-hf")
+ @auto_docstring(checkpoint="allenai/Olmo2-7B-1124-hf")
+ @strict
- class OlmoConfig(PreTrainedConfig):
+ class Olmo2Config(OlmoConfig):
...
- model_type = "olmo"
+ model_type = "olmo2"
...
+ rms_norm_eps: float = 1e-5
- clip_qkv: float | None = None
+ clip_qkv = AttributeError()@auto_docstring standart argüman belgelerini otomatik olarak oluşturur (@auto_docstring kılavuzuna bakın). @strict, anında oluşturulma sırasında bilinmeyen kwargs'ları reddeder ve yazım hatalarını ile eski argümanları erken aşamada yakalar. Decorator'lar üst sınıftan devralınmadığı için her config sınıfına her ikisini de ekleyin. Üst config zaten bunlara sahip olsa bile açıkça bildirin.
Türetilmiş bir özniteliği ayarlamak veya geriye dönük uyumluluk mantığını işlemek için __init__ yerine __post_init__ kullanın. Örneğin, Cohere2, başlatma sırasında head_dim değerini hesaplar ve layer_types değerini türetir.
def __post_init__(self, **kwargs):
if self.num_key_value_heads is None:
self.num_key_value_heads = self.num_attention_heads
self.head_dim = self.hidden_size // self.num_attention_heads
super().__post_init__(**kwargs)Tensor veya pipeline paralellik desteği olan modeller için, base_model_tp_plan ve base_model_pp_plan öğelerini config üzerinde sınıf düzeyinde sözlükler olarak tanımlayın. Her iki sözlük de modelin cihazlar arasında nasıl paylaştırılacağını (shard) belirler. Örnekler için Olmo2 veya Cohere2 gibi mevcut config'lere bakın.
class MyNewModelConfig(PreTrainedConfig):
model_type = "my_new_model"
# Tensor parallelism: maps layer name patterns to sharding strategies.
# Use "colwise" / "rowwise" for standard sharding, or the "gather_output" /
# "split_input" variants when an extra op (e.g. a QK norm) prevents fusing.
base_model_tp_plan = {
"layers.*.self_attn.q_proj": "colwise",
"layers.*.self_attn.k_proj": "colwise",
"layers.*.self_attn.v_proj": "colwise",
"layers.*.self_attn.o_proj": "rowwise",
"layers.*.mlp.gate_proj": "colwise",
"layers.*.mlp.up_proj": "colwise",
"layers.*.mlp.down_proj": "rowwise",
}
# Pipeline parallelism: maps submodule names to their (input, output) tensor names.
base_model_pp_plan = {
"embed_tokens": (["input_ids"], ["inputs_embeds"]),
"layers": (["hidden_states", "attention_mask"], ["hidden_states"]),
"norm": (["hidden_states"], ["hidden_states"]),
}Norm
Değişiklik yapmadan bir üst sınıfı kopyalamak için pass ile kalıtım alın. Linter, üst sınıfın içeriğini kopyalar ve yeni modele uyması için tüm referansları yeniden adlandırır.
from ..olmo.modeling_olmo import OlmoRotaryEmbedding
class Olmo2RotaryEmbedding(OlmoRotaryEmbedding):
passBelirli bir davranışı değiştirmek için yalnızca farklı olan kısımları devralıp geçersiz kılın. Olmo2RMSNorm, LlamaRMSNorm'den tek bir satırda farklılık gösterir. Çarpma işlemi, girdi veri türüne geri dönüştürülmeden önce yapılır, sonra değil.
from ..llama.modeling_llama import LlamaRMSNorm
class Olmo2RMSNorm(LlamaRMSNorm):
def forward(self, hidden_states):
input_dtype = hidden_states.dtype
hidden_states = hidden_states.to(torch.float32)
variance = hidden_states.pow(2).mean(-1, keepdim=True)
hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon)
- return self.weight * hidden_states.to(input_dtype)
+ return (self.weight * hidden_states).to(input_dtype)Dikkat
Olmo2’nin dikkati, Olmo’dan yalnızca sorgulara ve anahtarlara RMSNorm uygulaması ve qkv kırpma işlemini kaldırması bakımından farklıdır. super().__init__(...) ebeveyn gövdesini kopyalar ve iki yeni norm satırını ekler. forward, sorguların ve anahtarların projeksiyondan önce normlardan geçmesi nedeniyle tamamen yeniden tanımlanmıştır. Linter, apply_rotary_pos_emb, eager_attention_forward ve bağımlılıkları dahil olmak üzere, içe aktarılan tüm işlevleri de üretilen dosyaya dahil eder.
class Olmo2Attention(OlmoAttention):
def __init__(self, config: Olmo2Config, layer_idx: int | None = None):
super().__init__(config, layer_idx=layer_idx)
+ self.q_norm = Olmo2RMSNorm(config.num_attention_heads * self.head_dim, config.rms_norm_eps)
+ self.k_norm = Olmo2RMSNorm(config.num_key_value_heads * self.head_dim, config.rms_norm_eps)
def forward(self, ...):
...
- query_states = self.q_proj(hidden_states)
- key_states = self.k_proj(hidden_states)
+ query_states = self.q_norm(self.q_proj(hidden_states))
+ key_states = self.k_norm(self.k_proj(hidden_states))
value_states = self.v_proj(hidden_states)
- if self.config.clip_qkv is not None:
- query_states.clamp_(min=-self.config.clip_qkv, max=self.config.clip_qkv)
- key_states.clamp_(min=-self.config.clip_qkv, max=self.config.clip_qkv)
- value_states.clamp_(min=-self.config.clip_qkv, max=self.config.clip_qkv)
-
...DecoderLayer
super().__init__(...) çağrısından sonra, norm özniteliklerini Olmo2RMSNorm örnekleriyle yeniden yazın ve self.self_attn özniteliğini yeni Olmo2Attention sınıfına atayın. del self.input_layernorm ifadesi, Olmo2 normu dikkat işleminden sonra uyguladığı için üst sınıfın input_layernorm atamasını kaldırır. del ifadesinin neyi sildiği ve neyi silmediğine ilişkin ayrıntılar için Öznitelikleri kaldırma bölümüne bakın.
forward, dikkat sonrası norm yerleşimini yansıtacak şekilde yeniden yazılır. Bir forward yeniden yazımı yalnızca bir öznitelik yeniden adlandırıldığında gerekir, yalnızca türü değiştiğinde değil.
class Olmo2DecoderLayer(OlmoDecoderLayer):
def __init__(self, config: Olmo2Config, layer_idx: int):
super().__init__(config, layer_idx=layer_idx)
- self.self_attn = OlmoAttention(config=config, layer_idx=layer_idx)
- self.input_layernorm = OlmoLayerNorm(config.hidden_size)
- self.post_attention_layernorm = OlmoLayerNorm(config.hidden_size)
+ self.self_attn = Olmo2Attention(config=config, layer_idx=layer_idx)
+ del self.input_layernorm
+ self.post_attention_layernorm = Olmo2RMSNorm(config.hidden_size, eps=config.rms_norm_eps)
+ self.post_feedforward_layernorm = Olmo2RMSNorm(config.hidden_size, eps=config.rms_norm_eps)
def forward(self, ...):
residual = hidden_states
- hidden_states = self.input_layernorm(hidden_states)
# Self Attention
hidden_states, _ = self.self_attn(...)
- hidden_states = residual + hidden_states
+ hidden_states = self.post_attention_layernorm(hidden_states)
+ hidden_states = residual + hidden_states
# Fully Connected
residual = hidden_states
- hidden_states = self.post_attention_layernorm(hidden_states)
hidden_states = self.mlp(hidden_states)
- hidden_states = residual + hidden_states
+ hidden_states = self.post_feedforward_layernorm(hidden_states)
+ hidden_states = residual + hidden_states
return hidden_statesModel
Burada yalnızca self.norm'ün türü değişir. forward metodu, üst sınıftakiyle birebir aynıdır; bu nedenle linter onu otomatik olarak devralır.
class Olmo2Model(OlmoModel):
def __init__(self, config: Olmo2Config):
super().__init__(config)
- self.layers = nn.ModuleList(
- [OlmoDecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)]
- )
- self.norm = OlmoLayerNorm(config.hidden_size)
+ self.norm = Olmo2RMSNorm(config.hidden_size, eps=config.rms_norm_eps)
+ self.layers = nn.ModuleList(
+ [Olmo2DecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)]
+ )Model başlığı
Mantık, OlmoForCausalLM ile aynıdır, bu nedenle değişiklik yapılmasına gerek yoktur.
from ..olmo.modeling_olmo import OlmoForCausalLM
class Olmo2ForCausalLM(OlmoForCausalLM):
passDiğer sınıflar
Linter tarafından oluşturulan modeling_olmo2.py, modular_olmo2.py içinde açıkça tanımlanmamış sınıfları da (Olmo2MLP, Olmo2RotaryEmbedding, Olmo2PreTrainedModel) içerir.
Linter, bir sınıfın bağımlı olduğu herhangi bir sınıfı, onu açıkça yeniden tanımlamadığınız sürece dahil eder. apply_rotary_pos_emb gibi içe aktarılan işlevler de aynı kurala tabidir.
Örneğin, OlmoDecoderLayer içinde self.mlp = OlmoMLP(config) bulunur. Olmo2MLP modüler dosyada hiç tanımlanmadığı için linter bunu otomatik olarak oluşturur; bu, pass kullanmakla eşdeğerdir.
from ..olmo.modeling_olmo import OlmoMLP
class Olmo2MLP(OlmoMLP):
passOlmo2MLP'nin farklı bir modelden devralmasını istiyorsanız, bunu açıkça belirtin.
# switch to Mistral definition
from ..mistral.modeling_mistral import MistralMLP
class Olmo2MLP(MistralMLP):
passDosyayı tamamlama
Her modüler dosya, modül düzeyinde bir logger ve bir __all__ listesi bildirmelidir.
logger = logging.get_logger(__name__)
__all__ = [
"Olmo2Config",
"Olmo2ForCausalLM",
"Olmo2Model",
"Olmo2PreTrainedModel",
]__all__, dosyadaki her public sınıfı listelemelidir. Dönüştürücü ve downstream importlar buna bağlıdır. __all__ içinde yer almayan bir sınıf doğru şekilde dışa aktarılmaz.
Modelleme dosyalarını oluşturun
modular_model_converter.py betiği, modüler dosyanızdan bağımsız modeling.py, configuration.py ve diğer dosyaları oluşturur. Miras alınan her sınıf için, üst sınıfın gövdesini alt sınıfa kopyalar, yeni modele uygun olacak şekilde tüm referansları yeniden adlandırır ve bu üst sınıfların bağımlı olduğu yardımcı işlevleri veya sınıfları dahil eder.
Çıktı dosyalarında modeller arası içe aktarma veya diğer model dizinlerinden miras alma bulunmaz. Linter, miras almayı tek seviyeye indirger. Olmo2Attention, OlmoAttention'den miras alıyorsa, oluşturulan Olmo2Attention tamamen kendi içinde kapalıdır. Ancak OlmoAttention kendisi başka bir şeyden miras alıyorsa, linter o büyük ebeveyni satır içine yerleştirmez.
Modüler bir dosyadan dosyaları oluşturmak için aşağıdaki komutu çalıştırın.
python utils/modular_model_converter.py your_model
Oluşturulan dosyaları doğrudan düzenlemeyin; bir sonraki çalıştırmada yapılan tüm değişiklikler üzerine yazılır.
Modüler dosyalar için kalıplar
Aşağıdaki bölümler, modüler bir dosya ile çalışırken öznitelikleri kaldırma veya süslenmiş (decorated) metotları geçersiz kılma gibi yaygın kullanım kalıplarını belgelemektedir.
Öznitelikleri kaldırma
Miras alınan bir özniteliğin kaldırılması, bir yapılandırma sınıfıyla mı yoksa bir nn.Module alt sınıfıyla mı çalıştığınıza bağlıdır.
Bir yapılandırma sınıfı için, sınıf düzeyinde özniteliğe AttributeError() atayın.
class MyNewConfig(ParentConfig):
removed_attr = AttributeError()Linter, üretilen yapılandırma dosyasından öznitelik bildirimini tamamen kaldırır. Yapılandırma sınıfları __init__ içermeyen bir dataclass tarzı düzen kullandığından, sınıf düzeyinde AttributeError() atamak doğru yaklaşımdır.
nn.Module alt sınıfı için, super().__init__(...) sonrasında del self.attribute kullanın.
class MyNewModel(ParentModel):
def __init__(self, config: MyNewConfig):
super().__init__(config)
del self.attributedel self.attribute, kopyalanan üst sınıf gövdesinden yalnızca self.attribute = ... atama satırını kaldırır. self.attribute'ye atıfta bulunan diğer satırları kaldırmaz. Üst sınıfın forward veya diğer yöntemleri de bu özniteliğe atıfta bulunuyorsa, bu yöntemleri de geçersiz kılın.
class DummyModel(nn.Module):
def __init__(self, config: DummyConfig):
super().__init__()
self.attribute = config.attribute
if self.attribute:
# do more stuff with `self.attribute` here
...
class MyNewDummyModel(DummyModel):
def __init__(self, config: MyNewDummyConfig):
super().__init__(config)
del self.attribute
# 'self.attribute = config.attribute' is removed, but the 'if self.attribute:' block remains.
# Override forward() or any other method that references self.attribute.super() ile çalışma
super().__init__(config), dönüştürücüye ebeveyn gövdesinin çocuğa kopyalanması gerektiğini söyler. Bu davranışı geçersiz kılmak için iki desen kullanabilirsiniz.
- Üretilen çıktının modüler üst sınıf yerine büyük üst sınıfı (
nn.Module.__init__) çağırmaya ihtiyacı olduğunda, belirli bir üst sınıfı doğrudan çağırın. - Bir üst sınıf metodunun tam imzasını devralırken özel bir dokümantasyon dizesi eklemek veya bir dekoratörü değiştirmek için
**super_kwargskullanın.
Büyük bir üst sınıfı doğrudan çağırın
super() kullanmanız gerektiğinde, hedefin modüler üst sınıf değil de üretilen sınıfın üst sınıfı olduğunu açıkça belirtin. Aşağıdaki örnek nn.Module.__init__(self) çağrısını doğrudan yapar. DummyModule zaten bir nn.Module olduğundan, dönüştürücü bunu üretilen MyNewDummyModule içinde super().__init__() olarak yazar.
class MyNewDummyModule(DummyModule): | class MyNewDummyModule(nn.Module):
|
def __init__(self): | def __init__(self):
nn.Module.__init__(self) | super().__init__()
self.foo = config.foo | self.foo = config.foo
... | ...super_kwargs
**super_kwargs, bir üst sınıf metodunun tam imzasını devralırken özel bir dokümantasyon dizgesi eklemek veya bir dekoratörü değiştirmek için kullanılır. Eşlenmiş imzada, linter'a üretilen çıktıdaki tüm üst sınıf argümanlarını genişletmesini söyler.
En yaygın kullanım, tam imzayı yeniden yazmadan, labels argümanını belgelemek gibi modele özgü bir docstring eklemektir.
# modular_gemma.py
class GemmaForCausalLM(LlamaForCausalLM):
def forward(**super_kwargs):
r"""
Example:
```python
>>> from transformers import AutoTokenizer, GemmaForCausalLM
>>> model = GemmaForCausalLM.from_pretrained("google/gemma-7b")
...
```"""
return super().forward(**super_kwargs)Oluşturulan GemmaForCausalLM.forward, manuel kopyalama gerektirmeden tam LlamaForCausalLM imzasına sahiptir.
**super_kwargs, niş durumlar için bir kısayoldur. Davranışı değiştiriyorsanız bunun yerine tam imzayı yazın.
Kullanılmayan yöntemleri silme
raise AttributeError("") ifadesiyle üst yazarak bir üst sınıf metodunu kaldırın. Linter, bu metodu üretilen dosyadan kaldırır.
class GemmaTokenizer(LlamaTokenizer):
...
def get_spm_processor(self):
raise AttributeError("Not needed for Gemma")
def unk_token_length(self):
raise AttributeError("Not needed for Gemma")Süslenmiş yöntemlerin geçersiz kılınması
Dekor edilmiş bir üst sınıf metodunu geçersiz kıldığınızda, üst sınıfın dekoratörü otomatik olarak devralınır. Kendi dekoratörünüzü eklerseniz, üst sınıfın dekoratörünün yerini alır.
Kütüphanenin genelinde iki dekoratör yer alır: biri modelin ara çıktılarını yakalamak, diğeri docstring'leri otomatik olarak oluşturmak içindir.
Aşağıdaki örnekte, bir alt sınıf, kendi dekoratörünü eklemeksizin dekoratörlenmiş bir üst sınıf metodunu geçersiz kılar. Üst sınıfın dekoratörü devralınır.
class NewModel(DummyModel): | class NewModel(nn.Module):
... | ...
|
def forward(...): | @decorator(...)
... | def forward(...):
| ...Yeni bir dekoratör eklerseniz, dekoratörünüz üst düzeyin (parent) dekoratörünü değiştirir.
class NewModel(DummyModel): | class NewModel(nn.Module):
... | ...
|
@my_new_decorator(...) | @my_new_decorator(...)
def forward(...): | def forward(...):
... | ...Özel adlandırma
Linter, bir sınıftan devralırken her şeyi otomatik olarak yeniden adlandırır. Aynı dosyadaki tüm sınıflarda aynı sınıf adı önekini kullanın.
Aşağıdaki örnekteki gibi önekleri karıştırmaktan kaçının. MyModelIncredibleMLP adlandırma kurallarını ihlal eder ve linter, üst düzey bağımlılıkları yeniden adlandırırken MyModelIncredible mi yoksa MyModel mü kullanılacağını bilemez.
class MyModelIncredibleMLP(LlamaMLP):
...
class MyModelDecoderLayer(LlamaDecoderLayer):
...örtük bağımlılıklar olmadığından, tek bir sınıfı yerel olarak yeniden adlandırabilirsiniz. Bu sınıfın diğer tüm geçişlerini yeni ad kalıbıyla açıkça yeniden tanımlayın. Aksi takdirde, linter MyModelIncredibleMLP yanında istenmeyen bir MyModelMLP sınıfı ekler.
Linter, belirsiz bir önek algıladığında bir uyarı oluşturur.
We detected multiple prefix names when inheriting from transformers.models.llama.modeling_llama: ('Emu3Text', 'Emu3'). We will only use the most used 'Emu3' prefix when grabbing args and dependencies. Make sure to subclass the intermediate classes with the prefix you want (if different from 'Emu3') or use a single prefix in all the modular (best).Belirsiz önekler, sınıf adlarında Text gibi bir modallık belirleyici içeren çok modallı modellerde en sık görülür. Bir bağımlılığa belirli bir önek vermek için, onu pass ile açıkça yeniden adlandırın.
class Emu3TextMLP(LlamaMLP):
passYapılandırma docstring'leri
Linter henüz kısmi docstring mirasını desteklemiyor. Yapılandırma öznitelikleri eklerken veya kaldırırken, tam docstring'i doğrudan sınıf tanımının altındaki modüler dosyaya ekleyin.
Checkpoint dönüştürme
Modelleme dosyalarınızı oluşturduktan sonra, gerçek ağırlıkların doğru yüklendiğini doğrulayın. Yukarı akış kontrol noktası biçimini Transformers ile uyumlu bir biçime dönüştüren bir dönüştürme betiği yazın ve ardından Hub'a kaydedin.
Dönüştürme betiği yazın
convert_<model>_to_hf.py dosyasını src/transformers/models/<model>/ dizinine ekleyin. Betik, upstream ağırlıklarını yükler, modülünüzün parametre adlarıyla eşleşecek şekilde anahtarları yeniden adlandırıp yeniden şekillendirir ve sonucu save_pretrained() ile kaydeder.
Kopyalanıp uyarlanacak mevcut bir betik arayın.
src/transformers/models/altındaki modeller, başlangıç noktası olarak kullanabileceğiniz birconvert_*_to_hf.pyiçerir.
Betik çalıştırıldıktan sonra, kaydedilen checkpoint'i from_pretrained() ile yükleyin ve beklenen her ağırlığın doğru şekilde yüklendiğini doğrulayın. Kullanılmayan checkpoint anahtarları, eşleşmeyen adları gösterir; bu nedenle sorunları erken yakalamak için bunları yazdırın.
model = YourModelForTask.from_pretrained("path/to/output/")Anahtarlar üzerinde iterasyon yaparken şekil ve ad eşleşmelerini kontrol edin. Şekil uyuşmazlıkları genellikle yapılandırmanızdaki bir parametrenin yanlış olduğunu, mimarinin orijinalinden farklı olduğunu veya bir ağırlığın transpoze edilmesi gerektiğini gösterir.
for key, tensor in original_state_dict.items():
hf_tensor = hf_model.state_dict().get(mapped_key)
assert hf_tensor.shape == tensor.shape, (
f"Shape mismatch for {key}: expected {tensor.shape}, got {hf_tensor.shape}"
)Tüm ağırlıkların sorunsuz bir şekilde yüklenene kadar modüler dosyanız, oluşturulan modelleme dosyası ve dönüştürme betiği arasında tekrarlayarak tüm sorunları giderin.
Kontrol noktası sorunsuz bir şekilde yüklendikten sonra, push_to_hub() kullanarak Hub'a gönderin. Daha fazla ayrıntı için model paylaşımı kılavuzuna başvurun.
model.push_to_hub("username/your-model-name")Çalışma zamanı dönüştürme eşlemesi
Yayınlanan ağırlıklar modülünüzün parametre yerleşimiyle eşleşmediğinde src/transformers/conversion_mapping.py dosyasına bir çalışma zamanı eşlemesi ekleyin. Yaygın durumlar arasında ayrı olarak saklanan füzyonlu ağırlıklar ve yığılması gereken MoE uzman tensörleri bulunur. Bu eşleme, from_pretrained() işlevinin Hub kontrol noktasını ayrı bir dışa aktarma adımı olmadan yüklemesini sağlar.
WeightRenaming ve WeightConverter kurallarını nasıl yazacağınız ve bunları model_type için nasıl kaydedeceğiniz hakkında dinamik ağırlık yükleme kılavuzuna başvurun.
Sonraki adımlar
- Model yapı kuralları, tüm
modeling_*.py,modular_*.pyveconfiguration_*.pydosyalarında uygulanan statik kurallardır. Bir PR açmadan önce bunları kontrol etmek içinmake typingkomutunu çalıştırın. - Görüntü işleme bileşenleri ekleme, çok modlu bir model için görüntü işleyici, video işleyici ve işleyici eklemeyi adım adım anlatır.
- Docstring'lerin otomatik oluşturulması, paylaşılan model API'leri için argüman belgelerini elle yazmak zorunda kalmamanız için
@auto_docstring'in nasıl kullanılacağını gösterir. - Model testleri yazma, yeni modeliniz için entegrasyon testleri yazmayı ve bunları yerel olarak çalıştırmayı açıklar.
- Pull request kontrolleri, birleştirmeden önce PR'ınızın geçmesi gereken CI kontrollerini ve bunların yerel olarak nasıl yeniden oluşturulup düzeltileceğini açıklar.