Odvozování modelů s využitím Transformátorů hugging Face Transformers pro NLP
Důležité
- Tato dokumentace byla vyřazena a nemusí být aktualizována. Produkty, služby nebo technologie uvedené v tomto obsahu se už nepodporují.
- Databricks místo toho doporučuje používat
ai_query
dávkové odvozování. Viz Provádění dávkových odvozování pomocí ai_query.
Tento článek ukazuje, jak používat odvozování modelů NLP (Hugging Face Transformers) pro odvozování modelů přirozeného jazyka.
Transformátory hugging Face poskytují třídu kanálů pro použití předem natrénovaného modelu pro odvozování. 🤗 Kanály Transformers podporují širokou škálu úloh NLP, které můžete snadno používat v Azure Databricks.
Požadavky
- MLflow 2.3
- Pro dávkové odvozování je možné použít jakýkoli cluster s nainstalovanou knihovnou Hugging Face
transformers
. Knihovnatransformers
je předinstalovaná ve službě Databricks Runtime 10.4 LTS ML a vyšší. Řada oblíbených modelů NLP funguje nejlépe na hardwaru GPU, takže pokud nepoužíváte model optimalizovaný pro použití na procesorech, můžete dosáhnout nejlepšího výkonu pomocí nejnovějšího hardwaru GPU.
Distribuce výpočtů modelu v clusteru Spark pomocí funkcí definované uživatelem Pandas
Při experimentování s předem natrénovanými modely můžete pomocí funkcí UDF pandas model zabalit a provádět výpočty s pracovními procesory nebo grafickými procesory. Funkce definované uživatelem Pandas distribuují model jednotlivým pracovním procesům.
Můžete také vytvořit kanál Hugging Face Transformers pro strojový překlad a použít UDF Pandas ke spuštění kanálu na pracovních procesů clusteru Spark:
import pandas as pd
from transformers import pipeline
import torch
from pyspark.sql.functions import pandas_udf
device = 0 if torch.cuda.is_available() else -1
translation_pipeline = pipeline(task="translation_en_to_fr", model="t5-base", device=device)
@pandas_udf('string')
def translation_udf(texts: pd.Series) -> pd.Series:
translations = [result['translation_text'] for result in translation_pipeline(texts.to_list(), batch_size=1)]
return pd.Series(translations)
device
Nastavením tímto způsobem zajistíte, aby se grafické procesory používaly, pokud jsou dostupné v clusteru.
Kanály Hugging Face pro překlad vrátí seznam objektů Pythonu dict
, z nichž každý má jeden klíč translation_text
a hodnotu obsahující přeložený text. Tento UDF extrahuje překlad z výsledků a vrátí řadu Pandas pouze s přeloženým textem. Pokud byl váš kanál vytvořen tak, aby používal GPU nastavením device=0
, Spark automaticky znovu přiřazuje GPU na pracovních uzlech, pokud váš cluster obsahuje instance s více gpu.
Pokud chcete k překladu textového sloupce použít funkci definovanou uživatelem, můžete funkci definovanou uživatelem select
volat v příkazu:
texts = ["Hugging Face is a French company based in New York City.", "Databricks is based in San Francisco."]
df = spark.createDataFrame(pd.DataFrame(texts, columns=["texts"]))
display(df.select(df.texts, translation_udf(df.texts).alias('translation')))
Vrácení složitých typů výsledků
Pomocí uživatelem definovaných souborů Pandas můžete také vrátit strukturovanější výstup. Například v rozpoznávání pojmenovaných entit kanály vrací seznam objektů obsahujících dict
entitu, její rozsah, typ a přidružené skóre. I když se podobá příkladu překladu, návratový typ poznámky @pandas_udf
je složitější v případě rozpoznávání pojmenovaných entit.
Můžete získat představu o návratových typech, které se mají použít prostřednictvím kontroly výsledků kanálu, například spuštěním kanálu na ovladači.
V tomto příkladu použijte následující kód:
from transformers import pipeline
import torch
device = 0 if torch.cuda.is_available() else -1
ner_pipeline = pipeline(task="ner", model="Davlan/bert-base-multilingual-cased-ner-hrl", aggregation_strategy="simple", device=device)
ner_pipeline(texts)
Chcete-li získat poznámky:
[[{'entity_group': 'ORG',
'score': 0.99933606,
'word': 'Hugging Face',
'start': 0,
'end': 12},
{'entity_group': 'LOC',
'score': 0.99967843,
'word': 'New York City',
'start': 42,
'end': 55}],
[{'entity_group': 'ORG',
'score': 0.9996372,
'word': 'Databricks',
'start': 0,
'end': 10},
{'entity_group': 'LOC',
'score': 0.999588,
'word': 'San Francisco',
'start': 23,
'end': 36}]]
Chcete-li tento typ znázorňovat jako návratový typ, můžete použít pole array
struct
se seznamem dict
položek jako polí:struct
import pandas as pd
from pyspark.sql.functions import pandas_udf
@pandas_udf('array<struct<word string, entity_group string, score float, start integer, end integer>>')
def ner_udf(texts: pd.Series) -> pd.Series:
return pd.Series(ner_pipeline(texts.to_list(), batch_size=1))
display(df.select(df.texts, ner_udf(df.texts).alias('entities')))
Ladění výkonu
Ladění výkonu uživatelem definované uživatelem má několik klíčových aspektů. Prvním je efektivní použití jednotlivých GPU, které můžete upravit změnou velikosti dávek odesílaných do GPU kanálem Transformers. Druhým je zajistit, aby byl datový rámec dobře rozdělený tak, aby využíval celý cluster.
Nakonec můžete chtít uložit model Hugging Face do mezipaměti, abyste ušetřili čas načítání modelu nebo náklady na příchozí přenos dat.
Volba velikosti dávky
I když by výše popsané funkce definované uživatelem měly fungovat s batch_size
1, nemusí se prostředky dostupné pracovníkům efektivně používat. Pokud chcete zvýšit výkon, vylaďte velikost dávky na model a hardware v clusteru. Databricks doporučuje vyzkoušet různé velikosti dávek pro kanál ve vašem clusteru a najít tak nejlepší výkon. Další informace o dávkování kanálů a dalších možnostech výkonu najdete v dokumentaci k Hugging Face.
Zkuste najít velikost dávky, která je dostatečně velká, aby jednotky úplného využití GPU, ale nezpůsobily CUDA out of memory
chyby. Když během ladění dojde CUDA out of memory
k chybám, musíte poznámkový blok odpojit a znovu připojit, aby se uvolnila paměť používaná modelem a daty v GPU.
Monitorujte výkon GPU zobrazením metrik živého clusteru pro cluster a výběrem metriky, jako gpu0-util
je využití procesoru GPU nebo gpu0_mem_util
využití paměti GPU.
Ladění paralelismu s plánováním na úrovni fáze
Spark ve výchozím nastavení naplánuje na každý počítač jeden úkol na GPU. Pokud chcete zvýšit paralelismus, můžete pomocí plánování na úrovni fáze zjistit, kolik úloh má Spark běžet na GPU. Pokud například chcete, aby Spark spustil dvě úlohy na GPU, můžete to zadat následujícím způsobem:
from pyspark.resource import TaskResourceRequests, ResourceProfileBuilder
task_requests = TaskResourceRequests().resource("gpu", 0.5)
builder = ResourceProfileBuilder()
resource_profile = builder.require(task_requests).build
rdd = df.withColumn('predictions', loaded_model(struct(*map(col, df.columns)))).rdd.withResources(resource_profile)
Změna rozdělení dat pro použití veškerého dostupného hardwaru
Druhým aspektem výkonu je plné využití hardwaru ve vašem clusteru. Obecně platí, že malý násobek počtu GRAFICKÝch procesorů ve vašich pracovních procesů (pro clustery GPU) nebo počet jader napříč pracovními procesy ve vašem clusteru (pro clustery procesoru) funguje dobře. Váš vstupní datový rámec už může mít dostatek oddílů, aby mohl využívat paralelismus clusteru. Chcete-li zjistit, kolik oddílů datový rámec obsahuje, použijte df.rdd.getNumPartitions()
. Datový rámec můžete předělovat pomocí repartitioned_df = df.repartition(desired_partition_count)
.
Uložení modelu do mezipaměti v DBFS nebo na přípojných bodech
Pokud často načítáte model z různých nebo restartovaných clusterů, můžete také chtít uložit model Hugging Face do mezipaměti v kořenovém svazku DBFS nebo na přípojný bod. To může snížit náklady na příchozí přenos dat a zkrátit dobu načtení modelu do nového nebo restartovaného clusteru. Uděláte to tak, že před načtením kanálu nastavíte TRANSFORMERS_CACHE
proměnnou prostředí v kódu.
Příklad:
import os
os.environ['TRANSFORMERS_CACHE'] = '/dbfs/hugging_face_transformers_cache/'
Podobné výsledky můžete také dosáhnout protokolováním modelu do MLflow s příchutí MLflowtransformers
.
Poznámkový blok: Odvozování transformátorů tváře a protokolování MLflow
Abyste mohli rychle začít s ukázkovým kódem, je tento poznámkový blok uceleným příkladem sumarizace textu pomocí odvozování kanálů Hugging Face Transformers a protokolování MLflow.
Poznámkový blok pro odvozování kanálů Face Transformers
Další materiály
Model Hugging Face můžete doladit pomocí následujících příruček:
Přečtěte si další informace o tom, co jsou Hugging Face Transformers?