HuggingfaceNLP笔记4.2Sharing pretrained models

在下面的步骤中,我们将了解如何最简单地将预训练模型分享到🤗 Hub。已经提供了工具和实用程序,可以直接在Hub上分享和更新模型,我们将在下面详细介绍。

我们鼓励所有训练模型的用户通过与社区分享来贡献,即使模型是在特定数据集上训练的,也能帮助他人,节省他们的时间和计算资源,同时提供有用的训练成果。反过来,你也可以从他人的工作中受益!

创建新模型存储库有三种方式:

  • 使用push_to_hub API
  • 使用huggingface_hub Python库
  • 使用网页界面

创建完存储库后,你可以通过git和git-lfs上传文件。接下来我们将逐步指导你创建模型存储库并上传文件。

Using the push_to_hub API

上传文件到Hub的最简单方法是利用push_to_hub API。

在继续之前,你需要生成一个身份验证令牌,以便huggingface_hub API知道你是谁以及你对哪些命名空间有写入权限。确保你在一个安装了transformers的环境中(参见设置)。如果你在笔记本中,可以使用以下函数登录:

from huggingface_hub import notebook_login

notebook_login()

在终端中,你可以运行:

huggingface-cli login

在这两种情况下,你都会被提示输入用户名和密码,它们与你在Hub上登录的用户名和密码相同。如果你还没有Hub账户,你应该在这里创建。

太好了!现在你的身份验证令牌已存储在你的缓存文件夹中。让我们创建一些存储库!

如果你已经使用Trainer API训练过模型,最简单的上传方法是在定义TrainingArguments时设置push_to_hub=True

from transformers import TrainingArguments

training_args = TrainingArguments(
    "bert-finetuned-mrpc", save_strategy="epoch", push_to_hub=True
)

当你调用trainer.train()时,Trainer会在每次保存(这里每轮)时将模型上传到你的命名空间中的存储库。存储库的名称将与你选择的输出目录相同(这里为bert-finetuned-mrpc),但你可以通过hub_model_id = "a_different_name"选择不同的名称。

要将模型上传到你所属的组织,只需使用hub_model_id = "my_organization/my_repo_name"传递。

训练完成后,你应该调用trainer.push_to_hub()来上传模型的最新版本。它还会生成一个模型卡,包含所有相关元数据,报告使用的超参数和评估结果!以下是模型卡中可能包含的内容示例:

在这里插入图片描述

在较低的层次上,可以通过模型、分词器和配置对象的push_to_hub()方法访问Hub。这个方法负责创建存储库并直接将模型和分词器文件推送到存储库。与我们将在下面看到的 API 不同,不需要手动处理。

为了了解其工作原理,我们首先初始化一个模型和一个分词器:

from transformers import AutoModelForMaskedLM, AutoTokenizer

checkpoint = "camembert-base"

model = AutoModelForMaskedLM.from_pretrained(checkpoint)
tokenizer = AutoTokenizer.from_pretrained(checkpoint)

你可以随意处理这些对象,例如添加令牌到分词器、训练模型、微调它。当你对最终模型、权重和分词器满意时,可以直接使用model对象上的push_to_hub()方法:

model.push_to_hub("dummy-model")

这将在你的个人资料中创建名为dummy-model的新存储库,并将模型文件放入其中。同样,对分词器做同样的操作,确保所有文件现在都在这个存储库中:

tokenizer.push_to_hub("dummy-model")

如果你属于某个组织,只需指定organization参数上传到该组织的命名空间:

tokenizer.push_to_hub("dummy-model", organization="huggingface")

如果你想使用特定的Hugging Face令牌,也可以在push_to_hub()方法中指定它。

tokenizer.push_to_hub("dummy-model", organization="huggingface", use_auth_token="<TOKEN>")

现在前往模型库,找到你刚刚上传的模型:https://huggingface.co/user-or-organization/dummy-model

点击“文件和版本”标签页,你应该能看到如下的截图:
在这里插入图片描述

📝 动手试试! 使用bert-base-cased检查点的模型和分词器,使用push_to_hub()方法将它们上传到你命名空间中的仓库。确认仓库在你的页面上正常显示后,再将其删除。

如你所见,push_to_hub()方法接受多个参数,可以上传到特定仓库或组织命名空间,或者使用不同的API令牌。我们建议你查看🤗 Transformers文档中的方法说明,了解更多信息。

push_to_hub()方法由huggingface_hub Python包支持,它提供了与Hugging Face Hub的直接API接口。它已整合到🤗 Transformers和其他机器学习库中,如allenlp。尽管本章主要关注🤗 Transformers的集成,但将其整合到你的代码或库中非常简单。

跳转到最后一个部分,看看如何将文件上传到你新创建的仓库!

Using the huggingface_hub Python library

huggingface_hub Python库是一个提供模型和数据集库工具的包。它提供了一些简单的方法和类,用于执行常见的任务,如获取有关库中仓库的信息并管理它们。它提供了一层基于git的简单API,用于管理仓库的内容,并将Hub集成到你的项目和库中。

