Acelere sus modelos con 馃 Optimum Intel y OpenVINO

'Acelere sus modelos con Optimum Intel y OpenVINO'

En julio pasado, anunciamos que Intel y Hugging Face colaborar铆an en la construcci贸n de herramientas de aceleraci贸n de hardware de vanguardia pero simples para modelos Transformer. Hoy, nos complace anunciar que hemos agregado Intel OpenVINO a Optimum Intel. Ahora puede realizar f谩cilmente inferencia con OpenVINO Runtime en una variedad de procesadores Intel (consulte la lista completa de dispositivos compatibles) utilizando modelos Transformers que se pueden alojar en el repositorio de Hugging Face o de forma local. Tambi茅n puede cuantificar su modelo con el marco de compresi贸n de redes neuronales OpenVINO (NNCF) y reducir su tama帽o y latencia de predicci贸n en cuesti贸n de minutos.

Este primer lanzamiento se basa en OpenVINO 2022.2 y permite la inferencia para una gran cantidad de modelos PyTorch utilizando nuestros OVModels. La cuantizaci贸n est谩tica posterior al entrenamiento y el entrenamiento consciente de la cuantizaci贸n se pueden aplicar en muchos modelos de codificador (BERT, DistilBERT, etc.). Se admitir谩n m谩s modelos de codificador en la pr贸xima versi贸n de OpenVINO. Actualmente, la cuantizaci贸n de modelos de codificador-decodificador no est谩 habilitada, sin embargo, esta restricci贸n se levantar谩 con nuestra integraci贸n de la pr贸xima versi贸n de OpenVINO.

隆Perm铆tanos mostrarle c贸mo comenzar en minutos!

Cuantizando un Vision Transformer con Optimum Intel y OpenVINO

En este ejemplo, ejecutaremos cuantizaci贸n est谩tica posterior al entrenamiento en un modelo Vision Transformer (ViT) ajustado para la clasificaci贸n de im谩genes en el conjunto de datos food101.

La cuantizaci贸n es un proceso que reduce los requisitos de memoria y c谩lculo al reducir el ancho de bits de los par谩metros del modelo. Reducir el n煤mero de bits significa que el modelo resultante requiere menos memoria en el momento de la inferencia y que las operaciones como la multiplicaci贸n de matrices se pueden realizar m谩s r谩pido gracias a la aritm茅tica entera.

Primero, creemos un entorno virtual e instalemos todas las dependencias.

virtualenv openvino
source openvino/bin/activate
pip install pip --upgrade
pip install optimum[openvino,nncf] torchvision evaluate

A continuaci贸n, movi茅ndonos a un entorno de Python, importamos los m贸dulos apropiados y descargamos el modelo original y su extractor de caracter铆sticas.

from transformers import AutoFeatureExtractor, AutoModelForImageClassification
鈥
model_id = "juliensimon/autotrain-food101-1471154050"
model = AutoModelForImageClassification.from_pretrained(model_id)
feature_extractor = AutoFeatureExtractor.from_pretrained(model_id)

La cuantizaci贸n est谩tica posterior al entrenamiento requiere un paso de calibraci贸n donde se alimentan datos a trav茅s de la red para calcular los par谩metros de activaci贸n cuantizados. Aqu铆, tomamos 300 muestras del conjunto de datos original para construir el conjunto de datos de calibraci贸n.

from optimum.intel.openvino import OVQuantizer
鈥
quantizer = OVQuantizer.from_pretrained(model)
calibration_dataset = quantizer.get_calibration_dataset(
    "food101",
    num_samples=300,
    dataset_split="train",
)

Como es habitual con conjuntos de datos de im谩genes, debemos aplicar las mismas transformaciones de im谩genes que se utilizaron durante el entrenamiento. Utilizamos la preprocesamiento definido en el extractor de caracter铆sticas. Tambi茅n definimos una funci贸n de agrupaci贸n de datos para alimentar al modelo lotes de tensores con el formato adecuado.

import torch
from torchvision.transforms import (
    CenterCrop,
    Compose,
    Normalize,
    Resize,
    ToTensor,
)
鈥
normalize = Normalize(mean=feature_extractor.image_mean, std=feature_extractor.image_std)
_val_transforms = Compose(
    [
        Resize(feature_extractor.size),
        CenterCrop(feature_extractor.size),
        ToTensor(),
        normalize,
    ]
)
def val_transforms(example_batch):
    example_batch["pixel_values"] = [_val_transforms(pil_img.convert("RGB")) for pil_img in example_batch["image"]]
    return example_batch
鈥
calibration_dataset.set_transform(val_transforms)
鈥
def collate_fn(examples):
    pixel_values = torch.stack([example["pixel_values"] for example in examples])
    labels = torch.tensor([example["label"] for example in examples])
    return {"pixel_values": pixel_values, "labels": labels}

Para nuestro primer intento, utilizamos la configuraci贸n predeterminada para la cuantizaci贸n. Tambi茅n puede especificar la cantidad de muestras a utilizar durante el paso de calibraci贸n, que por defecto es 300.

from optimum.intel.openvino import OVConfig
鈥
quantization_config = OVConfig()
quantization_config.compression["initializer"]["range"]["num_init_samples"] = 300

Ahora estamos listos para cuantizar el modelo. El m茅todo OVQuantizer.quantize() cuantiza el modelo y lo exporta al formato OpenVINO. El grafo resultante se representa con dos archivos: un archivo XML que describe la topolog铆a de la red y un archivo binario que describe los pesos. El modelo resultante puede ejecutarse en cualquier dispositivo Intel庐 objetivo.

save_dir = "modelo_cuantizado"

# Aplicar cuantizaci贸n est谩tica y exportar el modelo cuantizado resultante al formato OpenVINO IR
quantizer.quantize(
    config_de_cuantizacion=quantization_config,
    conjunto_de_calibracion=calibration_dataset,
    recolector_de_datos=collate_fn,
    eliminar_columnas_no_utilizadas=False,
    directorio_guardado=save_dir,
)
feature_extractor.save_pretrained(save_dir)

Un minuto o dos despu茅s, el modelo ha sido cuantizado. Luego podemos cargarlo f谩cilmente con nuestras clases OVModelForXxx, que son equivalentes a las clases AutoModelForXxx de Transformers que se encuentran en la biblioteca transformers. Del mismo modo, podemos crear tuber铆as y ejecutar inferencias con OpenVINO Runtime.

from transformers import pipeline
from optimum.intel.openvino import OVModelForImageClassification

ov_model = OVModelForImageClassification.from_pretrained(save_dir)
ov_pipe = pipeline("clasificaci贸n-de-im谩genes", modelo=ov_model, extractor_de_caracter铆sticas=feature_extractor)
salidas = ov_pipe("http://farm2.staticflickr.com/1375/1394861946_171ea43524_z.jpg")
print(salidas)

Para verificar que la cuantizaci贸n no tuvo un impacto negativo en la precisi贸n, aplicamos un paso de evaluaci贸n para comparar la precisi贸n del modelo original con su contraparte cuantizada. Evaluamos ambos modelos en un subconjunto del conjunto de datos (tomando solo el 20% del conjunto de datos de evaluaci贸n). Observamos una p茅rdida m铆nima o nula de precisi贸n, con ambos modelos teniendo una precisi贸n del 87.6.

from datasets import load_dataset
from evaluate import evaluator

# Ejecutamos el paso de evaluaci贸n en el 20% del conjunto de datos de evaluaci贸n
eval_dataset = load_dataset("food101", split="validation").select(range(5050))
task_evaluator = evaluator("clasificaci贸n-de-im谩genes")

ov_eval_results = task_evaluator.compute(
    modelo_o_tuber铆a=ov_pipe,
    datos=eval_dataset,
    m茅trica="precisi贸n",
    mapeo_de_etiquetas=ov_pipe.modelo.config.label2id,
)

trfs_pipe = pipeline("clasificaci贸n-de-im谩genes", modelo=model, extractor_de_caracter铆sticas=feature_extractor)
trfs_eval_results = task_evaluator.compute(
    modelo_o_tuber铆a=trfs_pipe,
    datos=eval_dataset,
    m茅trica="precisi贸n",
    mapeo_de_etiquetas=trfs_pipe.modelo.config.label2id,
)
print(trfs_eval_results, ov_eval_results)

Al observar el modelo cuantizado, vemos que su tama帽o de memoria disminuy贸 en un 3.8x, de 344MB a 90MB. Al ejecutar una prueba r谩pida en 5050 predicciones de im谩genes, tambi茅n notamos una aceleraci贸n en la latencia de un 2.4x, de 98ms a 41ms por muestra. 隆No est谩 mal para unas pocas l铆neas de c贸digo!

鈿狅笍 Es importante mencionar que el modelo se compila justo antes de la primera inferencia, lo que inflar谩 la latencia de la primera inferencia. Por lo tanto, antes de realizar su propia prueba, aseg煤rese de calentar su modelo haciendo al menos una predicci贸n.

Puede encontrar el modelo resultante alojado en el Hugging Face Hub. Para cargarlo, simplemente puede hacer lo siguiente:

from optimum.intel.openvino import OVModelForImageClassification

ov_model = OVModelForImageClassification.from_pretrained("echarlaix/vit-food101-int8")

Ahora es tu turno

Como puedes ver, es bastante f谩cil acelerar tus modelos con 馃 Optimum Intel y OpenVINO. Si deseas comenzar, por favor visita el repositorio de Optimum Intel y no olvides darle una estrella 猸. Tambi茅n encontrar谩s ejemplos adicionales all铆. Si deseas profundizar en OpenVINO, la documentaci贸n de Intel te tiene cubierto.

Pru茅balo y d茅janos saber qu茅 piensas. Nos encantar铆a escuchar tus comentarios en el Foro de Hugging Face, y no dudes en solicitar caracter铆sticas o informar problemas en Github.

Divi茅rtete con 馃 Optimum Intel y gracias por leer.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Apoyando la sostenibilidad, la salud digital y el futuro del trabajo

La Iniciativa de Convergencia MIT y Accenture para la Industria y la Tecnolog铆a selecciona tres nuevos proyectos de i...

Inteligencia Artificial

Chipotle presenta Autocado, un robot de preparaci贸n de guacamole

Chipotle se ha asociado con la firma de soluciones de automatizaci贸n Vebu para presentar Autocado, un robot de proces...

Noticias de Inteligencia Artificial

La Influencia Revolucionaria de la Inteligencia Artificial Generativa en la Industria Automotriz

La IA generativa ha surgido como una fuerza transformadora en numerosos sectores, incluida la industria automotriz, d...

Ciencias de la Computaci贸n

C贸mo la I.A. est谩 ayudando a los arquitectos a cambiar el dise帽o de los lugares de trabajo.

Con una mayor cantidad de trabajadores h铆bridos y nuevas necesidades de oficina, empresas como Zaha Hadid Architects ...