Erstellen von Float16- und Mixed-Precision-Modellen

Die Konvertierung eines Modells von float32 auf float16 kann die Modellgröße (bis zur Hälfte) reduzieren und die Leistung auf einigen GPUs verbessern. Es kann zu Genauigkeitsverlusten kommen, aber bei vielen Modellen ist die neue Genauigkeit akzeptabel. Trainingsdaten sind für die Float16-Konvertierung nicht erforderlich, was sie gegenüber der Quantisierung bevorzugen kann.

Inhalt

Float16-Konvertierung

Konvertieren Sie ein Modell nach Float16, indem Sie diese Schritte befolgen

  1. Installieren Sie onnx und onnxconverter-common

    pip install onnx onnxconverter-common

  2. Verwenden Sie die Funktion convert_float_to_float16 in Python.

     import onnx
     from onnxconverter_common import float16
    
     model = onnx.load("path/to/model.onnx")
     model_fp16 = float16.convert_float_to_float16(model)
     onnx.save(model_fp16, "path/to/model_fp16.onnx")
    

Argumente für das Float16-Tool

Wenn das konvertierte Modell nicht funktioniert oder schlechte Genauigkeit aufweist, müssen Sie möglicherweise zusätzliche Argumente festlegen.

convert_float_to_float16(model, min_positive_val=1e-7, max_finite_val=1e4, keep_io_types=False,
                         disable_shape_infer=False, op_block_list=None, node_block_list=None)
  • model: Das zu konvertierende ONNX-Modell.
  • min_positive_val, max_finite_val: Konstante Werte werden auf diese Grenzen zugeschnitten. 0.0, nan, inf und -inf bleiben unverändert.
  • keep_io_types: Ob Modell-Ein- und Ausgaben als float32 beibehalten werden sollen.
  • disable_shape_infer: Überspringt die Ausführung der ONNX-Formen-/Typinferenz. Nützlich, wenn die Formeninferenz abstürzt, Formen/Typen bereits im Modell vorhanden sind oder Typen nicht benötigt werden (Typen werden verwendet, um zu bestimmen, wo Cast-Operationen für nicht unterstützte/blockierte Operationen benötigt werden).
  • op_block_list: Liste der Operationstypen, die als float32 belassen werden sollen. Standardmäßig wird die Liste von float16.DEFAULT_OP_BLOCK_LIST verwendet. Diese Liste enthält Operationen, die für Float16 in ONNX Runtime nicht unterstützt werden.
  • node_block_list: Liste der Knotennamen, die als float32 belassen werden sollen.

HINWEIS: Blockierte Operationen erhalten Casts, die um sie herum eingefügt werden, um von/zu float16/float32 zu konvertieren. Derzeit werden, wenn zwei blockierte Operationen nebeneinander liegen, die Casts immer noch eingefügt, wodurch ein redundantes Paar entsteht. ORT optimiert dieses Paar zur Laufzeit heraus, sodass die Ergebnisse in voller Präzision bleiben.

Mixed Precision

Wenn die Float16-Konvertierung zu schlechten Ergebnissen führt, können Sie die meisten Operationen nach float16 konvertieren und einige in float32 belassen. Das Tool auto_mixed_precision.auto_convert_mixed_precision findet eine minimale Menge von Operationen, die übersprungen werden sollen, während ein bestimmtes Maß an Genauigkeit erhalten bleibt. Sie müssen eine Beispiel-Eingabe für das Modell angeben.

Da die CPU-Version von ONNX Runtime keine Float16-Operationen unterstützt und das Tool den Genauigkeitsverlust messen muss, **muss das Mixed-Precision-Tool auf einem Gerät mit GPU ausgeführt werden**.

from onnxconverter_common import auto_mixed_precision
import onnx

model = onnx.load("path/to/model.onnx")
# Assuming x is the input to the model
feed_dict = {'input': x.numpy()}
model_fp16 = auto_convert_mixed_precision(model, feed_dict, rtol=0.01, atol=0.001, keep_io_types=True)
onnx.save(model_fp16, "path/to/model_fp16.onnx")

Argumente für das Mixed-Precision-Tool

auto_convert_mixed_precision(model, feed_dict, validate_fn=None, rtol=None, atol=None, keep_io_types=False)
  • model: Das zu konvertierende ONNX-Modell.
  • feed_dict: Testdaten, die zur Messung der Genauigkeit des Modells während der Konvertierung verwendet werden. Das Format ist ähnlich wie bei InferenceSession.run (Map von Eingabenamen zu Werten).
  • validate_fn: Eine Funktion, die zwei Listen von Numpy-Arrays (die Ausgaben des Float32-Modells bzw. des Mixed-Precision-Modells) akzeptiert und True zurückgibt, wenn die Ergebnisse ausreichend nah beieinander liegen, und andernfalls False. Kann anstelle von oder zusätzlich zu rtol und atol verwendet werden.
  • rtol, atol: Absolute und relative Toleranzen, die für die Validierung verwendet werden. Weitere Informationen finden Sie unter numpy.allclose.
  • keep_io_types: Ob Modell-Ein- und Ausgaben als float32 beibehalten werden sollen.

Das Mixed-Precision-Tool konvertiert Cluster von Operationen in float16. Wenn ein Cluster fehlschlägt, wird er in zwei Hälften geteilt und beide Cluster werden unabhängig voneinander versucht. Während das Tool arbeitet, wird eine Visualisierung der Clustergrößen ausgegeben.