No hay un "intermediario que gane la diferencia", OpenVINO™ admite directamente los objetos del modelo PyTorch

Autor: Yang Yicheng

1. Antecedentes

Como uno de los marcos de aprendizaje profundo de código abierto más populares, la facilidad de uso y la flexibilidad de PyTorch lo han hecho popular entre las comunidades académicas y de investigación. Anteriormente, la compatibilidad de OpenVINO™ con el modelo PyTorch solo se encontraba en la etapa de transición de ONNX. Era necesario exportar el modelo dinámico de PyTorch al formato estático de ONNX antes de que el tiempo de ejecución de OpenVINO™ pudiera cargarlo directamente fuera de línea, aunque PyTorch también proporcionó el archivo oficial torch.onnx. La interfaz de exportación ayuda a los desarrolladores a exportar modelos ONNX, pero hay un "intermediario" después de todo, y una gran cantidad de trabajo de configuración adicional también genera inconvenientes para los desarrolladores de OpenVINO™, como la configuración de entrada dinámica/estática. y la configuración de la versión opset espera.

2. OpenVINO™ admite directamente los objetos del modelo PyTorch

[RL1]  [RL2]  [YE3]  [LR4] [  LR5]  [LR6]  [YE7] 

Con el lanzamiento de OpenVINO™ 2023.0, se preinstaló un nuevo front-end de PyTorch en la biblioteca de herramientas de OpenVINO™, lo que brinda a los desarrolladores una nueva ruta de compatibilidad con el modelo de PyTorch y brinda una experiencia de usuario más amigable: la herramienta mo de OpenVINO . Es posible convertir directamente los objetos del modelo PyTorch en objetos del modelo OpenVINO™ , y los desarrolladores no necesitan usar el modelo ONNX como una transición intermedia.

import torchvision

import torch

from openvino.tools.mo import convert_model



model = torchvision.models.resnet50(pretrained=True)

ov_model = convert_model(model)

En comparación con ONNX como método de transición intermedia, la nueva interfaz de PyTorch tiene las siguientes características:

Transición ONNX

Nueva interfaz de PyTorch

conversión fuera de línea

apoyo

apoyo

conversión en línea

No compatible, necesita exportar el archivo ONNX

apoyo

pasos de conversión

incómodo

Solo necesita llamar a la interfaz una vez

configuración de parámetros

muchos

medio

Soporte del operador

Rico

medio

Los objetos de modelo de PyTorch admitidos actualmente son:

  • antorcha.nn.Módulo
  • torch.jit.ScriptModule
  • torch.jit.ScriptFunction

Dentro de OpenVINO™, el front-end de PyTorch se basa en TorchScript para la exportación de modelos, y TorchScript admite dos modos de exportación de modelos, uno se llama Tracing y el otro se llama Scripting. Entre ellos, Tracing se refiere al seguimiento de PyTorch de los operadores del módulo que se ejecutan cuando el modelo se está ejecutando, la construcción en tiempo real de un gráfico de flujo de cálculo y, finalmente, resumirlo en una representación intermedia. Trace es una espada de doble filo. La ventaja. es que los usuarios no necesitan comprender los detalles del código de Python, ya sea Función, Módulo, Generadores o Rutinas, Tracing registrará fielmente el Tensor y la Función de Tensor pasados, lo cual es muy adecuado para módulos simples y funciones que no involucran flujo de control relacionado con los datos, como las redes neuronales convolucionales estándar La desventaja es que el seguimiento no es consciente del flujo de control y la dinámica de los gráficos de cálculo, como declaraciones if o bucles. Por ejemplo, expandirá el bucle. Por un lado, puede aumentar el espacio para la optimización de la compilación. Por otro lado, si el bucle se alarga dinámicamente cuando se usan diferentes inferencias, entonces Tracing no podrá percibir esto, y solo grabará el bucle durante el seguimiento. Para transformar módulos y funciones que contienen un flujo de control dependiente de los datos, se proporciona un mecanismo de secuencias de comandos que analiza desde el nivel del código fuente de Python, en lugar de crearse en tiempo de ejecución. Las secuencias de comandos comprenderán todo el código y realmente realizarán análisis de sintaxis y otras operaciones como un compilador. Scripting es equivalente a un DSL incrustado en Python/Pytorch, y su gramática es solo un subconjunto de la gramática de PyTorch, lo que significa que hay algunas operaciones y gramáticas que Scripting no admite, por lo que encontrará problemas al compilar.

En el ejemplo de ahora, el front-end de PyTorch usa Scripting para exportar el modelo. Si desea usar el método Tracing, puede agregar un parámetro example_input a la interfaz. En este momento, el front-end de PyTorch llamará al Tracing Cuando el método de seguimiento falla, llame al modo de secuencias de comandos.

import torchvision
import torch
from openvino.tools.mo import convert_model

model = torchvision.models.resnet50(pretrained=True)
ov_model = convert_model(model, example_input=torch.zeros(1, 3, 100, 100))

Los formatos de datos admitidos actualmente por examle_input son:

  • openvino.runtime.Tensor
  • antorcha.Tensor
  • np.ndarray
  • lista o tupla con tensores (openvino.runtime.Tensor/torch.Tensor/np.ndarray)
  • diccionario donde clave es el nombre de entrada, valor es el tensor (openvino.runtime.Tensor / torch.Tensor / np.ndarray)

Vale la pena señalar que los dos ejemplos anteriores exportan objetos de modelo de entrada dinámicos. Si desea especificar la forma de entrada del modelo, puede agregar un parámetro adicional input_shape/input nuevamente, pasar la forma de entrada como parámetro y elegir uno. El caso puede referirse a la parte de combate real a continuación.

Finalmente, si los desarrolladores desean exportar archivos IR estáticos para su uso posterior, también pueden llamar a la siguiente interfaz para serializar objetos del modelo OpenVINO™:

serialize(ov_model, str(ir_model_xml))

Tres, caso de combate modelo BERT

A continuación, usemos un ejemplo para ver cómo completar todo el proceso desde la conversión del modelo BERT hasta la cuantificación.

1. Obtenga el objeto modelo de PyTorch

torch_model = BertForSequenceClassification.from_pretrained(PRETRAINED_MODEL_DIR)

2. Establezca los parámetros del modelo y conviértalo en un objeto de modelo OpenVINO™. Dado que BERT es un modelo de múltiples entradas, aquí se agrega un parámetro adicional input=input_info, que se puede usar para especificar la forma y el tipo de datos de cada entrada en el modelo multientrada.

input_shape = PartialShape([1, -1])
input_info = [("input_ids", input_shape, np.int64),("attention_mask", input_shape, np.int64),("token_type_ids", input_shape, np.int64)]
default_input = torch.ones(1, MAX_SEQ_LENGTH, dtype=torch.int64)
inputs = {
    "input_ids": default_input,
    "attention_mask": default_input,
    "token_type_ids": default_input,
}
model = convert_model(torch_model, example_input=inputs, input=input_info)

3. Preparar el conjunto de datos de verificación e iniciar la cuantificación, el modelo obtenido en el paso anterior es de tipo openvino.runtime.Model, el cual puede ser cargado directamente por la herramienta NNCF

calibration_dataset = nncf.Dataset(data_source, transform_fn)
# Quantize the model. By specifying model_type, we specify additional transformer patterns in the model.
quantized_model = nncf.quantize(model, calibration_dataset,
                                model_type=ModelType.TRANSFORMER)

4. Compile el objeto del modelo cuantificado y realice la inferencia

compiled_quantized_model = core.compile_model(model=quantized_model, device_name="CPU")
output_layer = compiled_quantized_model.outputs[0]
result = compiled_quantized_model(inputs)[output_layer]
result = np.argmax(result)
print(f"Text 1: {sample['sentence1']}")
print(f"Text 2: {sample['sentence2']}")
print(f"The same meaning: {'yes' if result == 1 else 'no'}")
El resultado final es el siguiente:
Texto 1: Wal-Mart dijo que controlaría a todos sus más de un millón de trabajadores domésticos para asegurarse de que estuvieran empleados legalmente.
Texto 2: También ha dicho que revisaría a todos sus empleados domésticos, más de 1 millón, para asegurarse de que tengan un estatus legal.
El mismo significado: sí
 
 

Para obtener ejemplos completos y una comparación de la precisión del rendimiento, consulte:

openvino_notebooks/notebooks/105-language-quantize-bert/105-language-quantize-bert.ipynb en principal · openvinotoolkit/openvino_notebooks · GitHub

Cuatro Resumen

Como la última versión lanzada recientemente, la herramienta mo en OpenVINO™ 2023.0 puede convertir directamente los objetos del modelo PyTorch en objetos OpenVINO™ sin una transición intermedia a través de ONNX, lo que elimina la necesidad de una conversión sin conexión y una configuración adicional para los desarrolladores, lo que brinda una experiencia de usuario más amigable. . Dado que esta función se encuentra en un estado de prelanzamiento, es posible que algunos operadores no la admitan. En este momento, los desarrolladores aún pueden usar la ruta anterior para convertir modelos de PyTorch que dependen del front-end de ONNX.


 [RL1] Deberíamos enumerar los 'beneficios' de por qué ninguna conversión es excelente. Me refiero a que la conversión o no realmente no importa. Enumere los medios 1. 2. 3. 4. 5. como valor prop.

 [RL2] Además, ¿enumeraremos los beneficios aún con ONNX? Si podemos, para que esta publicación no esté tan sesgada sobre ONNX es mala, y algunas personas pueden tomar esto mal.

 [YE3] Listo

No debemos "TACHAR" ONNX. También se ve mal en ONNX cuando lo hacemos con otra marca. [LR4]

Lo mejor es simplemente mostrar la historia de PyTorch y OpenVINO juntos. [LR5]

 [LR6] y puedes dejar ONNX a un lado y hacer que se vea solo, está bien :)

 [YE7] Listo

Supongo que te gusta

Origin blog.csdn.net/gc5r8w07u/article/details/131302814
Recomendado
Clasificación