Chia sẻ các mô hình huấn luyện trước
Trong các bước bên dưới, chúng ta sẽ xem xét các cách dễ nhất để chia sẻ các mô hình được huấn luyện trước với 🤗 Hub. Ta có sẵn các công cụ và tiện ích giúp việc chia sẻ và cập nhật mô hình trực tiếp trên Hub trở nên đơn giản, và chúng ta sẽ cùng nhau khám phá bên dưới.
Chúng tôi khuyến khích tất cả người dùng huấn luyện mô hình đóng góp bằng cách chia sẻ chúng với cộng đồng - chia sẻ mô hình, ngay cả khi được huấn luyện trên các bộ dữ liệu rất cụ thể, sẽ giúp ích cho những người khác, giúp họ tiết kiệm thời gian và tính toán tài nguyên và cung cấp quyền truy cập vào các hiện vật hữu ích được huấn luyện. Đổi lại, bạn có thể hưởng lợi từ công việc mà những người khác đã làm!
Có ba cách để tạo kho lưu trữ mô hình mới:
- Sử dụng API
push_to_hub
- Sử dụng thư viện Python
huggingface_hub
- Sử dụng giao diện web
Khi bạn đã tạo một kho lưu trữ, bạn có thể tải tệp lên đó qua git và git-lfs. Chúng tôi sẽ hướng dẫn bạn cách tạo kho lưu trữ mô hình và tải tệp lên chúng trong các phần sau.
Sử dụng API push_to_hub
Cách đơn giản nhất để tải tệp lên Hub là tận dụng API push_to_hub
.
Trước khi đi xa hơn, bạn sẽ cần tạo token xác thực để API huggingface_hub
biết bạn là ai và bạn có quyền ghi vào không gian tên nào. Đảm bảo rằng bạn đang ở trong môi trường mà bạn đã cài đặt transformers
(xem Thiết lập). Nếu bạn đang ở trong notebook, bạn có thể sử dụng chức năng sau để đăng nhập:
from huggingface_hub import notebook_login
notebook_login()
Trên terminal, bạn có thể:
huggingface-cli login
Trong cả hai trường hợp, bạn sẽ được nhắc nhập tên người dùng và mật khẩu của mình, đó là những mật khẩu mà bạn sử dụng để đăng nhập vào Hub. Nếu bạn chưa có hồ sơ Hub, bạn nên tạo một hồ sơ tại đây.
Tuyệt vời! Bây giờ bạn có token xác thực được lưu trữ trong thư mục bộ nhớ cache của mình. Hãy tạo một số kho lưu trữ thôi!
Nếu bạn đã thử với API Trainer
để huấn luyện một mô hình, thì cách dễ nhất để tải nó lên Hub là đặt push_to_hub=True
khi bạn định nghĩa TrainingArguments
:
from transformers import TrainingArguments
training_args = TrainingArguments(
"bert-finetuned-mrpc", save_strategy="epoch", push_to_hub=True
)
Khi bạn gọi trainer.train()
, Trainer
sau đó sẽ tải mô hình của bạn lên Hub mỗi khi nó được lưu (ở đây là mỗi epoch) trong một kho lưu trữ trong không gian tên của bạn. Kho lưu trữ đó sẽ được đặt tên giống như thư mục đầu ra bạn đã chọn (ở đây là bert-finetuned-mrpc
) nhưng bạn có thể chọn một tên khác với hub_model_id = "a_different_name"
.
Để tải mô hình của bạn lên tổ chức mà bạn là thành viên, chỉ cần truyền nó vào qua hub_model_id = "my_organization/my_repo_name"
.
Sau khi quá trình huấn luyện của bạn kết thúc, bạn nên thực hiện một trainer.push_to_hub()
cuối cùng để tải lên phiên bản cuối cùng của mô hình của bạn. Nó cũng sẽ tạo ra một thẻ mô hình với tất cả các siêu dữ liệu liên quan, báo cáo các siêu tham số được sử dụng và kết quả đánh giá! Dưới đây là một ví dụ về nội dung bạn có thể tìm thấy trong một thẻ mô hình như vậy:
Ở cấp độ thấp hơn, việc truy cập Model Hub có thể được thực hiện trực tiếp trên các mô hình, tokenizer và các đối tượng cấu hình thông qua phương thức push_to_hub()
. Phương pháp này xử lý cả việc tạo kho lưu trữ và đẩy các tệp mô hình và tệp tokenizer trực tiếp đến kho lưu trữ. Không cần xử lý thủ công, không giống như với API mà chúng ta sẽ thấy bên dưới.
Để có ý tưởng về cách nó hoạt động, trước tiên chúng ta hãy khởi tạo một mô hình và một tokenizer:
from transformers import AutoModelForMaskedLM, AutoTokenizer
checkpoint = "camembert-base"
model = AutoModelForMaskedLM.from_pretrained(checkpoint)
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
Bạn có thể tự do làm bất cứ điều gì bạn muốn với những thứ này - thêm token vào trình tokenize, huấn luyện mô hình, tinh chỉnh nó. Khi bạn hài lòng với kết quả mô hình, trọng số, và tokenizer, bạn có thể tận dụng phương thức push_to_hub()
có sẵn trực tiếp trên đối tượng model
:
model.push_to_hub("dummy-model")
Điều này sẽ tạo kho lưu trữ mới dummy-model
trong hồ sơ của bạn và điền nó vào các tệp mô hình của bạn.
Làm tương tự với tokenizer để tất cả các tệp có sẵn trong kho lưu trữ này:
tokenizer.push_to_hub("dummy-model")
Nếu bạn thuộc một tổ chức, chỉ cần chỉ định tham số organization
để tải lên không gian tên của tổ chức đó:
tokenizer.push_to_hub("dummy-model", organization="huggingface")
Nếu bạn muốn sử dụng một token Hugging Face cụ thể, bạn cũng có thể chỉ định nó thông qua push_to_hub()
:
tokenizer.push_to_hub("dummy-model", organization="huggingface", use_auth_token="<TOKEN>")
Giờ hãy đi tới Model Hub để tìm mô hình mới được tải lên của bạn: https://huggingface.co/user-or-organization/dummy-model.
Nhấp vào tab “Files and versions” (“Tệp và phiên bản”) và bạn sẽ thấy các tệp hiển thị trong ảnh chụp màn hình sau:
✏️ Thử nghiệm thôi! Lấy mô hình và trình tokenize được liên kết với checkpoint bert-base-cased
và tải chúng lên kho lưu trữ trong không gian tên của bạn bằng phương thức push_to_hub()
. Kiểm tra kỹ xem repo có xuất hiện chính xác trên trang của bạn hay không trước khi xóa nó.
Như bạn đã thấy, phương thức push_to_hub()
nhận một vài tham số, giúp bạn có thể tải lên không gian tên tổ chức hoặc kho lưu trữ cụ thể hoặc sử dụng token API khác. Chúng tôi khuyên bạn nên xem thông số kỹ thuật phương pháp có sẵn trực tiếp trong 🤗 tài liệu về Transformers để biết những gì ta có thể làm.
Phương thức push_to_hub()
được hỗ trợ bởi gói Python huggingface_hub
, cung cấp một API trực tiếp đến Hugging Face Hub. Nó được tích hợp trong 🤗 Transformers và một số thư viện học máy khác, như allenlp
. Mặc dù chúng tôi tập trung vào tích hợp 🤗 Transformers trong chương này, việc tích hợp nó vào mã hoặc thư viện của riêng bạn rất đơn giản.
Chuyển đến phần cuối cùng để xem cách tải tệp lên kho lưu trữ mới tạo của bạn!
Sử dụng thư viện Python huggingface_hub
Thư viện Python huggingface_hub
là một gói cung cấp một bộ công cụ cho các hub mô hình và tập dữ liệu. Nó cung cấp các phương thức và lớp đơn giản cho các tác vụ phổ biến như tiếp nhận thông tin về kho lưu trữ trên hub và quản lý chúng. Nó cung cấp các API đơn giản hoạt động trên git để quản lý nội dung của các kho đó và tích hợp Hub trong các dự án và thư viện của bạn.
Tương tự như việc sử dụng API push_to_hub
, điều này sẽ yêu cầu bạn lưu token API vào bộ nhớ cache của mình. Để thực hiện việc này, bạn sẽ cần sử dụng lệnh login
từ CLI, như đã đề cập trong phần trước (một lần nữa, hãy đảm bảo thêm các lệnh này với ký tự !
nếu chạy trên Google Colab):
huggingface-cli login
Gói huggingface_hub
cung cấp một số phương thức và lớp hữu ích cho mục đích của chúng ta. Thứ nhất, có một số phương pháp để quản lý việc tạo, xóa kho lưu trữ và các phương pháp khác:
from huggingface_hub import (
# Quản lý người dùng
login,
logout,
whoami,
# Tạo và quản lý kho dữ liệu
create_repo,
delete_repo,
update_repo_visibility,
# Và một số phương thức truy xuất/thay đổi thông tin về mặt nội dung
list_models,
list_datasets,
list_metrics,
list_repo_files,
upload_file,
delete_file,
)
Ngoài ra, nó cung cấp lớp Repository
rất mạnh mẽ để quản lý một kho lưu trữ cục bộ. Chúng ta sẽ khám phá các phương thức này và lớp đó trong phần tiếp theo để hiểu cách tận dụng chúng.
Phương thức create_repo
có thể được sử dụng để tạo một kho lưu trữ mới trên hub:
from huggingface_hub import create_repo
create_repo("dummy-model")
Thao tác này sẽ tạo kho lưu trữ dummy-model
trong không gian tên của bạn. Nếu muốn, bạn có thể chỉ định tổ chức nào mà kho lưu trữ sẽ thuộc về bằng cách sử dụng tham số organization
:
from huggingface_hub import create_repo
create_repo("dummy-model", organization="huggingface")
Thao tác này sẽ tạo kho lưu trữ dummy-model
trong không gian tên huggingface
, giả sử bạn thuộc tổ chức đó.
Các tham số có thể hữu ích khác là:
private
, để chỉ định xem liệu kho lưu trữ có nên hiển thị với những người khác hay không.token
, nếu bạn muốn ghi đè token được lưu trữ trong bộ nhớ cache của mình bằng một token nhất định.repo_type
, nếu bạn muốn tạodataset
hoặcspace
thay vì một mô hình. Các giá trị được chấp nhận là"dataset"
và"space"
.
Khi kho lưu trữ được tạo, chúng ta nên thêm tệp vào đó! Chuyển sang phần tiếp theo để xem ba cách có thể xử lý vấn đề này.
Sử dụng giao diện web
Giao diện web cung cấp các công cụ để quản lý kho lưu trữ trực tiếp trong Hub. Sử dụng giao diện này, bạn có thể dễ dàng tạo kho lưu trữ, thêm tệp (thậm chí cả tệp lớn!), Khám phá các mô hình, trực quan hóa các điểm khác biệt và hơn thế nữa.
Để tạo một kho lưu trữ mới, hãy truy cập huggingface.co/new:
Đầu tiên, chỉ định chủ sở hữu của kho lưu trữ: đây có thể là bạn hoặc bất kỳ tổ chức nào mà bạn liên kết. Nếu bạn chọn một tổ chức, mô hình sẽ được giới thiệu trên trang của tổ chức và mọi thành viên của tổ chức sẽ có khả năng đóng góp vào kho lưu trữ.
Tiếp theo, nhập tên mô hình của bạn. Đây cũng sẽ là tên của kho lưu trữ. Cuối cùng, bạn có thể chỉ định xem bạn muốn mô hình của mình là công khai hay riêng tư. Các mô hình tư nhân được ẩn khỏi chế độ xem công khai.
Sau khi tạo kho mô hình, bạn sẽ thấy một trang như sau:
Đây là nơi mô hình của bạn sẽ được lưu trữ. Để bắt đầu điền nó, bạn có thể thêm tệp README trực tiếp từ giao diện web.
Tệp README nằm trong Markdown - hãy thoải mái sử dụng nó! Phần thứ ba của chương này dành riêng cho việc xây dựng một thẻ mô hình. Đây là những điều quan trọng hàng đầu trong việc mang lại giá trị cho mô hình của bạn, vì chúng là nơi bạn nói cho người khác biết nó có thể làm gì.
Nếu bạn nhìn vào tab “Files and versions” hay “Tệp và phiên bản”, bạn sẽ thấy rằng chưa có nhiều tệp ở đó - chỉ có README.md bạn vừa tạo và tệp .gitattributes theo dõi các tệp lớn.
Tiếp theo, chúng ta sẽ xem xét cách thêm một số tệp mới.
Tải các tệp mô hình
Hệ thống quản lý tệp trên Hugging Face Hub dựa trên git cho các tệp thông thường và git-lfs (viết tắt của Git Large File Storage) cho các tệp lớn hơn .
Trong phần tiếp theo, chúng ta sẽ xem xét ba cách khác nhau để tải tệp lên Hub: thông qua huggingface_hub
và thông qua lệnh git.
Phương pháp upload_file
Sử dụng upload_file
không yêu cầu cài đặt git và git-lfs trên hệ thống của bạn. Nó đẩy các tệp trực tiếp đến 🤗 Hub bằng cách sử dụng các yêu cầu HTTP POST. Một hạn chế của phương pháp này là nó không xử lý các tệp có kích thước lớn hơn 5GB.
Nếu tệp của bạn lớn hơn 5GB, vui lòng làm theo hai phương pháp khác được nêu chi tiết bên dưới.
API có thể được sử dụng như sau:
from huggingface_hub import upload_file
upload_file(
"<path_to_file>/config.json",
path_in_repo="config.json",
repo_id="<namespace>/dummy-model",
)
Thao tác này sẽ tải tệp config.json
có sẵn tại <path_to_file>
vào thư mục gốc của kho lưu trữ là config.json
, vào kho lưu trữ dummy-model
.
Các tham số có thể hữu ích khác là:
token
, nếu bạn muốn ghi đè token được lưu trữ trong bộ nhớ cache của mình bằng một token nhất định.repo_type
, nếu bạn muốn tải lêndataset
hoặcspace
thay vì một mô hình. Các giá trị được chấp nhận là"dataset"
và"space"
.
Lớp Repository
Lớp Repository
quản lý một kho lưu trữ cục bộ theo cách giống như git. Nó tóm tắt hầu hết các điểm khó khăn mà người ta có thể có với git để cung cấp tất cả các tính năng mà chúng tôi yêu cầu.
Sử dụng lớp này yêu cầu phải cài đặt git và git-lfs, vì vậy hãy đảm bảo rằng bạn đã cài đặt git-lfs (xem tại đây để biết hướng dẫn cài đặt) và thiết lập trước khi bắt đầu.
Để bắt đầu chơi với kho lưu trữ chúng ta vừa tạo, chúng ta có thể bắt đầu bằng cách khởi tạo nó vào một thư mục cục bộ bằng cách sao chép kho lưu trữ từ xa:
from huggingface_hub import Repository
repo = Repository("<path_to_dummy_folder>", clone_from="<namespace>/dummy-model")
Thao tác này đã tạo thư mục <path_to_dummy_folder>
trong thư mục làm việc của chúng ta. Thư mục này chỉ chứa tệp .gitattributes
vì đó là tệp duy nhất được tạo khi khởi tạo kho lưu trữ thông qua create_repo
.
Từ thời điểm này, chúng ta có thể tận dụng một số phương pháp git truyền thống:
repo.git_pull() repo.git_add() repo.git_commit() repo.git_push() repo.git_tag()
Và những cái khác! Chúng tôi khuyên bạn nên xem tài liệu về Repository
hay Kho lưu trữ
có sẵn tại đây để biết tổng quan về tất cả các phương pháp.
Hiện tại, chúng ta có một mô hình và một tokenizer mà ta muốn đưa vào Hub. Chúng ta đã nhân bản thành công kho lưu trữ, do đó chúng tôi có thể lưu các tệp trong kho lưu trữ đó.
Trước tiên, chúng tôi đảm bảo rằng bản sao cục bộ được cập nhật bằng cách kéo về những thay đổi mới nhất:
repo.git_pull()
Sau đó, ta lưu mô hình và tệp tokenizer:
model.save_pretrained("<path_to_dummy_folder>")
tokenizer.save_pretrained("<path_to_dummy_folder>")
<path_to_dummy_folder>
bây giờ chứa tất cả các tệp mô hình và tokenizer. Chúng ta thực hiện theo quy trình làm việc git thông thường bằng cách thêm tệp vào khu vực lưu trữ thay đổi, cam kết chúng và đẩy chúng vào hub:
repo.git_add()
repo.git_commit("Thêm mô hình và tệp tokenizer")
repo.git_push()
Xin chúc mừng! Bạn vừa đẩy các tệp đầu tiên của mình lên Hub.
Phương pháp dựa trên git
Đây là cách tiếp cận rất đơn giản để tải tệp lên: chúng ta sẽ làm trực tiếp với git và git-lfs. Hầu hết khó khăn đã được loại bỏ bởi các cách tiếp cận trước đây, nhưng có một số lưu ý với phương pháp tiếp theo, vì vậy chúng ta sẽ theo một trường hợp sử dụng phức tạp hơn.
Sử dụng lớp này yêu cầu phải cài đặt git và git-lfs, vì vậy hãy đảm bảo bạn đã cài đặt git-lfs (xem hướng dẫn cài đặt tại đây) và cài đặt trước khi bắt đầu .
Trước tiên, hãy bắt đầu bằng cách khởi tạo git-lfs:
git lfs install
Updated git hooks. Git LFS initialized.
Sau khi hoàn tất, bước đầu tiên là sao chép kho lưu trữ mô hình của bạn:
git clone https://huggingface.co/<namespace>/<your-model-id>
Tên người dùng của tôi là lysandre
và ta đã sử dụng tên mô hình là dummy
, vì vậy lệnh kết thúc như sau:
git clone https://huggingface.co/lysandre/dummy
Bây giờ ta có một thư mục tên dummy trong thư mục làm việc của mình. Ta có thể cd
vào thư mục và xem nội dung:
cd dummy && ls
README.md
Nếu bạn vừa tạo kho lưu trữ của mình bằng phương pháp create_repo
của Hugging Face Hub, thì thư mục này chỉ nên chứa tệp .gitattributes
ẩn. Nếu bạn đã làm theo hướng dẫn trong phần trước để tạo kho lưu trữ bằng giao diện web, thì thư mục phải chứa một tệp README.md duy nhất cùng với tệp .gitattributes
ẩn, như được hiển thị ở đây.
Việc thêm một tệp có kích thước thông thường, chẳng hạn như tệp cấu hình, tệp từ vựng hoặc về cơ bản là bất kỳ tệp nào dưới vài megabyte, được thực hiện chính xác như cách người ta làm trong bất kỳ hệ thống dựa trên git nào. Tuy nhiên, các tệp lớn hơn phải được đăng ký thông qua git-lfs để đẩy chúng lên huggingface.co.
Hãy quay lại Python một chút để tạo một mô hình và trình tokenize mà chúng ta muốn cam kết với kho lưu trữ dummy của chúng ta:
from transformers import AutoModelForMaskedLM, AutoTokenizer
checkpoint = "camembert-base"
model = AutoModelForMaskedLM.from_pretrained(checkpoint)
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
# Làm bất cứ điều gì với mô hình, huấn luyện nó, tinh chỉnh nó ...
model.save_pretrained("<path_to_dummy_folder>")
tokenizer.save_pretrained("<path_to_dummy_folder>")
Bây giờ chúng ta đã lưu một số tạo tác mô hình và tokenizer, hãy xem xét lại thư mục dummy:
ls
config.json pytorch_model.bin README.md sentencepiece.bpe.model special_tokens_map.json tokenizer_config.json tokenizer.json
Nếu bạn nhìn vào kích thước tệp (ví dụ: với ls -lh
), bạn sẽ thấy rằng tệp dict trạng thái mô hình (pytorch_model.bin) là ngoại lệ duy nhất, với hơn 400 MB.
Bây giờ chúng ta có thể tiếp tục và tiến hành như chúng ta thường làm với các kho lưu trữ Git truyền thống. Chúng ta có thể thêm tất cả các tệp vào môi trường dàn dựng của Git bằng lệnh git add
:
git add .
Sau đó, chúng ta có thể xem xét các tệp hiện đang được sắp xếp:
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
Tương tự, chúng ta có thể đảm bảo rằng git-lfs đang theo dõi các tệp chính xác bằng cách sử dụng lệnh status
:
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:
Chúng ta có thể thấy rằng tất cả các tệp đều có Git
làm trình xử lý, ngoại trừ pytorch_model.bin và sentencepiece.bpe.model, cóLFS
. Tuyệt vời!
Hãy tiến hành các bước cuối cùng, cam kết và đẩy đến kho lưu trữ từ xa 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
Việc đẩy có thể mất một chút thời gian, tùy thuộc vào tốc độ kết nối internet và kích thước tệp của bạn:
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
Nếu chúng ta xem qua kho lưu trữ mô hình khi quá trình này kết thúc, chúng ta có thể thấy tất cả các tệp được thêm gần đây:
Giao diện người dùng cho phép bạn khám phá các tệp mô hình và các cam kết cũng như xem sự khác biệt được giới thiệu bởi mỗi cam kết: