Deep learning models have made significant progress in various domains, but their large sizes and complex architectures often inhibit their deployment on devices with limited computational resources. One effective solution to this problem is model compression, which involves reducing the size of deep learning models while maintaining or even improving their performance. In this article, we'll explore automated model compression in PyTorch using the Distiller framework, which provides various techniques to optimize neural networks.
What is Distiller?
Distiller is an open-source library specifically designed to compress deep learning models within the PyTorch framework. It facilitates pruning, quantization, and other optimization methods aimed at shrinking models while preserving their accuracy. Developed by Nervana Systems, Distiller offers a user-friendly API, comprehensive built-in algorithms, and tools to evaluate the effectiveness of compressed models.
Setting Up Distiller
Before using Distiller, ensure you have PyTorch installed. You can install Distiller via pip:
pip install numpy scipy
pip install git+https://github.com/IntelLabs/distiller.git
These commands install Distiller along with its dependencies. Once the installation is complete, you are set to begin compressing models.
Using the Distiller Framework
Pruning a Model
Pruning involves removing unnecessary parts of a model to improve efficiency. In Distiller, you can prune a model with simple modifications to your code. Here's an example:
import torch
import distiller
from distiller.apputils.data_loaders import load_data
from distiller.apputils import create_experiment_dir, get_dummy_input_shape
# Load your pre-trained model
model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet18', pretrained=True)
# Define a pruning schedule
pruning_schedule = {
'start_epoch': 0,
'end_epoch': 4,
'frequency': 1,
}
# Apply pruning to the model
pruning_policy = distiller.pruning.L1RankedStructureParameterPruner('ConvPruner',
pruning_schedule,
'module.conv1')
# Execute pruning
pruned_model = distiller.pruning.create_pruning_scheduler_pruned_model(
model, pruning_policies=[pruning_policy]
)
This code snippet initiates an L1-ranked structural pruning on the 'conv1' layer of a pre-trained ResNet18 model. By adjusting the pruning_schedule, you can control how and when the pruning takes place across different epochs.
Quantization
Quantization reduces the precision of the model parameters, which helps in shrinking model size and decreasing computation requirements. Distiller contains built-in functions for quantization:
from distiller.quantization import PostTrainLinearQuantizer
# Instantiate quantizer
tensor_quantization = {
'weight': {'bit_width': 8},
'bias': {'bit_width': 8}
}
quantizer = PostTrainLinearQuantizer(
model, quant_scheme='sym',
logger=None, tensor_quant=tensor_quantization)
# Quantize the model
quantized_model = quantizer.compress_model()
This program demonstrates a post-training quantization procedure to compress the precision of model weights and biases to 8 bits, thereby reducing model size without a substantial loss in accuracy.
Evaluating Compression Results
After applying pruning or quantization techniques, assessing the impact on model performance is crucial. Using Distiller, you can evaluate the compressed models with standard metrics:
from distiller.apputils import evaluate_model
# Assume `val_loader` is a validation data loader
evaluate_model(quantized_model, val_loader,
metrics=['acc'],
test_only=True)
This script assesses the quantized model's accuracy by measuring its performance against a validation dataset. Comparison with the original model accuracy reveals the effectiveness of the compression.
Conclusion
Distiller offers a comprehensive suite of model compression tools in PyTorch, balancing out the trade-off between model complexity and performance. By pruning and quantizing models effectively, you can deploy deep learning models in resource-constrained environments without compromising critical functionalities. Experiment with different strategies and leverage the optimized models that suit your application's needs.