In diesem Tutorial gehen wir durch, wie wir umarme Gesicht verwenden Optimum Um Transformatormodelle zu optimieren und sie schneller zu machen und gleichzeitig die Genauigkeit beizubehalten. Wir beginnen mit der Einrichtung von Distilbert im SST-2-Datensatz und vergleichen dann verschiedene Ausführungsmotoren, einschließlich einfacher Pytorch und Torch.comPile, Onnx-Laufzeit und quantifiziertes ONNX. Durch diese Schritt für Schritt erhalten wir praktische Erfahrungen mit Modellexport, Optimierung, Quantisierung und Benchmarking in einer Google Colab-Umgebung. Schauen Sie sich das an Vollständige Codes Hier.

!pip -q set up "transformers>=4.49" "optimum(onnxruntime)>=1.20.0" "datasets>=2.20" "consider>=0.4" speed up


from pathlib import Path
import os, time, numpy as np, torch
from datasets import load_dataset
import consider
from transformers import AutoTokenizer, AutoModelForSequenceClassification, pipeline
from optimum.onnxruntime import ORTModelForSequenceClassification, ORTQuantizer
from optimum.onnxruntime.configuration import QuantizationConfig


os.environ.setdefault("OMP_NUM_THREADS", "1")
os.environ.setdefault("MKL_NUM_THREADS", "1")


MODEL_ID = "distilbert-base-uncased-finetuned-sst-2-english"
ORT_DIR  = Path("onnx-distilbert")
Q_DIR    = Path("onnx-distilbert-quant")
DEVICE   = "cuda" if torch.cuda.is_available() else "cpu"
BATCH    = 16
MAXLEN   = 128
N_WARM   = 3
N_ITERS  = 8


print(f"Machine: {DEVICE} | torch={torch.__version__}")

Wir beginnen damit, die erforderlichen Bibliotheken zu installieren und unsere Umgebung für das Umarmen von Gesicht optimum mit OnNX -Laufzeit einzurichten. Wir konfigurieren Pfade, Stapelgröße und Iterationseinstellungen und bestätigen, ob wir auf CPU oder GPU ausgeführt werden. Schauen Sie sich das an Vollständige Codes Hier.

ds = load_dataset("glue", "sst2", cut up="validation(:20%)")
texts, labels = ds("sentence"), ds("label")
metric = consider.load("accuracy")
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)


def make_batches(texts, max_len=MAXLEN, batch=BATCH):
   for i in vary(0, len(texts), batch):
       yield tokenizer(texts(i:i+batch), padding=True, truncation=True,
                       max_length=max_len, return_tensors="pt")


def run_eval(predict_fn, texts, labels):
   preds = ()
   for toks in make_batches(texts):
       preds.prolong(predict_fn(toks))
   return metric.compute(predictions=preds, references=labels)("accuracy")


def bench(predict_fn, texts, n_warm=N_WARM, n_iters=N_ITERS):
   for _ in vary(n_warm):
       for toks in make_batches(texts(:BATCH*2)):
           predict_fn(toks)
   occasions = ()
   for _ in vary(n_iters):
       t0 = time.time()
       for toks in make_batches(texts):
           predict_fn(toks)
       occasions.append((time.time() - t0) * 1000)
   return float(np.imply(occasions)), float(np.std(occasions))

Wir laden eine SST-2-Validierungsscheibe und bereiten eine Tokenisierung, eine Genauigkeitsmetrik und eine Cost vor. Wir definieren Run_eval, um die Genauigkeit von jedem Prädiktor und einer Financial institution zu berechnen, um sich aufzuwärmen, und Zeit end-to-Finish-Inferenz. Mit diesen Helfern vergleichen wir verschiedene Motoren mit identischen Daten und Chargen. Schauen Sie sich das an Vollständige Codes Hier.

torch_model = AutoModelForSequenceClassification.from_pretrained(MODEL_ID).to(DEVICE).eval()


@torch.no_grad()
def pt_predict(toks):
   toks = {okay: v.to(DEVICE) for okay, v in toks.gadgets()}
   logits = torch_model(**toks).logits
   return logits.argmax(-1).detach().cpu().tolist()


pt_ms, pt_sd = bench(pt_predict, texts)
pt_acc = run_eval(pt_predict, texts, labels)
print(f"(PyTorch keen)   {pt_ms:.1f}±{pt_sd:.1f} ms | acc={pt_acc:.4f}")


compiled_model = torch_model
compile_ok = False
strive:
   compiled_model = torch.compile(torch_model, mode="reduce-overhead", fullgraph=False)
   compile_ok = True
besides Exception as e:
   print("torch.compile unavailable or failed -> skipping:", repr(e))


@torch.no_grad()
def ptc_predict(toks):
   toks = {okay: v.to(DEVICE) for okay, v in toks.gadgets()}
   logits = compiled_model(**toks).logits
   return logits.argmax(-1).detach().cpu().tolist()


if compile_ok:
   ptc_ms, ptc_sd = bench(ptc_predict, texts)
   ptc_acc = run_eval(ptc_predict, texts, labels)
   print(f"(torch.compile)   {ptc_ms:.1f}±{ptc_sd:.1f} ms | acc={ptc_acc:.4f}")

Wir laden den Foundation-Pytorch-Klassifizierer, definieren einen PT_PREDICT-Helfer und bewerten Sie ihn auf SST-2. Anschließend versuchen wir fackel.comPile für Simply-in-Time-Diagrammoptimierungen und führen, falls erfolgreich, dieselben Benchmarks aus, um Geschwindigkeit und Genauigkeit unter einem identischen Setup zu vergleichen. Schauen Sie sich das an Vollständige Codes Hier.

