Skip to content

Commit d954644

Browse files
committed
update
1 parent f2f5c68 commit d954644

File tree

2 files changed

+60
-3
lines changed

2 files changed

+60
-3
lines changed

src/diffusers/quantizers/pipe_quant_config.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ def _resolve_quant_config(self, is_diffusers: bool = True, module_name: str = No
157157
if self.is_granular and module_name in quant_mapping:
158158
logger.debug(f"Initializing quantization config class for {module_name}.")
159159
config = quant_mapping[module_name]
160+
self.config_mapping.update({module_name: config})
160161
return config
161162

162163
# Global config case
@@ -195,6 +196,7 @@ def _get_quant_config_list(self):
195196

196197
def __repr__(self):
197198
out = ""
198-
for module_name, config in self.config_mapping.items():
199-
out += f"{module_name} {config}\n"
199+
config_mapping = dict(sorted(self.config_mapping.copy().items()))
200+
for module_name, config in config_mapping.items():
201+
out += f"{module_name} {config}"
200202
return out

tests/quantization/test_pipeline_level_quantization.py

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@
1212
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
15+
import json
1516
import tempfile
1617
import unittest
1718

1819
import torch
1920
from parameterized import parameterized
2021

21-
from diffusers import DiffusionPipeline, QuantoConfig
22+
from diffusers import BitsAndBytesConfig, DiffusionPipeline, QuantoConfig
2223
from diffusers.quantizers import PipelineQuantizationConfig
2324
from diffusers.utils import logging
2425
from diffusers.utils.testing_utils import (
@@ -243,3 +244,57 @@ def test_no_quantization_for_all_invalid_components(self, method):
243244
for name, component in pipe.components.items():
244245
if isinstance(component, torch.nn.Module):
245246
self.assertTrue(not hasattr(component.config, "quantization_config"))
247+
248+
@parameterized.expand(["quant_kwargs", "quant_mapping"])
249+
def test_quant_config_repr(self, method):
250+
component_name = "transformer"
251+
if method == "quant_kwargs":
252+
components_to_quantize = [component_name]
253+
quant_config = PipelineQuantizationConfig(
254+
quant_backend="bitsandbytes_8bit",
255+
quant_kwargs={"load_in_8bit": True},
256+
components_to_quantize=components_to_quantize,
257+
)
258+
else:
259+
quant_config = PipelineQuantizationConfig(
260+
quant_mapping={component_name: BitsAndBytesConfig(load_in_8bit=True)}
261+
)
262+
263+
pipe = DiffusionPipeline.from_pretrained(
264+
self.model_name,
265+
quantization_config=quant_config,
266+
torch_dtype=torch.bfloat16,
267+
)
268+
self.assertTrue(getattr(pipe, "quantization_config", None) is not None)
269+
retrieved_config = pipe.quantization_config
270+
expected_config = """
271+
transformer BitsAndBytesConfig {
272+
"_load_in_4bit": false,
273+
"_load_in_8bit": true,
274+
"bnb_4bit_compute_dtype": "float32",
275+
"bnb_4bit_quant_storage": "uint8",
276+
"bnb_4bit_quant_type": "fp4",
277+
"bnb_4bit_use_double_quant": false,
278+
"llm_int8_enable_fp32_cpu_offload": false,
279+
"llm_int8_has_fp16_weight": false,
280+
"llm_int8_skip_modules": null,
281+
"llm_int8_threshold": 6.0,
282+
"load_in_4bit": false,
283+
"load_in_8bit": true,
284+
"quant_method": "bitsandbytes"
285+
}
286+
287+
"""
288+
expected_data = self._parse_config_string(expected_config)
289+
actual_data = self._parse_config_string(str(retrieved_config))
290+
self.assertTrue(actual_data == expected_data)
291+
292+
def _parse_config_string(self, config_string: str) -> tuple[str, dict]:
293+
first_brace = config_string.find("{")
294+
if first_brace == -1:
295+
raise ValueError("Could not find opening brace '{' in the string.")
296+
297+
json_part = config_string[first_brace:]
298+
data = json.loads(json_part)
299+
300+
return data

0 commit comments

Comments
 (0)