Partilhar via


Preparar dados para ajustar modelos Hugging Face

Este artigo demonstra como preparar seus dados para ajustar modelos de linguagem de código aberto de código aberto com Hugging Face Transformers e Hugging Face Datasets.

Requisitos

  • Databricks Runtime para Machine Learning 13.0 ou superior. Os exemplos neste guia usam conjuntos de dados do Hugging Face, que está incluído no Databricks Runtime 13.0 ML e superior.
  • Um espaço de trabalho com o Unity Catalog ativado. Você também precisa ter as seguintes permissões para gravar dados em um volume do Catálogo Unity:
    • O privilégio de WRITE VOLUME no volume para o qual deseja carregar ficheiros.
    • O privilégio "USE SCHEMA" no esquema pai.
    • O privilégio USE CATALOG no catálogo pai.
  • Recursos de computação significativos para baixar grandes conjuntos de dados. O grande conjunto de dados usado no bloco de anotações de exemplo fornecido leva mais de um dia para ser baixado.

Carregar dados do Hugging Face

Hugging Face Datasets é 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 Hugging Face datasets você pode carregar dados de vários lugares. A datasets biblioteca tem utilitários para ler conjuntos de dados do Hugging Face Hub. Há muitos conjuntos de dados baixáveis e legíveis do Hugging Face Hub usando a load_dataset função. Saiba mais sobre como carregar dados com conjuntos de dados do Hugging Face na documentação do Hugging Face.

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 são chamados. Você pode usar load_dataset_builder para saber os tamanhos antes de baixar o conjunto de dados com load_dataset.

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 bloco de anotações Baixar conjuntos de dados do Hugging Face para obter orientações sobre como baixar e preparar conjuntos de dados no Azure Databricks para diferentes tamanhos de dados.

Formate seus dados de treinamento e avaliação

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

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

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

Por exemplo, o Hugging Face transformers fornece AutoModelForSequenceClassification como um carregador de modelo para classificação de texto, que espera IDs inteiros como os rótulos de categoria. No entanto, se você tiver um DataFrame com rótulos de cadeia de caracteres, você também deve especificar mapeamentos entre os rótulos inteiros e rótulos de cadeia de caracteres ao criar o modelo. Você pode coletar essas informações da seguinte maneira:

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 Pandas UDF:

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 conjunto de dados Hugging Face a partir de um DataFrame do Spark

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

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

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 conjunto de dados. Este exemplo descreve o modelo de treinamento do motorista, portanto, os dados devem ser disponibilizados para ele. Além disso, como a materialização do cache é paralelizada usando o Spark, o fornecido cache_dir deve ser acessível a todos os trabalhadores. Para satisfazer estas 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 conjunto de dados for grande, gravá-lo no Unity Catalog pode levar muito tempo. Para acelerar o processo, você pode usar o parâmetro working_dir para que o Hugging Face datasets grave o conjunto de dados em um local temporário no disco e, em seguida, mova-o para o Unity Catalog. Por exemplo, para usar o SSD como um local temporário:

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 conjuntos de dados

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

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

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

Ajuste um modelo

Quando seus dados estiverem prontos, você poderá usá-los para ajustar um modelo do Hugging Face.

Notebook: Baixar conjuntos de dados do Hugging Face

Este bloco de anotações de exemplo fornece práticas recomendadas de uso da função Hugging Face load_dataset para baixar e preparar conjuntos de dados no Azure Databricks para diferentes tamanhos de dados.

Baixar conjuntos de dados do bloco de anotações de práticas recomendadas do Hugging Face

Obter o bloco de notas