supplier = "CUDAExecutionProvider" if DEVICE == "cuda" else "CPUExecutionProvider"
ort_model = ORTModelForSequenceClassification.from_pretrained(
   MODEL_ID, export=True, supplier=supplier, cache_dir=ORT_DIR
)


@torch.no_grad()
def ort_predict(toks):
   logits = ort_model(**{okay: v.cpu() for okay, v in toks.gadgets()}).logits
   return logits.argmax(-1).cpu().tolist()


ort_ms, ort_sd = bench(ort_predict, texts)
ort_acc = run_eval(ort_predict, texts, labels)
print(f"(ONNX Runtime)    {ort_ms:.1f}±{ort_sd:.1f} ms | acc={ort_acc:.4f}")


Q_DIR.mkdir(mother and father=True, exist_ok=True)
quantizer = ORTQuantizer.from_pretrained(ORT_DIR)
qconfig = QuantizationConfig(strategy="dynamic", per_channel=False, reduce_range=True)
quantizer.quantize(model_input=ORT_DIR, quantization_config=qconfig, save_dir=Q_DIR)


ort_quant = ORTModelForSequenceClassification.from_pretrained(Q_DIR, supplier=supplier)


@torch.no_grad()
def ortq_predict(toks):
   logits = ort_quant(**{okay: v.cpu() for okay, v in toks.gadgets()}).logits
   return logits.argmax(-1).cpu().tolist()


oq_ms, oq_sd = bench(ortq_predict, texts)
oq_acc = run_eval(ortq_predict, texts, labels)
print(f"(ORT Quantized)   {oq_ms:.1f}±{oq_sd:.1f} ms | acc={oq_acc:.4f}")

Wir exportieren das Modell in ONNX, führen es mit ONNX -Laufzeit aus und wenden dann die dynamische Quantisierung mit dem Ortquantizer von Optimum an und dem Benchmark, um zu erkennen, wie sich die Latenz verbessert, während die Genauigkeit vergleichbar bleibt. Schauen Sie sich das an Vollständige Codes Hier.

pt_pipe  = pipeline("sentiment-analysis", mannequin=torch_model, tokenizer=tokenizer,
                   machine=0 if DEVICE=="cuda" else -1)
ort_pipe = pipeline("sentiment-analysis", mannequin=ort_model, tokenizer=tokenizer, machine=-1)
samples = (
   "What a unbelievable film—carried out brilliantly!",
   "This was a whole waste of time.",
   "I’m undecided how I really feel about this one."
)
print("nSample predictions (PT | ORT):")
for s in samples:
   a = pt_pipe(s)(0)("label")
   b = ort_pipe(s)(0)("label")
   print(f"- {s}n  PT={a} | ORT={b}")


import pandas as pd
rows = (("PyTorch keen", pt_ms, pt_sd, pt_acc),
       ("ONNX Runtime",  ort_ms, ort_sd, ort_acc),
       ("ORT Quantized", oq_ms, oq_sd, oq_acc))
if compile_ok: rows.insert(1, ("torch.compile", ptc_ms, ptc_sd, ptc_acc))
df = pd.DataFrame(rows, columns=("Engine", "Imply ms (↓)", "Std ms", "Accuracy"))
show(df)


print("""
Notes:
- BetterTransformer is deprecated on transformers>=4.49, therefore omitted.
- For bigger positive factors on GPU, additionally strive FlashAttention2 fashions or FP8 with TensorRT-LLM.
- For CPU, tune threads: set OMP_NUM_THREADS/MKL_NUM_THREADS; strive NUMA pinning.
- For static (calibrated) quantization, use QuantizationConfig(strategy="static") with a calibration set.
""")

Wir überprüfen Vorhersagen mit schnellen Stimmungspipelines und drucken Pytorch vs Onnx-Beschriftungen nebeneinander. Anschließend stellen wir eine Zusammenfassungstabelle zusammen, um Latenz und Genauigkeit über Motoren hinweg zu vergleichen, wodurch falls vorhandene Ergebnisse eingefügt werden. Wir schließen mit praktischen Notizen und ermöglichen es uns, den Workflow auf andere Backends und Quantisierungsmodi auszudehnen.

Zusammenfassend können wir deutlich sehen, wie optimum uns die Kluft zwischen Normal-Pytorch-Modellen und produktionsbereiten, optimierten Bereitstellungen hilft. Wir erzielen Beschleunigungen mit ONNX -Laufzeit und -quantisierung und untersuchen auch, wie Torch.comPile direkt innerhalb von Pytorch Gewinne bietet. Dieser Workflow zeigt einen praktischen Ansatz, um Leistung und Effizienz für Transformatormodelle auszugleichen und eine Grundlage, die mit fortschrittlichen Backends wie OpenVino oder Tensorrt weiter erweitert werden kann.


Schauen Sie sich das an Vollständige Codes Hier. Fühlen Sie sich frei, unsere zu überprüfen Github -Seite für Tutorials, Codes und Notizbücher. Fühlen Sie sich auch frei, uns zu folgen Twitter Und vergessen Sie nicht, sich unserer anzuschließen 100k+ ml Subreddit und abonnieren Unser E-newsletter.

Für Content material -Partnerschaft/-werbung auf marktechpost.com bitte Sprich mit uns


Asif Razzaq ist der CEO von Marktechpost Media Inc. Sein jüngstes Bestreben ist die Einführung einer Medienplattform für künstliche Intelligenz, Marktechpost, die sich durch die ausführliche Berichterstattung über maschinelles Lernen und Deep-Studying-Nachrichten auszeichnet, die von einem breiten Publikum technisch intestine und leicht verständlich sind. Die Plattform verfügt über über 2 Millionen monatliche Ansichten und veranschaulicht ihre Beliebtheit des Publikums.

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert