Open In Colab  View Notebook on GitHub

使用 ArgillaTrainer 训练模型#

在我们端到端系列的这一部分中,我们将使用 ArgillaTrainer 训练我们的模型。您可以参考之前的教程,例如创建数据集添加回复和建议。随时查看实践指南页面以获取更深入的信息。

微调是使用与模型训练所用的数据集相似的数据集来训练模型的过程。这样,模型可以学习在特定任务上表现更好。在我们的案例中,我们将使用在之前的教程中创建的数据集来微调模型。请注意,Argilla trainer 是许多不同框架和模型的封装器。请查看ArgillaTrainer页面,以获取有关支持的 NLP 任务和模型的更多信息。

workflow

目录#

  1. 拉取数据集

    1. 来自 Argilla

    2. 来自 HuggingFace Hub

  2. 使用默认 ArgillaTrainer 训练

  3. 使用自定义格式化函数训练

  4. 将模型推送到 Huggingface Hub

  5. 结论

运行 Argilla#

在本教程中,您需要运行 Argilla 服务器。部署和运行 Argilla 有两个主要选项

在 Hugging Face Spaces 上部署 Argilla: 如果您想使用外部 Notebook(例如 Google Colab)运行教程,并且您在 Hugging Face 上有一个帐户,您可以通过点击几下在 Spaces 上部署 Argilla

deploy on spaces

有关配置部署的详细信息,请查看官方 Hugging Face Hub 指南

使用 Argilla 的快速入门 Docker 镜像启动 Argilla:如果您想在本地计算机上运行 Argilla,这是推荐的选项。请注意,此选项仅允许您在本地运行教程,而不能与外部 Notebook 服务一起运行。

有关部署选项的更多信息,请查看文档的部署部分。

提示

本教程是一个 Jupyter Notebook。有两种选择可以运行它

  • 使用此页面顶部的“在 Colab 中打开”按钮。此选项允许您直接在 Google Colab 上运行 Notebook。不要忘记将运行时类型更改为 GPU 以加快模型训练和推理速度。

  • 通过单击页面顶部的“查看源代码”链接下载 .ipynb 文件。此选项允许您下载 Notebook 并在本地计算机上或您选择的 Jupyter Notebook 工具上运行它。

首先,让我们安装我们的依赖项并导入必要的库

[ ]:
!pip install argilla
!pip install datasets transformers
[ ]:
import argilla as rg
from argilla.feedback import FeedbackDataset, TrainingTask, ArgillaTrainer
from datasets import load_dataset
from argilla._constants import DEFAULT_API_KEY

为了运行此 Notebook,我们将需要一些凭据来从 Argilla🤗 Hub 推送和加载数据集,让我们在以下单元格中设置它们

[ ]:
# Argilla credentials
api_url = "https://#:6900"  # "https://<YOUR-HF-SPACE>.hf.space"
api_key = DEFAULT_API_KEY  # admin.apikey
# Huggingface credentials
hf_token = "hf_..."

登录 Argilla

[ ]:
rg.init(api_url=api_url, api_key=api_key)

启用遥测#

我们从您与我们的教程的互动中获得宝贵的见解。为了改进我们自己,为您提供最合适的内容,使用以下代码行将帮助我们了解本教程是否有效地为您服务。虽然这是完全匿名的,但如果您愿意,可以选择跳过此步骤。有关更多信息,请查看遥测页面。

[ ]:
try:
    from argilla.utils.telemetry import tutorial_running
    tutorial_running()
except ImportError:
    print("Telemetry is introduced in Argilla 1.20.0 and not found in the current installation. Skipping telemetry.")

拉取数据集#

由于我们将我们在之前的教程中创建的数据集上传到了 Argilla 和 HuggingFace Hub,我们可以从其中任何一个拉取数据集。让我们看看如何从两者中拉取数据集。

来自 Argilla#

我们可以使用 from_argilla 方法从 Argilla 拉取数据集。

[ ]:
dataset = rg.FeedbackDataset.from_argilla("end2end_textclassification_with_suggestions_and_responses")

来自 HuggingFace Hub#

我们也可以从 HuggingFace Hub 拉取数据集。类似地,我们可以使用 from_huggingface 方法来拉取数据集。

[ ]:
dataset = rg.FeedbackDataset.from_huggingface("argilla/end2end_textclassification_with_suggestions_and_responses")

注意

从 HuggingFace Hub 拉取的数据集是 FeedbackDataset 的实例,而从 Argilla 拉取的数据集是 RemoteFeedbackDataset 的实例。两者之间的区别在于,前者是本地数据集,对其所做的更改将保留在本地。另一方面,后者是远程数据集,对其所做的更改将直接反映在 Argilla 服务器上的数据集上,这可以加快您的流程。

