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
-
Installieren Sie onnx und onnxconverter-common
pip install onnx onnxconverter-common -
Verwenden Sie die Funktion
convert_float_to_float16in 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,infund-infbleiben 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 vonfloat16.DEFAULT_OP_BLOCK_LISTverwendet. 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 undTruezurückgibt, wenn die Ergebnisse ausreichend nah beieinander liegen, und andernfallsFalse. Kann anstelle von oder zusätzlich zurtolundatolverwendet 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.