Skip to content

Commit f2db1c8

Browse files
authored
FEAT: [model] Qwen-Image (#3916)
1 parent 721361f commit f2db1c8

File tree

7 files changed

+86
-4
lines changed

7 files changed

+86
-4
lines changed

doc/source/models/builtin/image/index.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ The following is a list of built-in image models in Xinference:
2727

2828
kolors
2929

30+
qwen-image
31+
3032
sd-turbo
3133

3234
sd3-medium
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
.. _models_builtin_qwen-image:
2+
3+
==========
4+
Qwen-Image
5+
==========
6+
7+
- **Model Name:** Qwen-Image
8+
- **Model Family:** stable_diffusion
9+
- **Abilities:** text2image
10+
- **Available ControlNet:** None
11+
12+
Specifications
13+
^^^^^^^^^^^^^^
14+
15+
- **Model ID:** Qwen/Qwen-Image
16+
17+
Execute the following command to launch the model::
18+
19+
xinference launch --model-name Qwen-Image --model-type image
20+

doc/source/models/model_abilities/image.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,12 @@ The Text-to-image API is supported with the following models in Xinference:
4646
* sd3.5-large-turbo
4747
* FLUX.1-schnell
4848
* FLUX.1-dev
49+
* Flux.1-Kontext-dev
4950
* Kolors
5051
* hunyuandit-v1.2
5152
* hunyuandit-v1.2-distilled
53+
* cogview4
54+
* Qwen-Image
5255

5356

5457
Quickstart
@@ -211,6 +214,8 @@ Below list default options that used from v0.16.1.
211214
+-------------------+-----------------------+----------------------+------------------+
212215
| sd3.5-large-turbo | text_encoder_3 | N/A | True |
213216
+-------------------+-----------------------+----------------------+------------------+
217+
| Qwen-Image | text_encoder | N/A | False |
218+
+-------------------+-----------------------+----------------------+------------------+
214219

215220
.. note::
216221

xinference/core/worker.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -817,10 +817,7 @@ def _create_virtual_env_manager(
817817
# we specify python_path explicitly
818818
# sometimes uv would find other versions.
819819
python_path = pathlib.Path(sys.executable)
820-
kw = {}
821-
if XINFERENCE_VIRTUAL_ENV_SKIP_INSTALLED:
822-
kw["skip_installed"] = XINFERENCE_VIRTUAL_ENV_SKIP_INSTALLED
823-
virtual_env_manager.create_env(python_path=python_path, **kw)
820+
virtual_env_manager.create_env(python_path=python_path)
824821
return virtual_env_manager
825822

826823
@classmethod
@@ -847,6 +844,8 @@ def _prepare_virtual_env(
847844
packages.extend(virtual_env_packages)
848845
conf.pop("packages", None)
849846
conf.pop("inherit_pip_config", None)
847+
if XINFERENCE_VIRTUAL_ENV_SKIP_INSTALLED:
848+
conf["skip_installed"] = XINFERENCE_VIRTUAL_ENV_SKIP_INSTALLED
850849

851850
logger.info(
852851
"Installing packages %s in virtual env %s, with settings(%s)",

xinference/model/image/model_spec.json

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,39 @@
175175
"no_build_isolation": true
176176
}
177177
},
178+
{
179+
"version": 2,
180+
"model_name": "Qwen-Image",
181+
"model_family": "stable_diffusion",
182+
"model_ability": [
183+
"text2image"
184+
],
185+
"model_src": {
186+
"huggingface": {
187+
"model_id": "Qwen/Qwen-Image",
188+
"model_revision": "4516c4d3058302ff35cd86c62ffa645d039fefad"
189+
},
190+
"modelscope": {
191+
"model_id": "Qwen/Qwen-Image",
192+
"model_revision": "master"
193+
}
194+
},
195+
"default_model_config": {
196+
"quantize": true,
197+
"quantize_text_encoder": "text_encoder",
198+
"torch_dtype": "bfloat16"
199+
},
200+
"default_generate_config": {
201+
"guidance_scale": 1.0
202+
},
203+
"virtualenv": {
204+
"packages": [
205+
"git+https://github.com/huggingface/diffusers.git",
206+
"#system_numpy#"
207+
],
208+
"no_build_isolation": true
209+
}
210+
},
178211
{
179212
"version": 2,
180213
"model_name": "sd3-medium",

xinference/model/image/stable_diffusion/core.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,14 @@ def load(self):
254254
self._model = FluxKontextPipeline.from_pretrained(
255255
self._model_path, **self._kwargs
256256
)
257+
elif "qwen" in self._model_spec.model_name.lower():
258+
# TODO: remove this branch when auto pipeline supports
259+
# Qwen-Image
260+
from diffusers import DiffusionPipeline
261+
262+
self._model = DiffusionPipeline.from_pretrained(
263+
self._model_path, **self._kwargs
264+
)
257265
else:
258266
raise
259267
self._load_to_device(self._model)
@@ -348,11 +356,19 @@ def _quantize_text_encoder(self, quantize_text_encoder: Optional[str]):
348356
return
349357

350358
if not quantize_text_encoder:
359+
logger.debug("No text encoder quantization")
351360
return
352361

353362
quantization_method = self._kwargs.pop("text_encoder_quantize_method", "bnb")
354363
quantization = self._kwargs.pop("text_encoder_quantization", "8-bit")
355364

365+
logger.debug(
366+
"Quantize text encoder %s with method %s, quantization %s",
367+
quantize_text_encoder,
368+
quantization_method,
369+
quantization,
370+
)
371+
356372
torch_dtype = self._torch_dtype
357373
for text_encoder_name in quantize_text_encoder.split(","):
358374
quantization_kwargs: Dict[str, Any] = {}
@@ -389,8 +405,13 @@ def _quantize_transformer(self):
389405

390406
if not quantization:
391407
# skip if no quantization specified
408+
logger.debug("No transformer quantization")
392409
return
393410

411+
logger.debug(
412+
"Quantize transformer with %s, quantization %s", method, quantization
413+
)
414+
394415
torch_dtype = self._torch_dtype
395416
transformer_cls = self._get_layer_cls("transformer")
396417
quantization_config = self._get_quantize_config(
@@ -409,6 +430,7 @@ def _quantize_transformer_gguf(self):
409430

410431
# GGUF transformer
411432
torch_dtype = self._torch_dtype
433+
logger.debug("Quantize transformer with gguf file %s", self._gguf_model_path)
412434
self._kwargs["transformer"] = self._get_layer_cls(
413435
"transformer"
414436
).from_single_file(

xinference/ui/web/ui/src/scenes/launch_model/data/data.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ export const featureModels = [
113113
{
114114
type: 'image',
115115
feature_models: [
116+
'Qwen-Image',
116117
'FLUX.1-dev',
117118
'FLUX.1-Kontext-dev',
118119
'FLUX.1-schnell',

0 commit comments

Comments
 (0)