Bird
Raised Fist0
PyTorchml~5 mins

Model optimization (quantization, pruning) in PyTorch

Choose your learning style10 modes available
Introduction

Model optimization helps make machine learning models smaller and faster. This is useful to run models on devices with less power or memory.

When you want to run a model on a smartphone or small device.
When you need faster predictions without changing the model's accuracy much.
When you want to save storage space for your model files.
When deploying models in places with limited internet or hardware.
When reducing energy use is important, like in battery-powered devices.
Syntax
PyTorch
import torch
import torch.nn.utils.prune as prune

# Pruning example
prune.l1_unstructured(module, name='weight', amount=0.3)

# Quantization example
model.qconfig = torch.quantization.get_default_qconfig('fbgemm')
torch.quantization.prepare(model, inplace=True)
torch.quantization.convert(model, inplace=True)

Pruning removes less important weights to make the model smaller.

Quantization reduces the number size (like from 32-bit to 8-bit) to speed up the model.

Examples
This prunes 20% of the smallest weights in layer1 using L1 norm.
PyTorch
prune.l1_unstructured(model.layer1, name='weight', amount=0.2)
This removes the pruning reparameterization and makes pruning permanent.
PyTorch
prune.remove(model.layer1, 'weight')
This prepares and converts the model for 8-bit quantization using the 'fbgemm' backend.
PyTorch
model.qconfig = torch.quantization.get_default_qconfig('fbgemm')
torch.quantization.prepare(model, inplace=True)
torch.quantization.convert(model, inplace=True)
Sample Model

This code shows how to prune 40% of the weights in a simple linear layer and then quantize the model to 8-bit. It prints the number of weights before and after pruning and shows the model output after quantization.

PyTorch
import torch
import torch.nn as nn
import torch.nn.utils.prune as prune
import torch.quantization

# Define a simple model
class SimpleModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc = nn.Linear(10, 5)
    def forward(self, x):
        return self.fc(x)

model = SimpleModel()

# Before pruning: count nonzero weights
initial_nonzero = torch.count_nonzero(model.fc.weight).item()

# Prune 40% of weights in fc layer
prune.l1_unstructured(model.fc, name='weight', amount=0.4)

# Remove pruning reparameterization to make pruning permanent
prune.remove(model.fc, 'weight')

# Count nonzero weights after pruning
pruned_nonzero = torch.count_nonzero(model.fc.weight).item()

# Prepare model for quantization
model.qconfig = torch.quantization.get_default_qconfig('fbgemm')
torch.quantization.prepare(model, inplace=True)

# Fake calibration with random data
model(torch.randn(1, 10))

# Convert to quantized model
torch.quantization.convert(model, inplace=True)

# Check model output
input_data = torch.randn(1, 10)
output = model(input_data)

print(f"Initial nonzero weights: {initial_nonzero}")
print(f"Nonzero weights after pruning: {pruned_nonzero}")
print(f"Model output after quantization: {output}")
OutputSuccess
Important Notes

Pruning can reduce model size but might slightly reduce accuracy.

Quantization works best after some calibration with real data.

Always test your model after optimization to check performance.

Summary

Model optimization makes models smaller and faster.

Pruning removes less important weights.

Quantization reduces number precision to speed up models.

Practice

(1/5)
1. What is the main goal of model pruning in PyTorch?
easy
A. Add more training data to improve accuracy
B. Increase the number of layers in the model
C. Change the model architecture to a different type
D. Remove less important weights to make the model smaller

Solution

  1. Step 1: Understand pruning concept

    Pruning means removing weights that do not contribute much to the model's output.
  2. Step 2: Identify pruning effect

    Removing these weights makes the model smaller and faster without changing its structure.
  3. Final Answer:

    Remove less important weights to make the model smaller -> Option D
  4. Quick Check:

    Pruning = Remove less important weights [OK]
Hint: Pruning cuts unimportant weights to shrink model size [OK]
Common Mistakes:
  • Thinking pruning adds layers
  • Confusing pruning with data augmentation
  • Believing pruning changes model type
