ConvNet FP8 support
Open
@nvyihengz is already working on this.
Since Jun 3, 2025.
Module:Performance
triaged
- Dominant language
- C++
- Stars
- 13.4k
- Forks
- 2.4k
- Avg merge
- 5d 3h
- Merged PRs (30d)
- 2
Description
I find that the Conv+bn can't fused with relu and Conv+bn Kernel's output type always is FP32, very slow, slower than FP16 and int8
import torch
import torchvision
import modelopt.torch.quantization as mtq
_default_disabled_quantizer_cfg = {
"nn.BatchNorm1d": {"*": {"enable": False}},
"nn.BatchNorm2d": {"*": {"enable": False}},
"nn.BatchNorm3d": {"*": {"enable": False}},
"nn.LeakyReLU": {"*": {"enable": False}},
"*lm_head*": {"enable": False},
"*proj_out.*": {"enable": False}, # In Whisper model, lm_head has key name proj_out
"*block_sparse_moe.gate*": {"enable": False}, # Skip the MOE router
"*router*": {"enable": False}, # Skip the MOE router
"*mlp.gate.*": {"enable": False}, # Skip the MOE router
"*mlp.shared_expert_gate.*": {"enable": False}, # Skip the MOE router
"*output_layer*": {"enable": False},
"output.*": {"enable": False},
"default": {"enable": False},
}
FP8_DEFAULT_CFG = {
"quant_cfg": {
"*weight_quantizer": {"num_bits": (4, 3), "axis": None},
"*input_quantizer": {"num_bits": (4, 3), "axis": None},
"*output_quantizer": {"enable": False},
**_default_disabled_quantizer_cfg,
},
"algorithm": "max",
}
def calib_loop():
for _ in range(10):
model(torch.randn(16, 3, 224, 224, device='cuda'))
dynamic_axes = {'input': {0: 'batch'}, 'output': {0: 'batch'}}
model = torchvision.models.resnet18(pretrained=True).cuda()
mtq.quantize(model, FP8_DEFAULT_CFG, forward_loop=calib_loop)
data = torch.randn(16,3,224,224,device='cuda')
model.forward(data)
def generate_fp8_scales(unet):
# temporary solution due to a known bug in torch.onnx._dynamo_export
for _, module in unet.named_modules():
if isinstance(module, (torch.nn.Linear, torch.nn.Conv2d)):
module.input_quantizer._num_bits = 8
module.weight_quantizer._num_bits = 8
module.input_quantizer._amax = (module.input_quantizer._amax * 127) / 448.0
module.weight_quantizer._amax = (module.weight_quantizer._amax * 127) / 448.0
generate_fp8_scales(model)
torch.onnx.export(
model,
data,
'resnet18_fp8.onnx',
opset_version=17,
do_constant_folding=True
)
How Can I get same speed up like int8??????
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.