Hướng dẫn cơ bản về HuggingFace trong học máy lớn

Giới thiệu về HuggingFace

HuggingFace hiện là nền tảng thiết yếu khi làm việc với mô hình ngôn ngữ lớn (LLM), tương tự vai trò của PyTorch trong mạng nơ-ron. Đây không chỉ là nơi chia sẻ mô hình, mà đã phát triển thành một hệ sinh thái AI hoàn chỉnh, hỗ trợ xử lý ngôn ngữ tự nhiên (NLP), thị giác máy tính, xử lý âm thanh và các tác vụ đa phương thức.

Hệ sinh thái HuggingFace gồm hai thành phần chính:

  1. HuggingFace Hub: Nền tảng lưu trữ và chia sẻ mô hình, bộ dữ liệu và ứng dụng AI. Do hạn chế truy cập tại Việt Nam, người dùng thường sử dụng HF-Mirror – phiên bản mirror trong nước. Ngoài ra, ModelScope (MaDa) cũng là lựa chọn thay thế phổ biến.
  2. Các thư viện chính: Ba thư viện cốt lõi cần nắm vững:
    • Transformers: Dùng để tải, huấn luyện và lưu mô hình. Phương thức from_pretrained() cho phép tải trực tiếp mô hình công khai từ kho.
    • Tokenizers: Công cụ chuyển văn bản thành định dạng đầu vào phù hợp với mô hình như mã hóa token, thêm padding, attention mask, v.v. Mỗi mô hình có tokenizer riêng do thuật toán phân đoạn khác nhau (BPE, WordPiece...).
    • Datasets: Thư viện xử lý dữ liệu hiệu quả, hỗ trợ nhiều định dạng như JSON, CSV, Parquet.

Cài đặt các gói cần thiết:

pip install transformers datasets tokenizers

Tải và sử dụng mô hình dự huấn luyện

Để tránh vấn đề truy cập, người dùng Windows nên thiết lập biến môi trường HF_ENDPOINT=https://hf-mirror.com. Mô hình sẽ được tự động tải từ mirror và lưu cache tại ~/.cache/huggingface/hub/.

Sử dụng AutoModel.from_pretrained() để tải mô hình:

from transformers import AutoModel

model = AutoModel.from_pretrained("google-bert/bert-base-chinese")

Đối với mô hình đã tải sẵn, chỉ cần truyền đường dẫn thư mục chứa cấu hình và trọng số.

Thêm lớp đầu ra cho tác vụ cụ thể

Mô hình cơ sở chỉ cung cấp kiến trúc đặc trưng. Để áp dụng vào tác vụ như phân loại câu, cần thêm lớp đầu ra phù hợp. Ví dụ: sử dụng AutoModelForSequenceClassification để xây dựng mô hình phân tích cảm xúc:

from transformers import AutoModelForSequenceClassification

model_with_head = AutoModelForSequenceClassification.from_pretrained(
    "google-bert/bert-base-chinese", 
    num_labels=5
)

Sử dụng Tokenizer

Thư viện Transformers cung cấp AutoTokenizer để tự động tải tokenizer tương thích với mô hình:

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-chinese")

Tokenizer thực hiện các bước: phân đoạn → mã hóa token → thêm token đặc biệt ([CLS], [SEP]) → padding/truncate theo độ dài quy định.

Phương thức tokenizer() (gọi thông qua __call__) tích hợp toàn bộ quá trình xử lý và trả về định dạng đầu vào mô hình:

inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")

Kết quả bao gồm: input_ids, attention_mask, và token_type_ids (đối với cặp câu). Dữ liệu này có thể truyền trực tiếp vào mô hình.

Kết hợp mô hình và tokenizer

Ví dụ minh họa cách xử lý batch dữ liệu:

import torch
from transformers import AutoModel, AutoTokenizer

texts = [
    "Cuộc sống thật tươi đẹp.",
    "Tôi yêu xử lý ngôn ngữ tự nhiên."
]

tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-chinese")
model = AutoModel.from_pretrained("google-bert/bert-base-chinese")

inputs = tokenizer(texts, padding=True, return_tensors="pt")
with torch.no_grad():
    outputs = model(**inputs)

print(outputs.last_hidden_state.shape)  # [batch_size, seq_len, hidden_dim]
print(outputs.pooler_output.shape)      # [batch_size, hidden_dim]

Đối với mô hình có lớp đầu ra, đầu ra bao gồm logitsloss (nếu cung cấp nhãn). Hàm mất mát mặc định là CrossEntropyLoss, tính trung bình trên toàn batch.

Thư viện Datasets

Datasets đóng vai trò cầu nối giữa dữ liệu thô và mô hình. Các chức năng chính:

  • Tải dữ liệu từ file cục bộ hoặc kho HuggingFace.
  • Xử lý hàng loạt bằng phương thức map().
  • Lọc, chọn cột, chia tập huấn luyện - kiểm thử.

Tải dữ liệu từ file JSON:

from datasets import load_dataset

dataset = load_dataset("json", data_files="data.json")

Kết quả trả về đối tượng DatasetDict – một từ điển chứa các Dataset. Mỗi Dataset là bảng dữ liệu tổ chức theo cột, khác với DataLoader của PyTorch.

Chuyển đổi sang DataFrame để xem:

df = dataset["train"].to_pandas()

Xử lý kiểu dữ liệu và chia tập

Kiểu dữ liệu của từng cột được quản lý bằng thuộc tính features. Với nhãn dạng văn bản (ví dụ: "positive", "negative"), nên dùng kiểu ClassLabel:

from datasets import ClassLabel

dataset = dataset.cast_column("label", ClassLabel(names=["neg", "pos"]))

Việc này giúp duy trì ánh xạ giữa số nguyên và nhãn gốc, hỗ trợ tốt cho đánh giá sau huấn luyện.

Mã hóa dữ liệu hàng loạt

Sử dụng map() để áp dụng tokenizer lên toàn bộ tập dữ liệu:

def tokenize_function(examples):
    return tokenizer(examples["text"], truncation=True, padding="max_length")

tokenized_dataset = dataset.map(tokenize_function, batched=True)

Thao tác này thêm các trường input_ids, attention_mask vào mỗi mẫu dữ liệu.

Lưu và tải dữ liệu đã xử lý

Để tái sử dụng, có thể lưu Dataset hoặc DatasetDict dưới định dạng Arrow – định dạng nhị phân hiệu suất cao:

tokenized_dataset.save_to_disk("processed_data/")
loaded_dataset = load_from_disk("processed_data/")

Ngoài ra, có thể xuất sang CSV/JSON nếu cần khả năng đọc hiểu:

tokenized_dataset["train"].to_csv("train.csv")

Kết nối với DataLoader của PyTorch

Dữ liệu đã mã hóa có thể tích hợp trực tiếp với DataLoader nhờ việc triển khai các phương thức __len____getitem__.

Trước đó, cần thiết lập định dạng trả về là tensor:

tokenized_dataset.set_format(type="torch", columns=["input_ids", "attention_mask", "label"])

Sử dụng trong vòng lặp huấn luyện:

from torch.utils.data import DataLoader

dataloader = DataLoader(tokenized_dataset["train"], batch_size=8, shuffle=True)

for batch in dataloader:
    outputs = model(**batch)
    loss = outputs.loss
    loss.backward()
    # Cập nhật trọng số...

Thẻ: Transformers tokenizers datasets HuggingFace PyTorch

Đăng vào ngày 6 tháng 9 lúc 13:58