NLP 課程文件

分享預訓練模型

Hugging Face's logo
加入 Hugging Face 社群

並獲取增強文件體驗

開始

分享預訓練模型

Ask a Question Open In Colab Open In Studio Lab

在下面的步驟中,我們將瞭解將預訓練模型共享到 🤗 Hub 的最簡單方法。有一些工具和實用程式可用於輕鬆地在 Hub 上直接共享和更新模型,我們將在下面探討這些工具和實用程式。

我們鼓勵所有訓練模型的使用者透過與社群共享模型來做出貢獻——即使在非常特定的資料集上訓練的模型,共享它們也將幫助其他人,為他們節省時間和計算資源,並提供對有用訓練工件的訪問。反過來,您也可以從其他人所做的工作中受益!

建立新的模型儲存庫有三種方法

  • 使用 push_to_hub API
  • 使用 huggingface_hub Python 庫
  • 使用 Web 介面

建立儲存庫後,您可以透過 git 和 git-lfs 將檔案上傳到其中。我們將在以下部分引導您完成建立模型儲存庫和將檔案上傳到其中的過程。

使用 push_to_hub API

利用 push_to_hub API 是將檔案上傳到 Hub 的最簡單方法。

在繼續之前,您需要生成一個身份驗證令牌,以便 huggingface_hub API 知道您的身份以及您具有寫入訪問許可權的名稱空間。確保您處於已安裝 transformers 的環境中(請參閱 設定)。如果您在筆記本中,可以使用以下函式登入

from huggingface_hub import notebook_login

notebook_login()

在終端中,您可以執行

huggingface-cli login

在這兩種情況下,系統都應提示您輸入您的使用者名稱和密碼,這些使用者名稱和密碼與您用於登入 Hub 的使用者名稱和密碼相同。如果您還沒有 Hub 個人資料,則應在此處建立一個。

太好了!您現在已將身份驗證令牌儲存在快取資料夾中。讓我們建立一些儲存庫!

如果您已使用 Trainer API 訓練過模型,則將其上傳到 Hub 的最簡單方法是在定義 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 將在每次儲存模型時(此處為每個 epoch)將其上傳到 Hub,儲存在您名稱空間中的儲存庫中。該儲存庫將以您選擇的輸出目錄(此處為 bert-finetuned-mrpc)命名,但您可以使用 hub_model_id = "a_different_name" 選擇其他名稱。

要將您的模型上傳到您是成員的組織,只需使用 hub_model_id = "my_organization/my_repo_name" 傳遞它即可。

訓練完成後,您應該執行最終的 trainer.push_to_hub() 以上傳模型的最新版本。它還會生成一個包含所有相關元資料的模型卡片,報告使用的超引數和評估結果!以下是一個您可能在模型卡片中找到的內容示例

An example of an auto-generated model card.

在較低級別,可以透過模型、分詞器和配置物件透過其 push_to_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

單擊“檔案和版本”選項卡,您應該會看到以下螢幕截圖中顯示的檔案

Dummy model containing both the tokenizer and model files.

✏️ **試一試!** 獲取與 bert-base-cased 檢查點關聯的模型和分詞器,並使用 push_to_hub() 方法將它們上傳到您名稱空間中的儲存庫。在刪除它之前,請仔細檢查儲存庫是否已正確顯示在您的頁面上。

如您所見,push_to_hub() 方法接受多個引數,從而可以上傳到特定儲存庫或組織名稱空間,或使用不同的 API 令牌。我們建議您檢視 🤗 Transformers 文件 中直接提供的該方法規範,以瞭解其可能性。

push_to_hub() 方法由 huggingface_hub Python 包支援,該包提供了 Hugging Face Hub 的直接 API。它整合在 🤗 Transformers 和其他幾個機器學習庫(如 allenlp)中。儘管我們在本章中重點介紹了 🤗 Transformers 整合,但將其整合到您自己的程式碼或庫中非常簡單。

跳轉到最後一節,瞭解如何將檔案上傳到您新建立的儲存庫!

使用 huggingface_hub Python 庫

huggingface_hub Python 庫是一個提供模型和資料集中心工具集的軟體包。它提供了一些簡單的方法和類,用於執行常見任務,例如獲取有關中心上儲存庫的資訊以及管理它們。它提供基於 Git 的簡單 API,用於管理這些儲存庫的內容,並將中心整合到您的專案和庫中。

類似於使用 push_to_hub API,這需要您將 API 令牌儲存在快取中。為此,您需要使用 CLI 中的 login 命令,如上一節所述(同樣,如果您在 Google Colab 中執行,請確保在這些命令前加上 ! 字元)。

huggingface-cli login

huggingface_hub 包提供了幾種對我們的目的有用的方法和類。首先,有一些方法可以管理儲存庫的建立、刪除等。

