Skip to content

Commit 4782c28

Browse files
committed
added question 12 to the repo in AI questions
1 parent 4d0867c commit 4782c28

1 file changed

Lines changed: 118 additions & 1 deletion

File tree

Lines changed: 118 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,118 @@
1-
# AI-Question12 - Explain how a C# developer might handle a 4-bit or 8-bit quantized model using the ONNX Runtime. What happens to precision vs. memory footprint?
1+
# AI-Question12 - Explain how a C# developer might handle a 4-bit or 8-bit quantized model using the ONNX Runtime. What happens to precision vs. memory footprint?
2+
3+
**ONNX Runtime** in C# fully supports **8-bit (INT8/UINT8)** and **4-bit (INT4/UINT4)** quantized models, making it an excellent choice for deploying smaller, faster models on edge devices, desktops, or resource-constrained environments. Quantization reduces precision to lower memory usage and increase inference speed with minimal accuracy loss when done properly.
4+
5+
### Preparing a Quantized Model (Typically Done in Python)
6+
Quantization is usually performed using **ONNX Runtime quantization tools**, **Olive**, or **ONNX Runtime GenAI model builder** (for LLMs).
7+
8+
**8-bit Quantization** (most common for general models):
9+
- Static or dynamic quantization of weights (and optionally activations).
10+
- Uses QDQ (Quantize-Dequantize) or operator-oriented (Integer ops) format.
11+
12+
**4-bit Quantization** (block-wise, especially for LLMs like Phi-3, Llama):
13+
- Weight-only quantization (common with AWQ/GPTQ).
14+
- Supported via opset 21+ with INT4/UINT4 types and block quantization.
15+
16+
**Example (using ONNX Runtime GenAI for LLMs):**
17+
```bash
18+
python -m onnxruntime_genai.models.builder \
19+
-m microsoft/Phi-3-mini-4k-instruct \
20+
-o phi3-int4-onnx \
21+
-p int4 \
22+
-e cpu # or cuda, dml
23+
```
24+
25+
This produces an optimized `.onnx` model folder with quantized weights.
26+
27+
### Consuming Quantized Models in C#
28+
Loading and running a quantized model uses the **same API** as FP32 models. ONNX Runtime automatically handles dequantization and optimized integer kernels where supported.
29+
30+
**Basic Example (Microsoft.ML.OnnxRuntime):**
31+
```csharp
32+
using Microsoft.ML.OnnxRuntime;
33+
using Microsoft.ML.OnnxRuntime.Tensors;
34+
using System.Collections.Generic;
35+
36+
public class QuantizedInference
37+
{
38+
private readonly InferenceSession _session;
39+
40+
public QuantizedInference(string modelPath)
41+
{
42+
var sessionOptions = new SessionOptions();
43+
sessionOptions.GraphOptimizationLevel = GraphOptimizationLevel.ORT_ENABLE_ALL;
44+
45+
// Enable hardware acceleration
46+
// sessionOptions.AppendExecutionProvider_CUDA(0); // or DirectML, CoreML, etc.
47+
48+
_session = new InferenceSession(modelPath, sessionOptions);
49+
}
50+
51+
public float[] RunInference(float[] inputData, int[] inputShape)
52+
{
53+
var inputTensor = new DenseTensor<float>(inputData, inputShape);
54+
var inputs = new List<NamedOnnxValue>
55+
{
56+
NamedOnnxValue.CreateFromTensor("input", inputTensor)
57+
};
58+
59+
using var results = _session.Run(inputs);
60+
var outputTensor = results.First().AsTensor<float>(); // Outputs usually remain float
61+
62+
return outputTensor.ToArray();
63+
}
64+
}
65+
```
66+
67+
For **generative LLMs**, prefer **Microsoft.ML.OnnxRuntimeGenAI**:
68+
```csharp
69+
using Microsoft.ML.OnnxRuntimeGenAI;
70+
71+
using var model = new Model("phi3-int4-onnx"); // Path to quantized folder
72+
using var tokenizer = new Tokenizer(model);
73+
using var generator = new Generator(model, new GeneratorParams { /* config */ });
74+
75+
// Streaming generation works identically to FP models
76+
```
77+
78+
### Precision vs. Memory Footprint Trade-offs
79+
- **8-bit Quantization**:
80+
- Memory: ~4× reduction vs. FP32 (1 byte per weight vs. 4 bytes).
81+
- Speed: Significant gains on CPU (VNNI/AVX, ARM dotprod) and supported GPUs. Integer math is faster.
82+
- Precision: Small drop (typically <1-2% accuracy loss for classification; very good for many tasks).
83+
84+
- **4-bit Quantization** (block-wise, common for LLMs):
85+
- Memory: ~8× reduction vs. FP32; ~4× vs. FP16. Enables running 7B–13B+ models on consumer hardware (e.g., 8–16 GB RAM).
86+
- Speed: Excellent throughput (up to 3–20× vs. FP16 in some GenAI cases) due to lower memory bandwidth and specialized kernels.
87+
- Precision: Noticeable but often acceptable degradation (perplexity increase, minor quality loss in generation). Use AWQ/GPTQ + calibration data for best results. Block size (e.g., 128) balances quality and compression.
88+
89+
**Quantization Impact**
90+
```mermaid
91+
quadrantChart
92+
title Precision vs Memory/Speed Trade-off
93+
x-axis "Low Memory/Speed" --> "High Memory/Speed"
94+
y-axis "Low Precision" --> "High Precision"
95+
quadrant-1 "4-bit INT4: Best for Edge/LLMs - High compression"
96+
quadrant-2 "FP32: Maximum quality, highest footprint"
97+
quadrant-3 "8-bit INT8: Excellent balance for most models"
98+
quadrant-4 "FP16: Good compromise on GPU"
99+
```
100+
101+
**Memory Footprint Comparison (7B parameter model)**
102+
```mermaid
103+
xychart-beta
104+
title "Approximate Model Size (in GB)"
105+
x-axis [FP32, FP16, INT8, INT4]
106+
y-axis "Size (GB)" 0 --> 30
107+
bar [28, 14, 7, 4]
108+
```
109+
110+
### Best Practices in C#/.NET AI Stack
111+
- Use **ONNX Runtime GenAI** for modern LLMs with 4-bit support.
112+
- Combine with **Microsoft.Extensions.AI** for provider abstraction and **Semantic Kernel** for orchestration.
113+
- Test accuracy on your domain data after quantization.
114+
- Profile with hardware-specific Execution Providers (CPU, CUDA, DirectML, QNN for edge).
115+
- Use `Span<T>` / `Memory<T>` for input preprocessing to maintain performance.
116+
- Monitor with `SessionOptions` tuning (intra/inter op threads, optimization level).
117+
118+
Quantized models via ONNX Runtime allow C# developers to run powerful AI on-device or at scale with dramatically reduced resource requirements, making .NET highly competitive for edge and cost-sensitive deployments. The minor precision trade-off is usually well worth the gains in speed, memory, and accessibility. For the latest details, refer to official ONNX Runtime quantization and GenAI documentation.

0 commit comments

Comments
 (0)