2. Which PyTorch function is used to apply pruning to a layer?
easy
A. torch.nn.utils.prune.l1_unstructured
B. torch.quantization.quantize_dynamic
C. torch.optim.Adam
D. torch.nn.functional.relu

Solution

  1. Step 1: Identify pruning functions in PyTorch

    PyTorch pruning utilities are in torch.nn.utils.prune module.
  2. Step 2: Match pruning function

    l1_unstructured is a common pruning method that removes weights based on L1 norm.
  3. Final Answer:

    torch.nn.utils.prune.l1_unstructured -> Option A
  4. Quick Check:

    Pruning function = l1_unstructured [OK]
Hint: Pruning uses torch.nn.utils.prune functions [OK]
Common Mistakes:
  • Confusing pruning with quantization functions
  • Choosing optimizer functions by mistake
  • Selecting activation functions instead of pruning
3. What will be the output shape of the model's weight tensor after applying this pruning code?
import torch
import torch.nn.utils.prune as prune

layer = torch.nn.Linear(4, 3)
prune.l1_unstructured(layer, name='weight', amount=0.5)
print(layer.weight.shape)
medium
A. torch.Size([4, 3]) with half weights removed
B. torch.Size([3, 4]) with half weights removed physically
C. torch.Size([3, 4]) with some weights zeroed
D. torch.Size([4, 3]) unchanged

Solution

  1. Step 1: Check layer weight shape

    A Linear layer with input 4 and output 3 has weight shape (3, 4).
  2. Step 2: Understand pruning effect on weight tensor

    Pruning sets some weights to zero but does not change tensor shape.
  3. Final Answer:

    torch.Size([3, 4]) with some weights zeroed -> Option C
  4. Quick Check:

    Pruning zeros weights, shape stays same [OK]
Hint: Pruning zeros weights but keeps tensor shape [OK]
Common Mistakes:
  • Thinking pruning changes tensor shape
  • Confusing input/output dimensions order
  • Assuming weights are physically removed
4. Identify the error in this PyTorch pruning code:
import torch.nn.utils.prune as prune
layer = torch.nn.Linear(5, 2)
prune.l1_unstructured(layer, name='bias', amount=0.3)
medium
A. Missing import for torch
B. Layer input and output sizes are invalid
C. Amount must be an integer, not float
D. Cannot prune bias with l1_unstructured

Solution

  1. Step 1: Examine the code imports

    The code imports only prune but attempts to use torch.nn.Linear without importing torch.
  2. Step 2: Identify the runtime error

    This causes NameError: name 'torch' is not defined when creating the layer.
  3. Final Answer:

    Missing import for torch -> Option A
  4. Quick Check:

    Missing torch import causes NameError [OK]
Hint: Import torch before using torch.nn [OK]
Common Mistakes:
  • Overlooking missing torch import
  • Thinking pruning bias is unsupported
  • Assuming amount must be integer
5. You want to speed up inference on a PyTorch model by reducing number precision. Which approach should you use?
hard
A. Increase batch size during training
B. Apply dynamic quantization to convert weights to lower precision
C. Prune 90% of the model weights randomly
D. Add dropout layers to the model

Solution

  1. Step 1: Understand quantization purpose

    Quantization reduces number precision (e.g., float32 to int8) to speed up inference.
  2. Step 2: Identify correct method

    Dynamic quantization in PyTorch converts weights to lower precision without retraining.
  3. Step 3: Compare other options

    Pruning removes weights but may not speed inference as much; batch size and dropout affect training, not inference speed.
  4. Final Answer:

    Apply dynamic quantization to convert weights to lower precision -> Option B
  5. Quick Check:

    Quantization = lower precision for speed [OK]
Hint: Quantization reduces precision to speed inference [OK]
Common Mistakes:
  • Confusing pruning with quantization
  • Thinking batch size affects model speed directly
  • Adding dropout to speed inference
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard