apple / apple/coremltools

experimental.linear_quantize_activations with Classifier_config in ct.conver "fails" w/message 'dict' object has no attribute 'flatten'

Open
#2,253 3 comments 0 reactions 0 assignees View on GitHub
bug
Dominant language
Python
Stars
5.4k
Forks
850
Avg merge
4d 5h
Merged PRs (30d)
10

Description

## 🐞Describing the bug

when coreML model is converted with classifier_config=
activation quantization with linear_quantize_activations
prints error:
Running compression pass linear_quantize_activations: calibrating sample 3/20 fails.
'dict' object has no attribute 'flatten'
It does not affect the actual results, other than slowing down the quantization process
## Stack Trace
- If applicable, please paste the complete stack trace.

## To Reproduce
```python
import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision.transforms as transforms
import coremltools as ct
import coremltools.optimize as cto
from PIL import Image
import numpy as np
import requests

torch.manual_seed(0)
torch.use_deterministic_algorithms(True)

model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True)
model.eval()

transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])

sample_data = []

for _ in range(20):
# Create a white image
image = Image.new('RGB', (224, 224), (255, 255, 255))
sample_data.append({"x_1": image})

print(f"Total images in sample_data: {len(sample_data)}")

input_tensor = transform(image).unsqueeze(0) # Add batch dimension

with torch.no_grad():
output = model(input_tensor)
scores_pytorch = output.numpy().squeeze()

labels_url = "https://raw.githubusercontent.com/pytorch/hub/master/imagenet_classes.txt"
response = requests.get(labels_url)
class_labels = response.text.splitlines()
class_labels = [label for label in class_labels if label]

image_input = ct.ImageType(shape=(1, 3, 224, 224), bias=[-2.117, -2.035, -1.804], scale=1/255/0.229)
traced_model = torch.jit.trace(model, input_tensor)

coreml_model_iOS17 = ct.convert(
traced_model,
inputs=[image_input],
classifier_config=ct.ClassifierConfig(class_labels=class_labels),
minimum_deployment_target=ct.target.iOS17
)

activation_config_iOS17 = cto.coreml.OptimizationConfig(
global_config=cto.coreml.experimental.OpActivationLinearQuantizerConfig(
mode="linear_symmetric"
)
)
compressed_model_a8_iOS17 = cto.coreml.experimental.linear_quantize_activations(
coreml_model_iOS17, activation_config_iOS17, sample_data
)

weight_config_int8_iOS17 = cto.coreml.OptimizationConfig(
global_config=cto.coreml.OpLinearQuantizerConfig(
mode="linear_symmetric", dtype=ct.converters.mil.mil.types.int8
)
)

compressed_model_w8a8_iOS17 = cto.coreml.linear_quantize_weights(compressed_model_a8_iOS17, weight_config_int8_iOS17)

compressed_model_w8a8_iOS17.save("resnet50-A8-iOS17.mlpackage")
```

Contributor guide

Open the contributing guide

Research direction

Start by running the provided Python reproduction through cto.coreml.experimental.linear_quantize_activations with a ClassifierConfig and the sample_data dictionaries. Inspect how calibration samples are passed when classifier_config is present, and confirm completion without the 'dict' object has no attribute 'flatten' message while preserving the conversion results.

Written by the indexing model from the issue text.

Assessment

Tech stack
python, pytorch
Domain
machine-learning, tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.