## 内核

本页记录了内核配置工具。

### kernelize[[transformers.kernelize]]

#### transformers.kernelize[[transformers.kernelize]]

```python
transformers.kernelize(model: PreTrainedModel, mode: Mode | None = None)
```

[来源](https://github.com/huggingface/transformers/blob/main/src/transformers/integrations/hub_kernels.py#L953)

临时注册隐藏的内核包装器，以便 `kernelize` 能够发现并替换它们。

### KernelConfig[[transformers.KernelConfig]]

#### transformers.KernelConfig[[transformers.KernelConfig]]

```python
transformers.KernelConfig(kernel_mapping = None, use_local_kernel = False, inherit_mapping = True)
```

[来源](https://github.com/huggingface/transformers/blob/main/src/transformers/utils/kernel_config.py#L92)

内核配置类。该类用于配置模型的内核映射。

#### create_compatible_mapping[[transformers.KernelConfig.create_compatible_mapping]]

```python
create_compatible_mapping(model, compile = False)
```

[来源](https://github.com/huggingface/transformers/blob/main/src/transformers/utils/kernel_config.py#L250)

将简单的 kernel_mapping 转换为如下形式：{ "RMSNorm": ("kernels-community/layer_norm:LlamaRMSNorm", {"version": 1, "trust_remote_code": True}), ... }，

或对于本地路径：

{ "RMSNorm": "/home/user/liger_kernels:LigerRMSNorm", ... },

嵌套映射：

{ "RMSNorm": { "cuda": { Mode.INFERENCE: LayerRepository( repo_id="kernels-community/layer_norm", layer_name="LlamaRMSNorm", version=1, trust_remote_code=True, ) } } }

或对于本地路径：

{ "RMSNorm": { "cuda": { Mode.INFERENCE: LocalLayerRepository( repo_path=Path("/home/user/liger_kernels"), layer_name="LigerRMSNorm", ) } } }

与 kernels 库兼容。

如果未提供设备，则会根据模型的参数进行推断。模式会根据模型的训练状态进行推断。

#### sanitize_kernel_mapping[[transformers.KernelConfig.sanitize_kernel_mapping]]

```python
sanitize_kernel_mapping(model)
```

[来源](https://github.com/huggingface/transformers/blob/main/src/transformers/utils/kernel_config.py#L131)

**参数：**

model : 要检查其模块是否已注册 kernel_layer_name 属性的模型实例。

**引发：** ``ValueError``

- ``ValueError`` -- 如果 layer_name 未在模型中注册，如果设备不受支持，或者如果 repo_name 不是有效的 'org/repo:layer_name' 字符串。

验证 kernel_mapping，以确保：
1. 映射中的每个 layer_name 都已在模型中注册（即模型包含一个具有匹配 kernel_layer_name 的模块）。
2. 每个内核值为
   - 一个形如 'org/repo:layer_name' 的字符串，或一个元组，其中包含与字符串相同的内容以及一个字典 {"revision"/"version/trust_remote_code": ...}，
   - 或一个字典，将受支持的设备类型映射到上述此类值。
3. 字典中的每个设备键都是 "cuda"、"rocm"、"xpu"、"npu"、"neuron"、"tpu" 或 "mps" 之一。
5. 每个 trust remote code 键必须是一个 bool。
6. 如果显式传递了修订号或版本键，则它们必须互斥且仅存在一个。
7. 每个 repo_name 都是格式为 'org/repo:layer_name' 的有效仓库和层名称（即一个同时包含斜杠和冒号的字符串）。
8. 如果检测到本地路径，其格式应为 /abs/path:layer_name，其中绝对路径指向内核仓库，例如 /home/user/layer_norm。

