Transformers documentation
Konfigurasi per lapisan
Konfigurasi per lapisan
Beberapa checkpoint bersifat heterogen (tidak seragam per lapisan). MLP yang lebih kecil pada satu lapisan, jumlah head key-value yang lebih sedikit pada lapisan lain, atau tata letak yang berbeda pada lapisan tertentu berarti satu konfigurasi global tidak dapat menggambarkan tumpukan dengan akurat.
Gunakan per_layer_config pada PreTrainedConfig untuk mencatat perbedaan tersebut saat Anda membuat atau memeriksa konfigurasi, dan saat kode model akan menggunakannya. Setiap entri hanya menyimpan apa yang berbeda dari konfigurasi global, sisanya diwarisi.
Konfigurasi heterogen adalah fitur yang sangat berguna. Jika tata letak heterogen menjadi arsitektur yang umum atau menonjol, kami akan berusaha memodelkannya secara eksplisit dalam implementasi arsitektur, alih-alih mengandalkan
per_layer_config. Utamakan arsitektur eksplisit jika tersedia.
Model-model di bawah ini adalah checkpoint heterogen. Lapisan tidak seragam di seluruh tumpukan. Mereka menggunakan arsitektur khusus dengan block_configs dan model_type mereka sendiri, alih-alih per_layer_config pada arsitektur standar.
Definisikan penimpaan per lapisan
Lewatkan per_layer_config ke LlamaConfig sebagai pemetaan dari indeks layer ke penimpaan atribut. Indeks layer dimulai dari nol. Hanya atribut yang berbeda dari konfigurasi global yang perlu ditentukan.
per_layer_config mencatat dan menyelesaikan nilai konfigurasi. Ia sendiri tidak mengubah modul yang dibuat oleh model atau cara modul tersebut dijalankan. Menerapkan override ukuran atau skip memerlukan kode model yang membaca konfigurasi per-lapisan yang telah diselesaikan saat membangun atau menjalankan setiap lapisan. LlamaModel saat ini membangun setiap LlamaDecoderLayer dengan konfigurasi global, sehingga entri skip di bawah ini tetap berupa nilai konfigurasi, bukan menghapus modul setelah from_pretrained.
Contoh berikut mencatat override untuk empat lapisan: lapisan 5 menggunakan MLP yang lebih kecil, lapisan 11 menggunakan lebih sedikit kepala kunci-nilai, dan lapisan 23 serta 27 mencatat nilai skip untuk arsitektur yang mendukungnya.
from transformers import LlamaConfig
config = LlamaConfig(
hidden_size=4096,
intermediate_size=14336,
num_hidden_layers=32,
num_attention_heads=32,
num_key_value_heads=8,
per_layer_config={
# Use a smaller MLP in one layer.
5: {"intermediate_size": 8192},
# Use fewer key-value heads in another layer.
11: {"num_key_value_heads": 4},
# Record a request to skip the MLP in architectures that support it.
23: {"skip": ["mlp"]},
# Record a request to skip attention in architectures that support it.
27: {"skip": ["attention"]},
},
)Submodul yang dapat dilewati oleh sebuah arsitektur (misalnya, "mlp" dan "attention") didefinisikan per arsitektur. skip menerima daftar, sehingga sebuah layer dapat mencatat lebih dari satu override submodul.
Mengakses config.per_layer_config[layer_idx] mengembalikan konfigurasi layer yang telah dipecahkan. Konfigurasi yang telah dipecahkan ini menggabungkan konfigurasi global dengan penimpaan untuk layer tersebut.
# Layer 0 does not define overrides, so it inherits the global values.
config.per_layer_config[0].intermediate_size
# 14336
config.per_layer_config[0].num_key_value_heads
# 8
# Layer 5 overrides the MLP intermediate size.
config.per_layer_config[5].intermediate_size
# 8192
# Layer 11 overrides the number of key-value heads.
config.per_layer_config[11].num_key_value_heads
# 4
# Layer 23 records an MLP skip.
config.per_layer_config[23].skip
# ["mlp"]
# Layer 27 records an attention skip.
config.per_layer_config[27].skip
# ["attention"]Konfigurasi yang menggunakan per_layer_config mendukung round trip save_pretrained() dan from_pretrained() yang sama seperti konfigurasi lainnya.
Setiap arsitektur mendefinisikan dalam kodenya atribut apa yang dikonsumsi pada tingkat layer. per_layer_config menyediakan mekanisme untuk merekam perbedaan pada tingkat layer tersebut dan menyelesaikannya terhadap konfigurasi global.
Akses atribut global
Atribut dengan penimpaan per-lapis tidak memiliki nilai tunggal untuk seluruh model. num_key_value_heads mungkin bernilai 8 pada sebagian besar lapisan dan 4 pada lapisan tertentu. Membaca config.num_key_value_heads di luar konteks lapisan bersifat ambigu.
Secara default, akses tersebut memicu AmbiguousGlobalPerLayerAttributeError dan mengarahkan Anda ke config.per_layer_config[layer_idx]. Atribut tersebut masih ada pada konfigurasi global, sehingga ini bukan AttributeError. Membaca nilai global tersebut tanpa indeks layer tetap salah. Kode yang membangun cache key-value dari num_key_value_heads global akan menentukan ukuran layer yang salah secara tidak tepat.
Set allow_global_per_layer_attribute_access=True hanya jika Anda memang sengaja membutuhkan fallback global dan dapat menangani konfigurasi yang heterogen. Akses global kemudian diizinkan. Peringatan akan dikeluarkan sekali.
config = LlamaConfig(
hidden_size=4096,
intermediate_size=14336,
num_hidden_layers=32,
num_attention_heads=32,
num_key_value_heads=8,
allow_global_per_layer_attribute_access=True,
per_layer_config={
11: {"num_key_value_heads": 4},
},
)
config.num_key_value_heads
# 8
# Emits a one-time warning because num_key_value_heads has a per-layer override.Serialisasi
per_layer_config secara default melakukan serialisasi secara jarang (sparse), dan lapisan tanpa override akan diabaikan. Atribut yang di-override dan nilainya sama dengan nilai global juga akan diabaikan.
from transformers import LlamaConfig
config = LlamaConfig(
hidden_size=4096,
intermediate_size=14336,
num_hidden_layers=4,
num_attention_heads=32,
num_key_value_heads=8,
per_layer_config={
0: {"num_key_value_heads": 8},
2: {"num_key_value_heads": 4},
},
)
config.to_dict()["per_layer_config"]
# {"2": {"num_key_value_heads": 4}}Set serialize_explicit_per_layer_config=True untuk menyertakan setiap layer untuk atribut yang direpresentasikan dalam per_layer_config. Hal ini membuat tata letak layer lebih mudah diperiksa ketika beberapa nilai masih cocok dengan konfigurasi global.
explicit_config = LlamaConfig(
hidden_size=4096,
intermediate_size=14336,
num_hidden_layers=4,
num_attention_heads=32,
num_key_value_heads=8,
serialize_explicit_per_layer_config=True,
per_layer_config={
0: {"num_key_value_heads": 8},
2: {"num_key_value_heads": 4},
},
)
serialized_per_layer_config = explicit_config.to_dict()["per_layer_config"]
serialized_per_layer_config
# {
# "0": {"num_key_value_heads": 8},
# "1": {"num_key_value_heads": 8},
# "2": {"num_key_value_heads": 4},
# "3": {"num_key_value_heads": 8},
# }Gunakan serialisasi sparse untuk konfigurasi yang ringkas, dan serialisasi eksplisit ketika Anda memerlukan tata letak per-lapisan penuh untuk keterbacaan atau alat bantu.
Update on GitHub