让我们简要检查一下我们的数据集的外观。它是一个数据集,包含带有 text 字段的数据项,该字段尚未注释。

[ ]:
dataset[0].fields
{'text': "Wall St. Bears Claw Back Into the Black (Reuters) Reuters - Short-sellers, Wall Street's dwindling\\band of ultra-cynics, are seeing green again."}

使用默认 ArgillaTrainer 设置进行训练#

正如我们之前提到的,您可以将 ArgillaTrainer 用于您最喜欢的 NLP 任务和库。它所做的是通过为训练和微调模型提供统一的界面来简化训练过程。让我们首先看看如何使用默认设置训练我们的模型。

TrainingTask 类负责如何处理数据以进行训练。为了使事情更简单,它提供了特定于任务的方法,您可以将其用于手头的特定任务。在本教程中,我们将使用 for_text_classification 方法,该方法将为我们准备一个默认的数据处理函数。您可以在文档中查看所有可用的特定于任务的方法的列表。

[ ]:
task = TrainingTask.for_text_classification(
    text=dataset.field_by_name("text"),
    label=dataset.question_by_name("label"),
)

并且,我们需要为我们的任务定义一个 ArgillaTrainer,它将用于训练。您可以在 framework 参数中定义您想要使用的框架。在本教程中,我们将使用 spacy 框架中的 en_core_web_sm 模型。

[ ]:
trainer = ArgillaTrainer(
    dataset=dataset,
    task=task,
    framework="spacy",
    train_size=0.8,
    model="en_core_web_sm",
)

让我们使用 update_config 方法进一步自定义训练过程。我们指定一个我们想要从 HuggingFace 使用的模型。我们还指定了 epoch 数和学习率。您可以查看训练配置的完整列表,以获取更多自定义选项。

[ ]:
trainer.update_config(
    max_steps=1
)

我们已经可以使用默认设置了。我们只需要调用 train 方法来训练我们的模型。

[ ]:
trainer.train(output_dir="textcat_model_spacy")

使用自定义格式化函数训练#

默认设置有时可能不是最适合您的任务。在这些情况下,您可能需要自定义数据处理函数。您可以通过将自定义格式化函数传递给 for_text_classification 方法来做到这一点。让我们首先定义一个自定义格式化函数,然后使用它来训练我们的模型。

重要的是要注意,自定义格式化函数应返回模型将接受的对象。在我们的例子中,我们将返回文本和标签的元组。

[ ]:
def formatting_func(sample):
    text = sample["text"]
    label = sample["label"][0]["value"]
    return(text, label)

现在,我们可以使用我们的自定义格式化函数来提供 TrainingTasks

[ ]:
task = TrainingTask.for_text_classification(formatting_func=formatting_func)

对于此示例,我们可以使用 spacy 框架。

[ ]:
trainer = ArgillaTrainer(
    dataset=dataset,
    task=task,
    framework="spacy",
    train_size=0.8,
)

让我们使用 update_config 方法进一步自定义训练过程。我们指定一个我们想要从 HuggingFace 使用的模型。我们还指定了 epoch 数和学习率。您可以查看训练配置的完整列表,以获取更多自定义选项。

[ ]:
trainer.update_config(
    max_steps=1
)

同样,我们只需要调用 train 方法来训练我们的模型。

[ ]:
trainer.train(output_dir="textcat_model_spacy")

将模型推送到 HuggingFace Hub#

现在我们已经完成了训练,并且我们有一个可以用于推理的模型,我们可以将其推送到 HuggingFace Hub。Argilla 再次提供了一种非常简单的方法,只需一行代码即可完成此操作。

首先,为了能够将您的模型上传到 Hub,您必须登录到 Hub。以下单元格将使用我们之前的令牌登录我们。

如果我们还没有令牌,我们可以从此处获取(请记住设置写入权限)。

[ ]:
from huggingface_hub import login

login(token=hf_token)

我们只需要调用 push_to_huggingface 方法将模型推送到 HuggingFace Hub。不要忘记也创建一个模型卡,这将使模型对用户来说更易于理解。

[ ]:
trainer.push_to_huggingface("textcat_model_spacy", generate_card=True)

结论#

在本教程中,我们已经了解了如何使用 ArgillaTrainer 训练模型。我们还使用自定义格式化函数和训练配置自定义了训练过程。训练完成后,我们使用 push_to_huggingface 方法将我们的模型推送到了 HuggingFace Hub。您可以参考指标教程,了解如何评估您的模型。