xinference 0.15.2__py3-none-any.whl → 0.15.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of xinference might be problematic. Click here for more details.

Files changed (57) hide show
  1. xinference/_version.py +3 -3
  2. xinference/api/restful_api.py +29 -2
  3. xinference/client/restful/restful_client.py +10 -0
  4. xinference/constants.py +4 -0
  5. xinference/core/image_interface.py +76 -23
  6. xinference/core/model.py +80 -39
  7. xinference/core/progress_tracker.py +187 -0
  8. xinference/core/supervisor.py +11 -0
  9. xinference/core/worker.py +1 -0
  10. xinference/model/audio/chattts.py +2 -1
  11. xinference/model/audio/core.py +0 -2
  12. xinference/model/audio/model_spec.json +8 -0
  13. xinference/model/audio/model_spec_modelscope.json +9 -0
  14. xinference/model/embedding/core.py +14 -5
  15. xinference/model/embedding/model_spec.json +7 -0
  16. xinference/model/embedding/model_spec_modelscope.json +9 -1
  17. xinference/model/image/core.py +6 -7
  18. xinference/model/image/sdapi.py +35 -4
  19. xinference/model/image/stable_diffusion/core.py +212 -70
  20. xinference/model/llm/llm_family.json +28 -40
  21. xinference/model/llm/llm_family_modelscope.json +18 -22
  22. xinference/model/llm/transformers/cogvlm2.py +2 -1
  23. xinference/model/llm/transformers/cogvlm2_video.py +2 -0
  24. xinference/model/llm/transformers/core.py +6 -2
  25. xinference/model/llm/transformers/deepseek_vl.py +2 -0
  26. xinference/model/llm/transformers/glm4v.py +2 -1
  27. xinference/model/llm/transformers/intern_vl.py +2 -0
  28. xinference/model/llm/transformers/minicpmv25.py +2 -0
  29. xinference/model/llm/transformers/minicpmv26.py +2 -0
  30. xinference/model/llm/transformers/omnilmm.py +2 -0
  31. xinference/model/llm/transformers/qwen2_audio.py +11 -4
  32. xinference/model/llm/transformers/qwen2_vl.py +2 -28
  33. xinference/model/llm/transformers/qwen_vl.py +2 -1
  34. xinference/model/llm/transformers/utils.py +35 -2
  35. xinference/model/llm/transformers/yi_vl.py +2 -0
  36. xinference/model/llm/utils.py +72 -17
  37. xinference/model/llm/vllm/core.py +69 -9
  38. xinference/model/llm/vllm/utils.py +41 -0
  39. xinference/model/rerank/core.py +19 -0
  40. xinference/model/rerank/model_spec.json +8 -0
  41. xinference/model/rerank/model_spec_modelscope.json +8 -0
  42. xinference/model/utils.py +7 -29
  43. xinference/model/video/core.py +0 -2
  44. xinference/web/ui/build/asset-manifest.json +3 -3
  45. xinference/web/ui/build/index.html +1 -1
  46. xinference/web/ui/build/static/js/{main.29578905.js → main.e51a356d.js} +3 -3
  47. xinference/web/ui/build/static/js/main.e51a356d.js.map +1 -0
  48. xinference/web/ui/node_modules/.cache/babel-loader/4385c1095eefbff0a8ec3b2964ba6e5a66a05ab31be721483ca2f43e2a91f6ff.json +1 -0
  49. {xinference-0.15.2.dist-info → xinference-0.15.4.dist-info}/METADATA +6 -5
  50. {xinference-0.15.2.dist-info → xinference-0.15.4.dist-info}/RECORD +55 -53
  51. xinference/web/ui/build/static/js/main.29578905.js.map +0 -1
  52. xinference/web/ui/node_modules/.cache/babel-loader/68bede6d95bb5ef0b35bbb3ec5b8c937eaf6862c6cdbddb5ef222a7776aaf336.json +0 -1
  53. /xinference/web/ui/build/static/js/{main.29578905.js.LICENSE.txt → main.e51a356d.js.LICENSE.txt} +0 -0
  54. {xinference-0.15.2.dist-info → xinference-0.15.4.dist-info}/LICENSE +0 -0
  55. {xinference-0.15.2.dist-info → xinference-0.15.4.dist-info}/WHEEL +0 -0
  56. {xinference-0.15.2.dist-info → xinference-0.15.4.dist-info}/entry_points.txt +0 -0
  57. {xinference-0.15.2.dist-info → xinference-0.15.4.dist-info}/top_level.txt +0 -0
@@ -71,6 +71,14 @@
71
71
  "model_ability": "audio-to-text",
72
72
  "multilingual": true
73
73
  },