与使用push_to_hub API类似,这需要你将API令牌保存在缓存中。为此,你需要使用CLI的login命令,如前一节所述(如果你在Google Colab中运行,请在命令前加上!字符):

huggingface-cli login

huggingface_hub库提供了许多对我们的目的有用的函数和类。首先,有一些用于创建、删除和管理仓库的方法:

from huggingface_hub import (
    # 用户管理
    login,
    logout,
    whoami,

    # 仓库创建和管理
    create_repo,
    delete_repo,
    update_repo_visibility,

    # 用于获取和更改内容信息的方法
    list_models,
    list_datasets,
    list_metrics,
    list_repo_files,
    upload_file,
    delete_file,
)

此外,它还提供了强大的Repository类,用于管理本地仓库。在接下来的几个部分中,我们将探索这些方法和类,了解如何利用它们。

create_repo方法可以用来在库中创建新仓库:

from huggingface_hub import create_repo

create_repo("dummy-model")

这将在你的命名空间中创建名为dummy-model的仓库。如果你想指定仓库所属的组织,可以使用organization参数:

from huggingface_hub import create_repo

create_repo("dummy-model", organization="huggingface")

这将在huggingface命名空间中创建dummy-model仓库,前提是您属于该组织。其他可能有用的参数包括:

  • private,用于指定仓库是否对其他人可见。
  • token,如果你想用给定的令牌覆盖缓存中的令牌。
  • repo_type,如果你想创建一个datasetspace而不是模型。接受的值为"dataset""space"

创建仓库后,我们应向其中添加文件!跳转到下一节,了解处理文件的三种方式。

Using the web interface

Web界面提供了直接在Hub上管理仓库的工具。通过界面,你可以轻松创建仓库、添加文件(包括大文件)、探索模型、查看差异等。

要创建新仓库,请访问huggingface.co/new

首先,指定仓库的所有者:这可以是你自己,也可以是你所在的任何组织。如果你选择一个组织,模型将在该组织的页面上展示,并且组织内的每个成员都有权限对该仓库进行贡献。

接下来,输入你的模型名称。这也将是仓库的名称。最后,你可以选择模型是公开还是私有。私有模型对公众不可见。

创建模型仓库后,你将看到类似以下的页面:

---

这是你的模型将托管的地方。你可以通过网页界面直接添加README文件来开始填充内容。
在这里插入图片描述

README文件使用Markdown格式,你可以尽情发挥!本章的第三部分将介绍如何创建模型卡。模型卡对于模型的价值至关重要,因为它们是你告诉他人模型功能的地方。

在“文件和版本”标签页中,你可能只看到很少的文件,如你刚创建的README.md和用于跟踪大文件的.gitattributes文件。
在这里插入图片描述

接下来,我们将学习如何添加新文件。

Uploading the model files

Hugging Face Hub的文件管理系统基于git处理常规文件,而大文件则使用git-lfs(Git Large File Storage)。

在下一节中,我们将介绍通过huggingface_hub和git命令上传文件的三种方法。

The upload_file approach

使用upload_file方法不需要在你的系统上安装git和git-lfs。它直接通过HTTP POST请求将文件上传到🤗 Hub。这个方法的限制是不支持大于5GB的文件。如果你的文件大于5GB,请参考下面的两种方法。

API的使用示例如下:

from huggingface_hub import upload_file

upload_file(
    "<path_to_file>/config.json",
    path_in_repo="config.json",
    repo_id="<namespace>/dummy-model",
)

这将把<path_to_file>目录下的config.json文件上传到dummy-model仓库的根目录下,作为config.json。其他可能有用的参数包括:

  • token:如果你想用给定的令牌覆盖缓存中的令牌。
  • repo_type:如果你想上传到datasetspace而不是模型。接受的值为"dataset""space"

The Repository class

Repository类以git类似的方式管理本地仓库,它抽象了与git相关的大部分复杂性,提供了我们所需的所有功能。

使用这个类需要安装git和git-lfs(参阅这里获取安装指南),确保在开始之前已经安装并设置好。

为了在我们刚创建的仓库上进行操作,可以先将其克隆到本地文件夹:

from huggingface_hub import Repository

repo = Repository("<path_to_dummy_folder>", clone_from="<namespace>/dummy-model")

这会在工作目录下创建一个名为<path_to_dummy_folder>的文件夹。这个文件夹只包含.gitattributes文件,因为通过create_repo创建仓库时只创建了这个文件。

从这里开始,你可以使用许多传统的git方法:

repo.git_pull()
repo.git_add()
repo.git_commit()
repo.git_push()
repo.git_tag()

还有很多其他方法!我们建议你查看这里Repository文档,了解所有可用方法的概述。

目前,我们有一个模型和一个分词器想要推送到hub。我们已经成功克隆了仓库,所以可以在该仓库中保存文件。

首先,确保我们的本地克隆是最新的:

repo.git_pull()

完成后,保存模型和分词器文件:

model.save_pretrained("<path_to_dummy_folder>")
tokenizer.save_pretrained("<path_to_dummy_folder>")

