Przygotowywanie danych do precyzyjnego dostrajania modeli twarzy
W tym artykule pokazano, jak przygotować dane do precyzyjnego dostrajania dużych modeli językowych typu open source przy użyciu funkcji Hugging Face Transformers i Hugging Face Datasets.
Wymagania
- Środowisko Databricks Runtime dla usługi Machine Learning w wersji 13.0 lub nowszej. W przykładach w tym przewodniku użyto zestawów danych funkcji Hugging Face, które znajdują się w środowisku Databricks Runtime 13.0 ML i nowszych wersjach.
- Obszar roboczy z włączonym Unity Catalog. Musisz również mieć następujące uprawnienia, aby zapisywać dane w woluminie Unity Catalog.
- Uprawnienia do zapisu na woluminie, do którego chcesz przekazać pliki.
- Uprawnienie USE SCHEMA w schemacie nadrzędnym.
- Uprawnienie USE CATALOG w katalogu nadrzędnym.
- Znaczne zasoby obliczeniowe do pobierania dużych zestawów danych. Pobranie dużego zestawu danych używanego w dostarczonym przykładowym notatniku trwa dłużej niż dzień.
Ładowanie danych z przytulania twarzy
Przytulanie zestawów danych twarzy to biblioteka przytulania twarzy do uzyskiwania dostępu do zestawów danych i udostępniania ich na potrzeby zadań przetwarzania audio, przetwarzania obrazów i języka naturalnego (NLP). Przytulanie twarzy datasets
umożliwia ładowanie danych z różnych miejsc. Biblioteka datasets
zawiera narzędzia do odczytywania zestawów danych z usługi Hugging Face Hub. Istnieje wiele zestawów danych, które można pobrać i odczytać z narzędzia Hugging Face Hub przy użyciu load_dataset
funkcji . Dowiedz się więcej na temat ładowania danych za pomocą zestawów danych funkcji Przytulanie twarzy w dokumentacji przytulania twarzy.
from datasets import load_dataset
dataset = load_dataset("imdb")
Niektóre zestawy danych w centrum rozpoznawania twarzy hugging udostępniają rozmiary danych, które są pobierane i generowane podczas load_dataset
wywoływana. Możesz użyć load_dataset_builder
polecenia , aby poznać rozmiary przed pobraniem zestawu danych za pomocą load_dataset
polecenia .
from datasets import load_dataset_builder
from psutil._common import bytes2human
def print_dataset_size_if_provided(*args, **kwargs):
dataset_builder = load_dataset_builder(*args, **kwargs)
if dataset_builder.info.download_size and dataset_builder.info.dataset_size:
print(f'download_size={bytes2human(dataset_builder.info.download_size)}, dataset_size={bytes2human(dataset_builder.info.dataset_size)}')
else:
print('Dataset size is not provided by uploader')
print_dataset_size_if_provided("imdb")
Aby uzyskać wskazówki dotyczące pobierania i przygotowywania zestawów danych w usłudze Azure Databricks, zobacz notes Hugging Face best practices (Pobieranie zestawów danych z usługi Hugging Face best practices) w celu uzyskania wskazówek dotyczących pobierania i przygotowywania zestawów danych w usłudze Azure Databricks dla różnych rozmiarów danych.
Formatowanie danych treningowych i ewaluacyjnych
Aby użyć własnych danych do dostosowywania modelu, musisz najpierw sformatować dane szkoleniowe i ewaluacyjne w ramkach danych platformy Spark. Następnie załaduj ramki danych przy użyciu biblioteki Przytulanie twarzy datasets
.
Zacznij od sformatowania danych treningowych w tabeli spełniającej oczekiwania trenera. W przypadku klasyfikacji tekstu jest to tabela z dwiema kolumnami: kolumną tekstową i kolumną etykiet.
Aby przeprowadzić dostrajanie, należy podać model. Biblioteka AutoKlas autoklas funkcji Przytulania twarzy ułatwia ładowanie modeli i ustawień konfiguracji, w tym szeroką gamę funkcji Auto Models
języka naturalnego.
Na przykład funkcja Hugging Face transformers
udostępnia AutoModelForSequenceClassification
jako moduł ładujący modelu klasyfikacji tekstu, który oczekuje identyfikatorów liczb całkowitych jako etykiet kategorii. Jeśli jednak masz ramkę danych z etykietami ciągów, musisz również określić mapowania między etykietami liczb całkowitych i etykietami ciągów podczas tworzenia modelu. Te informacje można zebrać w następujący sposób:
labels = df.select(df.label).groupBy(df.label).count().collect()
id2label = {index: row.label for (index, row) in enumerate(labels)}
label2id = {row.label: index for (index, row) in enumerate(labels)}
Następnie utwórz identyfikatory liczb całkowitych jako kolumnę etykiety z funkcją UDF biblioteki Pandas:
from pyspark.sql.functions import pandas_udf
import pandas as pd
@pandas_udf('integer')
def replace_labels_with_ids(labels: pd.Series) -> pd.Series:
return labels.apply(lambda x: label2id[x])
df_id_labels = df.select(replace_labels_with_ids(df.label).alias('label'), df.text)
Ładowanie zestawu danych przytulania twarzy z ramki danych platformy Spark
Przytulanie twarzy datasets
obsługuje ładowanie z ramek danych platformy Spark przy użyciu polecenia datasets.Dataset.from_spark
. Zapoznaj się z dokumentacją funkcji Hugging Face, aby dowiedzieć się więcej o metodzie from_spark().
Jeśli na przykład masz i train_df
test_df
ramki danych, możesz utworzyć zestawy danych dla każdego z następujących kodów:
import datasets
train_dataset = datasets.Dataset.from_spark(train_df, cache_dir="/Volumes/main/default/my-volume/train")
test_dataset = datasets.Dataset.from_spark(test_df, cache_dir="/Volumes/main/default/my-volume/test")
Dataset.from_spark
Buforuje zestaw danych. W tym przykładzie opisano trenowanie modelu na sterowniku, więc dane muszą zostać udostępnione. Ponadto, ponieważ materializacja pamięci podręcznej jest równoległa przy użyciu platformy Spark, podana cache_dir
wartość musi być dostępna dla wszystkich procesów roboczych. Aby spełnić te ograniczenia, cache_dir
powinna być ścieżką woluminu Unity Catalog .
Można zarządzać dostępem do woluminu przy użyciu Unity Catalog.
Jeśli zestaw danych jest duży, zapisanie go w katalogu Unity może potrwać długo. Aby przyspieszyć proces, możesz użyć parametru working_dir
, aby Hugging Face datasets
zapisało zestaw danych w lokalizacji tymczasowej na dysku, a następnie przenieść go do Unity Catalog. Aby na przykład użyć dysku SSD jako lokalizacji tymczasowej:
import datasets
dataset = datasets.Dataset.from_spark(
train_df,
cache_dir="/Volumes/main/default/my-volume/train",
working_dir="/local_disk0/tmp/train",
)
Buforowanie zestawów danych
Pamięć podręczna jest jednym ze sposobów datasets
poprawy wydajności. Przechowuje wszystkie pobrane i przetworzone zestawy danych, więc gdy użytkownik musi używać pośrednich zestawów danych, są one ponownie ładowane bezpośrednio z pamięci podręcznej.
Domyślny katalog pamięci podręcznej zestawów danych to ~/.cache/huggingface/datasets
. Po zakończeniu działania klastra dane pamięci podręcznej również zostaną utracone. Aby utrwalić plik pamięci podręcznej po zakończeniu działania klastra, usługa Databricks zaleca zmianę lokalizacji pamięci podręcznej na ścieżkę woluminu katalogu Unity poprzez ustawienie zmiennej środowiskowej HF_DATASETS_CACHE
:
import os
os.environ["HF_DATASETS_CACHE"] = "/Volumes/main/default/my-volume/"
Dostrajanie modelu
Gdy dane są gotowe, możesz użyć ich do dostosowania modelu przytulania twarzy.
Notes: pobieranie zestawów danych z funkcji Przytulanie twarzy
Ten przykładowy notes zawiera zalecane najlepsze rozwiązania dotyczące używania funkcji Hugging Face load_dataset
do pobierania i przygotowywania zestawów danych w usłudze Azure Databricks dla różnych rozmiarów danych.