from huggingface_hub import (
    # User management
    login,
    logout,
    whoami,

    # Repository creation and management
    create_repo,
    delete_repo,
    update_repo_visibility,

    # And some methods to retrieve/change information about the content
    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"

建立儲存庫後,我們應該向其中新增檔案!請跳到下一節檢視處理此問題的三種方法。

使用網頁介面

網頁介面提供了直接在中心管理儲存庫的工具。使用該介面,您可以輕鬆建立儲存庫、新增檔案(即使是大型檔案!)、瀏覽模型、視覺化差異等等。

要建立新的儲存庫,請訪問 huggingface.co/new

Page showcasing the model used for the creation of a new model repository.

首先,指定儲存庫的所有者:可以是您自己或您所屬的任何組織。如果您選擇一個組織,該模型將在該組織的頁面上展示,並且該組織的每個成員都將能夠為該儲存庫做出貢獻。

接下來,輸入模型的名稱。這也將是儲存庫的名稱。最後,您可以指定希望模型是公開還是私有。私有模型對公眾隱藏。

建立模型儲存庫後,您應該會看到如下頁面

An empty model page after creating a new repository.

這是您的模型將託管的位置。要開始填充它,您可以直接從網頁介面新增 README 檔案。

The README file showing the Markdown capabilities.

README 檔案使用 Markdown 格式編寫——請隨意使用它!本章的第三部分專門介紹構建模型卡片。它們對於提升模型價值至關重要,因為您可以在其中告訴其他人它能做什麼。

如果您檢視“檔案和版本”選項卡,您會發現那裡還沒有很多檔案——只有您剛剛建立的 README.md 和跟蹤大型檔案的 .gitattributes 檔案。

The 'Files and versions' tab only shows the .gitattributes and README.md files.

我們將在接下來看看如何新增一些新檔案。

上傳模型檔案

Hugging Face 中心上管理檔案的系統基於 Git 處理常規檔案,並使用 Git LFS(代表 Git 大型檔案儲存)處理較大的檔案。

在下一節中,我們將介紹三種將檔案上傳到中心的不同方法:透過 huggingface_hub 和透過 Git 命令。

upload_file 方法

使用 upload_file 不需要在您的系統上安裝 Git 和 Git LFS。它使用 HTTP POST 請求將檔案直接推送到 🤗 中心。這種方法的限制是它無法處理大小超過 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 作為 config.json 上傳到儲存庫的根目錄,到 dummy-model 儲存庫。其他可能有用的引數包括:

  • token,如果您想使用給定令牌覆蓋儲存在快取中的令牌。
  • repo_type,如果您想上傳到 datasetspace 而不是模型。可接受的值為 "dataset""space"

Repository

Repository 類以類似 Git 的方式管理本地儲存庫。它抽象化了 Git 中的大多數痛點,以提供我們所需的所有功能。

使用此類需要安裝 Git 和 Git LFS,因此請確保已安裝 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 文件,以概述所有可用方法。

目前,我們有一個模型和一個標記器,我們希望將其推送到中心。我們已成功克隆了儲存庫,因此可以將檔案儲存在該儲存庫中。

我們首先確保我們的本地克隆是最新的,方法是拉取最新的更改:

repo.git_pull()

完成後,我們儲存模型和標記器檔案:

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

<path_to_dummy_folder> 現在包含所有模型和標記器檔案。我們按照通常的 Git 工作流程,將檔案新增到暫存區,提交它們並將其推送到中心:

repo.git_add()
repo.git_commit("Add model and tokenizer files")
repo.git_push()

恭喜!您剛剛將您的第一個檔案推送到中心。

基於 Git 的方法

這是上傳檔案的非常基礎的方法:我們將直接使用 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 到該資料夾並檢視其內容:

cd dummy && ls
README.md

如果您剛剛使用 Hugging Face 中心的 create_repo 方法建立了儲存庫,則此資料夾應該只包含一個隱藏的 .gitattributes 檔案。如果您按照上一節中的說明使用網頁介面建立了儲存庫,則該資料夾應該包含一個 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)

# Do whatever with the model, train it, fine-tune it...

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

類似地,我們可以使用其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:

我們可以看到所有檔案都具有Git作為處理程式,除了pytorch_model.binsentencepiece.bpe.model,它們具有LFS。太好了!

讓我們繼續執行最後幾個步驟,提交併推送到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

如果我們完成此操作後檢視模型儲存庫,我們可以看到所有最近新增的檔案。

The 'Files and versions' tab now contains all the recently uploaded files.

UI 允許您瀏覽模型檔案和提交,並檢視每次提交引入的差異。

The diff introduced by the recent commit.

© . This site is unofficial and not affiliated with Hugging Face, Inc.