onnxruntime/include/onnxruntime/core
Jing Fang 11bf309736
add transform part of the dq matmul tool chain (#21374)
### Description

This is a partial change from
[fajin/qdqmatmulnbitstoolchain](https://github.com/microsoft/onnxruntime/pull/21180).
The original PR is blocked by Web CI failures.

MatMulNBits is a heavily optimized matmul operation. Currently a MatMul
can be converted to MatMulNBits to speed up the model inference.
However, MatMulNBits is an ORT only op. To make the graph compatible
with ONNX ops and utilize MatMulNBits at the same time, we introduce
Q/DQ support for MatMulNBits.

To convert MatMul ops in a model to MatMulNBits:
1. use matmul_4bits_quantizer.py to convert MatMul to DQ + MatMul using
QDQ mode.
2. In ORT session, DQ + MatMul is fused to MatMulNBits

#### Note
MatMulNBits assume B weight is uint4. When no zp is provided, zp
defaults to 8, which is different from DQ. DQ defaults zp to 0 when no
zp provided. And DQ supports int4. Therefore some conversions are
introduced during DQ + MatMul --> MatMulNBits step.

#### Perf
Using QDQ format will increase the model initialization time and memory
consumption. With current implement, model init time increased from ~4s
to ~9s, and memory consumption increased from ~2.8GB to ~4.8GB.
The memory increase is due to 
1. in optimizer, after transpose the B weight, a in-memory tensor proto
is created using protobuf's arena.
2. in finalize step, when saving initializer and prepacking, ORT arena
is used to create buffers for initializers.

The memory allocated by arenas cannot be fully deallocated.
If disable ORT arena memory allocation, the memory consumptions of both
QDQ format and original format are ~2.2GB.
The time increase is mainly due to multiple memory copy, but can be
further optimized.

### Motivation and Context
Please see description for details.
2024-07-19 22:55:15 -07:00
..
common Remove core/common/gsl.h (#20894) 2024-07-08 18:09:39 -07:00
eager Fix typos - 1st Wave (#21278) 2024-07-11 13:35:08 +08:00
framework Fix typos - 1st Wave (#21278) 2024-07-11 13:35:08 +08:00
graph VitisAI EP Context Model (#20926) 2024-07-12 21:22:58 -07:00
optimizer add transform part of the dq matmul tool chain (#21374) 2024-07-19 22:55:15 -07:00
platform Bump linter versions (#18341) 2023-11-08 13:04:40 -08:00
providers [TensorRT] Enable refitting an embedded engine when provided as byte stream (#21357) 2024-07-19 21:11:04 -07:00
session add transform part of the dq matmul tool chain (#21374) 2024-07-19 22:55:15 -07:00