Pular para o conteúdo principal

Preparar dados para o ajuste fino dos modelos Hugging Face

Este artigo demonstra como preparar seus dados para o ajuste fino de grandes modelos de linguagem de código Hugging Face aberto com o conjunto Hugging Face de dados Transformers e.

Requisitos

  • Databricks Runtime para Machine Learning 13.0 ou acima. Os exemplos deste guia usam o Hugging Face conjunto de dados, que está incluído em Databricks Runtime 13.0 ML e acima.

  • Um workspace com Unity Catalog ativado. O senhor também precisa ter as seguintes permissões para gravar dados em um volume do Unity Catalog:

    • O privilégio WRITE VOLUME no volume para o qual o senhor deseja fazer upload de arquivos.
    • O privilégio USE SCHEMA no esquema pai.
    • O privilégio USE CATALOG no catálogo pai.
  • Significativo compute recurso para downloads de grandes conjuntos de dados. O grande dataset usado no exemplo de Notebook fornecido leva mais de um dia para download.

Carregar dados do Hugging Face

Hugging Face O dataset é uma biblioteca Hugging Face para acessar e compartilhar conjuntos de dados para tarefas de áudio, visão computacional e processamento de linguagem natural (NLP). Com o Hugging Face datasets, o senhor pode carregar dados de vários lugares. A biblioteca datasets tem utilidades para ler o conjunto de dados do Hugging Face Hub. Há muitos conjuntos de dados que podem ser baixados e lidos no Hugging Face Hub usando a função load_dataset. Saiba mais sobre o carregamento de dados com o conjunto de dados Hugging Face na documentação Hugging Face.

Python
from datasets import load_dataset
dataset = load_dataset("imdb")

Alguns conjuntos de dados no Hugging Face Hub fornecem os tamanhos dos dados que são baixados e gerados quando load_dataset é chamado. O senhor pode usar load_dataset_builder para saber os tamanhos antes de fazer o download do dataset com load_dataset.

Python
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")

Consulte o download do conjunto de dados do Notebook de práticas recomendadas Hugging Face para obter orientação sobre como download e preparar o conjunto de dados em Databricks para diferentes tamanhos de dados.

Formatar seus dados de treinamento e avaliação

Para usar seus próprios dados para o ajuste fino do modelo, o senhor deve primeiro formatar seus dados de treinamento e avaliação em Spark DataFrames. Em seguida, carregue os DataFrames usando a biblioteca Hugging Face datasets.

começar formatando seus dados de treinamento em uma tabela que atenda às expectativas do instrutor. Para a classificação de texto, essa é uma tabela com duas colunas: uma coluna de texto e uma coluna de rótulo.

Para realizar o ajuste fino, você precisa fornecer um modelo. A biblioteca AutoClasses do Hugging Face Transformer facilita o carregamento de modelos e definições de configuração, incluindo uma ampla variedade de Auto Models para processamento de linguagem natural.

Por exemplo, Hugging Face transformers fornece AutoModelForSequenceClassification como um carregador de modelo para classificação de texto, que espera IDs inteiros como o rótulo da categoria. No entanto, se o senhor tiver um DataFrame com rótulo de strings, também deverá especificar mapeamentos entre o rótulo de inteiros e o rótulo de strings ao criar o modelo. O senhor pode coletar essas informações da seguinte forma:

Python
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)}

Em seguida, crie os IDs inteiros como uma coluna de rótulo com um UDF do Pandas:

Python
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)

Carregar um Hugging Face dataset de um Spark DataFrame

Hugging Face datasets suporta o carregamento de Spark DataFrames usando datasets.Dataset.from_spark. Consulte a documentação do Hugging Face para saber mais sobre o método from_spark().

Por exemplo, se o senhor tiver train_df e test_df DataFrames o senhor pode criar um conjunto de dados para cada um com o seguinte código:

Python
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 Armazena em cache o dataset. Este exemplo descreve o treinamento do modelo no motorista, portanto, os dados devem ser disponibilizados para ele. Além disso, como a materialização do cache é paralelizada usando Spark, o cache_dir fornecido deve ser acessível a todos os trabalhadores. Para atender a essas restrições, cache_dir deve ser um caminho de volume do Unity Catalog.

O acesso ao volume pode ser gerenciado usando Unity Catalog.

Se o site dataset for grande, gravá-lo em Unity Catalog pode levar muito tempo. Para acelerar o processo, o senhor pode usar o parâmetro working_dir para que Hugging Face datasets grave o dataset em um local temporário no disco e, em seguida, mova-o para Unity Catalog. Por exemplo, para usar o SSD como um local temporário:

Python
import datasets
dataset = datasets.Dataset.from_spark(
train_df,
cache_dir="/Volumes/main/default/my-volume/train",
working_dir="/local_disk0/tmp/train",
)

Armazenamento em cache para o conjunto de dados

O cache é uma das maneiras pelas quais o datasets melhora a eficiência. Ele armazena todos os downloads e conjuntos de dados processados para que, quando o usuário precisar usar o conjunto de dados intermediários, eles sejam recarregados diretamente do cache.

O diretório de cache default do conjunto de dados é ~/.cache/huggingface/datasets. Quando um clustering é encerrado, os dados do cache também são perdidos. Para manter o arquivo de cache no encerramento do clustering, o site Databricks recomenda alterar o local do cache para um caminho de volume Unity Catalog, definindo a variável de ambiente HF_DATASETS_CACHE:

Python
import os
os.environ["HF_DATASETS_CACHE"] = "/Volumes/main/default/my-volume/"

Ajuste um modelo

Quando os dados estiverem prontos, o senhor poderá usá-los para ajustar um modelo do Hugging Face.

Notebook: baixe o conjunto de dados de Hugging Face

Este exemplo de Notebook fornece as práticas recomendadas de uso da função Hugging Face load_dataset para download e prepara o conjunto de dados em Databricks para diferentes tamanhos de dados.

Faça o download do conjunto de dados do Hugging Face best practices Notebook

Open notebook in new tab