Hugging Face 集成

skorch 与 Hugging Face 生态系统中的一些库集成。查看以下部分以了解更多信息。

加速

AccelerateMixin 类可用于为 skorch 添加对 huggingface accelerate 的支持。例如,这允许您使用混合精度训练(AMP)、多GPU训练、使用TPU训练或梯度累积。目前,此功能应被视为实验性的。

使用加速

要使用此功能,请创建一个新的神经网络类的子类,并从混合类继承。例如,如果你想使用一个NeuralNet,它看起来会像这样:

from skorch import NeuralNet
from skorch.hf import AccelerateMixin

class AcceleratedNet(AccelerateMixin, NeuralNet):
    """NeuralNet with accelerate support"""

同样适用于NeuralNetClassifier, NeuralNetRegressor等。然后传递一个带有所需参数的Accelerator实例,你就可以开始了:

from accelerate import Accelerator

accelerator = Accelerator(...)
net = AcceleratedNet(
    MyModule,
    accelerator=accelerator,
)
net.fit(X, y)

accelerate 建议将设备处理留给 Accelerator,这就是为什么 device 默认为 None(从而告诉 skorch 不要更改设备)。

使用AccelerateMixin的模型不能被pickle。如果你需要保存和加载网络,可以使用skorch.net.NeuralNet.save_params()skorch.net.NeuralNet.load_params()

要安装accelerate,请在您的Python环境中运行以下命令:

python -m pip install accelerate

注意

在底层,accelerate 使用了 GradScaler, 它不支持将训练步骤作为闭包传递。 因此,如果你的优化器需要这样做(例如 torch.optim.LBFGS),你就不能使用 accelerate。

使用多GPU设置时的注意事项

旧版本的加速器存在一些问题,为了获得最佳效果,请使用0.21或更高版本。

在多GPU训练中存在缓存无法正常工作的问题。因此,如果使用评分回调(例如 skorch.callbacks.EpochScoring),通过传递 use_caching=False来关闭缓存。请注意,当使用 skorch.NeuralNetClassifier时,验证集上的准确率评分器会自动添加。可以像这样关闭缓存:

net = NeuralNetClassifier(..., valid_acc__use_caching=False)

当运行大量评分器时,缺乏缓存会显著减慢训练速度,因为即使结果始终相同,每个评分器都会调用一次推理。一个可能的解决方案是编写自己的评分回调函数,该函数使用一次推理调用将多个分数记录到history中。

此外,如果你的训练依赖于某些容量的训练历史,例如因为你希望在验证损失停止改善时提前停止,你应该使用DistributedHistory而不是默认的历史记录。更多关于此的信息可以在这里找到。

分词器

skorch 还提供了类似于 sklearn 的转换器,这些转换器可以与 Hugging Face 的 tokenizers 一起使用。这些转换器的 transform 方法返回的数据结构类似于字典,这使得它们与 skorch 的 NeuralNet 结合使用非常方便。以下是如何使用预训练的分词器与 skorch.hf.HuggingfacePretrainedTokenizer 的示例:

from skorch.hf import HuggingfacePretrainedTokenizer
# pass the model name to be downloaded
hf_tokenizer = HuggingfacePretrainedTokenizer('bert-base-uncased')
data = ['hello there', 'this is a text']
hf_tokenizer.fit(data)  # only loads the model
hf_tokenizer.transform(data)

# use hyper params from pretrained tokenizer to fit on own data
hf_tokenizer = HuggingfacePretrainedTokenizer(
    'bert-base-uncased', train=True, vocab_size=12345)
data = ...
hf_tokenizer.fit(data)  # fits new tokenizer on data
hf_tokenizer.transform(data)

如果你不想使用预训练的tokenizer,而是想训练自己的tokenizer,并对每个组件进行细粒度控制,比如使用哪种tokenization方法,我们也可以使用skorch.hf.HuggingfaceTokenizer

当然,由于这两个转换器都与scikit-learn兼容,你可以在网格搜索中使用它们。

变压器

Hugging Face 的 transformers 库为您提供了许多预训练的深度学习模型。由于它们只是普通的模型,因此无需进一步调整即可使用(只要它们是 PyTorch 模型),因此没有专门的 skorch 集成。

如果你想看看在实践中如何使用transformers与skorch,可以查看Hugging Face微调笔记本