现在,<path_to_dummy_folder>中包含了模型和分词器的所有文件。我们按照通常的git工作流程,将文件添加到暂存区,提交并推送到hub:

恭喜!你刚刚将第一个文件推送到hub上。

The git-based approach

这是上传文件的最基本方法:我们将直接使用git和git-lfs。以前的方法已经消除了大部分困难,但以下方法有一些注意事项,所以我们将遵循一个更复杂的情况。

使用此类方法需要安装git和git-lfs,确保在开始之前已安装并设置好git-lfs(安装说明请参阅此处)。

首先,初始化git-lfs:

git lfs install
Updated git hooks.
Git LFS initialized.

完成后,第一步是克隆你的模型仓库:

git clone https://huggingface.co/<namespace>/<your-model-id>

例如,我的用户名是lysandre,我使用的模型名为dummy,那么命令将如下所示:

git clone https://huggingface.co/lysandre/dummy

现在我的工作目录中有一个名为dummy的文件夹。我可以进入文件夹并查看内容:

cd dummy && ls
README.md

如果你使用Hugging Face Hub的create_repo方法创建了仓库,这个文件夹中应该只包含一个隐藏的.gitattributes文件。如果你按照上一节中的说明通过web界面创建了仓库,文件夹中应该包含一个README.md文件和一个隐藏的.gitattributes文件,如下所示。

添加一个常规大小的文件,如配置文件、词汇文件,或者任何小于几兆字节的文件,就像在任何基于git的系统中一样。但是,较大的文件必须通过git-lfs注册,以便推送到huggingface.co

回到Python中,我们来生成一个模型和分词器,然后将其提交到我们的dummy仓库:

from transformers import AutoModelForMaskedLM, AutoTokenizer

checkpoint = "camembert-base"

model = AutoModelForMaskedLM.from_pretrained(checkpoint)
tokenizer = AutoTokenizer.from_pretrained(checkpoint)

# 对模型进行处理,训练或微调...

model.save_pretrained("<path_to_dummy_folder>")
tokenizer.save_pretrained("<path_to_dummy_folder>")

现在我们已经保存了一些模型和分词器的元数据,让我们再看看dummy文件夹:

ls
config.json  pytorch_model.bin  README.md  sentencepiece.bpe.model  special_tokens_map.json tokenizer_config.json  tokenizer.json

如果你查看文件大小(例如,使用ls -lh),你应该会看到模型状态字典文件(pytorch_model.bin)是唯一一个超过400 MB的文件。

当你通过web界面创建仓库时,.gitattributes文件会自动设置为考虑某些扩展名的文件,如.bin.h5,作为大文件,git-lfs会在无需你额外设置的情况下跟踪它们。

现在,我们可以像通常使用传统Git仓库那样继续操作。我们可以使用git add命令将所有文件添加到Git的暂存区:

git add .

然后我们可以查看当前暂存的文件:

git status
On branch main
Your branch is up to date with 'origin/main'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
  modified:   .gitattributes
	new file:   config.json
	new file:   pytorch_model.bin
	new file:   sentencepiece.bpe.model
	new file:   special_tokens_map.json
	new file:   tokenizer.json
	new file:   tokenizer_config.json

同样,我们也可以使用git-lfs的status命令确保git-lfs正在跟踪正确的文件:

git lfs status
On branch main
Objects to be pushed to origin/main:


Objects to be committed:

	config.json (Git: bc20ff2)
	pytorch_model.bin (LFS: 35686c2)
	sentencepiece.bpe.model (LFS: 988bc5a)
	special_tokens_map.json (Git: cb23931)
	tokenizer.json (Git: 851ff3e)
	tokenizer_config.json (Git: f0f7783)

Objects not staged for commit:


我们可以看到,除了pytorch_model.binsentencepiece.bpe.model文件,其他所有文件都有Git处理。很好!

接下来进行最后的步骤:提交并推送到huggingface.co远程仓库:

git commit -m "First model version"
[main b08aab1] First model version
 7 files changed, 29027 insertions(+)
  6 files changed, 36 insertions(+)
 create mode 100644 config.json
 create mode 100644 pytorch_model.bin
 create mode 100644 sentencepiece.bpe.model
 create mode 100644 special_tokens_map.json
 create mode 100644 tokenizer.json
 create mode 100644 tokenizer_config.json

推送可能需要一些时间,取决于您的网络速度和文件大小:

git push
Uploading LFS objects: 100% (1/1), 433 MB | 1.3 MB/s, done.
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 12 threads
Compressing objects: 100% (9/9), done.
Writing objects: 100% (9/9), 288.27 KiB | 6.27 MiB/s, done.
Total 9 (delta 1), reused 0 (delta 0), pack-reused 0
To https://huggingface.co/lysandre/dummy
   891b41d..b08aab1  main -> main

当这一切完成后,我们可以在模型仓库中看到最近添加的文件:
在这里插入图片描述

界面允许您探索模型文件、提交记录,以及查看每个提交引入的差异:
在这里插入图片描述

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HITzwx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值