Transformers documentation
Menulis kernel
Menulis kernel
Panduan ini menjelaskan cara menulis kernel yang melampaui penggantian forward tanpa status. Ini mencakup dua kemampuan yang didukung oleh API KernelConfig yang diperluas:
- Transformasi parameter: kernel mengharapkan bobot dalam tata letak yang berbeda dari model asli (misalnya, parameter yang namanya diubah atau digabungkan).
- Fusi modul: kernel menggantikan beberapa modul bersebelahan dengan satu implementasi yang telah difusi.
Untuk kernel dasar (pengganti forward stateless tanpa perubahan parameter), lihat dokumentasi pustaka kernels.
Pola dua kelas
Setiap kernel yang membawa parameternya sendiri mengikuti pola dua kelas.
KernelName: hanya berisi jalurforward. Perpustakaankernelsmenggunakan kelas ini untuk meng-kernelisasi model karena tidak mengizinkan kelas kernel yang berstatus (stateful).KernelNameLayout: sebuahnn.Moduleyang menyimpan parameter dan melakukan monkey-patch pada modul asli sebelum checkpoint dimuat. Saat runtime,kernelizemenggantiforwardmiliknya denganforwarddariKernelName. Anda tidak perlu mendefinisikanforward. Transformers menyuntikkannya secara otomatis dengan tanda tangan yang sama sepertiKernelName.forward.
Konvensi penamaan bersifat ketat. Kelas layout harus diberi nama
{KernelName}Layoutdan didefinisikan di modul yang sama denganKernelName.
Transformasi parameter
Gunakan pola ini ketika kernel mengharapkan bobot dengan nama atau bentuk yang berbeda dari checkpoint model asli.
Kelas KernelNameLayout memiliki tanda tangan __init__ yang sama dengan modul yang digantikannya dan mendeklarasikan atribut kelas conversion_mapping yang memberi tahu Transformers cara memetakan ulang kunci checkpoint ke nama parameter baru (lihat Pem bobotan dinamis untuk detail lebih lanjut).
# layers.py
try:
from transformers import Concatenate, WeightConverter
from transformers.conversion_mapping import WeightRenaming
except ImportError:
Concatenate = WeightConverter = WeightRenaming = None
import torch
import torch.nn as nn
class CustomRMSNormLayout(nn.Module):
conversion_mapping = [...] # rules that remap checkpoint keys to the new parameter names
def __init__(self, hidden_size: int, eps: float = 1e-6):
super().__init__()
self.scale = nn.Parameter(torch.ones(hidden_size))
self.variance_epsilon = eps
class CustomRMSNorm(nn.Module):
def forward(self, hidden_states: torch.Tensor) -> torch.Tensor:
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.scale * hidden_states.to(input_dtype)# __init__.py
from . import layersPerpustakaan
kernelsmenemukan kelas kernel melalui modullayers(baiklayers.pymaupunlayers/__init__.py). Definisikan kelas kernel dan layout secara langsung dilayers.py, dan paparkan modullayersdari__init__.pypaket. Transformers menemukanCustomRMSNormLayoutdi modul yang sama denganCustomRMSNorm.Lindungi impor yang spesifik untuk Transformers (
WeightConverter,Concatenate,WeightRenaming) dilayers.pyagar kernel juga dapat diimpor di lingkungan tempat Transformers tidak terpasang.
Muat kernel ini dengan meneruskan nama repo dan kelas ke KernelConfig. Kuncinya adalah nama kelas modul asli dari model. Nilainya menunjuk ke kelas KernelName (bukan Layout) di repo.
Nilainya berupa string "owner/repo:ClassName" atau tuple (repo_string, metadata). Dalam bentuk tuple, berikan version atau revision (minimal satu), dan secara opsional trust_remote_code. Gunakan version untuk versi kernel mayor atau revision untuk tag, branch, atau commit. Atur trust_remote_code=True untuk memuat dari luar organisasi kernels-community yang tepercaya. String polos secara default menggunakan version=1 dan trust_remode_code=False.
from transformers import AutoModelForCausalLM, KernelConfig
kernel_config = KernelConfig({"RMSNorm": ("owner/my-kernel:CustomRMSNorm", {"trust_remote_code": True, "version": 1})})
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen3-0.6B",
use_kernels=True,
kernel_config=kernel_config,
device_map="auto",
)Saat model dimuat, Transformers:
- Memuat
CustomRMSNormdari repo dan mencariCustomRMSNormLayoutdi modul yang sama. - Monkey-patches setiap
RMSNormdalam model denganCustomRMSNormLayout. - Memetakan ulang bobot checkpoint menggunakan
conversion_mappingagar dapat dimuat ke nama parameter baru. - Memanggil
kernelize, yang menggantikanCustomRMSNormLayout.forwarddenganCustomRMSNorm.forward.
Fusi modul
Gunakan pola ini ketika sebuah kernel menggantikan beberapa modul bersebelahan dengan satu implementasi yang terpadu. Karena modul yang terpadu menggabungkan parameter dari beberapa modul asli, KernelNameLayout.__init__ menerima modul anak yang sudah diinstansiasi, bukan argumen konstruktor mereka.
# layers.py
try:
from transformers import Concatenate, WeightConverter
from transformers.conversion_mapping import WeightRenaming
except ImportError:
Concatenate = WeightConverter = WeightRenaming = None
import torch
import torch.nn as nn
class RMSNormMLPLayout(nn.Module):
conversion_mapping = [...] # rules that remap checkpoint keys to the fused parameter names
def __init__(self, norm, mlp):
super().__init__()
self.variance_epsilon = norm.variance_epsilon
self.scale = nn.Parameter(torch.empty_like(norm.weight))
self.gate_up_proj = nn.Linear(
mlp.gate_proj.in_features,
mlp.gate_proj.out_features + mlp.up_proj.out_features,
bias=mlp.gate_proj.bias is not None,
device=mlp.gate_proj.weight.device,
dtype=mlp.gate_proj.weight.dtype,
)
self.down_proj = nn.Linear(
mlp.down_proj.in_features,
mlp.down_proj.out_features,
bias=mlp.down_proj.bias is not None,
device=mlp.down_proj.weight.device,
dtype=mlp.down_proj.weight.dtype,
)
self.act_fn = mlp.act_fn
class RMSNormMLP(nn.Module):
def forward(self, hidden_states: torch.Tensor) -> torch.Tensor:
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)
hidden_states = self.scale * hidden_states.to(input_dtype)
gate, up = self.gate_up_proj(hidden_states).chunk(2, dim=-1)
return self.down_proj(self.act_fn(gate) * up)# __init__.py
from . import layersUntuk menggabungkan modul, teruskan tuple pasangan (class_name, path_pattern) sebagai kunci di KernelConfig alih-alih string biasa. Semua pola harus berbagi modul induk yang sama (Transformers menggabungkan anak-anak di dalam induk tersebut). Wildcard * cocok dengan satu segmen path apa pun.
from transformers import AutoModelForCausalLM, KernelConfig
kernel_config = KernelConfig(
{
(
("RMSNorm", "model.layers.*.post_attention_layernorm"),
("MLP", "model.layers.*.mlp"),
): ("owner/my-kernel:RMSNormMLP", {"trust_remote_code": True, "version": 1}),
}
)
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen3-0.6B",
use_kernels=True,
kernel_config=kernel_config,
device_map="auto",
)Saat model dimuat, Transformers:
- Memuat
RMSNormMLPdari repo dan menemukanRMSNormMLPLayoutdi modul yang sama. - Mencocokkan setiap lapisan decoder di
model.layers.*dan membangun kelas induk yang digabungkan (fused) yang__init__-nya memanggilRMSNormMLPLayout(post_attention_layernorm, mlp). - Menggantikan anak yang tersisa (
mlp) dengannn.Identity()untuk mempertahankan antarmuka modul induk. - Memetakan ulang bobot checkpoint menggunakan
conversion_mapping. - Memanggil
kernelize, yang menggantikanRMSNormMLPLayout.forwarddenganRMSNormMLP.forward.
Update on GitHubUrutan pasangan dalam tuple fusi menentukan urutan argumen yang diteruskan ke
KernelNameLayout.__init__.