NLP Course documentation

Chia sẻ các mô hình huấn luyện trước

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Chia sẻ các mô hình huấn luyện trước

Ask a Question Open In Colab Open In Studio Lab

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:

An example of an auto-generated model card.

Ở 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:

Dummy model containing both the tokenizer and model files.

✏️ 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ạo dataset hoặc space thay vì một mô hình. Các giá trị được chấp nhận là "dataset""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:

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

Đầ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:

An empty model page after creating a new repository.

Đâ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.

The README file showing the Markdown capabilities.

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.

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

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ên dataset hoặc space thay vì một mô hình. Các giá trị được chấp nhận là "dataset""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.

✏️ Khi tạo kho lưu trữ từ giao diện web, tệp *.gitattributes* được tự động thiết lập để xem xét các tệp có phần mở rộng nhất định, chẳng hạn như *.bin* và *.h5*, là tệp lớn và git-lfs sẽ theo dõi chúng mà không có thiết lập cần thiết về phía bạn.

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.binsentencepiece.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:

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

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:

The diff introduced by the recent commit.