74
+ {
75
+ "model_name": "whisper-large-v3-turbo",
76
+ "model_family": "whisper",
77
+ "model_id": "openai/whisper-large-v3-turbo",
78
+ "model_revision": "41f01f3fe87f28c78e2fbf8b568835947dd65ed9",
79
+ "model_ability": "audio-to-text",
80
+ "multilingual": true
81
+ },
74
82
  {
75
83
  "model_name": "Belle-distilwhisper-large-v2-zh",
76
84
  "model_family": "whisper",
@@ -8,6 +8,15 @@
8
8
  "model_ability": "audio-to-text",
9
9
  "multilingual": true
10
10
  },
11
+ {
12
+ "model_name": "whisper-large-v3-turbo",
13
+ "model_family": "whisper",
14
+ "model_hub": "modelscope",
15
+ "model_id": "AI-ModelScope/whisper-large-v3-turbo",
16
+ "model_revision": "master",
17
+ "model_ability": "audio-to-text",
18
+ "multilingual": true
19
+ },
11
20
  {
12
21
  "model_name": "SenseVoiceSmall",
13
22
  "model_family": "funasr",
@@ -141,7 +141,15 @@ class EmbeddingModel:
141
141
 
142
142
  def load(self):
143
143
  try:
144
+ import sentence_transformers
144
145
  from sentence_transformers import SentenceTransformer
146
+
147
+ if sentence_transformers.__version__ < "3.1.0":
148
+ raise ValueError(
149
+ "The sentence_transformers version must be greater than 3.1.0. "
150
+ "Please upgrade your version via `pip install -U sentence_transformers` or refer to "
151
+ "https://github.com/UKPLab/sentence-transformers"
152
+ )
145
153
  except ImportError:
146
154
  error_message = "Failed to import module 'SentenceTransformer'"
147
155
  installation_guide = [
@@ -173,9 +181,6 @@ class EmbeddingModel:
173
181
  )
174
182
  torch_dtype = torch.float32
175
183
 
176
- from ..utils import patch_trust_remote_code
177
-
178
- patch_trust_remote_code()
179
184
  if (
180
185
  "gte" in self._model_spec.model_name.lower()
181
186
  and "qwen2" in self._model_spec.model_name.lower()
@@ -191,7 +196,10 @@ class EmbeddingModel:
191
196
  else:
192
197
  model_kwargs = {"torch_dtype": torch_dtype} if torch_dtype else None
193
198
  self._model = SentenceTransformer(
194
- self._model_path, device=self._device, model_kwargs=model_kwargs
199
+ self._model_path,
200
+ device=self._device,
201
+ model_kwargs=model_kwargs,
202
+ trust_remote_code=True,
195
203
  )
196
204
 
197
205
  def create_embedding(self, sentences: Union[str, List[str]], **kwargs):
@@ -213,6 +221,7 @@ class EmbeddingModel:
213
221
  convert_to_tensor: bool = False,
214
222
  device: str = None,
215
223
  normalize_embeddings: bool = False,
224
+ **kwargs,
216
225
  ):
217
226
  """
218
227
  Computes sentence embeddings
@@ -317,7 +326,7 @@ class EmbeddingModel:
317
326
  all_token_nums += features["attention_mask"].sum().item()
318
327
 
319
328
  with torch.no_grad():
320
- out_features = model.forward(features)
329
+ out_features = model.forward(features, **kwargs)
321
330
 
322
331
  if output_value == "token_embeddings":
323
332
  embeddings = []
@@ -238,5 +238,12 @@
238
238
  "language": ["zh", "en"],
239
239
  "model_id": "Alibaba-NLP/gte-Qwen2-7B-instruct",
240
240
  "model_revision": "e26182b2122f4435e8b3ebecbf363990f409b45b"
241
+ },
242
+ {
243
+ "model_name": "jina-embeddings-v3",
244
+ "dimensions": 1024,
245
+ "max_tokens": 8192,
246
+ "language": ["zh", "en"],
247
+ "model_id": "jinaai/jina-embeddings-v3"
241
248
  }
242
249
  ]
@@ -233,12 +233,20 @@
233
233
  "model_id": "AI-ModelScope/m3e-large",
234
234
  "model_hub": "modelscope"
235
235
  },
236
- {
236
+ {
237
237
  "model_name": "gte-Qwen2",
238
238
  "dimensions": 4096,
239
239
  "max_tokens": 32000,
240
240
  "language": ["zh", "en"],
241
241
  "model_id": "iic/gte_Qwen2-7B-instruct",
242
242
  "model_hub": "modelscope"
243
+ },
244
+ {
245
+ "model_name": "jina-embeddings-v3",
246
+ "dimensions": 1024,
247
+ "max_tokens": 8192,
248
+ "language": ["zh", "en"],
249
+ "model_id": "jinaai/jina-embeddings-v3",
250
+ "model_hub": "modelscope"
243
251
  }
244
252
  ]
@@ -23,8 +23,6 @@ from ..core import CacheableModelSpec, ModelDescription
23
23
  from ..utils import valid_model_revision
24
24
  from .stable_diffusion.core import DiffusionModel
25
25
 
26
- MAX_ATTEMPTS = 3
27
-
28
26
  logger = logging.getLogger(__name__)
29
27
 
30
28
  MODEL_NAME_TO_REVISION: Dict[str, List[str]] = defaultdict(list)
@@ -210,18 +208,19 @@ def create_image_model_instance(
210
208
  for name in controlnet:
211
209
  for cn_model_spec in model_spec.controlnet:
212
210
  if cn_model_spec.model_name == name:
213
- if not model_path:
214
- model_path = cache(cn_model_spec)
215
- controlnet_model_paths.append(model_path)
211
+ controlnet_model_path = cache(cn_model_spec)
212
+ controlnet_model_paths.append(controlnet_model_path)
216
213
  break
217
214
  else:
218
215
  raise ValueError(
219
216
  f"controlnet `{name}` is not supported for model `{model_name}`."
220
217
  )
221
218
  if len(controlnet_model_paths) == 1:
222
- kwargs["controlnet"] = controlnet_model_paths[0]
219
+ kwargs["controlnet"] = (controlnet[0], controlnet_model_paths[0])
223
220
  else:
224
- kwargs["controlnet"] = controlnet_model_paths
221
+ kwargs["controlnet"] = [
222
+ (n, path) for n, path in zip(controlnet, controlnet_model_paths)
223
+ ]
225
224
  if not model_path:
226
225
  model_path = cache(model_spec)
227
226
  if peft_model_config is not None:
@@ -11,11 +11,12 @@
11
11
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
+
14
15
  import base64
15
16
  import io
16
17
  import warnings
17
18
 
18
- from PIL import Image
19
+ from PIL import Image, ImageOps
19
20
 
20
21
 
21
22
  class SDAPIToDiffusersConverter:
@@ -26,11 +27,12 @@ class SDAPIToDiffusersConverter:
26
27
  "width",
27
28
  "height",
28
29
  "sampler_name",
30
+ "progressor",
29
31
  }
30
32
  txt2img_arg_mapping = {
31
33
  "steps": "num_inference_steps",
32
34
  "cfg_scale": "guidance_scale",
33
- # "denoising_strength": "strength",
35
+ "denoising_strength": "strength",
34
36
  }
35
37
  img2img_identical_args = {
36
38
  "prompt",
@@ -39,12 +41,15 @@ class SDAPIToDiffusersConverter:
39
41
  "width",
40
42
  "height",
41
43
  "sampler_name",
44
+ "progressor",
42
45
  }
43
46
  img2img_arg_mapping = {
44
47
  "init_images": "image",
48
+ "mask": "mask_image",
45
49
  "steps": "num_inference_steps",
46
50
  "cfg_scale": "guidance_scale",
47
51
  "denoising_strength": "strength",
52
+ "inpaint_full_res_padding": "padding_mask_crop",
48
53
  }
49
54
 
50
55
  @staticmethod
@@ -121,12 +126,38 @@ class SDAPIDiffusionModelMixin:
121
126
 
122
127
  def img2img(self, **kwargs):
123
128
  init_images = kwargs.pop("init_images", [])
124
- kwargs["init_images"] = [self._decode_b64_img(i) for i in init_images]
129
+ kwargs["init_images"] = init_images = [
130
+ self._decode_b64_img(i) for i in init_images
131
+ ]
132
+ if len(init_images) == 1:
133
+ kwargs["init_images"] = init_images[0]
134
+ mask_image = kwargs.pop("mask", None)
135
+ if mask_image:
136
+ if kwargs.pop("inpainting_mask_invert"):
137
+ mask_image = ImageOps.invert(mask_image)
138
+
139
+ kwargs["mask"] = self._decode_b64_img(mask_image)
140
+
141
+ # process inpaint_full_res and inpaint_full_res_padding
142
+ if kwargs.pop("inpaint_full_res", None):
143
+ kwargs["inpaint_full_res_padding"] = kwargs.pop(
144
+ "inpaint_full_res_padding", 0
145
+ )
146
+ else:
147
+ # inpaint_full_res_padding is turned `into padding_mask_crop`
148
+ # in diffusers, if padding_mask_crop is passed, it will do inpaint_full_res
149
+ # so if not inpaint_full_rs, we need to pop this option
150
+ kwargs.pop("inpaint_full_res_padding", None)
151
+
125
152
  clip_skip = kwargs.get("override_settings", {}).get("clip_skip")
126
153
  converted_kwargs = self._check_kwargs("img2img", kwargs)
127
154
  if clip_skip:
128
155
  converted_kwargs["clip_skip"] = clip_skip
129
- result = self.image_to_image(response_format="b64_json", **converted_kwargs) # type: ignore
156
+
157
+ if not converted_kwargs.get("mask_image"):
158
+ result = self.image_to_image(response_format="b64_json", **converted_kwargs) # type: ignore
159
+ else:
160
+ result = self.inpainting(response_format="b64_json", **converted_kwargs) # type: ignore
130
161
 
131
162
  # convert to SD API result
132
163
  return {